iconforged
Version:
Frontend icon library. Bridging the gap between traditional icons and modern workflows.
1 lines • 8.23 kB
JavaScript
(()=>{const e="https://cdn.jsdelivr.net/npm/iconforged@latest/dist",t="IconForge",r=`${e}/iconforge.woff2`,a=`${e}/meta/iconforge-icons.json`,s=`${e}/meta/iconforge-styles.json`,i=new Set,n=new Set;let o={},c={};const d={"xs:":"@media (min-width: 420px)","sm:":"@media (min-width: 640px)","md:":"@media (min-width: 768px)","lg:":"@media (min-width: 1024px)","xl:":"@media (min-width: 1280px)"},l={"hover:":":hover","focus:":":focus","active:":":active"},b="dark:",f=[...Object.keys(d),...Object.keys(l),b],m=/^(is-(?:color|bg|w|h|sq|size|p|pt|pr|pb|pl|px|py|m|mt|mr|mb|ml|my|mx|z|scale|opacity|rot|grid-cols|grid-rows|gap|top|bottom|left|right|translate|translate-x|translate-y|border|border-t|border-b|border-l|border-r|fixed-bg|gradient-linear|gradient-radial|gradient-conic|outline|outline-dashed|outline-dotted|outline-double|blur|backdrop-blur|brightness|contrast|grayscale|saturate))-\[(.+)\]$/,g=e=>String(e).replace(/([ !\"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g,"\\$1"),u=(e,t)=>t?`${t}{${e}}`:e,p=e=>{if("string"!=typeof e)return"";const t=e.match(/{([^}]+)}/);return t?t[1].trim():""};function $(e){let t=String(e),r="";const a=[];let s="";e:for(;;){for(const e of f)if(t.startsWith(e)){e in d?r=d[e]:e===b?s=".dark ":e in l&&a.push(l[e]),t=t.slice(e.length);continue e}break}return{base:t,mediaQuery:r,variantSel:a.join(""),darkPrefix:s}}const k=document.createElement("style");k.textContent=`\n/* IconForge CDN v1.3.1 */\n@font-face {\n font-family: '${t}';\n src: url('${r}') format('woff2');\n font-display: block;\n font-weight: normal;\n font-style: normal;\n}\n[class^="if-"], [class*=" if-"] {\n font-family: '${t}' !important;\n display: inline-block;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n`,document.head.appendChild(k);let h=document.querySelector(".iconforge-dynamic");h||(h=document.createElement("style"),h.classList.add("iconforge-dynamic"),k.after(h));const y=async(e,t=3)=>{for(let r=0;r<t;r++)try{const t=await fetch(e);if(!t.ok)throw new Error(`HTTP ${t.status}`);return t.json()}catch(e){if(r===t-1)throw e;await new Promise(e=>setTimeout(e,1e3*Math.pow(2,r)))}},w=(e,t)=>{try{const r=JSON.stringify(t);return!(r.length>2097152)&&(sessionStorage.setItem(e,r),!0)}catch{return!1}};function x(e){const{base:t,mediaQuery:r,variantSel:a,darkPrefix:s}=$(e),i=t.match(m);if(i){const[,t,n]=i,o=function(e,t,r,a,s){const i=String(r);let n="";switch(t){case"is-color":n=`color: ${i};`;break;case"is-bg":n=`background-color: ${i};`;break;case"is-w":n=`width: ${i};`;break;case"is-h":n=`height: ${i};`;break;case"is-sq":n=`width: ${i}; height: ${i};`;break;case"is-size":n=`font-size: ${i};`;break;case"is-p":n=`padding: ${i};`;break;case"is-pt":n=`padding-top: ${i};`;break;case"is-pr":n=`padding-right: ${i};`;break;case"is-pb":n=`padding-bottom: ${i};`;break;case"is-pl":n=`padding-left: ${i};`;break;case"is-px":n=`padding-left: ${i}; padding-right: ${i};`;break;case"is-py":n=`padding-top: ${i}; padding-bottom: ${i};`;break;case"is-m":n=`margin: ${i};`;break;case"is-mt":n=`margin-top: ${i};`;break;case"is-mr":n=`margin-right: ${i};`;break;case"is-mb":n=`margin-bottom: ${i};`;break;case"is-ml":n=`margin-left: ${i};`;break;case"is-mx":n=`margin-left: ${i}; margin-right: ${i};`;break;case"is-my":n=`margin-top: ${i}; margin-bottom: ${i};`;break;case"is-z":n=`z-index: ${i};`;break;case"is-scale":n=`transform: scale(${i});`;break;case"is-opacity":n=`opacity: ${i};`;break;case"is-rot":n=`transform: rotate(${i});`;break;case"is-grid-cols":n=`grid-template-columns: repeat(${i}, minmax(0, 1fr));`;break;case"is-grid-rows":n=`grid-template-rows: repeat(${i}, minmax(0, 1fr));`;break;case"is-gap":n=`gap: ${i};`;break;case"is-top":n=`top: ${i};`;break;case"is-bottom":n=`bottom: ${i};`;break;case"is-left":n=`left: ${i};`;break;case"is-right":n=`right: ${i};`;break;case"is-translate":n=`transform: translate(${i}, ${i});`;break;case"is-translate-x":n=`transform: translateX(${i});`;break;case"is-translate-y":n=`transform: translateY(${i});`;break;case"is-border":n=`border-width: ${i} ${i} ${i} ${i}; border-style: solid;`;break;case"is-border-t":n=`border-top-width: ${i}; border-style: solid;`;break;case"is-border-b":n=`border-bottom-width: ${i}; border-style: solid;`;break;case"is-border-l":n=`border-left-width: ${i}; border-style: solid;`;break;case"is-border-r":n=`border-right-width: ${i}; border-style: solid;`;break;case"is-outline":n=`outline: 1px solid ${i};`;break;case"is-outline-dashed":n=`outline: 1px dashed ${i};`;break;case"is-outline-dotted":n=`outline: 1px dotted ${i};`;break;case"is-outline-double":n=`outline: 2px solid ${i};`;break;case"is-blur":n=`filter: blur(${i});`;break;case"is-backdrop-blur":n=`backdrop-filter: blur(${i});`;break;case"is-brightness":n=`filter: brightness(${i});`;break;case"is-contrast":n=`filter: contrast(${i});`;break;case"is-grayscale":n=`filter: grayscale(${i});`;break;case"is-saturate":n=`filter: saturate(${i});`;break;case"is-fixed-bg":n=`position: fixed; top: 0; left: 0; width: 100dvw; height: 100dvh; z-index: -1; background-repeat: no-repeat; background-size: cover; background-image: url("${i.replace(/"/g,'\\"')}");`;break;case"is-gradient-linear":{const t=i.replace(/_/g," ").replace(/\"/g,'\\"');return`${s}.${g(e)}${a} { background-image: linear-gradient(${t}); color: transparent; -webkit-background-clip: text; background-clip: text; }`}case"is-gradient-radial":{const t=i.replace(/_/g," ").replace(/\"/g,'\\"');return`${s}.${g(e)}${a} { background-image: radial-gradient(${t}); color: transparent; -webkit-background-clip: text; background-clip: text; }`}case"is-gradient-conic":{const t=i.replace(/_/g," ").replace(/\"/g,'\\"');return`${s}.${g(e)}${a} { background-image: conic-gradient(${t}); color: transparent; -webkit-background-clip: text; background-clip: text; }`}default:n=""}return n?`${s}.${g(e)}${a} { ${n} }`:""}(e,t,n,a,s);return{keyframes:"",css:u(o,r)}}const n=c[t];if(n){let t="",i="";if("object"==typeof n&&null!==n?(n.keyframes&&(t=`${n.keyframes}\n`),i=p(n.class)||n.class||""):"string"==typeof n&&(i=p(n)||n),i){const n=`.${g(e)}${a}`;return{keyframes:t,css:u(`${s}${n} { ${i} }`,r)}}return{keyframes:t,css:""}}const d=o[t];if(d){let t="";"object"==typeof d&&d.value?t=d.value:"string"==typeof d&&(t=d);const i=p(t)||t;if(i){const t=`.${g(e)}${a}:before`;return{keyframes:"",css:u(`${s}${t} { ${i} }`,r)}}}return{keyframes:"",css:""}}function v(e){const t=e.className;"string"==typeof t&&t.split(/\s+/).forEach(e=>{if(!function(e){if(!e)return!1;if(e.startsWith("if-")||e.startsWith("is-"))return!0;for(const t of f)if(e.startsWith(t))return!0;return!1}(e))return;const{base:t}=$(e);t&&(t.startsWith("if-")||t.startsWith("is-"))&&i.add(e)})}function E(e){if(!e)return;e.nodeType===Node.ELEMENT_NODE&&v(e);const t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();)v(t.currentNode)}function S(){let e="",t="";i.forEach(r=>{if(n.has(r))return;const{keyframes:a,css:s}=x(r);a&&!n.has(a)&&(e+=a,n.add(a)),s&&(t+=s+"\n",n.add(r))});const r=e+t;r&&requestAnimationFrame(()=>{h.textContent+=r})}!function(){try{const t=document.createElement("link");t.rel="preconnect",t.href=new URL(e).origin,t.crossOrigin="anonymous",document.head.appendChild(t);const a=document.createElement("link");a.rel="preload",a.as="font",a.type="font/woff2",a.crossOrigin="anonymous",a.href=r,document.head.appendChild(a)}catch(e){}}();const N=async()=>{let e;await(async()=>{const e=sessionStorage.getItem("iconforge_icons"),t=sessionStorage.getItem("iconforge_styles");if(e&&t)try{return o=JSON.parse(e),void(c=JSON.parse(t))}catch{}const[r,i]=await Promise.all([y(a),y(s)]);o=r||{},c=i||{},w("iconforge_icons",o),w("iconforge_styles",c)})(),E(document.documentElement),S();new MutationObserver(t=>{clearTimeout(e),e=setTimeout(()=>{for(const e of t)"childList"===e.type?e.addedNodes.forEach(E):"attributes"===e.type&&"class"===e.attributeName&&v(e.target);S()},16)}).observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["class"]})};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",N):N()})();