iconify.without-api.js 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365
  1. /**
  2. * (c) Iconify
  3. *
  4. * For the full copyright and license information, please view the license.txt or license.gpl.txt
  5. * files at https://github.com/iconify/iconify
  6. *
  7. * Licensed under MIT.
  8. *
  9. * @license MIT
  10. * @version 3.1.0
  11. */
  12. var Iconify = (function (exports) {
  13. 'use strict';
  14. var defaultIconDimensions = Object.freeze(
  15. {
  16. left: 0,
  17. top: 0,
  18. width: 16,
  19. height: 16
  20. }
  21. );
  22. var defaultIconTransformations = Object.freeze({
  23. rotate: 0,
  24. vFlip: false,
  25. hFlip: false
  26. });
  27. var defaultIconProps = Object.freeze(Object.assign({}, defaultIconDimensions,
  28. defaultIconTransformations));
  29. var defaultExtendedIconProps = Object.freeze(Object.assign({}, defaultIconProps,
  30. {body: "",
  31. hidden: false}));
  32. function mergeIconTransformations(obj1, obj2) {
  33. var result = {};
  34. if (!obj1.hFlip !== !obj2.hFlip) {
  35. result.hFlip = true;
  36. }
  37. if (!obj1.vFlip !== !obj2.vFlip) {
  38. result.vFlip = true;
  39. }
  40. var rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;
  41. if (rotate) {
  42. result.rotate = rotate;
  43. }
  44. return result;
  45. }
  46. function mergeIconData(parent, child) {
  47. var result = mergeIconTransformations(parent, child);
  48. for (var key in defaultExtendedIconProps) {
  49. if (key in defaultIconTransformations) {
  50. if (key in parent && !(key in result)) {
  51. result[key] = defaultIconTransformations[key];
  52. }
  53. } else if (key in child) {
  54. result[key] = child[key];
  55. } else if (key in parent) {
  56. result[key] = parent[key];
  57. }
  58. }
  59. return result;
  60. }
  61. function getIconsTree(data, names) {
  62. var icons = data.icons;
  63. var aliases = data.aliases || /* @__PURE__ */ Object.create(null);
  64. var resolved = /* @__PURE__ */ Object.create(null);
  65. function resolve(name) {
  66. if (icons[name]) {
  67. return resolved[name] = [];
  68. }
  69. if (!(name in resolved)) {
  70. resolved[name] = null;
  71. var parent = aliases[name] && aliases[name].parent;
  72. var value = parent && resolve(parent);
  73. if (value) {
  74. resolved[name] = [parent].concat(value);
  75. }
  76. }
  77. return resolved[name];
  78. }
  79. (names || Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);
  80. return resolved;
  81. }
  82. function internalGetIconData(data, name, tree) {
  83. var icons = data.icons;
  84. var aliases = data.aliases || /* @__PURE__ */ Object.create(null);
  85. var currentProps = {};
  86. function parse(name2) {
  87. currentProps = mergeIconData(
  88. icons[name2] || aliases[name2],
  89. currentProps
  90. );
  91. }
  92. parse(name);
  93. tree.forEach(parse);
  94. return mergeIconData(data, currentProps);
  95. }
  96. function parseIconSet(data, callback) {
  97. var names = [];
  98. if (typeof data !== "object" || typeof data.icons !== "object") {
  99. return names;
  100. }
  101. if (data.not_found instanceof Array) {
  102. data.not_found.forEach(function (name) {
  103. callback(name, null);
  104. names.push(name);
  105. });
  106. }
  107. var tree = getIconsTree(data);
  108. for (var name in tree) {
  109. var item = tree[name];
  110. if (item) {
  111. callback(name, internalGetIconData(data, name, item));
  112. names.push(name);
  113. }
  114. }
  115. return names;
  116. }
  117. var matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;
  118. var stringToIcon = function (value, validate, allowSimpleName, provider) {
  119. if ( provider === void 0 ) provider = "";
  120. var colonSeparated = value.split(":");
  121. if (value.slice(0, 1) === "@") {
  122. if (colonSeparated.length < 2 || colonSeparated.length > 3) {
  123. return null;
  124. }
  125. provider = colonSeparated.shift().slice(1);
  126. }
  127. if (colonSeparated.length > 3 || !colonSeparated.length) {
  128. return null;
  129. }
  130. if (colonSeparated.length > 1) {
  131. var name2 = colonSeparated.pop();
  132. var prefix = colonSeparated.pop();
  133. var result = {
  134. provider: colonSeparated.length > 0 ? colonSeparated[0] : provider,
  135. prefix: prefix,
  136. name: name2
  137. };
  138. return validate && !validateIconName(result) ? null : result;
  139. }
  140. var name = colonSeparated[0];
  141. var dashSeparated = name.split("-");
  142. if (dashSeparated.length > 1) {
  143. var result$1 = {
  144. provider: provider,
  145. prefix: dashSeparated.shift(),
  146. name: dashSeparated.join("-")
  147. };
  148. return validate && !validateIconName(result$1) ? null : result$1;
  149. }
  150. if (allowSimpleName && provider === "") {
  151. var result$2 = {
  152. provider: provider,
  153. prefix: "",
  154. name: name
  155. };
  156. return validate && !validateIconName(result$2, allowSimpleName) ? null : result$2;
  157. }
  158. return null;
  159. };
  160. var validateIconName = function (icon, allowSimpleName) {
  161. if (!icon) {
  162. return false;
  163. }
  164. return !!((icon.provider === "" || icon.provider.match(matchIconName)) && (allowSimpleName && icon.prefix === "" || icon.prefix.match(matchIconName)) && icon.name.match(matchIconName));
  165. };
  166. var optionalPropertyDefaults = Object.assign({}, {provider: "",
  167. aliases: {},
  168. not_found: {}},
  169. defaultIconDimensions);
  170. function checkOptionalProps(item, defaults) {
  171. for (var prop in defaults) {
  172. if (prop in item && typeof item[prop] !== typeof defaults[prop]) {
  173. return false;
  174. }
  175. }
  176. return true;
  177. }
  178. function quicklyValidateIconSet(obj) {
  179. if (typeof obj !== "object" || obj === null) {
  180. return null;
  181. }
  182. var data = obj;
  183. if (typeof data.prefix !== "string" || !obj.icons || typeof obj.icons !== "object") {
  184. return null;
  185. }
  186. if (!checkOptionalProps(obj, optionalPropertyDefaults)) {
  187. return null;
  188. }
  189. var icons = data.icons;
  190. for (var name in icons) {
  191. var icon = icons[name];
  192. if (!name.match(matchIconName) || typeof icon.body !== "string" || !checkOptionalProps(
  193. icon,
  194. defaultExtendedIconProps
  195. )) {
  196. return null;
  197. }
  198. }
  199. var aliases = data.aliases || /* @__PURE__ */ Object.create(null);
  200. for (var name$1 in aliases) {
  201. var icon$1 = aliases[name$1];
  202. var parent = icon$1.parent;
  203. if (!name$1.match(matchIconName) || typeof parent !== "string" || !icons[parent] && !aliases[parent] || !checkOptionalProps(
  204. icon$1,
  205. defaultExtendedIconProps
  206. )) {
  207. return null;
  208. }
  209. }
  210. return data;
  211. }
  212. var dataStorage = /* @__PURE__ */ Object.create(null);
  213. function newStorage(provider, prefix) {
  214. return {
  215. provider: provider,
  216. prefix: prefix,
  217. icons: /* @__PURE__ */ Object.create(null),
  218. missing: /* @__PURE__ */ new Set()
  219. };
  220. }
  221. function getStorage(provider, prefix) {
  222. var providerStorage = dataStorage[provider] || (dataStorage[provider] = /* @__PURE__ */ Object.create(null));
  223. return providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix));
  224. }
  225. function addIconSet(storage, data) {
  226. if (!quicklyValidateIconSet(data)) {
  227. return [];
  228. }
  229. return parseIconSet(data, function (name, icon) {
  230. if (icon) {
  231. storage.icons[name] = icon;
  232. } else {
  233. storage.missing.add(name);
  234. }
  235. });
  236. }
  237. function addIconToStorage(storage, name, icon) {
  238. try {
  239. if (typeof icon.body === "string") {
  240. storage.icons[name] = Object.assign({}, icon);
  241. return true;
  242. }
  243. } catch (err) {
  244. }
  245. return false;
  246. }
  247. function listIcons(provider, prefix) {
  248. var allIcons = [];
  249. var providers = typeof provider === "string" ? [provider] : Object.keys(dataStorage);
  250. providers.forEach(function (provider2) {
  251. var prefixes = typeof provider2 === "string" && typeof prefix === "string" ? [prefix] : Object.keys(dataStorage[provider2] || {});
  252. prefixes.forEach(function (prefix2) {
  253. var storage = getStorage(provider2, prefix2);
  254. allIcons = allIcons.concat(
  255. Object.keys(storage.icons).map(
  256. function (name) { return (provider2 !== "" ? "@" + provider2 + ":" : "") + prefix2 + ":" + name; }
  257. )
  258. );
  259. });
  260. });
  261. return allIcons;
  262. }
  263. var simpleNames = false;
  264. function allowSimpleNames(allow) {
  265. if (typeof allow === "boolean") {
  266. simpleNames = allow;
  267. }
  268. return simpleNames;
  269. }
  270. function getIconData(name) {
  271. var icon = typeof name === "string" ? stringToIcon(name, true, simpleNames) : name;
  272. if (icon) {
  273. var storage = getStorage(icon.provider, icon.prefix);
  274. var iconName = icon.name;
  275. return storage.icons[iconName] || (storage.missing.has(iconName) ? null : void 0);
  276. }
  277. }
  278. function addIcon(name, data) {
  279. var icon = stringToIcon(name, true, simpleNames);
  280. if (!icon) {
  281. return false;
  282. }
  283. var storage = getStorage(icon.provider, icon.prefix);
  284. return addIconToStorage(storage, icon.name, data);
  285. }
  286. function addCollection(data, provider) {
  287. if (typeof data !== "object") {
  288. return false;
  289. }
  290. if (typeof provider !== "string") {
  291. provider = data.provider || "";
  292. }
  293. if (simpleNames && !provider && !data.prefix) {
  294. var added = false;
  295. if (quicklyValidateIconSet(data)) {
  296. data.prefix = "";
  297. parseIconSet(data, function (name, icon) {
  298. if (icon && addIcon(name, icon)) {
  299. added = true;
  300. }
  301. });
  302. }
  303. return added;
  304. }
  305. var prefix = data.prefix;
  306. if (!validateIconName({
  307. provider: provider,
  308. prefix: prefix,
  309. name: "a"
  310. })) {
  311. return false;
  312. }
  313. var storage = getStorage(provider, prefix);
  314. return !!addIconSet(storage, data);
  315. }
  316. function iconExists(name) {
  317. return !!getIconData(name);
  318. }
  319. function getIcon(name) {
  320. var result = getIconData(name);
  321. return result ? Object.assign({}, defaultIconProps,
  322. result) : null;
  323. }
  324. var defaultIconSizeCustomisations = Object.freeze({
  325. width: null,
  326. height: null
  327. });
  328. var defaultIconCustomisations = Object.freeze(Object.assign({}, defaultIconSizeCustomisations,
  329. defaultIconTransformations));
  330. var unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;
  331. var unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;
  332. function calculateSize(size, ratio, precision) {
  333. if (ratio === 1) {
  334. return size;
  335. }
  336. precision = precision || 100;
  337. if (typeof size === "number") {
  338. return Math.ceil(size * ratio * precision) / precision;
  339. }
  340. if (typeof size !== "string") {
  341. return size;
  342. }
  343. var oldParts = size.split(unitsSplit);
  344. if (oldParts === null || !oldParts.length) {
  345. return size;
  346. }
  347. var newParts = [];
  348. var code = oldParts.shift();
  349. var isNumber = unitsTest.test(code);
  350. while (true) {
  351. if (isNumber) {
  352. var num = parseFloat(code);
  353. if (isNaN(num)) {
  354. newParts.push(code);
  355. } else {
  356. newParts.push(Math.ceil(num * ratio * precision) / precision);
  357. }
  358. } else {
  359. newParts.push(code);
  360. }
  361. code = oldParts.shift();
  362. if (code === void 0) {
  363. return newParts.join("");
  364. }
  365. isNumber = !isNumber;
  366. }
  367. }
  368. var isUnsetKeyword = function (value) { return value === "unset" || value === "undefined" || value === "none"; };
  369. function iconToSVG(icon, customisations) {
  370. var fullIcon = Object.assign({}, defaultIconProps,
  371. icon);
  372. var fullCustomisations = Object.assign({}, defaultIconCustomisations,
  373. customisations);
  374. var box = {
  375. left: fullIcon.left,
  376. top: fullIcon.top,
  377. width: fullIcon.width,
  378. height: fullIcon.height
  379. };
  380. var body = fullIcon.body;
  381. [fullIcon, fullCustomisations].forEach(function (props) {
  382. var transformations = [];
  383. var hFlip = props.hFlip;
  384. var vFlip = props.vFlip;
  385. var rotation = props.rotate;
  386. if (hFlip) {
  387. if (vFlip) {
  388. rotation += 2;
  389. } else {
  390. transformations.push(
  391. "translate(" + (box.width + box.left).toString() + " " + (0 - box.top).toString() + ")"
  392. );
  393. transformations.push("scale(-1 1)");
  394. box.top = box.left = 0;
  395. }
  396. } else if (vFlip) {
  397. transformations.push(
  398. "translate(" + (0 - box.left).toString() + " " + (box.height + box.top).toString() + ")"
  399. );
  400. transformations.push("scale(1 -1)");
  401. box.top = box.left = 0;
  402. }
  403. var tempValue;
  404. if (rotation < 0) {
  405. rotation -= Math.floor(rotation / 4) * 4;
  406. }
  407. rotation = rotation % 4;
  408. switch (rotation) {
  409. case 1:
  410. tempValue = box.height / 2 + box.top;
  411. transformations.unshift(
  412. "rotate(90 " + tempValue.toString() + " " + tempValue.toString() + ")"
  413. );
  414. break;
  415. case 2:
  416. transformations.unshift(
  417. "rotate(180 " + (box.width / 2 + box.left).toString() + " " + (box.height / 2 + box.top).toString() + ")"
  418. );
  419. break;
  420. case 3:
  421. tempValue = box.width / 2 + box.left;
  422. transformations.unshift(
  423. "rotate(-90 " + tempValue.toString() + " " + tempValue.toString() + ")"
  424. );
  425. break;
  426. }
  427. if (rotation % 2 === 1) {
  428. if (box.left !== box.top) {
  429. tempValue = box.left;
  430. box.left = box.top;
  431. box.top = tempValue;
  432. }
  433. if (box.width !== box.height) {
  434. tempValue = box.width;
  435. box.width = box.height;
  436. box.height = tempValue;
  437. }
  438. }
  439. if (transformations.length) {
  440. body = '<g transform="' + transformations.join(" ") + '">' + body + "</g>";
  441. }
  442. });
  443. var customisationsWidth = fullCustomisations.width;
  444. var customisationsHeight = fullCustomisations.height;
  445. var boxWidth = box.width;
  446. var boxHeight = box.height;
  447. var width;
  448. var height;
  449. if (customisationsWidth === null) {
  450. height = customisationsHeight === null ? "1em" : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
  451. width = calculateSize(height, boxWidth / boxHeight);
  452. } else {
  453. width = customisationsWidth === "auto" ? boxWidth : customisationsWidth;
  454. height = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
  455. }
  456. var attributes = {};
  457. var setAttr = function (prop, value) {
  458. if (!isUnsetKeyword(value)) {
  459. attributes[prop] = value.toString();
  460. }
  461. };
  462. setAttr("width", width);
  463. setAttr("height", height);
  464. attributes.viewBox = box.left.toString() + " " + box.top.toString() + " " + boxWidth.toString() + " " + boxHeight.toString();
  465. return {
  466. attributes: attributes,
  467. body: body
  468. };
  469. }
  470. var regex = /\sid="(\S+)"/g;
  471. var randomPrefix = "IconifyId" + Date.now().toString(16) + (Math.random() * 16777216 | 0).toString(16);
  472. var counter = 0;
  473. function replaceIDs(body, prefix) {
  474. if ( prefix === void 0 ) prefix = randomPrefix;
  475. var ids = [];
  476. var match;
  477. while (match = regex.exec(body)) {
  478. ids.push(match[1]);
  479. }
  480. if (!ids.length) {
  481. return body;
  482. }
  483. var suffix = "suffix" + (Math.random() * 16777216 | Date.now()).toString(16);
  484. ids.forEach(function (id) {
  485. var newID = typeof prefix === "function" ? prefix(id) : prefix + (counter++).toString();
  486. var escapedID = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
  487. body = body.replace(
  488. new RegExp('([#;"])(' + escapedID + ')([")]|\\.[a-z])', "g"),
  489. "$1" + newID + suffix + "$3"
  490. );
  491. });
  492. body = body.replace(new RegExp(suffix, "g"), "");
  493. return body;
  494. }
  495. function mergeCustomisations(defaults, item) {
  496. var result = Object.assign({}, defaults);
  497. for (var key in item) {
  498. var value = item[key];
  499. var valueType = typeof value;
  500. if (key in defaultIconSizeCustomisations) {
  501. if (value === null || value && (valueType === "string" || valueType === "number")) {
  502. result[key] = value;
  503. }
  504. } else if (valueType === typeof result[key]) {
  505. result[key] = key === "rotate" ? value % 4 : value;
  506. }
  507. }
  508. return result;
  509. }
  510. var defaultExtendedIconCustomisations = Object.assign({}, defaultIconCustomisations,
  511. {inline: false});
  512. /**
  513. * Class names
  514. */
  515. var blockClass = 'iconify';
  516. var inlineClass = 'iconify-inline';
  517. /**
  518. * Names of properties to add to nodes
  519. */
  520. var elementDataProperty = ('iconifyData' + Date.now());
  521. /**
  522. * List of root nodes
  523. */
  524. var nodes = [];
  525. /**
  526. * Find node
  527. */
  528. function findRootNode(node) {
  529. for (var i = 0; i < nodes.length; i++) {
  530. var item = nodes[i];
  531. var root = typeof item.node === 'function' ? item.node() : item.node;
  532. if (root === node) {
  533. return item;
  534. }
  535. }
  536. }
  537. /**
  538. * Add extra root node
  539. */
  540. function addRootNode(root, autoRemove) {
  541. if ( autoRemove === void 0 ) autoRemove = false;
  542. var node = findRootNode(root);
  543. if (node) {
  544. // Node already exist: switch type if needed
  545. if (node.temporary) {
  546. node.temporary = autoRemove;
  547. }
  548. return node;
  549. }
  550. // Create item, add it to list
  551. node = {
  552. node: root,
  553. temporary: autoRemove,
  554. };
  555. nodes.push(node);
  556. return node;
  557. }
  558. /**
  559. * Add document.body node
  560. */
  561. function addBodyNode() {
  562. if (document.documentElement) {
  563. return addRootNode(document.documentElement);
  564. }
  565. nodes.push({
  566. node: function () {
  567. return document.documentElement;
  568. },
  569. });
  570. }
  571. /**
  572. * Remove root node
  573. */
  574. function removeRootNode(root) {
  575. nodes = nodes.filter(function (node) { return root !== node &&
  576. root !== (typeof node.node === 'function' ? node.node() : node.node); });
  577. }
  578. /**
  579. * Get list of root nodes
  580. */
  581. function listRootNodes() {
  582. return nodes;
  583. }
  584. /**
  585. * Execute function when DOM is ready
  586. */
  587. function onReady(callback) {
  588. var doc = document;
  589. if (doc.readyState && doc.readyState !== 'loading') {
  590. callback();
  591. }
  592. else {
  593. doc.addEventListener('DOMContentLoaded', callback);
  594. }
  595. }
  596. /**
  597. * Callback
  598. */
  599. var callback = null;
  600. /**
  601. * Parameters for mutation observer
  602. */
  603. var observerParams = {
  604. childList: true,
  605. subtree: true,
  606. attributes: true,
  607. };
  608. /**
  609. * Queue DOM scan
  610. */
  611. function queueScan(node) {
  612. if (!node.observer) {
  613. return;
  614. }
  615. var observer = node.observer;
  616. if (!observer.pendingScan) {
  617. observer.pendingScan = setTimeout(function () {
  618. delete observer.pendingScan;
  619. if (callback) {
  620. callback(node);
  621. }
  622. });
  623. }
  624. }
  625. /**
  626. * Check mutations for added nodes
  627. */
  628. function checkMutations(node, mutations) {
  629. if (!node.observer) {
  630. return;
  631. }
  632. var observer = node.observer;
  633. if (!observer.pendingScan) {
  634. for (var i = 0; i < mutations.length; i++) {
  635. var item = mutations[i];
  636. if (
  637. // Check for added nodes
  638. (item.addedNodes && item.addedNodes.length > 0) ||
  639. // Check for icon or placeholder with modified attributes
  640. (item.type === 'attributes' &&
  641. item.target[elementDataProperty] !==
  642. void 0)) {
  643. if (!observer.paused) {
  644. queueScan(node);
  645. }
  646. return;
  647. }
  648. }
  649. }
  650. }
  651. /**
  652. * Start/resume observer
  653. */
  654. function continueObserving(node, root) {
  655. node.observer.instance.observe(root, observerParams);
  656. }
  657. /**
  658. * Start mutation observer
  659. */
  660. function startObserver(node) {
  661. var observer = node.observer;
  662. if (observer && observer.instance) {
  663. // Already started
  664. return;
  665. }
  666. var root = typeof node.node === 'function' ? node.node() : node.node;
  667. if (!root || !window) {
  668. // document.body is not available yet or window is missing
  669. return;
  670. }
  671. if (!observer) {
  672. observer = {
  673. paused: 0,
  674. };
  675. node.observer = observer;
  676. }
  677. // Create new instance, observe
  678. observer.instance = new window.MutationObserver(checkMutations.bind(null, node));
  679. continueObserving(node, root);
  680. // Scan immediately
  681. if (!observer.paused) {
  682. queueScan(node);
  683. }
  684. }
  685. /**
  686. * Start all observers
  687. */
  688. function startObservers() {
  689. listRootNodes().forEach(startObserver);
  690. }
  691. /**
  692. * Stop observer
  693. */
  694. function stopObserver(node) {
  695. if (!node.observer) {
  696. return;
  697. }
  698. var observer = node.observer;
  699. // Stop scan
  700. if (observer.pendingScan) {
  701. clearTimeout(observer.pendingScan);
  702. delete observer.pendingScan;
  703. }
  704. // Disconnect observer
  705. if (observer.instance) {
  706. observer.instance.disconnect();
  707. delete observer.instance;
  708. }
  709. }
  710. /**
  711. * Start observer when DOM is ready
  712. */
  713. function initObserver(cb) {
  714. var isRestart = callback !== null;
  715. if (callback !== cb) {
  716. // Change callback and stop all pending observers
  717. callback = cb;
  718. if (isRestart) {
  719. listRootNodes().forEach(stopObserver);
  720. }
  721. }
  722. if (isRestart) {
  723. // Restart instances
  724. startObservers();
  725. return;
  726. }
  727. // Start observers when document is ready
  728. onReady(startObservers);
  729. }
  730. /**
  731. * Pause observing node
  732. */
  733. function pauseObservingNode(node) {
  734. (node ? [node] : listRootNodes()).forEach(function (node) {
  735. if (!node.observer) {
  736. node.observer = {
  737. paused: 1,
  738. };
  739. return;
  740. }
  741. var observer = node.observer;
  742. observer.paused++;
  743. if (observer.paused > 1 || !observer.instance) {
  744. return;
  745. }
  746. // Disconnect observer
  747. var instance = observer.instance;
  748. // checkMutations(node, instance.takeRecords());
  749. instance.disconnect();
  750. });
  751. }
  752. /**
  753. * Pause observer
  754. */
  755. function pauseObserver(root) {
  756. if (root) {
  757. var node = findRootNode(root);
  758. if (node) {
  759. pauseObservingNode(node);
  760. }
  761. }
  762. else {
  763. pauseObservingNode();
  764. }
  765. }
  766. /**
  767. * Resume observer
  768. */
  769. function resumeObservingNode(observer) {
  770. (observer ? [observer] : listRootNodes()).forEach(function (node) {
  771. if (!node.observer) {
  772. // Start observer
  773. startObserver(node);
  774. return;
  775. }
  776. var observer = node.observer;
  777. if (observer.paused) {
  778. observer.paused--;
  779. if (!observer.paused) {
  780. // Start / resume
  781. var root = typeof node.node === 'function' ? node.node() : node.node;
  782. if (!root) {
  783. return;
  784. }
  785. else if (observer.instance) {
  786. continueObserving(node, root);
  787. }
  788. else {
  789. startObserver(node);
  790. }
  791. }
  792. }
  793. });
  794. }
  795. /**
  796. * Resume observer
  797. */
  798. function resumeObserver(root) {
  799. if (root) {
  800. var node = findRootNode(root);
  801. if (node) {
  802. resumeObservingNode(node);
  803. }
  804. }
  805. else {
  806. resumeObservingNode();
  807. }
  808. }
  809. /**
  810. * Observe node
  811. */
  812. function observe(root, autoRemove) {
  813. if ( autoRemove === void 0 ) autoRemove = false;
  814. var node = addRootNode(root, autoRemove);
  815. startObserver(node);
  816. return node;
  817. }
  818. /**
  819. * Remove observed node
  820. */
  821. function stopObserving(root) {
  822. var node = findRootNode(root);
  823. if (node) {
  824. stopObserver(node);
  825. removeRootNode(root);
  826. }
  827. }
  828. function sortIcons(icons) {
  829. var result = {
  830. loaded: [],
  831. missing: [],
  832. pending: []
  833. };
  834. var storage = /* @__PURE__ */ Object.create(null);
  835. icons.sort(function (a, b) {
  836. if (a.provider !== b.provider) {
  837. return a.provider.localeCompare(b.provider);
  838. }
  839. if (a.prefix !== b.prefix) {
  840. return a.prefix.localeCompare(b.prefix);
  841. }
  842. return a.name.localeCompare(b.name);
  843. });
  844. var lastIcon = {
  845. provider: "",
  846. prefix: "",
  847. name: ""
  848. };
  849. icons.forEach(function (icon) {
  850. if (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) {
  851. return;
  852. }
  853. lastIcon = icon;
  854. var provider = icon.provider;
  855. var prefix = icon.prefix;
  856. var name = icon.name;
  857. var providerStorage = storage[provider] || (storage[provider] = /* @__PURE__ */ Object.create(null));
  858. var localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix));
  859. var list;
  860. if (name in localStorage.icons) {
  861. list = result.loaded;
  862. } else if (prefix === "" || localStorage.missing.has(name)) {
  863. list = result.missing;
  864. } else {
  865. list = result.pending;
  866. }
  867. var item = {
  868. provider: provider,
  869. prefix: prefix,
  870. name: name
  871. };
  872. list.push(item);
  873. });
  874. return result;
  875. }
  876. function removeCallback(storages, id) {
  877. storages.forEach(function (storage) {
  878. var items = storage.loaderCallbacks;
  879. if (items) {
  880. storage.loaderCallbacks = items.filter(function (row) { return row.id !== id; });
  881. }
  882. });
  883. }
  884. function updateCallbacks(storage) {
  885. if (!storage.pendingCallbacksFlag) {
  886. storage.pendingCallbacksFlag = true;
  887. setTimeout(function () {
  888. storage.pendingCallbacksFlag = false;
  889. var items = storage.loaderCallbacks ? storage.loaderCallbacks.slice(0) : [];
  890. if (!items.length) {
  891. return;
  892. }
  893. var hasPending = false;
  894. var provider = storage.provider;
  895. var prefix = storage.prefix;
  896. items.forEach(function (item) {
  897. var icons = item.icons;
  898. var oldLength = icons.pending.length;
  899. icons.pending = icons.pending.filter(function (icon) {
  900. if (icon.prefix !== prefix) {
  901. return true;
  902. }
  903. var name = icon.name;
  904. if (storage.icons[name]) {
  905. icons.loaded.push({
  906. provider: provider,
  907. prefix: prefix,
  908. name: name
  909. });
  910. } else if (storage.missing.has(name)) {
  911. icons.missing.push({
  912. provider: provider,
  913. prefix: prefix,
  914. name: name
  915. });
  916. } else {
  917. hasPending = true;
  918. return true;
  919. }
  920. return false;
  921. });
  922. if (icons.pending.length !== oldLength) {
  923. if (!hasPending) {
  924. removeCallback([storage], item.id);
  925. }
  926. item.callback(
  927. icons.loaded.slice(0),
  928. icons.missing.slice(0),
  929. icons.pending.slice(0),
  930. item.abort
  931. );
  932. }
  933. });
  934. });
  935. }
  936. }
  937. var idCounter = 0;
  938. function storeCallback(callback, icons, pendingSources) {
  939. var id = idCounter++;
  940. var abort = removeCallback.bind(null, pendingSources, id);
  941. if (!icons.pending.length) {
  942. return abort;
  943. }
  944. var item = {
  945. id: id,
  946. icons: icons,
  947. callback: callback,
  948. abort: abort
  949. };
  950. pendingSources.forEach(function (storage) {
  951. (storage.loaderCallbacks || (storage.loaderCallbacks = [])).push(item);
  952. });
  953. return abort;
  954. }
  955. var storage = /* @__PURE__ */ Object.create(null);
  956. function getAPIModule(provider) {
  957. return storage[provider] || storage[""];
  958. }
  959. function listToIcons(list, validate, simpleNames) {
  960. if ( validate === void 0 ) validate = true;
  961. if ( simpleNames === void 0 ) simpleNames = false;
  962. var result = [];
  963. list.forEach(function (item) {
  964. var icon = typeof item === "string" ? stringToIcon(item, validate, simpleNames) : item;
  965. if (icon) {
  966. result.push(icon);
  967. }
  968. });
  969. return result;
  970. }
  971. // src/config.ts
  972. var defaultConfig = {
  973. resources: [],
  974. index: 0,
  975. timeout: 2e3,
  976. rotate: 750,
  977. random: false,
  978. dataAfterTimeout: false
  979. };
  980. // src/query.ts
  981. function sendQuery(config, payload, query, done) {
  982. var resourcesCount = config.resources.length;
  983. var startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index;
  984. var resources;
  985. if (config.random) {
  986. var list = config.resources.slice(0);
  987. resources = [];
  988. while (list.length > 1) {
  989. var nextIndex = Math.floor(Math.random() * list.length);
  990. resources.push(list[nextIndex]);
  991. list = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1));
  992. }
  993. resources = resources.concat(list);
  994. } else {
  995. resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex));
  996. }
  997. var startTime = Date.now();
  998. var status = "pending";
  999. var queriesSent = 0;
  1000. var lastError;
  1001. var timer = null;
  1002. var queue = [];
  1003. var doneCallbacks = [];
  1004. if (typeof done === "function") {
  1005. doneCallbacks.push(done);
  1006. }
  1007. function resetTimer() {
  1008. if (timer) {
  1009. clearTimeout(timer);
  1010. timer = null;
  1011. }
  1012. }
  1013. function abort() {
  1014. if (status === "pending") {
  1015. status = "aborted";
  1016. }
  1017. resetTimer();
  1018. queue.forEach(function (item) {
  1019. if (item.status === "pending") {
  1020. item.status = "aborted";
  1021. }
  1022. });
  1023. queue = [];
  1024. }
  1025. function subscribe(callback, overwrite) {
  1026. if (overwrite) {
  1027. doneCallbacks = [];
  1028. }
  1029. if (typeof callback === "function") {
  1030. doneCallbacks.push(callback);
  1031. }
  1032. }
  1033. function getQueryStatus() {
  1034. return {
  1035. startTime: startTime,
  1036. payload: payload,
  1037. status: status,
  1038. queriesSent: queriesSent,
  1039. queriesPending: queue.length,
  1040. subscribe: subscribe,
  1041. abort: abort
  1042. };
  1043. }
  1044. function failQuery() {
  1045. status = "failed";
  1046. doneCallbacks.forEach(function (callback) {
  1047. callback(void 0, lastError);
  1048. });
  1049. }
  1050. function clearQueue() {
  1051. queue.forEach(function (item) {
  1052. if (item.status === "pending") {
  1053. item.status = "aborted";
  1054. }
  1055. });
  1056. queue = [];
  1057. }
  1058. function moduleResponse(item, response, data) {
  1059. var isError = response !== "success";
  1060. queue = queue.filter(function (queued) { return queued !== item; });
  1061. switch (status) {
  1062. case "pending":
  1063. break;
  1064. case "failed":
  1065. if (isError || !config.dataAfterTimeout) {
  1066. return;
  1067. }
  1068. break;
  1069. default:
  1070. return;
  1071. }
  1072. if (response === "abort") {
  1073. lastError = data;
  1074. failQuery();
  1075. return;
  1076. }
  1077. if (isError) {
  1078. lastError = data;
  1079. if (!queue.length) {
  1080. if (!resources.length) {
  1081. failQuery();
  1082. } else {
  1083. execNext();
  1084. }
  1085. }
  1086. return;
  1087. }
  1088. resetTimer();
  1089. clearQueue();
  1090. if (!config.random) {
  1091. var index = config.resources.indexOf(item.resource);
  1092. if (index !== -1 && index !== config.index) {
  1093. config.index = index;
  1094. }
  1095. }
  1096. status = "completed";
  1097. doneCallbacks.forEach(function (callback) {
  1098. callback(data);
  1099. });
  1100. }
  1101. function execNext() {
  1102. if (status !== "pending") {
  1103. return;
  1104. }
  1105. resetTimer();
  1106. var resource = resources.shift();
  1107. if (resource === void 0) {
  1108. if (queue.length) {
  1109. timer = setTimeout(function () {
  1110. resetTimer();
  1111. if (status === "pending") {
  1112. clearQueue();
  1113. failQuery();
  1114. }
  1115. }, config.timeout);
  1116. return;
  1117. }
  1118. failQuery();
  1119. return;
  1120. }
  1121. var item = {
  1122. status: "pending",
  1123. resource: resource,
  1124. callback: function (status2, data) {
  1125. moduleResponse(item, status2, data);
  1126. }
  1127. };
  1128. queue.push(item);
  1129. queriesSent++;
  1130. timer = setTimeout(execNext, config.rotate);
  1131. query(resource, payload, item.callback);
  1132. }
  1133. setTimeout(execNext);
  1134. return getQueryStatus;
  1135. }
  1136. // src/index.ts
  1137. function initRedundancy(cfg) {
  1138. var config = Object.assign({}, defaultConfig,
  1139. cfg);
  1140. var queries = [];
  1141. function cleanup() {
  1142. queries = queries.filter(function (item) { return item().status === "pending"; });
  1143. }
  1144. function query(payload, queryCallback, doneCallback) {
  1145. var query2 = sendQuery(
  1146. config,
  1147. payload,
  1148. queryCallback,
  1149. function (data, error) {
  1150. cleanup();
  1151. if (doneCallback) {
  1152. doneCallback(data, error);
  1153. }
  1154. }
  1155. );
  1156. queries.push(query2);
  1157. return query2;
  1158. }
  1159. function find(callback) {
  1160. return queries.find(function (value) {
  1161. return callback(value);
  1162. }) || null;
  1163. }
  1164. var instance = {
  1165. query: query,
  1166. find: find,
  1167. setIndex: function (index) {
  1168. config.index = index;
  1169. },
  1170. getIndex: function () { return config.index; },
  1171. cleanup: cleanup
  1172. };
  1173. return instance;
  1174. }
  1175. function createAPIConfig(source) {
  1176. var resources;
  1177. if (typeof source.resources === "string") {
  1178. resources = [source.resources];
  1179. } else {
  1180. resources = source.resources;
  1181. if (!(resources instanceof Array) || !resources.length) {
  1182. return null;
  1183. }
  1184. }
  1185. var result = {
  1186. resources: resources,
  1187. path: source.path || "/",
  1188. maxURL: source.maxURL || 500,
  1189. rotate: source.rotate || 750,
  1190. timeout: source.timeout || 5e3,
  1191. random: source.random === true,
  1192. index: source.index || 0,
  1193. dataAfterTimeout: source.dataAfterTimeout !== false
  1194. };
  1195. return result;
  1196. }
  1197. var configStorage = /* @__PURE__ */ Object.create(null);
  1198. var fallBackAPISources = [
  1199. "https://api.simplesvg.com",
  1200. "https://api.unisvg.com"
  1201. ];
  1202. var fallBackAPI = [];
  1203. while (fallBackAPISources.length > 0) {
  1204. if (fallBackAPISources.length === 1) {
  1205. fallBackAPI.push(fallBackAPISources.shift());
  1206. } else {
  1207. if (Math.random() > 0.5) {
  1208. fallBackAPI.push(fallBackAPISources.shift());
  1209. } else {
  1210. fallBackAPI.push(fallBackAPISources.pop());
  1211. }
  1212. }
  1213. }
  1214. configStorage[""] = createAPIConfig({
  1215. resources: ["https://api.iconify.design"].concat(fallBackAPI)
  1216. });
  1217. function getAPIConfig(provider) {
  1218. return configStorage[provider];
  1219. }
  1220. function emptyCallback$1() {
  1221. }
  1222. var redundancyCache = /* @__PURE__ */ Object.create(null);
  1223. function getRedundancyCache(provider) {
  1224. if (!redundancyCache[provider]) {
  1225. var config = getAPIConfig(provider);
  1226. if (!config) {
  1227. return;
  1228. }
  1229. var redundancy = initRedundancy(config);
  1230. var cachedReundancy = {
  1231. config: config,
  1232. redundancy: redundancy
  1233. };
  1234. redundancyCache[provider] = cachedReundancy;
  1235. }
  1236. return redundancyCache[provider];
  1237. }
  1238. function sendAPIQuery(target, query, callback) {
  1239. var redundancy;
  1240. var send;
  1241. if (typeof target === "string") {
  1242. var api = getAPIModule(target);
  1243. if (!api) {
  1244. callback(void 0, 424);
  1245. return emptyCallback$1;
  1246. }
  1247. send = api.send;
  1248. var cached = getRedundancyCache(target);
  1249. if (cached) {
  1250. redundancy = cached.redundancy;
  1251. }
  1252. } else {
  1253. var config = createAPIConfig(target);
  1254. if (config) {
  1255. redundancy = initRedundancy(config);
  1256. var moduleKey = target.resources ? target.resources[0] : "";
  1257. var api$1 = getAPIModule(moduleKey);
  1258. if (api$1) {
  1259. send = api$1.send;
  1260. }
  1261. }
  1262. }
  1263. if (!redundancy || !send) {
  1264. callback(void 0, 424);
  1265. return emptyCallback$1;
  1266. }
  1267. return redundancy.query(query, send, callback)().abort;
  1268. }
  1269. var browserCacheVersion = "iconify2";
  1270. var browserCachePrefix = "iconify";
  1271. var browserCacheCountKey = browserCachePrefix + "-count";
  1272. var browserCacheVersionKey = browserCachePrefix + "-version";
  1273. var browserStorageHour = 36e5;
  1274. var browserStorageCacheExpiration = 168;
  1275. function getStoredItem(func, key) {
  1276. try {
  1277. return func.getItem(key);
  1278. } catch (err) {
  1279. }
  1280. }
  1281. function setStoredItem(func, key, value) {
  1282. try {
  1283. func.setItem(key, value);
  1284. return true;
  1285. } catch (err) {
  1286. }
  1287. }
  1288. function removeStoredItem(func, key) {
  1289. try {
  1290. func.removeItem(key);
  1291. } catch (err) {
  1292. }
  1293. }
  1294. function setBrowserStorageItemsCount(storage, value) {
  1295. return setStoredItem(storage, browserCacheCountKey, value.toString());
  1296. }
  1297. function getBrowserStorageItemsCount(storage) {
  1298. return parseInt(getStoredItem(storage, browserCacheCountKey)) || 0;
  1299. }
  1300. var browserStorageConfig = {
  1301. local: true,
  1302. session: true
  1303. };
  1304. var browserStorageEmptyItems = {
  1305. local: /* @__PURE__ */ new Set(),
  1306. session: /* @__PURE__ */ new Set()
  1307. };
  1308. var browserStorageStatus = false;
  1309. function setBrowserStorageStatus(status) {
  1310. browserStorageStatus = status;
  1311. }
  1312. var _window$1 = typeof window === "undefined" ? {} : window;
  1313. function getBrowserStorage(key) {
  1314. var attr = key + "Storage";
  1315. try {
  1316. if (_window$1 && _window$1[attr] && typeof _window$1[attr].length === "number") {
  1317. return _window$1[attr];
  1318. }
  1319. } catch (err) {
  1320. }
  1321. browserStorageConfig[key] = false;
  1322. }
  1323. function iterateBrowserStorage(key, callback) {
  1324. var func = getBrowserStorage(key);
  1325. if (!func) {
  1326. return;
  1327. }
  1328. var version = getStoredItem(func, browserCacheVersionKey);
  1329. if (version !== browserCacheVersion) {
  1330. if (version) {
  1331. var total2 = getBrowserStorageItemsCount(func);
  1332. for (var i = 0; i < total2; i++) {
  1333. removeStoredItem(func, browserCachePrefix + i.toString());
  1334. }
  1335. }
  1336. setStoredItem(func, browserCacheVersionKey, browserCacheVersion);
  1337. setBrowserStorageItemsCount(func, 0);
  1338. return;
  1339. }
  1340. var minTime = Math.floor(Date.now() / browserStorageHour) - browserStorageCacheExpiration;
  1341. var parseItem = function (index) {
  1342. var name = browserCachePrefix + index.toString();
  1343. var item = getStoredItem(func, name);
  1344. if (typeof item !== "string") {
  1345. return;
  1346. }
  1347. try {
  1348. var data = JSON.parse(item);
  1349. if (typeof data === "object" && typeof data.cached === "number" && data.cached > minTime && typeof data.provider === "string" && typeof data.data === "object" && typeof data.data.prefix === "string" && callback(data, index)) {
  1350. return true;
  1351. }
  1352. } catch (err) {
  1353. }
  1354. removeStoredItem(func, name);
  1355. };
  1356. var total = getBrowserStorageItemsCount(func);
  1357. for (var i$1 = total - 1; i$1 >= 0; i$1--) {
  1358. if (!parseItem(i$1)) {
  1359. if (i$1 === total - 1) {
  1360. total--;
  1361. setBrowserStorageItemsCount(func, total);
  1362. } else {
  1363. browserStorageEmptyItems[key].add(i$1);
  1364. }
  1365. }
  1366. }
  1367. }
  1368. function initBrowserStorage() {
  1369. if (browserStorageStatus) {
  1370. return;
  1371. }
  1372. setBrowserStorageStatus(true);
  1373. for (var key in browserStorageConfig) {
  1374. iterateBrowserStorage(key, function (item) {
  1375. var iconSet = item.data;
  1376. var provider = item.provider;
  1377. var prefix = iconSet.prefix;
  1378. var storage = getStorage(
  1379. provider,
  1380. prefix
  1381. );
  1382. if (!addIconSet(storage, iconSet).length) {
  1383. return false;
  1384. }
  1385. var lastModified = iconSet.lastModified || -1;
  1386. storage.lastModifiedCached = storage.lastModifiedCached ? Math.min(storage.lastModifiedCached, lastModified) : lastModified;
  1387. return true;
  1388. });
  1389. }
  1390. }
  1391. function updateLastModified(storage, lastModified) {
  1392. var lastValue = storage.lastModifiedCached;
  1393. if (lastValue && lastValue >= lastModified) {
  1394. return lastValue === lastModified;
  1395. }
  1396. storage.lastModifiedCached = lastModified;
  1397. if (lastValue) {
  1398. for (var key in browserStorageConfig) {
  1399. iterateBrowserStorage(key, function (item) {
  1400. var iconSet = item.data;
  1401. return item.provider !== storage.provider || iconSet.prefix !== storage.prefix || iconSet.lastModified === lastModified;
  1402. });
  1403. }
  1404. }
  1405. return true;
  1406. }
  1407. function storeInBrowserStorage(storage, data) {
  1408. if (!browserStorageStatus) {
  1409. initBrowserStorage();
  1410. }
  1411. function store(key) {
  1412. var func;
  1413. if (!browserStorageConfig[key] || !(func = getBrowserStorage(key))) {
  1414. return;
  1415. }
  1416. var set = browserStorageEmptyItems[key];
  1417. var index;
  1418. if (set.size) {
  1419. set.delete(index = Array.from(set).shift());
  1420. } else {
  1421. index = getBrowserStorageItemsCount(func);
  1422. if (!setBrowserStorageItemsCount(func, index + 1)) {
  1423. return;
  1424. }
  1425. }
  1426. var item = {
  1427. cached: Math.floor(Date.now() / browserStorageHour),
  1428. provider: storage.provider,
  1429. data: data
  1430. };
  1431. return setStoredItem(
  1432. func,
  1433. browserCachePrefix + index.toString(),
  1434. JSON.stringify(item)
  1435. );
  1436. }
  1437. if (data.lastModified && !updateLastModified(storage, data.lastModified)) {
  1438. return;
  1439. }
  1440. if (!Object.keys(data.icons).length) {
  1441. return;
  1442. }
  1443. if (data.not_found) {
  1444. data = Object.assign({}, data);
  1445. delete data.not_found;
  1446. }
  1447. if (!store("local")) {
  1448. store("session");
  1449. }
  1450. }
  1451. function emptyCallback() {
  1452. }
  1453. function loadedNewIcons(storage) {
  1454. if (!storage.iconsLoaderFlag) {
  1455. storage.iconsLoaderFlag = true;
  1456. setTimeout(function () {
  1457. storage.iconsLoaderFlag = false;
  1458. updateCallbacks(storage);
  1459. });
  1460. }
  1461. }
  1462. function loadNewIcons(storage, icons) {
  1463. if (!storage.iconsToLoad) {
  1464. storage.iconsToLoad = icons;
  1465. } else {
  1466. storage.iconsToLoad = storage.iconsToLoad.concat(icons).sort();
  1467. }
  1468. if (!storage.iconsQueueFlag) {
  1469. storage.iconsQueueFlag = true;
  1470. setTimeout(function () {
  1471. storage.iconsQueueFlag = false;
  1472. var provider = storage.provider;
  1473. var prefix = storage.prefix;
  1474. var icons2 = storage.iconsToLoad;
  1475. delete storage.iconsToLoad;
  1476. var api;
  1477. if (!icons2 || !(api = getAPIModule(provider))) {
  1478. return;
  1479. }
  1480. var params = api.prepare(provider, prefix, icons2);
  1481. params.forEach(function (item) {
  1482. sendAPIQuery(provider, item, function (data) {
  1483. if (typeof data !== "object") {
  1484. item.icons.forEach(function (name) {
  1485. storage.missing.add(name);
  1486. });
  1487. } else {
  1488. try {
  1489. var parsed = addIconSet(
  1490. storage,
  1491. data
  1492. );
  1493. if (!parsed.length) {
  1494. return;
  1495. }
  1496. var pending = storage.pendingIcons;
  1497. if (pending) {
  1498. parsed.forEach(function (name) {
  1499. pending.delete(name);
  1500. });
  1501. }
  1502. storeInBrowserStorage(storage, data);
  1503. } catch (err) {
  1504. console.error(err);
  1505. }
  1506. }
  1507. loadedNewIcons(storage);
  1508. });
  1509. });
  1510. });
  1511. }
  1512. }
  1513. var isPending = function (icon) {
  1514. var storage = getStorage(
  1515. icon.provider,
  1516. icon.prefix
  1517. );
  1518. var pending = storage.pendingIcons;
  1519. return !!(pending && pending.has(icon.name));
  1520. };
  1521. var loadIcons = function (icons, callback) {
  1522. var cleanedIcons = listToIcons(icons, true, allowSimpleNames());
  1523. var sortedIcons = sortIcons(cleanedIcons);
  1524. if (!sortedIcons.pending.length) {
  1525. var callCallback = true;
  1526. if (callback) {
  1527. setTimeout(function () {
  1528. if (callCallback) {
  1529. callback(
  1530. sortedIcons.loaded,
  1531. sortedIcons.missing,
  1532. sortedIcons.pending,
  1533. emptyCallback
  1534. );
  1535. }
  1536. });
  1537. }
  1538. return function () {
  1539. callCallback = false;
  1540. };
  1541. }
  1542. var newIcons = /* @__PURE__ */ Object.create(null);
  1543. var sources = [];
  1544. var lastProvider, lastPrefix;
  1545. sortedIcons.pending.forEach(function (icon) {
  1546. var provider = icon.provider;
  1547. var prefix = icon.prefix;
  1548. if (prefix === lastPrefix && provider === lastProvider) {
  1549. return;
  1550. }
  1551. lastProvider = provider;
  1552. lastPrefix = prefix;
  1553. sources.push(getStorage(provider, prefix));
  1554. var providerNewIcons = newIcons[provider] || (newIcons[provider] = /* @__PURE__ */ Object.create(null));
  1555. if (!providerNewIcons[prefix]) {
  1556. providerNewIcons[prefix] = [];
  1557. }
  1558. });
  1559. sortedIcons.pending.forEach(function (icon) {
  1560. var provider = icon.provider;
  1561. var prefix = icon.prefix;
  1562. var name = icon.name;
  1563. var storage = getStorage(provider, prefix);
  1564. var pendingQueue = storage.pendingIcons || (storage.pendingIcons = /* @__PURE__ */ new Set());
  1565. if (!pendingQueue.has(name)) {
  1566. pendingQueue.add(name);
  1567. newIcons[provider][prefix].push(name);
  1568. }
  1569. });
  1570. sources.forEach(function (storage) {
  1571. var provider = storage.provider;
  1572. var prefix = storage.prefix;
  1573. if (newIcons[provider][prefix].length) {
  1574. loadNewIcons(storage, newIcons[provider][prefix]);
  1575. }
  1576. });
  1577. return callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback;
  1578. };
  1579. /**
  1580. * Compare props
  1581. */
  1582. function propsChanged(props1, props2) {
  1583. if (props1.name !== props2.name || props1.mode !== props2.mode) {
  1584. return true;
  1585. }
  1586. var customisations1 = props1.customisations;
  1587. var customisations2 = props2.customisations;
  1588. for (var key in defaultExtendedIconCustomisations) {
  1589. if (customisations1[key] !== customisations2[key]) {
  1590. return true;
  1591. }
  1592. }
  1593. return false;
  1594. }
  1595. function rotateFromString(value, defaultValue) {
  1596. if ( defaultValue === void 0 ) defaultValue = 0;
  1597. var units = value.replace(/^-?[0-9.]*/, "");
  1598. function cleanup(value2) {
  1599. while (value2 < 0) {
  1600. value2 += 4;
  1601. }
  1602. return value2 % 4;
  1603. }
  1604. if (units === "") {
  1605. var num = parseInt(value);
  1606. return isNaN(num) ? 0 : cleanup(num);
  1607. } else if (units !== value) {
  1608. var split = 0;
  1609. switch (units) {
  1610. case "%":
  1611. split = 25;
  1612. break;
  1613. case "deg":
  1614. split = 90;
  1615. }
  1616. if (split) {
  1617. var num$1 = parseFloat(value.slice(0, value.length - units.length));
  1618. if (isNaN(num$1)) {
  1619. return 0;
  1620. }
  1621. num$1 = num$1 / split;
  1622. return num$1 % 1 === 0 ? cleanup(num$1) : 0;
  1623. }
  1624. }
  1625. return defaultValue;
  1626. }
  1627. var separator = /[\s,]+/;
  1628. function flipFromString(custom, flip) {
  1629. flip.split(separator).forEach(function (str) {
  1630. var value = str.trim();
  1631. switch (value) {
  1632. case "horizontal":
  1633. custom.hFlip = true;
  1634. break;
  1635. case "vertical":
  1636. custom.vFlip = true;
  1637. break;
  1638. }
  1639. });
  1640. }
  1641. /**
  1642. * Size attributes
  1643. */
  1644. var sizeAttributes = ['width', 'height'];
  1645. /**
  1646. * Boolean attributes
  1647. */
  1648. var booleanAttributes = [
  1649. 'inline',
  1650. 'hFlip',
  1651. 'vFlip' ];
  1652. /**
  1653. * Get attribute value
  1654. */
  1655. function getBooleanAttribute(value, key) {
  1656. if (value === key || value === 'true') {
  1657. return true;
  1658. }
  1659. if (value === '' || value === 'false') {
  1660. return false;
  1661. }
  1662. return null;
  1663. }
  1664. /**
  1665. * Get element properties from HTML element
  1666. */
  1667. function getElementProps(element) {
  1668. // Get icon name
  1669. var name = element.getAttribute('data-icon');
  1670. var icon = typeof name === 'string' && stringToIcon(name, true);
  1671. if (!icon) {
  1672. return null;
  1673. }
  1674. // Get defaults and inline
  1675. var customisations = Object.assign({}, defaultExtendedIconCustomisations,
  1676. {inline: element.classList && element.classList.contains(inlineClass)});
  1677. // Get dimensions
  1678. sizeAttributes.forEach(function (attr) {
  1679. var value = element.getAttribute('data-' + attr);
  1680. if (value) {
  1681. customisations[attr] = value;
  1682. }
  1683. });
  1684. // Get rotation
  1685. var rotation = element.getAttribute('data-rotate');
  1686. if (typeof rotation === 'string') {
  1687. customisations.rotate = rotateFromString(rotation);
  1688. }
  1689. // Get flip shorthand
  1690. var flip = element.getAttribute('data-flip');
  1691. if (typeof flip === 'string') {
  1692. flipFromString(customisations, flip);
  1693. }
  1694. // Boolean attributes
  1695. booleanAttributes.forEach(function (attr) {
  1696. var key = 'data-' + attr;
  1697. var value = getBooleanAttribute(element.getAttribute(key), key);
  1698. if (typeof value === 'boolean') {
  1699. customisations[attr] = value;
  1700. }
  1701. });
  1702. // Get render mode. Not checking actual value because incorrect values are treated as inline
  1703. var mode = element.getAttribute('data-mode');
  1704. return {
  1705. name: name,
  1706. icon: icon,
  1707. customisations: customisations,
  1708. mode: mode,
  1709. };
  1710. }
  1711. /**
  1712. * Selector combining class names and tags
  1713. */
  1714. var selector = 'svg.' +
  1715. blockClass +
  1716. ', i.' +
  1717. blockClass +
  1718. ', span.' +
  1719. blockClass +
  1720. ', i.' +
  1721. inlineClass +
  1722. ', span.' +
  1723. inlineClass;
  1724. /**
  1725. * Find all parent nodes in DOM
  1726. */
  1727. function scanRootNode(root) {
  1728. var nodes = [];
  1729. root.querySelectorAll(selector).forEach(function (node) {
  1730. // Get props, ignore SVG rendered outside of SVG framework
  1731. var props = node[elementDataProperty] || node.tagName.toLowerCase() !== 'svg'
  1732. ? getElementProps(node)
  1733. : null;
  1734. if (props) {
  1735. nodes.push({
  1736. node: node,
  1737. props: props,
  1738. });
  1739. }
  1740. });
  1741. return nodes;
  1742. }
  1743. function iconToHTML(body, attributes) {
  1744. var renderAttribsHTML = body.indexOf("xlink:") === -1 ? "" : ' xmlns:xlink="http://www.w3.org/1999/xlink"';
  1745. for (var attr in attributes) {
  1746. renderAttribsHTML += " " + attr + '="' + attributes[attr] + '"';
  1747. }
  1748. return '<svg xmlns="http://www.w3.org/2000/svg"' + renderAttribsHTML + ">" + body + "</svg>";
  1749. }
  1750. /**
  1751. * Get classes to add from icon name
  1752. */
  1753. function iconClasses(iconName) {
  1754. var classesToAdd = new Set(['iconify']);
  1755. ['provider', 'prefix'].forEach(function (attr) {
  1756. if (iconName[attr]) {
  1757. classesToAdd.add('iconify--' + iconName[attr]);
  1758. }
  1759. });
  1760. return classesToAdd;
  1761. }
  1762. /**
  1763. * Add classes to SVG, removing previously added classes, keeping custom classes
  1764. */
  1765. function applyClasses(svg, classes, previouslyAddedClasses, placeholder) {
  1766. var svgClasses = svg.classList;
  1767. // Copy classes from placeholder
  1768. if (placeholder) {
  1769. var placeholderClasses = placeholder.classList;
  1770. Array.from(placeholderClasses).forEach(function (item) {
  1771. svgClasses.add(item);
  1772. });
  1773. }
  1774. // Add new classes
  1775. var addedClasses = [];
  1776. classes.forEach(function (item) {
  1777. if (!svgClasses.contains(item)) {
  1778. // Add new class
  1779. svgClasses.add(item);
  1780. addedClasses.push(item);
  1781. }
  1782. else if (previouslyAddedClasses.has(item)) {
  1783. // Was added before: keep it
  1784. addedClasses.push(item);
  1785. }
  1786. });
  1787. // Remove previously added classes
  1788. previouslyAddedClasses.forEach(function (item) {
  1789. if (!classes.has(item)) {
  1790. // Class that was added before, but no longer needed
  1791. svgClasses.remove(item);
  1792. }
  1793. });
  1794. return addedClasses;
  1795. }
  1796. /**
  1797. * Copy old styles, apply new styles
  1798. */
  1799. function applyStyle(svg, styles, previouslyAddedStyles) {
  1800. var svgStyle = svg.style;
  1801. // Remove previously added styles
  1802. (previouslyAddedStyles || []).forEach(function (prop) {
  1803. svgStyle.removeProperty(prop);
  1804. });
  1805. // Apply new styles, ignoring styles that already exist
  1806. var appliedStyles = [];
  1807. for (var prop in styles) {
  1808. if (!svgStyle.getPropertyValue(prop)) {
  1809. appliedStyles.push(prop);
  1810. svgStyle.setProperty(prop, styles[prop]);
  1811. }
  1812. }
  1813. return appliedStyles;
  1814. }
  1815. /**
  1816. * Render icon as inline SVG
  1817. */
  1818. function renderInlineSVG(element, props, iconData) {
  1819. // Create placeholder. Why placeholder? innerHTML setter on SVG does not work in some environments.
  1820. var span;
  1821. try {
  1822. span = document.createElement('span');
  1823. }
  1824. catch (err) {
  1825. return element;
  1826. }
  1827. // Generate data to render
  1828. var customisations = props.customisations;
  1829. var renderData = iconToSVG(iconData, customisations);
  1830. // Get old data
  1831. var oldData = element[elementDataProperty];
  1832. // Generate SVG
  1833. var html = iconToHTML(replaceIDs(renderData.body), Object.assign({}, {'aria-hidden': 'true',
  1834. 'role': 'img'},
  1835. renderData.attributes));
  1836. span.innerHTML = html;
  1837. // Get SVG element
  1838. var svg = span.childNodes[0];
  1839. // Add attributes
  1840. var placeholderAttributes = element.attributes;
  1841. for (var i = 0; i < placeholderAttributes.length; i++) {
  1842. var item = placeholderAttributes.item(i);
  1843. var name = item.name;
  1844. if (name !== 'class' && !svg.hasAttribute(name)) {
  1845. svg.setAttribute(name, item.value);
  1846. }
  1847. }
  1848. // Add classes
  1849. var classesToAdd = iconClasses(props.icon);
  1850. var addedClasses = applyClasses(svg, classesToAdd, new Set(oldData && oldData.addedClasses), element);
  1851. // Update style
  1852. var addedStyles = applyStyle(svg, customisations.inline
  1853. ? {
  1854. 'vertical-align': '-0.125em',
  1855. }
  1856. : {}, oldData && oldData.addedStyles);
  1857. // Add data to element
  1858. var newData = Object.assign({}, props,
  1859. {status: 'loaded',
  1860. addedClasses: addedClasses,
  1861. addedStyles: addedStyles});
  1862. svg[elementDataProperty] = newData;
  1863. // Replace old element
  1864. if (element.parentNode) {
  1865. element.parentNode.replaceChild(svg, element);
  1866. }
  1867. return svg;
  1868. }
  1869. function encodeSVGforURL(svg) {
  1870. return svg.replace(/"/g, "'").replace(/%/g, "%25").replace(/#/g, "%23").replace(/</g, "%3C").replace(/>/g, "%3E").replace(/\s+/g, " ");
  1871. }
  1872. function svgToURL(svg) {
  1873. return 'url("data:image/svg+xml,' + encodeSVGforURL(svg) + '")';
  1874. }
  1875. var commonProps = {
  1876. display: 'inline-block',
  1877. };
  1878. var monotoneProps = {
  1879. 'background-color': 'currentColor',
  1880. };
  1881. var coloredProps = {
  1882. 'background-color': 'transparent',
  1883. };
  1884. // Dynamically add common props to variables above
  1885. var propsToAdd = {
  1886. image: 'var(--svg)',
  1887. repeat: 'no-repeat',
  1888. size: '100% 100%',
  1889. };
  1890. var propsToAddTo = {
  1891. '-webkit-mask': monotoneProps,
  1892. 'mask': monotoneProps,
  1893. 'background': coloredProps,
  1894. };
  1895. for (var prefix in propsToAddTo) {
  1896. var list = propsToAddTo[prefix];
  1897. for (var prop in propsToAdd) {
  1898. list[prefix + '-' + prop] = propsToAdd[prop];
  1899. }
  1900. }
  1901. /**
  1902. * Fix size: add 'px' to numbers
  1903. */
  1904. function fixSize(value) {
  1905. return value + (value.match(/^[-0-9.]+$/) ? 'px' : '');
  1906. }
  1907. /**
  1908. * Render icon as inline SVG
  1909. */
  1910. function renderBackground(element, props, iconData, useMask) {
  1911. // Generate data to render
  1912. var customisations = props.customisations;
  1913. var renderData = iconToSVG(iconData, customisations);
  1914. var renderAttribs = renderData.attributes;
  1915. // Get old data
  1916. var oldData = element[elementDataProperty];
  1917. // Generate SVG
  1918. var html = iconToHTML(renderData.body, Object.assign({}, renderAttribs,
  1919. {width: iconData.width + '',
  1920. height: iconData.height + ''}));
  1921. // Add classes
  1922. var classesToAdd = iconClasses(props.icon);
  1923. var addedClasses = applyClasses(element, classesToAdd, new Set(oldData && oldData.addedClasses));
  1924. // Update style
  1925. var url = svgToURL(html);
  1926. var newStyles = Object.assign({}, {'--svg': url,
  1927. 'width': fixSize(renderAttribs.width),
  1928. 'height': fixSize(renderAttribs.height)},
  1929. commonProps,
  1930. (useMask ? monotoneProps : coloredProps));
  1931. if (customisations.inline) {
  1932. newStyles['vertical-align'] = '-0.125em';
  1933. }
  1934. var addedStyles = applyStyle(element, newStyles, oldData && oldData.addedStyles);
  1935. // Add data to element
  1936. var newData = Object.assign({}, props,
  1937. {status: 'loaded',
  1938. addedClasses: addedClasses,
  1939. addedStyles: addedStyles});
  1940. element[elementDataProperty] = newData;
  1941. return element;
  1942. }
  1943. /**
  1944. * Flag to avoid scanning DOM too often
  1945. */
  1946. var scanQueued = false;
  1947. /**
  1948. * Icons have been loaded
  1949. */
  1950. function checkPendingIcons() {
  1951. if (!scanQueued) {
  1952. scanQueued = true;
  1953. setTimeout(function () {
  1954. if (scanQueued) {
  1955. scanQueued = false;
  1956. scanDOM();
  1957. }
  1958. });
  1959. }
  1960. }
  1961. /**
  1962. * Scan node for placeholders
  1963. */
  1964. function scanDOM(rootNode, addTempNode) {
  1965. if ( addTempNode === void 0 ) addTempNode = false;
  1966. // List of icons to load: [provider][prefix] = Set<name>
  1967. var iconsToLoad = Object.create(null);
  1968. function getIcon(icon, load) {
  1969. var provider = icon.provider;
  1970. var prefix = icon.prefix;
  1971. var name = icon.name;
  1972. var storage = getStorage(provider, prefix);
  1973. var storedIcon = storage.icons[name];
  1974. if (storedIcon) {
  1975. return {
  1976. status: 'loaded',
  1977. icon: storedIcon,
  1978. };
  1979. }
  1980. if (storage.missing.has(name)) {
  1981. return {
  1982. status: 'missing',
  1983. };
  1984. }
  1985. if (load && !isPending(icon)) {
  1986. var providerIconsToLoad = iconsToLoad[provider] ||
  1987. (iconsToLoad[provider] = Object.create(null));
  1988. var set = providerIconsToLoad[prefix] ||
  1989. (providerIconsToLoad[prefix] = new Set());
  1990. set.add(name);
  1991. }
  1992. return {
  1993. status: 'loading',
  1994. };
  1995. }
  1996. // Parse all root nodes
  1997. (rootNode ? [rootNode] : listRootNodes()).forEach(function (observedNode) {
  1998. var root = typeof observedNode.node === 'function'
  1999. ? observedNode.node()
  2000. : observedNode.node;
  2001. if (!root || !root.querySelectorAll) {
  2002. return;
  2003. }
  2004. // Track placeholders
  2005. var hasPlaceholders = false;
  2006. // Observer
  2007. var paused = false;
  2008. /**
  2009. * Render icon
  2010. */
  2011. function render(element, props, iconData) {
  2012. if (!paused) {
  2013. paused = true;
  2014. pauseObservingNode(observedNode);
  2015. }
  2016. if (element.tagName.toUpperCase() !== 'SVG') {
  2017. // Check for one of style modes
  2018. var mode = props.mode;
  2019. var isMask = mode === 'mask' ||
  2020. (mode === 'bg'
  2021. ? false
  2022. : mode === 'style'
  2023. ? iconData.body.indexOf('currentColor') !== -1
  2024. : null);
  2025. if (typeof isMask === 'boolean') {
  2026. renderBackground(element, props, Object.assign({}, defaultIconProps,
  2027. iconData), isMask);
  2028. return;
  2029. }
  2030. }
  2031. renderInlineSVG(element, props, iconData);
  2032. }
  2033. // Find all elements
  2034. scanRootNode(root).forEach(function (ref) {
  2035. var node = ref.node;
  2036. var props = ref.props;
  2037. // Check if item already has props
  2038. var oldData = node[elementDataProperty];
  2039. if (!oldData) {
  2040. // New icon without data
  2041. var ref$1 = getIcon(props.icon, true);
  2042. var status = ref$1.status;
  2043. var icon = ref$1.icon;
  2044. if (icon) {
  2045. // Ready to render!
  2046. render(node, props, icon);
  2047. return;
  2048. }
  2049. // Loading or missing
  2050. hasPlaceholders = hasPlaceholders || status === 'loading';
  2051. node[elementDataProperty] = Object.assign({}, props,
  2052. {status: status});
  2053. return;
  2054. }
  2055. // Previously found icon
  2056. var item;
  2057. if (!propsChanged(oldData, props)) {
  2058. // Props have not changed. Check status
  2059. var oldStatus = oldData.status;
  2060. if (oldStatus !== 'loading') {
  2061. return;
  2062. }
  2063. item = getIcon(props.icon, false);
  2064. if (!item.icon) {
  2065. // Nothing to render
  2066. oldData.status = item.status;
  2067. return;
  2068. }
  2069. }
  2070. else {
  2071. // Properties have changed: load icon if name has changed
  2072. item = getIcon(props.icon, oldData.name !== props.name);
  2073. if (!item.icon) {
  2074. // Cannot render icon: update status and props
  2075. hasPlaceholders =
  2076. hasPlaceholders || item.status === 'loading';
  2077. Object.assign(oldData, Object.assign({}, props,
  2078. {status: item.status}));
  2079. return;
  2080. }
  2081. }
  2082. // Re-render icon
  2083. render(node, props, item.icon);
  2084. });
  2085. // Observed node stuff
  2086. if (observedNode.temporary && !hasPlaceholders) {
  2087. // Remove temporary node
  2088. stopObserving(root);
  2089. }
  2090. else if (addTempNode && hasPlaceholders) {
  2091. // Add new temporary node
  2092. observe(root, true);
  2093. }
  2094. else if (paused && observedNode.observer) {
  2095. // Resume observer
  2096. resumeObservingNode(observedNode);
  2097. }
  2098. });
  2099. // Load icons
  2100. var loop = function ( provider ) {
  2101. var providerIconsToLoad = iconsToLoad[provider];
  2102. var loop$1 = function ( prefix ) {
  2103. var set = providerIconsToLoad[prefix];
  2104. loadIcons(Array.from(set).map(function (name) { return ({
  2105. provider: provider,
  2106. prefix: prefix,
  2107. name: name,
  2108. }); }), checkPendingIcons);
  2109. };
  2110. for (var prefix in providerIconsToLoad) loop$1( prefix );
  2111. };
  2112. for (var provider in iconsToLoad) loop( provider );
  2113. }
  2114. /**
  2115. * Scan node for placeholders
  2116. */
  2117. function scanElement(root) {
  2118. // Add temporary node
  2119. var node = findRootNode(root);
  2120. if (!node) {
  2121. scanDOM({
  2122. node: root,
  2123. temporary: true,
  2124. }, true);
  2125. }
  2126. else {
  2127. scanDOM(node);
  2128. }
  2129. }
  2130. function generateIcon(name, customisations, returnString) {
  2131. if ( returnString === void 0 ) returnString = false;
  2132. // Get icon data
  2133. var iconData = getIconData(name);
  2134. if (!iconData) {
  2135. return null;
  2136. }
  2137. // Split name
  2138. var iconName = stringToIcon(name);
  2139. // Clean up customisations
  2140. var changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
  2141. // Get data
  2142. var result = renderInlineSVG(document.createElement('span'), {
  2143. name: name,
  2144. icon: iconName,
  2145. customisations: changes,
  2146. }, iconData);
  2147. return returnString
  2148. ? result.outerHTML
  2149. : result;
  2150. }
  2151. /**
  2152. * Get version
  2153. */
  2154. function getVersion() {
  2155. return '3.1.0';
  2156. }
  2157. /**
  2158. * Generate SVG element
  2159. */
  2160. function renderSVG(name, customisations) {
  2161. return generateIcon(name, customisations, false);
  2162. }
  2163. /**
  2164. * Generate SVG as string
  2165. */
  2166. function renderHTML(name, customisations) {
  2167. return generateIcon(name, customisations, true);
  2168. }
  2169. /**
  2170. * Get rendered icon as object that can be used to create SVG (use replaceIDs on body)
  2171. */
  2172. function renderIcon(name, customisations) {
  2173. // Get icon data
  2174. var iconData = getIconData(name);
  2175. if (!iconData) {
  2176. return null;
  2177. }
  2178. // Clean up customisations
  2179. var changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
  2180. // Get data
  2181. return iconToSVG(iconData, changes);
  2182. }
  2183. /**
  2184. * Scan DOM
  2185. */
  2186. function scan(root) {
  2187. if (root) {
  2188. scanElement(root);
  2189. }
  2190. else {
  2191. scanDOM();
  2192. }
  2193. }
  2194. /**
  2195. * Initialise stuff
  2196. */
  2197. if (typeof document !== 'undefined' && typeof window !== 'undefined') {
  2198. // Add document.body node
  2199. addBodyNode();
  2200. var _window = window;
  2201. // Load icons from global "IconifyPreload"
  2202. if (_window.IconifyPreload !== void 0) {
  2203. var preload = _window.IconifyPreload;
  2204. var err = 'Invalid IconifyPreload syntax.';
  2205. if (typeof preload === 'object' && preload !== null) {
  2206. (preload instanceof Array ? preload : [preload]).forEach(function (item) {
  2207. try {
  2208. if (
  2209. // Check if item is an object and not null/array
  2210. typeof item !== 'object' ||
  2211. item === null ||
  2212. item instanceof Array ||
  2213. // Check for 'icons' and 'prefix'
  2214. typeof item.icons !== 'object' ||
  2215. typeof item.prefix !== 'string' ||
  2216. // Add icon set
  2217. !addCollection(item)) {
  2218. console.error(err);
  2219. }
  2220. }
  2221. catch (e) {
  2222. console.error(err);
  2223. }
  2224. });
  2225. }
  2226. }
  2227. // Load observer and scan DOM on next tick
  2228. setTimeout(function () {
  2229. initObserver(scanDOM);
  2230. scanDOM();
  2231. });
  2232. }
  2233. /**
  2234. * Global variable
  2235. */
  2236. var Iconify = {
  2237. // IconifyStorageFunctions
  2238. iconExists: iconExists,
  2239. getIcon: getIcon,
  2240. listIcons: listIcons,
  2241. addIcon: addIcon,
  2242. addCollection: addCollection,
  2243. // IconifyBuilderFunctions
  2244. replaceIDs: replaceIDs,
  2245. calculateSize: calculateSize,
  2246. buildIcon: iconToSVG,
  2247. // IconifyCommonFunctions
  2248. getVersion: getVersion,
  2249. renderSVG: renderSVG,
  2250. renderHTML: renderHTML,
  2251. renderIcon: renderIcon,
  2252. scan: scan,
  2253. observe: observe,
  2254. stopObserving: stopObserving,
  2255. pauseObserver: pauseObserver,
  2256. resumeObserver: resumeObserver,
  2257. };
  2258. exports.addCollection = addCollection;
  2259. exports.addIcon = addIcon;
  2260. exports.buildIcon = iconToSVG;
  2261. exports.calculateSize = calculateSize;
  2262. exports.default = Iconify;
  2263. exports.getIcon = getIcon;
  2264. exports.getVersion = getVersion;
  2265. exports.iconExists = iconExists;
  2266. exports.listIcons = listIcons;
  2267. exports.observe = observe;
  2268. exports.pauseObserver = pauseObserver;
  2269. exports.renderHTML = renderHTML;
  2270. exports.renderIcon = renderIcon;
  2271. exports.renderSVG = renderSVG;
  2272. exports.replaceIDs = replaceIDs;
  2273. exports.resumeObserver = resumeObserver;
  2274. exports.scan = scan;
  2275. exports.stopObserving = stopObserving;
  2276. Object.defineProperty(exports, '__esModule', { value: true });
  2277. return exports;
  2278. })({});
  2279. // Export as ES module
  2280. if (typeof exports === 'object') {
  2281. try {
  2282. exports.__esModule = true;
  2283. exports.default = Iconify;
  2284. for (var key in Iconify) {
  2285. exports[key] = Iconify[key];
  2286. }
  2287. } catch (err) {
  2288. }
  2289. }
  2290. // Export to window or web worker
  2291. try {
  2292. if (self.Iconify === void 0) {
  2293. self.Iconify = Iconify;
  2294. }
  2295. } catch (err) {
  2296. }