1/** 2 * Single Font Awesome 7 (CSS/webfont) loader for the dashboard SPA shell. 3 * Use CSS + fa-solid / fa-brands markup â not legacy fas/fab or the FA JS bundle. 4 */ 5(function (global) { 6 'use strict'; 7 8 var FA_HREF = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css'; 9 var readyPromise = null; 10 11 function isValidSiteLink(link) { 12 if (!link) return false; 13 var href = link.getAttribute('href') || link.href || ''; 14 return href.indexOf('font-awesome/7.') !== -1; 15 } 16 17 function findSiteLink() { 18 var tagged = document.querySelector('link[data-site-fontawesome="7"]'); 19 if (isValidSiteLink(tagged)) return tagged; 20 if (tagged && tagged.parentNode) tagged.parentNode.removeChild(tagged); 21 return null; 22 } 23 24 function removeStaleFontAwesome() { 25 var links = document.querySelectorAll('link[href*="font-awesome"], link[href*="fontawesome"]'); 26 var i; 27 for (i = 0; i < links.length; i++) { 28 if (links[i].getAttribute('data-site-fontawesome') === '7' && isValidSiteLink(links[i])) continue; 29 if (links[i].parentNode) links[i].parentNode.removeChild(links[i]); 30 } 31 var scripts = document.querySelectorAll('script[src*="font-awesome"][src*="/js/"]'); 32 for (i = 0; i < scripts.length; i++) { 33 if (scripts[i].dataset && scripts[i].dataset.spaLoaded === '1') { 34 scripts[i].parentNode.removeChild(scripts[i]); 35 } 36 } 37 } 38 39 function waitForLink(link) { 40 if (!link) return Promise.resolve(null); 41 if (link.dataset.faReady === '1') return Promise.resolve(link); 42 if (link.sheet) { 43 link.dataset.faReady = '1'; 44 return Promise.resolve(link); 45 } 46 return new Promise(function (resolve) { 47 function done() { 48 link.removeEventListener('load', done); 49 link.removeEventListener('error', onError); 50 link.dataset.faReady = '1'; 51 resolve(link); 52 } 53 function onError() { 54 link.removeEventListener('load', done); 55 link.removeEventListener('error', onError); 56 console.warn('[ensureSiteFontAwesome] Font Awesome 7 stylesheet failed to load'); 57 resolve(link); 58 } 59 link.addEventListener('load', done); 60 link.addEventListener('error', onError); 61 }); 62 } 63 64 function ensureSiteFontAwesome() { 65 if (readyPromise) return readyPromise; 66 67 readyPromise = new Promise(function (resolve) { 68 removeStaleFontAwesome(); 69 var existing = findSiteLink(); 70 if (existing) { 71 waitForLink(existing).then(resolve); 72 return; 73 } 74 75 var link = document.createElement('link'); 76 link.rel = 'stylesheet'; 77 link.href = FA_HREF; 78 link.crossOrigin = 'anonymous'; 79 link.referrerPolicy = 'no-referrer'; 80 link.setAttribute('data-site-fontawesome', '7'); 81 document.head.appendChild(link); 82 waitForLink(link).then(resolve); 83 }); 84 85 return readyPromise; 86 } 87 88 global.ensureSiteFontAwesome = ensureSiteFontAwesome; 89 global.SiteFontAwesome = { 90 HREF: FA_HREF, 91 ensure: ensureSiteFontAwesome, 92 isReady: function () { 93 var link = findSiteLink(); 94 return !!(link && (link.dataset.faReady === '1' || link.sheet)); 95 } 96 }; 97})(typeof window !== 'undefined' ? window : this);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.