ngx-com 0.0.21 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +137 -33
  2. package/fesm2022/ngx-com-components-alert.mjs +21 -11
  3. package/fesm2022/ngx-com-components-alert.mjs.map +1 -1
  4. package/fesm2022/ngx-com-components-avatar.mjs +9 -7
  5. package/fesm2022/ngx-com-components-avatar.mjs.map +1 -1
  6. package/fesm2022/ngx-com-components-button.mjs +1 -1
  7. package/fesm2022/ngx-com-components-button.mjs.map +1 -1
  8. package/fesm2022/ngx-com-components-calendar.mjs +27 -3112
  9. package/fesm2022/ngx-com-components-calendar.mjs.map +1 -1
  10. package/fesm2022/ngx-com-components-card.mjs +8 -8
  11. package/fesm2022/ngx-com-components-card.mjs.map +1 -1
  12. package/fesm2022/ngx-com-components-carousel.mjs +16 -4
  13. package/fesm2022/ngx-com-components-carousel.mjs.map +1 -1
  14. package/fesm2022/ngx-com-components-checkbox.mjs +1 -1
  15. package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
  16. package/fesm2022/ngx-com-components-code-block.mjs +9 -9
  17. package/fesm2022/ngx-com-components-code-block.mjs.map +1 -1
  18. package/fesm2022/ngx-com-components-collapsible.mjs +15 -13
  19. package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -1
  20. package/fesm2022/ngx-com-components-confirm.mjs +4 -4
  21. package/fesm2022/ngx-com-components-confirm.mjs.map +1 -1
  22. package/fesm2022/ngx-com-components-datepicker.mjs +2334 -0
  23. package/fesm2022/ngx-com-components-datepicker.mjs.map +1 -0
  24. package/fesm2022/ngx-com-components-dialog.mjs +47 -45
  25. package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
  26. package/fesm2022/ngx-com-components-dropdown.mjs +446 -340
  27. package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
  28. package/fesm2022/ngx-com-components-empty-state.mjs +5 -3
  29. package/fesm2022/ngx-com-components-empty-state.mjs.map +1 -1
  30. package/fesm2022/ngx-com-components-form-field.mjs +11 -6
  31. package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
  32. package/fesm2022/ngx-com-components-icon-lucide.mjs +41 -0
  33. package/fesm2022/ngx-com-components-icon-lucide.mjs.map +1 -0
  34. package/fesm2022/ngx-com-components-icon.mjs +89 -61
  35. package/fesm2022/ngx-com-components-icon.mjs.map +1 -1
  36. package/fesm2022/ngx-com-components-item.mjs +14 -4
  37. package/fesm2022/ngx-com-components-item.mjs.map +1 -1
  38. package/fesm2022/ngx-com-components-menu.mjs +61 -69
  39. package/fesm2022/ngx-com-components-menu.mjs.map +1 -1
  40. package/fesm2022/ngx-com-components-native-control.mjs +170 -0
  41. package/fesm2022/ngx-com-components-native-control.mjs.map +1 -0
  42. package/fesm2022/ngx-com-components-paginator.mjs +11 -3
  43. package/fesm2022/ngx-com-components-paginator.mjs.map +1 -1
  44. package/fesm2022/ngx-com-components-popover.mjs +58 -33
  45. package/fesm2022/ngx-com-components-popover.mjs.map +1 -1
  46. package/fesm2022/ngx-com-components-radio.mjs +4 -4
  47. package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
  48. package/fesm2022/ngx-com-components-segmented-control.mjs +6 -4
  49. package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -1
  50. package/fesm2022/ngx-com-components-sort.mjs +63 -57
  51. package/fesm2022/ngx-com-components-sort.mjs.map +1 -1
  52. package/fesm2022/ngx-com-components-spinner.mjs +6 -6
  53. package/fesm2022/ngx-com-components-spinner.mjs.map +1 -1
  54. package/fesm2022/ngx-com-components-switch.mjs +18 -9
  55. package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
  56. package/fesm2022/ngx-com-components-table.mjs +23 -9
  57. package/fesm2022/ngx-com-components-table.mjs.map +1 -1
  58. package/fesm2022/ngx-com-components-tabs.mjs +81 -58
  59. package/fesm2022/ngx-com-components-tabs.mjs.map +1 -1
  60. package/fesm2022/ngx-com-components-timepicker.mjs +1048 -0
  61. package/fesm2022/ngx-com-components-timepicker.mjs.map +1 -0
  62. package/fesm2022/ngx-com-components-toast.mjs +18 -14
  63. package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
  64. package/fesm2022/ngx-com-components-tooltip.mjs +5 -5
  65. package/fesm2022/ngx-com-components-tooltip.mjs.map +1 -1
  66. package/fesm2022/ngx-com-components.mjs +0 -13
  67. package/fesm2022/ngx-com-components.mjs.map +1 -1
  68. package/fesm2022/ngx-com-tokens.mjs +0 -8
  69. package/fesm2022/ngx-com-tokens.mjs.map +1 -1
  70. package/fesm2022/ngx-com-utils.mjs +13 -1
  71. package/fesm2022/ngx-com-utils.mjs.map +1 -1
  72. package/fesm2022/ngx-com.mjs +1 -1
  73. package/fesm2022/ngx-com.mjs.map +1 -1
  74. package/package.json +51 -8
  75. package/styles/animations.css +38 -0
  76. package/styles/candy.css +121 -0
  77. package/styles/dark.css +159 -0
  78. package/styles/forest.css +117 -0
  79. package/styles/ocean.css +117 -0
  80. package/styles/themes.css +7 -0
  81. package/styles/tokens.css +277 -0
  82. package/styles/utilities.css +16 -0
  83. package/types/ngx-com-components-alert.d.ts +14 -4
  84. package/types/ngx-com-components-avatar.d.ts +2 -0
  85. package/types/ngx-com-components-calendar.d.ts +3 -747
  86. package/types/ngx-com-components-card.d.ts +2 -2
  87. package/types/ngx-com-components-carousel.d.ts +11 -1
  88. package/types/ngx-com-components-code-block.d.ts +4 -4
  89. package/types/ngx-com-components-collapsible.d.ts +10 -2
  90. package/types/ngx-com-components-confirm.d.ts +2 -2
  91. package/types/ngx-com-components-datepicker.d.ts +623 -0
  92. package/types/ngx-com-components-dialog.d.ts +5 -2
  93. package/types/ngx-com-components-dropdown.d.ts +22 -4
  94. package/types/ngx-com-components-empty-state.d.ts +2 -0
  95. package/types/ngx-com-components-form-field.d.ts +4 -1
  96. package/types/ngx-com-components-icon-lucide.d.ts +32 -0
  97. package/types/ngx-com-components-icon.d.ts +49 -35
  98. package/types/ngx-com-components-item.d.ts +12 -2
  99. package/types/ngx-com-components-menu.d.ts +38 -38
  100. package/types/ngx-com-components-native-control.d.ts +99 -0
  101. package/types/ngx-com-components-paginator.d.ts +2 -0
  102. package/types/ngx-com-components-popover.d.ts +19 -12
  103. package/types/ngx-com-components-segmented-control.d.ts +3 -1
  104. package/types/ngx-com-components-sort.d.ts +13 -10
  105. package/types/ngx-com-components-switch.d.ts +7 -2
  106. package/types/ngx-com-components-table.d.ts +16 -2
  107. package/types/ngx-com-components-tabs.d.ts +46 -34
  108. package/types/ngx-com-components-timepicker.d.ts +273 -0
  109. package/types/ngx-com-components-toast.d.ts +4 -2
  110. package/types/ngx-com-components-tooltip.d.ts +1 -1
  111. package/types/ngx-com-components.d.ts +6 -7
  112. package/types/ngx-com-tokens.d.ts +5 -3
  113. package/types/ngx-com-utils.d.ts +11 -1
  114. package/types/ngx-com.d.ts +1 -1
@@ -1 +1 @@
1
- {"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 * @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-full',\n rounded: 'rounded-lg',\n },\n interactive: {\n true: [\n 'cursor-pointer',\n 'hover:ring-2 hover:ring-ring',\n 'active:scale-95',\n 'transition-all duration-150',\n ],\n false: 'cursor-default',\n },\n },\n compoundVariants: [\n // Smaller rounded corners for xs/sm sizes\n { shape: 'rounded', size: 'xs', class: 'rounded-md' },\n { shape: 'rounded', size: 'sm', class: 'rounded-md' },\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-200\"\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);\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);\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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"}
1
+ {"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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"}
@@ -6,7 +6,7 @@ import { cva } from 'class-variance-authority';
6
6
  const buttonVariants = cva([
7
7
  'inline-flex items-center justify-center',
8
8
  'font-medium whitespace-nowrap select-none',
9
- 'transition-colors duration-150',
9
+ 'transition-colors duration-normal',
10
10
  'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',
11
11
  'disabled:pointer-events-none disabled:bg-disabled disabled:text-disabled-foreground',
12
12
  'aria-disabled:pointer-events-none aria-disabled:bg-disabled aria-disabled:text-disabled-foreground',
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-button.mjs","sources":["../../../projects/com/components/button/button.variants.ts","../../../projects/com/components/button/button.directive.ts","../../../projects/com/components/button/ngx-com-components-button.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\nexport type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'link';\nexport type ButtonColor = 'primary' | 'accent' | 'warn' | 'muted';\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'icon';\n\nexport const buttonVariants: (props?: {\n variant?: ButtonVariant;\n color?: ButtonColor;\n size?: ButtonSize;\n fullWidth?: boolean;\n}) => string = cva(\n [\n 'inline-flex items-center justify-center',\n 'font-medium whitespace-nowrap select-none',\n 'transition-colors duration-150',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:pointer-events-none disabled:bg-disabled disabled:text-disabled-foreground',\n 'aria-disabled:pointer-events-none aria-disabled:bg-disabled aria-disabled:text-disabled-foreground',\n ],\n {\n variants: {\n variant: {\n solid: '',\n outline: 'border bg-transparent',\n ghost: 'bg-transparent',\n link: 'bg-transparent underline-offset-4 hover:underline',\n },\n color: {\n primary: '',\n accent: '',\n warn: '',\n muted: '',\n },\n size: {\n sm: 'h-8 px-3 text-sm rounded-control-sm gap-1.5',\n md: 'h-10 px-4 text-sm rounded-control gap-2',\n lg: 'h-12 px-6 text-base rounded-control gap-2.5',\n icon: 'h-10 w-10 rounded-control',\n },\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n },\n compoundVariants: [\n // Solid variants\n { variant: 'solid', color: 'primary', class: 'bg-primary text-primary-foreground hover:bg-primary-hover' },\n { variant: 'solid', color: 'accent', class: 'bg-accent text-accent-foreground hover:bg-accent-hover' },\n { variant: 'solid', color: 'warn', class: 'bg-warn text-warn-foreground hover:bg-warn-hover' },\n { variant: 'solid', color: 'muted', class: 'bg-muted text-muted-foreground hover:bg-muted-hover' },\n\n // Outline variants\n { variant: 'outline', color: 'primary', class: 'border-primary text-primary hover:bg-primary-subtle' },\n { variant: 'outline', color: 'accent', class: 'border-accent text-accent hover:bg-accent-subtle' },\n { variant: 'outline', color: 'warn', class: 'border-warn text-warn hover:bg-warn-subtle' },\n { variant: 'outline', color: 'muted', class: 'border-border text-muted-foreground hover:bg-muted' },\n\n // Ghost variants\n { variant: 'ghost', color: 'primary', class: 'text-primary hover:bg-primary-subtle' },\n { variant: 'ghost', color: 'accent', class: 'text-accent hover:bg-accent-subtle' },\n { variant: 'ghost', color: 'warn', class: 'text-warn hover:bg-warn-subtle' },\n { variant: 'ghost', color: 'muted', class: 'text-muted-foreground hover:bg-muted' },\n\n // Link variants\n { variant: 'link', color: 'primary', class: 'text-primary' },\n { variant: 'link', color: 'accent', class: 'text-accent' },\n { variant: 'link', color: 'warn', class: 'text-warn' },\n { variant: 'link', color: 'muted', class: 'text-muted-foreground' },\n\n // Link size override — remove height/padding constraints\n { variant: 'link', size: 'sm', class: 'h-auto px-0' },\n { variant: 'link', size: 'md', class: 'h-auto px-0' },\n { variant: 'link', size: 'lg', class: 'h-auto px-0' },\n { variant: 'link', size: 'icon', class: 'h-auto w-auto px-0' },\n ],\n defaultVariants: {\n variant: 'solid',\n color: 'primary',\n size: 'md',\n fullWidth: false,\n },\n }\n);\n\nexport type ButtonVariants = VariantProps<typeof buttonVariants>;\n","import { booleanAttribute, computed, Directive, input } from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { mergeClasses } from './button.utils';\nimport { buttonVariants, type ButtonVariant, type ButtonColor, type ButtonSize } from './button.variants';\n\n/**\n * Button directive — applies styled button classes to native `<button>` and `<a>` elements.\n *\n * Using a directive on native elements preserves:\n * - Full control over native attributes (`type=\"submit\"`, `routerLink`, `download`, etc.)\n * - Native accessibility (keyboard handling, focus, ARIA)\n * - No wrapper elements in the DOM\n *\n * @tokens `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`, `--color-primary-subtle`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`, `--color-accent-subtle`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`, `--color-warn-subtle`,\n * `--color-muted`, `--color-muted-foreground`, `--color-muted-hover`,\n * `--color-disabled`, `--color-disabled-foreground`,\n * `--color-border`, `--color-ring`\n *\n * @example Basic usage\n * ```html\n * <button comButton>Save</button>\n * <button comButton variant=\"outline\" color=\"accent\">Cancel</button>\n * ```\n *\n * @example Link button\n * ```html\n * <a comButton variant=\"link\" href=\"/docs\">Documentation</a>\n * <a comButton variant=\"outline\" routerLink=\"/dashboard\">Dashboard</a>\n * ```\n *\n * @example Icon button\n * ```html\n * <button comButton variant=\"ghost\" size=\"icon\" aria-label=\"Settings\">\n * <svg>...</svg>\n * </button>\n * ```\n *\n * @example Full width\n * ```html\n * <button comButton fullWidth>Submit Application</button>\n * ```\n */\n@Directive({\n selector: 'button[comButton], a[comButton]',\n exportAs: 'comButton',\n host: {\n '[class]': 'computedClass()',\n '[attr.aria-disabled]': 'ariaDisabled()',\n },\n})\nexport class ComButton {\n readonly variant: InputSignal<ButtonVariant> = input<ButtonVariant>('solid');\n readonly color: InputSignal<ButtonColor> = input<ButtonColor>('primary');\n readonly size: InputSignal<ButtonSize> = input<ButtonSize>('md');\n readonly fullWidth: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n readonly userClass: InputSignal<string> = input('', { alias: 'class' });\n\n protected readonly ariaDisabled: Signal<'true' | null> = computed(() =>\n this.disabled() ? 'true' : null\n );\n\n protected readonly computedClass: Signal<string> = computed(() =>\n mergeClasses(\n buttonVariants({\n variant: this.variant(),\n color: this.color(),\n size: this.size(),\n fullWidth: this.fullWidth(),\n }),\n this.disabled() && 'pointer-events-none',\n this.userClass()\n )\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-com-components-button.mjs","sources":["../../../projects/com/components/button/button.variants.ts","../../../projects/com/components/button/button.directive.ts","../../../projects/com/components/button/ngx-com-components-button.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\nexport type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'link';\nexport type ButtonColor = 'primary' | 'accent' | 'warn' | 'muted';\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'icon';\n\nexport const buttonVariants: (props?: {\n variant?: ButtonVariant;\n color?: ButtonColor;\n size?: ButtonSize;\n fullWidth?: boolean;\n}) => string = cva(\n [\n 'inline-flex items-center justify-center',\n 'font-medium whitespace-nowrap select-none',\n 'transition-colors duration-normal',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:pointer-events-none disabled:bg-disabled disabled:text-disabled-foreground',\n 'aria-disabled:pointer-events-none aria-disabled:bg-disabled aria-disabled:text-disabled-foreground',\n ],\n {\n variants: {\n variant: {\n solid: '',\n outline: 'border bg-transparent',\n ghost: 'bg-transparent',\n link: 'bg-transparent underline-offset-4 hover:underline',\n },\n color: {\n primary: '',\n accent: '',\n warn: '',\n muted: '',\n },\n size: {\n sm: 'h-8 px-3 text-sm rounded-control-sm gap-1.5',\n md: 'h-10 px-4 text-sm rounded-control gap-2',\n lg: 'h-12 px-6 text-base rounded-control gap-2.5',\n icon: 'h-10 w-10 rounded-control',\n },\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n },\n compoundVariants: [\n // Solid variants\n { variant: 'solid', color: 'primary', class: 'bg-primary text-primary-foreground hover:bg-primary-hover' },\n { variant: 'solid', color: 'accent', class: 'bg-accent text-accent-foreground hover:bg-accent-hover' },\n { variant: 'solid', color: 'warn', class: 'bg-warn text-warn-foreground hover:bg-warn-hover' },\n { variant: 'solid', color: 'muted', class: 'bg-muted text-muted-foreground hover:bg-muted-hover' },\n\n // Outline variants\n { variant: 'outline', color: 'primary', class: 'border-primary text-primary hover:bg-primary-subtle' },\n { variant: 'outline', color: 'accent', class: 'border-accent text-accent hover:bg-accent-subtle' },\n { variant: 'outline', color: 'warn', class: 'border-warn text-warn hover:bg-warn-subtle' },\n { variant: 'outline', color: 'muted', class: 'border-border text-muted-foreground hover:bg-muted' },\n\n // Ghost variants\n { variant: 'ghost', color: 'primary', class: 'text-primary hover:bg-primary-subtle' },\n { variant: 'ghost', color: 'accent', class: 'text-accent hover:bg-accent-subtle' },\n { variant: 'ghost', color: 'warn', class: 'text-warn hover:bg-warn-subtle' },\n { variant: 'ghost', color: 'muted', class: 'text-muted-foreground hover:bg-muted' },\n\n // Link variants\n { variant: 'link', color: 'primary', class: 'text-primary' },\n { variant: 'link', color: 'accent', class: 'text-accent' },\n { variant: 'link', color: 'warn', class: 'text-warn' },\n { variant: 'link', color: 'muted', class: 'text-muted-foreground' },\n\n // Link size override — remove height/padding constraints\n { variant: 'link', size: 'sm', class: 'h-auto px-0' },\n { variant: 'link', size: 'md', class: 'h-auto px-0' },\n { variant: 'link', size: 'lg', class: 'h-auto px-0' },\n { variant: 'link', size: 'icon', class: 'h-auto w-auto px-0' },\n ],\n defaultVariants: {\n variant: 'solid',\n color: 'primary',\n size: 'md',\n fullWidth: false,\n },\n }\n);\n\nexport type ButtonVariants = VariantProps<typeof buttonVariants>;\n","import { booleanAttribute, computed, Directive, input } from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { mergeClasses } from './button.utils';\nimport { buttonVariants, type ButtonVariant, type ButtonColor, type ButtonSize } from './button.variants';\n\n/**\n * Button directive — applies styled button classes to native `<button>` and `<a>` elements.\n *\n * Using a directive on native elements preserves:\n * - Full control over native attributes (`type=\"submit\"`, `routerLink`, `download`, etc.)\n * - Native accessibility (keyboard handling, focus, ARIA)\n * - No wrapper elements in the DOM\n *\n * @tokens `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`, `--color-primary-subtle`,\n * `--color-accent`, `--color-accent-foreground`, `--color-accent-hover`, `--color-accent-subtle`,\n * `--color-warn`, `--color-warn-foreground`, `--color-warn-hover`, `--color-warn-subtle`,\n * `--color-muted`, `--color-muted-foreground`, `--color-muted-hover`,\n * `--color-disabled`, `--color-disabled-foreground`,\n * `--color-border`, `--color-ring`\n *\n * @example Basic usage\n * ```html\n * <button comButton>Save</button>\n * <button comButton variant=\"outline\" color=\"accent\">Cancel</button>\n * ```\n *\n * @example Link button\n * ```html\n * <a comButton variant=\"link\" href=\"/docs\">Documentation</a>\n * <a comButton variant=\"outline\" routerLink=\"/dashboard\">Dashboard</a>\n * ```\n *\n * @example Icon button\n * ```html\n * <button comButton variant=\"ghost\" size=\"icon\" aria-label=\"Settings\">\n * <svg>...</svg>\n * </button>\n * ```\n *\n * @example Full width\n * ```html\n * <button comButton fullWidth>Submit Application</button>\n * ```\n */\n@Directive({\n selector: 'button[comButton], a[comButton]',\n exportAs: 'comButton',\n host: {\n '[class]': 'computedClass()',\n '[attr.aria-disabled]': 'ariaDisabled()',\n },\n})\nexport class ComButton {\n readonly variant: InputSignal<ButtonVariant> = input<ButtonVariant>('solid');\n readonly color: InputSignal<ButtonColor> = input<ButtonColor>('primary');\n readonly size: InputSignal<ButtonSize> = input<ButtonSize>('md');\n readonly fullWidth: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n readonly userClass: InputSignal<string> = input('', { alias: 'class' });\n\n protected readonly ariaDisabled: Signal<'true' | null> = computed(() =>\n this.disabled() ? 'true' : null\n );\n\n protected readonly computedClass: Signal<string> = computed(() =>\n mergeClasses(\n buttonVariants({\n variant: this.variant(),\n color: this.color(),\n size: this.size(),\n fullWidth: this.fullWidth(),\n }),\n this.disabled() && 'pointer-events-none',\n this.userClass()\n )\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}