@fundamental-ngx/core 0.60.1 → 0.60.3

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Pipe, InjectionToken, input, booleanAttribute, output, viewChild, signal, computed, inject, ElementRef, Renderer2, HostAttributeToken, effect, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
2
+ import { Pipe, InjectionToken, input, booleanAttribute, output, viewChild, signal, computed, inject, ElementRef, HostAttributeToken, effect, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
3
3
  import { getRandomColorAccent, ANY_LANGUAGE_LETTERS_REGEX } from '@fundamental-ngx/cdk/utils';
4
4
  import { FD_DEFAULT_ICON_FONT_FAMILY, IconComponent } from '@fundamental-ngx/core/icon';
5
5
 
@@ -159,21 +159,29 @@ class AvatarComponent {
159
159
  this._shouldShowDefaultIcon = signal(false, ...(ngDevMode ? [{ debugName: "_shouldShowDefaultIcon" }] : []));
160
160
  /** @hidden Stored random color accent to prevent regeneration */
161
161
  this._randomColorAccent = signal(getRandomColorAccent(), ...(ngDevMode ? [{ debugName: "_randomColorAccent" }] : []));
162
+ /** @hidden Track the currently loading/loaded image URL to prevent duplicate requests */
163
+ this._currentImageUrl = null;
164
+ /** @hidden Cache of successfully loaded image URLs to prevent re-requesting */
165
+ this._loadedImageCache = new Set();
162
166
  /** @hidden */
163
167
  this._elementRef = inject(ElementRef);
164
168
  /** @hidden */
165
- this._renderer = inject(Renderer2);
166
- /** @hidden */
167
169
  this._hostTabindex = inject(new HostAttributeToken('tabindex'), { optional: true });
168
170
  // Effect to handle image changes
169
171
  effect(() => {
170
172
  const imageValue = this.image();
171
173
  if (imageValue) {
172
- this._imageLoaded.set(false);
173
- this._shouldShowDefaultIcon.set(false); // Reset default icon flag
174
- this._verifyImageUrl(imageValue, this._onErrorCallback.bind(this));
174
+ // Only reset loaded state if the URL actually changed
175
+ if (this._currentImageUrl !== imageValue) {
176
+ this._imageLoaded.set(false);
177
+ this._shouldShowDefaultIcon.set(false); // Reset default icon flag
178
+ this._verifyImageUrl(imageValue, this._onErrorCallback.bind(this));
179
+ }
180
+ // If URL is the same and already loaded, do nothing (use cache)
175
181
  }
176
182
  else {
183
+ // Image input cleared
184
+ this._currentImageUrl = null;
177
185
  this._imageLoaded.set(false);
178
186
  this._shouldShowDefaultIcon.set(false);
179
187
  this._setBgImage(null);
@@ -198,11 +206,6 @@ class AvatarComponent {
198
206
  this._randomColorAccent.set(getRandomColorAccent());
199
207
  }
200
208
  });
201
- // Effect to apply background image to DOM
202
- effect(() => {
203
- const bgImage = this.bgImage();
204
- this._renderer.setStyle(this._elementRef.nativeElement, 'background-image', bgImage);
205
- });
206
209
  }
207
210
  /** @hidden */
208
211
  onClick(event) {
@@ -240,18 +243,27 @@ class AvatarComponent {
240
243
  }
241
244
  /** @hidden */
242
245
  _verifyImageUrl(srcValue, onErrorCallback) {
243
- const newBgImage = `url(${srcValue})`;
244
- // Don't load the same image if it's already loaded successfully
245
- if (this.bgImage() === newBgImage && this._imageLoaded()) {
246
+ // Check if this URL was previously loaded successfully (component-level cache)
247
+ if (this._loadedImageCache.has(srcValue)) {
248
+ // Image was loaded before, reuse it
249
+ this._setBgImage(srcValue);
250
+ this._imageLoaded.set(true);
251
+ this._currentImageUrl = srcValue;
246
252
  return;
247
253
  }
254
+ // Track the current image URL
255
+ this._currentImageUrl = srcValue;
248
256
  const img = new Image();
249
257
  img.onload = () => {
250
258
  // Only set background if image loads successfully
251
259
  this._setBgImage(srcValue);
252
260
  this._imageLoaded.set(true);
261
+ // Add to cache of successfully loaded images
262
+ this._loadedImageCache.add(srcValue);
263
+ };
264
+ img.onerror = () => {
265
+ onErrorCallback();
253
266
  };
254
- img.onerror = onErrorCallback;
255
267
  img.src = srcValue;
256
268
  }
257
269
  /** @hidden */
@@ -315,7 +327,7 @@ class AvatarComponent {
315
327
  this._shouldShowDefaultIcon.set(true);
316
328
  }
317
329
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: AvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
318
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: AvatarComponent, isStandalone: true, selector: "fd-avatar", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "ariaLabelledby", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, font: { classPropertyName: "font", publicName: "font", isSignal: true, isRequired: false, transformFunction: null }, glyph: { classPropertyName: "glyph", publicName: "glyph", isSignal: true, isRequired: false, transformFunction: null }, zoomGlyph: { classPropertyName: "zoomGlyph", publicName: "zoomGlyph", isSignal: true, isRequired: false, transformFunction: null }, circle: { classPropertyName: "circle", publicName: "circle", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, transparent: { classPropertyName: "transparent", publicName: "transparent", isSignal: true, isRequired: false, transformFunction: null }, contain: { classPropertyName: "contain", publicName: "contain", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, tile: { classPropertyName: "tile", publicName: "tile", isSignal: true, isRequired: false, transformFunction: null }, border: { classPropertyName: "border", publicName: "border", isSignal: true, isRequired: false, transformFunction: null }, colorAccent: { classPropertyName: "colorAccent", publicName: "colorAccent", isSignal: true, isRequired: false, transformFunction: null }, colorIndication: { classPropertyName: "colorIndication", publicName: "colorIndication", isSignal: true, isRequired: false, transformFunction: null }, random: { classPropertyName: "random", publicName: "random", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, valueState: { classPropertyName: "valueState", publicName: "valueState", isSignal: true, isRequired: false, transformFunction: null }, image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: false, transformFunction: null }, alterIcon: { classPropertyName: "alterIcon", publicName: "alterIcon", isSignal: true, isRequired: false, transformFunction: null }, backupImage: { classPropertyName: "backupImage", publicName: "backupImage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { avatarClicked: "avatarClicked", zoomGlyphClicked: "zoomGlyphClicked" }, host: { listeners: { "click": "onClick($event)", "keydown.enter": "onClick($event)", "keydown.space": "onClick($event)" }, properties: { "class": "cssClass()", "attr.tabindex": "tabindex()", "attr.id": "id()", "attr.aria-label": "ariaLabel()", "attr.aria-labelledby": "ariaLabelledby()", "attr.alt": "ariaLabel()", "attr.role": "role()" } }, providers: [
330
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: AvatarComponent, isStandalone: true, selector: "fd-avatar", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "ariaLabelledby", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, font: { classPropertyName: "font", publicName: "font", isSignal: true, isRequired: false, transformFunction: null }, glyph: { classPropertyName: "glyph", publicName: "glyph", isSignal: true, isRequired: false, transformFunction: null }, zoomGlyph: { classPropertyName: "zoomGlyph", publicName: "zoomGlyph", isSignal: true, isRequired: false, transformFunction: null }, circle: { classPropertyName: "circle", publicName: "circle", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, transparent: { classPropertyName: "transparent", publicName: "transparent", isSignal: true, isRequired: false, transformFunction: null }, contain: { classPropertyName: "contain", publicName: "contain", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, tile: { classPropertyName: "tile", publicName: "tile", isSignal: true, isRequired: false, transformFunction: null }, border: { classPropertyName: "border", publicName: "border", isSignal: true, isRequired: false, transformFunction: null }, colorAccent: { classPropertyName: "colorAccent", publicName: "colorAccent", isSignal: true, isRequired: false, transformFunction: null }, colorIndication: { classPropertyName: "colorIndication", publicName: "colorIndication", isSignal: true, isRequired: false, transformFunction: null }, random: { classPropertyName: "random", publicName: "random", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, valueState: { classPropertyName: "valueState", publicName: "valueState", isSignal: true, isRequired: false, transformFunction: null }, image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: false, transformFunction: null }, alterIcon: { classPropertyName: "alterIcon", publicName: "alterIcon", isSignal: true, isRequired: false, transformFunction: null }, backupImage: { classPropertyName: "backupImage", publicName: "backupImage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { avatarClicked: "avatarClicked", zoomGlyphClicked: "zoomGlyphClicked" }, host: { listeners: { "click": "onClick($event)", "keydown.enter": "onClick($event)", "keydown.space": "onClick($event)" }, properties: { "class": "cssClass()", "style.background-image": "bgImage()", "attr.tabindex": "tabindex()", "attr.id": "id()", "attr.aria-label": "ariaLabel()", "attr.aria-labelledby": "ariaLabelledby()", "attr.alt": "ariaLabel()", "attr.role": "role()" } }, providers: [
319
331
  {
320
332
  provide: FD_AVATAR_COMPONENT,
321
333
  useExisting: AvatarComponent
@@ -331,6 +343,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
331
343
  }
332
344
  ], host: {
333
345
  '[class]': 'cssClass()',
346
+ '[style.background-image]': 'bgImage()',
334
347
  '[attr.tabindex]': 'tabindex()',
335
348
  '[attr.id]': 'id()',
336
349
  '[attr.aria-label]': 'ariaLabel()',
@@ -1 +1 @@
1
- {"version":3,"file":"fundamental-ngx-core-avatar.mjs","sources":["../../../../libs/core/avatar/avatar-icon.pipe.ts","../../../../libs/core/avatar/tokens.ts","../../../../libs/core/avatar/avatar.component.ts","../../../../libs/core/avatar/avatar.component.html","../../../../libs/core/avatar/avatar.module.ts","../../../../libs/core/avatar/fundamental-ngx-core-avatar.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { Nullable } from '@fundamental-ngx/cdk/utils';\nimport { AvatarValueStates } from './avatar-value-states.type';\n\n@Pipe({\n name: 'fdAvatarIcon',\n pure: true,\n standalone: true\n})\nexport class AvatarIconPipe implements PipeTransform {\n /**\n * Selects appropriate Avatar icon based on Avatar Value state and fallback icon.\n */\n transform(valueState: Nullable<AvatarValueStates>, fallbackIcon: Nullable<string>): string {\n let computedIcon = '';\n if (!valueState) {\n computedIcon = fallbackIcon || '';\n }\n switch (valueState) {\n case 'positive':\n computedIcon = 'sys-enter-2';\n break;\n case 'caution':\n computedIcon = 'warning';\n break;\n case 'negative':\n computedIcon = 'error';\n break;\n case 'information':\n computedIcon = 'information';\n break;\n }\n\n return `sap-icon--${computedIcon} ${valueState ? 'fd-avatar__zoom-icon--' + valueState : ''}`;\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const FD_AVATAR_COMPONENT = new InjectionToken('FdAvatarComponent');\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n HostAttributeToken,\n inject,\n input,\n output,\n Renderer2,\n signal,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport {\n ANY_LANGUAGE_LETTERS_REGEX,\n ColorAccent,\n getRandomColorAccent,\n Nullable,\n Size\n} from '@fundamental-ngx/cdk/utils';\nimport { FD_DEFAULT_ICON_FONT_FAMILY, IconComponent, IconFont } from '@fundamental-ngx/core/icon';\nimport { AvatarIconPipe } from './avatar-icon.pipe';\nimport { AvatarValueStates } from './avatar-value-states.type';\nimport { FD_AVATAR_COMPONENT } from './tokens';\n\nlet avatarUniqueId = 0;\n\nconst ALTER_ICON_OPTIONS = {\n CONTENT: 'content',\n ALT: 'alt',\n BACKUP: 'backup',\n DEFAULT_ICON: 'default-icon'\n};\n\nexport type IndicationColor = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;\n\n@Component({\n selector: 'fd-avatar',\n templateUrl: './avatar.component.html',\n styleUrl: './avatar.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: FD_AVATAR_COMPONENT,\n useExisting: AvatarComponent\n }\n ],\n host: {\n '[class]': 'cssClass()',\n '[attr.tabindex]': 'tabindex()',\n '[attr.id]': 'id()',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledby()',\n '[attr.alt]': 'ariaLabel()',\n '[attr.role]': 'role()',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onClick($event)',\n '(keydown.space)': 'onClick($event)'\n },\n imports: [AvatarIconPipe, IconComponent]\n})\nexport class AvatarComponent {\n /** Id of the Avatar. */\n readonly id = input('fd-avatar-' + ++avatarUniqueId);\n\n /** Aria-label for Avatar. */\n readonly ariaLabel = input<string | null | undefined>(null);\n\n /** Aria-Labelledby for element describing Avatar. */\n readonly ariaLabelledby = input<string | null | undefined>(null);\n\n /** Localized text for label */\n readonly label = input<string | null | undefined>(null);\n\n /** The size of the Avatar. Options include: *xs*, *s*, *m*, *l* and *xl*. */\n readonly size = input<Size>('l');\n\n /** Font family of the icon. */\n readonly font = input<IconFont>(FD_DEFAULT_ICON_FONT_FAMILY);\n\n /** The glyph name. */\n readonly glyph = input<string | null | undefined>(null);\n\n /** The glyph name for zoom icon. */\n readonly zoomGlyph = input<string | null | undefined>(null);\n\n /** Whether to apply a circle style to the Avatar. */\n readonly circle = input(false, { transform: booleanAttribute });\n\n /** Whether the Avatar should be interactive. */\n readonly interactive = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a transparent style to the Avatar. */\n readonly transparent = input(false, { transform: booleanAttribute });\n\n /** Whether to apply background size contain style to the Avatar */\n readonly contain = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a placeholder background style to the Avatar. */\n readonly placeholder = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a tile background style to the Avatar. */\n readonly tile = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a border to the Avatar. */\n readonly border = input(false, { transform: booleanAttribute });\n\n /** A number from 1 to 10 representing the background color of the Avatar.\n * This property will override the colorIndication property.\n */\n readonly colorAccent = input<ColorAccent | null | undefined>(null);\n\n /** A number from 1 to 10 representing the background color of the Avatar using the Indication Colors. */\n readonly colorIndication = input<IndicationColor | null | undefined>(null);\n\n /** Whether to apply random background color to the Avatar. */\n readonly random = input(false, { transform: booleanAttribute });\n\n /** Whether component should be focusable & clicable */\n readonly clickable = input(false, { transform: booleanAttribute });\n\n /** Value state of the Avatar. */\n readonly valueState = input<AvatarValueStates | null | undefined>(null);\n\n /** Background image resource: url or base64. */\n readonly image = input<string | null | undefined>(null);\n\n /** Backup options to use when image hasn't been loaded successfully.\n * Options separated with \"|\" symbol.\n * Possible options: content, alt, backup, default-icon\n */\n readonly alterIcon = input<string | null | undefined>(null);\n\n /** Backup image to load when image hasn't been loaded successfully.\n * Only applicable when using alterIcon input property.\n */\n readonly backupImage = input<string | null | undefined>(null);\n\n /** Event emitted when avatar clicked. Only fires if clickable input property set to true. */\n readonly avatarClicked = output<Event>();\n\n /** Event emitted when zoom icon clicked. Only fires if zoomGlyph input property is set. */\n readonly zoomGlyphClicked = output<void>();\n\n /** @hidden */\n protected readonly content = viewChild<ElementRef>('content');\n\n /** @hidden Internal state for background image */\n protected readonly bgImage = signal<string | null | undefined>(null);\n\n /** @hidden Internal state for computed abbreviation */\n protected readonly abbreviate = signal<string | null | undefined>(null);\n\n /** @hidden Computed tabindex based on clickable state */\n protected readonly tabindex = computed(() => {\n if (this._hostTabindex != null) {\n return this._hostTabindex;\n }\n return this.clickable() ? 0 : null;\n });\n\n /** @hidden Computed role attribute */\n protected readonly role = computed(() => (this.zoomGlyph() || this.clickable() ? 'button' : 'img'));\n\n /** @hidden If a default placeholder should be displayed */\n protected readonly showDefault = computed(\n () =>\n // Show default if explicitly requested OR if no content is available\n this._shouldShowDefaultIcon() ||\n (!this.abbreviate() && !this._imageLoaded() && !this.glyph() && !this.image())\n );\n\n /** @hidden Computed CSS classes */\n protected readonly cssClass = computed(() => {\n const colorAccentValue = this.colorAccent();\n const randomValue = this.random();\n const colorIndicationValue = this.colorIndication();\n\n return [\n 'fd-avatar',\n this.size() ? `fd-avatar--${this.size()}` : '',\n colorAccentValue && !randomValue ? `fd-avatar--accent-color-${colorAccentValue}` : '',\n randomValue ? `fd-avatar--accent-color-${this._randomColorAccent()}` : '',\n colorIndicationValue && colorAccentValue === null && !randomValue\n ? `fd-avatar--indication-color-${colorIndicationValue}`\n : '',\n this.circle() ? 'fd-avatar--circle' : '',\n this.border() ? 'fd-avatar--border' : '',\n this.interactive() ? 'fd-avatar--interactive' : '',\n this.transparent() ? 'fd-avatar--transparent' : '',\n this.contain() ? 'fd-avatar--background-contain' : '',\n this.placeholder() ? 'fd-avatar--placeholder' : '',\n this.tile() ? 'fd-avatar--tile' : ''\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n /** @hidden Internal state tracking if image loaded successfully */\n private readonly _imageLoaded = signal(false);\n\n /** @hidden Explicitly track when to show default icon (for failed images with no fallback) */\n private readonly _shouldShowDefaultIcon = signal(false);\n\n /** @hidden Stored random color accent to prevent regeneration */\n private readonly _randomColorAccent = signal<ColorAccent>(getRandomColorAccent());\n\n /** @hidden */\n private readonly _elementRef = inject(ElementRef);\n\n /** @hidden */\n private readonly _renderer = inject(Renderer2);\n\n /** @hidden */\n private readonly _hostTabindex = inject(new HostAttributeToken('tabindex'), { optional: true });\n\n /** @hidden */\n constructor() {\n // Effect to handle image changes\n effect(() => {\n const imageValue = this.image();\n if (imageValue) {\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(false); // Reset default icon flag\n this._verifyImageUrl(imageValue, this._onErrorCallback.bind(this));\n } else {\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(false);\n this._setBgImage(null);\n }\n });\n\n // Effect to handle label changes and compute abbreviation\n effect(() => {\n const labelValue = this.label();\n // Only generate abbreviation from label if there's no successful image\n if (labelValue && !this._imageLoaded()) {\n const abbreviation = this._generateAbbreviation(labelValue);\n this.abbreviate.set(abbreviation);\n } else if (!labelValue && !this._imageLoaded()) {\n // Clear abbreviation when label is removed (if no image)\n this.abbreviate.set(null);\n }\n });\n\n // Effect to regenerate random color when random property changes\n effect(() => {\n if (this.random()) {\n this._randomColorAccent.set(getRandomColorAccent());\n }\n });\n\n // Effect to apply background image to DOM\n effect(() => {\n const bgImage = this.bgImage();\n this._renderer.setStyle(this._elementRef.nativeElement, 'background-image', bgImage);\n });\n }\n\n /** @hidden */\n protected onClick(event: Event): void {\n if (!this.clickable()) {\n return;\n }\n\n event.preventDefault();\n\n this.avatarClicked.emit(event);\n\n if (this.zoomGlyph()) {\n this.zoomGlyphClicked.emit();\n }\n }\n\n /** @hidden */\n protected zoomClicked(event: Event): void {\n event.preventDefault();\n this._elementRef.nativeElement.focus();\n this.zoomGlyphClicked.emit();\n }\n\n /** @hidden Get the abbreviation string */\n private _generateAbbreviation(label: Nullable<string>): string | null {\n if (!label) {\n return null;\n }\n\n const maxLettersCount = 3;\n const words = label.split(' ').filter((word) => word.length > 0);\n\n if (words.length === 0 || words.length > maxLettersCount) {\n return null;\n }\n\n const abbreviate = words.map((word) => word[0]).join('');\n\n return abbreviate.match(ANY_LANGUAGE_LETTERS_REGEX) ? abbreviate : null;\n }\n\n /** @hidden */\n private _setBgImage(srcValue: Nullable<string>): void {\n this.bgImage.set(srcValue ? `url(${srcValue})` : null);\n }\n\n /** @hidden */\n private _verifyImageUrl(srcValue: string, onErrorCallback: () => void): void {\n const newBgImage = `url(${srcValue})`;\n\n // Don't load the same image if it's already loaded successfully\n if (this.bgImage() === newBgImage && this._imageLoaded()) {\n return;\n }\n\n const img = new Image();\n img.onload = () => {\n // Only set background if image loads successfully\n this._setBgImage(srcValue);\n this._imageLoaded.set(true);\n };\n img.onerror = onErrorCallback;\n img.src = srcValue;\n }\n\n /** @hidden */\n private _onErrorCallback(): void {\n const alterIconValue = this.alterIcon();\n if (!alterIconValue) {\n this._showDefaultIcon();\n return;\n }\n\n const options = alterIconValue.split('|');\n for (const option of options) {\n if (option === ALTER_ICON_OPTIONS.CONTENT) {\n const contentValue = this.content()?.nativeElement.textContent;\n if (this._trySetAbbreviation(contentValue)) {\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.ALT) {\n const altValue = this._elementRef.nativeElement.getAttribute('alt');\n if (this._trySetAbbreviation(altValue)) {\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.BACKUP) {\n const backupImageValue = this.backupImage();\n if (backupImageValue) {\n this._verifyImageUrl(backupImageValue, () => this._showDefaultIcon());\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.DEFAULT_ICON) {\n this._showDefaultIcon();\n return;\n }\n }\n\n // Fallback if no valid option matched\n this._showDefaultIcon();\n }\n\n /** @hidden Helper to try setting abbreviation from text */\n private _trySetAbbreviation(text: string | null | undefined): boolean {\n if (!text) {\n return false;\n }\n const trimmedText = text.trim();\n if (!trimmedText) {\n return false;\n }\n const abbreviation = this._generateAbbreviation(trimmedText);\n if (abbreviation) {\n this.abbreviate.set(abbreviation);\n this._setBgImage(null); // Clear background image when using abbreviation\n return true;\n }\n return false;\n }\n\n /** @hidden */\n private _showDefaultIcon(): void {\n this.abbreviate.set(null);\n this._setBgImage(null);\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(true);\n }\n}\n","@if (abbreviate()) {\n {{ abbreviate() }}\n}\n@if (zoomGlyph() || valueState()) {\n <i\n role=\"presentation\"\n class=\"fd-avatar__zoom-icon\"\n [class]=\"valueState() | fdAvatarIcon: zoomGlyph()\"\n (mousedown)=\"zoomClicked($event)\"\n >\n </i>\n}\n@if (glyph() || showDefault()) {\n <fd-icon\n class=\"fd-avatar__icon\"\n role=\"presentation\"\n [font]=\"font()\"\n [glyph]=\"glyph() || 'person-placeholder'\"\n ></fd-icon>\n}\n<div #content [style.display]=\"'none'\">\n <ng-content></ng-content>\n</div>\n","import { NgModule } from '@angular/core';\n\nimport { AvatarComponent } from './avatar.component';\n\n/**\n * @deprecated\n * Use `AvatarComponent` import instead.\n */\n@NgModule({\n imports: [AvatarComponent],\n exports: [AvatarComponent]\n})\nexport class AvatarModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MASa,cAAc,CAAA;AACvB;;AAEG;IACH,SAAS,CAAC,UAAuC,EAAE,YAA8B,EAAA;QAC7E,IAAI,YAAY,GAAG,EAAE;QACrB,IAAI,CAAC,UAAU,EAAE;AACb,YAAA,YAAY,GAAG,YAAY,IAAI,EAAE;QACrC;QACA,QAAQ,UAAU;AACd,YAAA,KAAK,UAAU;gBACX,YAAY,GAAG,aAAa;gBAC5B;AACJ,YAAA,KAAK,SAAS;gBACV,YAAY,GAAG,SAAS;gBACxB;AACJ,YAAA,KAAK,UAAU;gBACX,YAAY,GAAG,OAAO;gBACtB;AACJ,YAAA,KAAK,aAAa;gBACd,YAAY,GAAG,aAAa;gBAC5B;;AAGR,QAAA,OAAO,CAAA,UAAA,EAAa,YAAY,CAAA,CAAA,EAAI,UAAU,GAAG,wBAAwB,GAAG,UAAU,GAAG,EAAE,EAAE;IACjG;8GAzBS,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,cAAA,EAAA,CAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAL1B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCNY,mBAAmB,GAAG,IAAI,cAAc,CAAC,mBAAmB;;AC0BzE,IAAI,cAAc,GAAG,CAAC;AAEtB,MAAM,kBAAkB,GAAG;AACvB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,YAAY,EAAE;CACjB;MA8BY,eAAe,CAAA;;AA4JxB,IAAA,WAAA,GAAA;;QA1JS,IAAA,CAAA,EAAE,GAAG,KAAK,CAAC,YAAY,GAAG,EAAE,cAAc,8CAAC;;AAG3C,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAA4B,IAAI,qDAAC;;AAGlD,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAA4B,IAAI,0DAAC;;AAGvD,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAA4B,IAAI,iDAAC;;AAG9C,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAO,GAAG,gDAAC;;AAGvB,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAW,2BAA2B,gDAAC;;AAGnD,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAA4B,IAAI,iDAAC;;AAG9C,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAA4B,IAAI,qDAAC;;QAGlD,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,mDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;QAGtD,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,wDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;QAG3D,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,wDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;QAG3D,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,oDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;QAGvD,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,wDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;QAG3D,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,KAAK,iDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;QAGpD,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,mDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAE/D;;AAEG;AACM,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAiC,IAAI,uDAAC;;AAGzD,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAqC,IAAI,2DAAC;;QAGjE,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,mDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;QAGtD,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,sDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAGzD,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAuC,IAAI,sDAAC;;AAG9D,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAA4B,IAAI,iDAAC;AAEvD;;;AAGG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAA4B,IAAI,qDAAC;AAE3D;;AAEG;AACM,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAA4B,IAAI,uDAAC;;QAGpD,IAAA,CAAA,aAAa,GAAG,MAAM,EAAS;;QAG/B,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAAQ;;AAGvB,QAAA,IAAA,CAAA,OAAO,GAAG,SAAS,CAAa,SAAS,mDAAC;;AAG1C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAA4B,IAAI,mDAAC;;AAGjD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA4B,IAAI,sDAAC;;AAGpD,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AACxC,YAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;gBAC5B,OAAO,IAAI,CAAC,aAAa;YAC7B;AACA,YAAA,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,IAAI;AACtC,QAAA,CAAC,oDAAC;;QAGiB,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,GAAG,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAGhF,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CACrC;;QAEI,IAAI,CAAC,sBAAsB,EAAE;aAC5B,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACrF;;AAGkB,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AACxC,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE;AAC3C,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE;AACjC,YAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,eAAe,EAAE;YAEnD,OAAO;gBACH,WAAW;AACX,gBAAA,IAAI,CAAC,IAAI,EAAE,GAAG,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,EAAE;AAC9C,gBAAA,gBAAgB,IAAI,CAAC,WAAW,GAAG,CAAA,wBAAA,EAA2B,gBAAgB,CAAA,CAAE,GAAG,EAAE;AACrF,gBAAA,WAAW,GAAG,CAAA,wBAAA,EAA2B,IAAI,CAAC,kBAAkB,EAAE,CAAA,CAAE,GAAG,EAAE;AACzE,gBAAA,oBAAoB,IAAI,gBAAgB,KAAK,IAAI,IAAI,CAAC;sBAChD,CAAA,4BAAA,EAA+B,oBAAoB,CAAA;AACrD,sBAAE,EAAE;gBACR,IAAI,CAAC,MAAM,EAAE,GAAG,mBAAmB,GAAG,EAAE;gBACxC,IAAI,CAAC,MAAM,EAAE,GAAG,mBAAmB,GAAG,EAAE;gBACxC,IAAI,CAAC,WAAW,EAAE,GAAG,wBAAwB,GAAG,EAAE;gBAClD,IAAI,CAAC,WAAW,EAAE,GAAG,wBAAwB,GAAG,EAAE;gBAClD,IAAI,CAAC,OAAO,EAAE,GAAG,+BAA+B,GAAG,EAAE;gBACrD,IAAI,CAAC,WAAW,EAAE,GAAG,wBAAwB,GAAG,EAAE;gBAClD,IAAI,CAAC,IAAI,EAAE,GAAG,iBAAiB,GAAG;AACrC;iBACI,MAAM,CAAC,OAAO;iBACd,IAAI,CAAC,GAAG,CAAC;AAClB,QAAA,CAAC,oDAAC;;AAGe,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;;AAG5B,QAAA,IAAA,CAAA,sBAAsB,GAAG,MAAM,CAAC,KAAK,kEAAC;;AAGtC,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAc,oBAAoB,EAAE,8DAAC;;AAGhE,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGhC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;AAG7B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;QAK3F,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;YAC/B,IAAI,UAAU,EAAE;AACZ,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC5B,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACvC,gBAAA,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtE;iBAAO;AACH,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,gBAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC;AACtC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAC1B;AACJ,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;;YAE/B,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;gBACpC,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC;AAC3D,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC;YACrC;iBAAO,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;;AAE5C,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YAC7B;AACJ,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACR,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gBACf,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;YACvD;AACJ,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,kBAAkB,EAAE,OAAO,CAAC;AACxF,QAAA,CAAC,CAAC;IACN;;AAGU,IAAA,OAAO,CAAC,KAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACnB;QACJ;QAEA,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AAE9B,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AAClB,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAChC;IACJ;;AAGU,IAAA,WAAW,CAAC,KAAY,EAAA;QAC9B,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE;AACtC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;IAChC;;AAGQ,IAAA,qBAAqB,CAAC,KAAuB,EAAA;QACjD,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,OAAO,IAAI;QACf;QAEA,MAAM,eAAe,GAAG,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAEhE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe,EAAE;AACtD,YAAA,OAAO,IAAI;QACf;QAEA,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AAExD,QAAA,OAAO,UAAU,CAAC,KAAK,CAAC,0BAA0B,CAAC,GAAG,UAAU,GAAG,IAAI;IAC3E;;AAGQ,IAAA,WAAW,CAAC,QAA0B,EAAA;AAC1C,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAA,CAAG,GAAG,IAAI,CAAC;IAC1D;;IAGQ,eAAe,CAAC,QAAgB,EAAE,eAA2B,EAAA;AACjE,QAAA,MAAM,UAAU,GAAG,CAAA,IAAA,EAAO,QAAQ,GAAG;;AAGrC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACtD;QACJ;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,QAAA,GAAG,CAAC,MAAM,GAAG,MAAK;;AAEd,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,CAAC;AACD,QAAA,GAAG,CAAC,OAAO,GAAG,eAAe;AAC7B,QAAA,GAAG,CAAC,GAAG,GAAG,QAAQ;IACtB;;IAGQ,gBAAgB,GAAA;AACpB,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE;QACvC,IAAI,CAAC,cAAc,EAAE;YACjB,IAAI,CAAC,gBAAgB,EAAE;YACvB;QACJ;QAEA,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;AACzC,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC1B,YAAA,IAAI,MAAM,KAAK,kBAAkB,CAAC,OAAO,EAAE;gBACvC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,WAAW;AAC9D,gBAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE;oBACxC;gBACJ;YACJ;AAAO,iBAAA,IAAI,MAAM,KAAK,kBAAkB,CAAC,GAAG,EAAE;AAC1C,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC;AACnE,gBAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE;oBACpC;gBACJ;YACJ;AAAO,iBAAA,IAAI,MAAM,KAAK,kBAAkB,CAAC,MAAM,EAAE;AAC7C,gBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE;gBAC3C,IAAI,gBAAgB,EAAE;AAClB,oBAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACrE;gBACJ;YACJ;AAAO,iBAAA,IAAI,MAAM,KAAK,kBAAkB,CAAC,YAAY,EAAE;gBACnD,IAAI,CAAC,gBAAgB,EAAE;gBACvB;YACJ;QACJ;;QAGA,IAAI,CAAC,gBAAgB,EAAE;IAC3B;;AAGQ,IAAA,mBAAmB,CAAC,IAA+B,EAAA;QACvD,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,OAAO,KAAK;QAChB;AACA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;QAC/B,IAAI,CAAC,WAAW,EAAE;AACd,YAAA,OAAO,KAAK;QAChB;QACA,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC;QAC5D,IAAI,YAAY,EAAE;AACd,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC;AACjC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACvB,YAAA,OAAO,IAAI;QACf;AACA,QAAA,OAAO,KAAK;IAChB;;IAGQ,gBAAgB,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC;IACzC;8GAlUS,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,SAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,aAAA,EAAA,WAAA,EAAA,QAAA,EAAA,EAAA,EAAA,SAAA,EApBb;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,mBAAmB;AAC5B,gBAAA,WAAW,EAAE;AAChB;AACJ,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClDL,8kBAuBA,EAAA,MAAA,EAAA,CAAA,2t5BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDwC8B,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAA7B,cAAc,EAAA,IAAA,EAAA,cAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAEf,eAAe,EAAA,UAAA,EAAA,CAAA;kBA1B3B,SAAS;+BACI,WAAW,EAAA,aAAA,EAGN,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,mBAAmB;AAC5B,4BAAA,WAAW,EAAA;AACd;qBACJ,EAAA,IAAA,EACK;AACF,wBAAA,SAAS,EAAE,YAAY;AACvB,wBAAA,iBAAiB,EAAE,YAAY;AAC/B,wBAAA,WAAW,EAAE,MAAM;AACnB,wBAAA,mBAAmB,EAAE,aAAa;AAClC,wBAAA,wBAAwB,EAAE,kBAAkB;AAC5C,wBAAA,YAAY,EAAE,aAAa;AAC3B,wBAAA,aAAa,EAAE,QAAQ;AACvB,wBAAA,SAAS,EAAE,iBAAiB;AAC5B,wBAAA,iBAAiB,EAAE,iBAAiB;AACpC,wBAAA,iBAAiB,EAAE;AACtB,qBAAA,EAAA,OAAA,EACQ,CAAC,cAAc,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,8kBAAA,EAAA,MAAA,EAAA,CAAA,2t5BAAA,CAAA,EAAA;m4EAsFW,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEjJhE;;;AAGG;MAKU,YAAY,CAAA;8GAAZ,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAAZ,YAAY,EAAA,OAAA,EAAA,CAHX,eAAe,CAAA,EAAA,OAAA,EAAA,CACf,eAAe,CAAA,EAAA,CAAA,CAAA;AAEhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,YAHX,eAAe,CAAA,EAAA,CAAA,CAAA;;2FAGhB,YAAY,EAAA,UAAA,EAAA,CAAA;kBAJxB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACN,OAAO,EAAE,CAAC,eAAe,CAAC;oBAC1B,OAAO,EAAE,CAAC,eAAe;AAC5B,iBAAA;;;ACXD;;AAEG;;;;"}
1
+ {"version":3,"file":"fundamental-ngx-core-avatar.mjs","sources":["../../../../libs/core/avatar/avatar-icon.pipe.ts","../../../../libs/core/avatar/tokens.ts","../../../../libs/core/avatar/avatar.component.ts","../../../../libs/core/avatar/avatar.component.html","../../../../libs/core/avatar/avatar.module.ts","../../../../libs/core/avatar/fundamental-ngx-core-avatar.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { Nullable } from '@fundamental-ngx/cdk/utils';\nimport { AvatarValueStates } from './avatar-value-states.type';\n\n@Pipe({\n name: 'fdAvatarIcon',\n pure: true,\n standalone: true\n})\nexport class AvatarIconPipe implements PipeTransform {\n /**\n * Selects appropriate Avatar icon based on Avatar Value state and fallback icon.\n */\n transform(valueState: Nullable<AvatarValueStates>, fallbackIcon: Nullable<string>): string {\n let computedIcon = '';\n if (!valueState) {\n computedIcon = fallbackIcon || '';\n }\n switch (valueState) {\n case 'positive':\n computedIcon = 'sys-enter-2';\n break;\n case 'caution':\n computedIcon = 'warning';\n break;\n case 'negative':\n computedIcon = 'error';\n break;\n case 'information':\n computedIcon = 'information';\n break;\n }\n\n return `sap-icon--${computedIcon} ${valueState ? 'fd-avatar__zoom-icon--' + valueState : ''}`;\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const FD_AVATAR_COMPONENT = new InjectionToken('FdAvatarComponent');\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n HostAttributeToken,\n inject,\n input,\n output,\n signal,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport {\n ANY_LANGUAGE_LETTERS_REGEX,\n ColorAccent,\n getRandomColorAccent,\n Nullable,\n Size\n} from '@fundamental-ngx/cdk/utils';\nimport { FD_DEFAULT_ICON_FONT_FAMILY, IconComponent, IconFont } from '@fundamental-ngx/core/icon';\nimport { AvatarIconPipe } from './avatar-icon.pipe';\nimport { AvatarValueStates } from './avatar-value-states.type';\nimport { FD_AVATAR_COMPONENT } from './tokens';\n\nlet avatarUniqueId = 0;\n\nconst ALTER_ICON_OPTIONS = {\n CONTENT: 'content',\n ALT: 'alt',\n BACKUP: 'backup',\n DEFAULT_ICON: 'default-icon'\n};\n\nexport type IndicationColor = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;\n\n@Component({\n selector: 'fd-avatar',\n templateUrl: './avatar.component.html',\n styleUrl: './avatar.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: FD_AVATAR_COMPONENT,\n useExisting: AvatarComponent\n }\n ],\n host: {\n '[class]': 'cssClass()',\n '[style.background-image]': 'bgImage()',\n '[attr.tabindex]': 'tabindex()',\n '[attr.id]': 'id()',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledby()',\n '[attr.alt]': 'ariaLabel()',\n '[attr.role]': 'role()',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onClick($event)',\n '(keydown.space)': 'onClick($event)'\n },\n imports: [AvatarIconPipe, IconComponent]\n})\nexport class AvatarComponent {\n /** Id of the Avatar. */\n readonly id = input('fd-avatar-' + ++avatarUniqueId);\n\n /** Aria-label for Avatar. */\n readonly ariaLabel = input<string | null | undefined>(null);\n\n /** Aria-Labelledby for element describing Avatar. */\n readonly ariaLabelledby = input<string | null | undefined>(null);\n\n /** Localized text for label */\n readonly label = input<string | null | undefined>(null);\n\n /** The size of the Avatar. Options include: *xs*, *s*, *m*, *l* and *xl*. */\n readonly size = input<Size>('l');\n\n /** Font family of the icon. */\n readonly font = input<IconFont>(FD_DEFAULT_ICON_FONT_FAMILY);\n\n /** The glyph name. */\n readonly glyph = input<string | null | undefined>(null);\n\n /** The glyph name for zoom icon. */\n readonly zoomGlyph = input<string | null | undefined>(null);\n\n /** Whether to apply a circle style to the Avatar. */\n readonly circle = input(false, { transform: booleanAttribute });\n\n /** Whether the Avatar should be interactive. */\n readonly interactive = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a transparent style to the Avatar. */\n readonly transparent = input(false, { transform: booleanAttribute });\n\n /** Whether to apply background size contain style to the Avatar */\n readonly contain = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a placeholder background style to the Avatar. */\n readonly placeholder = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a tile background style to the Avatar. */\n readonly tile = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a border to the Avatar. */\n readonly border = input(false, { transform: booleanAttribute });\n\n /** A number from 1 to 10 representing the background color of the Avatar.\n * This property will override the colorIndication property.\n */\n readonly colorAccent = input<ColorAccent | null | undefined>(null);\n\n /** A number from 1 to 10 representing the background color of the Avatar using the Indication Colors. */\n readonly colorIndication = input<IndicationColor | null | undefined>(null);\n\n /** Whether to apply random background color to the Avatar. */\n readonly random = input(false, { transform: booleanAttribute });\n\n /** Whether component should be focusable & clicable */\n readonly clickable = input(false, { transform: booleanAttribute });\n\n /** Value state of the Avatar. */\n readonly valueState = input<AvatarValueStates | null | undefined>(null);\n\n /** Background image resource: url or base64. */\n readonly image = input<string | null | undefined>(null);\n\n /** Backup options to use when image hasn't been loaded successfully.\n * Options separated with \"|\" symbol.\n * Possible options: content, alt, backup, default-icon\n */\n readonly alterIcon = input<string | null | undefined>(null);\n\n /** Backup image to load when image hasn't been loaded successfully.\n * Only applicable when using alterIcon input property.\n */\n readonly backupImage = input<string | null | undefined>(null);\n\n /** Event emitted when avatar clicked. Only fires if clickable input property set to true. */\n readonly avatarClicked = output<Event>();\n\n /** Event emitted when zoom icon clicked. Only fires if zoomGlyph input property is set. */\n readonly zoomGlyphClicked = output<void>();\n\n /** @hidden */\n protected readonly content = viewChild<ElementRef>('content');\n\n /** @hidden Internal state for background image */\n protected readonly bgImage = signal<string | null | undefined>(null);\n\n /** @hidden Internal state for computed abbreviation */\n protected readonly abbreviate = signal<string | null | undefined>(null);\n\n /** @hidden Computed tabindex based on clickable state */\n protected readonly tabindex = computed(() => {\n if (this._hostTabindex != null) {\n return this._hostTabindex;\n }\n return this.clickable() ? 0 : null;\n });\n\n /** @hidden Computed role attribute */\n protected readonly role = computed(() => (this.zoomGlyph() || this.clickable() ? 'button' : 'img'));\n\n /** @hidden If a default placeholder should be displayed */\n protected readonly showDefault = computed(\n () =>\n // Show default if explicitly requested OR if no content is available\n this._shouldShowDefaultIcon() ||\n (!this.abbreviate() && !this._imageLoaded() && !this.glyph() && !this.image())\n );\n\n /** @hidden Computed CSS classes */\n protected readonly cssClass = computed(() => {\n const colorAccentValue = this.colorAccent();\n const randomValue = this.random();\n const colorIndicationValue = this.colorIndication();\n\n return [\n 'fd-avatar',\n this.size() ? `fd-avatar--${this.size()}` : '',\n colorAccentValue && !randomValue ? `fd-avatar--accent-color-${colorAccentValue}` : '',\n randomValue ? `fd-avatar--accent-color-${this._randomColorAccent()}` : '',\n colorIndicationValue && colorAccentValue === null && !randomValue\n ? `fd-avatar--indication-color-${colorIndicationValue}`\n : '',\n this.circle() ? 'fd-avatar--circle' : '',\n this.border() ? 'fd-avatar--border' : '',\n this.interactive() ? 'fd-avatar--interactive' : '',\n this.transparent() ? 'fd-avatar--transparent' : '',\n this.contain() ? 'fd-avatar--background-contain' : '',\n this.placeholder() ? 'fd-avatar--placeholder' : '',\n this.tile() ? 'fd-avatar--tile' : ''\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n /** @hidden Internal state tracking if image loaded successfully */\n private readonly _imageLoaded = signal(false);\n\n /** @hidden Explicitly track when to show default icon (for failed images with no fallback) */\n private readonly _shouldShowDefaultIcon = signal(false);\n\n /** @hidden Stored random color accent to prevent regeneration */\n private readonly _randomColorAccent = signal<ColorAccent>(getRandomColorAccent());\n\n /** @hidden Track the currently loading/loaded image URL to prevent duplicate requests */\n private _currentImageUrl: string | null = null;\n\n /** @hidden Cache of successfully loaded image URLs to prevent re-requesting */\n private readonly _loadedImageCache = new Set<string>();\n\n /** @hidden */\n private readonly _elementRef = inject(ElementRef);\n\n /** @hidden */\n private readonly _hostTabindex = inject(new HostAttributeToken('tabindex'), { optional: true });\n\n /** @hidden */\n constructor() {\n // Effect to handle image changes\n effect(() => {\n const imageValue = this.image();\n if (imageValue) {\n // Only reset loaded state if the URL actually changed\n if (this._currentImageUrl !== imageValue) {\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(false); // Reset default icon flag\n this._verifyImageUrl(imageValue, this._onErrorCallback.bind(this));\n }\n // If URL is the same and already loaded, do nothing (use cache)\n } else {\n // Image input cleared\n this._currentImageUrl = null;\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(false);\n this._setBgImage(null);\n }\n });\n\n // Effect to handle label changes and compute abbreviation\n effect(() => {\n const labelValue = this.label();\n // Only generate abbreviation from label if there's no successful image\n if (labelValue && !this._imageLoaded()) {\n const abbreviation = this._generateAbbreviation(labelValue);\n this.abbreviate.set(abbreviation);\n } else if (!labelValue && !this._imageLoaded()) {\n // Clear abbreviation when label is removed (if no image)\n this.abbreviate.set(null);\n }\n });\n\n // Effect to regenerate random color when random property changes\n effect(() => {\n if (this.random()) {\n this._randomColorAccent.set(getRandomColorAccent());\n }\n });\n }\n\n /** @hidden */\n protected onClick(event: Event): void {\n if (!this.clickable()) {\n return;\n }\n\n event.preventDefault();\n\n this.avatarClicked.emit(event);\n\n if (this.zoomGlyph()) {\n this.zoomGlyphClicked.emit();\n }\n }\n\n /** @hidden */\n protected zoomClicked(event: Event): void {\n event.preventDefault();\n this._elementRef.nativeElement.focus();\n this.zoomGlyphClicked.emit();\n }\n\n /** @hidden Get the abbreviation string */\n private _generateAbbreviation(label: Nullable<string>): string | null {\n if (!label) {\n return null;\n }\n\n const maxLettersCount = 3;\n const words = label.split(' ').filter((word) => word.length > 0);\n\n if (words.length === 0 || words.length > maxLettersCount) {\n return null;\n }\n\n const abbreviate = words.map((word) => word[0]).join('');\n\n return abbreviate.match(ANY_LANGUAGE_LETTERS_REGEX) ? abbreviate : null;\n }\n\n /** @hidden */\n private _setBgImage(srcValue: Nullable<string>): void {\n this.bgImage.set(srcValue ? `url(${srcValue})` : null);\n }\n\n /** @hidden */\n private _verifyImageUrl(srcValue: string, onErrorCallback: () => void): void {\n // Check if this URL was previously loaded successfully (component-level cache)\n if (this._loadedImageCache.has(srcValue)) {\n // Image was loaded before, reuse it\n this._setBgImage(srcValue);\n this._imageLoaded.set(true);\n this._currentImageUrl = srcValue;\n return;\n }\n\n // Track the current image URL\n this._currentImageUrl = srcValue;\n\n const img = new Image();\n img.onload = () => {\n // Only set background if image loads successfully\n this._setBgImage(srcValue);\n this._imageLoaded.set(true);\n // Add to cache of successfully loaded images\n this._loadedImageCache.add(srcValue);\n };\n img.onerror = () => {\n onErrorCallback();\n };\n img.src = srcValue;\n }\n\n /** @hidden */\n private _onErrorCallback(): void {\n const alterIconValue = this.alterIcon();\n if (!alterIconValue) {\n this._showDefaultIcon();\n return;\n }\n\n const options = alterIconValue.split('|');\n for (const option of options) {\n if (option === ALTER_ICON_OPTIONS.CONTENT) {\n const contentValue = this.content()?.nativeElement.textContent;\n if (this._trySetAbbreviation(contentValue)) {\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.ALT) {\n const altValue = this._elementRef.nativeElement.getAttribute('alt');\n if (this._trySetAbbreviation(altValue)) {\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.BACKUP) {\n const backupImageValue = this.backupImage();\n if (backupImageValue) {\n this._verifyImageUrl(backupImageValue, () => this._showDefaultIcon());\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.DEFAULT_ICON) {\n this._showDefaultIcon();\n return;\n }\n }\n\n // Fallback if no valid option matched\n this._showDefaultIcon();\n }\n\n /** @hidden Helper to try setting abbreviation from text */\n private _trySetAbbreviation(text: string | null | undefined): boolean {\n if (!text) {\n return false;\n }\n const trimmedText = text.trim();\n if (!trimmedText) {\n return false;\n }\n const abbreviation = this._generateAbbreviation(trimmedText);\n if (abbreviation) {\n this.abbreviate.set(abbreviation);\n this._setBgImage(null); // Clear background image when using abbreviation\n return true;\n }\n return false;\n }\n\n /** @hidden */\n private _showDefaultIcon(): void {\n this.abbreviate.set(null);\n this._setBgImage(null);\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(true);\n }\n}\n","@if (abbreviate()) {\n {{ abbreviate() }}\n}\n@if (zoomGlyph() || valueState()) {\n <i\n role=\"presentation\"\n class=\"fd-avatar__zoom-icon\"\n [class]=\"valueState() | fdAvatarIcon: zoomGlyph()\"\n (mousedown)=\"zoomClicked($event)\"\n >\n </i>\n}\n@if (glyph() || showDefault()) {\n <fd-icon\n class=\"fd-avatar__icon\"\n role=\"presentation\"\n [font]=\"font()\"\n [glyph]=\"glyph() || 'person-placeholder'\"\n ></fd-icon>\n}\n<div #content [style.display]=\"'none'\">\n <ng-content></ng-content>\n</div>\n","import { NgModule } from '@angular/core';\n\nimport { AvatarComponent } from './avatar.component';\n\n/**\n * @deprecated\n * Use `AvatarComponent` import instead.\n */\n@NgModule({\n imports: [AvatarComponent],\n exports: [AvatarComponent]\n})\nexport class AvatarModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -57,7 +57,7 @@ class BusyIndicatorComponent {
57
57
  }
58
58
  }
59
59
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: BusyIndicatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
60
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: BusyIndicatorComponent, isStandalone: true, selector: "fd-busy-indicator", inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, block: { classPropertyName: "block", publicName: "block", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaValueText: { classPropertyName: "ariaValueText", publicName: "ariaValueText", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLive: { classPropertyName: "ariaLive", publicName: "ariaLive", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "hostFocusChangeHandler($event)" }, properties: { "attr.role": "loading() ? 'progressbar' : 'presentation'", "attr.tabindex": "loading() ? 0 : -1", "attr.aria-busy": "loading()", "attr.aria-live": "ariaLive()", "attr.aria-label": "ariaLabel()", "attr.aria-valuetext": "ariaValueText() || _ariaValueText()", "attr.aria-valuemin": "0", "attr.aria-valuemax": "100", "attr.title": "title() || _titleValue()", "class.fd-busy-indicator__container": "true", "class.fd-busy-indicator__container--inline": "!block()" } }, providers: [
60
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: BusyIndicatorComponent, isStandalone: true, selector: "fd-busy-indicator", inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, block: { classPropertyName: "block", publicName: "block", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaValueText: { classPropertyName: "ariaValueText", publicName: "ariaValueText", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLive: { classPropertyName: "ariaLive", publicName: "ariaLive", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "hostFocusChangeHandler($event)" }, properties: { "attr.role": "loading() ? 'progressbar' : 'presentation'", "attr.tabindex": "loading() ? 0 : -1", "attr.aria-busy": "loading()", "attr.aria-live": "ariaLive()", "attr.aria-label": "ariaLabel()", "attr.aria-valuetext": "loading() ? ariaValueText() || _ariaValueText() : null", "attr.aria-valuemin": "0", "attr.aria-valuemax": "100", "attr.title": "loading() ? title() || _titleValue() : null", "class.fd-busy-indicator__container": "true", "class.fd-busy-indicator__container--inline": "!block()" } }, providers: [
61
61
  {
62
62
  provide: FD_BUSY_INDICATOR_COMPONENT,
63
63
  useExisting: BusyIndicatorComponent
@@ -77,10 +77,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
77
77
  '[attr.aria-busy]': 'loading()',
78
78
  '[attr.aria-live]': 'ariaLive()',
79
79
  '[attr.aria-label]': 'ariaLabel()',
80
- '[attr.aria-valuetext]': 'ariaValueText() || _ariaValueText()',
80
+ '[attr.aria-valuetext]': 'loading() ? ariaValueText() || _ariaValueText() : null',
81
81
  '[attr.aria-valuemin]': '0',
82
82
  '[attr.aria-valuemax]': '100',
83
- '[attr.title]': 'title() || _titleValue()',
83
+ '[attr.title]': 'loading() ? title() || _titleValue() : null',
84
84
  '[class.fd-busy-indicator__container]': 'true',
85
85
  '[class.fd-busy-indicator__container--inline]': '!block()',
86
86
  '(keydown)': 'hostFocusChangeHandler($event)'
@@ -1 +1 @@
1
- {"version":3,"file":"fundamental-ngx-core-busy-indicator.mjs","sources":["../../../../libs/core/busy-indicator/tokens.ts","../../../../libs/core/busy-indicator/busy-indicator.component.ts","../../../../libs/core/busy-indicator/busy-indicator.component.html","../../../../libs/core/busy-indicator/busy-indicator-extended/busy-indicator-extended.directive.ts","../../../../libs/core/busy-indicator/busy-indicator.module.ts","../../../../libs/core/busy-indicator/fundamental-ngx-core-busy-indicator.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const FD_BUSY_INDICATOR_COMPONENT = new InjectionToken('FdBusyIndicatorComponent');\n","import { TAB } from '@angular/cdk/keycodes';\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n inject,\n input,\n viewChild\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { KeyUtil } from '@fundamental-ngx/cdk/utils';\nimport { FD_LANGUAGE, FdLanguage, TranslationResolver } from '@fundamental-ngx/i18n';\nimport { map } from 'rxjs';\nimport { FD_BUSY_INDICATOR_COMPONENT } from './tokens';\n\nexport type BusyIndicatorSize = 's' | 'm' | 'l';\n\n@Component({\n selector: 'fd-busy-indicator',\n templateUrl: './busy-indicator.component.html',\n styleUrl: './busy-indicator.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n providers: [\n {\n provide: FD_BUSY_INDICATOR_COMPONENT,\n useExisting: BusyIndicatorComponent\n }\n ],\n host: {\n '[attr.role]': \"loading() ? 'progressbar' : 'presentation'\",\n '[attr.tabindex]': 'loading() ? 0 : -1',\n '[attr.aria-busy]': 'loading()',\n '[attr.aria-live]': 'ariaLive()',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-valuetext]': 'ariaValueText() || _ariaValueText()',\n '[attr.aria-valuemin]': '0',\n '[attr.aria-valuemax]': '100',\n '[attr.title]': 'title() || _titleValue()',\n '[class.fd-busy-indicator__container]': 'true',\n '[class.fd-busy-indicator__container--inline]': '!block()',\n '(keydown)': 'hostFocusChangeHandler($event)'\n }\n})\nexport class BusyIndicatorComponent {\n /** Whether to display the loading indicator animation. */\n readonly loading = input(false);\n\n /** The size of the loading indicator, default will be medium */\n readonly size = input<BusyIndicatorSize>('m');\n\n /** Whether to use loader as block element */\n readonly block = input(false);\n\n /** Aria label attribute value. */\n readonly ariaLabel = input<string | null>(null);\n\n /** Aria-valuetext attribute value. */\n readonly ariaValueText = input<string | null>(null);\n\n /** title attribute value for tooltip. */\n readonly title = input<string | undefined>(undefined);\n\n /** add loading label value */\n readonly label = input<string | undefined>(undefined);\n\n /** Aria live attribute value. */\n readonly ariaLive = input<'assertive' | 'polite' | 'off' | null>(null);\n\n /** @hidden */\n protected readonly fakeFocusElement = viewChild<ElementRef>('fakeFocusElement');\n\n /** @hidden */\n protected readonly _lang$ = inject(FD_LANGUAGE);\n\n /** @hidden */\n protected readonly _translationResolver = inject(TranslationResolver);\n\n /** @hidden */\n protected readonly _ariaValueText = toSignal(\n this._lang$.pipe(\n map((lang: FdLanguage) => this._translationResolver.resolve(lang, 'coreBusyIndicator.defaultAriaValueText'))\n ),\n { initialValue: 'Busy' }\n );\n\n /** @hidden */\n protected readonly _titleValue = toSignal(\n this._lang$.pipe(\n map((lang: FdLanguage) => this._translationResolver.resolve(lang, 'coreBusyIndicator.defaultTitle'))\n ),\n { initialValue: 'Please wait' }\n );\n\n /** @hidden */\n private readonly _elementRef = inject(ElementRef);\n\n /** @hidden If focus escapes busy container focus element after wrapped content */\n protected hostFocusChangeHandler(event: KeyboardEvent): void {\n if (this.loading() && KeyUtil.isKeyCode(event, TAB) && !event.shiftKey) {\n const element = this.fakeFocusElement();\n if (element) {\n element.nativeElement.focus();\n }\n }\n }\n\n /** @hidden If busy container is navigated as \"previous focusable element\",\n * focus busy indicator to prevent from focusing wrapped content */\n protected fakeElementFocusHandler(event: FocusEvent): void {\n if (this.loading() && event.relatedTarget !== this._elementRef.nativeElement) {\n event.stopPropagation();\n this._elementRef.nativeElement.focus();\n }\n }\n}\n","<ng-content></ng-content>\n@if (loading()) {\n <div\n #busyIndicator\n class=\"fd-busy-indicator\"\n [class.fd-busy-indicator--l]=\"size() === 'l'\"\n [class.fd-busy-indicator--m]=\"size() === 'm'\"\n [class.fd-busy-indicator--s]=\"size() === 's'\"\n >\n <div class=\"fd-busy-indicator__circle\"></div>\n <div class=\"fd-busy-indicator__circle\"></div>\n <div class=\"fd-busy-indicator__circle\"></div>\n </div>\n @if (label()) {\n <span class=\"fd-busy-indicator-extended__label\">{{ label() }}</span>\n }\n <div class=\"fd-busy-indicator__overlay\"></div>\n <div #fakeFocusElement tabindex=\"0\" aria-hidden=\"true\" (focusin)=\"fakeElementFocusHandler($event)\"></div>\n}\n","import { Directive, ElementRef, contentChild, effect, inject } from '@angular/core';\nimport { HasElementRef } from '@fundamental-ngx/cdk/utils';\nimport { BusyIndicatorComponent } from '../busy-indicator.component';\nimport { FD_BUSY_INDICATOR_COMPONENT } from '../tokens';\n\nconst messageToastClass = 'fd-message-toast';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[fd-busy-indicator-extended]',\n standalone: true\n})\nexport class BusyIndicatorExtendedDirective implements HasElementRef {\n /** @hidden */\n public readonly elementRef = inject(ElementRef);\n\n /** @hidden */\n protected readonly busyIndicator = contentChild(FD_BUSY_INDICATOR_COMPONENT, {\n read: BusyIndicatorComponent\n });\n\n /** @hidden */\n constructor() {\n effect(() => {\n const indicator = this.busyIndicator();\n if (indicator) {\n this._appendCssToParent();\n }\n });\n }\n\n /** @hidden */\n private _appendCssToParent(): void {\n const hasLabel = this.busyIndicator()?.label();\n if (!hasLabel) {\n return;\n }\n const classList = this.elementRef.nativeElement.parentElement?.classList;\n if (classList) {\n classList.add('fd-busy-indicator-extended');\n if (classList.contains(messageToastClass)) {\n classList.add('fd-busy-indicator-extended--message-toast');\n }\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { BusyIndicatorExtendedDirective } from './busy-indicator-extended/busy-indicator-extended.directive';\nimport { BusyIndicatorComponent } from './busy-indicator.component';\n\n/**\n * @deprecated\n * Use direct imports of components and directives.\n */\n@NgModule({\n exports: [BusyIndicatorComponent, BusyIndicatorExtendedDirective],\n imports: [BusyIndicatorComponent, BusyIndicatorExtendedDirective]\n})\nexport class BusyIndicatorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fundamental-ngx-core-busy-indicator.mjs","sources":["../../../../libs/core/busy-indicator/tokens.ts","../../../../libs/core/busy-indicator/busy-indicator.component.ts","../../../../libs/core/busy-indicator/busy-indicator.component.html","../../../../libs/core/busy-indicator/busy-indicator-extended/busy-indicator-extended.directive.ts","../../../../libs/core/busy-indicator/busy-indicator.module.ts","../../../../libs/core/busy-indicator/fundamental-ngx-core-busy-indicator.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const FD_BUSY_INDICATOR_COMPONENT = new InjectionToken('FdBusyIndicatorComponent');\n","import { TAB } from '@angular/cdk/keycodes';\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n inject,\n input,\n viewChild\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { KeyUtil } from '@fundamental-ngx/cdk/utils';\nimport { FD_LANGUAGE, FdLanguage, TranslationResolver } from '@fundamental-ngx/i18n';\nimport { map } from 'rxjs';\nimport { FD_BUSY_INDICATOR_COMPONENT } from './tokens';\n\nexport type BusyIndicatorSize = 's' | 'm' | 'l';\n\n@Component({\n selector: 'fd-busy-indicator',\n templateUrl: './busy-indicator.component.html',\n styleUrl: './busy-indicator.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n providers: [\n {\n provide: FD_BUSY_INDICATOR_COMPONENT,\n useExisting: BusyIndicatorComponent\n }\n ],\n host: {\n '[attr.role]': \"loading() ? 'progressbar' : 'presentation'\",\n '[attr.tabindex]': 'loading() ? 0 : -1',\n '[attr.aria-busy]': 'loading()',\n '[attr.aria-live]': 'ariaLive()',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-valuetext]': 'loading() ? ariaValueText() || _ariaValueText() : null',\n '[attr.aria-valuemin]': '0',\n '[attr.aria-valuemax]': '100',\n '[attr.title]': 'loading() ? title() || _titleValue() : null',\n '[class.fd-busy-indicator__container]': 'true',\n '[class.fd-busy-indicator__container--inline]': '!block()',\n '(keydown)': 'hostFocusChangeHandler($event)'\n }\n})\nexport class BusyIndicatorComponent {\n /** Whether to display the loading indicator animation. */\n readonly loading = input(false);\n\n /** The size of the loading indicator, default will be medium */\n readonly size = input<BusyIndicatorSize>('m');\n\n /** Whether to use loader as block element */\n readonly block = input(false);\n\n /** Aria label attribute value. */\n readonly ariaLabel = input<string | null>(null);\n\n /** Aria-valuetext attribute value. */\n readonly ariaValueText = input<string | null>(null);\n\n /** title attribute value for tooltip. */\n readonly title = input<string | undefined>(undefined);\n\n /** add loading label value */\n readonly label = input<string | undefined>(undefined);\n\n /** Aria live attribute value. */\n readonly ariaLive = input<'assertive' | 'polite' | 'off' | null>(null);\n\n /** @hidden */\n protected readonly fakeFocusElement = viewChild<ElementRef>('fakeFocusElement');\n\n /** @hidden */\n protected readonly _lang$ = inject(FD_LANGUAGE);\n\n /** @hidden */\n protected readonly _translationResolver = inject(TranslationResolver);\n\n /** @hidden */\n protected readonly _ariaValueText = toSignal(\n this._lang$.pipe(\n map((lang: FdLanguage) => this._translationResolver.resolve(lang, 'coreBusyIndicator.defaultAriaValueText'))\n ),\n { initialValue: 'Busy' }\n );\n\n /** @hidden */\n protected readonly _titleValue = toSignal(\n this._lang$.pipe(\n map((lang: FdLanguage) => this._translationResolver.resolve(lang, 'coreBusyIndicator.defaultTitle'))\n ),\n { initialValue: 'Please wait' }\n );\n\n /** @hidden */\n private readonly _elementRef = inject(ElementRef);\n\n /** @hidden If focus escapes busy container focus element after wrapped content */\n protected hostFocusChangeHandler(event: KeyboardEvent): void {\n if (this.loading() && KeyUtil.isKeyCode(event, TAB) && !event.shiftKey) {\n const element = this.fakeFocusElement();\n if (element) {\n element.nativeElement.focus();\n }\n }\n }\n\n /** @hidden If busy container is navigated as \"previous focusable element\",\n * focus busy indicator to prevent from focusing wrapped content */\n protected fakeElementFocusHandler(event: FocusEvent): void {\n if (this.loading() && event.relatedTarget !== this._elementRef.nativeElement) {\n event.stopPropagation();\n this._elementRef.nativeElement.focus();\n }\n }\n}\n","<ng-content></ng-content>\n@if (loading()) {\n <div\n #busyIndicator\n class=\"fd-busy-indicator\"\n [class.fd-busy-indicator--l]=\"size() === 'l'\"\n [class.fd-busy-indicator--m]=\"size() === 'm'\"\n [class.fd-busy-indicator--s]=\"size() === 's'\"\n >\n <div class=\"fd-busy-indicator__circle\"></div>\n <div class=\"fd-busy-indicator__circle\"></div>\n <div class=\"fd-busy-indicator__circle\"></div>\n </div>\n @if (label()) {\n <span class=\"fd-busy-indicator-extended__label\">{{ label() }}</span>\n }\n <div class=\"fd-busy-indicator__overlay\"></div>\n <div #fakeFocusElement tabindex=\"0\" aria-hidden=\"true\" (focusin)=\"fakeElementFocusHandler($event)\"></div>\n}\n","import { Directive, ElementRef, contentChild, effect, inject } from '@angular/core';\nimport { HasElementRef } from '@fundamental-ngx/cdk/utils';\nimport { BusyIndicatorComponent } from '../busy-indicator.component';\nimport { FD_BUSY_INDICATOR_COMPONENT } from '../tokens';\n\nconst messageToastClass = 'fd-message-toast';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[fd-busy-indicator-extended]',\n standalone: true\n})\nexport class BusyIndicatorExtendedDirective implements HasElementRef {\n /** @hidden */\n public readonly elementRef = inject(ElementRef);\n\n /** @hidden */\n protected readonly busyIndicator = contentChild(FD_BUSY_INDICATOR_COMPONENT, {\n read: BusyIndicatorComponent\n });\n\n /** @hidden */\n constructor() {\n effect(() => {\n const indicator = this.busyIndicator();\n if (indicator) {\n this._appendCssToParent();\n }\n });\n }\n\n /** @hidden */\n private _appendCssToParent(): void {\n const hasLabel = this.busyIndicator()?.label();\n if (!hasLabel) {\n return;\n }\n const classList = this.elementRef.nativeElement.parentElement?.classList;\n if (classList) {\n classList.add('fd-busy-indicator-extended');\n if (classList.contains(messageToastClass)) {\n classList.add('fd-busy-indicator-extended--message-toast');\n }\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { BusyIndicatorExtendedDirective } from './busy-indicator-extended/busy-indicator-extended.directive';\nimport { BusyIndicatorComponent } from './busy-indicator.component';\n\n/**\n * @deprecated\n * Use direct imports of components and directives.\n */\n@NgModule({\n exports: [BusyIndicatorComponent, BusyIndicatorExtendedDirective],\n imports: [BusyIndicatorComponent, BusyIndicatorExtendedDirective]\n})\nexport class BusyIndicatorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;MAEa,2BAA2B,GAAG,IAAI,cAAc,CAAC,0BAA0B;;MC6C3E,sBAAsB,CAAA;AA5BnC,IAAA,WAAA,GAAA;;AA8Ba,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,mDAAC;;AAGtB,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAoB,GAAG,gDAAC;;AAGpC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,KAAK,iDAAC;;AAGpB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,qDAAC;;AAGtC,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAgB,IAAI,yDAAC;;AAG1C,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAqB,SAAS,iDAAC;;AAG5C,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAqB,SAAS,iDAAC;;AAG5C,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAwC,IAAI,oDAAC;;AAGnD,QAAA,IAAA,CAAA,gBAAgB,GAAG,SAAS,CAAa,kBAAkB,4DAAC;;AAG5D,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;;AAG5B,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,mBAAmB,CAAC;;AAGlD,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,GAAG,CAAC,CAAC,IAAgB,KAAK,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,wCAAwC,CAAC,CAAC,CAC/G,EACD,EAAE,YAAY,EAAE,MAAM,EAAE,CAC3B;;AAGkB,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,GAAG,CAAC,CAAC,IAAgB,KAAK,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC,CACvG,EACD,EAAE,YAAY,EAAE,aAAa,EAAE,CAClC;;AAGgB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAoBpD,IAAA;;AAjBa,IAAA,sBAAsB,CAAC,KAAoB,EAAA;AACjD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACpE,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;YACvC,IAAI,OAAO,EAAE;AACT,gBAAA,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE;YACjC;QACJ;IACJ;AAEA;AACmE;AACzD,IAAA,uBAAuB,CAAC,KAAiB,EAAA;AAC/C,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;YAC1E,KAAK,CAAC,eAAe,EAAE;AACvB,YAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE;QAC1C;IACJ;8GAtES,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,gCAAA,EAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,4CAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,wDAAA,EAAA,oBAAA,EAAA,GAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,YAAA,EAAA,6CAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,4CAAA,EAAA,UAAA,EAAA,EAAA,EAAA,SAAA,EArBpB;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,2BAA2B;AACpC,gBAAA,WAAW,EAAE;AAChB;AACJ,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BL,0vBAmBA,EAAA,MAAA,EAAA,CAAA,2hLAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FD4Ba,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA5BlC,SAAS;+BACI,mBAAmB,EAAA,aAAA,EAGd,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,SAAA,EACL;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,2BAA2B;AACpC,4BAAA,WAAW,EAAA;AACd;qBACJ,EAAA,IAAA,EACK;AACF,wBAAA,aAAa,EAAE,4CAA4C;AAC3D,wBAAA,iBAAiB,EAAE,oBAAoB;AACvC,wBAAA,kBAAkB,EAAE,WAAW;AAC/B,wBAAA,kBAAkB,EAAE,YAAY;AAChC,wBAAA,mBAAmB,EAAE,aAAa;AAClC,wBAAA,uBAAuB,EAAE,wDAAwD;AACjF,wBAAA,sBAAsB,EAAE,GAAG;AAC3B,wBAAA,sBAAsB,EAAE,KAAK;AAC7B,wBAAA,cAAc,EAAE,6CAA6C;AAC7D,wBAAA,sCAAsC,EAAE,MAAM;AAC9C,wBAAA,8CAA8C,EAAE,UAAU;AAC1D,wBAAA,WAAW,EAAE;AAChB,qBAAA,EAAA,QAAA,EAAA,0vBAAA,EAAA,MAAA,EAAA,CAAA,2hLAAA,CAAA,EAAA;8zBA4B2D,kBAAkB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEpElF,MAAM,iBAAiB,GAAG,kBAAkB;MAO/B,8BAA8B,CAAA;;AAUvC,IAAA,WAAA,GAAA;;AARgB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;QAG5B,IAAA,CAAA,aAAa,GAAG,YAAY,CAAC,2BAA2B,0DACvE,IAAI,EAAE,sBAAsB,EAAA,CAC9B;QAIE,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;YACtC,IAAI,SAAS,EAAE;gBACX,IAAI,CAAC,kBAAkB,EAAE;YAC7B;AACJ,QAAA,CAAC,CAAC;IACN;;IAGQ,kBAAkB,GAAA;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE;QAC9C,IAAI,CAAC,QAAQ,EAAE;YACX;QACJ;QACA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS;QACxE,IAAI,SAAS,EAAE;AACX,YAAA,SAAS,CAAC,GAAG,CAAC,4BAA4B,CAAC;AAC3C,YAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;AACvC,gBAAA,SAAS,CAAC,GAAG,CAAC,2CAA2C,CAAC;YAC9D;QACJ;IACJ;8GAhCS,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAKS,2BAA2B,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EACjE,sBAAsB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FANvB,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAL1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;;AAEP,oBAAA,QAAQ,EAAE,8BAA8B;AACxC,oBAAA,UAAU,EAAE;AACf,iBAAA;AAMmD,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,2BAA2B,CAAA,EAAA,EAAA,GAAE;AACzE,4BAAA,IAAI,EAAE;AACT,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACfL;;;AAGG;MAKU,mBAAmB,CAAA;8GAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,YAFlB,sBAAsB,EAAE,8BAA8B,CAAA,EAAA,OAAA,EAAA,CADtD,sBAAsB,EAAE,8BAA8B,CAAA,EAAA,CAAA,CAAA;+GAGvD,mBAAmB,EAAA,CAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAJ/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE,CAAC,sBAAsB,EAAE,8BAA8B,CAAC;AACjE,oBAAA,OAAO,EAAE,CAAC,sBAAsB,EAAE,8BAA8B;AACnE,iBAAA;;;ACXD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core",
3
- "version": "0.60.1",
3
+ "version": "0.60.3",
4
4
  "schematics": "./schematics/collection.json",
5
5
  "ng-update": {
6
6
  "migrations": "./schematics/migrations.json"
@@ -23,8 +23,8 @@
23
23
  "@angular/forms": "^21.0.0",
24
24
  "@angular/platform-browser": "^21.0.0",
25
25
  "@angular/router": "^21.0.0",
26
- "@fundamental-ngx/cdk": "0.60.1",
27
- "@fundamental-ngx/i18n": "0.60.1",
26
+ "@fundamental-ngx/cdk": "0.60.3",
27
+ "@fundamental-ngx/i18n": "0.60.3",
28
28
  "@sap-theming/theming-base-content": "^11.32.0",
29
29
  "fundamental-styles": "0.40.1",
30
30
  "rxjs": "^7.8.0"
@@ -93,11 +93,13 @@ declare class AvatarComponent {
93
93
  private readonly _shouldShowDefaultIcon;
94
94
  /** @hidden Stored random color accent to prevent regeneration */
95
95
  private readonly _randomColorAccent;
96
+ /** @hidden Track the currently loading/loaded image URL to prevent duplicate requests */
97
+ private _currentImageUrl;
98
+ /** @hidden Cache of successfully loaded image URLs to prevent re-requesting */
99
+ private readonly _loadedImageCache;
96
100
  /** @hidden */
97
101
  private readonly _elementRef;
98
102
  /** @hidden */
99
- private readonly _renderer;
100
- /** @hidden */
101
103
  private readonly _hostTabindex;
102
104
  /** @hidden */
103
105
  constructor();