@ng-icons/core 25.6.0 → 26.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -40,6 +40,7 @@ Got suggestions for additional iconsets? Create an issue and we can consider add
40
40
  | 14.x.x | 17.x.x - 22.x.x |
41
41
  | 15.x.x | 23.x.x - 24.x.x |
42
42
  | 16.x.x | 25.x.x |
43
+ | 17.x.x | 26.x.x |
43
44
 
44
45
  > **Note**: Ng Icons relies on modern browser features and is designed to work on evergreen browsers. We do not support older browsers such as IE11.
45
46
 
@@ -1,5 +1,4 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding, inject, Injector, Input, runInInjectionContext, } from '@angular/core';
2
- import { DomSanitizer } from '@angular/platform-browser';
1
+ import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, inject, Injector, Input, runInInjectionContext, } from '@angular/core';
3
2
  import { injectNgIconConfig } from './providers/icon-config.provider';
4
3
  import { injectNgIconLoader, injectNgIconLoaderCache, } from './providers/icon-loader.provider';
5
4
  import { injectNgIcons } from './providers/icon.provider';
@@ -10,8 +9,6 @@ export class NgIcon {
10
9
  constructor() {
11
10
  /** Access the global icon config */
12
11
  this.config = injectNgIconConfig();
13
- /** Access the sanitizer */
14
- this.sanitizer = inject(DomSanitizer);
15
12
  /** Access the icons */
16
13
  this.icons = injectNgIcons();
17
14
  /** Access the icon loader if defined */
@@ -20,9 +17,10 @@ export class NgIcon {
20
17
  this.cache = injectNgIconLoaderCache();
21
18
  /** Access the injector */
22
19
  this.injector = inject(Injector);
23
- /** Access the change detector */
24
- this.changeDetector = inject(ChangeDetectorRef);
25
- this._size = this.config.size;
20
+ /** Access the element ref */
21
+ this.elementRef = inject(ElementRef);
22
+ /** Define the size of the icon */
23
+ this.size = this.config.size;
26
24
  /** Define the color of the icon */
27
25
  this.color = this.config.color;
28
26
  }
@@ -30,14 +28,6 @@ export class NgIcon {
30
28
  set name(name) {
31
29
  this.setIcon(name);
32
30
  }
33
- /** Define the size of the icon */
34
- set size(size) {
35
- // if the size only contains numbers, assume it is in pixels
36
- this._size = coerceCssPixelValue(size);
37
- }
38
- get size() {
39
- return this._size;
40
- }
41
31
  /**
42
32
  * Load the icon with the given name and insert it into the template.
43
33
  * @param name The name of the icon to load.
@@ -47,13 +37,13 @@ export class NgIcon {
47
37
  for (const icons of [...this.icons].reverse()) {
48
38
  if (icons[propertyName]) {
49
39
  // insert the SVG into the template
50
- this.template = this.sanitizer.bypassSecurityTrustHtml(icons[propertyName]);
40
+ this.elementRef.nativeElement.innerHTML = icons[propertyName];
51
41
  return;
52
42
  }
53
43
  }
54
44
  // if we have a cache check if the icon is already loaded
55
45
  if (this.cache?.has(name)) {
56
- this.template = this.sanitizer.bypassSecurityTrustHtml(this.cache.get(name));
46
+ this.elementRef.nativeElement.innerHTML = this.cache.get(name);
57
47
  return;
58
48
  }
59
49
  // if there is a loader defined, use it to load the icon
@@ -63,9 +53,7 @@ export class NgIcon {
63
53
  if (result !== null) {
64
54
  // if we have a cache, store the result
65
55
  this.cache?.set(name, result);
66
- this.template = this.sanitizer.bypassSecurityTrustHtml(result);
67
- // run change detection as this operation is asynchronous
68
- this.changeDetector.detectChanges();
56
+ this.elementRef.nativeElement.innerHTML = result;
69
57
  return;
70
58
  }
71
59
  }
@@ -85,22 +73,20 @@ export class NgIcon {
85
73
  });
86
74
  });
87
75
  }
88
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NgIcon, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
89
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: NgIcon, isStandalone: true, selector: "ng-icon", inputs: { name: "name", size: "size", strokeWidth: "strokeWidth", color: "color" }, host: { properties: { "innerHTML": "this.template", "style.--ng-icon__size": "this.size", "style.--ng-icon__stroke-width": "this.strokeWidth", "style.color": "this.color" } }, ngImport: i0, template: '', isInline: true, styles: [":host{display:inline-block;width:var(--ng-icon__size);height:var(--ng-icon__size)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
76
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: NgIcon, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
77
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.0.1", type: NgIcon, isStandalone: true, selector: "ng-icon", inputs: { name: "name", size: ["size", "size", coerceCssPixelValue], strokeWidth: "strokeWidth", color: "color" }, host: { properties: { "style.--ng-icon__size": "this.size", "style.--ng-icon__stroke-width": "this.strokeWidth", "style.color": "this.color" } }, ngImport: i0, template: '', isInline: true, styles: [":host{display:inline-block;width:var(--ng-icon__size);height:var(--ng-icon__size)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
90
78
  }
91
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NgIcon, decorators: [{
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: NgIcon, decorators: [{
92
80
  type: Component,
93
81
  args: [{ selector: 'ng-icon', template: '', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block;width:var(--ng-icon__size);height:var(--ng-icon__size)}\n"] }]
94
82
  }], propDecorators: { name: [{
95
83
  type: Input
96
- }], template: [{
97
- type: HostBinding,
98
- args: ['innerHTML']
99
84
  }], size: [{
100
85
  type: HostBinding,
101
86
  args: ['style.--ng-icon__size']
102
87
  }, {
103
- type: Input
88
+ type: Input,
89
+ args: [{ transform: coerceCssPixelValue }]
104
90
  }], strokeWidth: [{
105
91
  type: HostBinding,
106
92
  args: ['style.--ng-icon__stroke-width']
@@ -115,4 +101,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImpor
115
101
  function coerceCssPixelValue(value) {
116
102
  return value == null ? '' : /^\d+$/.test(value) ? `${value}px` : value;
117
103
  }
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvaWNvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFdBQVcsRUFDWCxNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxxQkFBcUIsR0FDdEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsdUJBQXVCLEdBQ3hCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBYWhELE1BQU0sT0FBTyxNQUFNO0lBUG5CO1FBUUUsb0NBQW9DO1FBQ25CLFdBQU0sR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBRS9DLDJCQUEyQjtRQUNWLGNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFbEQsdUJBQXVCO1FBQ04sVUFBSyxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBRXpDLHdDQUF3QztRQUN2QixXQUFNLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUUvQyw4Q0FBOEM7UUFDN0IsVUFBSyxHQUFHLHVCQUF1QixFQUFFLENBQUM7UUFFbkQsMEJBQTBCO1FBQ1QsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU3QyxpQ0FBaUM7UUFDaEIsbUJBQWMsR0FBRyxNQUFNLENBQUMsaUJB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QVE7c0JBQWpDLFdBQVc7dUJBQUMsV0FBVztnQkFLcEIsSUFBSTtzQkFGUCxXQUFXO3VCQUFDLHVCQUF1Qjs7c0JBQ25DLEtBQUs7Z0JBZU4sV0FBVztzQkFGVixXQUFXO3VCQUFDLCtCQUErQjs7c0JBQzNDLEtBQUs7Z0JBTU4sS0FBSztzQkFGSixXQUFXO3VCQUFDLGFBQWE7O3NCQUN6QixLQUFLOztBQWdFUixTQUFTLG1CQUFtQixDQUFDLEtBQWE7SUFDeEMsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEhvc3RCaW5kaW5nLFxuICBpbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgcnVuSW5JbmplY3Rpb25Db250ZXh0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB0eXBlIHsgSWNvbk5hbWUgfSBmcm9tICcuL2ljb24tbmFtZSc7XG5pbXBvcnQgeyBpbmplY3ROZ0ljb25Db25maWcgfSBmcm9tICcuL3Byb3ZpZGVycy9pY29uLWNvbmZpZy5wcm92aWRlcic7XG5pbXBvcnQge1xuICBpbmplY3ROZ0ljb25Mb2FkZXIsXG4gIGluamVjdE5nSWNvbkxvYWRlckNhY2hlLFxufSBmcm9tICcuL3Byb3ZpZGVycy9pY29uLWxvYWRlci5wcm92aWRlcic7XG5pbXBvcnQgeyBpbmplY3ROZ0ljb25zIH0gZnJvbSAnLi9wcm92aWRlcnMvaWNvbi5wcm92aWRlcic7XG5pbXBvcnQgeyBjb2VyY2VMb2FkZXJSZXN1bHQgfSBmcm9tICcuL3V0aWxzL2FzeW5jJztcbmltcG9ydCB7IHRvUHJvcGVydHlOYW1lIH0gZnJvbSAnLi91dGlscy9mb3JtYXQnO1xuXG4vLyBUaGlzIGlzIGEgdHlwZXNjcmlwdCB0eXBlIHRvIHByZXZlbnQgaW5mZXJlbmNlIGZyb20gY29sbGFwc2luZyB0aGUgdW5pb24gdHlwZSB0byBhIHN0cmluZyB0byBpbXByb3ZlIHR5cGUgc2FmZXR5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IHR5cGUgSWNvblR5cGUgPSBJY29uTmFtZSB8IChzdHJpbmcgJiB7fSk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLWljb24nLFxuICB0ZW1wbGF0ZTogJycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHN0eWxlVXJsczogWycuL2ljb24uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5nSWNvbiB7XG4gIC8qKiBBY2Nlc3MgdGhlIGdsb2JhbCBpY29uIGNvbmZpZyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZyA9IGluamVjdE5nSWNvbkNvbmZpZygpO1xuXG4gIC8qKiBBY2Nlc3MgdGhlIHNhbml0aXplciAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNhbml0aXplciA9IGluamVjdChEb21TYW5pdGl6ZXIpO1xuXG4gIC8qKiBBY2Nlc3MgdGhlIGljb25zICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaWNvbnMgPSBpbmplY3ROZ0ljb25zKCk7XG5cbiAgLyoqIEFjY2VzcyB0aGUgaWNvbiBsb2FkZXIgaWYgZGVmaW5lZCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRlciA9IGluamVjdE5nSWNvbkxvYWRlcigpO1xuXG4gIC8qKiBBY2Nlc3MgdGhlIGljb24gbG9hZGVyIGNhY2hlIGlmIGRlZmluZWQgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZSA9IGluamVjdE5nSWNvbkxvYWRlckNhY2hlKCk7XG5cbiAgLyoqIEFjY2VzcyB0aGUgaW5qZWN0b3IgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cbiAgLyoqIEFjY2VzcyB0aGUgY2hhbmdlIGRldGVjdG9yICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3IgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKiBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGljb24gdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSBzZXQgbmFtZShuYW1lOiBJY29uVHlwZSkge1xuICAgIHRoaXMuc2V0SWNvbihuYW1lKTtcbiAgfVxuXG4gIC8qKiBTdG9yZSB0aGUgZm9ybWF0dGVkIGljb24gbmFtZSAqL1xuICBASG9zdEJpbmRpbmcoJ2lubmVySFRNTCcpIHRlbXBsYXRlPzogU2FmZUh0bWw7XG5cbiAgLyoqIERlZmluZSB0aGUgc2l6ZSBvZiB0aGUgaWNvbiAqL1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLi0tbmctaWNvbl9fc2l6ZScpXG4gIEBJbnB1dCgpXG4gIHNldCBzaXplKHNpemU6IHN0cmluZykge1xuICAgIC8vIGlmIHRoZSBzaXplIG9ubHkgY29udGFpbnMgbnVtYmVycywgYXNzdW1lIGl0IGlzIGluIHBpeGVsc1xuICAgIHRoaXMuX3NpemUgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHNpemUpO1xuICB9XG5cbiAgZ2V0IHNpemUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NpemU6IHN0cmluZyA9IHRoaXMuY29uZmlnLnNpemU7XG5cbiAgLyoqIERlZmluZSB0aGUgc3Ryb2tlLXdpZHRoIG9mIHRoZSBpY29uICovXG4gIEBIb3N0QmluZGluZygnc3R5bGUuLS1uZy1pY29uX19zdHJva2Utd2lkdGgnKVxuICBASW5wdXQoKVxuICBzdHJva2VXaWR0aD86IHN0cmluZyB8IG51bWJlcjtcblxuICAvKiogRGVmaW5lIHRoZSBjb2xvciBvZiB0aGUgaWNvbiAqL1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmNvbG9yJylcbiAgQElucHV0KClcbiAgY29sb3I/OiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5jb2xvcjtcblxuICAvKipcbiAgICogTG9hZCB0aGUgaWNvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgdGVtcGxhdGUuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpY29uIHRvIGxvYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNldEljb24obmFtZTogSWNvblR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSB0b1Byb3BlcnR5TmFtZShuYW1lKTtcbiAgICBmb3IgKGNvbnN0IGljb25zIG9mIFsuLi50aGlzLmljb25zXS5yZXZlcnNlKCkpIHtcbiAgICAgIGlmIChpY29uc1twcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgIC8vIGluc2VydCB0aGUgU1ZHIGludG8gdGhlIHRlbXBsYXRlXG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcbiAgICAgICAgICBpY29uc1twcm9wZXJ0eU5hbWVdLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGF2ZSBhIGNhY2hlIGNoZWNrIGlmIHRoZSBpY29uIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgaWYgKHRoaXMuY2FjaGU/LmhhcyhuYW1lKSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKFxuICAgICAgICB0aGlzLmNhY2hlLmdldChuYW1lKSEsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIGlzIGEgbG9hZGVyIGRlZmluZWQsIHVzZSBpdCB0byBsb2FkIHRoZSBpY29uXG4gICAgaWYgKHRoaXMubG9hZGVyKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3RJY29uRnJvbUxvYWRlcihuYW1lKTtcblxuICAgICAgLy8gaWYgdGhlIHJlc3VsdCBpcyBhIHN0cmluZywgaW5zZXJ0IHRoZSBTVkcgaW50byB0aGUgdGVtcGxhdGVcbiAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIGNhY2hlLCBzdG9yZSB0aGUgcmVzdWx0XG4gICAgICAgIHRoaXMuY2FjaGU/LnNldChuYW1lLCByZXN1bHQpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwocmVzdWx0KTtcblxuICAgICAgICAvLyBydW4gY2hhbmdlIGRldGVjdGlvbiBhcyB0aGlzIG9wZXJhdGlvbiBpcyBhc3luY2hyb25vdXNcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSBpcyBubyBpY29uIHdpdGggdGhpcyBuYW1lIHdhcm4gdGhlIHVzZXIgYXMgdGhleSBwcm9iYWJseSBmb3Jnb3QgdG8gaW1wb3J0IGl0XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYE5vIGljb24gbmFtZWQgJHtuYW1lfSB3YXMgZm91bmQuIFlvdSBtYXkgbmVlZCB0byBpbXBvcnQgaXQgdXNpbmcgdGhlIHdpdGhJY29ucyBmdW5jdGlvbi5gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0aGUgaWNvbiBmcm9tIHRoZSBsb2FkZXIuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpY29uIHRvIGxvYWQuXG4gICAqIEByZXR1cm5zIFRoZSBTVkcgY29udGVudCBmb3IgYSBnaXZlbiBpY29uIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3RJY29uRnJvbUxvYWRlcihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvZXJjZUxvYWRlclJlc3VsdCh0aGlzLmxvYWRlciEobmFtZSkpO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2VyY2VDc3NQaXhlbFZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogL15cXGQrJC8udGVzdCh2YWx1ZSkgPyBgJHt2YWx1ZX1weGAgOiB2YWx1ZTtcbn1cbiJdfQ==
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvaWNvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxxQkFBcUIsR0FDdEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxFQUNMLGtCQUFrQixFQUNsQix1QkFBdUIsR0FDeEIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFhaEQsTUFBTSxPQUFPLE1BQU07SUFQbkI7UUFRRSxvQ0FBb0M7UUFDbkIsV0FBTSxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFFL0MsdUJBQXVCO1FBQ04sVUFBSyxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBRXpDLHdDQUF3QztRQUN2QixXQUFNLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUUvQyw4Q0FBOEM7UUFDN0IsVUFBSyxHQUFHLHVCQUF1QixFQUFFLENBQUM7UUFFbkQsMEJBQTBCO1FBQ1QsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU3Qyw2QkFBNkI7UUFDWixlQUFVLEdBQUcsTUFBTSxDQUEwQixVQUFVLENBQUMsQ0FBQztRQU8xRSxrQ0FBa0M7UUFHbEMsU0FBSSxHQUFxQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQU8xQyxtQ0FBbUM7UUFHbkMsVUFBSyxHQUFZ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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIGluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBydW5JbkluamVjdGlvbkNvbnRleHQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBJY29uTmFtZSB9IGZyb20gJy4vaWNvbi1uYW1lJztcbmltcG9ydCB7IGluamVjdE5nSWNvbkNvbmZpZyB9IGZyb20gJy4vcHJvdmlkZXJzL2ljb24tY29uZmlnLnByb3ZpZGVyJztcbmltcG9ydCB7XG4gIGluamVjdE5nSWNvbkxvYWRlcixcbiAgaW5qZWN0TmdJY29uTG9hZGVyQ2FjaGUsXG59IGZyb20gJy4vcHJvdmlkZXJzL2ljb24tbG9hZGVyLnByb3ZpZGVyJztcbmltcG9ydCB7IGluamVjdE5nSWNvbnMgfSBmcm9tICcuL3Byb3ZpZGVycy9pY29uLnByb3ZpZGVyJztcbmltcG9ydCB7IGNvZXJjZUxvYWRlclJlc3VsdCB9IGZyb20gJy4vdXRpbHMvYXN5bmMnO1xuaW1wb3J0IHsgdG9Qcm9wZXJ0eU5hbWUgfSBmcm9tICcuL3V0aWxzL2Zvcm1hdCc7XG5cbi8vIFRoaXMgaXMgYSB0eXBlc2NyaXB0IHR5cGUgdG8gcHJldmVudCBpbmZlcmVuY2UgZnJvbSBjb2xsYXBzaW5nIHRoZSB1bmlvbiB0eXBlIHRvIGEgc3RyaW5nIHRvIGltcHJvdmUgdHlwZSBzYWZldHlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG5leHBvcnQgdHlwZSBJY29uVHlwZSA9IEljb25OYW1lIHwgKHN0cmluZyAmIHt9KTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctaWNvbicsXG4gIHRlbXBsYXRlOiAnJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc3R5bGVVcmxzOiBbJy4vaWNvbi5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmdJY29uIHtcbiAgLyoqIEFjY2VzcyB0aGUgZ2xvYmFsIGljb24gY29uZmlnICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0TmdJY29uQ29uZmlnKCk7XG5cbiAgLyoqIEFjY2VzcyB0aGUgaWNvbnMgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpY29ucyA9IGluamVjdE5nSWNvbnMoKTtcblxuICAvKiogQWNjZXNzIHRoZSBpY29uIGxvYWRlciBpZiBkZWZpbmVkICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGVyID0gaW5qZWN0TmdJY29uTG9hZGVyKCk7XG5cbiAgLyoqIEFjY2VzcyB0aGUgaWNvbiBsb2FkZXIgY2FjaGUgaWYgZGVmaW5lZCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gaW5qZWN0TmdJY29uTG9hZGVyQ2FjaGUoKTtcblxuICAvKiogQWNjZXNzIHRoZSBpbmplY3RvciAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAvKiogQWNjZXNzIHRoZSBlbGVtZW50IHJlZiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuXG4gIC8qKiBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGljb24gdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSBzZXQgbmFtZShuYW1lOiBJY29uVHlwZSkge1xuICAgIHRoaXMuc2V0SWNvbihuYW1lKTtcbiAgfVxuXG4gIC8qKiBEZWZpbmUgdGhlIHNpemUgb2YgdGhlIGljb24gKi9cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS4tLW5nLWljb25fX3NpemUnKVxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUNzc1BpeGVsVmFsdWUgfSlcbiAgc2l6ZT86IHN0cmluZyB8IG51bWJlciA9IHRoaXMuY29uZmlnLnNpemU7XG5cbiAgLyoqIERlZmluZSB0aGUgc3Ryb2tlLXdpZHRoIG9mIHRoZSBpY29uICovXG4gIEBIb3N0QmluZGluZygnc3R5bGUuLS1uZy1pY29uX19zdHJva2Utd2lkdGgnKVxuICBASW5wdXQoKVxuICBzdHJva2VXaWR0aD86IHN0cmluZyB8IG51bWJlcjtcblxuICAvKiogRGVmaW5lIHRoZSBjb2xvciBvZiB0aGUgaWNvbiAqL1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmNvbG9yJylcbiAgQElucHV0KClcbiAgY29sb3I/OiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5jb2xvcjtcblxuICAvKipcbiAgICogTG9hZCB0aGUgaWNvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgdGVtcGxhdGUuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpY29uIHRvIGxvYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNldEljb24obmFtZTogSWNvblR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSB0b1Byb3BlcnR5TmFtZShuYW1lKTtcbiAgICBmb3IgKGNvbnN0IGljb25zIG9mIFsuLi50aGlzLmljb25zXS5yZXZlcnNlKCkpIHtcbiAgICAgIGlmIChpY29uc1twcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgIC8vIGluc2VydCB0aGUgU1ZHIGludG8gdGhlIHRlbXBsYXRlXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGljb25zW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBoYXZlIGEgY2FjaGUgY2hlY2sgaWYgdGhlIGljb24gaXMgYWxyZWFkeSBsb2FkZWRcbiAgICBpZiAodGhpcy5jYWNoZT8uaGFzKG5hbWUpKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLmNhY2hlLmdldChuYW1lKSE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgaXMgYSBsb2FkZXIgZGVmaW5lZCwgdXNlIGl0IHRvIGxvYWQgdGhlIGljb25cbiAgICBpZiAodGhpcy5sb2FkZXIpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdEljb25Gcm9tTG9hZGVyKG5hbWUpO1xuXG4gICAgICAvLyBpZiB0aGUgcmVzdWx0IGlzIGEgc3RyaW5nLCBpbnNlcnQgdGhlIFNWRyBpbnRvIHRoZSB0ZW1wbGF0ZVxuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgY2FjaGUsIHN0b3JlIHRoZSByZXN1bHRcbiAgICAgICAgdGhpcy5jYWNoZT8uc2V0KG5hbWUsIHJlc3VsdCk7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGljb24gd2l0aCB0aGlzIG5hbWUgd2FybiB0aGUgdXNlciBhcyB0aGV5IHByb2JhYmx5IGZvcmdvdCB0byBpbXBvcnQgaXRcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgTm8gaWNvbiBuYW1lZCAke25hbWV9IHdhcyBmb3VuZC4gWW91IG1heSBuZWVkIHRvIGltcG9ydCBpdCB1c2luZyB0aGUgd2l0aEljb25zIGZ1bmN0aW9uLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoZSBpY29uIGZyb20gdGhlIGxvYWRlci5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGljb24gdG8gbG9hZC5cbiAgICogQHJldHVybnMgVGhlIFNWRyBjb250ZW50IGZvciBhIGdpdmVuIGljb24gbmFtZS5cbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdEljb25Gcm9tTG9hZGVyKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29lcmNlTG9hZGVyUmVzdWx0KHRoaXMubG9hZGVyIShuYW1lKSk7XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvZXJjZUNzc1BpeGVsVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiAvXlxcZCskLy50ZXN0KHZhbHVlKSA/IGAke3ZhbHVlfXB4YCA6IHZhbHVlO1xufVxuIl19
@@ -16,19 +16,19 @@ export class NgIconsModule {
16
16
  static withIcons(icons) {
17
17
  return { ngModule: NgIconsModule, providers: provideIcons(icons) };
18
18
  }
19
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NgIconsModule, deps: [{ token: NgIconsToken }], target: i0.ɵɵFactoryTarget.NgModule }); }
20
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.5", ngImport: i0, type: NgIconsModule, imports: [NgIcon], exports: [NgIcon] }); }
21
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NgIconsModule }); }
19
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: NgIconsModule, deps: [{ token: NgIconsToken }], target: i0.ɵɵFactoryTarget.NgModule }); }
20
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.1", ngImport: i0, type: NgIconsModule, imports: [NgIcon], exports: [NgIcon] }); }
21
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: NgIconsModule }); }
22
22
  }
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NgIconsModule, decorators: [{
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: NgIconsModule, decorators: [{
24
24
  type: NgModule,
25
25
  args: [{
26
26
  imports: [NgIcon],
27
27
  exports: [NgIcon],
28
28
  }]
29
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
29
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
30
30
  type: Inject,
31
31
  args: [NgIconsToken]
32
- }] }]; } });
32
+ }] }] });
33
33
  export const NG_ICON_DIRECTIVES = [NgIcon];
34
34
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvaWNvbi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBdUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQU12RSxNQUFNLE9BQU8sYUFBYTtJQUN4QixZQUFrQyxLQUE2QjtRQUM3RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNuQyxNQUFNLElBQUksS0FBSyxDQUNiLHFIQUFxSCxDQUN0SCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxTQUFTLENBQ2QsS0FBNkI7UUFFN0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQ3JFLENBQUM7OEdBbEJVLGFBQWEsa0JBQ0osWUFBWTsrR0FEckIsYUFBYSxZQUhkLE1BQU0sYUFDTixNQUFNOytHQUVMLGFBQWE7OzJGQUFiLGFBQWE7a0JBSnpCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO29CQUNqQixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7aUJBQ2xCOzswQkFFYyxNQUFNOzJCQUFDLFlBQVk7O0FBb0JsQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE1BQU0sQ0FBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdJY29uIH0gZnJvbSAnLi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ0ljb25zVG9rZW4sIHByb3ZpZGVJY29ucyB9IGZyb20gJy4vcHJvdmlkZXJzL2ljb24ucHJvdmlkZXInO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbTmdJY29uXSxcbiAgZXhwb3J0czogW05nSWNvbl0sXG59KVxuZXhwb3J0IGNsYXNzIE5nSWNvbnNNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KE5nSWNvbnNUb2tlbikgaWNvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoaWNvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnTm8gaWNvbnMgaGF2ZSBiZWVuIHByb3ZpZGVkLiBFbnN1cmUgdG8gaW5jbHVkZSBzb21lIGljb25zIGJ5IGltcG9ydGluZyB0aGVtIHVzaW5nIE5nSWNvbnNNb2R1bGUud2l0aEljb25zKHsgLi4uIH0pLicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgdGhlIGljb25zIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgYXBwbGljYXRpb24uIFRoaXMgYWxsb3dzIHVudXNlZCBpY29ucyB0b1xuICAgKiBiZSB0cmVlLXNoYWtlbiBhd2F5IHRvIHJlZHVjZSBidW5kbGUgc2l6ZVxuICAgKiBAcGFyYW0gaWNvbnMgVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSByZXF1aXJlZCBpY29uc1xuICAgKi9cbiAgc3RhdGljIHdpdGhJY29ucyhcbiAgICBpY29uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxOZ0ljb25zTW9kdWxlPiB7XG4gICAgcmV0dXJuIHsgbmdNb2R1bGU6IE5nSWNvbnNNb2R1bGUsIHByb3ZpZGVyczogcHJvdmlkZUljb25zKGljb25zKSB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBOR19JQ09OX0RJUkVDVElWRVMgPSBbTmdJY29uXSBhcyBjb25zdDtcbiJdfQ==
@@ -1,6 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, Optional, SkipSelf, Injector, ChangeDetectorRef, runInInjectionContext, Component, ChangeDetectionStrategy, Input, HostBinding, NgModule, Inject } from '@angular/core';
3
- import { DomSanitizer } from '@angular/platform-browser';
2
+ import { InjectionToken, inject, Optional, SkipSelf, Injector, ElementRef, runInInjectionContext, Component, ChangeDetectionStrategy, Input, HostBinding, NgModule, Inject } from '@angular/core';
4
3
  import { isObservable, firstValueFrom } from 'rxjs';
5
4
 
6
5
  const NgIconConfigToken = new InjectionToken('Ng Icon Config');
@@ -122,8 +121,6 @@ class NgIcon {
122
121
  constructor() {
123
122
  /** Access the global icon config */
124
123
  this.config = injectNgIconConfig();
125
- /** Access the sanitizer */
126
- this.sanitizer = inject(DomSanitizer);
127
124
  /** Access the icons */
128
125
  this.icons = injectNgIcons();
129
126
  /** Access the icon loader if defined */
@@ -132,9 +129,10 @@ class NgIcon {
132
129
  this.cache = injectNgIconLoaderCache();
133
130
  /** Access the injector */
134
131
  this.injector = inject(Injector);
135
- /** Access the change detector */
136
- this.changeDetector = inject(ChangeDetectorRef);
137
- this._size = this.config.size;
132
+ /** Access the element ref */
133
+ this.elementRef = inject(ElementRef);
134
+ /** Define the size of the icon */
135
+ this.size = this.config.size;
138
136
  /** Define the color of the icon */
139
137
  this.color = this.config.color;
140
138
  }
@@ -142,14 +140,6 @@ class NgIcon {
142
140
  set name(name) {
143
141
  this.setIcon(name);
144
142
  }
145
- /** Define the size of the icon */
146
- set size(size) {
147
- // if the size only contains numbers, assume it is in pixels
148
- this._size = coerceCssPixelValue(size);
149
- }
150
- get size() {
151
- return this._size;
152
- }
153
143
  /**
154
144
  * Load the icon with the given name and insert it into the template.
155
145
  * @param name The name of the icon to load.
@@ -159,13 +149,13 @@ class NgIcon {
159
149
  for (const icons of [...this.icons].reverse()) {
160
150
  if (icons[propertyName]) {
161
151
  // insert the SVG into the template
162
- this.template = this.sanitizer.bypassSecurityTrustHtml(icons[propertyName]);
152
+ this.elementRef.nativeElement.innerHTML = icons[propertyName];
163
153
  return;
164
154
  }
165
155
  }
166
156
  // if we have a cache check if the icon is already loaded
167
157
  if (this.cache?.has(name)) {
168
- this.template = this.sanitizer.bypassSecurityTrustHtml(this.cache.get(name));
158
+ this.elementRef.nativeElement.innerHTML = this.cache.get(name);
169
159
  return;
170
160
  }
171
161
  // if there is a loader defined, use it to load the icon
@@ -175,9 +165,7 @@ class NgIcon {
175
165
  if (result !== null) {
176
166
  // if we have a cache, store the result
177
167
  this.cache?.set(name, result);
178
- this.template = this.sanitizer.bypassSecurityTrustHtml(result);
179
- // run change detection as this operation is asynchronous
180
- this.changeDetector.detectChanges();
168
+ this.elementRef.nativeElement.innerHTML = result;
181
169
  return;
182
170
  }
183
171
  }
@@ -197,22 +185,20 @@ class NgIcon {
197
185
  });
198
186
  });
199
187
  }
200
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NgIcon, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
201
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: NgIcon, isStandalone: true, selector: "ng-icon", inputs: { name: "name", size: "size", strokeWidth: "strokeWidth", color: "color" }, host: { properties: { "innerHTML": "this.template", "style.--ng-icon__size": "this.size", "style.--ng-icon__stroke-width": "this.strokeWidth", "style.color": "this.color" } }, ngImport: i0, template: '', isInline: true, styles: [":host{display:inline-block;width:var(--ng-icon__size);height:var(--ng-icon__size)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
188
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: NgIcon, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
189
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.0.1", type: NgIcon, isStandalone: true, selector: "ng-icon", inputs: { name: "name", size: ["size", "size", coerceCssPixelValue], strokeWidth: "strokeWidth", color: "color" }, host: { properties: { "style.--ng-icon__size": "this.size", "style.--ng-icon__stroke-width": "this.strokeWidth", "style.color": "this.color" } }, ngImport: i0, template: '', isInline: true, styles: [":host{display:inline-block;width:var(--ng-icon__size);height:var(--ng-icon__size)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
202
190
  }
203
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NgIcon, decorators: [{
191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: NgIcon, decorators: [{
204
192
  type: Component,
205
193
  args: [{ selector: 'ng-icon', template: '', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block;width:var(--ng-icon__size);height:var(--ng-icon__size)}\n"] }]
206
194
  }], propDecorators: { name: [{
207
195
  type: Input
208
- }], template: [{
209
- type: HostBinding,
210
- args: ['innerHTML']
211
196
  }], size: [{
212
197
  type: HostBinding,
213
198
  args: ['style.--ng-icon__size']
214
199
  }, {
215
- type: Input
200
+ type: Input,
201
+ args: [{ transform: coerceCssPixelValue }]
216
202
  }], strokeWidth: [{
217
203
  type: HostBinding,
218
204
  args: ['style.--ng-icon__stroke-width']
@@ -242,20 +228,20 @@ class NgIconsModule {
242
228
  static withIcons(icons) {
243
229
  return { ngModule: NgIconsModule, providers: provideIcons(icons) };
244
230
  }
245
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NgIconsModule, deps: [{ token: NgIconsToken }], target: i0.ɵɵFactoryTarget.NgModule }); }
246
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.5", ngImport: i0, type: NgIconsModule, imports: [NgIcon], exports: [NgIcon] }); }
247
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NgIconsModule }); }
231
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: NgIconsModule, deps: [{ token: NgIconsToken }], target: i0.ɵɵFactoryTarget.NgModule }); }
232
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.1", ngImport: i0, type: NgIconsModule, imports: [NgIcon], exports: [NgIcon] }); }
233
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: NgIconsModule }); }
248
234
  }
249
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: NgIconsModule, decorators: [{
235
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: NgIconsModule, decorators: [{
250
236
  type: NgModule,
251
237
  args: [{
252
238
  imports: [NgIcon],
253
239
  exports: [NgIcon],
254
240
  }]
255
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
241
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
256
242
  type: Inject,
257
243
  args: [NgIconsToken]
258
- }] }]; } });
244
+ }] }] });
259
245
  const NG_ICON_DIRECTIVES = [NgIcon];
260
246
 
261
247
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ng-icons-core.mjs","sources":["../../../../packages/core/src/lib/providers/icon-config.provider.ts","../../../../packages/core/src/lib/providers/icon-loader.provider.ts","../../../../packages/core/src/lib/providers/icon.provider.ts","../../../../packages/core/src/lib/utils/async.ts","../../../../packages/core/src/lib/utils/format.ts","../../../../packages/core/src/lib/icon.component.ts","../../../../packages/core/src/lib/icon.module.ts","../../../../packages/core/src/ng-icons-core.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\n\nexport interface NgIconConfig {\n /** Define the default size of icons */\n size: string;\n /** Define the default color of icons */\n color?: string;\n}\n\nexport const NgIconConfigToken = new InjectionToken<NgIconConfig>(\n 'Ng Icon Config',\n);\n\nconst defaultConfig: NgIconConfig = {\n size: '1em',\n};\n\n/**\n * Provide the configuration for the icons\n * @param config The configuration to use\n */\nexport function provideNgIconsConfig(config: Partial<NgIconConfig>): Provider {\n return {\n provide: NgIconConfigToken,\n useValue: { ...defaultConfig, ...config },\n };\n}\n\n/**\n * Inject the configuration for the icons\n * @returns The configuration to use\n * @internal\n */\nexport function injectNgIconConfig(): NgIconConfig {\n return inject(NgIconConfigToken, { optional: true }) ?? defaultConfig;\n}\n","import { inject, InjectionToken, Provider } from '@angular/core';\nimport type { Observable } from 'rxjs';\n\nexport type NgIconLoader = (\n name: string,\n) => Promise<string> | Observable<string> | string;\n\nexport const NgIconLoaderToken = new InjectionToken<NgIconLoader>(\n 'Ng Icon Loader Token',\n);\n\n/**\n * The list of features as an enum to uniquely type each feature.\n */\nconst enum NgIconLoaderFeatureKind {\n CachingFeature,\n}\n\ninterface NgIconLoaderFeature<FeatureKind extends NgIconLoaderFeatureKind> {\n kind: FeatureKind;\n providers: Provider[];\n}\n\n/**\n * Helper function to create an object that represents a Loader feature.\n */\nfunction loaderFeature<FeatureKind extends NgIconLoaderFeatureKind>(\n kind: FeatureKind,\n providers: Provider[],\n): NgIconLoaderFeature<FeatureKind> {\n return { kind: kind, providers: providers };\n}\n\ntype CachingFeature =\n NgIconLoaderFeature<NgIconLoaderFeatureKind.CachingFeature>;\n\ntype NgIconLoaderFeatures = CachingFeature;\n\nexport type NgIconLoaderCache = Map<string, string>;\n\nexport const NgIconCacheToken = new InjectionToken<NgIconLoaderCache>(\n 'Ng Icon Cache Token',\n);\n\n/**\n * Add caching to the loader. This will prevent the loader from being called multiple times for the same icon name.\n */\nexport function withCaching(): CachingFeature {\n return loaderFeature(NgIconLoaderFeatureKind.CachingFeature, [\n { provide: NgIconCacheToken, useValue: new Map<string, string>() },\n ]);\n}\n\n/**\n * Provide a function that will return the SVG content for a given icon name.\n * @param loader The function that will return the SVG content for a given icon name.\n * @param features The list of features to apply to the loader.\n * @returns The SVG content for a given icon name.\n */\nexport function provideNgIconLoader(\n loader: NgIconLoader,\n ...features: NgIconLoaderFeatures[]\n) {\n return [\n { provide: NgIconLoaderToken, useValue: loader },\n features.map(feature => feature.providers),\n ];\n}\n\n/**\n * Inject the function that will return the SVG content for a given icon name.\n */\nexport function injectNgIconLoader(): NgIconLoader | null {\n return inject(NgIconLoaderToken, { optional: true });\n}\n\n/**\n * Inject the cache that will store the SVG content for a given icon name.\n */\nexport function injectNgIconLoaderCache(): NgIconLoaderCache | null {\n return inject(NgIconCacheToken, { optional: true });\n}\n","import {\n InjectionToken,\n Optional,\n Provider,\n SkipSelf,\n inject,\n} from '@angular/core';\n\n/**\n * Define the icons to use\n * @param icons The icons to provide\n */\nexport function provideIcons(icons: Record<string, string>): Provider[] {\n return [\n {\n provide: NgIconsToken,\n useFactory: (parentIcons?: Record<string, string>[]) => ({\n ...parentIcons?.reduce((acc, icons) => ({ ...acc, ...icons }), {}),\n ...icons,\n }),\n deps: [[NgIconsToken, new Optional(), new SkipSelf()]],\n multi: true,\n },\n ];\n}\n\nexport const NgIconsToken = new InjectionToken<Record<string, string>[]>(\n 'Icons Token',\n);\n\n/**\n * Inject the icons to use\n * @returns The icons to use\n * @internal\n */\nexport function injectNgIcons(): Record<string, string>[] {\n return inject(NgIconsToken, { optional: true }) ?? [];\n}\n","import { Observable, firstValueFrom, isObservable } from 'rxjs';\n\n/**\n * A loader may return a promise, an observable or a string. This function will coerce the result into a promise.\n * @returns\n */\nexport function coerceLoaderResult(\n result: Promise<string> | Observable<string> | string,\n): Promise<string> {\n if (typeof result === 'string') {\n return Promise.resolve(result);\n }\n\n if (isObservable(result)) {\n return firstValueFrom(result);\n }\n\n return result;\n}\n","/**\n * Hyphenated to lowerCamelCase\n */\nexport function toPropertyName(str: string): string {\n return str\n .replace(/([^a-zA-Z0-9])+(.)?/g, (_, __, chr) =>\n chr ? chr.toUpperCase() : '',\n )\n .replace(/[^a-zA-Z\\d]/g, '')\n .replace(/^([A-Z])/, m => m.toLowerCase());\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostBinding,\n inject,\n Injector,\n Input,\n runInInjectionContext,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport type { IconName } from './icon-name';\nimport { injectNgIconConfig } from './providers/icon-config.provider';\nimport {\n injectNgIconLoader,\n injectNgIconLoaderCache,\n} from './providers/icon-loader.provider';\nimport { injectNgIcons } from './providers/icon.provider';\nimport { coerceLoaderResult } from './utils/async';\nimport { toPropertyName } from './utils/format';\n\n// This is a typescript type to prevent inference from collapsing the union type to a string to improve type safety\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type IconType = IconName | (string & {});\n\n@Component({\n selector: 'ng-icon',\n template: '',\n standalone: true,\n styleUrls: ['./icon.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgIcon {\n /** Access the global icon config */\n private readonly config = injectNgIconConfig();\n\n /** Access the sanitizer */\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Access the icons */\n private readonly icons = injectNgIcons();\n\n /** Access the icon loader if defined */\n private readonly loader = injectNgIconLoader();\n\n /** Access the icon loader cache if defined */\n private readonly cache = injectNgIconLoaderCache();\n\n /** Access the injector */\n private readonly injector = inject(Injector);\n\n /** Access the change detector */\n private readonly changeDetector = inject(ChangeDetectorRef);\n\n /** Define the name of the icon to display */\n @Input() set name(name: IconType) {\n this.setIcon(name);\n }\n\n /** Store the formatted icon name */\n @HostBinding('innerHTML') template?: SafeHtml;\n\n /** Define the size of the icon */\n @HostBinding('style.--ng-icon__size')\n @Input()\n set size(size: string) {\n // if the size only contains numbers, assume it is in pixels\n this._size = coerceCssPixelValue(size);\n }\n\n get size(): string {\n return this._size;\n }\n\n private _size: string = this.config.size;\n\n /** Define the stroke-width of the icon */\n @HostBinding('style.--ng-icon__stroke-width')\n @Input()\n strokeWidth?: string | number;\n\n /** Define the color of the icon */\n @HostBinding('style.color')\n @Input()\n color?: string = this.config.color;\n\n /**\n * Load the icon with the given name and insert it into the template.\n * @param name The name of the icon to load.\n */\n private async setIcon(name: IconType): Promise<void> {\n const propertyName = toPropertyName(name);\n for (const icons of [...this.icons].reverse()) {\n if (icons[propertyName]) {\n // insert the SVG into the template\n this.template = this.sanitizer.bypassSecurityTrustHtml(\n icons[propertyName],\n );\n return;\n }\n }\n\n // if we have a cache check if the icon is already loaded\n if (this.cache?.has(name)) {\n this.template = this.sanitizer.bypassSecurityTrustHtml(\n this.cache.get(name)!,\n );\n return;\n }\n\n // if there is a loader defined, use it to load the icon\n if (this.loader) {\n const result = await this.requestIconFromLoader(name);\n\n // if the result is a string, insert the SVG into the template\n if (result !== null) {\n // if we have a cache, store the result\n this.cache?.set(name, result);\n this.template = this.sanitizer.bypassSecurityTrustHtml(result);\n\n // run change detection as this operation is asynchronous\n this.changeDetector.detectChanges();\n return;\n }\n }\n\n // if there is no icon with this name warn the user as they probably forgot to import it\n console.warn(\n `No icon named ${name} was found. You may need to import it using the withIcons function.`,\n );\n }\n\n /**\n * Request the icon from the loader.\n * @param name The name of the icon to load.\n * @returns The SVG content for a given icon name.\n */\n private requestIconFromLoader(name: string): Promise<string> {\n return new Promise(resolve => {\n runInInjectionContext(this.injector, async () => {\n const result = await coerceLoaderResult(this.loader!(name));\n resolve(result);\n });\n });\n }\n}\n\nfunction coerceCssPixelValue(value: string): string {\n return value == null ? '' : /^\\d+$/.test(value) ? `${value}px` : value;\n}\n","import { Inject, ModuleWithProviders, NgModule } from '@angular/core';\nimport { NgIcon } from './icon.component';\nimport { NgIconsToken, provideIcons } from './providers/icon.provider';\n\n@NgModule({\n imports: [NgIcon],\n exports: [NgIcon],\n})\nexport class NgIconsModule {\n constructor(@Inject(NgIconsToken) icons: Record<string, string>) {\n if (Object.keys(icons).length === 0) {\n throw new Error(\n 'No icons have been provided. Ensure to include some icons by importing them using NgIconsModule.withIcons({ ... }).',\n );\n }\n }\n\n /**\n * Define the icons that will be included in the application. This allows unused icons to\n * be tree-shaken away to reduce bundle size\n * @param icons The object containing the required icons\n */\n static withIcons(\n icons: Record<string, string>,\n ): ModuleWithProviders<NgIconsModule> {\n return { ngModule: NgIconsModule, providers: provideIcons(icons) };\n }\n}\n\nexport const NG_ICON_DIRECTIVES = [NgIcon] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-icons-core.mjs","sources":["../../../../packages/core/src/lib/providers/icon-config.provider.ts","../../../../packages/core/src/lib/providers/icon-loader.provider.ts","../../../../packages/core/src/lib/providers/icon.provider.ts","../../../../packages/core/src/lib/utils/async.ts","../../../../packages/core/src/lib/utils/format.ts","../../../../packages/core/src/lib/icon.component.ts","../../../../packages/core/src/lib/icon.module.ts","../../../../packages/core/src/ng-icons-core.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\n\nexport interface NgIconConfig {\n /** Define the default size of icons */\n size: string;\n /** Define the default color of icons */\n color?: string;\n}\n\nexport const NgIconConfigToken = new InjectionToken<NgIconConfig>(\n 'Ng Icon Config',\n);\n\nconst defaultConfig: NgIconConfig = {\n size: '1em',\n};\n\n/**\n * Provide the configuration for the icons\n * @param config The configuration to use\n */\nexport function provideNgIconsConfig(config: Partial<NgIconConfig>): Provider {\n return {\n provide: NgIconConfigToken,\n useValue: { ...defaultConfig, ...config },\n };\n}\n\n/**\n * Inject the configuration for the icons\n * @returns The configuration to use\n * @internal\n */\nexport function injectNgIconConfig(): NgIconConfig {\n return inject(NgIconConfigToken, { optional: true }) ?? defaultConfig;\n}\n","import { inject, InjectionToken, Provider } from '@angular/core';\nimport type { Observable } from 'rxjs';\n\nexport type NgIconLoader = (\n name: string,\n) => Promise<string> | Observable<string> | string;\n\nexport const NgIconLoaderToken = new InjectionToken<NgIconLoader>(\n 'Ng Icon Loader Token',\n);\n\n/**\n * The list of features as an enum to uniquely type each feature.\n */\nconst enum NgIconLoaderFeatureKind {\n CachingFeature,\n}\n\ninterface NgIconLoaderFeature<FeatureKind extends NgIconLoaderFeatureKind> {\n kind: FeatureKind;\n providers: Provider[];\n}\n\n/**\n * Helper function to create an object that represents a Loader feature.\n */\nfunction loaderFeature<FeatureKind extends NgIconLoaderFeatureKind>(\n kind: FeatureKind,\n providers: Provider[],\n): NgIconLoaderFeature<FeatureKind> {\n return { kind: kind, providers: providers };\n}\n\ntype CachingFeature =\n NgIconLoaderFeature<NgIconLoaderFeatureKind.CachingFeature>;\n\ntype NgIconLoaderFeatures = CachingFeature;\n\nexport type NgIconLoaderCache = Map<string, string>;\n\nexport const NgIconCacheToken = new InjectionToken<NgIconLoaderCache>(\n 'Ng Icon Cache Token',\n);\n\n/**\n * Add caching to the loader. This will prevent the loader from being called multiple times for the same icon name.\n */\nexport function withCaching(): CachingFeature {\n return loaderFeature(NgIconLoaderFeatureKind.CachingFeature, [\n { provide: NgIconCacheToken, useValue: new Map<string, string>() },\n ]);\n}\n\n/**\n * Provide a function that will return the SVG content for a given icon name.\n * @param loader The function that will return the SVG content for a given icon name.\n * @param features The list of features to apply to the loader.\n * @returns The SVG content for a given icon name.\n */\nexport function provideNgIconLoader(\n loader: NgIconLoader,\n ...features: NgIconLoaderFeatures[]\n) {\n return [\n { provide: NgIconLoaderToken, useValue: loader },\n features.map(feature => feature.providers),\n ];\n}\n\n/**\n * Inject the function that will return the SVG content for a given icon name.\n */\nexport function injectNgIconLoader(): NgIconLoader | null {\n return inject(NgIconLoaderToken, { optional: true });\n}\n\n/**\n * Inject the cache that will store the SVG content for a given icon name.\n */\nexport function injectNgIconLoaderCache(): NgIconLoaderCache | null {\n return inject(NgIconCacheToken, { optional: true });\n}\n","import {\n InjectionToken,\n Optional,\n Provider,\n SkipSelf,\n inject,\n} from '@angular/core';\n\n/**\n * Define the icons to use\n * @param icons The icons to provide\n */\nexport function provideIcons(icons: Record<string, string>): Provider[] {\n return [\n {\n provide: NgIconsToken,\n useFactory: (parentIcons?: Record<string, string>[]) => ({\n ...parentIcons?.reduce((acc, icons) => ({ ...acc, ...icons }), {}),\n ...icons,\n }),\n deps: [[NgIconsToken, new Optional(), new SkipSelf()]],\n multi: true,\n },\n ];\n}\n\nexport const NgIconsToken = new InjectionToken<Record<string, string>[]>(\n 'Icons Token',\n);\n\n/**\n * Inject the icons to use\n * @returns The icons to use\n * @internal\n */\nexport function injectNgIcons(): Record<string, string>[] {\n return inject(NgIconsToken, { optional: true }) ?? [];\n}\n","import { Observable, firstValueFrom, isObservable } from 'rxjs';\n\n/**\n * A loader may return a promise, an observable or a string. This function will coerce the result into a promise.\n * @returns\n */\nexport function coerceLoaderResult(\n result: Promise<string> | Observable<string> | string,\n): Promise<string> {\n if (typeof result === 'string') {\n return Promise.resolve(result);\n }\n\n if (isObservable(result)) {\n return firstValueFrom(result);\n }\n\n return result;\n}\n","/**\n * Hyphenated to lowerCamelCase\n */\nexport function toPropertyName(str: string): string {\n return str\n .replace(/([^a-zA-Z0-9])+(.)?/g, (_, __, chr) =>\n chr ? chr.toUpperCase() : '',\n )\n .replace(/[^a-zA-Z\\d]/g, '')\n .replace(/^([A-Z])/, m => m.toLowerCase());\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n inject,\n Injector,\n Input,\n runInInjectionContext,\n} from '@angular/core';\nimport type { IconName } from './icon-name';\nimport { injectNgIconConfig } from './providers/icon-config.provider';\nimport {\n injectNgIconLoader,\n injectNgIconLoaderCache,\n} from './providers/icon-loader.provider';\nimport { injectNgIcons } from './providers/icon.provider';\nimport { coerceLoaderResult } from './utils/async';\nimport { toPropertyName } from './utils/format';\n\n// This is a typescript type to prevent inference from collapsing the union type to a string to improve type safety\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type IconType = IconName | (string & {});\n\n@Component({\n selector: 'ng-icon',\n template: '',\n standalone: true,\n styleUrls: ['./icon.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgIcon {\n /** Access the global icon config */\n private readonly config = injectNgIconConfig();\n\n /** Access the icons */\n private readonly icons = injectNgIcons();\n\n /** Access the icon loader if defined */\n private readonly loader = injectNgIconLoader();\n\n /** Access the icon loader cache if defined */\n private readonly cache = injectNgIconLoaderCache();\n\n /** Access the injector */\n private readonly injector = inject(Injector);\n\n /** Access the element ref */\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Define the name of the icon to display */\n @Input() set name(name: IconType) {\n this.setIcon(name);\n }\n\n /** Define the size of the icon */\n @HostBinding('style.--ng-icon__size')\n @Input({ transform: coerceCssPixelValue })\n size?: string | number = this.config.size;\n\n /** Define the stroke-width of the icon */\n @HostBinding('style.--ng-icon__stroke-width')\n @Input()\n strokeWidth?: string | number;\n\n /** Define the color of the icon */\n @HostBinding('style.color')\n @Input()\n color?: string = this.config.color;\n\n /**\n * Load the icon with the given name and insert it into the template.\n * @param name The name of the icon to load.\n */\n private async setIcon(name: IconType): Promise<void> {\n const propertyName = toPropertyName(name);\n for (const icons of [...this.icons].reverse()) {\n if (icons[propertyName]) {\n // insert the SVG into the template\n this.elementRef.nativeElement.innerHTML = icons[propertyName];\n return;\n }\n }\n\n // if we have a cache check if the icon is already loaded\n if (this.cache?.has(name)) {\n this.elementRef.nativeElement.innerHTML = this.cache.get(name)!;\n return;\n }\n\n // if there is a loader defined, use it to load the icon\n if (this.loader) {\n const result = await this.requestIconFromLoader(name);\n\n // if the result is a string, insert the SVG into the template\n if (result !== null) {\n // if we have a cache, store the result\n this.cache?.set(name, result);\n this.elementRef.nativeElement.innerHTML = result;\n return;\n }\n }\n\n // if there is no icon with this name warn the user as they probably forgot to import it\n console.warn(\n `No icon named ${name} was found. You may need to import it using the withIcons function.`,\n );\n }\n\n /**\n * Request the icon from the loader.\n * @param name The name of the icon to load.\n * @returns The SVG content for a given icon name.\n */\n private requestIconFromLoader(name: string): Promise<string> {\n return new Promise(resolve => {\n runInInjectionContext(this.injector, async () => {\n const result = await coerceLoaderResult(this.loader!(name));\n resolve(result);\n });\n });\n }\n}\n\nfunction coerceCssPixelValue(value: string): string {\n return value == null ? '' : /^\\d+$/.test(value) ? `${value}px` : value;\n}\n","import { Inject, ModuleWithProviders, NgModule } from '@angular/core';\nimport { NgIcon } from './icon.component';\nimport { NgIconsToken, provideIcons } from './providers/icon.provider';\n\n@NgModule({\n imports: [NgIcon],\n exports: [NgIcon],\n})\nexport class NgIconsModule {\n constructor(@Inject(NgIconsToken) icons: Record<string, string>) {\n if (Object.keys(icons).length === 0) {\n throw new Error(\n 'No icons have been provided. Ensure to include some icons by importing them using NgIconsModule.withIcons({ ... }).',\n );\n }\n }\n\n /**\n * Define the icons that will be included in the application. This allows unused icons to\n * be tree-shaken away to reduce bundle size\n * @param icons The object containing the required icons\n */\n static withIcons(\n icons: Record<string, string>,\n ): ModuleWithProviders<NgIconsModule> {\n return { ngModule: NgIconsModule, providers: provideIcons(icons) };\n }\n}\n\nexport const NG_ICON_DIRECTIVES = [NgIcon] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,9 @@
1
- import { SafeHtml } from '@angular/platform-browser';
2
1
  import type { IconName } from './icon-name';
3
2
  import * as i0 from "@angular/core";
4
3
  export type IconType = IconName | (string & {});
5
4
  export declare class NgIcon {
6
5
  /** Access the global icon config */
7
6
  private readonly config;
8
- /** Access the sanitizer */
9
- private readonly sanitizer;
10
7
  /** Access the icons */
11
8
  private readonly icons;
12
9
  /** Access the icon loader if defined */
@@ -15,16 +12,12 @@ export declare class NgIcon {
15
12
  private readonly cache;
16
13
  /** Access the injector */
17
14
  private readonly injector;
18
- /** Access the change detector */
19
- private readonly changeDetector;
15
+ /** Access the element ref */
16
+ private readonly elementRef;
20
17
  /** Define the name of the icon to display */
21
18
  set name(name: IconType);
22
- /** Store the formatted icon name */
23
- template?: SafeHtml;
24
19
  /** Define the size of the icon */
25
- set size(size: string);
26
- get size(): string;
27
- private _size;
20
+ size?: string | number;
28
21
  /** Define the stroke-width of the icon */
29
22
  strokeWidth?: string | number;
30
23
  /** Define the color of the icon */
@@ -42,4 +35,5 @@ export declare class NgIcon {
42
35
  private requestIconFromLoader;
43
36
  static ɵfac: i0.ɵɵFactoryDeclaration<NgIcon, never>;
44
37
  static ɵcmp: i0.ɵɵComponentDeclaration<NgIcon, "ng-icon", never, { "name": { "alias": "name"; "required": false; }; "size": { "alias": "size"; "required": false; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; }; "color": { "alias": "color"; "required": false; }; }, {}, never, never, true, never>;
38
+ static ngAcceptInputType_size: string;
45
39
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-icons/core",
3
- "version": "25.6.0",
3
+ "version": "26.0.0",
4
4
  "license": "MIT",
5
5
  "keywords": [
6
6
  "angular",