{"version":3,"file":"sdcorejs-angular-components-avatar.mjs","sources":["../../../projects/sdcorejs-angular/components/avatar/src/avatar.component.ts","../../../projects/sdcorejs-angular/components/avatar/src/avatar.component.html","../../../projects/sdcorejs-angular/components/avatar/sdcorejs-angular-components-avatar.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, input, signal } from '@angular/core';\n\n@Component({\n  selector: 'sd-avatar',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './avatar.component.html',\n  styleUrl: './avatar.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdAvatar {\n  /**\n   * The source string to be used for the avatar.\n   * - If it matches a URL pattern, an image is displayed.\n   * - If it is a string representing a name, initials and a colored background are generated.\n   * - If undefined, it falls back to a neutral ? initial.\n   */\n  readonly src = input.required<string | undefined | null>();\n  readonly size = input<number>(32);\n\n  readonly #imageError = signal<boolean>(false);\n\n  constructor() {\n    // Reset image error state whenever src changes\n    effect(() => {\n      this.src();\n      this.#imageError.set(false);\n    });\n  }\n\n  readonly isUrl = computed(() => {\n    // If image has failed to load, treat it as a non-url to fallback to initials using the literal URL text\n    if (this.#imageError()) {\n      return false;\n    }\n    const val = this.src() || '';\n    const urlPattern = /^(http|https|data:image|\\/)/;\n    return urlPattern.test(val);\n  });\n\n  readonly bgColor = computed(() => {\n    if (this.isUrl()) {\n      return 'transparent';\n    }\n    const val = this.src() || '';\n    if (!val) {\n      return '#bdc3c7';\n    }\n    return this.#generateColor(val);\n  });\n\n  readonly initials = computed(() => {\n    if (this.isUrl()) {\n      return '';\n    }\n    const val = this.src() || '';\n    if (!val) {\n      return '?';\n    }\n    return this.#getInitials(val);\n  });\n\n  handleError() {\n    this.#imageError.set(true);\n  }\n\n  #getInitials = (name: string): string => {\n    const words = name.trim().split(' ').filter(Boolean);\n    if (!words.length) return '';\n    if (words.length === 1) return words[0][0].toUpperCase();\n    return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n  };\n\n  #generateColor = (name: string): string => {\n    const colors = [\n      '#1abc9c',\n      '#2ecc71',\n      '#3498db',\n      '#9b59b6',\n      '#34495e',\n      '#16a085',\n      '#27ae60',\n      '#2980b9',\n      '#8e44ad',\n      '#2c3e50',\n      '#f1c40f',\n      '#e67e22',\n      '#e74c3c',\n      '#95a5a6',\n      '#f39c12',\n      '#d35400',\n      '#c0392b',\n      '#bdc3c7',\n      '#7f8c8d',\n    ];\n    let hash = 0;\n    for (let i = 0; i < name.length; i++) {\n      hash = name.charCodeAt(i) + ((hash << 5) - hash);\n    }\n    return colors[Math.abs(hash) % colors.length];\n  };\n}\n","@let _size = size();\n<div class=\"sd-avatar\" [style.width.px]=\"_size\" [style.height.px]=\"_size\" [style.line-height.px]=\"_size\" [style.backgroundColor]=\"bgColor()\">\n  @if (isUrl()) {\n    <img [src]=\"src()\" (error)=\"handleError()\" alt=\"avatar\" />\n  } @else {\n    <span class=\"sd-avatar-text\" [style.fontSize.px]=\"_size / 2.5\">\n      {{ initials() }}\n    </span>\n  }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}