-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlast-icon.min.js.map
7 lines (7 loc) · 19.3 KB
/
last-icon.min.js.map
1
2
3
4
5
6
7
{
"version": 3,
"sources": ["last-icon.js"],
"sourcesContent": ["const JSDELIVR = \"https://cdn.jsdelivr.net/\";\r\nconst CACHE = {};\r\n\r\n/**\r\n * @typedef IconSet\r\n * @property {String} alias Short two letters alias\r\n * @property {Function} svgPath The svg path\r\n * @property {Boolean} [fixFill] Does this set needs fixing fill:currentColor ?\r\n * @property {String} [useStroke] Add stroke to svg\r\n * @property {String} [defaultStroke] Default stroke to use (if supports stroke)\r\n * @property {String} [defaultType] Default type to use (when there are multiple types)\r\n * @property {Object.<string, string>} [prefixes] Types to prefixes\r\n * @property {Function} [fontClass] Font class\r\n * @property {Boolean} [opticalFont] Is an optical font?\r\n * @property {String} [name] Full name (injected automatically)\r\n */\r\n\r\n/**\r\n * @typedef Options\r\n * @property {Boolean} debug Should we output messages to console\r\n * @property {Boolean} lazy Load icons lazily\r\n * @property {Object} replaceName Transparently replace icons with other values\r\n * @property {Array} fonts Icon sets using font icons rather than svg\r\n * @property {String} defaultSet Default icon set\r\n * @property {Object.<string, IconSet>} sets Available iconsets\r\n */\r\nconst options = {\r\n debug: false,\r\n lazy: true,\r\n replaceName: {},\r\n fonts: [],\r\n defaultSet: \"tabler\",\r\n defaultStroke: 2,\r\n sets: {\r\n bootstrap: {\r\n alias: \"bs\",\r\n svgPath: () => JSDELIVR + \"npm/bootstrap-icons@1/icons/{icon}.svg\",\r\n },\r\n boxicons: {\r\n alias: \"bx\",\r\n // types: [\"solid\", \"regular\", \"logos\"],\r\n defaultType: \"solid\",\r\n svgPath: () => JSDELIVR + \"npm/boxicons@2/svg/{type}/{prefix}-{icon}.svg\",\r\n fixFill: true,\r\n fontClass: () => \"bx {prefix}-{icon}\",\r\n prefixes: {\r\n solid: \"bxs\",\r\n regular: \"bx\",\r\n logos: \"bxl\",\r\n },\r\n },\r\n bytesize: {\r\n alias: \"by\",\r\n svgPath: () => JSDELIVR + \"npm/bytesize-icons@1/dist/icons/{icon}.svg\",\r\n useStroke: true,\r\n },\r\n cssgg: {\r\n alias: \"gg\",\r\n svgPath: () => JSDELIVR + \"npm/css.gg@2/icons/svg/{icon}.svg\",\r\n },\r\n emojicc: {\r\n alias: \"em\",\r\n svgPath: () => JSDELIVR + \"npm/emoji-cc@1/svg/{icon}.svg\",\r\n },\r\n eos: {\r\n alias: \"eo\",\r\n // types: [\"solid\", \"outlined\", \"animated\"],\r\n defaultType: \"solid\",\r\n svgPath: () => JSDELIVR + \"gh/lekoala/eos-icons-mirror/{type}/{icon}.svg\",\r\n fixFill: true,\r\n },\r\n feather: {\r\n alias: \"ft\",\r\n svgPath: () => JSDELIVR + \"npm/feather-icons@4/dist/icons/{icon}.svg\",\r\n },\r\n flags: {\r\n alias: \"fl\",\r\n // types: [\"4x3\", \"1x1\"],\r\n defaultType: \"4x3\",\r\n svgPath: () => JSDELIVR + \"npm/flag-svg-collection@1/flags/{type}/{icon}.svg\",\r\n },\r\n fontawesome: {\r\n alias: \"fa\",\r\n // types: [\"solid\", \"regular\", \"brands\", \"light\", \"duotone\"],\r\n defaultType: \"solid\",\r\n svgPath: () => JSDELIVR + \"npm/@fortawesome/fontawesome-free@5/svgs/{type}/{icon}.svg\",\r\n fixFill: true,\r\n fontClass: () => \"{prefix} fa-{icon}\",\r\n prefixes: {\r\n solid: \"fas\",\r\n regular: \"far\",\r\n light: \"fal\",\r\n duotone: \"fad\",\r\n brands: \"fab\",\r\n },\r\n },\r\n iconoir: {\r\n alias: \"in\",\r\n svgPath: () => JSDELIVR + \"gh/lucaburgio/iconoir/icons/{icon}.svg\",\r\n fontClass: () => \"iconoir-{icon}\",\r\n useStroke: true,\r\n },\r\n iconpark: {\r\n alias: \"ip\",\r\n types: [], // see full list here https://github.com/bytedance/IconPark/tree/master/source\r\n svgPath: () => JSDELIVR + \"gh/bytedance/IconPark/source/{type}/{icon}.svg\",\r\n useStroke: true,\r\n },\r\n lucide: {\r\n alias: \"lu\",\r\n svgPath: () => JSDELIVR + \"npm/lucide-static/icons/{icon}.svg\",\r\n },\r\n material: {\r\n alias: \"mi\",\r\n // types: [\"filled\", \"outlined\", \"round\", \"sharp\", \"two-tone\"],\r\n defaultType: \"filled\",\r\n svgPath: () => JSDELIVR + \"npm/@material-design-icons/svg/{type}/{icon}.svg\",\r\n fontClass: (type) => {\r\n if (type === \"filled\") {\r\n return \"material-icons\";\r\n }\r\n return \"material-icons-{type}\";\r\n },\r\n },\r\n phosphor: {\r\n alias: \"ph\",\r\n // types: [\"regular\", \"bold\", \"duotone\", \"fill\", \"light\", \"thin\"],\r\n defaultType: \"regular\",\r\n svgPath: (type) => {\r\n if (type === \"regular\") {\r\n return JSDELIVR + \"npm/@phosphor-icons/core@2/assets/{type}/{icon}.svg\";\r\n }\r\n return JSDELIVR + \"npm/@phosphor-icons/core@2/assets/{type}/{icon}-{type}.svg\";\r\n },\r\n fontClass: (type) => {\r\n if (type === \"regular\") {\r\n return \"ph ph-{icon}\";\r\n }\r\n return \"ph-{type} ph-{icon}\";\r\n },\r\n },\r\n supertiny: {\r\n alias: \"st\",\r\n svgPath: () => JSDELIVR + \"npm/super-tiny-icons/images/svg/{icon}.svg\",\r\n },\r\n symbols: {\r\n alias: \"ms\",\r\n // types: [\"outlined\", \"rounded\", \"sharp\"],\r\n defaultType: \"outlined\",\r\n svgPath: () => JSDELIVR + \"npm/@material-symbols/[email protected]/{type}/{icon}.svg\",\r\n fixFill: true,\r\n fontClass: () => \"material-symbols-{type}\",\r\n opticalFont: true,\r\n },\r\n tabler: {\r\n alias: \"ti\",\r\n svgPath: () => JSDELIVR + \"npm/@tabler/icons@2/icons/{icon}.svg\",\r\n useStroke: true,\r\n fontClass: () => \"ti ti-{icon}\",\r\n },\r\n },\r\n};\r\n\r\n/**\r\n * @var {IntersectionObserver}\r\n */\r\nconst observer = new window.IntersectionObserver((entries, observerRef) => {\r\n entries.forEach(async (entry) => {\r\n if (entry.isIntersecting) {\r\n observerRef.unobserve(entry.target);\r\n entry.target.init();\r\n }\r\n });\r\n});\r\n\r\n/**\r\n * @param {string} value\r\n * @param {string} iconName\r\n * @param {IconSet} iconSet\r\n * @param {string} iconType\r\n * @return {string}\r\n */\r\nfunction replacePlaceholders(value, iconName, iconSet, iconType) {\r\n value = value.replace(\"{icon}\", iconName);\r\n if (iconType) {\r\n value = value.replaceAll(\"{type}\", iconType);\r\n } else {\r\n // Maybe we want to remove the type like in material icons\r\n value = value.replace(\"-{type}\", \"\");\r\n }\r\n if (iconSet.prefixes && iconSet.prefixes[iconType]) {\r\n value = value.replace(\"{prefix}\", iconSet.prefixes[iconType]);\r\n }\r\n return value;\r\n}\r\n\r\nfunction log(message) {\r\n if (options.debug) {\r\n console.log(`[l-i] ${message}`);\r\n }\r\n}\r\n\r\n/**\r\n * @param {string} iconName\r\n * @param {IconSet} iconSet\r\n * @param {string} iconType\r\n * @return {Promise<String, Error>}\r\n */\r\nfunction getIconSvg(iconName, iconSet, iconType) {\r\n let iconUrl = iconSet.svgPath(iconType);\r\n if (!iconUrl) {\r\n throw Error(`Icon set ${iconSet} does not exists`);\r\n }\r\n const cacheKey = `${iconSet.name}-${iconName}-${iconType || \"base\"}`;\r\n iconUrl = replacePlaceholders(iconUrl, iconName, iconSet, iconType);\r\n\r\n // If we have it in cache\r\n if (iconUrl && CACHE[cacheKey]) {\r\n log(`Fetching ${cacheKey} from cache`);\r\n return CACHE[cacheKey];\r\n }\r\n\r\n // Or resolve\r\n log(`Fetching ${cacheKey} from url ${iconUrl}`);\r\n CACHE[cacheKey] = fetch(iconUrl).then(function (response) {\r\n if (response.ok) {\r\n return response.text();\r\n }\r\n throw Error(response.status);\r\n });\r\n return CACHE[cacheKey];\r\n}\r\n\r\n/**\r\n * @param {LastIcon} inst\r\n * @param {string} iconName\r\n * @param {IconSet} iconSet\r\n * @param {string} iconType\r\n */\r\nfunction refreshIcon(inst, iconName, iconSet, iconType) {\r\n // Replace name\r\n if (options.replaceName[iconName]) {\r\n iconName = options.replaceName[iconName];\r\n }\r\n // Set default type if any\r\n if (!iconType && iconSet.defaultType) {\r\n iconType = iconSet.defaultType;\r\n }\r\n\r\n // Use font (if not using a specific stroke)\r\n if (options.fonts.includes(iconSet.name) && !inst.hasAttribute(\"stroke\")) {\r\n log(`Using font for ${iconName}`);\r\n let iconClass = iconSet.fontClass(iconType);\r\n let nameAsClass = iconClass.includes(\"{icon}\");\r\n iconClass = replacePlaceholders(iconClass, iconName, iconSet, iconType);\r\n if (nameAsClass) {\r\n inst.innerHTML = `<i class=\"${iconClass}\"></i>`;\r\n } else {\r\n inst.innerHTML = `<i class=\"${iconClass}\">${iconName}</i>`;\r\n }\r\n if (inst.stroke && iconSet.opticalFont) {\r\n inst.style.setProperty(\"--weight\", inst.stroke * 100);\r\n }\r\n return; // Return early\r\n }\r\n\r\n getIconSvg(iconName, iconSet, iconType)\r\n .then((iconData) => {\r\n // Strip class attribute as it may be affected by css\r\n if (iconData.includes(\"class=\")) {\r\n iconData = iconData.replace(/ class=\"([a-z- ]*)\"/g, \"\");\r\n }\r\n // Add and/or fix stroke\r\n if (inst.stroke || iconSet.useStroke) {\r\n iconData = iconData.replace(/stroke-width=\"([0-9\\.]*)\"/g, `stroke-width=\"${inst.stroke}\"`);\r\n }\r\n // Fix fill to currentColor\r\n if (iconSet.fixFill) {\r\n iconData = iconData.replace(/(<svg.*?)>/, '$1 fill=\"currentColor\">');\r\n }\r\n // If we have some html, pass it along (useful for svg anim)\r\n if (inst.defaultHTML) {\r\n iconData = iconData.replace(\"</svg>\", `${inst.defaultHTML}</svg>`);\r\n }\r\n inst.innerHTML = iconData;\r\n })\r\n .catch((error) => {\r\n inst.innerHTML = \"<span>\u26A0\uFE0F</span>\";\r\n console.error(`Failed to load icon ${iconName} (error ${error})`);\r\n });\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} element\r\n * @returns {Boolean}\r\n */\r\nfunction isInViewport(element) {\r\n const rect = element.getBoundingClientRect();\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n}\r\n\r\n/**\r\n * Performs a deep merge of objects and returns new object. Does not modify\r\n * objects (immutable) and merges arrays via concatenation.\r\n *\r\n * @param {...object} objects - Objects to merge\r\n * @returns {object} New object with merged key/values\r\n */\r\nfunction mergeDeep(...objects) {\r\n const isObject = (obj) => obj && typeof obj === \"object\";\r\n const isArray = Array.isArray;\r\n\r\n return objects.reduce((prev, obj) => {\r\n Object.keys(obj).forEach((key) => {\r\n const pVal = prev[key];\r\n const oVal = obj[key];\r\n\r\n if (isArray(pVal) && isArray(oVal)) {\r\n prev[key] = pVal.concat(...oVal);\r\n } else if (isObject(pVal) && isObject(oVal)) {\r\n prev[key] = mergeDeep(pVal, oVal);\r\n } else {\r\n prev[key] = oVal;\r\n }\r\n });\r\n\r\n return prev;\r\n }, {});\r\n}\r\n\r\nlet aliases = {};\r\nfunction processIconSets() {\r\n for (const [key, set] of Object.entries(options.sets)) {\r\n // List aliases for easy retrieval\r\n aliases[set.alias] = key;\r\n // Include full name in iconset definition\r\n set.name = key;\r\n }\r\n}\r\nprocessIconSets();\r\n\r\nclass LastIcon extends HTMLElement {\r\n /**\r\n * @param {object} opts\r\n * @returns {Options} The updated option object\r\n */\r\n static configure(opts = {}) {\r\n for (const k in opts) {\r\n if (typeof options[k] === \"undefined\") {\r\n console.error(`Invalid option key ${k}`);\r\n return;\r\n }\r\n if (Array.isArray(opts[k])) {\r\n options[k] = options[k].concat(opts[k]);\r\n } else if (typeof opts[k] === \"object\") {\r\n options[k] = mergeDeep(options[k], opts[k]);\r\n } else {\r\n options[k] = opts[k];\r\n }\r\n }\r\n processIconSets();\r\n // Log after we had the opportunity to change debug flag\r\n log(\"configuring options\");\r\n return options;\r\n }\r\n\r\n /**\r\n * @return {String|null}\r\n */\r\n get type() {\r\n return this.getAttribute(\"type\") || null;\r\n }\r\n\r\n /**\r\n * @return {String}\r\n */\r\n get set() {\r\n let v = this.getAttribute(\"set\");\r\n return aliases[v] || options.defaultSet;\r\n }\r\n\r\n /**\r\n * @return {IconSet}\r\n */\r\n get iconSet() {\r\n return options.sets[this.set];\r\n }\r\n\r\n /**\r\n * @return {Number}\r\n */\r\n get stroke() {\r\n return this.getAttribute(\"stroke\") || options.defaultStroke;\r\n }\r\n\r\n static get observedAttributes() {\r\n return [\"name\", \"stroke\", \"size\", \"set\", \"type\"];\r\n }\r\n\r\n connectedCallback() {\r\n // innerHTML is not available because not parsed yet\r\n // setTimeout also allows whenDefined to kick in before init\r\n setTimeout(() => {\r\n if (options.lazy && !isInViewport(this)) {\r\n // observer will call init when element is visible\r\n observer.observe(this);\r\n } else {\r\n // init directly\r\n this.init();\r\n }\r\n });\r\n }\r\n\r\n init() {\r\n // Store default content as we will inject it back later\r\n this.defaultHTML = this.innerHTML;\r\n this.loadIcon();\r\n }\r\n\r\n loadIcon() {\r\n const name = this.getAttribute(\"name\");\r\n if (!name) {\r\n return;\r\n }\r\n const iconSet = this.iconSet;\r\n // Clear icon\r\n this.innerHTML = \"\";\r\n // Useful for customizing size in css\r\n const size = this.getAttribute(\"size\");\r\n if (size) {\r\n this.setSize(size);\r\n }\r\n refreshIcon(this, name, iconSet, this.type);\r\n }\r\n\r\n setSize(size) {\r\n this.style.setProperty(\"--size\", `${size}px`);\r\n if (this.iconSet.opticalFont) {\r\n this.style.setProperty(\"--opsz\", size);\r\n }\r\n }\r\n\r\n attributeChangedCallback(attr, oldVal, newVal) {\r\n // Wait until properly loaded for the first time\r\n if (typeof this.defaultHTML !== \"string\") {\r\n return;\r\n }\r\n log(`Attr ${attr} changed from ${oldVal} to ${newVal}`);\r\n if (attr === \"size\") {\r\n this.setSize(newVal);\r\n } else if (newVal) {\r\n log(\"attribute changed\");\r\n this.loadIcon();\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(\"l-i\", LastIcon);\r\n"],
"mappings": "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",
"names": []
}