import "./chunk-BUSYA2B4.js"; // node_modules/iconify-icon/dist/iconify-icon.mjs var defaultIconDimensions = Object.freeze({ left: 0, top: 0, width: 16, height: 16 }); var defaultIconTransformations = Object.freeze({ rotate: 0, vFlip: false, hFlip: false }); var defaultIconProps = Object.freeze({ ...defaultIconDimensions, ...defaultIconTransformations }); var defaultExtendedIconProps = Object.freeze({ ...defaultIconProps, body: "", hidden: false }); var defaultIconSizeCustomisations = Object.freeze({ width: null, height: null }); var defaultIconCustomisations = Object.freeze({ ...defaultIconSizeCustomisations, ...defaultIconTransformations }); function rotateFromString(value, defaultValue = 0) { const units = value.replace(/^-?[0-9.]*/, ""); function cleanup(value$1) { while (value$1 < 0) value$1 += 4; return value$1 % 4; } if (units === "") { const num = parseInt(value); return isNaN(num) ? 0 : cleanup(num); } else if (units !== value) { let split = 0; switch (units) { case "%": split = 25; break; case "deg": split = 90; } if (split) { let num = parseFloat(value.slice(0, value.length - units.length)); if (isNaN(num)) return 0; num = num / split; return num % 1 === 0 ? cleanup(num) : 0; } } return defaultValue; } var separator = /[\s,]+/; function flipFromString(custom, flip) { flip.split(separator).forEach((str) => { switch (str.trim()) { case "horizontal": custom.hFlip = true; break; case "vertical": custom.vFlip = true; break; } }); } var defaultCustomisations = { ...defaultIconCustomisations, preserveAspectRatio: "" }; function getCustomisations(node) { const customisations = { ...defaultCustomisations }; const attr = (key, def) => node.getAttribute(key) || def; customisations.width = attr("width", null); customisations.height = attr("height", null); customisations.rotate = rotateFromString(attr("rotate", "")); flipFromString(customisations, attr("flip", "")); customisations.preserveAspectRatio = attr("preserveAspectRatio", attr("preserveaspectratio", "")); return customisations; } function haveCustomisationsChanged(value1, value2) { for (const key in defaultCustomisations) { if (value1[key] !== value2[key]) { return true; } } return false; } var matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/; var stringToIcon = (value, validate, allowSimpleName, provider = "") => { const colonSeparated = value.split(":"); if (value.slice(0, 1) === "@") { if (colonSeparated.length < 2 || colonSeparated.length > 3) return null; provider = colonSeparated.shift().slice(1); } if (colonSeparated.length > 3 || !colonSeparated.length) return null; if (colonSeparated.length > 1) { const name$1 = colonSeparated.pop(); const prefix = colonSeparated.pop(); const result = { provider: colonSeparated.length > 0 ? colonSeparated[0] : provider, prefix, name: name$1 }; return validate && !validateIconName(result) ? null : result; } const name = colonSeparated[0]; const dashSeparated = name.split("-"); if (dashSeparated.length > 1) { const result = { provider, prefix: dashSeparated.shift(), name: dashSeparated.join("-") }; return validate && !validateIconName(result) ? null : result; } if (allowSimpleName && provider === "") { const result = { provider, prefix: "", name }; return validate && !validateIconName(result, allowSimpleName) ? null : result; } return null; }; var validateIconName = (icon, allowSimpleName) => { if (!icon) return false; return !!((allowSimpleName && icon.prefix === "" || !!icon.prefix) && !!icon.name); }; function getIconsTree(data, names) { const icons = data.icons; const aliases = data.aliases || /* @__PURE__ */ Object.create(null); const resolved = /* @__PURE__ */ Object.create(null); function resolve(name) { if (icons[name]) return resolved[name] = []; if (!(name in resolved)) { resolved[name] = null; const parent = aliases[name] && aliases[name].parent; const value = parent && resolve(parent); if (value) resolved[name] = [parent].concat(value); } return resolved[name]; } Object.keys(icons).concat(Object.keys(aliases)).forEach(resolve); return resolved; } function mergeIconTransformations(obj1, obj2) { const result = {}; if (!obj1.hFlip !== !obj2.hFlip) result.hFlip = true; if (!obj1.vFlip !== !obj2.vFlip) result.vFlip = true; const rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4; if (rotate) result.rotate = rotate; return result; } function mergeIconData(parent, child) { const result = mergeIconTransformations(parent, child); for (const key in defaultExtendedIconProps) if (key in defaultIconTransformations) { if (key in parent && !(key in result)) result[key] = defaultIconTransformations[key]; } else if (key in child) result[key] = child[key]; else if (key in parent) result[key] = parent[key]; return result; } function internalGetIconData(data, name, tree) { const icons = data.icons; const aliases = data.aliases || /* @__PURE__ */ Object.create(null); let currentProps = {}; function parse(name$1) { currentProps = mergeIconData(icons[name$1] || aliases[name$1], currentProps); } parse(name); tree.forEach(parse); return mergeIconData(data, currentProps); } function parseIconSet(data, callback) { const names = []; if (typeof data !== "object" || typeof data.icons !== "object") return names; if (data.not_found instanceof Array) data.not_found.forEach((name) => { callback(name, null); names.push(name); }); const tree = getIconsTree(data); for (const name in tree) { const item = tree[name]; if (item) { callback(name, internalGetIconData(data, name, item)); names.push(name); } } return names; } var optionalPropertyDefaults = { provider: "", aliases: {}, not_found: {}, ...defaultIconDimensions }; function checkOptionalProps(item, defaults) { for (const prop in defaults) if (prop in item && typeof item[prop] !== typeof defaults[prop]) return false; return true; } function quicklyValidateIconSet(obj) { if (typeof obj !== "object" || obj === null) return null; const data = obj; if (typeof data.prefix !== "string" || !obj.icons || typeof obj.icons !== "object") return null; if (!checkOptionalProps(obj, optionalPropertyDefaults)) return null; const icons = data.icons; for (const name in icons) { const icon = icons[name]; if (!name || typeof icon.body !== "string" || !checkOptionalProps(icon, defaultExtendedIconProps)) return null; } const aliases = data.aliases || /* @__PURE__ */ Object.create(null); for (const name in aliases) { const icon = aliases[name]; const parent = icon.parent; if (!name || typeof parent !== "string" || !icons[parent] && !aliases[parent] || !checkOptionalProps(icon, defaultExtendedIconProps)) return null; } return data; } var dataStorage = /* @__PURE__ */ Object.create(null); function newStorage(provider, prefix) { return { provider, prefix, icons: /* @__PURE__ */ Object.create(null), missing: /* @__PURE__ */ new Set() }; } function getStorage(provider, prefix) { const providerStorage = dataStorage[provider] || (dataStorage[provider] = /* @__PURE__ */ Object.create(null)); return providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix)); } function addIconSet(storage2, data) { if (!quicklyValidateIconSet(data)) return []; return parseIconSet(data, (name, icon) => { if (icon) storage2.icons[name] = icon; else storage2.missing.add(name); }); } function addIconToStorage(storage2, name, icon) { try { if (typeof icon.body === "string") { storage2.icons[name] = { ...icon }; return true; } } catch (err) { } return false; } function listIcons$1(provider, prefix) { let allIcons = []; (typeof provider === "string" ? [provider] : Object.keys(dataStorage)).forEach((provider$1) => { (typeof provider$1 === "string" && typeof prefix === "string" ? [prefix] : Object.keys(dataStorage[provider$1] || {})).forEach((prefix$1) => { const storage2 = getStorage(provider$1, prefix$1); allIcons = allIcons.concat(Object.keys(storage2.icons).map((name) => (provider$1 !== "" ? "@" + provider$1 + ":" : "") + prefix$1 + ":" + name)); }); }); return allIcons; } var simpleNames = false; function allowSimpleNames(allow) { if (typeof allow === "boolean") simpleNames = allow; return simpleNames; } function getIconData(name) { const icon = typeof name === "string" ? stringToIcon(name, true, simpleNames) : name; if (icon) { const storage2 = getStorage(icon.provider, icon.prefix); const iconName = icon.name; return storage2.icons[iconName] || (storage2.missing.has(iconName) ? null : void 0); } } function addIcon$1(name, data) { const icon = stringToIcon(name, true, simpleNames); if (!icon) return false; const storage2 = getStorage(icon.provider, icon.prefix); if (data) return addIconToStorage(storage2, icon.name, data); else { storage2.missing.add(icon.name); return true; } } function addCollection$1(data, provider) { if (typeof data !== "object") return false; if (typeof provider !== "string") provider = data.provider || ""; if (simpleNames && !provider && !data.prefix) { let added = false; if (quicklyValidateIconSet(data)) { data.prefix = ""; parseIconSet(data, (name, icon) => { if (addIcon$1(name, icon)) added = true; }); } return added; } const prefix = data.prefix; if (!validateIconName({ prefix, name: "a" })) return false; return !!addIconSet(getStorage(provider, prefix), data); } function iconLoaded$1(name) { return !!getIconData(name); } function getIcon$1(name) { const result = getIconData(name); return result ? { ...defaultIconProps, ...result } : result; } function removeCallback(storages, id) { storages.forEach((storage2) => { const items = storage2.loaderCallbacks; if (items) storage2.loaderCallbacks = items.filter((row) => row.id !== id); }); } function updateCallbacks(storage2) { if (!storage2.pendingCallbacksFlag) { storage2.pendingCallbacksFlag = true; setTimeout(() => { storage2.pendingCallbacksFlag = false; const items = storage2.loaderCallbacks ? storage2.loaderCallbacks.slice(0) : []; if (!items.length) return; let hasPending = false; const provider = storage2.provider; const prefix = storage2.prefix; items.forEach((item) => { const icons = item.icons; const oldLength = icons.pending.length; icons.pending = icons.pending.filter((icon) => { if (icon.prefix !== prefix) return true; const name = icon.name; if (storage2.icons[name]) icons.loaded.push({ provider, prefix, name }); else if (storage2.missing.has(name)) icons.missing.push({ provider, prefix, name }); else { hasPending = true; return true; } return false; }); if (icons.pending.length !== oldLength) { if (!hasPending) removeCallback([storage2], item.id); item.callback(icons.loaded.slice(0), icons.missing.slice(0), icons.pending.slice(0), item.abort); } }); }); } } var idCounter = 0; function storeCallback(callback, icons, pendingSources) { const id = idCounter++; const abort = removeCallback.bind(null, pendingSources, id); if (!icons.pending.length) return abort; const item = { id, icons, callback, abort }; pendingSources.forEach((storage2) => { (storage2.loaderCallbacks || (storage2.loaderCallbacks = [])).push(item); }); return abort; } function sortIcons(icons) { const result = { loaded: [], missing: [], pending: [] }; const storage2 = /* @__PURE__ */ Object.create(null); icons.sort((a, b) => { if (a.provider !== b.provider) return a.provider.localeCompare(b.provider); if (a.prefix !== b.prefix) return a.prefix.localeCompare(b.prefix); return a.name.localeCompare(b.name); }); let lastIcon = { provider: "", prefix: "", name: "" }; icons.forEach((icon) => { if (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) return; lastIcon = icon; const provider = icon.provider; const prefix = icon.prefix; const name = icon.name; const providerStorage = storage2[provider] || (storage2[provider] = /* @__PURE__ */ Object.create(null)); const localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix)); let list; if (name in localStorage.icons) list = result.loaded; else if (prefix === "" || localStorage.missing.has(name)) list = result.missing; else list = result.pending; const item = { provider, prefix, name }; list.push(item); }); return result; } var storage = /* @__PURE__ */ Object.create(null); function setAPIModule(provider, item) { storage[provider] = item; } function getAPIModule(provider) { return storage[provider] || storage[""]; } function listToIcons(list, validate = true, simpleNames2 = false) { const result = []; list.forEach((item) => { const icon = typeof item === "string" ? stringToIcon(item, validate, simpleNames2) : item; if (icon) result.push(icon); }); return result; } function createAPIConfig(source) { let resources; if (typeof source.resources === "string") resources = [source.resources]; else { resources = source.resources; if (!(resources instanceof Array) || !resources.length) return null; } return { resources, path: source.path || "/", maxURL: source.maxURL || 500, rotate: source.rotate || 750, timeout: source.timeout || 5e3, random: source.random === true, index: source.index || 0, dataAfterTimeout: source.dataAfterTimeout !== false }; } var configStorage = /* @__PURE__ */ Object.create(null); var fallBackAPISources = ["https://api.simplesvg.com", "https://api.unisvg.com"]; var fallBackAPI = []; while (fallBackAPISources.length > 0) if (fallBackAPISources.length === 1) fallBackAPI.push(fallBackAPISources.shift()); else if (Math.random() > 0.5) fallBackAPI.push(fallBackAPISources.shift()); else fallBackAPI.push(fallBackAPISources.pop()); configStorage[""] = createAPIConfig({ resources: ["https://api.iconify.design"].concat(fallBackAPI) }); function addAPIProvider$1(provider, customConfig) { const config = createAPIConfig(customConfig); if (config === null) return false; configStorage[provider] = config; return true; } function getAPIConfig(provider) { return configStorage[provider]; } function listAPIProviders() { return Object.keys(configStorage); } var defaultConfig = { resources: [], index: 0, timeout: 2e3, rotate: 750, random: false, dataAfterTimeout: false }; function sendQuery(config, payload, query, done) { const resourcesCount = config.resources.length; const startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index; let resources; if (config.random) { let list = config.resources.slice(0); resources = []; while (list.length > 1) { const nextIndex = Math.floor(Math.random() * list.length); resources.push(list[nextIndex]); list = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1)); } resources = resources.concat(list); } else resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex)); const startTime = Date.now(); let status = "pending"; let queriesSent = 0; let lastError; let timer = null; let queue = []; let doneCallbacks = []; if (typeof done === "function") doneCallbacks.push(done); function resetTimer() { if (timer) { clearTimeout(timer); timer = null; } } function abort() { if (status === "pending") status = "aborted"; resetTimer(); queue.forEach((item) => { if (item.status === "pending") item.status = "aborted"; }); queue = []; } function subscribe(callback, overwrite) { if (overwrite) doneCallbacks = []; if (typeof callback === "function") doneCallbacks.push(callback); } function getQueryStatus() { return { startTime, payload, status, queriesSent, queriesPending: queue.length, subscribe, abort }; } function failQuery() { status = "failed"; doneCallbacks.forEach((callback) => { callback(void 0, lastError); }); } function clearQueue() { queue.forEach((item) => { if (item.status === "pending") item.status = "aborted"; }); queue = []; } function moduleResponse(item, response, data) { const isError = response !== "success"; queue = queue.filter((queued) => queued !== item); switch (status) { case "pending": break; case "failed": if (isError || !config.dataAfterTimeout) return; break; default: return; } if (response === "abort") { lastError = data; failQuery(); return; } if (isError) { lastError = data; if (!queue.length) if (!resources.length) failQuery(); else execNext(); return; } resetTimer(); clearQueue(); if (!config.random) { const index = config.resources.indexOf(item.resource); if (index !== -1 && index !== config.index) config.index = index; } status = "completed"; doneCallbacks.forEach((callback) => { callback(data); }); } function execNext() { if (status !== "pending") return; resetTimer(); const resource = resources.shift(); if (resource === void 0) { if (queue.length) { timer = setTimeout(() => { resetTimer(); if (status === "pending") { clearQueue(); failQuery(); } }, config.timeout); return; } failQuery(); return; } const item = { status: "pending", resource, callback: (status$1, data) => { moduleResponse(item, status$1, data); } }; queue.push(item); queriesSent++; timer = setTimeout(execNext, config.rotate); query(resource, payload, item.callback); } setTimeout(execNext); return getQueryStatus; } function initRedundancy(cfg) { const config = { ...defaultConfig, ...cfg }; let queries = []; function cleanup() { queries = queries.filter((item) => item().status === "pending"); } function query(payload, queryCallback, doneCallback) { const query$1 = sendQuery(config, payload, queryCallback, (data, error) => { cleanup(); if (doneCallback) doneCallback(data, error); }); queries.push(query$1); return query$1; } function find(callback) { return queries.find((value) => { return callback(value); }) || null; } return { query, find, setIndex: (index) => { config.index = index; }, getIndex: () => config.index, cleanup }; } function emptyCallback$1() { } var redundancyCache = /* @__PURE__ */ Object.create(null); function getRedundancyCache(provider) { if (!redundancyCache[provider]) { const config = getAPIConfig(provider); if (!config) return; redundancyCache[provider] = { config, redundancy: initRedundancy(config) }; } return redundancyCache[provider]; } function sendAPIQuery(target, query, callback) { let redundancy; let send2; if (typeof target === "string") { const api = getAPIModule(target); if (!api) { callback(void 0, 424); return emptyCallback$1; } send2 = api.send; const cached = getRedundancyCache(target); if (cached) redundancy = cached.redundancy; } else { const config = createAPIConfig(target); if (config) { redundancy = initRedundancy(config); const api = getAPIModule(target.resources ? target.resources[0] : ""); if (api) send2 = api.send; } } if (!redundancy || !send2) { callback(void 0, 424); return emptyCallback$1; } return redundancy.query(query, send2, callback)().abort; } function emptyCallback() { } function loadedNewIcons(storage2) { if (!storage2.iconsLoaderFlag) { storage2.iconsLoaderFlag = true; setTimeout(() => { storage2.iconsLoaderFlag = false; updateCallbacks(storage2); }); } } function checkIconNamesForAPI(icons) { const valid = []; const invalid = []; icons.forEach((name) => { (name.match(matchIconName) ? valid : invalid).push(name); }); return { valid, invalid }; } function parseLoaderResponse(storage2, icons, data) { function checkMissing() { const pending = storage2.pendingIcons; icons.forEach((name) => { if (pending) pending.delete(name); if (!storage2.icons[name]) storage2.missing.add(name); }); } if (data && typeof data === "object") try { if (!addIconSet(storage2, data).length) { checkMissing(); return; } } catch (err) { console.error(err); } checkMissing(); loadedNewIcons(storage2); } function parsePossiblyAsyncResponse(response, callback) { if (response instanceof Promise) response.then((data) => { callback(data); }).catch(() => { callback(null); }); else callback(response); } function loadNewIcons(storage2, icons) { if (!storage2.iconsToLoad) storage2.iconsToLoad = icons; else storage2.iconsToLoad = storage2.iconsToLoad.concat(icons).sort(); if (!storage2.iconsQueueFlag) { storage2.iconsQueueFlag = true; setTimeout(() => { storage2.iconsQueueFlag = false; const { provider, prefix } = storage2; const icons$1 = storage2.iconsToLoad; delete storage2.iconsToLoad; if (!icons$1 || !icons$1.length) return; const customIconLoader = storage2.loadIcon; if (storage2.loadIcons && (icons$1.length > 1 || !customIconLoader)) { parsePossiblyAsyncResponse(storage2.loadIcons(icons$1, prefix, provider), (data) => { parseLoaderResponse(storage2, icons$1, data); }); return; } if (customIconLoader) { icons$1.forEach((name) => { parsePossiblyAsyncResponse(customIconLoader(name, prefix, provider), (data) => { parseLoaderResponse(storage2, [name], data ? { prefix, icons: { [name]: data } } : null); }); }); return; } const { valid, invalid } = checkIconNamesForAPI(icons$1); if (invalid.length) parseLoaderResponse(storage2, invalid, null); if (!valid.length) return; const api = prefix.match(matchIconName) ? getAPIModule(provider) : null; if (!api) { parseLoaderResponse(storage2, valid, null); return; } api.prepare(provider, prefix, valid).forEach((item) => { sendAPIQuery(provider, item, (data) => { parseLoaderResponse(storage2, item.icons, data); }); }); }); } } var loadIcons$1 = (icons, callback) => { const sortedIcons = sortIcons(listToIcons(icons, true, allowSimpleNames())); if (!sortedIcons.pending.length) { let callCallback = true; if (callback) setTimeout(() => { if (callCallback) callback(sortedIcons.loaded, sortedIcons.missing, sortedIcons.pending, emptyCallback); }); return () => { callCallback = false; }; } const newIcons = /* @__PURE__ */ Object.create(null); const sources = []; let lastProvider, lastPrefix; sortedIcons.pending.forEach((icon) => { const { provider, prefix } = icon; if (prefix === lastPrefix && provider === lastProvider) return; lastProvider = provider; lastPrefix = prefix; sources.push(getStorage(provider, prefix)); const providerNewIcons = newIcons[provider] || (newIcons[provider] = /* @__PURE__ */ Object.create(null)); if (!providerNewIcons[prefix]) providerNewIcons[prefix] = []; }); sortedIcons.pending.forEach((icon) => { const { provider, prefix, name } = icon; const storage2 = getStorage(provider, prefix); const pendingQueue = storage2.pendingIcons || (storage2.pendingIcons = /* @__PURE__ */ new Set()); if (!pendingQueue.has(name)) { pendingQueue.add(name); newIcons[provider][prefix].push(name); } }); sources.forEach((storage2) => { const list = newIcons[storage2.provider][storage2.prefix]; if (list.length) loadNewIcons(storage2, list); }); return callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback; }; var loadIcon$1 = (icon) => { return new Promise((fulfill, reject) => { const iconObj = typeof icon === "string" ? stringToIcon(icon, true) : icon; if (!iconObj) { reject(icon); return; } loadIcons$1([iconObj || icon], (loaded) => { if (loaded.length && iconObj) { const data = getIconData(iconObj); if (data) { fulfill({ ...defaultIconProps, ...data }); return; } } reject(icon); }); }); }; function testIconObject(value) { try { const obj = typeof value === "string" ? JSON.parse(value) : value; if (typeof obj.body === "string") { return { ...obj }; } } catch (err) { } } function parseIconValue(value, onload) { if (typeof value === "object") { const data2 = testIconObject(value); return { data: data2, value }; } if (typeof value !== "string") { return { value }; } if (value.includes("{")) { const data2 = testIconObject(value); if (data2) { return { data: data2, value }; } } const name = stringToIcon(value, true, true); if (!name) { return { value }; } const data = getIconData(name); if (data !== void 0 || !name.prefix) { return { value, name, data // could be 'null' -> icon is missing }; } const loading = loadIcons$1([name], () => onload(value, name, getIconData(name))); return { value, name, loading }; } var isBuggedSafari = false; try { isBuggedSafari = navigator.vendor.indexOf("Apple") === 0; } catch (err) { } function getRenderMode(body, mode) { switch (mode) { // Force mode case "svg": case "bg": case "mask": return mode; } if (mode !== "style" && (isBuggedSafari || body.indexOf("= 0) { const start = content.indexOf(">", index); const end = content.indexOf("", end); if (endEnd === -1) break; defs += content.slice(start + 1, end).trim(); content = content.slice(0, index).trim() + content.slice(endEnd + 1); } return { defs, content }; } function mergeDefsAndContent(defs, content) { return defs ? "" + defs + "" + content : content; } function wrapSVGContent(body, start, end) { const split = splitSVGDefs(body); return mergeDefsAndContent(split.defs, start + split.content + end); } var isUnsetKeyword = (value) => value === "unset" || value === "undefined" || value === "none"; function iconToSVG(icon, customisations) { const fullIcon = { ...defaultIconProps, ...icon }; const fullCustomisations = { ...defaultIconCustomisations, ...customisations }; const box = { left: fullIcon.left, top: fullIcon.top, width: fullIcon.width, height: fullIcon.height }; let body = fullIcon.body; [fullIcon, fullCustomisations].forEach((props) => { const transformations = []; const hFlip = props.hFlip; const vFlip = props.vFlip; let rotation = props.rotate; if (hFlip) if (vFlip) rotation += 2; else { transformations.push("translate(" + (box.width + box.left).toString() + " " + (0 - box.top).toString() + ")"); transformations.push("scale(-1 1)"); box.top = box.left = 0; } else if (vFlip) { transformations.push("translate(" + (0 - box.left).toString() + " " + (box.height + box.top).toString() + ")"); transformations.push("scale(1 -1)"); box.top = box.left = 0; } let tempValue; if (rotation < 0) rotation -= Math.floor(rotation / 4) * 4; rotation = rotation % 4; switch (rotation) { case 1: tempValue = box.height / 2 + box.top; transformations.unshift("rotate(90 " + tempValue.toString() + " " + tempValue.toString() + ")"); break; case 2: transformations.unshift("rotate(180 " + (box.width / 2 + box.left).toString() + " " + (box.height / 2 + box.top).toString() + ")"); break; case 3: tempValue = box.width / 2 + box.left; transformations.unshift("rotate(-90 " + tempValue.toString() + " " + tempValue.toString() + ")"); break; } if (rotation % 2 === 1) { if (box.left !== box.top) { tempValue = box.left; box.left = box.top; box.top = tempValue; } if (box.width !== box.height) { tempValue = box.width; box.width = box.height; box.height = tempValue; } } if (transformations.length) body = wrapSVGContent(body, '', ""); }); const customisationsWidth = fullCustomisations.width; const customisationsHeight = fullCustomisations.height; const boxWidth = box.width; const boxHeight = box.height; let width; let height; if (customisationsWidth === null) { height = customisationsHeight === null ? "1em" : customisationsHeight === "auto" ? boxHeight : customisationsHeight; width = calculateSize$1(height, boxWidth / boxHeight); } else { width = customisationsWidth === "auto" ? boxWidth : customisationsWidth; height = customisationsHeight === null ? calculateSize$1(width, boxHeight / boxWidth) : customisationsHeight === "auto" ? boxHeight : customisationsHeight; } const attributes = {}; const setAttr = (prop, value) => { if (!isUnsetKeyword(value)) attributes[prop] = value.toString(); }; setAttr("width", width); setAttr("height", height); const viewBox = [ box.left, box.top, boxWidth, boxHeight ]; attributes.viewBox = viewBox.join(" "); return { attributes, viewBox, body }; } function iconToHTML$1(body, attributes) { let renderAttribsHTML = body.indexOf("xlink:") === -1 ? "" : ' xmlns:xlink="http://www.w3.org/1999/xlink"'; for (const attr in attributes) renderAttribsHTML += " " + attr + '="' + attributes[attr] + '"'; return '" + body + ""; } function encodeSVGforURL(svg) { return svg.replace(/"/g, "'").replace(/%/g, "%25").replace(/#/g, "%23").replace(//g, "%3E").replace(/\s+/g, " "); } function svgToData(svg) { return "data:image/svg+xml," + encodeSVGforURL(svg); } function svgToURL$1(svg) { return 'url("' + svgToData(svg) + '")'; } var detectFetch = () => { let callback; try { callback = fetch; if (typeof callback === "function") return callback; } catch (err) { } }; var fetchModule = detectFetch(); function setFetch(fetch$1) { fetchModule = fetch$1; } function getFetch() { return fetchModule; } function calculateMaxLength(provider, prefix) { const config = getAPIConfig(provider); if (!config) return 0; let result; if (!config.maxURL) result = 0; else { let maxHostLength = 0; config.resources.forEach((item) => { const host = item; maxHostLength = Math.max(maxHostLength, host.length); }); const url = prefix + ".json?icons="; result = config.maxURL - maxHostLength - config.path.length - url.length; } return result; } function shouldAbort(status) { return status === 404; } var prepare = (provider, prefix, icons) => { const results = []; const maxLength = calculateMaxLength(provider, prefix); const type = "icons"; let item = { type, provider, prefix, icons: [] }; let length = 0; icons.forEach((name, index) => { length += name.length + 1; if (length >= maxLength && index > 0) { results.push(item); item = { type, provider, prefix, icons: [] }; length = name.length; } item.icons.push(name); }); results.push(item); return results; }; function getPath(provider) { if (typeof provider === "string") { const config = getAPIConfig(provider); if (config) return config.path; } return "/"; } var send = (host, params, callback) => { if (!fetchModule) { callback("abort", 424); return; } let path = getPath(params.provider); switch (params.type) { case "icons": { const prefix = params.prefix; const iconsList = params.icons.join(","); const urlParams = new URLSearchParams({ icons: iconsList }); path += prefix + ".json?" + urlParams.toString(); break; } case "custom": { const uri = params.uri; path += uri.slice(0, 1) === "/" ? uri.slice(1) : uri; break; } default: callback("abort", 400); return; } let defaultError = 503; fetchModule(host + path).then((response) => { const status = response.status; if (status !== 200) { setTimeout(() => { callback(shouldAbort(status) ? "abort" : "next", status); }); return; } defaultError = 501; return response.json(); }).then((data) => { if (typeof data !== "object" || data === null) { setTimeout(() => { if (data === 404) callback("abort", data); else callback("next", defaultError); }); return; } setTimeout(() => { callback("success", data); }); }).catch(() => { callback("next", defaultError); }); }; var fetchAPIModule = { prepare, send }; function setCustomIconsLoader$1(loader, prefix, provider) { getStorage(provider || "", prefix).loadIcons = loader; } function setCustomIconLoader$1(loader, prefix, provider) { getStorage(provider || "", prefix).loadIcon = loader; } var nodeAttr = "data-style"; var customStyle = ""; function appendCustomStyle(style) { customStyle = style; } function updateStyle(parent, inline) { let styleNode = Array.from(parent.childNodes).find((node) => node.hasAttribute && node.hasAttribute(nodeAttr)); if (!styleNode) { styleNode = document.createElement("style"); styleNode.setAttribute(nodeAttr, nodeAttr); parent.appendChild(styleNode); } styleNode.textContent = ":host{display:inline-block;vertical-align:" + (inline ? "-0.125em" : "0") + "}span,svg{display:block;margin:auto}" + customStyle; } function exportFunctions() { setAPIModule("", fetchAPIModule); allowSimpleNames(true); let _window; try { _window = window; } catch (err) { } if (_window) { if (_window.IconifyPreload !== void 0) { const preload = _window.IconifyPreload; const err = "Invalid IconifyPreload syntax."; if (typeof preload === "object" && preload !== null) { (preload instanceof Array ? preload : [preload]).forEach((item) => { try { if ( // Check if item is an object and not null/array typeof item !== "object" || item === null || item instanceof Array || // Check for 'icons' and 'prefix' typeof item.icons !== "object" || typeof item.prefix !== "string" || // Add icon set !addCollection$1(item) ) { console.error(err); } } catch (e) { console.error(err); } }); } } if (_window.IconifyProviders !== void 0) { const providers = _window.IconifyProviders; if (typeof providers === "object" && providers !== null) { for (const key in providers) { const err = "IconifyProviders[" + key + "] is invalid."; try { const value = providers[key]; if (typeof value !== "object" || !value || value.resources === void 0) { continue; } if (!addAPIProvider$1(key, value)) { console.error(err); } } catch (e) { console.error(err); } } } } } const _api2 = { getAPIConfig, setAPIModule, sendAPIQuery, setFetch, getFetch, listAPIProviders }; return { iconLoaded: iconLoaded$1, getIcon: getIcon$1, listIcons: listIcons$1, addIcon: addIcon$1, addCollection: addCollection$1, calculateSize: calculateSize$1, buildIcon: iconToSVG, iconToHTML: iconToHTML$1, svgToURL: svgToURL$1, loadIcons: loadIcons$1, loadIcon: loadIcon$1, addAPIProvider: addAPIProvider$1, setCustomIconLoader: setCustomIconLoader$1, setCustomIconsLoader: setCustomIconsLoader$1, appendCustomStyle, _api: _api2 }; } var monotoneProps = { "background-color": "currentColor" }; var coloredProps = { "background-color": "transparent" }; var propsToAdd = { image: "var(--svg)", repeat: "no-repeat", size: "100% 100%" }; var propsToAddTo = { "-webkit-mask": monotoneProps, "mask": monotoneProps, "background": coloredProps }; for (const prefix in propsToAddTo) { const list = propsToAddTo[prefix]; for (const prop in propsToAdd) { list[prefix + "-" + prop] = propsToAdd[prop]; } } function fixSize(value) { return value ? value + (value.match(/^[-0-9.]+$/) ? "px" : "") : "inherit"; } function renderSPAN(data, icon, useMask) { const node = document.createElement("span"); let body = data.body; if (body.indexOf(""; } const renderAttribs = data.attributes; const html = iconToHTML$1(body, { ...renderAttribs, width: icon.width + "", height: icon.height + "" }); const url = svgToURL$1(html); const svgStyle = node.style; const styles = { "--svg": url, "width": fixSize(renderAttribs.width), "height": fixSize(renderAttribs.height), ...useMask ? monotoneProps : coloredProps }; for (const prop in styles) { svgStyle.setProperty(prop, styles[prop]); } return node; } var policy; function createPolicy() { try { policy = window.trustedTypes.createPolicy("iconify", { createHTML: (s) => s }); } catch (err) { policy = null; } } function cleanUpInnerHTML(html) { if (policy === void 0) createPolicy(); return policy ? policy.createHTML(html) : html; } function renderSVG(data) { const node = document.createElement("span"); const attr = data.attributes; let style = ""; if (!attr.width) { style = "width: inherit;"; } if (!attr.height) { style += "height: inherit;"; } if (style) { attr.style = style; } const html = iconToHTML$1(data.body, attr); node.innerHTML = cleanUpInnerHTML(html); return node.firstChild; } function findIconElement(parent) { return Array.from(parent.childNodes).find((node) => { const tag = node.tagName && node.tagName.toUpperCase(); return tag === "SPAN" || tag === "SVG"; }); } function renderIcon(parent, state) { const iconData = state.icon.data; const customisations = state.customisations; const renderData = iconToSVG(iconData, customisations); if (customisations.preserveAspectRatio) { renderData.attributes["preserveAspectRatio"] = customisations.preserveAspectRatio; } const mode = state.renderedMode; let node; switch (mode) { case "svg": node = renderSVG(renderData); break; default: node = renderSPAN(renderData, { ...defaultIconProps, ...iconData }, mode === "mask"); } const oldNode = findIconElement(parent); if (oldNode) { if (node.tagName === "SPAN" && oldNode.tagName === node.tagName) { oldNode.setAttribute("style", node.getAttribute("style")); } else { parent.replaceChild(node, oldNode); } } else { parent.appendChild(node); } } function setPendingState(icon, inline, lastState) { const lastRender = lastState && (lastState.rendered ? lastState : lastState.lastRender); return { rendered: false, inline, icon, lastRender }; } function defineIconifyIcon(name = "iconify-icon") { let customElements; let ParentClass; try { customElements = window.customElements; ParentClass = window.HTMLElement; } catch (err) { return; } if (!customElements || !ParentClass) { return; } const ConflictingClass = customElements.get(name); if (ConflictingClass) { return ConflictingClass; } const attributes = [ // Icon "icon", // Mode "mode", "inline", "noobserver", // Customisations "width", "height", "rotate", "flip" ]; const IconifyIcon = class extends ParentClass { // Root _shadowRoot; // Initialised _initialised = false; // Icon state _state; // Attributes check queued _checkQueued = false; // Connected _connected = false; // Observer _observer = null; _visible = true; /** * Constructor */ constructor() { super(); const root = this._shadowRoot = this.attachShadow({ mode: "open" }); const inline = this.hasAttribute("inline"); updateStyle(root, inline); this._state = setPendingState({ value: "" }, inline); this._queueCheck(); } /** * Connected to DOM */ connectedCallback() { this._connected = true; this.startObserver(); } /** * Disconnected from DOM */ disconnectedCallback() { this._connected = false; this.stopObserver(); } /** * Observed attributes */ static get observedAttributes() { return attributes.slice(0); } /** * Observed properties that are different from attributes * * Experimental! Need to test with various frameworks that support it */ /* static get properties() { return { inline: { type: Boolean, reflect: true, }, // Not listing other attributes because they are strings or combination // of string and another type. Cannot have multiple types }; } */ /** * Attribute has changed */ attributeChangedCallback(name2) { switch (name2) { case "inline": { const newInline = this.hasAttribute("inline"); const state = this._state; if (newInline !== state.inline) { state.inline = newInline; updateStyle(this._shadowRoot, newInline); } break; } case "noobserver": { const value = this.hasAttribute("noobserver"); if (value) { this.startObserver(); } else { this.stopObserver(); } break; } default: this._queueCheck(); } } /** * Get/set icon */ get icon() { const value = this.getAttribute("icon"); if (value && value.slice(0, 1) === "{") { try { return JSON.parse(value); } catch (err) { } } return value; } set icon(value) { if (typeof value === "object") { value = JSON.stringify(value); } this.setAttribute("icon", value); } /** * Get/set inline */ get inline() { return this.hasAttribute("inline"); } set inline(value) { if (value) { this.setAttribute("inline", "true"); } else { this.removeAttribute("inline"); } } /** * Get/set observer */ get observer() { return this.hasAttribute("observer"); } set observer(value) { if (value) { this.setAttribute("observer", "true"); } else { this.removeAttribute("observer"); } } /** * Restart animation */ restartAnimation() { const state = this._state; if (state.rendered) { const root = this._shadowRoot; if (state.renderedMode === "svg") { try { root.lastChild.setCurrentTime(0); return; } catch (err) { } } renderIcon(root, state); } } /** * Get status */ get status() { const state = this._state; return state.rendered ? "rendered" : state.icon.data === null ? "failed" : "loading"; } /** * Queue attributes re-check */ _queueCheck() { if (!this._checkQueued) { this._checkQueued = true; setTimeout(() => { this._check(); }); } } /** * Check for changes */ _check() { if (!this._checkQueued) { return; } this._checkQueued = false; const state = this._state; const newIcon = this.getAttribute("icon"); if (newIcon !== state.icon.value) { this._iconChanged(newIcon); return; } if (!state.rendered || !this._visible) { return; } const mode = this.getAttribute("mode"); const customisations = getCustomisations(this); if (state.attrMode !== mode || haveCustomisationsChanged(state.customisations, customisations) || !findIconElement(this._shadowRoot)) { this._renderIcon(state.icon, customisations, mode); } } /** * Icon value has changed */ _iconChanged(newValue) { const icon = parseIconValue(newValue, (value, name2, data) => { const state = this._state; if (state.rendered || this.getAttribute("icon") !== value) { return; } const icon2 = { value, name: name2, data }; if (icon2.data) { this._gotIconData(icon2); } else { state.icon = icon2; } }); if (icon.data) { this._gotIconData(icon); } else { this._state = setPendingState(icon, this._state.inline, this._state); } } /** * Force render icon on state change */ _forceRender() { if (!this._visible) { const node = findIconElement(this._shadowRoot); if (node) { this._shadowRoot.removeChild(node); } return; } this._queueCheck(); } /** * Got new icon data, icon is ready to (re)render */ _gotIconData(icon) { this._checkQueued = false; this._renderIcon(icon, getCustomisations(this), this.getAttribute("mode")); } /** * Re-render based on icon data */ _renderIcon(icon, customisations, attrMode) { const renderedMode = getRenderMode(icon.data.body, attrMode); const inline = this._state.inline; renderIcon(this._shadowRoot, this._state = { rendered: true, icon, inline, customisations, attrMode, renderedMode }); } /** * Start observer */ startObserver() { if (!this._observer && !this.hasAttribute("noobserver")) { try { this._observer = new IntersectionObserver((entries) => { const intersecting = entries.some((entry) => entry.isIntersecting); if (intersecting !== this._visible) { this._visible = intersecting; this._forceRender(); } }); this._observer.observe(this); } catch (err) { if (this._observer) { try { this._observer.disconnect(); } catch (err2) { } this._observer = null; } } } } /** * Stop observer */ stopObserver() { if (this._observer) { this._observer.disconnect(); this._observer = null; this._visible = true; if (this._connected) { this._forceRender(); } } } }; attributes.forEach((attr) => { if (!(attr in IconifyIcon.prototype)) { Object.defineProperty(IconifyIcon.prototype, attr, { get: function() { return this.getAttribute(attr); }, set: function(value) { if (value !== null) { this.setAttribute(attr, value); } else { this.removeAttribute(attr); } } }); } }); const functions = exportFunctions(); for (const key in functions) { IconifyIcon[key] = IconifyIcon.prototype[key] = functions[key]; } customElements.define(name, IconifyIcon); return IconifyIcon; } var IconifyIconComponent = defineIconifyIcon() || exportFunctions(); var { iconLoaded, getIcon, listIcons, addIcon, addCollection, calculateSize, buildIcon, iconToHTML, svgToURL, loadIcons, loadIcon, setCustomIconLoader, setCustomIconsLoader, addAPIProvider, _api } = IconifyIconComponent; export { IconifyIconComponent, _api, addAPIProvider, addCollection, addIcon, appendCustomStyle, buildIcon, calculateSize, getIcon, iconLoaded, iconToHTML, listIcons, loadIcon, loadIcons, setCustomIconLoader, setCustomIconsLoader, svgToURL }; /*! Bundled license information: iconify-icon/dist/iconify-icon.mjs: (** * (c) Iconify * * For the full copyright and license information, please view the license.txt * files at https://github.com/iconify/iconify * * Licensed under MIT. * * @license MIT * @version 3.0.2 *) */ //# sourceMappingURL=iconify-icon.js.map