{"version":3,"file":"javascripts/chunks/fd3b4dd1e69647a95051.accordion.js","mappings":"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","sources":["webpack:///./components/accordion/javascripts/accordion.js","webpack:///./javascripts/dom/select.js","webpack:///./javascripts/helpers/baseModule.js"],"sourcesContent":["import BaseModule from '../../../javascripts/helpers/baseModule';\n\n// Accordion module based on the wai-aria best practises https://www.w3.org/TR/wai-aria-practices/examples/accordion/accordion.html\nexport default class Accordion extends BaseModule {\n constructor(element) {\n super(element, element.getAttribute('data-js-module'));\n\n this.getElements([\n { id: 'controls', selector: 'control' },\n { id: 'panels', selector: 'panel' }\n ]);\n this.bindControlEvents();\n }\n\n static isCollapsed(element) {\n return element.getAttribute('aria-expanded') !== 'true';\n }\n\n static unfold(control, panel) {\n panel.removeAttribute('hidden');\n panel.removeAttribute('aria-hidden');\n control.setAttribute('aria-expanded', 'true');\n }\n\n static collapse(control, panel) {\n panel.setAttribute('hidden', '');\n panel.setAttribute('aria-hidden', 'true');\n control.setAttribute('aria-expanded', 'false');\n }\n\n bindControlEvents() {\n this.elements.controls.asList.forEach((control, controlIndex) => {\n control.addEventListener('click', (event) => {\n event.preventDefault();\n\n const clickTarget = event.target;\n const panel = this.elements.panels.asList[controlIndex];\n\n const isCollapsed = this.constructor.isCollapsed(clickTarget);\n\n if (isCollapsed) {\n this.constructor.unfold(clickTarget, panel);\n } else {\n this.constructor.collapse(clickTarget, panel);\n }\n });\n\n control.addEventListener('keydown', (event) => {\n const focusTarget = event.target;\n const panel = this.elements.panels.asList[controlIndex];\n\n const controlCount = this.elements.controls.length;\n\n switch (event.key) {\n // When focus is on an accordion header, moves focus to the next accordion header.\n // When focus is on last accordion header, moves focus to first accordion header.\n case 'ArrowUp':\n case 'PageUp': {\n event.preventDefault();\n\n const newIndex = (controlIndex + controlCount - 1) % controlCount;\n this.elements.controls[newIndex].focus();\n break;\n }\n // When focus is on an accordion header, moves focus to the previous accordion header.\n // When focus is on first accordion header, moves focus to last accordion header.\n case 'ArrowDown':\n case 'PageDown': {\n event.preventDefault();\n\n const newIndex = (controlIndex + controlCount + 1) % controlCount;\n this.elements.controls[newIndex].focus();\n break;\n }\n // When focus is on an accordion header, moves focus to the first accordion header.\n case 'Home': {\n event.preventDefault();\n\n this.elements.controls[0].focus();\n break;\n }\n // When focus is on an accordion header, moves focus to the last accordion header.\n case 'End': {\n event.preventDefault();\n\n this.elements.controls[this.elements.controls.length - 1].focus();\n break;\n }\n // When focus is on the accordion header of a collapsed section, expands the section.\n case ' ':\n case 'Enter': {\n event.preventDefault();\n const isCollapsed = this.constructor.isCollapsed(event.target);\n if (isCollapsed) {\n this.constructor.unfold(focusTarget, panel);\n } else {\n this.constructor.collapse(focusTarget, panel);\n }\n break;\n }\n default: {\n break;\n }\n }\n });\n });\n\n this.elements.panels.asList.forEach((panel, panelIndex) => {\n panel.addEventListener('keydown', (event) => {\n switch (event.key) {\n case 'PageUp': {\n event.preventDefault();\n\n // When focus is inside an accordion panel, moves focus to the header for that panel.\n this.elements.controls[panelIndex].focus();\n break;\n }\n case 'PageDown': {\n event.preventDefault();\n\n // When focus is inside an accordion panel moves focus to the next accordion header.\n // When focus is inside last accordion panel, moves focus to first accordion header.\n if (this.elements.controls[panelIndex + 1]) {\n this.elements.controls[panelIndex + 1].focus();\n } else {\n this.elements.controls[0].focus();\n }\n break;\n }\n default: {\n break;\n }\n }\n });\n });\n }\n}\n","/**\n * This methods selects Elements from a specific context by a selector\n * @param {string} selector Selector of the element to find\n * @param {Element|HTMLDocument} [element] Context of the selectable\n * @returns {Array<Element>} Am array with selected Elements\n */\nexport default (selector, element = window.document) =>\n [].slice.call(element.querySelectorAll(selector));\n","import select from '../dom/select';\n\nclass BaseModule {\n constructor(element, id) {\n this.id = id;\n this.elements = {\n self: element\n };\n\n this.setInitialized();\n }\n\n setInitialized() {\n if (this.elements.self) {\n this.elements.self.setAttribute('data-js-module-initialized', true);\n }\n }\n\n setUnInitialized() {\n if (this.elements.self) {\n this.elements.self.removeAttribute('data-js-module-initialized');\n }\n }\n\n /**\n * Selects DOMElements of a module with a specific data attribute (`data-js-element=\"${module}__${selector}\"`)\n * Receives an object where the id param is the key in the elements cache\n * The selector param of the config is the selector part in the query-selector described above\n * @param {Object} config Configuration object in a key value format\n * @returns {void}\n */\n getElements(config) {\n const elementsConfig = config.map((elementConfig) => ({\n ...elementConfig,\n selector: `${this.id}__${elementConfig.selector}`\n }));\n\n const domElements = select('[data-js-element]', this.elements.self);\n\n for (let i = 0; i < domElements.length; i += 1) {\n const domElement = domElements[i];\n const elementConfigCandidates = elementsConfig.filter(\n (singleConfig) =>\n domElement.getAttribute('data-js-element') === singleConfig.selector\n );\n\n const [elementConfig] = elementConfigCandidates;\n\n if (elementConfig) {\n if (typeof this.elements[elementConfig.id] === 'undefined') {\n this.elements[elementConfig.id] = domElement;\n } else {\n if (typeof this.elements[elementConfig.id].push === 'undefined') {\n this.elements[elementConfig.id] = [this.elements[elementConfig.id]];\n }\n this.elements[elementConfig.id].push(domElement);\n }\n }\n }\n\n /*\n * Append a attribute \"asList\" to each element/s in this.elements\n * which is always an array no matter if element/s is an array\n * or a single HTMLElement\n */\n\n const asList = (obj) => (typeof obj.push === 'undefined' ? [obj] : obj);\n Object.values(this.elements).forEach((obj) => {\n obj.asList = asList(obj); // eslint-disable-line no-param-reassign\n });\n }\n}\n\nexport default BaseModule;\n"],"names":["Accordion","element","getAttribute","getElements","id","selector","bindControlEvents","control","panel","removeAttribute","setAttribute","this","elements","controls","asList","forEach","controlIndex","addEventListener","event","preventDefault","clickTarget","target","panels","constructor","isCollapsed","unfold","collapse","focusTarget","controlCount","length","key","newIndex","focus","panelIndex","BaseModule","window","document","slice","call","querySelectorAll","self","setInitialized","config","elementsConfig","map","elementConfig","domElements","select","i","domElement","filter","singleConfig","push","Object","values","obj"],"sourceRoot":""}