{"version":3,"file":"ngx-com-components-avatar.mjs","sources":["../../../projects/com/components/avatar/avatar-custom.directive.ts","../../../projects/com/components/avatar/avatar.variants.ts","../../../projects/com/components/avatar/avatar.component.ts","../../../projects/com/components/avatar/avatar-group.directive.ts","../../../projects/com/components/avatar/index.ts","../../../projects/com/components/avatar/ngx-com-components-avatar.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\nimport type { AvatarSize } from './avatar.variants';\n\n/**\n * Template context provided to custom avatar templates.\n *\n * @example\n * ```html\n * <com-avatar name=\"Acme Corp\" size=\"lg\">\n *   <ng-template comAvatarCustom let-name let-initials=\"initials\" let-size=\"size\">\n *     <img src=\"/logos/acme.svg\" class=\"size-full object-contain p-1\" [alt]=\"name\" />\n *   </ng-template>\n * </com-avatar>\n * ```\n */\nexport interface AvatarTemplateContext {\n  /** The `name` input value (default for `let-name`). */\n  $implicit: string | undefined;\n  /** Computed initials from the name. */\n  initials: string;\n  /** Current size variant, allowing templates to adapt. */\n  size: AvatarSize;\n}\n\n/**\n * Directive to provide a custom template for avatar content.\n *\n * When this directive is used, the avatar ignores the `src`, `name`, and\n * default icon fallback — the template has full control over the content.\n * Use this for company logos, emoji avatars, or custom graphics.\n *\n * @tokens none\n *\n * @example Company logo\n * ```html\n * <com-avatar name=\"Acme Corp\" size=\"lg\" color=\"primary\">\n *   <ng-template comAvatarCustom let-initials=\"initials\">\n *     <img src=\"/logos/acme.svg\" class=\"size-full object-contain p-1\" alt=\"Acme Corp\" />\n *   </ng-template>\n * </com-avatar>\n * ```\n *\n * @example Emoji avatar\n * ```html\n * <com-avatar name=\"Bot\" color=\"accent\" variant=\"filled\">\n *   <ng-template comAvatarCustom>\n *     <span class=\"text-lg\">🤖</span>\n *   </ng-template>\n * </com-avatar>\n * ```\n *\n * @example Adaptive content using size context\n * ```html\n * <com-avatar name=\"Jane\" [size]=\"avatarSize\">\n *   <ng-template comAvatarCustom let-size=\"size\">\n *     @if (size === 'xs' || size === 'sm') {\n *       <span class=\"text-xs\">👤</span>\n *     } @else {\n *       <img src=\"/custom-avatar.png\" class=\"size-full object-cover\" />\n *     }\n *   </ng-template>\n * </com-avatar>\n * ```\n */\n@Directive({\n  selector: 'ng-template[comAvatarCustom]',\n})\nexport class ComAvatarCustom {\n  readonly templateRef: TemplateRef<AvatarTemplateContext> = inject(TemplateRef);\n\n  /**\n   * Static type guard for template type checking.\n   * Enables type-safe access to context properties in templates.\n   */\n  static ngTemplateContextGuard(\n    _dir: ComAvatarCustom,\n    ctx: unknown\n  ): ctx is AvatarTemplateContext {\n    return true;\n  }\n}\n","import { cva } from 'class-variance-authority';\n\n/** Avatar size variants. */\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n/** Avatar color variants. */\nexport type AvatarColor = 'primary' | 'accent' | 'muted' | 'warn' | 'auto';\n\n/** Avatar shape variants. */\nexport type AvatarShape = 'circle' | 'rounded';\n\n/** Avatar variant types. */\nexport type AvatarVariant = 'soft' | 'filled' | 'outline';\n\n/** Resolved color (excludes 'auto' which is computed at runtime). */\nexport type ResolvedAvatarColor = Exclude<AvatarColor, 'auto'>;\n\n/** Colors available for auto-color generation. */\nconst AUTO_COLORS: readonly ResolvedAvatarColor[] = ['primary', 'accent', 'warn'] as const;\n\n/**\n * Deterministically generates a color index from a name string.\n * The same name always produces the same color.\n */\nexport function nameToColorIndex(name: string): number {\n  let hash = 0;\n  for (let i = 0; i < name.length; i++) {\n    hash = name.charCodeAt(i) + ((hash << 5) - hash);\n    hash = hash & hash; // Convert to 32bit integer\n  }\n  return Math.abs(hash) % AUTO_COLORS.length;\n}\n\n/**\n * Resolves an auto color to a concrete color based on the name.\n * Falls back to 'muted' when name is empty or undefined.\n */\nexport function resolveAutoColor(color: AvatarColor, name: string | undefined): ResolvedAvatarColor {\n  if (color !== 'auto') {\n    return color;\n  }\n  if (!name?.trim()) {\n    return 'muted';\n  }\n  return AUTO_COLORS[nameToColorIndex(name)]!;\n}\n\n/**\n * Generates initials from a display name.\n *\n * @param name - The display name to extract initials from\n * @param maxLength - Maximum number of characters (default: 2)\n * @returns Uppercase initials, or empty string if name is empty\n *\n * @example\n * ```ts\n * getInitials('Jane Doe')       // 'JD'\n * getInitials('Jane')           // 'JA'\n * getInitials('Jane Marie Doe') // 'JD' (first + last)\n * getInitials('j')              // 'J'\n * getInitials('')               // ''\n * ```\n */\nexport function getInitials(name: string, maxLength: number = 2): string {\n  const trimmed = name.trim();\n  if (!trimmed) {\n    return '';\n  }\n\n  const words = trimmed.split(/\\s+/);\n\n  if (words.length === 1) {\n    // Single word: take first N characters\n    return words[0]!.slice(0, maxLength).toUpperCase();\n  }\n\n  // Multiple words: first char of first word + first char of last word\n  const first = words[0]!.charAt(0);\n  const last = words[words.length - 1]!.charAt(0);\n  return (first + last).slice(0, maxLength).toUpperCase();\n}\n\n/**\n * CVA variants for the avatar container.\n *\n * @tokens `--color-primary`, `--color-primary-foreground`, `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n *         `--color-accent`, `--color-accent-foreground`, `--color-accent-subtle`, `--color-accent-subtle-foreground`,\n *         `--color-warn`, `--color-warn-foreground`, `--color-warn-subtle`, `--color-warn-subtle-foreground`,\n *         `--color-muted`, `--color-muted-foreground`,\n *         `--color-border`, `--color-background`, `--color-foreground`, `--color-ring`\n */\nexport const avatarVariants: (props?: {\n  size?: AvatarSize;\n  shape?: AvatarShape;\n  interactive?: boolean;\n}) => string = cva(\n  [\n    'com-avatar',\n    'relative overflow-hidden inline-flex items-center justify-center',\n    'shrink-0 select-none',\n  ],\n  {\n    variants: {\n      size: {\n        xs: 'size-5',\n        sm: 'size-7',\n        md: 'size-9',\n        lg: 'size-12',\n        xl: 'size-16',\n        '2xl': 'size-24',\n      },\n      shape: {\n        circle: 'rounded-pill',\n        rounded: 'rounded-card',\n      },\n      interactive: {\n        true: [\n          'cursor-pointer',\n          'hover:ring-2 hover:ring-ring',\n          'active:scale-95',\n          'transition-all duration-normal',\n        ],\n        false: 'cursor-default',\n      },\n    },\n    compoundVariants: [\n      // Smaller rounded corners for xs/sm sizes\n      { shape: 'rounded', size: 'xs', class: 'rounded-interactive-sm' },\n      { shape: 'rounded', size: 'sm', class: 'rounded-interactive-sm' },\n    ],\n    defaultVariants: {\n      size: 'md',\n      shape: 'circle',\n      interactive: false,\n    },\n  }\n);\n\n/**\n * CVA variants for the avatar color/variant styling.\n * These are applied based on the resolved color and variant.\n */\nexport const avatarColorVariants: (props?: {\n  variant?: AvatarVariant;\n  color?: ResolvedAvatarColor;\n}) => string = cva('', {\n  variants: {\n    variant: {\n      soft: '',\n      filled: '',\n      outline: 'ring-2 ring-background bg-background text-foreground',\n    },\n    color: {\n      primary: '',\n      accent: '',\n      muted: '',\n      warn: '',\n    },\n  },\n  compoundVariants: [\n    // Soft variants\n    { variant: 'soft', color: 'primary', class: 'bg-primary-subtle text-primary-subtle-foreground' },\n    { variant: 'soft', color: 'accent', class: 'bg-accent-subtle text-accent-subtle-foreground' },\n    { variant: 'soft', color: 'warn', class: 'bg-warn-subtle text-warn-subtle-foreground' },\n    { variant: 'soft', color: 'muted', class: 'bg-muted text-muted-foreground' },\n\n    // Filled variants\n    { variant: 'filled', color: 'primary', class: 'bg-primary text-primary-foreground' },\n    { variant: 'filled', color: 'accent', class: 'bg-accent text-accent-foreground' },\n    { variant: 'filled', color: 'warn', class: 'bg-warn text-warn-foreground' },\n    { variant: 'filled', color: 'muted', class: 'bg-muted-foreground text-muted' },\n  ],\n  defaultVariants: {\n    variant: 'soft',\n    color: 'primary',\n  },\n});\n\n/** Font size classes for initials, keyed by avatar size. */\nexport const AVATAR_INITIALS_SIZES: Record<AvatarSize, string> = {\n  xs: 'text-[0.5rem]',\n  sm: 'text-xs',\n  md: 'text-sm',\n  lg: 'text-base',\n  xl: 'text-xl',\n  '2xl': 'text-3xl',\n};\n\n\n/** Ring width classes for outline variant, keyed by avatar size. */\nexport const AVATAR_OUTLINE_RING_SIZES: Record<AvatarSize, string> = {\n  xs: 'ring-1',\n  sm: 'ring-[1.5px]',\n  md: 'ring-2',\n  lg: 'ring-2',\n  xl: 'ring-2',\n  '2xl': 'ring-[3px]',\n};\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  contentChild,\n  ElementRef,\n  inject,\n  input,\n  linkedSignal,\n  output,\n  ViewEncapsulation,\n} from '@angular/core';\nimport type {\n  InputSignal,\n  OutputEmitterRef,\n  Signal,\n  WritableSignal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport { ComAvatarCustom } from './avatar-custom.directive';\nimport type { AvatarTemplateContext } from './avatar-custom.directive';\nimport {\n  avatarVariants,\n  avatarColorVariants,\n  getInitials,\n  resolveAutoColor,\n  AVATAR_INITIALS_SIZES,\n  AVATAR_OUTLINE_RING_SIZES,\n} from './avatar.variants';\nimport type {\n  AvatarSize,\n  AvatarColor,\n  AvatarShape,\n  AvatarVariant,\n  ResolvedAvatarColor,\n} from './avatar.variants';\n\n/** Image loading state. */\ntype ImageState = 'idle' | 'loading' | 'loaded' | 'error';\n\n/**\n * Avatar component — displays a user's profile image, initials, or a fallback icon.\n *\n * Handles the full lifecycle of image loading with a graceful fallback chain:\n * 1. Custom template (via `comAvatarCustom` directive) — if provided, always wins\n * 2. Image — if `src` is provided and loads successfully\n * 3. Initials — if `name` is provided, auto-generated from the name\n * 4. Default icon — generic user silhouette via `com-icon`\n *\n * **Note:** The default fallback icon requires the `User` icon from lucide-angular\n * to be registered via `provideComIcons({ User })` in your application config.\n *\n * @tokens `--color-primary`, `--color-primary-foreground`, `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n *         `--color-accent`, `--color-accent-foreground`, `--color-accent-subtle`, `--color-accent-subtle-foreground`,\n *         `--color-warn`, `--color-warn-foreground`, `--color-warn-subtle`, `--color-warn-subtle-foreground`,\n *         `--color-muted`, `--color-muted-foreground`,\n *         `--color-border`, `--color-background`, `--color-foreground`, `--color-ring`\n *\n * @example Simple image avatar\n * ```html\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane Doe\" />\n * ```\n *\n * @example Initials fallback (no image)\n * ```html\n * <com-avatar name=\"Jane Doe\" />\n * <!-- renders \"JD\" with auto-computed background color -->\n * ```\n *\n * @example Explicit color and shape\n * ```html\n * <com-avatar name=\"John Smith\" color=\"primary\" variant=\"filled\" />\n * <com-avatar name=\"Alice\" color=\"accent\" shape=\"rounded\" />\n * ```\n *\n * @example Sizes — from badge to profile header\n * ```html\n * <!-- Tiny: inside a badge or inline with text -->\n * <com-avatar name=\"JD\" size=\"xs\" />\n *\n * <!-- Small: list items, comments -->\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane\" size=\"sm\" />\n *\n * <!-- Medium: default, cards -->\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane\" />\n *\n * <!-- Large: profile sidebar -->\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane\" size=\"lg\" />\n *\n * <!-- Extra large: profile hero -->\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane\" size=\"xl\" />\n *\n * <!-- 2XL: full profile page header -->\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane\" size=\"2xl\" />\n * ```\n *\n * @example Default icon fallback (no name, no image)\n * ```html\n * <!-- Shows generic user icon -->\n * <com-avatar />\n * ```\n *\n * @example Interactive (clickable, for menus)\n * ```html\n * <com-avatar\n *   src=\"/photos/me.jpg\"\n *   name=\"My Profile\"\n *   [interactive]=\"true\"\n *   (click)=\"openProfileMenu()\"\n * />\n * ```\n *\n * @example With status indicator (composed externally)\n * ```html\n * <!-- The avatar itself doesn't own the status dot — the consumer composes it -->\n * <div class=\"relative inline-flex\">\n *   <com-avatar src=\"/photos/jane.jpg\" name=\"Jane\" size=\"sm\" />\n *   <span class=\"absolute bottom-0 right-0 size-2.5 rounded-full bg-success ring-2 ring-background\"></span>\n * </div>\n * ```\n *\n * @example Custom template — company logo with fallback\n * ```html\n * <com-avatar name=\"Acme Corp\" size=\"lg\" color=\"primary\">\n *   <ng-template comAvatarCustom let-initials=\"initials\">\n *     <img src=\"/logos/acme.svg\" class=\"size-full object-contain p-1\" alt=\"Acme Corp\" />\n *   </ng-template>\n * </com-avatar>\n * ```\n *\n * @example Custom template — emoji avatar\n * ```html\n * <com-avatar name=\"Bot\" color=\"accent\" variant=\"filled\">\n *   <ng-template comAvatarCustom>\n *     <span class=\"text-lg\">🤖</span>\n *   </ng-template>\n * </com-avatar>\n * ```\n *\n * @example Inline with text\n * ```html\n * <span class=\"inline-flex items-center gap-2\">\n *   <com-avatar name=\"Jane Doe\" size=\"xs\" />\n *   <span class=\"text-sm\">Jane Doe</span>\n * </span>\n * ```\n *\n * @example Avatar in a badge context\n * ```html\n * <!-- Works at xs/sm sizes without breaking layout -->\n * <div class=\"flex items-center gap-1.5 rounded-pill bg-muted px-2 py-0.5\">\n *   <com-avatar name=\"Jane\" size=\"xs\" />\n *   <span class=\"text-xs\">Jane Doe</span>\n *   <button class=\"text-muted-foreground hover:text-foreground\">\n *     <com-icon name=\"x\" size=\"xs\" />\n *   </button>\n * </div>\n * ```\n *\n * @example Outline variant (good for overlapping stacks)\n * ```html\n * <div class=\"flex -space-x-2\">\n *   <com-avatar src=\"/photos/a.jpg\" name=\"Alice\" size=\"sm\" variant=\"outline\" />\n *   <com-avatar src=\"/photos/b.jpg\" name=\"Bob\" size=\"sm\" variant=\"outline\" />\n *   <com-avatar src=\"/photos/c.jpg\" name=\"Carol\" size=\"sm\" variant=\"outline\" />\n *   <com-avatar name=\"+3\" size=\"sm\" variant=\"outline\" color=\"muted\" />\n * </div>\n * ```\n */\n@Component({\n  selector: 'com-avatar',\n  exportAs: 'comAvatar',\n  template: `\n    <!-- Layer 1: Background content (initials, icon, or custom template) -->\n    @if (customTemplate(); as template) {\n      <!-- Custom template — full consumer control -->\n      <ng-container\n        [ngTemplateOutlet]=\"template.templateRef\"\n        [ngTemplateOutletContext]=\"templateContext()\"\n      />\n    } @else if (computedInitials()) {\n      <!-- Initials -->\n      <span\n        aria-hidden=\"true\"\n        class=\"font-medium leading-none\"\n        [class]=\"initialsSizeClass()\"\n      >\n        {{ computedInitials() }}\n      </span>\n    } @else {\n      <!-- Default icon fallback -->\n      <com-icon name=\"user\" [size]=\"iconSize()\" aria-hidden=\"true\" />\n    }\n\n    <!-- Layer 2: Image (overlays the fallback when loaded) -->\n    @if (src() && !customTemplate()) {\n      <img\n        [src]=\"src()\"\n        [alt]=\"alt() || name() || 'Avatar'\"\n        class=\"absolute inset-0 size-full object-cover transition-opacity duration-slow\"\n        [class.opacity-0]=\"imageState() !== 'loaded'\"\n        [class.opacity-100]=\"imageState() === 'loaded'\"\n        [style.border-radius]=\"'inherit'\"\n        (load)=\"onImageLoad()\"\n        (error)=\"onImageError()\"\n      />\n    }\n\n    <!-- Screen reader text -->\n    <span class=\"sr-only\">{{ alt() || name() || 'User avatar' }}</span>\n  `,\n  styles: `\n    .sr-only {\n      position: absolute;\n      width: 1px;\n      height: 1px;\n      padding: 0;\n      margin: -1px;\n      overflow: hidden;\n      clip: rect(0, 0, 0, 0);\n      white-space: nowrap;\n      border: 0;\n    }\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  imports: [NgTemplateOutlet, ComIcon],\n  host: {\n    '[class]': 'hostClasses()',\n    '[attr.role]': 'interactive() ? \"button\" : \"img\"',\n    '[attr.tabindex]': 'interactive() ? 0 : null',\n    '[attr.aria-label]': 'alt() || name() || \"User avatar\"',\n  },\n})\nexport class ComAvatar {\n  /** Host element reference (used by ComAvatarGroup). */\n  readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n  // ─── Content ───\n\n  /** Image URL for the avatar. */\n  readonly src: InputSignal<string | undefined> = input<string>();\n\n  /** Alt text for the image. Falls back to `name` if not provided. */\n  readonly alt: InputSignal<string | undefined> = input<string>();\n\n  /** User's display name — used to generate initials and as aria fallback. */\n  readonly name: InputSignal<string | undefined> = input<string>();\n\n  // ─── CVA Variants ───\n\n  /** Size variant. */\n  readonly size: InputSignal<AvatarSize> = input<AvatarSize>('md');\n\n  /** Color variant. 'auto' deterministically picks a color based on the name. */\n  readonly color: InputSignal<AvatarColor> = input<AvatarColor>('auto');\n\n  /** Shape variant. */\n  readonly shape: InputSignal<AvatarShape> = input<AvatarShape>('circle');\n\n  /** Visual style variant. */\n  readonly variant: InputSignal<AvatarVariant> = input<AvatarVariant>('soft');\n\n  // ─── Behavior ───\n\n  /** When true, renders as a button with hover/active states. */\n  readonly interactive: InputSignal<boolean> = input<boolean>(false);\n\n  // ─── Outputs ───\n\n  /** Emits when the image fails to load (after fallback kicks in). */\n  readonly imageError: OutputEmitterRef<void> = output<void>();\n\n  /** Emits when the image loads successfully. */\n  readonly imageLoaded: OutputEmitterRef<void> = output<void>();\n\n  // ─── Template Projection ───\n\n  /** Custom template for full control over avatar content. */\n  readonly customTemplate: Signal<ComAvatarCustom | undefined> = contentChild<ComAvatarCustom>(ComAvatarCustom);\n\n  // ─── Internal State ───\n\n  /**\n   * Current image loading state.\n   * Resets to 'loading' or 'idle' when `src` changes.\n   */\n  protected readonly imageState: WritableSignal<ImageState> = linkedSignal<string | undefined, ImageState>({\n    source: this.src,\n    computation: (src) => src ? 'loading' : 'idle',\n  });\n\n  // ─── Computed Values ───\n\n  /** Resolved color (handles 'auto' based on name). */\n  protected readonly resolvedColor: Signal<ResolvedAvatarColor> = computed(() =>\n    resolveAutoColor(this.color(), this.name())\n  );\n\n  /** Computed initials from the name. */\n  readonly computedInitials: Signal<string> = computed(() => {\n    const name = this.name();\n    return name ? getInitials(name) : '';\n  });\n\n  /** Template context for custom templates. */\n  protected readonly templateContext: Signal<AvatarTemplateContext> = computed(() => ({\n    $implicit: this.name(),\n    initials: this.computedInitials(),\n    size: this.size(),\n  }));\n\n  /** CSS classes for the host element. */\n  protected readonly hostClasses: Signal<string> = computed(() => {\n    const baseClasses = avatarVariants({\n      size: this.size(),\n      shape: this.shape(),\n      interactive: this.interactive(),\n    });\n\n    const colorClasses = this.variant() === 'outline'\n      ? avatarColorVariants({ variant: 'outline' })\n      : avatarColorVariants({\n          variant: this.variant(),\n          color: this.resolvedColor(),\n        });\n\n    // Add outline ring size for outline variant\n    const ringClass = this.variant() === 'outline'\n      ? AVATAR_OUTLINE_RING_SIZES[this.size()]\n      : '';\n\n    return [baseClasses, colorClasses, ringClass].filter(Boolean).join(' ');\n  });\n\n  /** Font size class for initials. */\n  protected readonly initialsSizeClass: Signal<string> = computed(\n    () => AVATAR_INITIALS_SIZES[this.size()]\n  );\n\n  /** Icon size for the fallback icon (same as avatar size). */\n  protected readonly iconSize: Signal<AvatarSize> = this.size;\n\n  // ─── Event Handlers ───\n\n  /** @internal Handles successful image load. */\n  protected onImageLoad(): void {\n    this.imageState.set('loaded');\n    this.imageLoaded.emit();\n  }\n\n  /** @internal Handles image load error. */\n  protected onImageError(): void {\n    this.imageState.set('error');\n    this.imageError.emit();\n  }\n}\n","import {\n  computed,\n  contentChildren,\n  Directive,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  Renderer2,\n  signal,\n} from '@angular/core';\nimport type { InputSignal, Signal, WritableSignal } from '@angular/core';\nimport { ComAvatar } from './avatar.component';\nimport type { AvatarSize } from './avatar.variants';\n\n/** Spacing between overlapping avatars, keyed by size. */\nconst AVATAR_GROUP_SPACING: Record<AvatarSize, string> = {\n  xs: '-0.375rem',  // -6px, ~30% of 20px\n  sm: '-0.5rem',    // -8px, ~29% of 28px\n  md: '-0.625rem',  // -10px, ~28% of 36px\n  lg: '-0.75rem',   // -12px, ~25% of 48px\n  xl: '-1rem',      // -16px, ~25% of 64px\n  '2xl': '-1.5rem', // -24px, ~25% of 96px\n};\n\n/** Ring width for visual separation, keyed by size. */\nconst AVATAR_GROUP_RING: Record<AvatarSize, string> = {\n  xs: '1px',\n  sm: '1.5px',\n  md: '2px',\n  lg: '2px',\n  xl: '2px',\n  '2xl': '3px',\n};\n\n/**\n * Avatar group directive — displays multiple avatars in an overlapping stack.\n *\n * Apply this directive to a container element with `com-avatar` children.\n * The directive handles negative spacing, ring styling for visual separation,\n * and optionally limits the visible avatars with an overflow indicator.\n *\n * **Note:** Child avatars should use `variant=\"outline\"` for best visual results,\n * as this provides the ring that separates overlapping avatars. The directive\n * adds `ring-background` to ensure proper visual separation.\n *\n * @tokens `--color-background`, `--color-muted`, `--color-muted-foreground`\n *\n * @example Basic usage\n * ```html\n * <div comAvatarGroup>\n *   <com-avatar src=\"/photos/a.jpg\" name=\"Alice\" variant=\"outline\" />\n *   <com-avatar src=\"/photos/b.jpg\" name=\"Bob\" variant=\"outline\" />\n *   <com-avatar src=\"/photos/c.jpg\" name=\"Carol\" variant=\"outline\" />\n * </div>\n * ```\n *\n * @example With max limit and overflow indicator\n * ```html\n * <div comAvatarGroup [max]=\"3\">\n *   <com-avatar src=\"/photos/a.jpg\" name=\"Alice\" variant=\"outline\" />\n *   <com-avatar src=\"/photos/b.jpg\" name=\"Bob\" variant=\"outline\" />\n *   <com-avatar src=\"/photos/c.jpg\" name=\"Carol\" variant=\"outline\" />\n *   <com-avatar src=\"/photos/d.jpg\" name=\"Dave\" variant=\"outline\" />\n *   <com-avatar src=\"/photos/e.jpg\" name=\"Eve\" variant=\"outline\" />\n * </div>\n * <!-- Shows 3 avatars + \"+2\" indicator -->\n * ```\n *\n * @example Different sizes\n * ```html\n * <div comAvatarGroup size=\"sm\">\n *   <com-avatar name=\"A\" size=\"sm\" variant=\"outline\" />\n *   <com-avatar name=\"B\" size=\"sm\" variant=\"outline\" />\n * </div>\n *\n * <div comAvatarGroup size=\"lg\">\n *   <com-avatar name=\"A\" size=\"lg\" variant=\"outline\" />\n *   <com-avatar name=\"B\" size=\"lg\" variant=\"outline\" />\n * </div>\n * ```\n *\n * @example Reversed stacking (last avatar on top)\n * ```html\n * <div comAvatarGroup [reverse]=\"true\">\n *   <com-avatar name=\"First\" variant=\"outline\" />\n *   <com-avatar name=\"Second\" variant=\"outline\" />\n *   <com-avatar name=\"Third (on top)\" variant=\"outline\" />\n * </div>\n * ```\n */\n@Directive({\n  selector: '[comAvatarGroup]',\n  exportAs: 'comAvatarGroup',\n  host: {\n    class: 'com-avatar-group inline-flex items-center',\n    '[class.flex-row-reverse]': 'reverse()',\n  },\n})\nexport class ComAvatarGroup {\n  private readonly renderer: Renderer2 = inject(Renderer2);\n  private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n  /** Query all child ComAvatar components. */\n  private readonly avatars: Signal<readonly ComAvatar[]> = contentChildren<ComAvatar>(ComAvatar);\n\n  /**\n   * Size variant — should match child avatar sizes for proper spacing.\n   * If not provided, defaults to 'md'.\n   */\n  readonly size: InputSignal<AvatarSize> = input<AvatarSize>('md');\n\n  /**\n   * Maximum number of avatars to display.\n   * When exceeded, remaining avatars are hidden and an overflow indicator shows \"+N\".\n   * Set to 0 or undefined for unlimited.\n   */\n  readonly max: InputSignal<number | undefined> = input<number>();\n\n  /**\n   * When true, reverses the stacking order (last avatar on top instead of first).\n   * Also reverses the visual order via flex-row-reverse.\n   */\n  readonly reverse: InputSignal<boolean> = input<boolean>(false);\n\n  /** Overflow element reference for cleanup. */\n  private overflowElement: HTMLElement | null = null;\n\n  /** Track the number of hidden avatars. */\n  protected readonly overflowCount: WritableSignal<number> = signal(0);\n\n  /** Whether to show the overflow indicator. */\n  protected readonly showOverflow: Signal<boolean> = computed(() => this.overflowCount() > 0);\n\n  constructor() {\n    // Apply styling to avatars when they change\n    effect(() => {\n      const avatarList = this.avatars();\n      const maxCount = this.max();\n      const size = this.size();\n      const isReverse = this.reverse();\n\n      this.applyAvatarStyles(avatarList, maxCount, size, isReverse);\n    });\n  }\n\n  /**\n   * Applies overlapping styles to child avatars and manages visibility.\n   */\n  private applyAvatarStyles(\n    avatars: readonly ComAvatar[],\n    max: number | undefined,\n    size: AvatarSize,\n    reverse: boolean\n  ): void {\n    const spacing = AVATAR_GROUP_SPACING[size];\n    const ringWidth = AVATAR_GROUP_RING[size];\n    const total = avatars.length;\n    const visibleCount = max && max > 0 ? Math.min(max, total) : total;\n    const hiddenCount = total - visibleCount;\n\n    this.overflowCount.set(hiddenCount);\n\n    avatars.forEach((avatar, index) => {\n      const hostEl = (avatar as unknown as { elementRef?: ElementRef })['elementRef']?.nativeElement\n        ?? this.getAvatarElement(index);\n\n      if (!hostEl) return;\n\n      // Determine if this avatar should be visible\n      const isVisible = index < visibleCount;\n\n      // Apply visibility\n      this.renderer.setStyle(hostEl, 'display', isVisible ? 'inline-flex' : 'none');\n\n      if (!isVisible) return;\n\n      // Apply negative margin for overlap (not on first visible item)\n      if (index > 0) {\n        const marginProp = reverse ? 'marginRight' : 'marginLeft';\n        this.renderer.setStyle(hostEl, marginProp, spacing);\n      }\n\n      // Apply z-index for stacking (first on top by default, last on top if reverse)\n      const zIndex = reverse ? index + 1 : total - index;\n      this.renderer.setStyle(hostEl, 'zIndex', zIndex.toString());\n      this.renderer.setStyle(hostEl, 'position', 'relative');\n\n      // Add ring for visual separation\n      this.renderer.setStyle(hostEl, 'boxShadow', `0 0 0 ${ringWidth} var(--color-background)`);\n    });\n\n    // Manage overflow indicator\n    this.updateOverflowIndicator(hiddenCount, size, spacing, reverse, visibleCount);\n  }\n\n  /**\n   * Gets the native element of an avatar by index.\n   */\n  private getAvatarElement(index: number): HTMLElement | null {\n    const children = this.elementRef.nativeElement.querySelectorAll('com-avatar');\n    return children[index] as HTMLElement | null;\n  }\n\n  /**\n   * Creates or updates the overflow indicator element.\n   */\n  private updateOverflowIndicator(\n    count: number,\n    size: AvatarSize,\n    spacing: string,\n    reverse: boolean,\n    _visibleCount: number\n  ): void {\n    if (count <= 0) {\n      // Remove existing overflow element\n      if (this.overflowElement) {\n        this.renderer.removeChild(this.elementRef.nativeElement, this.overflowElement);\n        this.overflowElement = null;\n      }\n      return;\n    }\n\n    // Create overflow element if it doesn't exist\n    let el = this.overflowElement;\n    if (!el) {\n      el = this.renderer.createElement('span') as HTMLElement;\n      this.renderer.addClass(el, 'com-avatar-group__overflow');\n      this.overflowElement = el;\n    }\n\n    // Apply size-specific classes and styles\n    const sizeClasses = this.getOverflowSizeClasses(size);\n    const ringWidth = AVATAR_GROUP_RING[size];\n\n    // Reset classes and reapply\n    el.className = 'com-avatar-group__overflow';\n    sizeClasses.forEach(cls => this.renderer.addClass(el, cls));\n\n    // Apply base styles\n    this.renderer.setStyle(el, 'display', 'inline-flex');\n    this.renderer.setStyle(el, 'alignItems', 'center');\n    this.renderer.setStyle(el, 'justifyContent', 'center');\n    this.renderer.setStyle(el, 'borderRadius', '9999px');\n    this.renderer.setStyle(el, 'backgroundColor', 'var(--color-muted)');\n    this.renderer.setStyle(el, 'color', 'var(--color-muted-foreground)');\n    this.renderer.setStyle(el, 'fontWeight', '500');\n    this.renderer.setStyle(el, 'position', 'relative');\n    this.renderer.setStyle(el, 'zIndex', '0');\n    this.renderer.setStyle(el, 'boxShadow', `0 0 0 ${ringWidth} var(--color-background)`);\n    this.renderer.setStyle(el, 'userSelect', 'none');\n\n    // Apply negative margin\n    const marginProp = reverse ? 'marginRight' : 'marginLeft';\n    this.renderer.setStyle(el, marginProp, spacing);\n\n    // Update text content\n    el.textContent = `+${count}`;\n\n    // Ensure it's in the DOM at the correct position\n    if (!el.parentElement) {\n      if (reverse) {\n        // Insert at the beginning for reverse mode\n        this.renderer.insertBefore(\n          this.elementRef.nativeElement,\n          el,\n          this.elementRef.nativeElement.firstChild\n        );\n      } else {\n        // Append at the end for normal mode\n        this.renderer.appendChild(this.elementRef.nativeElement, el);\n      }\n    }\n  }\n\n  /**\n   * Returns size-specific classes for the overflow indicator.\n   */\n  private getOverflowSizeClasses(size: AvatarSize): string[] {\n    const sizeMap: Record<AvatarSize, string[]> = {\n      xs: ['size-5', 'text-[0.5rem]'],\n      sm: ['size-7', 'text-xs'],\n      md: ['size-9', 'text-sm'],\n      lg: ['size-12', 'text-base'],\n      xl: ['size-16', 'text-xl'],\n      '2xl': ['size-24', 'text-3xl'],\n    };\n    return sizeMap[size];\n  }\n}\n","// Public API for the avatar component\n\n// Main component\nexport { ComAvatar } from './avatar.component';\n\n// Directives\nexport { ComAvatarCustom } from './avatar-custom.directive';\nexport type { AvatarTemplateContext } from './avatar-custom.directive';\n\nexport { ComAvatarGroup } from './avatar-group.directive';\n\n// Variants and utilities (public API only)\nexport { avatarVariants, avatarColorVariants, getInitials } from './avatar.variants';\n\nexport type {\n  AvatarSize,\n  AvatarColor,\n  AvatarShape,\n  AvatarVariant,\n  ResolvedAvatarColor,\n} from './avatar.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}