UNPKG

vanilla-icon-picker-virtualized

Version:

Icon picker - Vanilla JS icon picker with virtualization

1 lines 50.4 kB
{"version":3,"file":"icon-picker.min.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/js/utlis/utils.js","webpack:///./src/js/utlis/virtualIconGrid.js","webpack:///./src/js/template.js","webpack:///./src/js/utlis/collections.js","webpack:///./src/js/IconPicker.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"IconPicker\"] = factory();\n\telse\n\t\troot[\"IconPicker\"] = factory();\n})(self, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","function eventListener(method, elements, events, fn) {\r\n if (!Array.isArray(elements)) {\r\n elements = [elements];\r\n }\r\n\r\n if (!Array.isArray(events)) {\r\n events = [events];\r\n }\r\n\r\n for (const el of elements) {\r\n for (const ev of events) {\r\n el[method](ev, fn);\r\n }\r\n }\r\n\r\n return [].slice.call(arguments, 1);\r\n}\r\n\r\n/**\r\n * Add event to element.\r\n * @param elements DOM-Elements\r\n * @param events Event names\r\n * @param fn Callback\r\n * @param options Optional options\r\n * @return Array passed arguments\r\n */\r\nexport const addEvent = eventListener.bind(null, 'addEventListener');\r\n\r\n/**\r\n * Remove event from element.\r\n * @param elements DOM-Elements\r\n * @param events Event names\r\n * @param fn Callback\r\n * @param options Optional options\r\n * @return Array passed arguments\r\n */\r\nexport const removeEvent = eventListener.bind(null, 'removeEventListener');\r\n\r\n/**\r\n * Resolves a HTMLElement by query.\r\n * @param val\r\n * @returns {null|Document|Element}\r\n */\r\nexport function resolveElement(val) {\r\n if (val instanceof HTMLElement) {\r\n return val;\r\n } else if (typeof val === 'string') {\r\n return document.querySelector(val)\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Convert a template string into HTML DOM nodes\r\n * @param {String} str The template string\r\n * @return {Node} The template HTML\r\n */\r\nexport function stringToHTML(str) {\r\n if (window.DOMParser) {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(str, 'text/html');\r\n return doc.body.firstElementChild;\r\n }\r\n\r\n const dom = document.createElement('div');\r\n dom.innerHTML = str;\r\n return dom.firstElementChild;\r\n}\r\n\r\n/**\r\n * Check if item is an object\r\n * @param {Object} item\r\n * @returns {boolean}\r\n */\r\nexport function isObject(item) {\r\n return (item && typeof item === 'object' && !Array.isArray(item));\r\n}\r\n\r\n/**\r\n *\r\n * @param target\r\n * @param source\r\n * @returns {Object}\r\n */\r\nexport function mergeDeep(target, source) {\r\n let output = Object.assign({}, target);\r\n\r\n if (isObject(target) && isObject(source)) {\r\n Object.keys(source).forEach(key => {\r\n if (isObject(source[key])) {\r\n if (!(key in target))\r\n Object.assign(output, {[key]: source[key]});\r\n else\r\n output[key] = mergeDeep(target[key], source[key]);\r\n } else {\r\n Object.assign(output, {[key]: source[key]});\r\n }\r\n });\r\n }\r\n return output;\r\n}\r\n\r\n/**\r\n *\r\n * @param callback\r\n * @param delay\r\n * @returns {(function(): void)|*}\r\n */\r\nexport function debounce(callback, delay){\r\n var timer;\r\n return function(){\r\n var args = arguments;\r\n var context = this;\r\n clearTimeout(timer);\r\n timer = setTimeout(function(){\r\n callback.apply(context, args);\r\n }, delay)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param object\r\n * @param value\r\n * @returns {string}\r\n */\r\nexport function getKeyByValue(object, value) {\r\n return Object.keys(object).find(key => object[key] === value);\r\n}\r\n","/*\r\n Virtualized Icon Grid (vanilla JS)\r\n ----------------------------------\r\n Renders only the visible icons (plus a buffer) inside a scrollable container.\r\n - No frameworks, no dependencies\r\n - Works with your availableIcons: [{ value: string, categories?: string[] }]\r\n - Integrates with an <input> for searching\r\n - Keeps DOM size tiny and fast even with thousands of icons\r\n\r\n Basic usage (inside your component/class):\r\n\r\n this.virtualIconGrid = new VirtualIconGrid({\r\n container: root.content, // scrollable container element\r\n items: this.availableIcons, // data source\r\n renderItem: (icon) => {\r\n // Customize how each icon renders\r\n const btn = document.createElement('button');\r\n btn.type = 'button';\r\n btn.className = `icon-element ${icon.value}`; // keep your class for styles\r\n btn.title = icon.value;\r\n btn.setAttribute('aria-label', icon.value);\r\n // Example inner content; adjust to your icon system\r\n btn.innerHTML = `<i class=\"${icon.value}\"></i>`;\r\n // Optional: selection behavior\r\n btn.addEventListener('click', () => this._onSelect && this._onSelect(icon));\r\n return btn;\r\n },\r\n i18nEmpty: options.i18n['text:empty'],\r\n estimateItemSize: { width: 72, height: 72 }, // tune to your icon tile size\r\n bufferRows: 4 // extra rows rendered above/below viewport\r\n });\r\n\r\n this.virtualIconGrid.mount();\r\n\r\n // Hook up search input\r\n const onSearch = debounce((evt) => {\r\n const q = (evt.target.value || '').trim().toLowerCase();\r\n this.virtualIconGrid.setQuery(q);\r\n }, 120);\r\n this._eventBindings.push(addEvent(root.search, 'input', onSearch));\r\n\r\n Minimal CSS you should have:\r\n .virtual-scroll { overflow: auto; position: relative; }\r\n .vs-inner { position: relative; width: 100%; }\r\n .vs-item { position: absolute; }\r\n .is-empty { padding: 1rem; color: #666; }\r\n\r\n*/\r\n\r\nexport default class VirtualIconGrid {\r\n constructor({\r\n container,\r\n items,\r\n renderItem,\r\n i18nEmpty = 'No results',\r\n estimateItemSize = { width: 42, height: 42 },\r\n gaps = { x: 6, y: 6 },\r\n\r\n bufferRows = 3\r\n }) {\r\n if (!container) throw new Error('VirtualIconGrid: container is required');\r\n if (!renderItem) throw new Error('VirtualIconGrid: renderItem is required');\r\n\r\n this.container = container; // scrollable element\r\n this.items = Array.isArray(items) ? items.slice() : [];\r\n this.renderItem = renderItem;\r\n this.i18nEmpty = i18nEmpty;\r\n this.estimate = estimateItemSize;\r\n this.bufferRows = Math.max(0, bufferRows | 0);\r\n\r\n // Internal state\r\n this._query = '';\r\n this._indexed = []; // [{value, text}]\r\n this._filtered = []; // filtered items\r\n this._cols = 1;\r\n this._itemW = this.estimate.width;\r\n this._itemH = this.estimate.height;\r\n this._gapX = gaps.x; // horizontal gap guess; refined via measurement\r\n this._gapY = gaps.y; // vertical gap guess\r\n this._mounted = false;\r\n this._onScroll = this._onScroll.bind(this);\r\n this._onResize = this._onResize.bind(this);\r\n\r\n // DOM nodes\r\n this._inner = document.createElement('div');\r\n this._inner.className = 'vs-inner';\r\n this._emptyEl = document.createElement('div');\r\n this._emptyEl.className = 'is-empty';\r\n this._emptyEl.textContent = this.i18nEmpty;\r\n\r\n // For cheap diff to avoid rerendering same window\r\n this._lastRange = { start: -1, end: -1 };\r\n\r\n // Observer\r\n this._resizeObs = null;\r\n\r\n // Prepare index and initial filter\r\n this._buildIndex();\r\n this._filtered = this.items;\r\n }\r\n\r\n mount() {\r\n if (this._mounted) return;\r\n this._mounted = true;\r\n\r\n // Clear container (you may want to preserve other siblings if needed)\r\n while (this.container.firstChild) this.container.removeChild(this.container.firstChild);\r\n\r\n // Ensure container has the right class for scroll behavior\r\n this.container.classList.add('virtual-scroll');\r\n\r\n // Attach inner scroll space\r\n this.container.appendChild(this._inner);\r\n\r\n // Measure actual item size + gaps using a sample\r\n this._measureItem();\r\n\r\n // Compute columns and paint initial frame\r\n this._computeLayout();\r\n this._updateInnerHeight();\r\n this._renderWindow();\r\n this._toggleEmptyMessage();\r\n\r\n // Listeners\r\n this.container.addEventListener('scroll', this._onScroll, { passive: true });\r\n\r\n // ResizeObserver for container size changes\r\n if ('ResizeObserver' in window) {\r\n this._resizeObs = new ResizeObserver(this._onResize);\r\n this._resizeObs.observe(this.container);\r\n } else {\r\n // Fallback: recompute on window resize\r\n window.addEventListener('resize', this._onResize);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (!this._mounted) return;\r\n this._mounted = false;\r\n\r\n this.container.removeEventListener('scroll', this._onScroll);\r\n if (this._resizeObs) {\r\n this._resizeObs.disconnect();\r\n this._resizeObs = null;\r\n } else {\r\n window.removeEventListener('resize', this._onResize);\r\n }\r\n\r\n // Clean DOM\r\n this._inner.replaceChildren();\r\n if (this._emptyEl && this._emptyEl.parentNode) this._emptyEl.remove();\r\n }\r\n\r\n setItems(nextItems) {\r\n this.items = Array.isArray(nextItems) ? nextItems.slice() : [];\r\n this._buildIndex();\r\n this._applyFilter();\r\n }\r\n\r\n setQuery(q) {\r\n const next = (q || '').toLowerCase();\r\n if (next === this._query) return;\r\n this._query = next;\r\n this._applyFilter();\r\n }\r\n\r\n // ---------- internals ----------\r\n _buildIndex() {\r\n this._indexed = this.items.map(it => ({\r\n value: it.value,\r\n text: [it.value, ...(it.categories || [])].join(' ').toLowerCase(),\r\n ref: it\r\n }));\r\n }\r\n\r\n _applyFilter() {\r\n if (!this._query) {\r\n this._filtered = this.items;\r\n } else {\r\n const q = this._query;\r\n this._filtered = this._indexed\r\n .filter(row => row.text.includes(q))\r\n .map(row => row.ref);\r\n }\r\n\r\n this._toggleEmptyMessage();\r\n this._updateInnerHeight();\r\n this._lastRange.start = -1; // force repaint\r\n this._renderWindow();\r\n }\r\n\r\n _toggleEmptyMessage() {\r\n const hasResults = this._filtered.length > 0;\r\n if (!hasResults) {\r\n if (!this._emptyEl.parentNode) this.container.appendChild(this._emptyEl);\r\n } else if (this._emptyEl.parentNode) {\r\n this._emptyEl.remove();\r\n }\r\n }\r\n\r\n _measureItem() {\r\n // Create a sample tile using renderItem to get actual size and margins/gaps\r\n const sampleData = this.items[0] || { value: 'sample' };\r\n const sample = this.renderItem(sampleData);\r\n sample.style.position = 'absolute';\r\n sample.style.visibility = 'hidden';\r\n sample.classList.add('vs-item');\r\n\r\n // Ignore measured size, always use configured estimateItemSize for robust layout\r\n this._itemW = this.estimate.width;\r\n this._itemH = this.estimate.height;\r\n sample.remove();\r\n }\r\n\r\n _computeLayout() {\r\n const width = this.container.clientWidth || 1;\r\n const fullW = this._itemW + this._gapX;\r\n const cols = Math.max(1, Math.floor((width + this._gapX) / fullW));\r\n\r\n this._cols = cols;\r\n }\r\n\r\n _totalRows() {\r\n return Math.ceil(this._filtered.length / this._cols);\r\n }\r\n\r\n _updateInnerHeight() {\r\n const rows = this._totalRows();\r\n const totalH = rows * (this._itemH + this._gapY) - this._gapY; // last row no gap\r\n this._inner.style.height = Math.max(0, totalH).toString() + 'px';\r\n const scrollBarWidth = this._inner.parentElement.offsetWidth - this._inner.parentElement.clientWidth\r\n this._inner.parentElement.style.width = Math.max(this._cols * (this._itemW + this._gapX) - this._gapX + scrollBarWidth) + 'px';\r\n }\r\n\r\n _onResize() {\r\n const prevCols = this._cols;\r\n this._computeLayout();\r\n if (this._cols !== prevCols) {\r\n this._updateInnerHeight();\r\n this._lastRange.start = -1; // force repaint on layout change\r\n this._renderWindow();\r\n } else {\r\n // Height may still change if container height changed\r\n this._renderWindow();\r\n }\r\n }\r\n\r\n _onScroll() {\r\n this._renderWindow();\r\n }\r\n\r\n _renderWindow() {\r\n if (!this._filtered.length) {\r\n this._inner.replaceChildren();\r\n this._lastRange = { start: -1, end: -1 };\r\n return;\r\n }\r\n\r\n const viewTop = this.container.scrollTop;\r\n const viewH = this.container.clientHeight;\r\n const rowH = this._itemH + this._gapY;\r\n\r\n const firstRow = Math.max(0, Math.floor(viewTop / rowH) - this.bufferRows);\r\n const lastRow = Math.floor((viewTop + viewH) / rowH) + this.bufferRows;\r\n\r\n const start = firstRow * this._cols;\r\n const endExclusive = Math.min(this._filtered.length, (lastRow + 1) * this._cols);\r\n\r\n if (start === this._lastRange.start && endExclusive === this._lastRange.end) return;\r\n this._lastRange = { start, end: endExclusive };\r\n\r\n const frag = document.createDocumentFragment();\r\n\r\n for (let i = start; i < endExclusive; i++) {\r\n const data = this._filtered[i];\r\n if (!data) continue;\r\n const row = Math.floor(i / this._cols);\r\n const col = i % this._cols;\r\n const x = col * (this._itemW + this._gapX);\r\n const y = row * (this._itemH + this._gapY);\r\n\r\n const el = this.renderItem(data);\r\n el.classList.add('vs-item');\r\n el.style.transform = `translate(${x}px, ${y}px)`;\r\n el.style.width = this._itemW + 'px';\r\n el.style.height = this._itemH + 'px';\r\n \r\n frag.appendChild(el);\r\n }\r\n\r\n this._inner.replaceChildren(frag);\r\n }\r\n}\r\n","import {stringToHTML} from \"./utlis/utils\";\r\n\r\nexport default options => {\r\n const {theme, i18n, closeOnSelect} = options;\r\n\r\n const modalElement = getHTMLElements(`\r\n <div class=\"icon-picker-modal\" tabindex=\"-1\" data-theme=\"${theme}\" data-element=\"modal\" aria-modal=\"true\" aria-labelledby=\"Icon picker modal\" role=\"dialog\">\r\n <div class=\"icon-picker-modal__dialog\">\r\n <div class=\"icon-picker-modal__header\" data-element=\"header\">\r\n ${typeof i18n['text:title'] === 'string' && i18n['text:title'] !== '' ? `<h2>${i18n['text:title']}</h2>` : ''}\r\n \r\n <button class=\"icon-picker-modal--close\" aria-label=\"Close\" data-interaction=\"close\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke-width=\"1.5\">\r\n <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6.758 17.243 12.001 12m5.243-5.243L12 12m0 0L6.758 6.757M12.001 12l5.243 5.243\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n \r\n <input placeholder=\"${i18n['input:placeholder']}\" class=\"icon-picker-modal__search\" aria-label=\"${i18n['input:placeholder']}\" data-interaction=\"search\">\r\n \r\n <div class=\"icon-picker-modal__content\" data-element=\"content\"></div>\r\n \r\n ${!closeOnSelect ? `\r\n <div class=\"icon-picker-modal__footer\" data-element=\"footer\">\r\n <button type=\"button\" class=\"picker-save\" data-interaction=\"save\">${i18n['btn:save']}</button>\r\n </div>` : ''\r\n }\r\n </div>\r\n </div>\r\n `);\r\n\r\n if (theme.includes('bootstrap')) {\r\n modalElement.save?.classList.add('btn', 'btn-primary');\r\n modalElement.search.classList.add('form-control');\r\n }\r\n\r\n return modalElement;\r\n}\r\n\r\n\r\nfunction getHTMLElements(str) {\r\n const removeAttribute = (el, name) => {\r\n const value = el.getAttribute(name);\r\n el.removeAttribute(name);\r\n return value;\r\n };\r\n\r\n const resolve = (element, base = {}) => {\r\n const elementKey = removeAttribute(element, 'data-element');\r\n elementKey && (base[elementKey] = element);\r\n\r\n for (const child of Array.from(element.children)) {\r\n const childInteractionKey = removeAttribute(child, 'data-interaction');\r\n\r\n if (childInteractionKey) {\r\n childInteractionKey && (base[childInteractionKey] = child);\r\n }\r\n\r\n resolve(child, base);\r\n }\r\n\r\n return base;\r\n };\r\n\r\n return resolve(stringToHTML(str));\r\n}\r\n","const iconifyPath = 'https://raw.githubusercontent.com/iconify/icon-sets/master/json';\r\n\r\nexport const collections = {\r\n 'Material Design Icons': {\r\n key: 'mdi',\r\n prefix: 'mdi mdi-',\r\n url: `${iconifyPath}/mdi.json`\r\n },\r\n 'FontAwesome Brands 6': {\r\n key: 'fa6-brands',\r\n prefix: 'fab fa-',\r\n url: `${iconifyPath}/fa6-brands.json`\r\n },\r\n 'FontAwesome Solid 6': {\r\n key: 'fa6-solid',\r\n prefix: 'fas fa-',\r\n url: `${iconifyPath}/fa6-solid.json`\r\n\r\n },\r\n 'FontAwesome Regular 6': {\r\n key: 'fa6-regular',\r\n prefix: 'far fa-',\r\n url: `${iconifyPath}/fa6-regular.json`\r\n },\r\n 'Iconoir': {\r\n key: 'iconoir',\r\n prefix: 'iconoir-',\r\n url: `${iconifyPath}/iconoir.json`\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param {array} collectionsOptions\r\n */\r\nexport function resolveCollection(collectionsOptions) {\r\n let collectionResolved = Object.create({});\r\n\r\n if (Array.isArray(collectionsOptions)) {\r\n collectionsOptions.forEach((collection) => {\r\n if (hasCollection(collection)) {\r\n collectionResolved[collections[collection].key] = collections[collection]\r\n } else if (collection.key) {\r\n collectionResolved[collection.key] = collection\r\n }\r\n })\r\n }\r\n\r\n return collectionResolved;\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} collection\r\n * @returns {boolean}\r\n */\r\nfunction hasCollection(collection) {\r\n return collections.hasOwnProperty(collection)\r\n}\r\n","import * as _ from \"./utlis/utils\";\r\nimport VirtualIconGrid from \"./utlis/virtualIconGrid\";\r\nimport template from \"./template\";\r\nimport { resolveCollection } from \"./utlis/collections\";\r\n\r\nexport default class IconPicker {\r\n virtualIconGrid = null;\r\n availableIcons = [];\r\n static DEFAULT_OPTIONS = {\r\n theme: 'default',\r\n closeOnSelect: true,\r\n defaultValue: null,\r\n iconSource: [],\r\n i18n: {\r\n 'input:placeholder': 'Search icon…',\r\n\r\n 'text:title': 'Select icon',\r\n 'text:empty': 'No results found…',\r\n 'text:loading' : 'Loading…',\r\n\r\n 'btn:save': 'Save'\r\n },\r\n itemSize: 50, // px\r\n iconSize: 32, // px\r\n }\r\n\r\n _eventListener = {\r\n select: [],\r\n save: [],\r\n show: [],\r\n clear: [],\r\n hide: [],\r\n loaded: []\r\n };\r\n\r\n /**\r\n *\r\n * @param {string | HTMLElement} el\r\n * @param {Object} options\r\n */\r\n constructor(el, options = {}) {\r\n this.options = _.mergeDeep(IconPicker.DEFAULT_OPTIONS, options);\r\n this.element = el;\r\n this.iconsLoading = true;\r\n\r\n // Initialize icon picker\r\n this._preBuild();\r\n\r\n if (this.element && this.options.iconSource.length > 0) {\r\n this._binEvents();\r\n this._renderdIcons();\r\n this._createModal();\r\n } else {\r\n this._catchError('iconSourceMissing');\r\n }\r\n\r\n }\r\n\r\n _preBuild() {\r\n this.element = _.resolveElement(this.element);\r\n this.root = template(this.options);\r\n\r\n if (!Array.isArray(this.options.iconSource) && this.options.iconSource.length > 0) {\r\n this.options.iconSource = [this.options.iconSource];\r\n }\r\n // Prepare (lazy) virtual grid; mount after modal becomes visible to get correct widths\r\n this.virtualIconGrid = this.virtualIconGrid || new VirtualIconGrid({\r\n container: this.root.content,\r\n items: this.availableIcons ?? [],\r\n renderItem: (icon) => this.renderItem(icon),\r\n i18nEmpty: this.options.i18n['text:empty'],\r\n estimateItemSize: { width: this.options.itemSize, height: this.options.itemSize }, // tweak to your tile size\r\n bufferRows: 4\r\n });\r\n }\r\n\r\n renderItem(icon) {\r\n // Customize how each icon renders\r\n const btn = document.createElement('button');\r\n btn.type = 'button';\r\n btn.className = `icon-element ${icon.value}`; \r\n btn.title = icon.value;\r\n btn.setAttribute('aria-label', icon.value);\r\n btn.dataset.value = icon.inputValue\r\n btn.innerHTML = icon.body;\r\n btn.addEventListener('click', (evt) => icon.onSelect && icon.onSelect(evt));\r\n \r\n return btn;\r\n }\r\n\r\n\r\n ensureVirtualMounted = () => {\r\n // If modal just opened, wait a frame so it has layout/width\r\n requestAnimationFrame(() => {\r\n if (!this.virtualIconGrid._mounted) {\r\n this.virtualIconGrid.mount();\r\n } else {\r\n // Recompute columns/height if container size changed while hidden\r\n this.virtualIconGrid._onResize && this.virtualIconGrid._onResize();\r\n }\r\n // Apply whatever is currently in the search box\r\n const q = (this.root.search?.value || '').trim().toLowerCase();\r\n this.virtualIconGrid.setQuery(q);\r\n this.virtualIconGrid.setItems(this.availableIcons);\r\n });\r\n };\r\n\r\n\r\n _binEvents() {\r\n const {options, root, element, virtualIconGrid} = this;\r\n\r\n const onSearch = _.debounce((evt) => {\r\n const q = (evt.target.value || '').trim().toLowerCase();\r\n if (virtualIconGrid) virtualIconGrid.setQuery(q);\r\n }, 120);\r\n\r\n this._eventBindings = [\r\n _.addEvent(element, 'click', () => { \r\n this.show(); \r\n this.ensureVirtualMounted(); \r\n }),\r\n _.addEvent(root.close, 'click', () => this.hide()),\r\n _.addEvent(root.modal, 'click', (evt) => {\r\n if (evt.target === root.modal) {\r\n this.hide();\r\n }\r\n }),\r\n _.addEvent(root.search, 'keyup', _.debounce(onSearch, 250))\r\n ];\r\n\r\n if (!options.closeOnSelect) {\r\n this._eventBindings.push(_.addEvent(root.save, 'click', () => this._onSave()));\r\n }\r\n }\r\n\r\n /**\r\n * Hide icon picker modal\r\n */\r\n hide() {\r\n if (this.isOpen()) {\r\n this.root.modal.classList.remove('is-visible');\r\n this._emit('hide');\r\n\r\n return this;\r\n }\r\n\r\n return false\r\n }\r\n\r\n /**\r\n * Show icon picker modal\r\n */\r\n show() {\r\n if (!this.isOpen()) {\r\n this.root.modal.classList.add('is-visible');\r\n this._emit('show');\r\n\r\n return this;\r\n }\r\n\r\n return false\r\n }\r\n\r\n clear() {\r\n if (this.initialized && this.currentlySelectName) {\r\n this.currentlySelectName = null;\r\n\r\n this._emit('clear');\r\n }\r\n }\r\n\r\n /**\r\n * Check if modal is open\r\n * @returns {boolean}\r\n */\r\n isOpen() {\r\n return this.root.modal.classList.contains('is-visible');\r\n }\r\n\r\n /**\r\n * Check if the icons are loaded\r\n * @returns {boolean}\r\n */\r\n iconsLoaded(){\r\n return !this.loadingState;\r\n }\r\n\r\n /**\r\n * Destroy icon picker instance and detach all events listeners\r\n * @param {boolean} deleteInstance\r\n */\r\n destroy(deleteInstance = true) {\r\n this.initialized = false;\r\n\r\n // Remove elements events\r\n this._eventBindings.forEach(args => _.removeEvent(...args));\r\n\r\n // Delete instance\r\n if (deleteInstance) {\r\n Object.keys(this).forEach((key) => delete this[key]);\r\n }\r\n }\r\n\r\n _emit(event, ...args) {\r\n this._eventListener[event].forEach(cb => cb(...args, this));\r\n }\r\n\r\n on(event, callback) {\r\n if (this._eventListener[event] !== undefined) {\r\n this._eventListener[event].push(callback);\r\n return this;\r\n }\r\n\r\n return false\r\n }\r\n\r\n off(event, callback) {\r\n const callBacks = (this._eventListener[event] || []);\r\n const index = callBacks.indexOf(callback);\r\n\r\n if (~index) {\r\n callBacks.splice(index, 1);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _createModal() {\r\n document.body.appendChild(this.root.modal);\r\n\r\n this.initialized = true;\r\n }\r\n\r\n _onSave() {\r\n this._setValueInput()\r\n\r\n this.hide();\r\n this._emit('save', this.emitValues);\r\n }\r\n\r\n /**\r\n * Generate icons elements\r\n * @private\r\n */\r\n async _renderdIcons() {\r\n const {root, options} = this;\r\n let previousSelectedIcon = null;\r\n let currentlySelectElement = null;\r\n let categories = null;\r\n this.availableIcons = [];\r\n\r\n root.content.innerHTML = `<div class=\"is-loading\">${options.i18n['text:loading']}</div>`;\r\n\r\n let icons = await this._getIcons();\r\n\r\n icons.forEach((library) => {\r\n let iconFormat = library.iconFormat ? library.iconFormat : 'svg';\r\n\r\n for (const [key, value] of Object.entries(library.icons)) {\r\n const iconTarget = document.createElement('button');\r\n iconTarget.title = key\r\n iconTarget.className = `icon-element ${key}`;\r\n iconTarget.dataset.value = library.prefix + key;\r\n\r\n if (library.categories && Object.entries(library.categories).length > 0) {\r\n categories = [];\r\n\r\n for (const [categoryKey] of Object.entries(library.categories)) {\r\n if (library.categories[categoryKey].includes(key)) {\r\n if (categories.length > 0) {\r\n categories.push(categoryKey.toLowerCase())\r\n } else {\r\n categories = [categoryKey.toLowerCase()]\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (library.chars) {\r\n iconTarget.dataset.unicode = _.getKeyByValue(library.chars, key);\r\n }\r\n\r\n let iconElement;\r\n if (iconFormat === 'i' || !value.body) {\r\n iconElement = document.createElement('i');\r\n iconElement.setAttribute('class', iconTarget.dataset.value);\r\n } else if (iconFormat === 'markup') {\r\n let t = document.createElement('template');\r\n t.innerHTML = value.body;\r\n iconElement = t.content;\r\n } else {\r\n iconElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n iconElement.setAttribute('height', (this.options.iconSize).toString());\r\n iconElement.setAttribute('width', (this.options.iconSize).toString());\r\n iconElement.setAttribute('viewBox', `0 0 ${value.width ? value.width : library.width} ${value.height ? value.height : library.height}`);\r\n iconElement.innerHTML = value.body;\r\n }\r\n\r\n this.availableIcons.push({inputValue: library.prefix + key, value: key, body: iconElement.outerHTML, ...(categories?.length > 0 && {categories}), onSelect: (evt) => {\r\n if (this.currentlySelectName !== evt.currentTarget.firstChild.className) {\r\n evt.currentTarget.classList.add('is-selected');\r\n\r\n currentlySelectElement = evt.currentTarget;\r\n this.currentlySelectName = currentlySelectElement.dataset.value;\r\n this.SVGString = iconElement.outerHTML;\r\n\r\n this.emitValues = {\r\n name: key,\r\n value: this.currentlySelectName,\r\n svg: this.SVGString,\r\n }\r\n\r\n if (library.chars) {\r\n this.emitValues.unicode = iconElement.dataset.unicode\r\n }\r\n\r\n this._emit('select', this.emitValues);\r\n }\r\n\r\n if (previousSelectedIcon) {\r\n previousSelectedIcon.classList.remove('is-selected');\r\n }\r\n\r\n if (options.closeOnSelect) {\r\n this._onSave();\r\n }\r\n\r\n previousSelectedIcon = currentlySelectElement;\r\n }});\r\n }\r\n });\r\n\r\n if (options.defaultValue || this.element.value) {\r\n // Check if icon name ou icon value is set\r\n let defaultValueElement = document.querySelector(`[data-value=\"${options.defaultValue ? options.defaultValue : this.element.value}\"]`) ?\r\n document.querySelector(`[data-value=\"${options.defaultValue ? options.defaultValue : this.element.value}\"]`) :\r\n document.querySelector(`.${options.defaultValue ? options.defaultValue : this.element.value}`);\r\n\r\n let iconValue = defaultValueElement?.dataset.value ?? '';\r\n defaultValueElement?.classList.add('is-selected');\r\n\r\n previousSelectedIcon = defaultValueElement;\r\n this.currentlySelectName = iconValue;\r\n\r\n if (!this.element.value) {\r\n this._setValueInput();\r\n }\r\n }\r\n this.ensureVirtualMounted(); \r\n\r\n const loadingElement = root.content.querySelector('.is-loading');\r\n if (loadingElement) {\r\n loadingElement.remove();\r\n }\r\n\r\n this.iconsLoading = false;\r\n this._emit('loaded');\r\n }\r\n\r\n /**\r\n *\r\n * @returns {string}\r\n * @private\r\n */\r\n async _getIcons() {\r\n const {options} = this\r\n const iconsURL = [];\r\n\r\n let sourceInformation = resolveCollection(options.iconSource);\r\n\r\n for (const source of Object.values(sourceInformation)) {\r\n iconsURL.push(source.url)\r\n }\r\n\r\n return await Promise.all(iconsURL.map((iconURL) => fetch(iconURL).then((response) => response.json())))\r\n .then((iconLibrary) => {\r\n iconLibrary.forEach((library) => {\r\n if (sourceInformation.hasOwnProperty(library.prefix)) {\r\n library.prefix = sourceInformation[library.prefix].prefix\r\n }\r\n });\r\n\r\n return iconLibrary;\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * @param {string} exception\r\n * @private\r\n */\r\n _catchError(exception) {\r\n switch (exception) {\r\n case 'iconSourceMissing':\r\n throw Error('No icon source was found.');\r\n }\r\n }\r\n\r\n /**\r\n * Set value into input element\r\n * @param value\r\n * @private\r\n */\r\n _setValueInput(value = this.currentlySelectName) {\r\n const {element} = this;\r\n\r\n if (element instanceof HTMLInputElement && this.currentlySelectName) {\r\n element.value = value;\r\n }\r\n }\r\n}\r\n"],"names":["root","factory","exports","module","define","amd","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","eventListener","method","elements","events","fn","Array","isArray","el","ev","slice","arguments","addEvent","bind","removeEvent","isObject","item","mergeDeep","target","source","output","assign","keys","forEach","debounce","callback","delay","timer","args","context","this","clearTimeout","setTimeout","apply","getKeyByValue","object","value","find","VirtualIconGrid","constructor","container","items","renderItem","i18nEmpty","estimateItemSize","width","height","gaps","x","y","bufferRows","Error","estimate","Math","max","_query","_indexed","_filtered","_cols","_itemW","_itemH","_gapX","_gapY","_mounted","_onScroll","_onResize","_inner","document","createElement","className","_emptyEl","textContent","_lastRange","start","end","_resizeObs","_buildIndex","mount","firstChild","removeChild","classList","add","appendChild","_measureItem","_computeLayout","_updateInnerHeight","_renderWindow","_toggleEmptyMessage","addEventListener","passive","window","ResizeObserver","observe","destroy","removeEventListener","disconnect","replaceChildren","parentNode","remove","setItems","nextItems","_applyFilter","setQuery","q","next","toLowerCase","map","it","text","categories","join","ref","filter","row","includes","length","sampleData","sample","style","position","visibility","clientWidth","fullW","cols","floor","_totalRows","ceil","totalH","toString","scrollBarWidth","parentElement","offsetWidth","prevCols","viewTop","scrollTop","viewH","clientHeight","rowH","firstRow","lastRow","endExclusive","min","frag","createDocumentFragment","i","data","transform","options","theme","i18n","closeOnSelect","modalElement","str","removeAttribute","name","getAttribute","resolve","element","base","elementKey","child","from","children","childInteractionKey","DOMParser","parseFromString","body","firstElementChild","dom","innerHTML","stringToHTML","getHTMLElements","save","search","iconifyPath","collections","prefix","url","resolveCollection","collectionsOptions","collectionResolved","create","collection","hasCollection","IconPicker","virtualIconGrid","availableIcons","static","defaultValue","iconSource","itemSize","iconSize","_eventListener","select","show","clear","hide","loaded","DEFAULT_OPTIONS","iconsLoading","_preBuild","_binEvents","_renderdIcons","_createModal","_catchError","val","HTMLElement","querySelector","template","content","icon","btn","type","title","setAttribute","dataset","inputValue","evt","onSelect","ensureVirtualMounted","requestAnimationFrame","trim","onSearch","_eventBindings","close","modal","push","_onSave","isOpen","_emit","initialized","currentlySelectName","contains","iconsLoaded","loadingState","deleteInstance","event","cb","on","undefined","off","callBacks","index","indexOf","splice","_setValueInput","emitValues","previousSelectedIcon","currentlySelectElement","_getIcons","library","iconFormat","ent