{"version":3,"file":"HamburgerMenu.js","names":["HamburgerMenu","a","setters","Component","default","deepMerge","mix","Accessibility","on","off","animate","Event","execute","with","constructor","element","options","arguments","length","menuSelector","triggerSelector","classNames","openAnimation","closeAnimation","a11y","submenuAriaLiveOpened","submenuAriaLiveClosed","initCache","classes","opened","opening","selectors","hamburgerContent","closest","arialive","querySelector","backButton","menu","trigger","initState","state","bindEvents","toggleMenu","bind","hamburgerMenuClose","close","open","resetFocusedOrder","emitHamburgerEvents","updateAriaAttributes","classList","add","then","remove","setFocusedOrder","focus","triggerAnalytics","isOpen","emit","id","setAttribute","innerText","analytics","Object","keys","destroy","removeListener"],"sources":["components/global/HamburgerMenu.js"],"sourcesContent":["import Component from 'core/Component';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { mix } from 'core/mixwith';\nimport Accessibility from 'mixins/Accessibility';\nimport { on, off } from 'toolbox/event';\nimport { animate } from 'toolbox/animate';\nimport { Event } from 'services/EventEmitter';\n\n/**\n * This is a description of the HamburgerMenu constructor function.\n * @class\n * @classdesc This component allow to open hamburger sub-menu.\n * @extends Component\n */\nexport default class HamburgerMenu extends mix(Component).with(Accessibility) {\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 menuSelector: null,\n triggerSelector: null,\n classNames: {\n openAnimation: 'h-right-slide-in',\n closeAnimation: 'h-right-slide-out',\n },\n a11y: {\n submenuAriaLiveOpened: '', // Text used for the voice message when the hamburger sub menu is opening\n submenuAriaLiveClosed: '', // Text used for the voice message when the hamburger sub menu is closing\n },\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.classes = {\n opened: 'm-opened',\n opening: 'm-opening',\n };\n this.selectors.hamburgerContent = this.element.closest('[data-js-hamburger-content]');\n this.selectors.arialive = this.element.closest('[data-js-hamburger]') && this.element.closest('[data-js-hamburger]').querySelector('[data-js-hamburger-aria-live]');\n this.selectors.backButton = this.element.querySelector('[data-js-menu-back]');\n this.selectors.menu = this.element.querySelector(this.options.menuSelector);\n this.selectors.trigger = this.options.triggerSelector && this.element.querySelector(this.options.triggerSelector);\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.opened = false;\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 if (this.selectors.trigger) {\n on('click', this.selectors.trigger, this.toggleMenu.bind(this));\n }\n if (this.selectors.backButton) {\n on('click', this.selectors.backButton, this.toggleMenu.bind(this));\n }\n Event.on('hamburgermenu.close', this.hamburgerMenuClose, this);\n }\n\n /**\n * Toggles menu\n */\n toggleMenu() {\n if (this.state.opened) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Close Hamburger menu event handler\n */\n hamburgerMenuClose() {\n if (this.state.opened) {\n this.close();\n }\n }\n\n /**\n * Open the hamburger menu.\n * @returns {Promise} - Resolves when the open animation is done.\n */\n open() {\n this.resetFocusedOrder(this.element);\n this.emitHamburgerEvents(true);\n this.updateAriaAttributes(true);\n this.selectors.menu.classList.add(this.classes.opening);\n\n return animate(this.options.classNames.openAnimation, this.selectors.menu)\n .then(() => {\n this.state.opened = true;\n this.selectors.menu.classList.add(this.classes.opened);\n this.selectors.menu.classList.remove(this.classes.opening);\n this.setFocusedOrder(this.element);\n this.selectors.hamburgerContent.querySelector('[data-js-focus-order=\"first\"]').focus();\n this.triggerAnalytics();\n });\n }\n\n /**\n * Close the hamburger menu.\n * @returns {Promise} - Resolves when the close animation is done.\n */\n close() {\n this.resetFocusedOrder(this.element);\n this.emitHamburgerEvents(false);\n this.updateAriaAttributes(false);\n\n return animate(this.options.classNames.closeAnimation, this.selectors.menu)\n .then(() => {\n this.state.opened = false;\n this.selectors.menu.classList.remove(this.classes.opened);\n if (this.selectors.hamburgerContent) {\n this.setFocusedOrder(this.selectors.hamburgerContent);\n }\n this.selectors.trigger.focus();\n });\n }\n\n /**\n * Emit hamburger menu events.\n * @param {boolean} isOpen - Whether the menu is being opened or closed.\n */\n emitHamburgerEvents(isOpen) {\n Event.emit('hamburger.submenu.toggle', isOpen);\n if (!isOpen) {\n Event.emit('hamburger.submenu.close', this.id);\n }\n }\n\n /**\n * Update ARIA attributes based on the menu state.\n * @param {boolean} isOpen - Whether the menu is being opened or closed.\n */\n updateAriaAttributes(isOpen) {\n if (this.selectors.trigger) {\n this.selectors.trigger.setAttribute('aria-expanded', isOpen);\n }\n this.selectors.backButton.setAttribute('aria-expanded', isOpen);\n if (this.selectors.arialive) {\n this.selectors.arialive.innerText = isOpen\n ? this.options.a11y.submenuAriaLiveOpened\n : this.options.a11y.submenuAriaLiveClosed;\n }\n }\n\n /**\n * Triggers google analytics\n */\n triggerAnalytics() {\n if (this.analytics && Object.keys(this.analytics).length) {\n Event.emit('analytics.event', this.analytics);\n }\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.selectors.trigger) {\n off('click', this.selectors.trigger);\n }\n if (this.selectors.backButton) {\n off('click', this.selectors.backButton);\n }\n Event.removeListener('hamburgermenu.close', this.hamburgerMenuClose, this);\n }\n}\n"],"mappings":"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","ignoreList":[]}