{"version":3,"file":"FocusHighlighter.js","names":["FocusHighlighter","h","a","setters","Component","default","deepMerge","Event","on","off","execute","KEY_TAB","constructor","element","options","arguments","length","_resizable","_scrollable","initCache","classNames","enabled","hurry","initState","state","isHighlighterVisible","lastFocusedElement","isHeaderFocused","lastFocusedElementCoords","bindEvents","document","handleKeyup","bind","handleMousedown","updateHighlighter","event","key","enableHighlighter","target","HTMLElement","HTMLDocument","isSelect","HTMLSelectElement","isButton","HTMLButtonElement","getAttribute","isRadio","HTMLInputElement","disableHighlighter","onResize","onScroll","moveTo","handleFocus","activeElement","focusedElement","isValidTarget","isTextInput","closest","emit","detectHurryNavigation","classList","add","window","onWindowBlur","remove","hideTimeOut","setTimeout","hide","tagName","toLowerCase","targetWidth","targetLeft","targetRectangle","getBoundingClientRect","targetRectangleLeft","left","scrollX","targetTop","top","scrollY","targetHeight","height","width","body","clientWidth","highlighterStyle","style","clearTimeout","currentTime","Date","now","isHurryNavigation","lastKeyTime","domNode","nodeName","HTMLTextAreaElement","readOnly","destroy","removeListener"],"sources":["components/global/FocusHighlighter.js"],"sourcesContent":["import Component from 'core/Component';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { Event } from 'services/EventEmitter';\nimport { on, off } from 'toolbox/event';\n\nconst KEY_TAB = 'Tab';\n\n/**\n * This is a description of the FocusHighlighter constructor function.\n * @class\n * @classdesc This component intended to address Accessibility issue with focus highlighting on focusable elements.\n * @extends Component\n */\nexport default class FocusHighlighter extends Component {\n /**\n * Constructor of the class that mainly merge the options of the components\n * @param {HTMLElement} element HTMLElement of the component\n * @param {object} options options that belongs to the component\n */\n constructor(element, options = {}) {\n super(element, deepMerge({\n _resizable: true,\n _scrollable: true,\n }, options));\n }\n\n /**\n * All selectors must be cached. Never cache elements that are out of the component scope\n */\n initCache() {\n this.classNames = {\n enabled: 'm-visible',\n hurry: 'm-hurry',\n };\n }\n\n /**\n * Init the different state of the component\n * It helps to avoid heavy DOM manipulation\n */\n initState() {\n this.state.isHighlighterVisible = false;\n this.state.lastFocusedElement = undefined;\n this.state.isHeaderFocused = false;\n this.state.lastFocusedElementCoords = '';\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 anonyous function\n */\n bindEvents() {\n on('keyup', document, this.handleKeyup.bind(this));\n on('mousedown', document, this.handleMousedown.bind(this));\n Event.on('highlighter.update', this.updateHighlighter, this);\n }\n\n /**\n * Keyup event handler\n * @param {KeyboardEvent} event - key up event\n * @listens dom#keyup\n */\n handleKeyup(event) {\n if (event.key === KEY_TAB) {\n this.enableHighlighter();\n }\n }\n\n /* eslint-disable complexity */\n /**\n * Mousedown event handler\n * @param {MouseEvent} event - mouse down event\n * @listens dom#keyup\n */\n handleMousedown(event) {\n if (!(event.target instanceof HTMLElement || event.target instanceof HTMLDocument)) {\n return;\n }\n // When select HTMLElement popup open via keyboard mousedown event is\n // synthetically clicked\n const isSelect = event.target instanceof HTMLSelectElement;\n // Space key up on button HTML element generates synthetic mousedown.\n // We do not find cross browser solution to detect this synthetical mousedown\n // We prevent to hide focus frame when mousedown on buttons\n const isButton = event.target instanceof HTMLButtonElement\n || (event.target).getAttribute('role') === 'button';\n\n const isRadio = event.target instanceof HTMLInputElement\n && (event.target).getAttribute('type') === 'radio';\n\n if (isSelect || isButton || isRadio) {\n return;\n }\n\n if (this.state.isHighlighterVisible) {\n this.disableHighlighter();\n }\n }\n /* eslint-enable complexity */\n\n /**\n * Handlers to onresize event\n */\n onResize() {\n this.updateHighlighter();\n }\n\n /**\n * Handlers to onscroll event\n */\n onScroll() {\n this.updateHighlighter();\n }\n\n /**\n * @description Update highlighter position. Needed when we need to update position from outside\n * @listens \"highlighter.update\"\n */\n updateHighlighter() {\n if (this.state.isHighlighterVisible && this.state.lastFocusedElement) {\n this.moveTo(this.state.lastFocusedElement);\n }\n }\n\n /**\n * Handles focus change on page\n * @listens dom#focusin\n */\n handleFocus() {\n if (!(document.activeElement instanceof HTMLElement)) {\n return;\n }\n\n const focusedElement = document.activeElement;\n\n if (\n !this.isValidTarget(focusedElement)\n || (this.isTextInput(focusedElement)\n && !this.state.isHighlighterVisible)\n ) {\n return;\n }\n if (!this.state.isHeaderFocused && focusedElement.closest('[data-js-header]')) {\n this.state.isHeaderFocused = true;\n Event.emit('header.focused');\n }\n\n this.detectHurryNavigation();\n this.moveTo(focusedElement);\n }\n\n /**\n * @description Enables a `highlighter` - a bordered box with sizes of currently focused element.\n */\n enableHighlighter() {\n if (this.state.isHighlighterVisible) {\n return;\n }\n\n this.state.isHighlighterVisible = true;\n\n this.element.classList.add(this.classNames.enabled);\n this.handleFocus();\n\n // all other events are handled by `focus in` event\n on('focusin', document, this.handleFocus.bind(this));\n\n // detect when the focus is moved within an iFrame\n on('blur', window, this.onWindowBlur.bind(this));\n }\n\n /**\n * @description Disables a `highlighter` - a bordered box with sizes of currently focused element.\n */\n disableHighlighter() {\n if (!this.state.isHighlighterVisible) {\n return;\n }\n\n off('focusin', document);\n off('blur', window);\n if (this.state.isHeaderFocused) {\n this.state.isHeaderFocused = false;\n Event.emit('header.unfocused');\n }\n\n this.state.isHighlighterVisible = false;\n this.state.lastFocusedElement = undefined;\n\n this.element.classList.remove(this.classNames.enabled);\n this.hideTimeOut = window.setTimeout(() => this.hide(), 200);\n }\n\n /**\n * Window Blur event handler\n * Detects if the focus moved inside the iframe and disables highlighter to avoid a conflict\n * with iFrame focus styles\n */\n onWindowBlur() {\n if (document.activeElement.tagName.toLowerCase() === 'iframe') {\n this.disableHighlighter();\n }\n }\n\n /* eslint-disable complexity */\n /**\n * @description Moves `highlighter` (a border box) in place of focused element\n * @param {HTMLElement} focusedElement - element, which gets focus\n */\n moveTo(focusedElement) {\n if (!(focusedElement instanceof HTMLElement)) {\n return;\n }\n\n let targetWidth;\n let targetLeft;\n const borderWidth = 3;\n const targetRectangle = focusedElement.getBoundingClientRect();\n const targetRectangleLeft = targetRectangle.left + window.scrollX;\n const targetTop = targetRectangle.top + window.scrollY - (borderWidth * 2);\n const targetHeight = targetRectangle.height + (borderWidth * 2);\n\n // Check if target element full width\n if (targetRectangle.width >= document.body.clientWidth) {\n targetWidth = targetRectangle.width - (borderWidth * 4);\n targetLeft = borderWidth;\n // Check if target element too close to left side\n } else if (targetRectangleLeft < borderWidth * 2) {\n targetWidth = targetRectangle.width - (borderWidth * 2);\n targetLeft = borderWidth;\n // Check if target element too close to right side\n } else if (targetRectangleLeft + targetRectangle.width + (borderWidth * 2)\n >= document.body.clientWidth) {\n targetWidth = targetRectangle.width - (borderWidth * 2);\n targetLeft = document.body.clientWidth - targetRectangle.width - borderWidth;\n } else {\n targetWidth = targetRectangle.width + (borderWidth * 2);\n targetLeft = targetRectangleLeft - (borderWidth * 2);\n }\n\n if (\n focusedElement === this.state.lastFocusedElement\n && this.state.lastFocusedElementCoords === `${targetTop}${targetLeft}${targetWidth}${targetHeight}`\n ) {\n // If we come from coords recheck do not reapply changes\n return;\n }\n\n const highlighterStyle = this.element.style;\n\n highlighterStyle.top = `${targetTop}px`;\n highlighterStyle.left = `${targetLeft}px`;\n highlighterStyle.width = `${targetWidth >= 0 ? targetWidth : 0}px`;\n highlighterStyle.height = `${targetHeight}px`;\n\n this.state.lastFocusedElementCoords = `${targetTop}${targetLeft}${targetWidth}${targetHeight}`;\n\n this.state.lastFocusedElement = focusedElement;\n }\n /* eslint-enable complexity */\n\n /**\n * @description Hide `highlighter`\n */\n hide() {\n const highlighterStyle = this.element.style;\n\n highlighterStyle.width = '0';\n highlighterStyle.height = '0';\n\n if (this.hideTimeOut) {\n window.clearTimeout(this.hideTimeOut);\n }\n }\n\n /**\n * @description Detects too fast customer navigation, and displays `highlighter`,\n * moving from previously focused element to currently focused without animation.\n */\n detectHurryNavigation() {\n const currentTime = Date.now();\n\n const isHurryNavigation = (currentTime - (this.lastKeyTime || 0)) < 150;\n\n if (isHurryNavigation && !this.isHurryNavigation) {\n this.element.classList.add(this.classNames.hurry);\n this.isHurryNavigation = true;\n } else if (this.isHurryNavigation) {\n this.element.classList.remove(this.classNames.hurry);\n this.isHurryNavigation = false;\n }\n\n this.lastKeyTime = currentTime;\n }\n\n /**\n * @param {HTMLElement} domNode - focused element\n * @returns {Boolean} true if focused element is valid DOM element\n */\n isValidTarget(domNode) {\n return domNode !== this.state.lastFocusedElement\n && domNode.nodeName !== 'HTML'\n && domNode.nodeName !== 'BODY';\n }\n\n /**\n * @param {DomNode} domNode - focused element\n * @returns {Boolean} true if focused element is form input element\n */\n isTextInput(domNode) {\n return ((domNode instanceof HTMLTextAreaElement) && !domNode.readOnly)\n || ((domNode instanceof HTMLInputElement) && !domNode.readOnly)\n || !!(domNode.getAttribute('contenteditable'));\n }\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 if (this.state.isHighlighterVisible) {\n this.disableHighlighter();\n }\n\n off('keyup mousedown', document);\n Event.removeListener('highlighter.update');\n }\n}\n"],"mappings":"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","ignoreList":[]}