{"version":3,"sources":["jsdelivr-header.js","/npm/@lemonadejs/dropdown@5.8.0/dist/index.js"],"names":[],"mappings":"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","file":"/npm/@lemonadejs/dropdown@5.8.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@lemonadejs/dropdown@5.8.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\r\n * Implement page up and down navigation\r\n * Implement color attribute for items\r\n */\r\n\r\nif (!lemonade && typeof (require) === 'function') {\r\n    var lemonade = require('lemonadejs');\r\n}\r\n\r\nif (!Modal && typeof (require) === 'function') {\r\n    var Modal = require('@lemonadejs/modal');\r\n}\r\n\r\n; (function (global, factory) {\r\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n    typeof define === 'function' && define.amd ? define(factory) :\r\n    global.Dropdown = factory();\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            return this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    // Default row height\r\n    let defaultRowHeight = 24;\r\n\r\n    // Translations\r\n    const T = function(t) {\r\n        if (typeof(document) !== \"undefined\" && document.dictionary) {\r\n            return document.dictionary[t] || t;\r\n        } else {\r\n            return t;\r\n        }\r\n    }\r\n\r\n    const isEmpty = function(v) {\r\n        return v === '' || v === null || v === undefined || (Array.isArray(v) && v.length === 0);\r\n    }\r\n\r\n    /**\r\n     * Compare two values (arrays, strings, numbers, etc.)\r\n     * Returns true if both are equal or empty\r\n     * @param {*} a1\r\n     * @param {*} a2\r\n     */\r\n    const compareValues = function(a1, a2) {\r\n        if (a1 === a2 || (isEmpty(a1) && isEmpty(a2))) {\r\n            return true;\r\n        }\r\n\r\n        if (!a1 || !a2) {\r\n            return false;\r\n        }\r\n\r\n        if (Array.isArray(a1) && Array.isArray(a2)) {\r\n            if (a1.length !== a2.length) {\r\n                return false;\r\n            }\r\n            for (let i = 0; i < a1.length; i++) {\r\n                if (a1[i] !== a2[i]) {\r\n                    return false;\r\n                }\r\n            }\r\n            return true;\r\n        }\r\n\r\n        return a1 === a2;\r\n    }\r\n\r\n    const lazyLoading = function (self) {\r\n        /**\r\n         * Get the position from top of a row by its index\r\n         * @param item\r\n         * @returns {number}\r\n         */\r\n        const getRowPosition = function (item) {\r\n            // Position from top\r\n            let top = 0;\r\n            if (item) {\r\n                let items = self.rows;\r\n                if (items && items.length) {\r\n                    let index = self.rows.indexOf(item);\r\n                    // Go through the items\r\n                    for (let j = 0; j < index; j++) {\r\n                        top += items[j].height || defaultRowHeight;\r\n                    }\r\n                }\r\n            }\r\n            return top;\r\n        }\r\n\r\n        const updateScroll = function () {\r\n            let items = self.rows;\r\n            if (items) {\r\n                // Before control\r\n                let before = true;\r\n                // Total of items in the container\r\n                let numOfItems = items.length;\r\n                // Position from top\r\n                let height = 0;\r\n                // Size of the adjustment\r\n                let size = 0;\r\n                // Go through the items\r\n                for (let j = 0; j < numOfItems; j++) {\r\n                    let h = items[j].height || defaultRowHeight;\r\n                    // Height\r\n                    height += h;\r\n                    // Start tracking all items as before\r\n                    if (items[j] === self.result[0]) {\r\n                        before = false;\r\n                    }\r\n                    // Adjustment\r\n                    if (before) {\r\n                        size += h;\r\n                    }\r\n                }\r\n                // Update height\r\n                scroll.style.height = height + 'px';\r\n                // Adjust scroll position\r\n                return size;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        const getVisibleRows = function (reset) {\r\n            let items = self.rows;\r\n            if (items) {\r\n                let adjust;\r\n                // Total of items in the container\r\n                let numOfItems = items.length;\r\n                // Get the position from top\r\n                let y = el.scrollTop;\r\n                // Get the height\r\n                let h = null;\r\n                if (self.type === 'searchbar' || self.type === 'picker') {\r\n                    // Priority should be the size used on the viewport\r\n                    h = y + (el.offsetHeight || self.height);\r\n                } else {\r\n                    // Priority is the height define during initialization\r\n                    h = y + (self.height || el.offsetHeight);\r\n                }\r\n                // Go through the items\r\n                let rows = [];\r\n                // Height\r\n                let height = 0;\r\n                // Go through all items\r\n                for (let j = 0; j < numOfItems; j++) {\r\n                    if (items[j].visible !== false) {\r\n                        // Height\r\n                        let rowHeight = items[j].height || defaultRowHeight;\r\n                        // Return on partial width\r\n                        if (height + rowHeight > y && height < h) {\r\n                            rows.push(items[j]);\r\n                        }\r\n                        height += rowHeight;\r\n                    }\r\n                }\r\n\r\n                // Update visible rows\r\n                if (reset || !compareValues(rows, self.result)) {\r\n                    // Render the items\r\n                    self.result = rows;\r\n                    // Adjust scroll height\r\n                    let adjustScroll = reset;\r\n                    // Adjust scrolling\r\n                    for (let i = 0; i < rows.length; i++) {\r\n                        // Item\r\n                        let item = rows[i];\r\n                        // Item height\r\n                        let h = item.el.offsetHeight;\r\n                        // Update row height\r\n                        if (!item.height || h !== item.height) {\r\n                            // Keep item height\r\n                            item.height = h;\r\n                            // Adjust total height\r\n                            adjustScroll = true;\r\n                        }\r\n                    }\r\n\r\n                    // Update scroll if the height of one element has been changed\r\n                    if (adjustScroll) {\r\n                        // Adjust the scroll height\r\n                        adjust = updateScroll();\r\n                    }\r\n                }\r\n\r\n                // Adjust position of the first element\r\n                let position = getRowPosition(self.result[0]);\r\n                let diff = position - el.scrollTop;\r\n                if (diff > 0) {\r\n                    diff = 0;\r\n                }\r\n                self.container.style.top = diff + 'px';\r\n\r\n                return adjust;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Move the position to the top and re-render based on the scroll\r\n         * @param reset\r\n         */\r\n        const render = function (reset) {\r\n            // Move scroll to the top\r\n            el.scrollTop = 0;\r\n            // Reset scroll\r\n            updateScroll();\r\n            // Append first batch\r\n            getVisibleRows(reset);\r\n        }\r\n\r\n        /**\r\n         * Will adjust the items based on the scroll position offset\r\n         */\r\n        self.adjustPosition = function (item) {\r\n            if (item.el) {\r\n                let h = item.el.offsetHeight;\r\n                let calc = item.el.offsetTop + h;\r\n                if (calc > el.offsetHeight) {\r\n                    let size = calc - el.offsetHeight;\r\n                    if (size < h) {\r\n                        size = h;\r\n                    }\r\n                    el.scrollTop -= -1 * size;\r\n                }\r\n            }\r\n        }\r\n\r\n        // Controls\r\n        const scrollControls = function () {\r\n            getVisibleRows(false);\r\n        }\r\n\r\n        // Element for scrolling\r\n        let el = self.container.parentNode;\r\n        el.classList.add('lm-lazy');\r\n        // Div to represent the height of the content\r\n        const scroll = document.createElement('div');\r\n        scroll.classList.add('lm-lazy-scroll');\r\n        // Force the height and add scrolling\r\n        el.appendChild(scroll);\r\n        el.addEventListener('scroll', scrollControls, { passive: true });\r\n        el.addEventListener('wheel', scrollControls, { passive: true });\r\n        self.container.classList.add('lm-lazy-items');\r\n\r\n        self.goto = function (item) {\r\n            el.scrollTop = getRowPosition(item);\r\n            let adjust = getVisibleRows(false);\r\n            if (adjust) {\r\n                el.scrollTop = adjust;\r\n                // Last adjust on the visible rows\r\n                getVisibleRows(false);\r\n            }\r\n        }\r\n\r\n        return (prop) => {\r\n            if (prop === 'rows') {\r\n                render(true);\r\n            }\r\n        }\r\n    }\r\n\r\n    const getAttributeName = function(prop) {\r\n        if (prop.substring(0,1) === ':') {\r\n            prop = prop.substring(1);\r\n        } else if (prop.substring(0,3) === 'lm-') {\r\n            prop = prop.substring(3);\r\n        }\r\n        return prop.toLowerCase();\r\n    }\r\n\r\n    const extractFromHtml =  function(element) {\r\n        let data = [];\r\n        // Content\r\n        for (let i = 0; i < element.children.length; i++) {\r\n            let e = element.children[i];\r\n            let item = {\r\n                text: e.textContent || e.getAttribute('title'),\r\n                value: e.getAttribute('value'),\r\n            }\r\n            if (item.value == null) {\r\n                item.value = item.text;\r\n            }\r\n            data.push(item);\r\n        }\r\n\r\n        return data;\r\n    }\r\n\r\n    const extract = function(children) {\r\n        let data = [];\r\n\r\n        if (this.tagName) {\r\n            data = extractFromHtml(this);\r\n            // Remove all elements\r\n            this.textContent = '';\r\n        } else {\r\n            // Get data\r\n            if (typeof(children) === 'string') {\r\n                // Version 4\r\n                let d = document.createElement('div');\r\n                d.innerHTML = children;\r\n                data = extractFromHtml(d);\r\n            } else if (children && children.length) {\r\n                // Version 5\r\n                children.forEach((v) => {\r\n                    let item = {}\r\n                    v.props.forEach((prop) => {\r\n                        item[getAttributeName(prop.name)] = prop.value;\r\n                    });\r\n                    if (! item.text) {\r\n                        item.text = v.children[0]?.props[0]?.value || '';\r\n                    }\r\n                    data.push(item);\r\n                });\r\n                // Block children\r\n                children.length = 0;\r\n            }\r\n        }\r\n\r\n        return data;\r\n    }\r\n\r\n    const isDOM = function(o) {\r\n        return (o instanceof Element || o instanceof HTMLDocument || o instanceof DocumentFragment);\r\n    }\r\n\r\n    const Dropdown = function (children, { onchange, onload }) {\r\n        let self = this;\r\n        // Data\r\n        let data = [];\r\n        // Internal value controllers\r\n        let value = [];\r\n        // Cursor\r\n        let cursor = null;\r\n        // Control events\r\n        let ignoreEvents = false;\r\n        // Lazy loading global instance\r\n        let lazyloading = null;\r\n        // Tracking changes\r\n        let changesDetected = false;\r\n        // Debounce timer for search\r\n        let searchTimeout = null;\r\n\r\n        // Data\r\n        if (! Array.isArray(self.data)) {\r\n            self.data = [];\r\n        }\r\n\r\n        let d = extract.call(this, children);\r\n        if (d) {\r\n            d.forEach((v) => {\r\n                self.data.push(v)\r\n            })\r\n        }\r\n\r\n        // Decide the type based on the size of the screen\r\n        let autoType = self.type === 'auto';\r\n\r\n        // Custom events defined by the user\r\n        let load = self.onload;\r\n        self.onload = null;\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        // Compatibility\r\n        if (typeof self.newOptions !== 'undefined') {\r\n            self.insert = self.newOptions;\r\n        }\r\n\r\n        // Cursor controllers\r\n        const setCursor = function (index, force) {\r\n            let item = self.rows[index];\r\n            if (typeof (item) !== 'undefined') {\r\n                // Set the cursor number\r\n                cursor = index;\r\n                // Set visual indication\r\n                item.cursor = true;\r\n                // Go to the item on the scroll in case the item is not on the viewport\r\n                if (!(item.el && item.el.parentNode) || force === true) {\r\n                    // Goto method\r\n                    self.goto(item);\r\n                }\r\n                // Adjust cursor position\r\n                setTimeout(function () {\r\n                    self.adjustPosition(item);\r\n                });\r\n            }\r\n        }\r\n\r\n        const removeCursor = function (reset) {\r\n            if (cursor !== null) {\r\n                if (typeof (self.rows[cursor]) !== 'undefined') {\r\n                    self.rows[cursor].cursor = false;\r\n                }\r\n                if (reset) {\r\n                    // Cursor is null\r\n                    cursor = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        const moveCursor = function (direction, jump) {\r\n            // Remove cursor\r\n            removeCursor();\r\n            // Last item\r\n            let last = self.rows.length - 1;\r\n            if (jump) {\r\n                if (direction < 0) {\r\n                    cursor = 0;\r\n                } else {\r\n                    cursor = last;\r\n                }\r\n            } else {\r\n                // Position\r\n                if (cursor === null) {\r\n                    cursor = 0;\r\n                } else {\r\n                    // Move previous\r\n                    cursor = cursor + direction;\r\n                }\r\n                // Reach the boundaries\r\n                if (direction < 0) {\r\n                    // Back to the last one\r\n                    if (cursor < 0) {\r\n                        cursor = last;\r\n                    }\r\n                } else {\r\n                    // Back to the first one\r\n                    if (cursor > last) {\r\n                        cursor = 0;\r\n                    }\r\n                }\r\n            }\r\n            // Add cursor\r\n            setCursor(cursor);\r\n        }\r\n\r\n        const adjustDimensions = function(data) {\r\n            // Estimate width\r\n            let width = self.width ?? 0;\r\n            // Adjust the width\r\n            let w = getInput().offsetWidth;\r\n            if (width < w) {\r\n                width = w;\r\n            }\r\n            // Width && values\r\n            data.map(function (s) {\r\n                // Estimated width of the element\r\n                if (s.text) {\r\n                    let w = Math.max(width, s.text.length * 7.5);\r\n                    if (width < w) {\r\n                        width = w;\r\n                    }\r\n                }\r\n            });\r\n            // Min width for the container\r\n            self.container.parentNode.style.width = (width - 2) + 'px';\r\n        }\r\n\r\n        const setData = function () {\r\n            // Data\r\n            data = JSON.parse(JSON.stringify(self.data));\r\n            // Re-order to make sure groups are in sequence\r\n            if (data && data.length) {\r\n                // Adjust width and height\r\n                adjustDimensions(data);\r\n                // Groups\r\n                data.sort((a, b) => {\r\n                    // Compare groups\r\n                    if (a.group && b.group) {\r\n                        return a.group.localeCompare(b.group);\r\n                    }\r\n                    return 0;\r\n                });\r\n                let group = '';\r\n                // Define group headers\r\n                data.map((v) => {\r\n                    // Compare groups\r\n                    if (v && v.group && v.group !== group) {\r\n                        v.header = v.group;\r\n                        group = v.group;\r\n                    }\r\n                });\r\n            }\r\n            // Data to be listed\r\n            self.rows = data;\r\n        }\r\n\r\n        const updateLabel = function () {\r\n            if (value && value.length) {\r\n                getInput().textContent = value.filter(v => v.selected).map(i => i.text).join('; ');\r\n            } else {\r\n                getInput().textContent = '';\r\n            }\r\n        }\r\n\r\n        const setValue = function (v, ignoreEvent) {\r\n            // Values\r\n            let newValue;\r\n            if (! Array.isArray(v)) {\r\n                if (typeof(v) === 'string') {\r\n                    newValue = v.split(self.divisor ?? ';');\r\n                } else {\r\n                    newValue = [v];\r\n                }\r\n            } else {\r\n                newValue = v;\r\n            }\r\n\r\n            // Width && values\r\n            value = [];\r\n\r\n            if (Array.isArray(data)) {\r\n                data.map(function (s) {\r\n                    s.selected = newValue.some(v => v == s.value);\r\n                    if (s.selected) {\r\n                        value.push(s);\r\n                    }\r\n                });\r\n            }\r\n\r\n            // Update label\r\n            if (self.isClosed()) {\r\n                updateLabel();\r\n            }\r\n\r\n            // Component onchange\r\n            if (! ignoreEvent) {\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: getValue(),\r\n                });\r\n            }\r\n        }\r\n\r\n        const getValue = function () {\r\n            if (self.multiple) {\r\n                if (value && value.length) {\r\n                    return value.filter(v => v.selected).map(i => i.value);\r\n                }\r\n            } else {\r\n                if (value && value.length) {\r\n                    return value[0].value;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        const onopen = function () {\r\n            self.state = true;\r\n            // Value\r\n            let v = value[value.length - 1];\r\n            // Make sure goes back to the top of the scroll\r\n            if (self.container.parentNode.scrollTop > 0) {\r\n                self.container.parentNode.scrollTop = 0;\r\n            }\r\n            // Move to the correct position\r\n            if (v) {\r\n                // Mark the position of the cursor to the same element\r\n                setCursor(self.rows.indexOf(v), true);\r\n            }\r\n            // Prepare search field\r\n            if (self.autocomplete) {\r\n                // Get the input\r\n                let input = getInput();\r\n                // Editable\r\n                input.setAttribute('contenteditable', true);\r\n                // Clear input\r\n                input.textContent = '';\r\n                // Focus on the item\r\n                input.focus();\r\n            }\r\n            // Adjust width and height\r\n            adjustDimensions(self.data);\r\n            // Open event\r\n            Dispatch.call(self, self.onopen, 'open', {\r\n                instance: self\r\n            });\r\n        }\r\n\r\n        const onclose = function (options, origin) {\r\n            // Cursor\r\n            removeCursor(true);\r\n            // Reset search\r\n            if (self.autocomplete) {\r\n                // Go to begin of the data\r\n                self.rows = data;\r\n                // Get the input\r\n                let input = getInput();\r\n                if (input) {\r\n                    // Remove editable attribute\r\n                    input.removeAttribute('contenteditable');\r\n                    // Clear input\r\n                    input.textContent = '';\r\n                }\r\n            }\r\n\r\n            if (origin === 'escape') {\r\n                // Cancel operation and keep the same previous value\r\n                setValue(self.value, true);\r\n            } else {\r\n                // Current value\r\n                let newValue = getValue();\r\n\r\n                // If that is different from the component value\r\n                if (changesDetected === true && ! compareValues(newValue, self.value)) {\r\n                    self.value = newValue;\r\n                } else {\r\n                    // Update label\r\n                    updateLabel();\r\n                }\r\n            }\r\n\r\n            // Identify the new state of the dropdown\r\n            self.state = false;\r\n\r\n            // Close event\r\n            Dispatch.call(self, self.onclose, 'close', {\r\n                instance: self,\r\n                ...options\r\n            });\r\n        }\r\n\r\n        const normalizeData = function(result) {\r\n            if (result && result.length) {\r\n                return result.map((v) => {\r\n                    if (typeof v === 'string' || typeof v === 'number') {\r\n                        return { value: v, text: v };\r\n                    } else if (typeof v === 'object' && v.hasOwnProperty('name')) {\r\n                        return { value: v.id, text: v.name };\r\n                    } else {\r\n                        return v;\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        const loadData = function(result) {\r\n            result = normalizeData(result);\r\n            // Loading controls\r\n            lazyloading = lazyLoading(self);\r\n            // Loading new data from a remote source\r\n            if (result) {\r\n                result.forEach((v) => {\r\n                    self.data.push(v);\r\n                });\r\n            }\r\n            // Process the data\r\n            setData();\r\n            // Set value\r\n            if (typeof(self.value) !== 'undefined') {\r\n                setValue(self.value, true);\r\n            }\r\n            // Onload method\r\n            Dispatch.call(self, load, 'load', {\r\n                instance: self\r\n            });\r\n            // Remove loading spin\r\n            self.input.classList.remove('lm-dropdown-loading');\r\n        }\r\n\r\n        const resetData = function(result) {\r\n            result = normalizeData(result);\r\n            // Reset cursor\r\n            removeCursor(true);\r\n            let r = data.filter(item => {\r\n                return item.selected === true;\r\n            });\r\n            // Loading new data from a remote source\r\n            if (result) {\r\n                result.forEach((v) => {\r\n                    r.push(v);\r\n                });\r\n            }\r\n            self.rows = r;\r\n            // Remove loading spin\r\n            self.input.classList.remove('lm-dropdown-loading');\r\n\r\n            // Event\r\n            Dispatch.call(self, self.onsearch, 'search', {\r\n                instance: self,\r\n                result: result,\r\n            });\r\n        }\r\n\r\n        const getInput = function() {\r\n            return self.input;\r\n        }\r\n\r\n        const search = function(query) {\r\n            if (! self.isClosed() && self.autocomplete) {\r\n\r\n                // Remote or normal search\r\n                if (self.remote === true) {\r\n                    // Clear existing timeout\r\n                    if (searchTimeout) {\r\n                        clearTimeout(searchTimeout);\r\n                    }\r\n                    // Loading spin\r\n                    self.input.classList.add('lm-dropdown-loading');\r\n                    // Headers\r\n                    let http = {\r\n                        headers: {\r\n                            'Content-Type': 'text/json',\r\n                        }\r\n                    }\r\n                    let ret = Dispatch.call(self, self.onbeforesearch, 'beforesearch', {\r\n                        instance: self,\r\n                        http: http,\r\n                        query: query,\r\n                    });\r\n\r\n                    if (ret === false) {\r\n                        return;\r\n                    }\r\n\r\n                    // Debounce the search with 300ms delay\r\n                    searchTimeout = setTimeout(() => {\r\n                        fetch(`${self.url}?q=${query}`, http).then(r => r.json()).then(resetData).catch((error) => {\r\n                            resetData([]);\r\n                        });\r\n                    }, 300);\r\n                } else {\r\n                    // Filter options\r\n                    let temp;\r\n\r\n                    const find = (prop) => {\r\n                        if (prop) {\r\n                            if (Array.isArray(prop)) {\r\n                                // match if ANY element contains the query (case-insensitive)\r\n                                return prop.some(v => v != null && v.toString().toLowerCase().includes(query));\r\n                            }\r\n                            // handle strings/numbers/others\r\n                            return prop.toString().toLowerCase().includes(query);\r\n                        }\r\n                        return false;\r\n                    };\r\n\r\n                    if (! query) {\r\n                        temp = data;\r\n                    } else {\r\n                        temp = data.filter(item => {\r\n                            return item.selected === true || find(item.text) || find(item.group) || find(item.keywords) || find(item.synonym);\r\n                        });\r\n                    }\r\n\r\n                    // Cursor\r\n                    removeCursor(true);\r\n                    // Update the data from the dropdown\r\n                    self.rows = temp;\r\n                }\r\n            }\r\n        }\r\n\r\n        const events = {\r\n            focusout: (e) => {\r\n                if (self.modal) {\r\n                    if (! (e.relatedTarget && self.el.contains(e.relatedTarget))) {\r\n                        if (! self.isClosed()) {\r\n                            self.close({ origin: 'focusout '});\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            keydown: (e) => {\r\n                if (! self.isClosed()) {\r\n                    let prevent = false;\r\n                    if (e.code === 'ArrowUp') {\r\n                        moveCursor(-1);\r\n                        prevent = true;\r\n                    } else if (e.code === 'ArrowDown') {\r\n                        moveCursor(1);\r\n                        prevent = true;\r\n                    } else if (e.code === 'Home') {\r\n                        moveCursor(-1, true);\r\n                        if (!self.autocomplete) {\r\n                            prevent = true;\r\n                        }\r\n                    } else if (e.code === 'End') {\r\n                        moveCursor(1, true);\r\n                        if (!self.autocomplete) {\r\n                            prevent = true;\r\n                        }\r\n                    } else if (e.code === 'Enter') {\r\n                        if (e.target.tagName === 'BUTTON') {\r\n                            e.target.click();\r\n                            let input = getInput();\r\n                            input.focus();\r\n                        } else {\r\n                            select(e, self.rows[cursor]);\r\n                        }\r\n                        prevent = true;\r\n                    } else if (e.code === 'Escape') {\r\n                        self.close({ origin: 'escape'});\r\n                        prevent = true;\r\n                    } else {\r\n                        if (e.keyCode === 32 && !self.autocomplete) {\r\n                            select(e, self.rows[cursor]);\r\n                        }\r\n                    }\r\n\r\n                    if (prevent) {\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                } else {\r\n                    if (e.code === 'ArrowUp' || e.code === 'ArrowDown' || e.code === 'Enter') {\r\n                        self.open();\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                }\r\n            },\r\n            mousedown: (e) => {\r\n                if (e.target.classList.contains('lm-dropdown-input')) {\r\n                    if (self.autocomplete) {\r\n                        let x;\r\n                        if (e.changedTouches && e.changedTouches[0]) {\r\n                            x = e.changedTouches[0].clientX;\r\n                        } else {\r\n                            x = e.clientX;\r\n                        }\r\n                        if (e.target.offsetWidth - (x - e.target.offsetLeft) < 20) {\r\n                            toggle();\r\n                        } else {\r\n                            self.open();\r\n                        }\r\n                    } else {\r\n                        toggle();\r\n                    }\r\n                }\r\n            },\r\n            paste: (e) => {\r\n                if (e.target.classList.contains('lm-dropdown-input')) {\r\n                    let text;\r\n                    if (e.clipboardData || e.originalEvent.clipboardData) {\r\n                        text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n                    } else if (window.clipboardData) {\r\n                        text = window.clipboardData.getData('Text');\r\n                    }\r\n                    text = text.replace(/(\\r\\n|\\n|\\r)/gm, \"\");\r\n                    document.execCommand('insertText', false, text)\r\n                    e.preventDefault();\r\n                }\r\n            },\r\n            input: (e) => {\r\n                if (e.target.classList.contains('lm-dropdown-input')) {\r\n                    search(e.target.textContent.toLowerCase());\r\n                }\r\n            },\r\n        }\r\n\r\n        const selectItem = function(s) {\r\n            if (self.remote === true) {\r\n                if (data.indexOf(s) === -1) {\r\n                    self.data.push(s);\r\n                    data.push(s);\r\n                }\r\n            }\r\n\r\n            if (self.multiple === true) {\r\n                let position = value.indexOf(s);\r\n                if (position === -1) {\r\n                    value.push(s);\r\n                    s.selected = true;\r\n                } else {\r\n                    value.splice(position, 1);\r\n                    s.selected = false;\r\n                }\r\n            } else {\r\n                if (value[0] === s) {\r\n                    if (self.allowEmpty === false) {\r\n                        s.selected = true;\r\n                    } else {\r\n                        s.selected = !s.selected;\r\n                    }\r\n                } else {\r\n                    if (value[0]) {\r\n                        value[0].selected = false;\r\n                    }\r\n                    s.selected = true;\r\n                }\r\n                if (s.selected) {\r\n                    value = [s];\r\n                } else {\r\n                    value = [];\r\n                }\r\n            }\r\n\r\n            changesDetected = true;\r\n        }\r\n\r\n        const add = async function (e) {\r\n            let input = getInput();\r\n            let text = input.textContent;\r\n            if (! text) {\r\n                return false;\r\n            }\r\n\r\n            // New item\r\n            let s = {\r\n                text: text,\r\n                value: text,\r\n            }\r\n\r\n            self.add(s);\r\n\r\n            e.preventDefault();\r\n        }\r\n\r\n        const select = function (e, s) {\r\n            if (s && s.disabled !== true) {\r\n                selectItem(s);\r\n                // Close the modal\r\n                if (self.multiple !== true) {\r\n                    self.close({ origin: 'button' });\r\n                }\r\n            }\r\n        }\r\n\r\n        const toggle = function () {\r\n            if (self.modal) {\r\n                if (self.isClosed()) {\r\n                    self.open();\r\n                } else {\r\n                    self.close({ origin: 'button' });\r\n                }\r\n            }\r\n        }\r\n\r\n        self.add = async function (newItem) {\r\n            // Event\r\n            if (typeof(self.onbeforeinsert) === 'function') {\r\n                self.input.classList.add('lm-dropdown-loading');\r\n                let ret = await self.onbeforeinsert(self, newItem);\r\n                self.input.classList.remove('lm-dropdown-loading');\r\n                if (ret === false) {\r\n                    return;\r\n                } else if (ret) {\r\n                    newItem = ret;\r\n                }\r\n            }\r\n            // Process the data\r\n            data.push(newItem);\r\n            self.data.push(newItem);\r\n            // Refresh screen\r\n            self.result.unshift(newItem);\r\n            self.rows.unshift(newItem);\r\n            self.refresh('result');\r\n\r\n            Dispatch.call(self, self.oninsert, 'insert', {\r\n                instance: self,\r\n                item: newItem,\r\n            });\r\n        }\r\n\r\n        self.open = function () {\r\n            if (self.modal && ! self.disabled) {\r\n                if (self.isClosed()) {\r\n                    if (autoType) {\r\n                        self.type = window.innerWidth > 640 ? self.type = 'default' : (self.autocomplete ? 'searchbar' : 'picker');\r\n                    }\r\n                    // Track\r\n                    changesDetected = false;\r\n                    // Open the modal\r\n                    self.modal.open();\r\n                }\r\n            }\r\n        }\r\n\r\n        self.close = function (options) {\r\n            if (self.modal) {\r\n                if (options?.origin) {\r\n                    self.modal.close(options)\r\n                } else {\r\n                    self.modal.close({ origin: 'button' })\r\n                }\r\n            }\r\n        }\r\n\r\n        self.isClosed = function() {\r\n            if (self.modal) {\r\n                return self.modal.isClosed();\r\n            }\r\n        }\r\n\r\n        self.setData = function(data) {\r\n            self.data = data;\r\n        }\r\n\r\n        self.getData = function() {\r\n            return self.data;\r\n        }\r\n\r\n        self.getValue = function() {\r\n            return self.value;\r\n        }\r\n\r\n        self.setValue = function(v) {\r\n            self.value = v;\r\n        }\r\n\r\n        self.reset = function() {\r\n            self.value = null;\r\n            self.close({ origin: 'button' });\r\n        }\r\n\r\n        self.onevent = function(e) {\r\n            if (events[e.type]) {\r\n                events[e.type](e);\r\n            }\r\n        }\r\n\r\n        // Init with a\r\n        let input = self.input;\r\n\r\n        onload(() => {\r\n            if (self.type === \"inline\") {\r\n                // For inline dropdown\r\n                self.el.setAttribute('tabindex', 0);\r\n                // Remove search\r\n                self.input.remove();\r\n            } else {\r\n                // Create modal instance\r\n                self.modal = {\r\n                    closed: true,\r\n                    focus: false,\r\n                    onopen: onopen,\r\n                    onclose: onclose,\r\n                    position: 'absolute',\r\n                    'auto-adjust': true,\r\n                    'auto-close': false,\r\n                };\r\n                // Generate modal\r\n                Modal(self.el.children[1], self.modal);\r\n            }\r\n\r\n            if (self.remote === 'true') {\r\n                self.remote = true;\r\n            }\r\n\r\n            if (self.autocomplete === 'true') {\r\n                self.autocomplete = true;\r\n            }\r\n\r\n            if (self.multiple === 'true') {\r\n                self.multiple = true;\r\n            }\r\n\r\n            if (self.insert === 'true') {\r\n                self.insert = true;\r\n            }\r\n\r\n            // Autocomplete will be forced to be true when insert action is active\r\n            if ((self.insert === true || self.type === 'searchbar' || self.remote === true) && ! self.autocomplete) {\r\n                self.autocomplete = true;\r\n            }\r\n\r\n            if (typeof(input) !== 'undefined') {\r\n                // Remove the native element\r\n                if (isDOM(input)) {\r\n                    input.classList.add('lm-dropdown-input');\r\n                }\r\n                // Remove search\r\n                self.input.remove();\r\n                // New input\r\n                self.input = input;\r\n            } else {\r\n                self.el.children[0].style.position = 'relative';\r\n            }\r\n\r\n            // Default width\r\n            if (self.width) {\r\n                // Dropdown\r\n                self.el.style.width = self.width + 'px';\r\n            }\r\n\r\n            // Height\r\n            self.height = 400;\r\n\r\n            // Animation for mobile\r\n            if (document.documentElement.clientWidth < 800) {\r\n                self.animation = true;\r\n            }\r\n\r\n            // Events\r\n            self.el.addEventListener('focusout', events.focusout);\r\n            self.el.addEventListener('keydown', events.keydown);\r\n            self.el.addEventListener('mousedown', events.mousedown);\r\n            self.el.addEventListener('paste', events.paste);\r\n            self.el.addEventListener('input', events.input);\r\n\r\n            // Load remote data\r\n            if (self.url) {\r\n                if (self.remote === true) {\r\n                    loadData();\r\n                } else {\r\n                    // Loading spin\r\n                    self.input.classList.add('lm-dropdown-loading');\r\n                    // Load remote data\r\n                    fetch(self.url, {\r\n                        headers: {\r\n                            'Content-Type': 'text/json',\r\n                        }\r\n                    }).then(r => r.json()).then(loadData).catch(() => {\r\n                        loadData();\r\n                    });\r\n                }\r\n            } else {\r\n                loadData();\r\n            }\r\n        });\r\n\r\n        onchange(prop => {\r\n            if (prop === 'value') {\r\n                setValue(self.value);\r\n            } else if (prop === 'data') {\r\n                setData();\r\n                self.value = null;\r\n            }\r\n\r\n            if (typeof (lazyloading) === 'function') {\r\n                lazyloading(prop);\r\n            }\r\n        });\r\n\r\n        return render => render`<div class=\"lm-dropdown\" data-state=\"{{self.state}}\" data-insert=\"{{self.insert}}\" data-type=\"{{self.type}}\" data-disabled=\"{{self.disabled}}\" :value=\"self.value\" :data=\"self.data\">\r\n            <div class=\"lm-dropdown-header\">\r\n                <div class=\"lm-dropdown-input\" placeholder=\"{{self.placeholder}}\" :ref=\"self.input\" tabindex=\"0\"></div>\r\n                <button class=\"lm-dropdown-add\" onclick=\"${add}\" tabindex=\"0\"></button>\r\n                <div class=\"lm-dropdown-header-controls\">\r\n                    <button onclick=\"self.reset\" class=\"lm-dropdown-done\">${T('Reset')}</button>\r\n                    <button onclick=\"self.close\" class=\"lm-dropdown-done\">${T('Done')}</button>\r\n                </div>\r\n            </div>\r\n            <div class=\"lm-dropdown-content\">\r\n                <div>\r\n                    <div :loop=\"self.result\" :ref=\"self.container\" :rows=\"self.rows\">\r\n                        <div class=\"lm-dropdown-item\" onclick=\"${select}\" data-cursor=\"{{self.cursor}}\" data-disabled=\"{{self.disabled}}\" data-selected=\"{{self.selected}}\" data-group=\"{{self.header}}\">\r\n                            <div><img :src=\"self.image\" /> <div>{{self.text}}</div></div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`;\r\n    }\r\n\r\n    lemonade.setComponents({ Dropdown: Dropdown });\r\n\r\n    lemonade.createWebComponent('dropdown', Dropdown);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Dropdown, root, options)\r\n            return options;\r\n        } else {\r\n            return Dropdown.call(this, root)\r\n        }\r\n    }\r\n})));"]}