-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSVGIcon-module.min.js
More file actions
1 lines (1 loc) · 2.18 KB
/
SVGIcon-module.min.js
File metadata and controls
1 lines (1 loc) · 2.18 KB
1
const createElement=document.createElementNS.bind(document,"http://www.w3.org/2000/svg");class EventFronta{add(t,e="push"){void 0===this._listeners&&(this._listeners=[]),this._listeners[e](t)}serveAll(t){if(void 0===this._listeners)return!0;let e;for(;e=this._listeners.shift();)t(e);this.clear()}clear(){Reflect.deleteProperty(this,"_listeners")}}const setHref=(t,e)=>t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",e),style={options:{allow:!0,fit:"contain",size_variable:"--svg-icon-size"},is_created:!1,create(){if(!this.options.allow||this.is_created)return!1;const t=document.createElement("style");t.type="text/css";const{size_variable:e,fit:s}=this.options;t.innerHTML=`svg-icon { display: block; width: var(${e}, 1em); height: var(${e}, 1em); }`+`svg-icon svg { width: 100%; height: 100%; object-fit: ${s}; }`,document.head.appendChild(t),this.is_created=!0}},aliases={options:{separator:"-"},list:null,has:function(t){return Boolean(this.list)&&this.list.has(t)},get:function(t){return this.list.get(t)}};export function setAlias(t,e){return aliases.list||(aliases.list=new Map),aliases.list.set(t,e)}export function removeAlias(t){return!!aliases.list&&(aliases.list.delete(t),aliases.list.size||(aliases.list=null),!0)}export function changeOptions({style:t,aliases:e}={}){t&&Object.assign(style.options,t),e&&Object.assign(aliases.options,e)}export default class SVGIconElement extends HTMLElement{constructor(){super(),style.create(),this._icon=null,this._onmount_attributes=new EventFronta}renderIcon(){const t=createElement("svg"),e=createElement("use");return t.appendChild(e),this.appendChild(t),e}setIcon(t){if(!t||!this._icon)return!1;const{separator:e}=aliases.options,[s,...i]=t.split(e);setHref(this._icon,aliases.has(s)?aliases.get(s)+i.join(e):t)}connectedCallback(){this._icon=this.renderIcon(),this._onmount_attributes.serveAll(t=>this.attributeChangedCallback(...t))}disconnectedCallback(){this._onmount_attributes.clear(),this._onmount_attributes=null,this._icon=null}static get observedAttributes(){return["use"]}attributeChangedCallback(...t){const[e,s,i]=t;return s!==i&&"use"===e&&(this._icon?this.setIcon(i):this._onmount_attributes.add(t))}}customElements.define("svg-icon",SVGIconElement);