vanilla-icon-picker
Version:
Icon picker - Vanilla JS icon picker
1 lines • 32.1 kB
Source Map (JSON)
{"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/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) {\n if (!Array.isArray(elements)) {\n elements = [elements];\n }\n\n if (!Array.isArray(events)) {\n events = [events];\n }\n\n for (const el of elements) {\n for (const ev of events) {\n el[method](ev, fn);\n }\n }\n\n return [].slice.call(arguments, 1);\n}\n\n/**\n * Add event to element.\n * @param elements DOM-Elements\n * @param events Event names\n * @param fn Callback\n * @param options Optional options\n * @return Array passed arguments\n */\nexport const addEvent = eventListener.bind(null, 'addEventListener');\n\n/**\n * Remove event from element.\n * @param elements DOM-Elements\n * @param events Event names\n * @param fn Callback\n * @param options Optional options\n * @return Array passed arguments\n */\nexport const removeEvent = eventListener.bind(null, 'removeEventListener');\n\n/**\n * Resolves a HTMLElement by query.\n * @param val\n * @returns {null|Document|Element}\n */\nexport function resolveElement(val) {\n if (val instanceof HTMLElement) {\n return val;\n } else if (typeof val === 'string') {\n return document.querySelector(val)\n }\n\n return null;\n}\n\n/**\n * Convert a template string into HTML DOM nodes\n * @param {String} str The template string\n * @return {Node} The template HTML\n */\nexport function stringToHTML(str) {\n if (window.DOMParser) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(str, 'text/html');\n return doc.body.firstElementChild;\n }\n\n const dom = document.createElement('div');\n dom.innerHTML = str;\n return dom.firstElementChild;\n}\n\n/**\n * Check if item is an object\n * @param {Object} item\n * @returns {boolean}\n */\nexport function isObject(item) {\n return (item && typeof item === 'object' && !Array.isArray(item));\n}\n\n/**\n *\n * @param target\n * @param source\n * @returns {Object}\n */\nexport function mergeDeep(target, source) {\n let output = Object.assign({}, target);\n\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach(key => {\n if (isObject(source[key])) {\n if (!(key in target))\n Object.assign(output, {[key]: source[key]});\n else\n output[key] = mergeDeep(target[key], source[key]);\n } else {\n Object.assign(output, {[key]: source[key]});\n }\n });\n }\n return output;\n}\n\n/**\n *\n * @param callback\n * @param delay\n * @returns {(function(): void)|*}\n */\nexport function debounce(callback, delay){\n var timer;\n return function(){\n var args = arguments;\n var context = this;\n clearTimeout(timer);\n timer = setTimeout(function(){\n callback.apply(context, args);\n }, delay)\n }\n}\n\n/**\n *\n * @param object\n * @param value\n * @returns {string}\n */\nexport function getKeyByValue(object, value) {\n return Object.keys(object).find(key => object[key] === value);\n}\n","import {stringToHTML} from \"./utlis/utils\";\n\nexport default options => {\n const {theme, i18n, closeOnSelect} = options;\n\n const modalElement = getHTMLElements(`\n <div class=\"icon-picker-modal\" tabindex=\"-1\" data-theme=\"${theme}\" data-element=\"modal\" aria-modal=\"true\" aria-labelledby=\"Icon picker modal\" role=\"dialog\">\n <div class=\"icon-picker-modal__dialog\">\n <div class=\"icon-picker-modal__header\" data-element=\"header\">\n ${typeof i18n['text:title'] === 'string' && i18n['text:title'] !== '' ? `<h2>${i18n['text:title']}</h2>` : ''}\n \n <button class=\"icon-picker-modal--close\" aria-label=\"Close\" data-interaction=\"close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke-width=\"1.5\">\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\"/>\n </svg>\n </button>\n </div>\n \n <input placeholder=\"${i18n['input:placeholder']}\" class=\"icon-picker-modal__search\" aria-label=\"${i18n['input:placeholder']}\" data-interaction=\"search\">\n \n <div class=\"icon-picker-modal__content\" data-element=\"content\"></div>\n \n ${!closeOnSelect ? `\n <div class=\"icon-picker-modal__footer\" data-element=\"footer\">\n <button type=\"button\" class=\"picker-save\" data-interaction=\"save\">${i18n['btn:save']}</button>\n </div>` : ''\n }\n </div>\n </div>\n `);\n\n if (theme.includes('bootstrap')) {\n modalElement.save?.classList.add('btn', 'btn-primary');\n modalElement.search.classList.add('form-control');\n }\n\n return modalElement;\n}\n\n\nfunction getHTMLElements(str) {\n const removeAttribute = (el, name) => {\n const value = el.getAttribute(name);\n el.removeAttribute(name);\n return value;\n };\n\n const resolve = (element, base = {}) => {\n const elementKey = removeAttribute(element, 'data-element');\n elementKey && (base[elementKey] = element);\n\n for (const child of Array.from(element.children)) {\n const childInteractionKey = removeAttribute(child, 'data-interaction');\n\n if (childInteractionKey) {\n childInteractionKey && (base[childInteractionKey] = child);\n }\n\n resolve(child, base);\n }\n\n return base;\n };\n\n return resolve(stringToHTML(str));\n}\n","const iconifyPath = 'https://raw.githubusercontent.com/iconify/icon-sets/master/json';\n\nexport const collections = {\n 'Material Design Icons': {\n key: 'mdi',\n prefix: 'mdi mdi-',\n url: `${iconifyPath}/mdi.json`\n },\n 'FontAwesome Brands 6': {\n key: 'fa6-brands',\n prefix: 'fab fa-',\n url: `${iconifyPath}/fa6-brands.json`\n },\n 'FontAwesome Solid 6': {\n key: 'fa6-solid',\n prefix: 'fas fa-',\n url: `${iconifyPath}/fa6-solid.json`\n\n },\n 'FontAwesome Regular 6': {\n key: 'fa6-regular',\n prefix: 'far fa-',\n url: `${iconifyPath}/fa6-regular.json`\n },\n 'FontAwesome Brands 7': {\n key: 'fa7-brands',\n prefix: 'fab fa-',\n url: `${iconifyPath}/fa7-brands.json`\n },\n 'FontAwesome Solid 7': {\n key: 'fa7-solid',\n prefix: 'fas fa-',\n url: `${iconifyPath}/fa7-solid.json`\n\n },\n 'FontAwesome Regular 7': {\n key: 'fa7-regular',\n prefix: 'far fa-',\n url: `${iconifyPath}/fa7-regular.json`\n },\n 'Iconoir': {\n key: 'iconoir',\n prefix: 'iconoir-',\n url: `${iconifyPath}/iconoir.json`\n }\n}\n\n/**\n *\n * @param {array} collectionsOptions\n */\nexport function resolveCollection(collectionsOptions) {\n let collectionResolved = Object.create({});\n\n if (Array.isArray(collectionsOptions)) {\n collectionsOptions.forEach((collection) => {\n if (hasCollection(collection)) {\n collectionResolved[collections[collection].key] = collections[collection]\n } else if (collection.key) {\n collectionResolved[collection.key] = collection\n }\n })\n }\n\n return collectionResolved;\n}\n\n/**\n *\n * @param {string} collection\n * @returns {boolean}\n */\nfunction hasCollection(collection) {\n return collections.hasOwnProperty(collection)\n}\n","import * as _ from \"./utlis/utils\";\nimport template from \"./template\";\nimport { resolveCollection } from \"./utlis/collections\";\n\nexport default class IconPicker {\n static DEFAULT_OPTIONS = {\n theme: 'default',\n closeOnSelect: true,\n defaultValue: null,\n iconSource: [],\n i18n: {\n 'input:placeholder': 'Search icon…',\n\n 'text:title': 'Select icon',\n 'text:empty': 'No results found…',\n 'text:loading' : 'Loading…',\n\n 'btn:save': 'Save'\n }\n }\n\n _eventListener = {\n select: [],\n save: [],\n show: [],\n clear: [],\n hide: [],\n loaded: []\n };\n\n /**\n *\n * @param {string | HTMLElement} el\n * @param {Object} options\n */\n constructor(el, options = {}) {\n this.options = _.mergeDeep(IconPicker.DEFAULT_OPTIONS, options);\n this.element = el;\n this.iconsLoading = true;\n\n // Initialize icon picker\n this._preBuild();\n\n if (this.element && this.options.iconSource.length > 0) {\n this._binEvents();\n this._renderdIcons();\n this._createModal();\n } else {\n this._catchError('iconSourceMissing');\n }\n }\n\n _preBuild() {\n this.element = _.resolveElement(this.element);\n this.root = template(this.options);\n\n if (!Array.isArray(this.options.iconSource) && this.options.iconSource.length > 0) {\n this.options.iconSource = [this.options.iconSource];\n }\n }\n\n _binEvents() {\n const {options, root, element} = this;\n let iconsElements = [];\n\n this._eventBindings = [\n _.addEvent(element, 'click', () => this.show()),\n _.addEvent(root.close, 'click', () => this.hide()),\n _.addEvent(root.modal, 'click', (evt) => {\n if (evt.target === root.modal) {\n this.hide();\n }\n }),\n _.addEvent(root.search, 'keyup', _.debounce((evt) => {\n const iconsResult = this.availableIcons.filter((obj) => {\n return obj.value.includes(evt.target.value.toLowerCase()) || obj.categories?.filter(c => c.includes(evt.target.value.toLowerCase())).length > 0\n });\n\n if (!iconsElements.length) {\n iconsElements = document.querySelectorAll('.icon-element');\n }\n\n iconsElements.forEach((iconElement) => {\n iconElement.hidden = true;\n\n iconsResult.forEach((result) => {\n if (iconElement.classList.contains(result.value)) {\n iconElement.hidden = false;\n }\n });\n });\n\n const emptyElement = root.content.querySelector('.is-empty');\n\n if (iconsResult.length > 0) {\n if (emptyElement) {\n emptyElement.remove();\n }\n } else {\n if (!emptyElement) {\n root.content.appendChild(_.stringToHTML(`<div class=\"is-empty\">${options.i18n['text:empty']}</div>`));\n }\n }\n }, 250))\n ];\n\n if (!options.closeOnSelect) {\n this._eventBindings.push(_.addEvent(root.save, 'click', () => this._onSave()));\n }\n }\n\n /**\n * Hide icon picker modal\n */\n hide() {\n if (this.isOpen()) {\n this.root.modal.classList.remove('is-visible');\n this._emit('hide');\n\n return this;\n }\n\n return false\n }\n\n /**\n * Show icon picker modal\n */\n show() {\n if (!this.isOpen()) {\n this.root.modal.classList.add('is-visible');\n this._emit('show');\n\n return this;\n }\n\n return false\n }\n\n clear() {\n if (this.initialized && this.currentlySelectName) {\n this.currentlySelectName = null;\n\n this._emit('clear');\n }\n }\n\n /**\n * Check if modal is open\n * @returns {boolean}\n */\n isOpen() {\n return this.root.modal.classList.contains('is-visible');\n }\n\n /**\n * Check if the icons are loaded\n * @returns {boolean}\n */\n iconsLoaded(){\n return !this.loadingState;\n }\n\n /**\n * Destroy icon picker instance and detach all events listeners\n * @param {boolean} deleteInstance\n */\n destroy(deleteInstance = true) {\n this.initialized = false;\n\n // Remove elements events\n this._eventBindings.forEach(args => _.removeEvent(...args));\n\n // Delete instance\n if (deleteInstance) {\n Object.keys(this).forEach((key) => delete this[key]);\n }\n }\n\n _emit(event, ...args) {\n this._eventListener[event].forEach(cb => cb(...args, this));\n }\n\n on(event, callback) {\n if (this._eventListener[event] !== undefined) {\n this._eventListener[event].push(callback);\n return this;\n }\n\n return false\n }\n\n off(event, callback) {\n const callBacks = (this._eventListener[event] || []);\n const index = callBacks.indexOf(callback);\n\n if (~index) {\n callBacks.splice(index, 1);\n }\n\n return this;\n }\n\n _createModal() {\n document.body.appendChild(this.root.modal);\n\n this.initialized = true;\n }\n\n _onSave() {\n this._setValueInput()\n\n this.hide();\n this._emit('save', this.emitValues);\n }\n\n /**\n * Generate icons elements\n * @private\n */\n async _renderdIcons() {\n const {root, options} = this;\n let previousSelectedIcon = null;\n let currentlySelectElement = null;\n let categories = null;\n this.availableIcons = [];\n\n root.content.innerHTML = `<div class=\"is-loading\">${options.i18n['text:loading']}</div>`;\n\n let icons = await this._getIcons();\n\n icons.forEach((library) => {\n let iconFormat = library.iconFormat ? library.iconFormat : 'svg';\n\n for (const [key, value] of Object.entries(library.icons)) {\n const iconTarget = document.createElement('button');\n iconTarget.title = key\n iconTarget.className = `icon-element ${key}`;\n iconTarget.dataset.value = library.prefix + key;\n\n if (library.categories && Object.entries(library.categories).length > 0) {\n categories = [];\n\n for (const [categoryKey] of Object.entries(library.categories)) {\n if (library.categories[categoryKey].includes(key)) {\n if (categories.length > 0) {\n categories.push(categoryKey.toLowerCase())\n } else {\n categories = [categoryKey.toLowerCase()]\n }\n }\n }\n }\n\n if (library.chars) {\n iconTarget.dataset.unicode = _.getKeyByValue(library.chars, key);\n }\n\n let iconElement;\n if (iconFormat === 'i' || !value.body) {\n iconElement = document.createElement('i');\n iconElement.setAttribute('class', iconTarget.dataset.value);\n } else if (iconFormat === 'markup') {\n let t = document.createElement('template');\n t.innerHTML = value.body;\n iconElement = t.content;\n } else {\n iconElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n iconElement.setAttribute('height', '24');\n iconElement.setAttribute('width', '24');\n iconElement.setAttribute('viewBox', `0 0 ${value.width ? value.width : library.width} ${value.height ? value.height : library.height}`);\n iconElement.innerHTML = value.body;\n }\n\n iconTarget.append(iconElement)\n\n root.content.appendChild(iconTarget);\n\n this.availableIcons.push({value: key, body: iconElement.outerHTML, ...(categories?.length > 0 && {categories})});\n\n // Icon click event\n iconTarget.addEventListener('click', (evt) => {\n if (this.currentlySelectName !== evt.currentTarget.firstChild.className) {\n evt.currentTarget.classList.add('is-selected');\n\n currentlySelectElement = evt.currentTarget;\n this.currentlySelectName = currentlySelectElement.dataset.value;\n this.SVGString = iconElement.outerHTML;\n\n this.emitValues = {\n name: key,\n value: this.currentlySelectName,\n svg: this.SVGString,\n }\n\n if (library.chars) {\n this.emitValues.unicode = iconElement.dataset.unicode\n }\n\n this._emit('select', this.emitValues);\n }\n\n if (previousSelectedIcon) {\n previousSelectedIcon.classList.remove('is-selected');\n }\n\n if (options.closeOnSelect) {\n this._onSave();\n }\n\n previousSelectedIcon = currentlySelectElement;\n });\n }\n });\n\n if (options.defaultValue || this.element.value) {\n // Check if icon name ou icon value is set\n let defaultValueElement = document.querySelector(`[data-value=\"${options.defaultValue ? options.defaultValue : this.element.value}\"]`) ?\n document.querySelector(`[data-value=\"${options.defaultValue ? options.defaultValue : this.element.value}\"]`) :\n document.querySelector(`.${options.defaultValue ? options.defaultValue : this.element.value}`);\n\n let iconValue = defaultValueElement?.dataset.value ?? '';\n defaultValueElement?.classList.add('is-selected');\n\n previousSelectedIcon = defaultValueElement;\n this.currentlySelectName = iconValue;\n\n if (!this.element.value) {\n this._setValueInput();\n }\n }\n\n const loadingElement = root.content.querySelector('.is-loading');\n if (loadingElement) {\n loadingElement.remove();\n }\n\n this.iconsLoading = false;\n this._emit('loaded');\n }\n\n /**\n *\n * @returns {string}\n * @private\n */\n async _getIcons() {\n const {options} = this\n const iconsURL = [];\n\n let sourceInformation = resolveCollection(options.iconSource);\n\n for (const source of Object.values(sourceInformation)) {\n iconsURL.push(source.url)\n }\n\n return await Promise.all(iconsURL.map((iconURL) => fetch(iconURL).then((response) => response.json())))\n .then((iconLibrary) => {\n iconLibrary.forEach((library) => {\n if (sourceInformation.hasOwnProperty(library.prefix)) {\n library.prefix = sourceInformation[library.prefix].prefix\n }\n });\n\n return iconLibrary;\n });\n }\n\n /**\n *\n * @param {string} exception\n * @private\n */\n _catchError(exception) {\n switch (exception) {\n case 'iconSourceMissing':\n throw Error('No icon source was found.');\n }\n }\n\n /**\n * Set value into input element\n * @param value\n * @private\n */\n _setValueInput(value = this.currentlySelectName) {\n const {element} = this;\n\n if (element instanceof HTMLInputElement && this.currentlySelectName) {\n element.value = value;\n }\n }\n}\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","stringToHTML","str","window","DOMParser","parseFromString","body","firstElementChild","dom","document","createElement","innerHTML","isObject","item","mergeDeep","target","source","output","assign","keys","forEach","getKeyByValue","object","value","find","options","theme","i18n","closeOnSelect","modalElement","removeAttribute","name","getAttribute","resolve","element","base","elementKey","child","from","children","childInteractionKey","getHTMLElements","includes","save","classList","add","search","iconifyPath","collections","prefix","url","resolveCollection","collectionsOptions","collectionResolved","create","collection","hasCollection","IconPicker","static","defaultValue","iconSource","_eventListener","select","show","clear","hide","loaded","constructor","this","DEFAULT_OPTIONS","iconsLoading","_preBuild","length","_binEvents","_renderdIcons","_createModal","_catchError","val","HTMLElement","querySelector","template","iconsElements","callback","delay","timer","_eventBindings","close","modal","evt","iconsResult","availableIcons","filter","toLowerCase","categories","c","querySelectorAll","iconElement","hidden","result","contains","emptyElement","content","remove","appendChild","args","context","clearTimeout","setTimeout","apply","push","_onSave","isOpen","_emit","initialized","currentlySelectName","iconsLoaded","loadingState","destroy","deleteInstance","event","cb","on","undefined","off","callBacks","index","indexOf","splice","_setValueInput","emitValues","async","previousSelectedIcon","currentlySelectElement","_getIcons","library","iconFormat","entries","icons","iconTarget","title","className","dataset","categoryKey","chars","unicode","t","createElementNS","setAttribute","width","height","append","outerHTML","addEventListener","currentTarget","firstChild","SVGString","svg","defaultValueElement","iconValue","loadingElement","iconsURL","sourceInformation","values","Promise","all","map","iconURL","fetch","then","response","json","iconLibrary","exception","Error","HTMLInputElement"],"sourceRoot":""}