{"version":3,"sources":["webpack:///./src/js/modules/legacy/complexEvents.js","webpack:///./src/js/components/dropdown.js"],"names":["Module","this","dom","dropdown","el","querySelector","Dropdown","on","handleOptionChange","bind","e","window","location","href","target","value","Component","options","style","dataset","search","searchTimeout","buildDropdown","document","addEventListener","handleClickOutside","handleOptionSelect","trigger","handleTriggerClick","handleTriggerKeydown","parentNode","hideDropdownList","list","childNodes","forEach","item","selectItem","event","callback","Event","createEvent","initEvent","dispatchEvent","wrapper","contains","innerHTML","getPlaceholder","option","setAttribute","isDevice","getAttribute","showDropdownList","key","which","keyCode","activeItem","preventDefault","stopPropagation","nextElement","previousElementSibling","focusItem","focusLast","nextElementSibling","focusFirst","findItemToFocus","character","String","fromCharCode","trim","items","querySelectorAll","clearTimeout","find","textContent","innerText","toLowerCase","startsWith","setTimeout","element","removeAttribute","defocusItem","scrollHeight","clientHeight","scrollBottom","scrollTop","elementBottom","offsetTop","offsetHeight","firstItem","length","classList","add","open","duration","close","remove","placeholder","selectedOptionLabel","listId","uuidv4","createElement","insertBefore","appendChild","label","id","map","text","join","nextSibling","parent","removeChild","destroy","setupDefaults","addListeners"],"mappings":"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","file":"38.eae7a997628ab35f9c5e.js","sourcesContent":["import { Component } from '@verndale/core';\nimport Dropdown from '../../components/dropdown';\n\nclass Module extends Component {\n setupDefaults() {\n this.dom = {\n dropdown: this.el.querySelector('.mobile_tab_dropdown')\n };\n\n this.dropdown = new Dropdown(this.dom.dropdown);\n }\n\n addListeners() {\n this.dropdown.on('option', this.handleOptionChange.bind(this));\n }\n\n handleOptionChange(e) {\n window.location.href = e.target.value;\n }\n}\n\nexport default Module;\n","import { Component } from '@verndale/core';\nimport { isDevice, open, close } from '../helpers';\nimport { v4 as uuidv4 } from 'uuid';\n\nclass Module extends Component {\n setupDefaults() {\n this.options = [...this.el];\n this.style = this.el.dataset.style;\n this.search = '';\n this.searchTimeout = null;\n\n this.buildDropdown();\n }\n\n addListeners() {\n document.addEventListener('click', this.handleClickOutside.bind(this));\n this.el.addEventListener('change', this.handleOptionSelect.bind(this));\n this.dom.trigger.addEventListener(\n 'click',\n this.handleTriggerClick.bind(this)\n );\n this.dom.trigger.addEventListener(\n 'keydown',\n this.handleTriggerKeydown.bind(this)\n );\n this.dom.trigger.parentNode.addEventListener(\n 'blur',\n this.hideDropdownList.bind(this)\n );\n this.dom.list.childNodes.forEach(item => {\n item.addEventListener('click', () => this.selectItem(item));\n });\n }\n\n on(event, callback) {\n this.el.addEventListener(event, callback);\n }\n\n setValue(value) {\n let event;\n\n if (typeof Event === 'function') {\n event = new Event('change');\n } else {\n event = document.createEvent('Event');\n event.initEvent('change', true, true);\n }\n\n this.el.value = value;\n this.el.dispatchEvent(event);\n }\n\n getValue() {\n return this.el.value;\n }\n\n handleClickOutside(e) {\n if (this.dom.wrapper !== e.target && !this.dom.wrapper.contains(e.target)) {\n this.hideDropdownList();\n }\n }\n\n handleOptionSelect() {\n let event;\n\n if (typeof Event === 'function') {\n event = new Event('option');\n } else {\n event = document.createEvent('Event');\n event.initEvent('option', true, true);\n }\n\n this.dom.trigger.innerHTML = this.getPlaceholder(this.el.value);\n\n this.options.forEach(option => {\n if (option.value === this.el.value) {\n option.setAttribute('aria-selected', true);\n } else {\n option.setAttribute('aria-selected', false);\n }\n });\n\n this.dom.list.childNodes.forEach(item => {\n if (item.dataset.value === this.el.value) {\n item.setAttribute('aria-selected', true);\n } else {\n item.setAttribute('aria-selected', false);\n }\n });\n\n this.el.dispatchEvent(event);\n }\n\n handleTriggerClick() {\n if (isDevice()) {\n return;\n }\n\n if (!this.dom.trigger.getAttribute('aria-expanded')) {\n this.showDropdownList();\n } else {\n this.hideDropdownList();\n }\n }\n\n handleTriggerKeydown(e) {\n if (isDevice()) return;\n\n const key = e.which || e.keyCode;\n\n switch (key) {\n case 13: // ENTER\n if (this.dom.trigger.getAttribute('aria-expanded')) {\n if (this.activeItem) {\n e.preventDefault();\n e.stopPropagation();\n this.selectItem(this.activeItem);\n }\n }\n break;\n case 38: // UP\n e.preventDefault();\n if (this.dom.trigger.getAttribute('aria-expanded') !== 'true') {\n this.showDropdownList();\n }\n\n if (this.activeItem) {\n const nextElement = this.activeItem.previousElementSibling;\n\n if (nextElement) {\n this.focusItem(nextElement);\n } else {\n this.focusLast();\n }\n } else {\n this.focusLast();\n }\n\n break;\n case 40: // DOWN\n e.preventDefault();\n if (this.dom.trigger.getAttribute('aria-expanded') !== 'true') {\n this.showDropdownList();\n }\n\n if (this.activeItem) {\n const nextElement = this.activeItem.nextElementSibling;\n\n if (nextElement) {\n this.focusItem(nextElement);\n } else {\n this.focusFirst();\n }\n } else {\n this.focusFirst();\n }\n\n break;\n case 36:\n e.preventDefault();\n this.focusFirst();\n break;\n case 35:\n e.preventDefault();\n this.focusLast();\n break;\n default:\n this.findItemToFocus(key);\n break;\n }\n }\n\n findItemToFocus(key) {\n const character = String.fromCharCode(key).trim();\n const items = this.dom.list.querySelectorAll('[role=\"option\"]');\n\n if (!character) return;\n\n if (!this.dom.trigger.getAttribute('aria-expanded')) {\n this.showDropdownList();\n }\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.search += character;\n\n [...items].find(option => {\n const label = option.textContent || option.innerText || '';\n\n if (label.trim().toLowerCase().startsWith(this.search.toLowerCase())) {\n this.focusItem(option);\n return true;\n }\n });\n\n this.searchTimeout = setTimeout(() => {\n this.search = '';\n }, 500);\n }\n\n selectItem(item) {\n this.el.value = item.dataset.value;\n this.handleOptionSelect();\n this.hideDropdownList();\n }\n\n defocusItem(element) {\n if (!element) return;\n element.removeAttribute('aria-selected');\n }\n\n focusItem(element) {\n this.defocusItem(this.activeItem);\n element.setAttribute('aria-selected', 'true');\n this.activeItem = element;\n\n if (this.dom.list.scrollHeight > this.dom.list.clientHeight) {\n const scrollBottom = this.dom.list.clientHeight + this.dom.list.scrollTop;\n const elementBottom = element.offsetTop + element.offsetHeight;\n if (elementBottom > scrollBottom) {\n this.dom.list.scrollTop = elementBottom - this.dom.list.clientHeight;\n } else if (element.offsetTop < this.dom.list.scrollTop) {\n this.dom.list.scrollTop = element.offsetTop;\n }\n }\n }\n\n focusFirst() {\n const firstItem = this.dom.list.querySelector('[role=\"option\"]');\n if (firstItem) {\n this.focusItem(firstItem);\n }\n }\n\n focusLast() {\n const items = this.dom.list.querySelectorAll('[role=\"option\"]');\n\n if (items.length) {\n this.focusItem(items[items.length - 1]);\n }\n }\n\n showDropdownList() {\n this.dom.trigger.setAttribute('aria-expanded', true);\n this.dom.wrapper.classList.add('open');\n open({ element: this.dom.list, duration: 0.6 });\n }\n\n hideDropdownList() {\n close({\n element: this.dom.list,\n duration: 0.6\n });\n this.dom.trigger.removeAttribute('aria-expanded');\n this.dom.wrapper.classList.remove('open');\n this.defocusItem(this.activeItem);\n this.activeItem = null;\n }\n\n getPlaceholder(value) {\n const placeholder = this.el.getAttribute('placeholder');\n const selectedOptionLabel = this.options.find(\n option => option.value === value\n ).innerHTML;\n\n if (placeholder) {\n return `${\n selectedOptionLabel\n ? `<span>${placeholder}:</span>`\n : `<span>${placeholder}</span>`\n } ${selectedOptionLabel}<svg><use xlink:href=\"#chevron-right\" /></svg>`;\n }\n\n return `${selectedOptionLabel}<svg><use xlink:href=\"#chevron-right\" /></svg>`;\n }\n\n buildDropdown() {\n const listId = uuidv4();\n this.dom.wrapper = document.createElement('div');\n this.el.setAttribute('aria-hidden', true);\n this.el.setAttribute('tabindex', '-1');\n this.el.parentNode.insertBefore(this.dom.wrapper, this.el);\n this.dom.wrapper.classList.add('dropdown');\n\n if (this.style) {\n this.dom.wrapper.classList.add(`dropdown--${this.style}`);\n }\n\n if (isDevice()) {\n this.dom.wrapper.classList.add('dropdown--native');\n }\n this.dom.wrapper.appendChild(this.el);\n\n this.dom.trigger = document.createElement('button');\n this.dom.trigger.classList.add('dropdown__trigger');\n this.dom.trigger.setAttribute('type', 'button');\n this.dom.trigger.setAttribute('role', 'combobox');\n this.dom.trigger.setAttribute('aria-haspopup', 'listbox');\n this.dom.trigger.setAttribute('aria-controls', `${listId}`);\n\n // Get label\n const label = document.querySelector(`label[for=\"${this.el.id}\"]`);\n\n if (label) {\n this.dom.trigger.setAttribute('aria-label', label.textContent);\n }\n\n this.dom.trigger.innerHTML = this.getPlaceholder(this.el.value);\n\n this.dom.wrapper.appendChild(this.dom.trigger);\n\n this.dom.list = document.createElement('ul');\n this.dom.list.id = listId;\n this.dom.list.classList.add('dropdown__list');\n this.dom.list.setAttribute('role', 'listbox');\n this.dom.list.setAttribute(\n 'aria-label',\n this.el.getAttribute('aria-label')\n );\n this.dom.list.innerHTML = this.options\n .map(\n option =>\n `<li class=\"dropdown__list__option\" role=\"option\" data-value=\"${\n option.value\n }\" aria-selected=\"${option.value === this.el.value}\">${option.text}\n <span clasS=\"dropdown__list__option-decorator\">\n <span></span>\n </span>\n </li>`\n )\n .join('');\n this.el.parentNode.insertBefore(this.dom.list, this.el.nextSibling);\n this.dom.wrapper.appendChild(this.dom.list);\n }\n\n destroy() {\n const parent = this.el.parentNode;\n parent.removeChild(this.el);\n parent.parentNode.insertBefore(this.el, parent);\n parent.parentNode.removeChild(parent);\n }\n\n update() {\n this.destroy();\n this.setupDefaults();\n this.addListeners();\n }\n}\n\nexport default Module;\n"],"sourceRoot":""}