{"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","initCache","classes","opened","opening","selectors","hamburgerContent","closest","backButton","querySelector","menu","trigger","initState","state","bindEvents","toggleMenu","bind","hamburgerMenuClose","close","open","resetFocusedOrder","emit","id","setAttribute","then","classList","remove","setFocusedOrder","add","triggerAnalytics","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 }, 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.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 * Hamburgermenu close handler\n */\n hamburgerMenuClose() {\n if (this.state.opened) {\n this.close();\n }\n }\n\n /**\n * Close menu\n * @return {Promise} Resolve when open animation is done\n */\n close() {\n this.resetFocusedOrder(this.element);\n Event.emit('hamburger.submenu.close', this.id);\n Event.emit('hamburger.submenu.toggle', false);\n if (this.selectors.trigger) {\n this.selectors.trigger.setAttribute('aria-expanded', 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 this.selectors.backButton.setAttribute('aria-expanded', false);\n if (this.selectors.hamburgerContent) {\n this.setFocusedOrder(this.selectors.hamburgerContent);\n }\n });\n }\n\n /**\n * Open menu\n * @return {Promise} Resolve when open animation is done\n */\n open() {\n if (this.selectors.hamburgerContent) {\n this.resetFocusedOrder(this.selectors.hamburgerContent);\n }\n Event.emit('hamburger.submenu.toggle', true);\n if (this.selectors.trigger) {\n this.selectors.trigger.setAttribute('aria-expanded', true);\n }\n this.selectors.menu.classList.add(this.classes.opening);\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.selectors.backButton.setAttribute('aria-expanded', true);\n this.setFocusedOrder(this.element);\n this.triggerAnalytics();\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":[]}