{"version":3,"sources":["../node_modules/@crasman/multiselect/dist/index.js","../node_modules/@crasman/multiselect/index.js","../node_modules/@babel/runtime/helpers/interopRequireDefault.js","../node_modules/@babel/runtime/helpers/createClass.js","../node_modules/@babel/runtime/helpers/defineProperty.js","../node_modules/@babel/runtime/helpers/classCallCheck.js","../node_modules/@babel/runtime/regenerator/index.js","../node_modules/@babel/runtime/helpers/asyncToGenerator.js"],"names":["_interopRequireDefault","require","Object","defineProperty","exports","value","_regenerator","_asyncToGenerator2","_defineProperty2","_classCallCheck2","_createClass2","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","getOwnPropertyDescriptors","defineProperties","_default","Multiselect","selectElement","_selectElement$option","_selectElement$option2","settings","undefined","this","containerElement","className","buttonElement","idPrefix","placeholderClassName","textContent","options","showPlaceholder","preventScrollOnFocus","innerContainerElement","labelElement","disabledClassName","listElement","multipleClassName","size","listItemElement","focusClassName","selectedClassName","listGroupElement","listGroupListElement","state","isOptionsListOpen","focusedOptionsListItem","isItemHeightCSSVariableSet","initCustomSelectUI","_this","hasAttribute","removeAttribute","toggleVisibility","tabIndex","getAssociatedLabel","createContainerElement","setupLabelElement","appendChild","createButtonElement","htmlFor","id","optionsListElement","createOptionsListElement","optionsListItemElements","optionsListGroupElements","createOptionsListItemElements","setItemHeightCSSVariable","addEventListener","_ref","_ref$detail","detail","dispatcher","onSelectElementChange","form","setTimeout","observeSelectElementMutations","document","_ref2","onDocumentClick","_this2","createElement","classList","add","event","onContainerElementKeydown","referenceNode","parentNode","insertBefore","nextSibling","getUniqueElementId","concat","name","disabled","_this3","type","buttonElementId","setAttribute","spanElement","textNode","createTextNode","onButtonElementClick","_this4","multiple","style","setProperty","_ref3","onOptionsListElementClick","_ref4","relatedTarget","onOptionsListElementBlur","onOptionsListElementMouseover","optgroup","label","hidden","title","option","parentElement","tagName","toLowerCase","_this5","listItemElements","Array","from","map","createOptionsListItemElement","index","optionIndex","getOptgroup","createOptionsListGroupElement","dataset","group","splice","optionElement","optionsListItemElement","createOptionsListItemElementId","selected","toggleMultipleSelectOption","toggleSingleSelectOption","_this6","MutationObserver","mutations","onSelectElementMutation","observe","attributes","attributeFilter","subtree","childList","closeOptionsList","openOptionsList","getAttribute","focusOptionsListItem","preventDefault","shouldFocusOnOption","getClosestFocusableOptionListItem","_onOptionsListElementBlur","mark","_callee","elementReceivingFocus","wrap","_context","prev","next","t0","Promise","resolve","activeElement","sent","contains","stop","_x","_ref5","clientX","clientY","prevMouseEventClientX","prevMouseEventClientY","_this7","selectedOptionsArray","selectedOptions","listItem","isCustomOptionSelected","isNativeOptionSelected","some","_ref6","getFirstFocusableOptionsListItem","_this8","mutation","attributeName","onSelectElementChildListMutation","targetTagName","onSelectElementDisabledMutation","onOptionElementDisabledMutation","onOptgroupElementDisabledMutation","onSelectElementHiddenMutation","onOptionElementHiddenMutation","onOptgroupElementHiddenMutation","_ref7","_this9","addedNodes","removedNodes","addedOptions","filterNodeListByConstructor","HTMLOptionElement","removedOptions","removedOption","correspondingListItemIndex","findIndex","_ref8","correspondingListItem","removeChild","remove","optionsListItem","findMatchingOptionsListItem","_ref9","_this10","listGroup","children","_ref10","focus","preventScroll","_this11","isPreSelect","dispatchEvent","CustomEvent","bubbles","firstElementChild","targetNativeOption","findMatchingNativeOption","_spanElement","find","_ref11","labelFor","isTriggeredByKey","scrollToOptionListItemElement","scrollHeight","clientHeight","listItemBottom","offsetTop","offsetHeight","scrollTop","offset","getFocusedOptionIndex","targetIndex","getLastFocusableOptionsListItem","targetOptionsListItem","Math","sign","indexOf","replace","firstListItemWithHeight","height","border","overflowY","listItemGroup","isListItemGroupHidden","listItemHeight","removeProperty","_ref12","labels","querySelector","element","shouldHide","_this12","checkHidden","checkDisabled","lastFocusableListItem","optionListItem","_ref13","_ref14","nodeList","constructor","node","idToTest","getElementById","module","obj","__esModule","_defineProperties","props","descriptor","configurable","writable","Constructor","protoProps","staticProps","prototype","instance","TypeError","asyncGeneratorStep","gen","reject","_next","_throw","arg","info","error","done","then","fn","self","args","err"],"mappings":"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","file":"hashed/4.f34c5f90.chunk.js","sourcesContent":["\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _regenerator = _interopRequireDefault(require(\"@babel/runtime/regenerator\"));\n\nvar _asyncToGenerator2 = _interopRequireDefault(require(\"@babel/runtime/helpers/asyncToGenerator\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/createClass\"));\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n/**\r\n * Custom select UI.\r\n *\r\n * @class Multiselect\r\n */\nvar Multiselect = /*#__PURE__*/function () {\n /**\r\n * Create an instance of Multiselect.\r\n * @example\r\n * const settings = { listElement : { size : 12 } };\r\n * document.querySelector('select').forEach(select => {\r\n * new Multiselect(select, settings);\r\n * });\r\n * @param {HTMLSelectElement} selectElement - Select element to replace visually.\r\n * @param {Object} [settings={}] - Settings object to override defaults.\r\n * @memberof Multiselect\r\n */\n function Multiselect(selectElement) {\n var _selectElement$option, _selectElement$option2;\n\n var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n (0, _classCallCheck2[\"default\"])(this, Multiselect);\n this.selectElement = selectElement;\n this.settings = {\n containerElement: _objectSpread({\n className: 'multiselect-container'\n }, settings.containerElement || {}),\n buttonElement: _objectSpread({\n idPrefix: 'multiselect',\n className: 'multiselect-button',\n // Used for styling\n placeholderClassName: 'placeholder',\n textContent: !((_selectElement$option = selectElement.options[0]) !== null && _selectElement$option !== void 0 && _selectElement$option.value) && ((_selectElement$option2 = selectElement.options[0]) === null || _selectElement$option2 === void 0 ? void 0 : _selectElement$option2.textContent) || '',\n showPlaceholder: true,\n preventScrollOnFocus: false\n }, settings.buttonElement || {}),\n innerContainerElement: _objectSpread({\n className: 'multiselect-inner-container'\n }, settings.innerContainerElement || {}),\n labelElement: _objectSpread({\n idPrefix: 'multiselect-label',\n // Used to generate ID, if label doesn't have one\n className: 'multiselect-label',\n disabledClassName: 'disabled'\n }, settings.labelElement || {}),\n listElement: _objectSpread({\n className: 'multiselect-list',\n multipleClassName: 'multiple',\n size: selectElement.size || 8,\n // Number of options to show at once\n preventScrollOnFocus: true\n }, settings.listElement || {}),\n listItemElement: _objectSpread({\n idPrefix: 'multiselect-option',\n className: 'multiselect-option',\n focusClassName: 'focus',\n selectedClassName: 'selected',\n disabledClassName: 'disabled'\n }, settings.listItemElement || {}),\n listGroupElement: _objectSpread({\n className: 'multiselect-group'\n }, settings.listGroupElement || {}),\n listGroupListElement: _objectSpread({\n className: 'multiselect-group-list',\n disabledClassName: 'disabled'\n }, settings.listGroupListElement || {})\n };\n this.state = {\n isOptionsListOpen: false,\n focusedOptionsListItem: undefined,\n isItemHeightCSSVariableSet: false\n };\n this.initCustomSelectUI();\n }\n /**\r\n * Create a custom select to replace the native select, and mirror events and mutations between them.\r\n *\r\n * @memberof Multiselect\r\n */\n\n\n (0, _createClass2[\"default\"])(Multiselect, [{\n key: \"initCustomSelectUI\",\n value: function initCustomSelectUI() {\n var _this = this;\n\n // Hidden form controls cannot be required\n if (this.selectElement.hasAttribute('required')) {\n this.selectElement.removeAttribute('required');\n } // Hide native select\n\n\n this.toggleVisibility(this.selectElement, true);\n this.selectElement.tabIndex = -1; // Get label associated with the select element\n\n this.labelElement = this.getAssociatedLabel(this.selectElement); // Create a container for the custom select\n\n this.containerElement = this.createContainerElement(); // Setup label element, if one was found\n\n if (this.labelElement) {\n this.setupLabelElement();\n } // Move select element into the container\n\n\n this.containerElement.appendChild(this.selectElement); // Create custom select, and point label for-attribute to the button\n\n this.buttonElement = this.createButtonElement();\n\n if (this.labelElement) {\n this.labelElement.htmlFor = this.buttonElement.id;\n }\n\n this.optionsListElement = this.createOptionsListElement();\n this.optionsListItemElements = [];\n this.optionsListGroupElements = {};\n this.createOptionsListItemElements(); // Get option list item height, and set it as a CSS variable to option list\n // Then multiply with option list size to get option list max height\n\n this.setItemHeightCSSVariable(); // Listen to native select changes, and update custom select, if event not dispatched by the multiselect itself\n\n this.selectElement.addEventListener('change', function (_ref) {\n var _ref$detail = _ref.detail;\n _ref$detail = _ref$detail === void 0 ? {} : _ref$detail;\n var dispatcher = _ref$detail.dispatcher;\n\n if (dispatcher !== 'multiselect') {\n _this.onSelectElementChange();\n }\n }); // Update custom select after(!) form reset, if native select belongs to one\n\n if (this.selectElement.form) {\n this.selectElement.form.addEventListener('reset', function () {\n setTimeout(function () {\n _this.onSelectElementChange();\n });\n });\n } // Listen to native select attribute and child list mutations\n\n\n this.observeSelectElementMutations(); // Add document click event listener, to close options list, if open and clicked outside of it\n\n document.addEventListener('click', function (_ref2) {\n var target = _ref2.target;\n return _this.onDocumentClick(target);\n });\n }\n /**\r\n * Create a container element, to later wrap the native and custom select elements in.\r\n *\r\n * @return {HTMLDivElement} - Container element.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"createContainerElement\",\n value: function createContainerElement() {\n var _this2 = this;\n\n var containerElement = document.createElement('div');\n containerElement.classList.add(this.settings.containerElement.className); // Listen to keydown event for keyboard navigation\n\n containerElement.addEventListener('keydown', function (event) {\n return _this2.onContainerElementKeydown(event);\n }); // Use label element as reference node, if available, in case label wraps the select element\n\n var referenceNode = this.labelElement || this.selectElement;\n referenceNode.parentNode.insertBefore(containerElement, referenceNode.nextSibling);\n return containerElement;\n }\n /**\r\n * Setup label element for the custom select.\r\n *\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"setupLabelElement\",\n value: function setupLabelElement() {\n if (!this.labelElement.id) {\n this.labelElement.id = this.getUniqueElementId(\"\".concat(this.settings.labelElement.idPrefix, \"-\").concat(this.selectElement.id || this.selectElement.name));\n }\n\n if (this.settings.labelElement.className) {\n this.labelElement.classList.add(this.settings.labelElement.className);\n }\n\n if (this.selectElement.disabled) {\n this.labelElement.classList.add(this.settings.labelElement.disabledClassName);\n } // Move label inside the container\n\n\n this.containerElement.appendChild(this.labelElement);\n }\n /**\r\n * Create a button element to essentially replace the UI of the native select element.\r\n *\r\n * @return {HTMLButtonElement} \r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"createButtonElement\",\n value: function createButtonElement() {\n var _this3 = this;\n\n var buttonElement = document.createElement('button'),\n innerContainerElement = document.createElement('div'); // Set type to \"button\", to not submit form if contained by one\n\n buttonElement.type = 'button'; // Create and set an ID for the button\n\n var buttonElementId = this.getUniqueElementId(\"\".concat(this.settings.buttonElement.idPrefix, \"-\").concat(this.selectElement.id || this.selectElement.name));\n buttonElement.id = buttonElementId;\n buttonElement.classList.add(this.settings.buttonElement.className);\n innerContainerElement.classList.add(this.settings.innerContainerElement.className);\n buttonElement.setAttribute('aria-haspopup', 'listbox'); // If an label exists, indicate that it labels the button too\n\n if (this.labelElement) {\n buttonElement.setAttribute('aria-labelledby', \"\".concat(this.labelElement.id, \" \").concat(buttonElementId));\n } // Match disabled attribute of native select\n\n\n buttonElement.disabled = this.selectElement.disabled; // Set button text content from the settings\n\n var spanElement = document.createElement('span');\n var textNode = document.createTextNode(this.settings.buttonElement.showPlaceholder ? this.settings.buttonElement.textContent : '');\n spanElement.appendChild(textNode);\n buttonElement.appendChild(spanElement);\n buttonElement.setAttribute('data-placeholder', this.settings.buttonElement.textContent);\n buttonElement.addEventListener('click', function () {\n return _this3.onButtonElementClick();\n }); // Insert inner container just after the select, and insert button in it\n\n this.containerElement.insertBefore(innerContainerElement, this.selectElement.nextSibling);\n innerContainerElement.appendChild(buttonElement);\n return buttonElement;\n }\n /**\r\n * Create an unordered list element for the options of the custom select.\r\n *\r\n * @return {HTMLUListElement} \r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"createOptionsListElement\",\n value: function createOptionsListElement() {\n var _this4 = this;\n\n var optionsListElement = document.createElement('ul');\n optionsListElement.classList.add(this.settings.listElement.className);\n\n if (this.selectElement.multiple) {\n optionsListElement.classList.add(this.settings.listElement.multipleClassName);\n } // Set option list hidden at first\n\n\n this.toggleVisibility(optionsListElement, true); // Enable programmatical focusability\n\n optionsListElement.tabIndex = -1;\n optionsListElement.setAttribute('role', 'listbox'); // Set option list labelled by the label element, if one exists\n\n if (this.labelElement) {\n optionsListElement.setAttribute('aria-labelledby', this.labelElement.id);\n } // Set size as a CSS variable, to later calculate option list max height\n\n\n optionsListElement.style.setProperty('--list-size', this.settings.listElement.size); // Add event listeners\n\n optionsListElement.addEventListener('click', function (_ref3) {\n var target = _ref3.target;\n return _this4.onOptionsListElementClick(target);\n });\n optionsListElement.addEventListener('blur', function (_ref4) {\n var relatedTarget = _ref4.relatedTarget;\n return _this4.onOptionsListElementBlur(relatedTarget);\n });\n optionsListElement.addEventListener('mouseover', function (event) {\n return _this4.onOptionsListElementMouseover(event);\n }); // Insert option list just after the button\n\n this.buttonElement.parentNode.insertBefore(optionsListElement, this.buttonElement.nextSibling);\n return optionsListElement;\n }\n /**\r\n * Create a custom option group list, to mimic an optgroup.\r\n *\r\n * @param {HTMLOptGroupElement} optgroup - Optgroup element from native select.\r\n * @param {referenceNode} [referenceNode=null] - Node to use as reference on insertBefore call.\r\n * @return {HTMLUListElement} - Option group list element.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"createOptionsListGroupElement\",\n value: function createOptionsListGroupElement(optgroup) {\n var referenceNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n // Create a LI element to contain the group\n var listGroupElement = document.createElement('li');\n listGroupElement.setAttribute('data-group', optgroup.label);\n listGroupElement.classList.add(this.settings.listGroupElement.className); // If optgroup is hidden, set the custom group hidden too\n\n if (optgroup.hidden) {\n listGroupElement.hidden = true;\n } // Create an UL element to contain the group options\n\n\n var listGroupListElement = document.createElement('ul');\n listGroupListElement.classList.add(this.settings.listGroupListElement.className); // Add disabled class to the group list, if original optgroup is disabled\n\n if (optgroup.disabled) {\n listGroupListElement.classList.add(this.settings.listGroupListElement.disabledClassName);\n } // Copy optgroup label to title the group list element\n\n\n listGroupListElement.title = optgroup.label; // Insert option group to the dropdown\n\n listGroupElement.appendChild(listGroupListElement);\n this.optionsListElement.insertBefore(listGroupElement, referenceNode); // Save option group to class variable\n\n this.optionsListGroupElements[optgroup.label] = listGroupListElement;\n return listGroupListElement;\n }\n /**\r\n * Get optgroup by option.\r\n *\r\n * @param {HTMLOptionElement} option - Option of which optgroup to get.\r\n * @return {HTMLOptGroupElement|undefined} Optgroup element, or undefined if option has no optgroup.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"getOptgroup\",\n value: function getOptgroup(option) {\n return option.parentElement.tagName.toLowerCase() === 'optgroup' ? option.parentElement : undefined;\n }\n /**\r\n * Create an option list item for each option of the native select.\r\n *\r\n * @param {HTMLOptionsCollection} [options=this.selectElement.options] - Options of the native select.\r\n * @return {HTMLLIElement[]} - Array of LI elements to represent the options. \r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"createOptionsListItemElements\",\n value: function createOptionsListItemElements() {\n var _this5 = this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.selectElement.options;\n var listItemElements = Array.from(options).map(function (option) {\n return _this5.createOptionsListItemElement(option);\n });\n listItemElements.forEach(function (listItemElement, index) {\n // Get option index and reference node to insert list item at correct position\n var optionIndex = options[index].index,\n referenceNode = _this5.optionsListItemElements[optionIndex] || null,\n optgroup = _this5.getOptgroup(options[index]);\n\n if (optgroup) {\n // Get or create custom option group element\n var listGroupElement = _this5.optionsListGroupElements[optgroup.label] || _this5.createOptionsListGroupElement(optgroup, referenceNode); // Insert option list item in the correct position in the option group\n\n\n listGroupElement.insertBefore(listItemElement, referenceNode && referenceNode.parentElement.parentElement.dataset.group === optgroup.label ? referenceNode : null);\n } else {\n // Insert option list item in the correct position in the option list\n _this5.optionsListElement.insertBefore(listItemElement, referenceNode);\n } // Also insert in a specific index of the array\n\n\n _this5.optionsListItemElements.splice(optionIndex, 0, listItemElement);\n });\n }\n /**\r\n * Create an option list item for an option of the native select.\r\n *\r\n * @param {HTMLOptionElement} optionElement - Option of the native select.\r\n * @return {HTMLLIElement} - LI element to represent the option.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"createOptionsListItemElement\",\n value: function createOptionsListItemElement(optionElement) {\n var optionsListItemElement = document.createElement('li');\n optionsListItemElement.id = this.createOptionsListItemElementId(optionElement.value);\n optionsListItemElement.classList.add(this.settings.listItemElement.className); // Save value of the option in a data attribute\n\n optionsListItemElement.setAttribute('data-value', optionElement.value); // Get optgroup, if option belongs to one\n\n var optgroup = this.getOptgroup(optionElement); // Hide option list item, if the original option or its optgroup is hidden too\n\n if (optionElement.hidden || optgroup !== null && optgroup !== void 0 && optgroup.hidden) {\n this.toggleVisibility(optionsListItemElement, true);\n } // Add disabled class to list item, if necessary\n\n\n if (optionElement.disabled || optgroup !== null && optgroup !== void 0 && optgroup.disabled) {\n optionsListItemElement.classList.add(this.settings.listItemElement.disabledClassName);\n }\n\n optionsListItemElement.setAttribute('role', 'option'); // Copy text content from the original option to the option list item\n\n var textNode = document.createTextNode(optionElement.textContent);\n optionsListItemElement.appendChild(textNode); // Pre-select option, if selected attribute is present\n\n if (optionElement.selected) {\n if (this.selectElement.multiple) {\n this.toggleMultipleSelectOption(optionsListItemElement, true, optionElement);\n } else {\n this.state.focusedOptionsListItem = optionsListItemElement;\n this.toggleSingleSelectOption(optionsListItemElement, true);\n }\n }\n\n return optionsListItemElement;\n }\n /**\r\n * Observe attribute and child list mutations on the native select.\r\n *\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"observeSelectElementMutations\",\n value: function observeSelectElementMutations() {\n var _this6 = this;\n\n var observer = new MutationObserver(function (mutations) {\n return _this6.onSelectElementMutation(mutations);\n });\n observer.observe(this.selectElement, {\n attributes: true,\n attributeFilter: ['disabled', 'hidden'],\n subtree: true,\n childList: true\n });\n }\n /**\r\n * Toggle custom select options list open and closed.\r\n *\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onButtonElementClick\",\n value: function onButtonElementClick() {\n !this.state.isOptionsListOpen ? this.openOptionsList() : this.closeOptionsList();\n }\n /**\r\n * Visually focus and toggle selections of option list items on click.\r\n *\r\n * @param {Object} target - Click event target.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onOptionsListElementClick\",\n value: function onOptionsListElementClick(target) {\n if (target.getAttribute('role') === 'option') {\n this.focusOptionsListItem(target);\n\n if (this.selectElement.multiple) {\n this.toggleMultipleSelectOption(target);\n } else {\n this.toggleSingleSelectOption(target);\n this.closeOptionsList();\n }\n }\n }\n /**\r\n * Respond to keyboard navigation on the custom select container element.\r\n *\r\n * @param {Event} event - Keydown event.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onContainerElementKeydown\",\n value: function onContainerElementKeydown(event) {\n switch (event.key) {\n case 'PageUp':\n event.preventDefault();\n this.shouldFocusOnOption() ? this.focusOptionsListItem(this.getClosestFocusableOptionListItem(-this.settings.listElement.size + 1), true) : this.openOptionsList();\n break;\n\n case 'PageDown':\n event.preventDefault();\n this.shouldFocusOnOption() ? this.focusOptionsListItem(this.getClosestFocusableOptionListItem(this.settings.listElement.size - 1), true) : this.openOptionsList();\n break;\n\n case 'Up':\n case 'ArrowUp':\n event.preventDefault();\n this.shouldFocusOnOption() ? this.focusOptionsListItem(this.getClosestFocusableOptionListItem(-1), true) : this.openOptionsList();\n break;\n\n case 'Down':\n case 'ArrowDown':\n event.preventDefault();\n this.shouldFocusOnOption() ? this.focusOptionsListItem(this.getClosestFocusableOptionListItem(1), true) : this.openOptionsList();\n break;\n\n case 'Home':\n event.preventDefault();\n this.shouldFocusOnOption() ? this.focusOptionsListItem(this.getClosestFocusableOptionListItem(0, 0), true) : this.openOptionsList();\n break;\n\n case 'End':\n event.preventDefault();\n this.shouldFocusOnOption() ? this.focusOptionsListItem(this.getClosestFocusableOptionListItem(0, this.optionsListItemElements.length - 1), true) : this.openOptionsList();\n break;\n\n case ' ':\n case 'Spacebar':\n if (this.state.isOptionsListOpen) {\n event.preventDefault();\n\n if (this.selectElement.multiple && this.state.focusedOptionsListItem) {\n this.toggleMultipleSelectOption(this.state.focusedOptionsListItem);\n }\n }\n\n break;\n\n case 'Enter':\n case 'Esc':\n case 'Escape':\n if (this.state.isOptionsListOpen) {\n event.preventDefault();\n this.closeOptionsList();\n }\n\n break;\n\n default:\n // TODO: Search for item to focus by input\n break;\n }\n }\n /**\r\n * Close options list on blur.\r\n *\r\n * @param {EventTarget} relatedTarget\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onOptionsListElementBlur\",\n value: function () {\n var _onOptionsListElementBlur = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee(relatedTarget) {\n var elementReceivingFocus;\n return _regenerator[\"default\"].wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.t0 = relatedTarget;\n\n if (_context.t0) {\n _context.next = 5;\n break;\n }\n\n _context.next = 4;\n return new Promise(function (resolve) {\n setTimeout(function () {\n return resolve(document.activeElement);\n });\n });\n\n case 4:\n _context.t0 = _context.sent;\n\n case 5:\n elementReceivingFocus = _context.t0;\n\n // Close options list only if the element receiving focus is not inside the custom select container\n if (!elementReceivingFocus || !this.containerElement.contains(elementReceivingFocus)) {\n this.closeOptionsList();\n }\n\n case 7:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function onOptionsListElementBlur(_x) {\n return _onOptionsListElementBlur.apply(this, arguments);\n }\n\n return onOptionsListElementBlur;\n }()\n /**\r\n * Focus visually on option list item on mouseover.\r\n *\r\n * @param {Event} event - Mouseover event.\r\n * @param {Object} event.target - Event target.\r\n * @param {number} event.clientX - Horizontal coordinate in the viewport.\r\n * @param {number} event.clientY - Vertical coordinate in the viewport.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onOptionsListElementMouseover\",\n value: function onOptionsListElementMouseover(_ref5) {\n var target = _ref5.target,\n clientX = _ref5.clientX,\n clientY = _ref5.clientY;\n\n if (target.getAttribute('role') === 'option') {\n // Check that mouse position actually changed\n var isClientXYChanged = clientX - (this.prevMouseEventClientX || 0) || clientY - (this.prevMouseEventClientY || 0);\n\n if (isClientXYChanged) {\n this.focusOptionsListItem(target);\n this.prevMouseEventClientX = clientX;\n this.prevMouseEventClientY = clientY;\n }\n }\n }\n /**\r\n * Close options list if it's open, and a click occurred outside of the container element.\r\n *\r\n * @param {Object} target - Click event target.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onDocumentClick\",\n value: function onDocumentClick(target) {\n if (this.state.isOptionsListOpen && !this.containerElement.contains(target)) {\n this.closeOptionsList();\n }\n }\n /**\r\n * Update selected options from native select to custom select on change.\r\n *\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onSelectElementChange\",\n value: function onSelectElementChange() {\n var _this7 = this;\n\n var selectedOptionsArray = Array.from(this.selectElement.selectedOptions);\n this.optionsListItemElements.forEach(function (listItem) {\n var isCustomOptionSelected = listItem.classList.contains(_this7.settings.listItemElement.selectedClassName),\n isNativeOptionSelected = selectedOptionsArray.some(function (_ref6) {\n var value = _ref6.value;\n return value === listItem.dataset.value;\n });\n\n if (isCustomOptionSelected) {\n if (!isNativeOptionSelected) {\n _this7.selectElement.multiple ? _this7.toggleMultipleSelectOption(listItem, true) : _this7.toggleSingleSelectOption(_this7.getFirstFocusableOptionsListItem(false, true), true);\n }\n } else if (isNativeOptionSelected) {\n _this7.selectElement.multiple ? _this7.toggleMultipleSelectOption(listItem, true) : _this7.toggleSingleSelectOption(listItem, true);\n }\n });\n }\n /**\r\n * Mirror mutations of the native select to the custom select.\r\n *\r\n * @param {MutationRecord[]} mutations\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onSelectElementMutation\",\n value: function onSelectElementMutation(mutations) {\n var _this8 = this;\n\n mutations.forEach(function (mutation) {\n var type = mutation.type,\n target = mutation.target,\n attributeName = mutation.attributeName;\n\n if (type === 'childList') {\n _this8.onSelectElementChildListMutation(mutation);\n } else if (type === 'attributes') {\n var targetTagName = target.tagName.toLowerCase();\n\n if (attributeName === 'disabled') {\n if (targetTagName === 'select') {\n _this8.onSelectElementDisabledMutation();\n } else if (targetTagName === 'option') {\n _this8.onOptionElementDisabledMutation(target);\n } else if (targetTagName === 'optgroup') {\n _this8.onOptgroupElementDisabledMutation(target);\n }\n } else if (attributeName === 'hidden') {\n if (targetTagName === 'select') {\n _this8.onSelectElementHiddenMutation();\n } else if (targetTagName === 'option') {\n _this8.onOptionElementHiddenMutation(target);\n } else if (targetTagName === 'optgroup') {\n _this8.onOptgroupElementHiddenMutation(target);\n }\n }\n }\n });\n }\n /**\r\n * Add or remove option list items on mutation of the child list of the native select.\r\n *\r\n * @param {MutationRecord} mutation - DOM mutation of the native select.\r\n * @param {NodeList} mutation.addedNodes - List of added nodes.\r\n * @param {NodeList} mutation.removedNodes - List of removed nodes.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onSelectElementChildListMutation\",\n value: function onSelectElementChildListMutation(_ref7) {\n var _this9 = this;\n\n var addedNodes = _ref7.addedNodes,\n removedNodes = _ref7.removedNodes;\n var addedOptions = this.filterNodeListByConstructor(addedNodes, HTMLOptionElement),\n removedOptions = this.filterNodeListByConstructor(removedNodes, HTMLOptionElement); // If any options added to native select, also add them to custom select\n\n if (addedOptions.length) {\n this.createOptionsListItemElements(addedOptions);\n } // Same goes for removed options\n\n\n if (removedOptions.length) {\n removedOptions.forEach(function (removedOption) {\n var correspondingListItemIndex = _this9.optionsListItemElements.findIndex(function (_ref8) {\n var value = _ref8.dataset.value;\n return value === removedOption.value;\n });\n\n var correspondingListItem = _this9.optionsListItemElements[correspondingListItemIndex];\n\n if (correspondingListItem) {\n // If removed option was selected, unselect it from the custom select\n if (removedOption.selected) {\n if (_this9.selectElement.multiple) {\n removedOption.selected = false;\n\n _this9.toggleMultipleSelectOption(correspondingListItem, true, removedOption);\n } else {\n _this9.toggleSingleSelectOption(correspondingListItem, true, '');\n }\n } // Remove option list item\n\n\n correspondingListItem.parentElement.removeChild(correspondingListItem);\n\n _this9.optionsListItemElements.splice(correspondingListItemIndex, 1);\n }\n });\n }\n }\n /**\r\n * Toggle disabled state of custom select on mutation of native select disabled attribute.\r\n *\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onSelectElementDisabledMutation\",\n value: function onSelectElementDisabledMutation() {\n if (this.selectElement.disabled && this.state.isOptionsListOpen) {\n this.closeOptionsList();\n }\n\n if (this.labelElement) {\n if (this.selectElement.disabled) {\n this.labelElement.classList.add(this.settings.labelElement.disabledClassName);\n } else {\n this.labelElement.classList.remove(this.settings.labelElement.disabledClassName);\n }\n }\n\n this.buttonElement.disabled = this.selectElement.disabled;\n }\n /**\r\n * Toggle hidden state of custom select on mutation of native select hidden attribute.\r\n *\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onSelectElementHiddenMutation\",\n value: function onSelectElementHiddenMutation() {\n if (this.selectElement.hidden && this.state.isOptionsListOpen) {\n this.closeOptionsList();\n }\n\n this.containerElement.hidden = this.selectElement.hidden;\n }\n /**\r\n * Toggle disabled state of custom option on mutation of native option disabled attribute.\r\n *\r\n * @param {HTMLOptionElement} option - Mutated option element.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onOptionElementDisabledMutation\",\n value: function onOptionElementDisabledMutation(option) {\n var optionsListItem = this.findMatchingOptionsListItem(option);\n\n if (option.disabled) {\n if (!optionsListItem.classList.contains(this.settings.listItemElement.disabledClassName)) {\n optionsListItem.classList.add(this.settings.listItemElement.disabledClassName);\n }\n } else if (optionsListItem.classList.contains(this.settings.listItemElement.disabledClassName)) {\n optionsListItem.classList.remove(this.settings.listItemElement.disabledClassName);\n }\n }\n /**\r\n * Toggle hidden state of custom option on mutation of native option hidden attribute.\r\n *\r\n * @param {HTMLOptionElement} option - Mutated option element.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onOptionElementHiddenMutation\",\n value: function onOptionElementHiddenMutation(option) {\n var optionsListItem = this.findMatchingOptionsListItem(option);\n this.toggleVisibility(optionsListItem, option.hidden);\n }\n /**\r\n * Toggle disabled state of custom optgroup on mutation of native optgroup disabled attribute.\r\n *\r\n * @param {HTMLOptGroupElement} optgroup - Mutated optgroup element.\r\n * @param {string} optgroup.label - Label of optgroup.\r\n * @param {boolean} optgroup.disabled - Disabled attribute of optgroup.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onOptgroupElementDisabledMutation\",\n value: function onOptgroupElementDisabledMutation(_ref9) {\n var _this10 = this;\n\n var label = _ref9.label,\n disabled = _ref9.disabled;\n var listGroup = this.optionsListGroupElements[label];\n\n if (disabled) {\n if (!listGroup.classList.contains(this.settings.listGroupListElement.disabledClassName)) {\n listGroup.classList.add(this.settings.listGroupListElement.disabledClassName);\n }\n } else if (listGroup.classList.contains(this.settings.listGroupListElement.disabledClassName)) {\n listGroup.classList.remove(this.settings.listGroupListElement.disabledClassName);\n }\n\n Array.from(listGroup.children).forEach(function (listItem) {\n if (disabled) {\n if (!listItem.classList.contains(_this10.settings.listItemElement.disabledClassName)) {\n listItem.classList.add(_this10.settings.listItemElement.disabledClassName);\n }\n } else if (listItem.classList.contains(_this10.settings.listItemElement.disabledClassName)) {\n listItem.classList.remove(_this10.settings.listItemElement.disabledClassName);\n }\n });\n }\n /**\r\n * Toggle hidden state of custom optgroup on mutation of native optgroup hidden attribute.\r\n *\r\n * @param {HTMLOptGroupElement} optgroup - Mutated optgroup element.\r\n * @param {string} optgroup.label - Label of optgroup.\r\n * @param {boolean} optgroup.hidden - Hidden attribute of optgroup.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"onOptgroupElementHiddenMutation\",\n value: function onOptgroupElementHiddenMutation(_ref10) {\n var label = _ref10.label,\n hidden = _ref10.hidden;\n this.optionsListGroupElements[label].parentElement.hidden = hidden;\n Array.from(this.optionsListGroupElements[label].children).forEach(function (listItem) {\n listItem.hidden = hidden;\n });\n }\n /**\r\n * Open custom select options list.\r\n *\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"openOptionsList\",\n value: function openOptionsList() {\n if (!this.state.isOptionsListOpen) {\n // Set item height CSS variable, if it is not set yet\n if (!this.state.isItemHeightCSSVariableSet) {\n this.setItemHeightCSSVariable();\n }\n\n this.state.isOptionsListOpen = true;\n this.toggleVisibility(this.optionsListElement, false);\n this.buttonElement.setAttribute('aria-expanded', 'true');\n this.optionsListElement.focus(this.settings.listElement.preventScrollOnFocus ? {\n preventScroll: true\n } : {});\n\n if (this.state.focusedOptionsListItem) {\n this.optionsListElement.setAttribute('aria-activedescendant', this.state.focusedOptionsListItem.id);\n } else if (this.optionsListItemElements.length) {\n this.focusOptionsListItem(this.getFirstFocusableOptionsListItem(false, true));\n }\n }\n }\n /**\r\n * Close custom select options list.\r\n *\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"closeOptionsList\",\n value: function closeOptionsList() {\n if (this.state.isOptionsListOpen) {\n this.state.isOptionsListOpen = false;\n this.toggleVisibility(this.optionsListElement, true);\n this.buttonElement.removeAttribute('aria-expanded');\n this.buttonElement.focus(this.settings.buttonElement.preventScrollOnFocus ? {\n preventScroll: true\n } : {});\n this.optionsListElement.removeAttribute('aria-activedescendant');\n\n if (this.state.focusedOptionsListItem && this.selectElement.multiple) {\n this.state.focusedOptionsListItem.classList.remove(this.settings.listItemElement.focusClassName);\n this.state.focusedOptionsListItem = undefined;\n }\n }\n }\n /**\r\n * Toggle selection of an option of a single-select.\r\n *\r\n * @param {Object} target - Toggled option list item.\r\n * @param {boolean} isPreSelect - Toggled through pre-selection (\"selected\" attribute).\r\n * @param {string} [value=target.dataset.value] - Value of option list item.\r\n * @return {undefined} \r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"toggleSingleSelectOption\",\n value: function toggleSingleSelectOption(target) {\n var _this11 = this;\n\n var isPreSelect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : target.dataset.value;\n\n if (!isPreSelect) {\n // Return if tried to toggle selected option\n if (value && value === this.selectElement.value) {\n return;\n } // Set value of the native select\n\n\n this.selectElement.value = value; // Dispatch change event\n\n this.selectElement.dispatchEvent(new CustomEvent('change', {\n bubbles: true,\n detail: {\n dispatcher: 'multiselect'\n }\n }));\n } // Update custom select UI depending on if the selected option has a value or not\n\n\n if (value) {\n // Show the default text content of the button above the selected options\n if (this.settings.buttonElement.showPlaceholder && !this.buttonElement.classList.contains(this.settings.buttonElement.placeholderClassName)) {\n this.buttonElement.classList.add(this.settings.buttonElement.placeholderClassName);\n } // Set selected data attribute, mainly for easier styling\n\n\n if (!this.buttonElement.hasAttribute('data-selected')) {\n this.buttonElement.setAttribute('data-selected', '');\n } // Set text content of the button to match the selected option list item\n\n\n this.buttonElement.firstElementChild.textContent = target.textContent;\n this.buttonElement.firstElementChild.setAttribute('data-label-for', target.id);\n } else {\n // Hide the \"placeholder\" text\n if (this.settings.buttonElement.showPlaceholder && this.buttonElement.classList.contains(this.settings.buttonElement.placeholderClassName)) {\n this.buttonElement.classList.remove(this.settings.buttonElement.placeholderClassName);\n } // Reset text content of the button to the default one\n\n\n this.buttonElement.firstElementChild.textContent = this.settings.buttonElement.showPlaceholder ? this.settings.buttonElement.textContent : target.textContent;\n this.buttonElement.removeAttribute('data-selected');\n this.buttonElement.firstElementChild.removeAttribute('data-label-for');\n } // Remove selected class and \"aria-selected\" attribute from previously selected option\n\n\n if (this.optionsListItemElements) {\n this.optionsListItemElements.forEach(function (listItem) {\n if (listItem.classList.contains(_this11.settings.listItemElement.selectedClassName)) {\n listItem.classList.remove(_this11.settings.listItemElement.selectedClassName);\n }\n\n if (listItem.hasAttribute('aria-selected')) {\n listItem.removeAttribute('aria-selected');\n }\n });\n } // Add selected class and \"aria-selected\" attribute on the selected option\n\n\n target.classList.add(this.settings.listItemElement.selectedClassName);\n target.setAttribute('aria-selected', 'true');\n }\n /**\r\n * Toggle selection of an option of a multiselect.\r\n *\r\n * @param {Object} target - Toggled option list item.\r\n * @param {boolean} isPreSelect - Toggled through pre-selection (\"selected\" attribute).\r\n * @param {HTMLOptionElement} [targetNativeOption=this.findMatchingNativeOption(target)] - Corresponding native option.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"toggleMultipleSelectOption\",\n value: function toggleMultipleSelectOption(target) {\n var isPreSelect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var targetNativeOption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.findMatchingNativeOption(target);\n\n if (!isPreSelect) {\n // Toggle selection of native option\n targetNativeOption.selected = !targetNativeOption.selected; // Dispatch change event\n\n this.selectElement.dispatchEvent(new CustomEvent('change', {\n bubbles: true,\n detail: {\n dispatcher: 'multiselect'\n }\n }));\n } // Update custom select UI accordingly\n\n\n if (targetNativeOption.selected) {\n target.classList.add(this.settings.listItemElement.selectedClassName);\n target.setAttribute('aria-selected', 'true');\n\n if (target.dataset.value) {\n // Show the default text content of the button above the selected options\n if (this.settings.buttonElement.showPlaceholder && !this.buttonElement.classList.contains(this.settings.buttonElement.placeholderClassName)) {\n this.buttonElement.classList.add(this.settings.buttonElement.placeholderClassName);\n } // Reset text content of the button, if only the default value is shown\n\n\n if (this.buttonElement.firstElementChild.textContent === this.settings.buttonElement.textContent) {\n this.buttonElement.firstElementChild.textContent = '';\n } // Set selected data attribute, mainly for easier styling\n\n\n if (!this.buttonElement.hasAttribute('data-selected')) {\n this.buttonElement.setAttribute('data-selected', '');\n } // Create a span element for the selected option\n\n\n var spanElement = document.createElement('span'),\n textNode = document.createTextNode(target.textContent);\n spanElement.setAttribute('data-label-for', target.id);\n spanElement.appendChild(textNode); // Add the span element with the text content of the selected option to the button\n\n this.buttonElement.firstElementChild.appendChild(spanElement);\n }\n } else {\n target.classList.remove(this.settings.listItemElement.selectedClassName);\n target.removeAttribute('aria-selected'); // Find the span element that represents the unselected option\n\n var _spanElement = Array.from(this.buttonElement.firstElementChild.children).find(function (_ref11) {\n var labelFor = _ref11.dataset.labelFor;\n return labelFor === target.id;\n }); // Remove the matching span element, if found\n\n\n if (_spanElement) {\n this.buttonElement.firstElementChild.removeChild(_spanElement);\n } // Hide the \"placeholder\" text, if the last selected option was just unselected\n\n\n if (!this.buttonElement.firstElementChild.children.length) {\n if (this.settings.buttonElement.showPlaceholder && this.buttonElement.classList.contains(this.settings.buttonElement.placeholderClassName)) {\n this.buttonElement.classList.remove(this.settings.buttonElement.placeholderClassName);\n } // Reset text content of the button to the default one\n\n\n this.buttonElement.firstElementChild.textContent = this.settings.buttonElement.showPlaceholder ? this.settings.buttonElement.textContent : '';\n this.buttonElement.removeAttribute('data-selected');\n }\n }\n }\n /**\r\n * Set visual focus only to target option list item.\r\n *\r\n * @param {Object} target - Option list item to visually focus.\r\n * @param {boolean} [isTriggeredByKey=false] - Is focus triggered through keyboard nagivation.\r\n * @return {undefined} \r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"focusOptionsListItem\",\n value: function focusOptionsListItem(target) {\n var isTriggeredByKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!target) {\n return;\n }\n\n if (this.state.focusedOptionsListItem) {\n this.state.focusedOptionsListItem.classList.remove(this.settings.listItemElement.focusClassName);\n }\n\n this.state.focusedOptionsListItem = target;\n\n if (!target.classList.contains(this.settings.listItemElement.focusClassName)) {\n target.classList.add(this.settings.listItemElement.focusClassName);\n }\n\n if (isTriggeredByKey) {\n this.optionsListElement.setAttribute('aria-activedescendant', target.id); // Scroll to target, if it's off-screen\n\n this.scrollToOptionListItemElement(target); // Auto-select option on focus, in the case of a single select, and if focus is triggered by key\n\n if (!this.selectElement.multiple) {\n this.toggleSingleSelectOption(target);\n }\n }\n }\n /**\r\n * Scroll to option list item, if it's off-screen.\r\n *\r\n * @param {HTMLLIElement} listItem - Option list item of which position to check.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"scrollToOptionListItemElement\",\n value: function scrollToOptionListItemElement(listItem) {\n if (this.optionsListElement.scrollHeight > this.optionsListElement.clientHeight) {\n var listItemBottom = listItem.offsetTop + listItem.offsetHeight,\n scrollBottom = this.optionsListElement.clientHeight + this.optionsListElement.scrollTop;\n\n if (listItemBottom > scrollBottom) {\n this.optionsListElement.scrollTop = listItemBottom - this.optionsListElement.clientHeight;\n } else if (listItem.offsetTop < this.optionsListElement.scrollTop) {\n this.optionsListElement.scrollTop = listItem.offsetTop;\n }\n }\n }\n /**\r\n * Get a boolean value whether to visually focus on an option list item, or not.\r\n *\r\n * @return {boolean} \r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"shouldFocusOnOption\",\n value: function shouldFocusOnOption() {\n return this.state.isOptionsListOpen || !this.selectElement.multiple;\n }\n /**\r\n * Get closest focusable option list item by offset.\r\n *\r\n * @param {number} offset - Offset to add to index.\r\n * @param {number} [index=this.getFocusedOptionIndex()] - Index of option list item.\r\n * @return {HTMLLIElement|undefined} Closest option list item to focus, or undefined if none found.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"getClosestFocusableOptionListItem\",\n value: function getClosestFocusableOptionListItem(offset) {\n var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getFocusedOptionIndex();\n var targetIndex = index + offset; // If target index is equal or less than 0, return first focusable option list item\n\n if (targetIndex <= 0) {\n return this.getFirstFocusableOptionsListItem();\n } // If target index is equal or larger than last index of array, return last focusable option list item\n\n\n if (targetIndex >= this.optionsListItemElements.length - 1) {\n return this.getLastFocusableOptionsListItem();\n } // Else if offset is falsy (0), there's nothing to do\n\n\n if (!offset) {\n return this.state.focusedOptionsListItem;\n }\n\n var targetOptionsListItem = this.optionsListItemElements[targetIndex]; // Check if target is hidden or disabled\n\n if (targetOptionsListItem.hidden || targetOptionsListItem.classList.contains(this.settings.listItemElement.disabledClassName)) {\n // If so, recursively check next or previous option list item, based on whether offset is positive or negative\n return this.getClosestFocusableOptionListItem(offset + Math.sign(offset), index);\n }\n\n return targetOptionsListItem;\n }\n /**\r\n * Get index of the visually focused option list item.\r\n *\r\n * @return {number|undefined} - Index, or undefined if no option list item is focused. \r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"getFocusedOptionIndex\",\n value: function getFocusedOptionIndex() {\n return this.state.focusedOptionsListItem && this.optionsListItemElements.indexOf(this.state.focusedOptionsListItem);\n }\n /**\r\n * Create an ID for the option list item.\r\n *\r\n * @param {string} value - Value of an option of the native select.\r\n * @return {string} \r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"createOptionsListItemElementId\",\n value: function createOptionsListItemElementId(value) {\n return this.getUniqueElementId(\"\".concat(this.settings.listItemElement.idPrefix, \"-\").concat(value ? value.toLowerCase().replace(/\\s/, '-') : 'empty'));\n }\n /**\r\n * Set option list item height to a CSS variable for the option list element.\r\n * \r\n * @return {undefined} \r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"setItemHeightCSSVariable\",\n value: function setItemHeightCSSVariable() {\n var firstListItemWithHeight = this.getFirstFocusableOptionsListItem(true, false); // Do nothing, if could not find an option list item\n\n if (!firstListItemWithHeight) {\n return;\n } // Unhide option list element temporarily (not visually though) to get the height of its child\n\n\n this.optionsListElement.style.height = '0';\n this.optionsListElement.style.border = '0';\n this.optionsListElement.style.overflowY = 'hidden';\n this.optionsListElement.hidden = false; // Check if list item is contained by a hidden group\n\n var listItemGroup = firstListItemWithHeight.parentElement.parentElement.classList.contains(this.settings.listGroupElement.className) && firstListItemWithHeight.parentElement.parentElement;\n var isListItemGroupHidden = listItemGroup === null || listItemGroup === void 0 ? void 0 : listItemGroup.hidden; // If so, unhide the group too\n\n if (isListItemGroupHidden) {\n listItemGroup.hidden = false;\n } // Save list item scroll height\n\n\n var listItemHeight = firstListItemWithHeight.scrollHeight; // Hide group again\n\n if (isListItemGroupHidden) {\n listItemGroup.hidden = true;\n } // Hide option list element again\n\n\n this.optionsListElement.hidden = true;\n this.optionsListElement.style.removeProperty('height');\n this.optionsListElement.style.removeProperty('border');\n this.optionsListElement.style.removeProperty('overflow-y'); // Do nothing, if option list item has no scroll height\n\n if (!listItemHeight) {\n return;\n } // Otherwise set the CSS variable\n\n\n this.optionsListElement.style.setProperty('--item-height', \"\".concat(listItemHeight, \"px\")); // Update state to not set item height CSS variable again\n\n this.state.isItemHeightCSSVariableSet = true;\n }\n /**\r\n * Get first label element associated with the select element.\r\n *\r\n * @param {HTMLSelectElement} selectElement - Native select element.\r\n * @param {NodeList|undefined} selectElement.labels - Label elements associated with select element.\r\n * @param {string} selectElement.id - ID of select element.\r\n * @return {HTMLLabelElement|undefined|null}\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"getAssociatedLabel\",\n value: function getAssociatedLabel(_ref12) {\n var labels = _ref12.labels,\n id = _ref12.id;\n return labels ? labels[0] : document.querySelector(\"label[for=\\\"\".concat(id, \"\\\"]\"));\n }\n /**\r\n * Toggle hidden and aria-hidden attributes of an element.\r\n *\r\n * @param {HTMLElement} element - Any HTML element.\r\n * @param {boolean} [shouldHide=!element.hidden] - Hide or show element.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"toggleVisibility\",\n value: function toggleVisibility(element) {\n var shouldHide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : !element.hidden;\n element.hidden = shouldHide;\n\n if (shouldHide) {\n element.setAttribute('aria-hidden', 'true');\n } else {\n element.removeAttribute('aria-hidden');\n }\n }\n /**\r\n * Get first focusable option list item.\r\n *\r\n * @param {boolean} [checkHidden=true] - Whether to check option list item class list for truthy hidden attribute.\r\n * @param {boolean} [checkDisabled=true] - Whether to check option list item class list for disabled class.\r\n * @return {HTMLLIElement|undefined} - First focusable option list item, or undefined if not found.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"getFirstFocusableOptionsListItem\",\n value: function getFirstFocusableOptionsListItem() {\n var _this12 = this;\n\n var checkHidden = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var checkDisabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return this.optionsListItemElements.find(function (listItem) {\n return (!checkHidden || !listItem.hidden) && (!checkDisabled || !listItem.classList.contains(_this12.settings.listItemElement.disabledClassName));\n });\n }\n /**\r\n * Get last focusable option list item.\r\n *\r\n * @return {HTMLLIElement|undefined} - Last focusable option list item, or undefined if not found.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"getLastFocusableOptionsListItem\",\n value: function getLastFocusableOptionsListItem() {\n var lastFocusableListItem;\n\n for (var index = this.optionsListItemElements.length - 1; index >= 0; index--) {\n if (!this.optionsListItemElements[index].hidden && !this.optionsListItemElements[index].classList.contains(this.settings.listItemElement.disabledClassName)) {\n lastFocusableListItem = this.optionsListItemElements[index];\n break;\n }\n }\n\n return lastFocusableListItem;\n }\n /**\r\n * Find option from the native select that matches a given option list item.\r\n *\r\n * @param {HTMLLIElement} optionListItem - Option list item from the custom select.\r\n * @return {HTMLOptionElement} - Corresponding option from the native select.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"findMatchingNativeOption\",\n value: function findMatchingNativeOption(optionListItem) {\n return Array.from(this.selectElement.options).find(function (_ref13) {\n var value = _ref13.value;\n return value === optionListItem.dataset.value;\n });\n }\n /**\r\n * Find option list item that matches a given option from the native select.\r\n *\r\n * @param {HTMLOptionElement} option - Native option element.\r\n * @return {HTMLLIElement} - Corresponding option list item from the custom select.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"findMatchingOptionsListItem\",\n value: function findMatchingOptionsListItem(option) {\n return this.optionsListItemElements.find(function (_ref14) {\n var value = _ref14.dataset.value;\n return value === option.value;\n });\n }\n /**\r\n * Filter node list by constructor.\r\n *\r\n * @param {NodeList} nodeList - Node list to filter.\r\n * @param {Object} constructor - Object to test against.\r\n * @return {Array} - Array of filtered nodes. \r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"filterNodeListByConstructor\",\n value: function filterNodeListByConstructor(nodeList, constructor) {\n return nodeList.length ? Array.from(nodeList).filter(function (node) {\n return node instanceof constructor;\n }) : [];\n }\n /**\r\n * Check element ID is unique, and if not, iterate until one is found, and return the ID suffixed with index.\r\n *\r\n * @param {string} id - Element ID to test.\r\n * @param {number} [index=0] - Index to suffix the ID with.\r\n * @return {string} - Unique element ID.\r\n * @memberof Multiselect\r\n */\n\n }, {\n key: \"getUniqueElementId\",\n value: function getUniqueElementId(id) {\n var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var idToTest = index ? \"\".concat(id, \"-\").concat(index) : id;\n\n if (document.getElementById(idToTest)) {\n return this.getUniqueElementId(id, index + 1);\n }\n\n return idToTest;\n }\n }]);\n return Multiselect;\n}();\n\nvar _default = Multiselect;\nexports[\"default\"] = _default;","module.exports = require('./dist');\r\n","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nmodule.exports = _interopRequireDefault;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","module.exports = require(\"regenerator-runtime\");\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;"],"sourceRoot":""}