UNPKG

@ngaox/icons

Version:

Inline SVG icons from (src | files | your favorite icons library | ...)!

111 lines 13.5 kB
import { DOCUMENT } from '@angular/common'; import { HttpClient } from '@angular/common/http'; import { Inject, Injectable, Optional } from '@angular/core'; import { of, map, shareReplay } from 'rxjs'; import { NGAOX_FALLBACK } from './models'; import { NgaoxGlobalIcons } from './icons.module'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; const defaultFallbackIcon = ` <svg viewBox="0 0 612 612" xmlns="http://www.w3.org/2000/svg" fill="currentColor"> <path d="M306 50C164.6 50 50 164.6 50 306C50 447.4 164.6 562 306 562C447.4 562 562 447.4 562 306C562 164.6 447.4 50 306 50ZM282 202C282 188.8 292.8 178 306 178C319.2 178 330 188.75 330 202V330C330 343.25 319.25 354 306 354C292.75 354 282 343.3 282 330V202ZM306 450C288.64 450 274.56 435.92 274.56 418.56C274.56 401.2 288.63 387.12 306 387.12C323.37 387.12 337.44 401.2 337.44 418.56C337.4 435.9 323.4 450 306 450Z"/> </svg> `; export class IconsService { constructor(http, document, fallbackIcon = defaultFallbackIcon, icons) { this.http = http; this.document = document; this.fallbackIcon = fallbackIcon; this.icons = new Map(); this.lazyIcons = new Map(); icons ??= []; this.addAll(icons); } textToSvgElement(svg) { const div = this.document.createElement('div'); div.innerHTML = svg; const svgEl = div.querySelector('svg'); if (svgEl) { svgEl.setAttribute('height', '100%'); svgEl.setAttribute('width', '100%'); } return svgEl; } /** * Get the fallback icon specified in the import of the `IconsModule.forRoot` * Used in the `ngaox-icon` component when the icon is not found * @see {@link https://ngaox-lab.web.app/docs/icons#fallback-icon} */ getFallbackIcon() { return this.fallbackIcon; } /** * get an already registered/added icon * * @see {@link IconsService.add} */ get(name) { if (this.icons.has(name)) { return of(this.icons.get(name)); } else if (this.lazyIcons.has(name)) { return this.lazyIcons.get(name) ?? of(undefined); } return of(undefined); } /** * Add an SVG icon to the NgaoxIcons registry * * @param name the name of the Icon in the registry (used in `ngaox-icon` component and {@link IconsService.get}) * @param value the SVG content or {@link ILazyIcon} for lazy loaded icons * @param override (default to true) whether or not replacing existing `svg` if `name` already exists * */ add(name, value) { if (typeof value === 'string') { this.icons.set(name, this.textToSvgElement(value)); } else { this.lazyIcons.set(name, this.http.get(value.url, { responseType: 'text' }).pipe(map(svg => this.textToSvgElement(svg)), shareReplay(1))); } return this.get(name); } addAll(icons) { icons.forEach(icon => { this.add(icon.name, icon.data); }); } /** * remove a registered icon */ remove(name) { if (this.icons.has(name)) { this.icons.delete(name); } if (this.lazyIcons.has(name)) { this.lazyIcons.delete(name); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: IconsService, deps: [{ token: i1.HttpClient }, { token: DOCUMENT }, { token: NGAOX_FALLBACK, optional: true }, { token: NgaoxGlobalIcons, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: IconsService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: IconsService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.HttpClient }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NGAOX_FALLBACK] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NgaoxGlobalIcons] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2ljb25zL3NyYy9saWIvaWNvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEQsT0FBTyxFQUF5QixjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUVsRCxNQUFNLG1CQUFtQixHQUFHOzs7O0NBSTNCLENBQUM7QUFLRixNQUFNLE9BQU8sWUFBWTtJQUl2QixZQUNVLElBQWdCLEVBQ0UsUUFBa0IsRUFHcEMsZUFBdUIsbUJBQW1CLEVBQ1osS0FBb0I7UUFMbEQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNFLGFBQVEsR0FBUixRQUFRLENBQVU7UUFHcEMsaUJBQVksR0FBWixZQUFZLENBQThCO1FBUjVDLFVBQUssR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztRQUN0QyxjQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7UUFVNUQsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEdBQVc7UUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsR0FBRyxDQUFDLFNBQVMsR0FB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QUNSLE1BQU07MkJBQUMsY0FBYzs7MEJBRXJCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IElMYXp5SWNvbiwgSU5nYW94SWNvbiwgTkdBT1hfRkFMTEJBQ0sgfSBmcm9tICcuL21vZGVscyc7XHJcbmltcG9ydCB7IE5nYW94R2xvYmFsSWNvbnMgfSBmcm9tICcuL2ljb25zLm1vZHVsZSc7XHJcblxyXG5jb25zdCBkZWZhdWx0RmFsbGJhY2tJY29uID0gYFxyXG4gIDxzdmcgdmlld0JveD1cIjAgMCA2MTIgNjEyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cclxuICAgIDxwYXRoIGQ9XCJNMzA2IDUwQzE2NC42IDUwIDUwIDE2NC42IDUwIDMwNkM1MCA0NDcuNCAxNjQuNiA1NjIgMzA2IDU2MkM0NDcuNCA1NjIgNTYyIDQ0Ny40IDU2MiAzMDZDNTYyIDE2NC42IDQ0Ny40IDUwIDMwNiA1MFpNMjgyIDIwMkMyODIgMTg4LjggMjkyLjggMTc4IDMwNiAxNzhDMzE5LjIgMTc4IDMzMCAxODguNzUgMzMwIDIwMlYzMzBDMzMwIDM0My4yNSAzMTkuMjUgMzU0IDMwNiAzNTRDMjkyLjc1IDM1NCAyODIgMzQzLjMgMjgyIDMzMFYyMDJaTTMwNiA0NTBDMjg4LjY0IDQ1MCAyNzQuNTYgNDM1LjkyIDI3NC41NiA0MTguNTZDMjc0LjU2IDQwMS4yIDI4OC42MyAzODcuMTIgMzA2IDM4Ny4xMkMzMjMuMzcgMzg3LjEyIDMzNy40NCA0MDEuMiAzMzcuNDQgNDE4LjU2QzMzNy40IDQzNS45IDMyMy40IDQ1MCAzMDYgNDUwWlwiLz5cclxuICA8L3N2Zz5cclxuYDtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEljb25zU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBpY29ucyA9IG5ldyBNYXA8c3RyaW5nLCBTVkdFbGVtZW50PigpO1xyXG4gIHByaXZhdGUgbGF6eUljb25zID0gbmV3IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8U1ZHRWxlbWVudD4+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgQEluamVjdChOR0FPWF9GQUxMQkFDSylcclxuICAgIHByaXZhdGUgZmFsbGJhY2tJY29uOiBzdHJpbmcgPSBkZWZhdWx0RmFsbGJhY2tJY29uLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChOZ2FveEdsb2JhbEljb25zKSBpY29ucz86IElOZ2FveEljb25bXVxyXG4gICkge1xyXG4gICAgaWNvbnMgPz89IFtdO1xyXG4gICAgdGhpcy5hZGRBbGwoaWNvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0ZXh0VG9TdmdFbGVtZW50KHN2Zzogc3RyaW5nKTogU1ZHRWxlbWVudCB7XHJcbiAgICBjb25zdCBkaXYgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgZGl2LmlubmVySFRNTCA9IHN2ZztcclxuICAgIGNvbnN0IHN2Z0VsID0gZGl2LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpIGFzIFNWR0VsZW1lbnQ7XHJcbiAgICBpZiAoc3ZnRWwpIHtcclxuICAgICAgc3ZnRWwuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMTAwJScpO1xyXG4gICAgICBzdmdFbC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzEwMCUnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdmdFbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZmFsbGJhY2sgaWNvbiBzcGVjaWZpZWQgaW4gdGhlIGltcG9ydCBvZiB0aGUgYEljb25zTW9kdWxlLmZvclJvb3RgXHJcbiAgICogVXNlZCBpbiB0aGUgYG5nYW94LWljb25gIGNvbXBvbmVudCB3aGVuIHRoZSBpY29uIGlzIG5vdCBmb3VuZFxyXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbmdhb3gtbGFiLndlYi5hcHAvZG9jcy9pY29ucyNmYWxsYmFjay1pY29ufVxyXG4gICAqL1xyXG4gIGdldEZhbGxiYWNrSWNvbigpIHtcclxuICAgIHJldHVybiB0aGlzLmZhbGxiYWNrSWNvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGdldCBhbiBhbHJlYWR5IHJlZ2lzdGVyZWQvYWRkZWQgaWNvblxyXG4gICAqXHJcbiAgICogQHNlZSAge0BsaW5rIEljb25zU2VydmljZS5hZGR9XHJcbiAgICovXHJcbiAgZ2V0KG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8U1ZHRWxlbWVudCB8IHVuZGVmaW5lZD4ge1xyXG4gICAgaWYgKHRoaXMuaWNvbnMuaGFzKG5hbWUpKSB7XHJcbiAgICAgIHJldHVybiBvZih0aGlzLmljb25zLmdldChuYW1lKSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubGF6eUljb25zLmhhcyhuYW1lKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sYXp5SWNvbnMuZ2V0KG5hbWUpID8/IG9mKHVuZGVmaW5lZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBhbiBTVkcgaWNvbiB0byB0aGUgTmdhb3hJY29ucyByZWdpc3RyeVxyXG4gICAqXHJcbiAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIEljb24gaW4gdGhlIHJlZ2lzdHJ5ICh1c2VkIGluIGBuZ2FveC1pY29uYCBjb21wb25lbnQgYW5kIHtAbGluayBJY29uc1NlcnZpY2UuZ2V0fSlcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIFNWRyBjb250ZW50IG9yIHtAbGluayBJTGF6eUljb259IGZvciBsYXp5IGxvYWRlZCBpY29uc1xyXG4gICAqIEBwYXJhbSBvdmVycmlkZSAoZGVmYXVsdCB0byB0cnVlKSB3aGV0aGVyIG9yIG5vdCByZXBsYWNpbmcgZXhpc3RpbmcgYHN2Z2AgaWYgYG5hbWVgIGFscmVhZHkgZXhpc3RzXHJcbiAgICpcclxuICAgKi9cclxuICBhZGQoXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICB2YWx1ZTogc3RyaW5nIHwgSUxhenlJY29uXHJcbiAgKTogT2JzZXJ2YWJsZTxTVkdFbGVtZW50IHwgdW5kZWZpbmVkPiB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0aGlzLmljb25zLnNldChuYW1lLCB0aGlzLnRleHRUb1N2Z0VsZW1lbnQodmFsdWUpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGF6eUljb25zLnNldChcclxuICAgICAgICBuYW1lLFxyXG4gICAgICAgIHRoaXMuaHR0cC5nZXQodmFsdWUudXJsLCB7IHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pLnBpcGUoXHJcbiAgICAgICAgICBtYXAoc3ZnID0+IHRoaXMudGV4dFRvU3ZnRWxlbWVudChzdmcpKSxcclxuICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0KG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgYWRkQWxsKGljb25zOiBJTmdhb3hJY29uW10pIHtcclxuICAgIGljb25zLmZvckVhY2goaWNvbiA9PiB7XHJcbiAgICAgIHRoaXMuYWRkKGljb24ubmFtZSwgaWNvbi5kYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmVtb3ZlIGEgcmVnaXN0ZXJlZCBpY29uXHJcbiAgICovXHJcbiAgcmVtb3ZlKG5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuaWNvbnMuaGFzKG5hbWUpKSB7XHJcbiAgICAgIHRoaXMuaWNvbnMuZGVsZXRlKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGF6eUljb25zLmhhcyhuYW1lKSkge1xyXG4gICAgICB0aGlzLmxhenlJY29ucy5kZWxldGUobmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==