@ngaox/icons
Version:
Inline SVG icons from (src | files | your favorite icons library | ...)!
1 lines • 14.4 kB
Source Map (JSON)
{"version":3,"file":"ngaox-icons.mjs","sources":["../../../../packages/icons/src/lib/models.ts","../../../../packages/icons/src/lib/icons.module.ts","../../../../packages/icons/src/lib/icons.service.ts","../../../../packages/icons/src/lib/icon.component.ts","../../../../packages/icons/src/lib/adapters/compact.adapter.ts","../../../../packages/icons/src/index.ts","../../../../packages/icons/src/ngaox-icons.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const NGAOX_FALLBACK: InjectionToken<string> = new InjectionToken(\n 'NgaoxFallbackIcon'\n);\n\nexport interface ICompactIcons {\n [name: string]: string | ILazyIcon;\n}\n\nexport interface INgaoxIcon {\n name: string;\n data: string | ILazyIcon;\n}\n\nexport interface ILazyIcon {\n url: string;\n lazy: true;\n}\n","import { InjectionToken, makeEnvironmentProviders } from '@angular/core';\r\nimport { IconsService } from './icons.service';\r\nimport { INgaoxIcon, NGAOX_FALLBACK } from './models';\r\n\r\nexport const NgaoxGlobalIcons: InjectionToken<INgaoxIcon[]> =\r\n new InjectionToken('NgaoxGlobalIcons');\r\n\r\nexport function provideNgaoxIcons(\r\n icons: INgaoxIcon[] = [],\r\n fallbackIcon: string | undefined = undefined\r\n) {\r\n return makeEnvironmentProviders([\r\n IconsService,\r\n {\r\n provide: NgaoxGlobalIcons,\r\n useValue: icons\r\n },\r\n {\r\n provide: NGAOX_FALLBACK,\r\n useValue: fallbackIcon\r\n }\r\n ]);\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Inject, Injectable, Optional } from '@angular/core';\r\nimport { Observable, of, map, shareReplay } from 'rxjs';\r\nimport { ILazyIcon, INgaoxIcon, NGAOX_FALLBACK } from './models';\r\nimport { NgaoxGlobalIcons } from './icons.module';\r\n\r\nconst defaultFallbackIcon = `\r\n <svg viewBox=\"0 0 612 612\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\">\r\n <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\"/>\r\n </svg>\r\n`;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class IconsService {\r\n private icons = new Map<string, SVGElement>();\r\n private lazyIcons = new Map<string, Observable<SVGElement>>();\r\n\r\n constructor(\r\n private http: HttpClient,\r\n @Inject(DOCUMENT) private document: Document,\r\n @Optional()\r\n @Inject(NGAOX_FALLBACK)\r\n private fallbackIcon: string = defaultFallbackIcon,\r\n @Optional() @Inject(NgaoxGlobalIcons) icons?: INgaoxIcon[]\r\n ) {\r\n icons ??= [];\r\n this.addAll(icons);\r\n }\r\n\r\n private textToSvgElement(svg: string): SVGElement {\r\n const div = this.document.createElement('div');\r\n div.innerHTML = svg;\r\n const svgEl = div.querySelector('svg') as SVGElement;\r\n if (svgEl) {\r\n svgEl.setAttribute('height', '100%');\r\n svgEl.setAttribute('width', '100%');\r\n }\r\n return svgEl;\r\n }\r\n\r\n /**\r\n * Get the fallback icon specified in the import of the `IconsModule.forRoot`\r\n * Used in the `ngaox-icon` component when the icon is not found\r\n * @see {@link https://ngaox-lab.web.app/docs/icons#fallback-icon}\r\n */\r\n getFallbackIcon() {\r\n return this.fallbackIcon;\r\n }\r\n\r\n /**\r\n * get an already registered/added icon\r\n *\r\n * @see {@link IconsService.add}\r\n */\r\n get(name: string): Observable<SVGElement | undefined> {\r\n if (this.icons.has(name)) {\r\n return of(this.icons.get(name));\r\n } else if (this.lazyIcons.has(name)) {\r\n return this.lazyIcons.get(name) ?? of(undefined);\r\n }\r\n return of(undefined);\r\n }\r\n\r\n /**\r\n * Add an SVG icon to the NgaoxIcons registry\r\n *\r\n * @param name the name of the Icon in the registry (used in `ngaox-icon` component and {@link IconsService.get})\r\n * @param value the SVG content or {@link ILazyIcon} for lazy loaded icons\r\n * @param override (default to true) whether or not replacing existing `svg` if `name` already exists\r\n *\r\n */\r\n add(\r\n name: string,\r\n value: string | ILazyIcon\r\n ): Observable<SVGElement | undefined> {\r\n if (typeof value === 'string') {\r\n this.icons.set(name, this.textToSvgElement(value));\r\n } else {\r\n this.lazyIcons.set(\r\n name,\r\n this.http.get(value.url, { responseType: 'text' }).pipe(\r\n map(svg => this.textToSvgElement(svg)),\r\n shareReplay(1)\r\n )\r\n );\r\n }\r\n return this.get(name);\r\n }\r\n\r\n addAll(icons: INgaoxIcon[]) {\r\n icons.forEach(icon => {\r\n this.add(icon.name, icon.data);\r\n });\r\n }\r\n\r\n /**\r\n * remove a registered icon\r\n */\r\n remove(name: string) {\r\n if (this.icons.has(name)) {\r\n this.icons.delete(name);\r\n }\r\n if (this.lazyIcons.has(name)) {\r\n this.lazyIcons.delete(name);\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n DestroyRef,\r\n HostBinding,\r\n effect,\r\n inject,\r\n input,\r\n signal\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Observable } from 'rxjs';\r\nimport { IconsService } from './icons.service';\r\n\r\n@Component({\r\n selector: 'ngaox-icon',\r\n template: ``,\r\n standalone: true,\r\n styles: `\r\n :host {\r\n display: inline-block;\r\n vertical-align: middle;\r\n }\r\n `\r\n})\r\nexport class NgaoxIconComponent {\r\n readonly name = input.required<string>();\r\n readonly url = input<string>();\r\n readonly width = input<string>();\r\n readonly height = input<string>();\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n readonly svgContent = signal<SafeHtml>(\r\n this.sanitizer.bypassSecurityTrustHtml(this.service.getFallbackIcon())\r\n );\r\n\r\n @HostBinding('style.width') get _width() {\r\n return this.width();\r\n }\r\n @HostBinding('style.height') get _height() {\r\n return this.height();\r\n }\r\n\r\n @HostBinding('innerHTML') get _svgContent() {\r\n return this.svgContent();\r\n }\r\n\r\n constructor(\r\n private service: IconsService,\r\n private sanitizer: DomSanitizer\r\n ) {\r\n effect(\r\n () => {\r\n const name = this.name();\r\n const url = this.url();\r\n let icon: Observable<SVGElement | undefined>;\r\n if (url) {\r\n icon = this.service.add(name, {\r\n url,\r\n lazy: true\r\n });\r\n } else {\r\n icon = this.service.get(name);\r\n }\r\n icon.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\r\n next: svg => {\r\n const outerHTML = svg?.outerHTML;\r\n if (!outerHTML) {\r\n throw new Error(\r\n `Icon '${name}' not found or has incorrect content.`\r\n );\r\n }\r\n this.svgContent.set(\r\n this.sanitizer.bypassSecurityTrustHtml(outerHTML)\r\n );\r\n },\r\n error: () => {\r\n this.svgContent.set(\r\n this.sanitizer.bypassSecurityTrustHtml(\r\n this.service.getFallbackIcon()\r\n )\r\n );\r\n throw new Error(\r\n `Icon '${name}' not found or has incorrect content.`\r\n );\r\n }\r\n });\r\n },\r\n {\r\n allowSignalWrites: true\r\n }\r\n );\r\n }\r\n}\r\n","import { INgaoxIcon, ICompactIcons } from '../models';\n\nexport function CompactIconsAdapter(icons: ICompactIcons): INgaoxIcon[] {\n return Object.entries(icons).map(([name, data]) => {\n return {\n name,\n data\n };\n });\n}\n","/*\n * Public API Surface of @ngaox/icons\n */\n\nexport * from './lib/icons.service';\nexport * from './lib/icon.component';\nexport * from './lib/icons.module';\nexport * from './lib/models';\nexport * from './lib/adapters';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.IconsService"],"mappings":"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"}