@acorex/components 20.7.60 → 20.7.62

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.
@@ -2,7 +2,7 @@ import { AXClosableComponent, AXComponentCloseEvent, AXCommonModule, AXDataSourc
2
2
  import * as i2$1 from '@acorex/components/tabs';
3
3
  import { AXTabsModule, AXTabsComponent, AXTabItemComponent } from '@acorex/components/tabs';
4
4
  import * as i1$4 from '@angular/common';
5
- import { isPlatformBrowser, AsyncPipe, CommonModule, DOCUMENT, NgComponentOutlet } from '@angular/common';
5
+ import { isPlatformBrowser, AsyncPipe, CommonModule, NgComponentOutlet, DOCUMENT } from '@angular/common';
6
6
  import * as i0 from '@angular/core';
7
7
  import { InjectionToken, signal, computed, inject, Injectable, input, output, ChangeDetectionStrategy, Component, model, ElementRef, afterNextRender, PLATFORM_ID, DestroyRef, Injector, runInInjectionContext, effect, viewChild, viewChildren, untracked, SecurityContext, ViewContainerRef, EventEmitter, HostListener, Directive, NgModule } from '@angular/core';
8
8
  import { AXDialogService } from '@acorex/components/dialog';
@@ -32,10 +32,10 @@ import { AXSearchBoxModule, AXSearchBoxComponent } from '@acorex/components/sear
32
32
  import * as i1$6 from '@acorex/components/skeleton';
33
33
  import { AXSkeletonModule } from '@acorex/components/skeleton';
34
34
  import { HttpClient } from '@angular/common/http';
35
- import { AXAvatarComponent } from '@acorex/components/avatar';
36
- import { AXImageComponent } from '@acorex/components/image';
37
35
  import * as i4 from '@acorex/components/switch';
38
36
  import { AXSwitchModule } from '@acorex/components/switch';
37
+ import { AXImageComponent } from '@acorex/components/image';
38
+ import { AXAvatarComponent } from '@acorex/components/avatar';
39
39
  import { AXLoadingComponent } from '@acorex/components/loading';
40
40
  import { DomSanitizer } from '@angular/platform-browser';
41
41
  import { AXListComponent } from '@acorex/components/list';
@@ -341,6 +341,13 @@ const ERROR_HANDLER_CONFIG = new InjectionToken('ERROR_HANDLER_CONFIG', {
341
341
  factory: () => ({}),
342
342
  });
343
343
 
344
+ /**
345
+ * Pluggable avatar components for the conversation UI.
346
+ * Register via `provideConversation({ avatarComponents: { user, conversation } })`.
347
+ */
348
+ const AX_CONVERSATION_USER_AVATAR_COMPONENT = new InjectionToken('AX_CONVERSATION_USER_AVATAR_COMPONENT');
349
+ const AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT = new InjectionToken('AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT');
350
+
344
351
  /**
345
352
  * Registry Configuration Tokens
346
353
  * Injection tokens for configuring default registry values
@@ -10403,6 +10410,199 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
10403
10410
  `, styles: [":host{display:block}.avatar-picker{display:flex;flex-flow:row wrap;align-items:center;gap:1.5rem;padding:1rem;border-radius:.75rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface))}.avatar-preview{position:relative;width:100px;height:100px;border-radius:50%;overflow:hidden;background:rgb(var(--ax-sys-color-lighter-surface));border:3px solid rgb(var(--ax-sys-color-border-light-surface));display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .25s ease;flex-shrink:0;box-shadow:0 2px 8px #00000014}.avatar-preview:hover{border-color:rgb(var(--ax-sys-color-primary-500));// transform: scale(1.05);box-shadow:0 4px 12px #0000001f}.avatar-preview:hover .preview-overlay{opacity:1}.avatar-preview ax-image{width:100%;height:100%}.preview-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:#000000a6;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s ease;color:#fff;font-size:1.75rem}.avatar-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.375rem;font-size:2rem;color:rgb(var(--ax-sys-color-on-surface-variant));text-align:center;padding:.5rem}.placeholder-text{font-size:.625rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;opacity:.8}.avatar-actions{display:flex;flex-direction:column;gap:.5rem;flex:1}.avatar-actions ax-button{width:100%}\n"] }]
10404
10411
  }] });
10405
10412
 
10413
+ /** Other participant in a private chat (excludes the current user). */
10414
+ function resolvePrivatePeerUserId(conversation, currentUserId) {
10415
+ if (conversation.type !== 'private') {
10416
+ return undefined;
10417
+ }
10418
+ const currentId = currentUserId ?? 'current-user';
10419
+ return conversation.participants.find((participant) => participant.id !== currentId)?.id;
10420
+ }
10421
+ /** Whether `auto` kind should render a user avatar for this conversation. */
10422
+ function shouldUseUserAvatarForConversation(conversation, currentUserId) {
10423
+ return conversation.type === 'private' && !!resolvePrivatePeerUserId(conversation, currentUserId);
10424
+ }
10425
+ function resolveUserAvatarDisplay(userId, conversation, message) {
10426
+ if (message && conversation) {
10427
+ return {
10428
+ name: AXConversationMessageUtilsService.getSenderName(message, conversation),
10429
+ avatar: AXConversationMessageUtilsService.getSenderAvatar(message, conversation),
10430
+ icon: AXConversationMessageUtilsService.getSenderAvatarIcon(message, conversation),
10431
+ };
10432
+ }
10433
+ const participant = conversation?.participants.find((p) => p.id === userId);
10434
+ return {
10435
+ name: participant?.name ?? userId,
10436
+ avatar: participant?.avatar,
10437
+ icon: participant?.icon,
10438
+ };
10439
+ }
10440
+ function resolveConversationAvatarDisplay(conversation) {
10441
+ return {
10442
+ name: conversation.title,
10443
+ avatar: AXConversationMessageUtilsService.getConversationAvatar(conversation),
10444
+ icon: AXConversationMessageUtilsService.getConversationAvatarIcon(conversation),
10445
+ };
10446
+ }
10447
+
10448
+ /**
10449
+ * Conversation avatar host — renders a registered custom component or built-in fallback.
10450
+ */
10451
+ class AXConversationAvatarComponent {
10452
+ constructor() {
10453
+ this.conversationService = inject(AXConversationService);
10454
+ this.userAvatarComponent = inject(AX_CONVERSATION_USER_AVATAR_COMPONENT, { optional: true });
10455
+ this.conversationAvatarComponent = inject(AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, {
10456
+ optional: true,
10457
+ });
10458
+ this.kind = input('auto', ...(ngDevMode ? [{ debugName: "kind" }] : []));
10459
+ this.userId = input(...(ngDevMode ? [undefined, { debugName: "userId" }] : []));
10460
+ this.conversation = input(...(ngDevMode ? [undefined, { debugName: "conversation" }] : []));
10461
+ this.message = input(...(ngDevMode ? [undefined, { debugName: "message" }] : []));
10462
+ this.size = input(40, ...(ngDevMode ? [{ debugName: "size" }] : []));
10463
+ this.showStatus = input(false, ...(ngDevMode ? [{ debugName: "showStatus" }] : []));
10464
+ this.name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
10465
+ this.avatar = input(...(ngDevMode ? [undefined, { debugName: "avatar" }] : []));
10466
+ this.icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : []));
10467
+ this.currentUserId = computed(() => this.conversationService.currentUser()?.id, ...(ngDevMode ? [{ debugName: "currentUserId" }] : []));
10468
+ this.resolvedKind = computed(() => {
10469
+ const explicitKind = this.kind();
10470
+ if (explicitKind === 'user') {
10471
+ return 'user';
10472
+ }
10473
+ if (explicitKind === 'conversation') {
10474
+ return 'conversation';
10475
+ }
10476
+ const conversation = this.conversation();
10477
+ if (conversation && shouldUseUserAvatarForConversation(conversation, this.currentUserId())) {
10478
+ return 'user';
10479
+ }
10480
+ return 'conversation';
10481
+ }, ...(ngDevMode ? [{ debugName: "resolvedKind" }] : []));
10482
+ this.resolvedUserId = computed(() => {
10483
+ const explicitUserId = this.userId();
10484
+ if (explicitUserId) {
10485
+ return explicitUserId;
10486
+ }
10487
+ const conversation = this.conversation();
10488
+ if (!conversation || this.resolvedKind() !== 'user') {
10489
+ return undefined;
10490
+ }
10491
+ return resolvePrivatePeerUserId(conversation, this.currentUserId());
10492
+ }, ...(ngDevMode ? [{ debugName: "resolvedUserId" }] : []));
10493
+ this.customComponent = computed(() => {
10494
+ if (this.resolvedKind() === 'user') {
10495
+ return this.resolvedUserId() && this.userAvatarComponent ? this.userAvatarComponent : null;
10496
+ }
10497
+ const conversation = this.conversation();
10498
+ return conversation && this.conversationAvatarComponent ? this.conversationAvatarComponent : null;
10499
+ }, ...(ngDevMode ? [{ debugName: "customComponent" }] : []));
10500
+ this.customInputs = computed(() => {
10501
+ if (this.resolvedKind() === 'user') {
10502
+ return {
10503
+ userId: this.resolvedUserId() ?? '',
10504
+ size: this.size(),
10505
+ };
10506
+ }
10507
+ return {
10508
+ conversationId: this.conversation()?.id ?? '',
10509
+ size: this.size(),
10510
+ };
10511
+ }, ...(ngDevMode ? [{ debugName: "customInputs" }] : []));
10512
+ this.fallbackDisplay = computed(() => {
10513
+ const explicitName = this.name();
10514
+ const explicitAvatar = this.avatar();
10515
+ const explicitIcon = this.icon();
10516
+ if (this.resolvedKind() === 'user') {
10517
+ const userId = this.resolvedUserId();
10518
+ if (!userId) {
10519
+ return { name: explicitName ?? '?', avatar: explicitAvatar, icon: explicitIcon };
10520
+ }
10521
+ const resolved = resolveUserAvatarDisplay(userId, this.conversation(), this.message());
10522
+ return {
10523
+ name: explicitName ?? resolved.name,
10524
+ avatar: explicitAvatar ?? resolved.avatar,
10525
+ icon: explicitIcon ?? resolved.icon,
10526
+ };
10527
+ }
10528
+ const conversation = this.conversation();
10529
+ if (!conversation) {
10530
+ return { name: explicitName ?? '?', avatar: explicitAvatar, icon: explicitIcon };
10531
+ }
10532
+ const resolved = resolveConversationAvatarDisplay(conversation);
10533
+ return {
10534
+ name: explicitName ?? resolved.name,
10535
+ avatar: explicitAvatar ?? resolved.avatar,
10536
+ icon: explicitIcon ?? resolved.icon,
10537
+ };
10538
+ }, ...(ngDevMode ? [{ debugName: "fallbackDisplay" }] : []));
10539
+ this.fallbackInitials = computed(() => AXConversationMessageUtilsService.getInitials(this.fallbackDisplay().name), ...(ngDevMode ? [{ debugName: "fallbackInitials" }] : []));
10540
+ this.resolvedStatus = computed(() => {
10541
+ const conversation = this.conversation();
10542
+ if (!conversation || !this.showStatus()) {
10543
+ return undefined;
10544
+ }
10545
+ return AXConversationMessageUtilsService.getConversationStatus(conversation);
10546
+ }, ...(ngDevMode ? [{ debugName: "resolvedStatus" }] : []));
10547
+ }
10548
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10549
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXConversationAvatarComponent, isStandalone: true, selector: "ax-conversation-avatar", inputs: { kind: { classPropertyName: "kind", publicName: "kind", isSignal: true, isRequired: false, transformFunction: null }, userId: { classPropertyName: "userId", publicName: "userId", isSignal: true, isRequired: false, transformFunction: null }, conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showStatus: { classPropertyName: "showStatus", publicName: "showStatus", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, avatar: { classPropertyName: "avatar", publicName: "avatar", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
10550
+ <div class="ax-conversation-avatar">
10551
+ @if (customComponent(); as component) {
10552
+ <ng-container *ngComponentOutlet="component; inputs: customInputs()" />
10553
+ } @else {
10554
+ <ax-avatar [size]="size()">
10555
+ @if (fallbackDisplay().avatar; as avatarSrc) {
10556
+ <ax-image [src]="avatarSrc" [alt]="fallbackDisplay().name"></ax-image>
10557
+ } @else if (fallbackDisplay().icon; as iconClass) {
10558
+ <ax-icon><i [class]="'ax-conversation-avatar-icon ' + iconClass" aria-hidden="true"></i></ax-icon>
10559
+ } @else {
10560
+ <ax-label>{{ fallbackInitials() }}</ax-label>
10561
+ }
10562
+ </ax-avatar>
10563
+ }
10564
+
10565
+ @if (showStatus() && resolvedStatus(); as presence) {
10566
+ <span
10567
+ class="ax-conversation-avatar-status"
10568
+ [class.status-online]="presence === 'online'"
10569
+ [class.status-offline]="presence === 'offline'"
10570
+ [class.status-away]="presence === 'away'"
10571
+ ></span>
10572
+ }
10573
+ </div>
10574
+ `, isInline: true, styles: [":host{display:inline-flex}.ax-conversation-avatar{position:relative;display:inline-flex}.ax-conversation-avatar-icon{font-size:1rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ax-conversation-avatar-status{position:absolute;bottom:2px;inset-inline-end:2px;width:12px;height:12px;border-radius:50%}.ax-conversation-avatar-status.status-online{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-success-500))}.ax-conversation-avatar-status.status-away{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-warning-500))}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10575
+ }
10576
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationAvatarComponent, decorators: [{
10577
+ type: Component,
10578
+ args: [{ selector: 'ax-conversation-avatar', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgComponentOutlet, AXAvatarComponent, AXDecoratorModule, AXImageComponent, AXLabelComponent], template: `
10579
+ <div class="ax-conversation-avatar">
10580
+ @if (customComponent(); as component) {
10581
+ <ng-container *ngComponentOutlet="component; inputs: customInputs()" />
10582
+ } @else {
10583
+ <ax-avatar [size]="size()">
10584
+ @if (fallbackDisplay().avatar; as avatarSrc) {
10585
+ <ax-image [src]="avatarSrc" [alt]="fallbackDisplay().name"></ax-image>
10586
+ } @else if (fallbackDisplay().icon; as iconClass) {
10587
+ <ax-icon><i [class]="'ax-conversation-avatar-icon ' + iconClass" aria-hidden="true"></i></ax-icon>
10588
+ } @else {
10589
+ <ax-label>{{ fallbackInitials() }}</ax-label>
10590
+ }
10591
+ </ax-avatar>
10592
+ }
10593
+
10594
+ @if (showStatus() && resolvedStatus(); as presence) {
10595
+ <span
10596
+ class="ax-conversation-avatar-status"
10597
+ [class.status-online]="presence === 'online'"
10598
+ [class.status-offline]="presence === 'offline'"
10599
+ [class.status-away]="presence === 'away'"
10600
+ ></span>
10601
+ }
10602
+ </div>
10603
+ `, styles: [":host{display:inline-flex}.ax-conversation-avatar{position:relative;display:inline-flex}.ax-conversation-avatar-icon{font-size:1rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ax-conversation-avatar-status{position:absolute;bottom:2px;inset-inline-end:2px;width:12px;height:12px;border-radius:50%}.ax-conversation-avatar-status.status-online{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-success-500))}.ax-conversation-avatar-status.status-away{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-warning-500))}\n"] }]
10604
+ }] });
10605
+
10406
10606
  class AXConversationDateUtilsService {
10407
10607
  /**
10408
10608
  * Format relative time (e.g., "2m ago", "1h ago")
@@ -10566,10 +10766,6 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
10566
10766
  this.editAvatar = this.conversation.avatar || '';
10567
10767
  }
10568
10768
  }
10569
- /** Get initials from name */
10570
- getInitials(name) {
10571
- return AXConversationMessageUtilsService.getInitials(name);
10572
- }
10573
10769
  /** Get conversation subtitle */
10574
10770
  getSubtitle() {
10575
10771
  return AXConversationMessageUtilsService.getConversationSubtitle(this.conversation);
@@ -10749,13 +10945,7 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
10749
10945
  <div class="conversation-info-panel">
10750
10946
  <!-- Header with Avatar and Title -->
10751
10947
  <div class="panel-header">
10752
- <ax-avatar [size]="80">
10753
- @if (conversation.avatar) {
10754
- <ax-image [src]="conversation.avatar" [alt]="conversation.title"></ax-image>
10755
- } @else {
10756
- <ax-label>{{ getInitials(conversation.title) }}</ax-label>
10757
- }
10758
- </ax-avatar>
10948
+ <ax-conversation-avatar kind="auto" [conversation]="conversation" [size]="80" />
10759
10949
  <div class="conversation-title-container">
10760
10950
  <h2 class="conversation-title">{{ conversation.title }}</h2>
10761
10951
  <h3>{{ conversation.description }}</h3>
@@ -10866,13 +11056,12 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
10866
11056
  <div class="members-list">
10867
11057
  @for (participant of filteredMembers; track participant.id) {
10868
11058
  <div class="member-card">
10869
- <ax-avatar [size]="40">
10870
- @if (participant.avatar) {
10871
- <ax-image [src]="participant.avatar" [alt]="participant.name"></ax-image>
10872
- } @else {
10873
- <ax-label>{{ getInitials(participant.name) }}</ax-label>
10874
- }
10875
- </ax-avatar>
11059
+ <ax-conversation-avatar
11060
+ kind="user"
11061
+ [userId]="participant.id"
11062
+ [conversation]="conversation"
11063
+ [size]="40"
11064
+ />
10876
11065
  <div class="member-details">
10877
11066
  <span class="member-name">{{ participant.name }}</span>
10878
11067
  @if (participant.description) {
@@ -11020,7 +11209,7 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
11020
11209
  </div>
11021
11210
  </div>
11022
11211
  }
11023
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.conversation-info-panel{display:flex;flex-direction:column;background:rgb(var(--ax-sys-color-surface));overflow:hidden}.panel-header{display:flex;flex-direction:column;align-items:center;padding:1rem 2rem;background:linear-gradient(180deg,rgb(var(--ax-sys-color-lighter-surface)),rgb(var(--ax-sys-color-surface)));border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));gap:.5rem;position:relative}.conversation-title-container{display:flex;flex-direction:column;align-items:center;gap:.25rem}.conversation-title{margin:0;font-size:1.625rem;font-weight:700;color:rgb(var(--ax-sys-color-on-surface));text-align:center;letter-spacing:-.02em}.edit-group-section{padding:1.5rem;background:rgb(var(--ax-sys-color-lighter-surface));border-radius:.75rem;margin-bottom:1.5rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface))}.section-header{margin-bottom:1.25rem;padding-bottom:.75rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.section-title{font-size:1rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface))}.edit-field{margin-bottom:1rem}.edit-label{display:block;font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface));margin-bottom:.5rem}.edit-actions{display:flex;gap:.75rem;justify-content:flex-start;margin-top:1rem}.tab-content-wrapper{flex:1;overflow-y:auto;max-height:50vh}.tab-content{padding:2rem;animation:fadeIn .3s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.about-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:1rem;margin-bottom:1.5rem}.stat-card{display:flex;align-items:center;gap:.75rem;padding:1rem;background:rgb(var(--ax-sys-color-lighter-surface));border-radius:.75rem;transition:all .2s;border:2px solid transparent}.stat-card:hover{background:rgb(var(--ax-sys-color-border-light-surface));// transform: translateY(-2px);box-shadow:0 4px 8px #0000001a}.stat-card.highlight{background:rgba(var(--ax-sys-color-primary-500),.1);border-color:rgb(var(--ax-sys-color-primary-500))}.stat-icon{flex-shrink:0;width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border-radius:.5rem;font-size:1.125rem;color:rgb(var(--ax-sys-color-primary-500))}.stat-card.highlight .stat-icon{background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary))}.stat-content{display:flex;flex-direction:column;gap:.125rem}.stat-value{font-size:1.25rem;font-weight:700;color:rgb(var(--ax-sys-color-on-surface));line-height:1;word-break:break-all}.stat-label{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.7;text-transform:uppercase;letter-spacing:.05em}.about-timeline{display:flex;flex-direction:column;gap:.75rem}.timeline-item{display:flex;align-items:center;gap:1rem;padding:.875rem 1rem;background:rgb(var(--ax-sys-color-lighter-surface));border-radius:.5rem;transition:background .2s}.timeline-item:hover{background:rgb(var(--ax-sys-color-border-light-surface))}.timeline-icon{flex-shrink:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border-radius:50%;font-size:.875rem;color:rgb(var(--ax-sys-color-primary-500))}.timeline-content{display:flex;justify-content:space-between;align-items:center;gap:1rem}.timeline-label{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface))}.timeline-value{font-size:.875rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.7;cursor:help}.members-search{margin-bottom:1rem}.members-list{display:flex;flex-direction:column;gap:.5rem}.member-card{display:flex;align-items:center;gap:.75rem;padding:.875rem;background:rgb(var(--ax-sys-color-lighter-surface));border-radius:.75rem;transition:all .2s ease;border:1px solid transparent;cursor:pointer}.member-card:hover{background:rgb(var(--ax-sys-color-surface));border-color:rgba(var(--ax-sys-color-primary-500),.3);// transform: translateX(4px);box-shadow:0 2px 8px #00000014}.member-details{flex:1;display:flex;flex-direction:column;gap:.125rem;min-width:0}.member-name{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-role{font-size:.75rem;color:rgb(var(--ax-sys-color-primary-500));text-transform:capitalize}.member-description{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-indicator{width:10px;height:10px;border-radius:50%;flex-shrink:0}.status-indicator.online{background:rgb(var(--ax-sys-color-success-500))}.status-indicator.away{background:rgb(var(--ax-sys-color-warning-500))}.status-indicator.offline{background:rgb(var(--ax-sys-color-neutral-400))}.settings-list{display:flex;flex-direction:column;gap:.75rem}.setting-item{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding:1.25rem;background:rgb(var(--ax-sys-color-lighter-surface));border-radius:.75rem;border:1px solid transparent;transition:all .2s ease}.setting-item:hover{background:rgb(var(--ax-sys-color-surface));border-color:rgb(var(--ax-sys-color-border-light-surface));box-shadow:0 2px 6px #0000000f}.setting-info{flex:1;display:flex;flex-direction:column;gap:.25rem}.setting-label{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface))}.setting-description{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.danger-zone{padding:1.5rem;margin-top:1.5rem;background:rgba(var(--ax-sys-color-danger-500),.05);border:1px solid rgba(var(--ax-sys-color-danger-500),.2);border-radius:.75rem}.danger-zone ax-button{width:100%}.background-section{margin-top:1rem;padding:1rem;background:rgb(var(--ax-sys-color-lighter-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:.75rem}.background-description{margin:0 0 .75rem;font-size:.75rem;opacity:.7}.background-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.5rem}.background-swatch{position:relative;height:3rem;border-radius:.625rem;border:2px solid rgb(var(--ax-sys-color-secondary-400));cursor:pointer;overflow:hidden;transition:border-color .15s ease,filter .15s ease}.background-grid:hover .background-swatch:not(:hover){filter:brightness(.75)}.background-swatch-active{border-color:rgb(var(--ax-sys-color-primary-600))}.background-swatch-label{position:absolute;inset-inline-start:.375rem;bottom:.25rem;font-size:.825rem;mix-blend-mode:difference;font-weight:600}.background-actions{margin-top:.625rem;display:flex;justify-content:flex-end}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTabsModule }, { kind: "component", type: i2$1.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: i2$1.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXSwitchModule }, { kind: "component", type: i4.AXSwitchComponent, selector: "ax-switch", inputs: ["disabled", "readonly", "color", "tabIndex", "value", "name", "isLoading"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "component", type: AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "component", type: AXAvatarPickerComponent, selector: "ax-avatar-picker", inputs: ["showClearButton", "avatarUrl"], outputs: ["avatarUrlChange", "onFileSelected"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }] }); }
11212
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.conversation-info-panel{display:flex;flex-direction:column;background:rgb(var(--ax-sys-color-surface));overflow:hidden}.panel-header{display:flex;flex-direction:column;align-items:center;padding:1rem 2rem;background:linear-gradient(180deg,rgb(var(--ax-sys-color-lighter-surface)),rgb(var(--ax-sys-color-surface)));border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));gap:.5rem;position:relative}.conversation-title-container{display:flex;flex-direction:column;align-items:center;gap:.25rem}.conversation-title{margin:0;font-size:1.625rem;font-weight:700;color:rgb(var(--ax-sys-color-on-surface));text-align:center;letter-spacing:-.02em}.edit-group-section{padding:1.5rem;background:rgb(var(--ax-sys-color-lighter-surface));border-radius:.75rem;margin-bottom:1.5rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface))}.section-header{margin-bottom:1.25rem;padding-bottom:.75rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.section-title{font-size:1rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface))}.edit-field{margin-bottom:1rem}.edit-label{display:block;font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface));margin-bottom:.5rem}.edit-actions{display:flex;gap:.75rem;justify-content:flex-start;margin-top:1rem}.tab-content-wrapper{flex:1;overflow-y:auto;max-height:50vh}.tab-content{padding:2rem;animation:fadeIn .3s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.about-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:1rem;margin-bottom:1.5rem}.stat-card{display:flex;align-items:center;gap:.75rem;padding:1rem;background:rgb(var(--ax-sys-color-lighter-surface));border-radius:.75rem;transition:all .2s;border:2px solid transparent}.stat-card:hover{background:rgb(var(--ax-sys-color-border-light-surface));// transform: translateY(-2px);box-shadow:0 4px 8px #0000001a}.stat-card.highlight{background:rgba(var(--ax-sys-color-primary-500),.1);border-color:rgb(var(--ax-sys-color-primary-500))}.stat-icon{flex-shrink:0;width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border-radius:.5rem;font-size:1.125rem;color:rgb(var(--ax-sys-color-primary-500))}.stat-card.highlight .stat-icon{background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary))}.stat-content{display:flex;flex-direction:column;gap:.125rem}.stat-value{font-size:1.25rem;font-weight:700;color:rgb(var(--ax-sys-color-on-surface));line-height:1;word-break:break-all}.stat-label{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.7;text-transform:uppercase;letter-spacing:.05em}.about-timeline{display:flex;flex-direction:column;gap:.75rem}.timeline-item{display:flex;align-items:center;gap:1rem;padding:.875rem 1rem;background:rgb(var(--ax-sys-color-lighter-surface));border-radius:.5rem;transition:background .2s}.timeline-item:hover{background:rgb(var(--ax-sys-color-border-light-surface))}.timeline-icon{flex-shrink:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border-radius:50%;font-size:.875rem;color:rgb(var(--ax-sys-color-primary-500))}.timeline-content{display:flex;justify-content:space-between;align-items:center;gap:1rem}.timeline-label{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface))}.timeline-value{font-size:.875rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.7;cursor:help}.members-search{margin-bottom:1rem}.members-list{display:flex;flex-direction:column;gap:.5rem}.member-card{display:flex;align-items:center;gap:.75rem;padding:.875rem;background:rgb(var(--ax-sys-color-lighter-surface));border-radius:.75rem;transition:all .2s ease;border:1px solid transparent;cursor:pointer}.member-card:hover{background:rgb(var(--ax-sys-color-surface));border-color:rgba(var(--ax-sys-color-primary-500),.3);// transform: translateX(4px);box-shadow:0 2px 8px #00000014}.member-details{flex:1;display:flex;flex-direction:column;gap:.125rem;min-width:0}.member-name{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-role{font-size:.75rem;color:rgb(var(--ax-sys-color-primary-500));text-transform:capitalize}.member-description{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-indicator{width:10px;height:10px;border-radius:50%;flex-shrink:0}.status-indicator.online{background:rgb(var(--ax-sys-color-success-500))}.status-indicator.away{background:rgb(var(--ax-sys-color-warning-500))}.status-indicator.offline{background:rgb(var(--ax-sys-color-neutral-400))}.settings-list{display:flex;flex-direction:column;gap:.75rem}.setting-item{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding:1.25rem;background:rgb(var(--ax-sys-color-lighter-surface));border-radius:.75rem;border:1px solid transparent;transition:all .2s ease}.setting-item:hover{background:rgb(var(--ax-sys-color-surface));border-color:rgb(var(--ax-sys-color-border-light-surface));box-shadow:0 2px 6px #0000000f}.setting-info{flex:1;display:flex;flex-direction:column;gap:.25rem}.setting-label{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface))}.setting-description{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.danger-zone{padding:1.5rem;margin-top:1.5rem;background:rgba(var(--ax-sys-color-danger-500),.05);border:1px solid rgba(var(--ax-sys-color-danger-500),.2);border-radius:.75rem}.danger-zone ax-button{width:100%}.background-section{margin-top:1rem;padding:1rem;background:rgb(var(--ax-sys-color-lighter-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:.75rem}.background-description{margin:0 0 .75rem;font-size:.75rem;opacity:.7}.background-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.5rem}.background-swatch{position:relative;height:3rem;border-radius:.625rem;border:2px solid rgb(var(--ax-sys-color-secondary-400));cursor:pointer;overflow:hidden;transition:border-color .15s ease,filter .15s ease}.background-grid:hover .background-swatch:not(:hover){filter:brightness(.75)}.background-swatch-active{border-color:rgb(var(--ax-sys-color-primary-600))}.background-swatch-label{position:absolute;inset-inline-start:.375rem;bottom:.25rem;font-size:.825rem;mix-blend-mode:difference;font-weight:600}.background-actions{margin-top:.625rem;display:flex;justify-content:flex-end}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTabsModule }, { kind: "component", type: i2$1.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: i2$1.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXSwitchModule }, { kind: "component", type: i4.AXSwitchComponent, selector: "ax-switch", inputs: ["disabled", "readonly", "color", "tabIndex", "value", "name", "isLoading"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "component", type: AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "component", type: AXAvatarPickerComponent, selector: "ax-avatar-picker", inputs: ["showClearButton", "avatarUrl"], outputs: ["avatarUrlChange", "onFileSelected"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }] }); }
11024
11213
  }
11025
11214
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationInfoPanelComponent, decorators: [{
11026
11215
  type: Component,
@@ -11029,27 +11218,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
11029
11218
  FormsModule,
11030
11219
  AXTabsModule,
11031
11220
  AXButtonModule,
11032
- AXAvatarComponent,
11033
- AXImageComponent,
11034
11221
  AXDecoratorModule,
11035
11222
  AXLabelComponent,
11036
11223
  AXSwitchModule,
11037
11224
  AXSearchBoxComponent,
11038
11225
  AXTextBoxComponent,
11039
11226
  AXAvatarPickerComponent,
11227
+ AXConversationAvatarComponent,
11040
11228
  AXTranslationModule,
11041
11229
  ], template: `
11042
11230
  @if (conversation) {
11043
11231
  <div class="conversation-info-panel">
11044
11232
  <!-- Header with Avatar and Title -->
11045
11233
  <div class="panel-header">
11046
- <ax-avatar [size]="80">
11047
- @if (conversation.avatar) {
11048
- <ax-image [src]="conversation.avatar" [alt]="conversation.title"></ax-image>
11049
- } @else {
11050
- <ax-label>{{ getInitials(conversation.title) }}</ax-label>
11051
- }
11052
- </ax-avatar>
11234
+ <ax-conversation-avatar kind="auto" [conversation]="conversation" [size]="80" />
11053
11235
  <div class="conversation-title-container">
11054
11236
  <h2 class="conversation-title">{{ conversation.title }}</h2>
11055
11237
  <h3>{{ conversation.description }}</h3>
@@ -11160,13 +11342,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
11160
11342
  <div class="members-list">
11161
11343
  @for (participant of filteredMembers; track participant.id) {
11162
11344
  <div class="member-card">
11163
- <ax-avatar [size]="40">
11164
- @if (participant.avatar) {
11165
- <ax-image [src]="participant.avatar" [alt]="participant.name"></ax-image>
11166
- } @else {
11167
- <ax-label>{{ getInitials(participant.name) }}</ax-label>
11168
- }
11169
- </ax-avatar>
11345
+ <ax-conversation-avatar
11346
+ kind="user"
11347
+ [userId]="participant.id"
11348
+ [conversation]="conversation"
11349
+ [size]="40"
11350
+ />
11170
11351
  <div class="member-details">
11171
11352
  <span class="member-name">{{ participant.name }}</span>
11172
11353
  @if (participant.description) {
@@ -17483,15 +17664,6 @@ class AXMembersPopoverComponent {
17483
17664
  params: { count: this.conversation().participants.length },
17484
17665
  });
17485
17666
  }
17486
- /** Get initials from name */
17487
- getInitials(name) {
17488
- return name
17489
- .split(' ')
17490
- .map((n) => n[0])
17491
- .join('')
17492
- .toUpperCase()
17493
- .slice(0, 2);
17494
- }
17495
17667
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMembersPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17496
17668
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXMembersPopoverComponent, isStandalone: true, selector: "ax-conversation-members-popover", inputs: { conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
17497
17669
  <div class="members-popover">
@@ -17501,15 +17673,12 @@ class AXMembersPopoverComponent {
17501
17673
  <div class="members-list">
17502
17674
  @for (participant of conversation().participants; track participant.id) {
17503
17675
  <div class="member-item">
17504
- <ax-avatar [size]="36">
17505
- @if (participant.avatar) {
17506
- <ax-image [src]="participant.avatar" [alt]="participant.name"></ax-image>
17507
- } @else if (participant.icon) {
17508
- <ax-icon><i [class]="'member-avatar-icon ' + participant.icon" aria-hidden="true"></i></ax-icon>
17509
- } @else {
17510
- <ax-label>{{ getInitials(participant.name) }}</ax-label>
17511
- }
17512
- </ax-avatar>
17676
+ <ax-conversation-avatar
17677
+ kind="user"
17678
+ [userId]="participant.id"
17679
+ [conversation]="conversation()"
17680
+ [size]="36"
17681
+ />
17513
17682
  <div class="member-info">
17514
17683
  <span class="member-name">{{ participant.name }}</span>
17515
17684
  @if (participant.description) {
@@ -17530,11 +17699,11 @@ class AXMembersPopoverComponent {
17530
17699
  }
17531
17700
  </div>
17532
17701
  </div>
17533
- `, isInline: true, styles: [":host{display:block}.members-popover{width:280px;max-height:400px;border-radius:.5rem;display:flex;flex-direction:column;background:rgb(var(--ax-sys-color-lighter-surface))}.members-header{padding:.75rem 1rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.members-title{font-size:.875rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface))}.members-list{overflow-y:auto;padding:.5rem}.member-item{display:flex;align-items:center;gap:.75rem;padding:.5rem;border-radius:.5rem;transition:background .2s;cursor:pointer}.member-item:hover{background:rgb(var(--ax-sys-color-lighter-surface))}.member-avatar-icon{font-size:1.0625rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.member-info{flex:1;display:flex;flex-direction:column;gap:.125rem;min-width:0}.member-name{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-role{font-size:.75rem;color:rgb(var(--ax-sys-color-primary-500));text-transform:capitalize}.member-description{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-status{width:10px;height:10px;border-radius:50%;// border: 2px solid rgb(var(--ax-sys-color-surface));flex-shrink:0}.member-status.status-online{background:rgb(var(--ax-sys-color-success-500))}.member-status.status-offline{background:rgb(var(--ax-sys-color-neutral-400))}.member-status.status-away{background:rgb(var(--ax-sys-color-warning-500))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17702
+ `, isInline: true, styles: [":host{display:block}.members-popover{width:280px;max-height:400px;border-radius:.5rem;display:flex;flex-direction:column;background:rgb(var(--ax-sys-color-lighter-surface))}.members-header{padding:.75rem 1rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.members-title{font-size:.875rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface))}.members-list{overflow-y:auto;padding:.5rem}.member-item{display:flex;align-items:center;gap:.75rem;padding:.5rem;border-radius:.5rem;transition:background .2s;cursor:pointer}.member-item:hover{background:rgb(var(--ax-sys-color-lighter-surface))}.member-info{flex:1;display:flex;flex-direction:column;gap:.125rem;min-width:0}.member-name{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-role{font-size:.75rem;color:rgb(var(--ax-sys-color-primary-500));text-transform:capitalize}.member-description{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-status{width:10px;height:10px;border-radius:50%;flex-shrink:0}.member-status.status-online{background:rgb(var(--ax-sys-color-success-500))}.member-status.status-offline{background:rgb(var(--ax-sys-color-neutral-400))}.member-status.status-away{background:rgb(var(--ax-sys-color-warning-500))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17534
17703
  }
17535
17704
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMembersPopoverComponent, decorators: [{
17536
17705
  type: Component,
17537
- args: [{ selector: 'ax-conversation-members-popover', imports: [CommonModule, AXAvatarComponent, AXImageComponent, AXLabelComponent, AXDecoratorModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
17706
+ args: [{ selector: 'ax-conversation-members-popover', imports: [CommonModule, AXLabelComponent, AXDecoratorModule, AXConversationAvatarComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
17538
17707
  <div class="members-popover">
17539
17708
  <div class="members-header">
17540
17709
  <span class="members-title">{{ getMembersTitle() }}</span>
@@ -17542,15 +17711,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
17542
17711
  <div class="members-list">
17543
17712
  @for (participant of conversation().participants; track participant.id) {
17544
17713
  <div class="member-item">
17545
- <ax-avatar [size]="36">
17546
- @if (participant.avatar) {
17547
- <ax-image [src]="participant.avatar" [alt]="participant.name"></ax-image>
17548
- } @else if (participant.icon) {
17549
- <ax-icon><i [class]="'member-avatar-icon ' + participant.icon" aria-hidden="true"></i></ax-icon>
17550
- } @else {
17551
- <ax-label>{{ getInitials(participant.name) }}</ax-label>
17552
- }
17553
- </ax-avatar>
17714
+ <ax-conversation-avatar
17715
+ kind="user"
17716
+ [userId]="participant.id"
17717
+ [conversation]="conversation()"
17718
+ [size]="36"
17719
+ />
17554
17720
  <div class="member-info">
17555
17721
  <span class="member-name">{{ participant.name }}</span>
17556
17722
  @if (participant.description) {
@@ -17571,7 +17737,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
17571
17737
  }
17572
17738
  </div>
17573
17739
  </div>
17574
- `, styles: [":host{display:block}.members-popover{width:280px;max-height:400px;border-radius:.5rem;display:flex;flex-direction:column;background:rgb(var(--ax-sys-color-lighter-surface))}.members-header{padding:.75rem 1rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.members-title{font-size:.875rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface))}.members-list{overflow-y:auto;padding:.5rem}.member-item{display:flex;align-items:center;gap:.75rem;padding:.5rem;border-radius:.5rem;transition:background .2s;cursor:pointer}.member-item:hover{background:rgb(var(--ax-sys-color-lighter-surface))}.member-avatar-icon{font-size:1.0625rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.member-info{flex:1;display:flex;flex-direction:column;gap:.125rem;min-width:0}.member-name{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-role{font-size:.75rem;color:rgb(var(--ax-sys-color-primary-500));text-transform:capitalize}.member-description{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-status{width:10px;height:10px;border-radius:50%;// border: 2px solid rgb(var(--ax-sys-color-surface));flex-shrink:0}.member-status.status-online{background:rgb(var(--ax-sys-color-success-500))}.member-status.status-offline{background:rgb(var(--ax-sys-color-neutral-400))}.member-status.status-away{background:rgb(var(--ax-sys-color-warning-500))}\n"] }]
17740
+ `, styles: [":host{display:block}.members-popover{width:280px;max-height:400px;border-radius:.5rem;display:flex;flex-direction:column;background:rgb(var(--ax-sys-color-lighter-surface))}.members-header{padding:.75rem 1rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.members-title{font-size:.875rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface))}.members-list{overflow-y:auto;padding:.5rem}.member-item{display:flex;align-items:center;gap:.75rem;padding:.5rem;border-radius:.5rem;transition:background .2s;cursor:pointer}.member-item:hover{background:rgb(var(--ax-sys-color-lighter-surface))}.member-info{flex:1;display:flex;flex-direction:column;gap:.125rem;min-width:0}.member-name{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-role{font-size:.75rem;color:rgb(var(--ax-sys-color-primary-500));text-transform:capitalize}.member-description{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-status{width:10px;height:10px;border-radius:50%;flex-shrink:0}.member-status.status-online{background:rgb(var(--ax-sys-color-success-500))}.member-status.status-offline{background:rgb(var(--ax-sys-color-neutral-400))}.member-status.status-away{background:rgb(var(--ax-sys-color-warning-500))}\n"] }]
17575
17741
  }] });
17576
17742
 
17577
17743
  /**
@@ -17640,16 +17806,6 @@ class AXInfoBarComponent {
17640
17806
  getSubtitle(conversation) {
17641
17807
  return AXConversationMessageUtilsService.getConversationSubtitle(conversation);
17642
17808
  }
17643
- /** Get initials from name - delegate to utils */
17644
- getInitials(name) {
17645
- return AXConversationMessageUtilsService.getInitials(name);
17646
- }
17647
- getConversationAvatar(conversation) {
17648
- return AXConversationMessageUtilsService.getConversationAvatar(conversation);
17649
- }
17650
- getConversationAvatarIcon(conversation) {
17651
- return AXConversationMessageUtilsService.getConversationAvatarIcon(conversation);
17652
- }
17653
17809
  /** Handle avatar click */
17654
17810
  onAvatarClick() {
17655
17811
  this.avatarClick.emit();
@@ -17777,23 +17933,12 @@ class AXInfoBarComponent {
17777
17933
  tabindex="0"
17778
17934
  (keydown.enter)="onAvatarClick()"
17779
17935
  >
17780
- <ax-avatar [size]="48">
17781
- @if (getConversationAvatar(conversation); as avatar) {
17782
- <ax-image [src]="avatar" alt="{{ conversation.title }}"></ax-image>
17783
- } @else if (getConversationAvatarIcon(conversation); as icon) {
17784
- <ax-icon><i [class]="'info-bar-avatar-icon ' + icon" aria-hidden="true"></i></ax-icon>
17785
- } @else {
17786
- <ax-label>{{ getInitials(conversation.title) }}</ax-label>
17787
- }
17788
- </ax-avatar>
17789
- @if (conversation.type === 'private') {
17790
- <span
17791
- class="avatar-status"
17792
- [class.status-online]="getStatus(conversation) === 'online'"
17793
- [class.status-offline]="getStatus(conversation) === 'offline'"
17794
- [class.status-away]="getStatus(conversation) === 'away'"
17795
- ></span>
17796
- }
17936
+ <ax-conversation-avatar
17937
+ kind="auto"
17938
+ [conversation]="conversation"
17939
+ [size]="48"
17940
+ [showStatus]="conversation.type === 'private'"
17941
+ />
17797
17942
  </div>
17798
17943
 
17799
17944
  <div class="info-details">
@@ -17895,21 +18040,20 @@ class AXInfoBarComponent {
17895
18040
  </div>
17896
18041
  }
17897
18042
  }
17898
- `, isInline: true, styles: [":host{max-width:100%;display:block}.info-bar{position:relative;display:flex;align-items:center;justify-content:space-between;overflow:hidden;padding:.5rem;line-height:1.1rem;min-height:64px;gap:.75rem}.ax-cnv-info-banner{display:flex;align-items:center;gap:.5rem;padding:.5rem .5rem .5rem .75rem;border-block-start:1px solid rgb(var(--ax-sys-color-border-light-surface));// background: rgb(var(--ax-sys-color-primary-lightest-surface))}.ax-cnv-info-banner__content{flex:1;min-width:0}.ax-cnv-info-banner__close{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;padding:0;border:none;border-radius:var(--ax-sys-border-radius, .375rem);background:transparent;color:rgba(var(--ax-sys-color-on-primary-lightest-surface),.65);font-size:1rem;cursor:pointer;touch-action:manipulation;transition:background-color .15s ease,color .15s ease}@media (hover: hover){.ax-cnv-info-banner__close:hover{background:rgba(var(--ax-sys-color-primary-500),.12);color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}}.ax-cnv-info-banner__close:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-600));outline-offset:2px}.info-bar-empty{justify-content:center;opacity:.6}.info-left{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.avatar-wrapper ax-icon{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.info-bar-avatar-icon{font-size:1.35rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.info-details{flex:1;min-width:0}.info-title{margin:0;font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-subtitle-with-status{display:flex;align-items:center;gap:.375rem;margin:.125rem 0 0}.online-badge{color:#22c55e;font-size:.625rem;line-height:1;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.info-subtitle{margin:0;font-size:.85rem;letter-spacing:.02rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.7}.info-subtitle.clickable{cursor:pointer;transition:opacity .2s}.info-subtitle.clickable:hover{opacity:1;text-decoration:underline}.info-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.info-component-fullwidth{position:absolute;top:0;inset-inline-start:0;inset-inline-end:0;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:1rem;background:rgb(var(--ax-sys-color-lightest-surface));z-index:10}.slide-in{animation:slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromRight{0%{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%))}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%));transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}:host-context([dir=\"rtl\"]){--ax-info-bar-slide-distance: -100%}.info-component-fullwidth>*:first-child{flex:1;min-width:0}.action-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:.5rem;font-size:1.25rem;cursor:pointer;transition:background .2s}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.search-container{display:flex;align-items:center;gap:.5rem;width:100%;min-width:200px}.search-input{flex:1;min-width:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXMembersPopoverComponent, selector: "ax-conversation-members-popover", inputs: ["conversation"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18043
+ `, isInline: true, styles: [":host{max-width:100%;display:block}.info-bar{position:relative;display:flex;align-items:center;justify-content:space-between;overflow:hidden;padding:.5rem;line-height:1.1rem;min-height:64px;gap:.75rem}.ax-cnv-info-banner{display:flex;align-items:center;gap:.5rem;padding:.5rem .5rem .5rem .75rem;border-block-start:1px solid rgb(var(--ax-sys-color-border-light-surface));// background: rgb(var(--ax-sys-color-primary-lightest-surface))}.ax-cnv-info-banner__content{flex:1;min-width:0}.ax-cnv-info-banner__close{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;padding:0;border:none;border-radius:var(--ax-sys-border-radius, .375rem);background:transparent;color:rgba(var(--ax-sys-color-on-primary-lightest-surface),.65);font-size:1rem;cursor:pointer;touch-action:manipulation;transition:background-color .15s ease,color .15s ease}@media (hover: hover){.ax-cnv-info-banner__close:hover{background:rgba(var(--ax-sys-color-primary-500),.12);color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}}.ax-cnv-info-banner__close:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-600));outline-offset:2px}.info-bar-empty{justify-content:center;opacity:.6}.info-left{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.info-details{flex:1;min-width:0}.info-title{margin:0;font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-subtitle-with-status{display:flex;align-items:center;gap:.375rem;margin:.125rem 0 0}.online-badge{color:#22c55e;font-size:.625rem;line-height:1;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.info-subtitle{margin:0;font-size:.85rem;letter-spacing:.02rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.7}.info-subtitle.clickable{cursor:pointer;transition:opacity .2s}.info-subtitle.clickable:hover{opacity:1;text-decoration:underline}.info-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.info-component-fullwidth{position:absolute;top:0;inset-inline-start:0;inset-inline-end:0;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:1rem;background:rgb(var(--ax-sys-color-lightest-surface));z-index:10}.slide-in{animation:slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromRight{0%{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%))}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%));transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}:host-context([dir=\"rtl\"]){--ax-info-bar-slide-distance: -100%}.info-component-fullwidth>*:first-child{flex:1;min-width:0}.action-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:.5rem;font-size:1.25rem;cursor:pointer;transition:background .2s}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.search-container{display:flex;align-items:center;gap:.5rem;width:100%;min-width:200px}.search-input{flex:1;min-width:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXMembersPopoverComponent, selector: "ax-conversation-members-popover", inputs: ["conversation"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17899
18044
  }
17900
18045
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXInfoBarComponent, decorators: [{
17901
18046
  type: Component,
17902
18047
  args: [{ selector: 'ax-conversation-info-bar', imports: [
17903
18048
  CommonModule,
17904
18049
  NgComponentOutlet,
17905
- AXAvatarComponent,
17906
18050
  AXButtonModule,
17907
18051
  AXDropdownPanelComponent,
17908
18052
  AXDecoratorModule,
17909
- AXImageComponent,
17910
18053
  AXLabelComponent,
17911
18054
  AXPopoverComponent,
17912
18055
  AXMembersPopoverComponent,
18056
+ AXConversationAvatarComponent,
17913
18057
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
17914
18058
  @if (activeConversation(); as conversation) {
17915
18059
  <div class="info-bar">
@@ -17923,23 +18067,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
17923
18067
  tabindex="0"
17924
18068
  (keydown.enter)="onAvatarClick()"
17925
18069
  >
17926
- <ax-avatar [size]="48">
17927
- @if (getConversationAvatar(conversation); as avatar) {
17928
- <ax-image [src]="avatar" alt="{{ conversation.title }}"></ax-image>
17929
- } @else if (getConversationAvatarIcon(conversation); as icon) {
17930
- <ax-icon><i [class]="'info-bar-avatar-icon ' + icon" aria-hidden="true"></i></ax-icon>
17931
- } @else {
17932
- <ax-label>{{ getInitials(conversation.title) }}</ax-label>
17933
- }
17934
- </ax-avatar>
17935
- @if (conversation.type === 'private') {
17936
- <span
17937
- class="avatar-status"
17938
- [class.status-online]="getStatus(conversation) === 'online'"
17939
- [class.status-offline]="getStatus(conversation) === 'offline'"
17940
- [class.status-away]="getStatus(conversation) === 'away'"
17941
- ></span>
17942
- }
18070
+ <ax-conversation-avatar
18071
+ kind="auto"
18072
+ [conversation]="conversation"
18073
+ [size]="48"
18074
+ [showStatus]="conversation.type === 'private'"
18075
+ />
17943
18076
  </div>
17944
18077
 
17945
18078
  <div class="info-details">
@@ -18041,7 +18174,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
18041
18174
  </div>
18042
18175
  }
18043
18176
  }
18044
- `, styles: [":host{max-width:100%;display:block}.info-bar{position:relative;display:flex;align-items:center;justify-content:space-between;overflow:hidden;padding:.5rem;line-height:1.1rem;min-height:64px;gap:.75rem}.ax-cnv-info-banner{display:flex;align-items:center;gap:.5rem;padding:.5rem .5rem .5rem .75rem;border-block-start:1px solid rgb(var(--ax-sys-color-border-light-surface));// background: rgb(var(--ax-sys-color-primary-lightest-surface))}.ax-cnv-info-banner__content{flex:1;min-width:0}.ax-cnv-info-banner__close{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;padding:0;border:none;border-radius:var(--ax-sys-border-radius, .375rem);background:transparent;color:rgba(var(--ax-sys-color-on-primary-lightest-surface),.65);font-size:1rem;cursor:pointer;touch-action:manipulation;transition:background-color .15s ease,color .15s ease}@media (hover: hover){.ax-cnv-info-banner__close:hover{background:rgba(var(--ax-sys-color-primary-500),.12);color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}}.ax-cnv-info-banner__close:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-600));outline-offset:2px}.info-bar-empty{justify-content:center;opacity:.6}.info-left{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.avatar-wrapper ax-icon{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.info-bar-avatar-icon{font-size:1.35rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.info-details{flex:1;min-width:0}.info-title{margin:0;font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-subtitle-with-status{display:flex;align-items:center;gap:.375rem;margin:.125rem 0 0}.online-badge{color:#22c55e;font-size:.625rem;line-height:1;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.info-subtitle{margin:0;font-size:.85rem;letter-spacing:.02rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.7}.info-subtitle.clickable{cursor:pointer;transition:opacity .2s}.info-subtitle.clickable:hover{opacity:1;text-decoration:underline}.info-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.info-component-fullwidth{position:absolute;top:0;inset-inline-start:0;inset-inline-end:0;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:1rem;background:rgb(var(--ax-sys-color-lightest-surface));z-index:10}.slide-in{animation:slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromRight{0%{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%))}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%));transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}:host-context([dir=\"rtl\"]){--ax-info-bar-slide-distance: -100%}.info-component-fullwidth>*:first-child{flex:1;min-width:0}.action-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:.5rem;font-size:1.25rem;cursor:pointer;transition:background .2s}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.search-container{display:flex;align-items:center;gap:.5rem;width:100%;min-width:200px}.search-input{flex:1;min-width:0}\n"] }]
18177
+ `, styles: [":host{max-width:100%;display:block}.info-bar{position:relative;display:flex;align-items:center;justify-content:space-between;overflow:hidden;padding:.5rem;line-height:1.1rem;min-height:64px;gap:.75rem}.ax-cnv-info-banner{display:flex;align-items:center;gap:.5rem;padding:.5rem .5rem .5rem .75rem;border-block-start:1px solid rgb(var(--ax-sys-color-border-light-surface));// background: rgb(var(--ax-sys-color-primary-lightest-surface))}.ax-cnv-info-banner__content{flex:1;min-width:0}.ax-cnv-info-banner__close{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;padding:0;border:none;border-radius:var(--ax-sys-border-radius, .375rem);background:transparent;color:rgba(var(--ax-sys-color-on-primary-lightest-surface),.65);font-size:1rem;cursor:pointer;touch-action:manipulation;transition:background-color .15s ease,color .15s ease}@media (hover: hover){.ax-cnv-info-banner__close:hover{background:rgba(var(--ax-sys-color-primary-500),.12);color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}}.ax-cnv-info-banner__close:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-600));outline-offset:2px}.info-bar-empty{justify-content:center;opacity:.6}.info-left{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.info-details{flex:1;min-width:0}.info-title{margin:0;font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-subtitle-with-status{display:flex;align-items:center;gap:.375rem;margin:.125rem 0 0}.online-badge{color:#22c55e;font-size:.625rem;line-height:1;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.info-subtitle{margin:0;font-size:.85rem;letter-spacing:.02rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.7}.info-subtitle.clickable{cursor:pointer;transition:opacity .2s}.info-subtitle.clickable:hover{opacity:1;text-decoration:underline}.info-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.info-component-fullwidth{position:absolute;top:0;inset-inline-start:0;inset-inline-end:0;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:1rem;background:rgb(var(--ax-sys-color-lightest-surface));z-index:10}.slide-in{animation:slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromRight{0%{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%))}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%));transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}:host-context([dir=\"rtl\"]){--ax-info-bar-slide-distance: -100%}.info-component-fullwidth>*:first-child{flex:1;min-width:0}.action-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:.5rem;font-size:1.25rem;cursor:pointer;transition:background .2s}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.search-container{display:flex;align-items:center;gap:.5rem;width:100%;min-width:200px}.search-input{flex:1;min-width:0}\n"] }]
18045
18178
  }] });
18046
18179
 
18047
18180
  class AXForwardMessageDialogComponent {
@@ -18665,8 +18798,6 @@ class AXMessageListComponent {
18665
18798
  this.config = inject(CONVERSATION_CONFIG);
18666
18799
  /** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */
18667
18800
  this.noActiveFallbackComponent = AXMessageListNoActiveDefaultComponent;
18668
- /** Custom avatar template for message list items */
18669
- this.avatarTemplate = input(null, ...(ngDevMode ? [{ debugName: "avatarTemplate" }] : []));
18670
18801
  // Timeout cleanup to prevent memory leaks
18671
18802
  this.timeouts = new Set();
18672
18803
  // Store reply and forward counts from API
@@ -18926,20 +19057,6 @@ class AXMessageListComponent {
18926
19057
  return this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');
18927
19058
  return AXConversationMessageUtilsService.getSenderName(message, conversation);
18928
19059
  }
18929
- /** Get sender avatar */
18930
- getSenderAvatar(message) {
18931
- const conversation = this.activeConversation();
18932
- if (!conversation)
18933
- return undefined;
18934
- return AXConversationMessageUtilsService.getSenderAvatar(message, conversation);
18935
- }
18936
- /** Font Awesome icon for sender when no avatar image (participant or conversation icon). */
18937
- getSenderAvatarIcon(message) {
18938
- const conversation = this.activeConversation();
18939
- if (!conversation)
18940
- return undefined;
18941
- return AXConversationMessageUtilsService.getSenderAvatarIcon(message, conversation);
18942
- }
18943
19060
  /** Get original sender name for forwarded messages */
18944
19061
  getOriginalSenderName(message) {
18945
19062
  // Use new forwardedFrom object if available
@@ -19112,10 +19229,6 @@ class AXMessageListComponent {
19112
19229
  getMessageActions(message) {
19113
19230
  return this.messageListService.getMenuActions(message);
19114
19231
  }
19115
- /** Get initials from name */
19116
- getInitials(name) {
19117
- return AXConversationMessageUtilsService.getInitials(name);
19118
- }
19119
19232
  /** Handle reaction click */
19120
19233
  onReactionClick(message, emoji) {
19121
19234
  this.messageListService.reactToMessage(message.id, emoji);
@@ -19400,7 +19513,7 @@ class AXMessageListComponent {
19400
19513
  return message.id;
19401
19514
  }
19402
19515
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19403
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXMessageListComponent, isStandalone: true, selector: "ax-conversation-message-list", inputs: { avatarTemplate: { classPropertyName: "avatarTemplate", publicName: "avatarTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { messageAction: "messageAction" }, viewQueries: [{ propertyName: "reactionPopover", first: true, predicate: ["reactionPopover"], descendants: true, isSignal: true }, { propertyName: "messageListRef", first: true, predicate: ["messageList"], descendants: true, isSignal: true }, { propertyName: "messagesContainerRef", first: true, predicate: ["messagesContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `
19516
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXMessageListComponent, isStandalone: true, selector: "ax-conversation-message-list", outputs: { messageAction: "messageAction" }, viewQueries: [{ propertyName: "reactionPopover", first: true, predicate: ["reactionPopover"], descendants: true, isSignal: true }, { propertyName: "messageListRef", first: true, predicate: ["messageList"], descendants: true, isSignal: true }, { propertyName: "messagesContainerRef", first: true, predicate: ["messagesContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `
19404
19517
  @if (activeConversation(); as conv) {
19405
19518
  @for (cid of [conv.id]; track cid) {
19406
19519
  <div
@@ -19490,35 +19603,13 @@ class AXMessageListComponent {
19490
19603
  <!-- Avatar (only for group conversations and received messages) -->
19491
19604
  @if (shouldShowAvatar(message)) {
19492
19605
  <div class="message-avatar">
19493
- @if (avatarTemplate()) {
19494
- <ng-container
19495
- *ngTemplateOutlet="
19496
- avatarTemplate();
19497
- context: {
19498
- $implicit: message,
19499
- size: 32,
19500
- senderName: getSenderName(message),
19501
- senderAvatar: getSenderAvatar(message),
19502
- senderIcon: getSenderAvatarIcon(message),
19503
- }
19504
- "
19505
- ></ng-container>
19506
- } @else {
19507
- <ax-avatar [size]="32">
19508
- @if (getSenderAvatar(message)) {
19509
- <ax-image [src]="getSenderAvatar(message)!" [alt]="getSenderName(message)"></ax-image>
19510
- } @else if (getSenderAvatarIcon(message)) {
19511
- <ax-icon
19512
- ><i
19513
- [class]="'message-avatar-icon ' + getSenderAvatarIcon(message)!"
19514
- aria-hidden="true"
19515
- ></i
19516
- ></ax-icon>
19517
- } @else {
19518
- <ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>
19519
- }
19520
- </ax-avatar>
19521
- }
19606
+ <ax-conversation-avatar
19607
+ kind="user"
19608
+ [userId]="message.senderId"
19609
+ [conversation]="activeConversation()"
19610
+ [message]="message"
19611
+ [size]="32"
19612
+ />
19522
19613
  </div>
19523
19614
  }
19524
19615
 
@@ -19735,18 +19826,16 @@ class AXMessageListComponent {
19735
19826
  </div>
19736
19827
  </div>
19737
19828
  }
19738
- `, isInline: true, styles: [":host{display:block;height:100%;position:relative;container-type:inline-size}.message-list{position:relative;display:flex;flex-direction:column;height:100%;min-height:0;overflow:hidden}.message-list.ax-drop-zone>.ax-uploader-overlay-state{display:none!important}.message-list--drag{outline:2px dashed rgb(var(--ax-sys-color-primary-500));outline-offset:-2px}.message-list--conversation-surface{animation:axConversationSurfaceIn .36s cubic-bezier(.22,1,.36,1) both}@keyframes axConversationSurfaceIn{0%{opacity:0}to{opacity:1}}@media (prefers-reduced-motion: reduce){.message-list--conversation-surface{animation:axConversationSurfaceInReduced .18s ease both}}@keyframes axConversationSurfaceInReduced{0%{opacity:.92}to{opacity:1}}.list-loading{display:flex;flex:1;flex-direction:column;align-items:center;justify-content:center;min-height:0;text-align:center}.list-empty{display:flex;flex:1;flex-direction:column;align-items:center;justify-content:center;min-height:0;text-align:center;padding:3rem 2rem;gap:1.25rem;animation:fadeInUp .5s ease-out}.message-list--no-active{height:100%}.list-no-active{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:12rem}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.empty-icon{font-size:5.5rem;line-height:1;opacity:.35;margin-bottom:.5rem;filter:grayscale(.2)}.empty-title{font-size:1.625rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface));letter-spacing:-.02em}.empty-description{font-size:1.0625rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;max-width:420px;line-height:1.7}.spinner{width:32px;height:32px;border:3px solid rgb(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));border-radius:50%;animation:spin .8s linear infinite;margin-bottom:1rem}@keyframes spin{to{transform:rotate(360deg)}}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.75rem 1rem .5rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.load-more-indicator{display:flex;align-items:center;justify-content:center;gap:.3rem;min-height:1.25rem}.load-more-dot{width:.4rem;height:.4rem;border-radius:50%;background:rgb(var(--ax-sys-color-primary-500));animation:axChatLoadMoreDot 1s ease-in-out infinite}.load-more-dot:nth-child(2){animation-delay:.14s}.load-more-dot:nth-child(3){animation-delay:.28s}.load-more-label{font-size:.75rem;opacity:.72;letter-spacing:.01em}.load-more-enter{animation:axChatLoadMoreEnterPrepend .32s cubic-bezier(.22,1,.36,1) both}.load-more-leave{animation:axChatLoadMoreLeavePrepend .22s ease both}@keyframes axChatLoadMoreDot{0%,70%,to{transform:translateY(0) scale(1);opacity:.4}35%{transform:translateY(-.28rem) scale(1.08);opacity:1}}@keyframes axChatLoadMoreEnterPrepend{0%{opacity:0;transform:translateY(-.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes axChatLoadMoreLeavePrepend{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-.35rem)}}@media (prefers-reduced-motion: reduce){.load-more-dot{animation:none;opacity:.65}.load-more-enter,.load-more-leave{animation:none}}.messages-container{position:relative;flex:1;width:100%;min-height:0;overflow-y:auto;overflow-x:hidden}.date-separator{position:sticky;z-index:150;top:0;display:flex;align-items:center;justify-content:center;padding:.5rem 0}.date-text{padding:.25rem .75rem;background:rgb(var(--ax-sys-color-lighter-surface));font-size:.75rem;font-weight:500;border-radius:1rem;width:7rem;display:flex;justify-content:center;align-items:center}.unread-separator{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;padding:0 1rem}.unread-separator-line{flex:1;height:1px;background:rgb(var(--ax-sys-color-primary-500));opacity:.3}.unread-separator-text{font-size:.75rem;font-weight:600;color:rgb(var(--ax-sys-color-primary-500));text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}.message-item{position:relative;display:flex;padding:.5rem 1rem;gap:.5rem;line-height:1rem;align-items:end;transition:background-color .3s ease}.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.09);border-radius:.5rem;box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.22)}.message-own.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.12)}.message-highlight{background-color:rgba(var(--ax-sys-color-primary-500),.1);border-radius:.5rem}.message-own{flex-direction:row-reverse}.message-avatar{flex-shrink:0}.message-avatar-icon{font-size:1rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.message-content-row{display:flex;flex-direction:row;align-items:flex-end;max-width:min(95%,50rem);min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}@container (min-width: 768px){.message-content-row{max-width:min(70%,50rem)}}.message-content-row-own{justify-content:flex-end}.message-item:not(.message-own) .message-content-row{justify-content:flex-start}.message-bubble-container{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;max-width:100%;position:relative}.message-own .message-bubble-container{align-items:flex-end}.message-sender{font-size:.75rem;font-weight:600;margin-bottom:.1rem}.message-bubble{position:relative;max-width:100%;display:flex;flex-direction:column;padding:.5rem .5rem .1rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));word-wrap:break-word;transition:background-color .3s ease}.reply-preview{padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .reply-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .reply-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.reply-preview-line{width:3px;background:currentColor;opacity:.5;border-radius:1.5px;flex-shrink:0}.reply-preview-content{flex:1;min-width:0}.reply-preview-sender{font-size:.75rem;font-weight:600;margin-bottom:.125rem;color:rgb(var(--ax-sys-color-primary-600))}.reply-preview-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.message-own .reply-preview-sender{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .reply-preview-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.last-message{display:flex;align-items:center;gap:.25rem}.forwarded-preview{display:flex;align-items:center;gap:.375rem;padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .forwarded-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .forwarded-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.forwarded-preview i{font-size:.8125rem;flex-shrink:0;color:rgb(var(--ax-sys-color-primary-600))}.forwarded-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.message-own .forwarded-preview i{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .forwarded-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.message-bubble-received{border-end-start-radius:.125rem}.message-bubble-received:before{content:\"\";display:block;background:rgb(var(--ax-sys-color-lightest-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;inset-inline-start:-.7rem;border-start-start-radius:86%;corner-shape:scoop}.message-bubble-sent{border-end-end-radius:.125rem}.message-bubble-sent:after{content:\"\";display:block;background:rgb(var(--ax-sys-color-primary-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;inset-inline-end:-.7rem;border-start-end-radius:86%;corner-shape:scoop}.message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.message-content{font-size:.9375rem;line-height:1.5;white-space:pre-wrap}.message-footer{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;padding-inline-start:.25rem;margin-top:.1rem;gap:.25rem;font-size:.6875rem;opacity:.7;letter-spacing:.05rem;-webkit-user-select:none;user-select:none}.message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-variant-numeric:tabular-nums;font-size:.675rem}.message-footer-count i{font-size:.625rem;opacity:.9}.message-footer-count-value{font-weight:600}.message-footer-split{flex-shrink:0;align-self:center;width:1px;height:.65rem;background:rgb(var(--ax-sys-color-border-light-surface));opacity:.9;margin-inline:.2rem}.message-time{font-variant-numeric:tabular-nums;font-size:.675rem}.edited-indicator{display:inline-flex;align-items:center;gap:.25rem;font-size:.675rem;opacity:.75;padding-inline-start:.35rem;border-inline-start:1px solid rgb(var(--ax-sys-color-border-light-surface))}.status-icon{display:inline-flex;align-items:center}.status-icon i{font-size:.75rem}.status-read{color:rgb(var(--ax-sys-color-primary-200))}.status-failed{color:rgb(var(--ax-sys-color-danger-200))}.message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}.reaction-bubble{display:inline-flex;align-items:center;justify-content:center;gap:.15rem;min-height:1.375rem;padding:.1rem .35rem;margin:0;background:rgba(var(--ax-sys-color-on-surface),.06);color:rgb(var(--ax-sys-color-on-surface));border:1px solid rgba(var(--ax-sys-color-on-surface),.1);border-radius:.75rem;box-shadow:none;cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}.reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}.reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}.reaction-emoji{font-size:.8125rem;line-height:1;display:inline-block}.reaction-count{font-size:.6875rem;font-weight:500;font-variant-numeric:tabular-nums;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;line-height:1}.reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-primary-600));opacity:.95;font-weight:600}.message-own .reaction-bubble{background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2);color:rgb(var(--ax-sys-color-on-primary-surface))}.message-own .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.2);border-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}.message-own .reaction-bubble-active{background:rgba(var(--ax-sys-color-on-primary-surface),.28);border-color:rgba(var(--ax-sys-color-on-primary-surface),.5)}.message-own .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.34);border-color:rgba(var(--ax-sys-color-on-primary-surface),.6)}.message-own .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.8}.message-own .reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:1}.message-reactions-container{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:.2rem;margin-top:.25rem;justify-content:flex-start}// .message-own .message-reactions-container{// justify-content: flex-end;//}.add-reaction-button.add-reaction-outside{display:none;position:absolute;top:50%;inset-inline-end:-2.25rem;transform:translateY(-50%);align-items:center;justify-content:center;box-sizing:border-box;width:1.8rem;height:1.8rem;padding:0;margin:0;border-radius:50%;cursor:pointer;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));box-shadow:0 1px 2px #0000000f}.add-reaction-button{padding-inline-start:.05rem}.message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-2.25rem;inset-inline-end:auto}.message-item:hover .add-reaction-button.add-reaction-outside,.add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}.add-reaction-button.add-reaction-outside:hover,.add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgb(var(--ax-sys-color-primary-500))}.add-reaction-button.add-reaction-outside i{font-size:.9rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.8}.reaction-picker-popup{position:fixed;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:.65rem;z-index:100;min-width:auto;width:max-content;max-width:min(260px,92vw);box-shadow:0 4px 16px #0000001a;transform:translateY(-100%);margin-top:-.35rem;overflow:hidden}.reaction-picker-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.45rem .5rem .45rem .7rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));min-height:0}.picker-title{font-size:.8125rem;font-weight:600;letter-spacing:.02em;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.picker-close{display:flex;align-items:center;justify-content:center;width:1.6rem;height:1.6rem;padding:0;background:transparent;border:none;border-radius:.25rem;cursor:pointer;font-size:.95rem;color:rgba(var(--ax-sys-color-on-surface),.55);transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.picker-close:hover{background:rgba(var(--ax-sys-color-danger-500),.1);color:rgb(var(--ax-sys-color-danger-500))}.reaction-bubble:focus-visible,.add-reaction-button:focus-visible,.picker-close:focus-visible,.reaction-picker-emoji:focus-visible,.action-trigger:focus-visible,.scroll-to-bottom:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}.reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,1fr);gap:.2rem;padding:.45rem .5rem .5rem}.reaction-picker-emoji{width:2rem;height:2rem;padding:0;background:transparent;border:1px solid transparent;border-radius:.45rem;font-size:1.15rem;line-height:1;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-picker-emoji:hover{// transform: scale(1.15);background:rgb(var(--ax-sys-color-lighter-surface))}.reaction-picker-emoji-active{background:rgb(var(--ax-sys-color-surface))}.reaction-picker-emoji-active:hover{background:rgba(var(--ax-sys-color-primary-500),.25)}.message-actions{padding-bottom:1.5rem;opacity:0;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:10}.message-item:hover .message-actions{opacity:1}.action-trigger{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:var(--ax-sys-border-radius);font-size:.875rem;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.action-trigger:hover{background:rgb(var(--ax-sys-color-light-surface));// transform: scale(1.05)}.shortcut{font-size:.6875rem;opacity:.7}.scroll-to-bottom{position:absolute;bottom:1rem;inset-inline-end:1rem;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));border:none;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:999}.scroll-to-bottom:hover{// transform: scale(1.1)}.slide-in{animation:slideInFromBottom var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.slide-out{opacity:0;transform:translateY(100%);transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "closeOnRouteChange", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i6.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge", "scrollDisabled", "cooldownMs"], outputs: ["scrollThreshold"] }, { kind: "directive", type: AXUploaderZoneDirective, selector: "[axUploaderZone]", inputs: ["multiple", "accept", "fileType", "overlayTemplate", "disableBrowse", "disableDragDrop"], outputs: ["fileChange", "onChanged", "dragEnter", "dragLeave", "dragOver", "onFileUploadComplete", "onFilesUploadComplete"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19829
+ `, isInline: true, styles: [":host{display:block;height:100%;position:relative;container-type:inline-size}.message-list{position:relative;display:flex;flex-direction:column;height:100%;min-height:0;overflow:hidden}.message-list.ax-drop-zone>.ax-uploader-overlay-state{display:none!important}.message-list--drag{outline:2px dashed rgb(var(--ax-sys-color-primary-500));outline-offset:-2px}.message-list--conversation-surface{animation:axConversationSurfaceIn .36s cubic-bezier(.22,1,.36,1) both}@keyframes axConversationSurfaceIn{0%{opacity:0}to{opacity:1}}@media (prefers-reduced-motion: reduce){.message-list--conversation-surface{animation:axConversationSurfaceInReduced .18s ease both}}@keyframes axConversationSurfaceInReduced{0%{opacity:.92}to{opacity:1}}.list-loading{display:flex;flex:1;flex-direction:column;align-items:center;justify-content:center;min-height:0;text-align:center}.list-empty{display:flex;flex:1;flex-direction:column;align-items:center;justify-content:center;min-height:0;text-align:center;padding:3rem 2rem;gap:1.25rem;animation:fadeInUp .5s ease-out}.message-list--no-active{height:100%}.list-no-active{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:12rem}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.empty-icon{font-size:5.5rem;line-height:1;opacity:.35;margin-bottom:.5rem;filter:grayscale(.2)}.empty-title{font-size:1.625rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface));letter-spacing:-.02em}.empty-description{font-size:1.0625rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;max-width:420px;line-height:1.7}.spinner{width:32px;height:32px;border:3px solid rgb(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));border-radius:50%;animation:spin .8s linear infinite;margin-bottom:1rem}@keyframes spin{to{transform:rotate(360deg)}}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.75rem 1rem .5rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.load-more-indicator{display:flex;align-items:center;justify-content:center;gap:.3rem;min-height:1.25rem}.load-more-dot{width:.4rem;height:.4rem;border-radius:50%;background:rgb(var(--ax-sys-color-primary-500));animation:axChatLoadMoreDot 1s ease-in-out infinite}.load-more-dot:nth-child(2){animation-delay:.14s}.load-more-dot:nth-child(3){animation-delay:.28s}.load-more-label{font-size:.75rem;opacity:.72;letter-spacing:.01em}.load-more-enter{animation:axChatLoadMoreEnterPrepend .32s cubic-bezier(.22,1,.36,1) both}.load-more-leave{animation:axChatLoadMoreLeavePrepend .22s ease both}@keyframes axChatLoadMoreDot{0%,70%,to{transform:translateY(0) scale(1);opacity:.4}35%{transform:translateY(-.28rem) scale(1.08);opacity:1}}@keyframes axChatLoadMoreEnterPrepend{0%{opacity:0;transform:translateY(-.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes axChatLoadMoreLeavePrepend{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-.35rem)}}@media (prefers-reduced-motion: reduce){.load-more-dot{animation:none;opacity:.65}.load-more-enter,.load-more-leave{animation:none}}.messages-container{position:relative;flex:1;width:100%;min-height:0;overflow-y:auto;overflow-x:hidden}.date-separator{position:sticky;z-index:150;top:0;display:flex;align-items:center;justify-content:center;padding:.5rem 0}.date-text{padding:.25rem .75rem;background:rgb(var(--ax-sys-color-lighter-surface));font-size:.75rem;font-weight:500;border-radius:1rem;width:7rem;display:flex;justify-content:center;align-items:center}.unread-separator{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;padding:0 1rem}.unread-separator-line{flex:1;height:1px;background:rgb(var(--ax-sys-color-primary-500));opacity:.3}.unread-separator-text{font-size:.75rem;font-weight:600;color:rgb(var(--ax-sys-color-primary-500));text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}.message-item{position:relative;display:flex;padding:.5rem 1rem;gap:.5rem;line-height:1rem;align-items:end;transition:background-color .3s ease}.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.09);border-radius:.5rem;box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.22)}.message-own.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.12)}.message-highlight{background-color:rgba(var(--ax-sys-color-primary-500),.1);border-radius:.5rem}.message-own{flex-direction:row-reverse}.message-avatar{flex-shrink:0}.message-avatar-icon{font-size:1rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.message-content-row{display:flex;flex-direction:row;align-items:flex-end;max-width:min(95%,50rem);min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}@container (min-width: 768px){.message-content-row{max-width:min(70%,50rem)}}.message-content-row-own{justify-content:flex-end}.message-item:not(.message-own) .message-content-row{justify-content:flex-start}.message-bubble-container{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;max-width:100%;position:relative}.message-own .message-bubble-container{align-items:flex-end}.message-sender{font-size:.75rem;font-weight:600;margin-bottom:.1rem}.message-bubble{position:relative;max-width:100%;display:flex;flex-direction:column;padding:.5rem .5rem .1rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));word-wrap:break-word;transition:background-color .3s ease}.reply-preview{padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .reply-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .reply-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.reply-preview-line{width:3px;background:currentColor;opacity:.5;border-radius:1.5px;flex-shrink:0}.reply-preview-content{flex:1;min-width:0}.reply-preview-sender{font-size:.75rem;font-weight:600;margin-bottom:.125rem;color:rgb(var(--ax-sys-color-primary-600))}.reply-preview-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.message-own .reply-preview-sender{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .reply-preview-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.last-message{display:flex;align-items:center;gap:.25rem}.forwarded-preview{display:flex;align-items:center;gap:.375rem;padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .forwarded-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .forwarded-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.forwarded-preview i{font-size:.8125rem;flex-shrink:0;color:rgb(var(--ax-sys-color-primary-600))}.forwarded-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.message-own .forwarded-preview i{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .forwarded-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.message-bubble-received{border-end-start-radius:.125rem}.message-bubble-received:before{content:\"\";display:block;background:rgb(var(--ax-sys-color-lightest-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;inset-inline-start:-.7rem;border-start-start-radius:86%;corner-shape:scoop}.message-bubble-sent{border-end-end-radius:.125rem}.message-bubble-sent:after{content:\"\";display:block;background:rgb(var(--ax-sys-color-primary-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;inset-inline-end:-.7rem;border-start-end-radius:86%;corner-shape:scoop}.message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.message-content{font-size:.9375rem;line-height:1.5;white-space:pre-wrap}.message-footer{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;padding-inline-start:.25rem;margin-top:.1rem;gap:.25rem;font-size:.6875rem;opacity:.7;letter-spacing:.05rem;-webkit-user-select:none;user-select:none}.message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-variant-numeric:tabular-nums;font-size:.675rem}.message-footer-count i{font-size:.625rem;opacity:.9}.message-footer-count-value{font-weight:600}.message-footer-split{flex-shrink:0;align-self:center;width:1px;height:.65rem;background:rgb(var(--ax-sys-color-border-light-surface));opacity:.9;margin-inline:.2rem}.message-time{font-variant-numeric:tabular-nums;font-size:.675rem}.edited-indicator{display:inline-flex;align-items:center;gap:.25rem;font-size:.675rem;opacity:.75;padding-inline-start:.35rem;border-inline-start:1px solid rgb(var(--ax-sys-color-border-light-surface))}.status-icon{display:inline-flex;align-items:center}.status-icon i{font-size:.75rem}.status-read{color:rgb(var(--ax-sys-color-primary-200))}.status-failed{color:rgb(var(--ax-sys-color-danger-200))}.message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}.reaction-bubble{display:inline-flex;align-items:center;justify-content:center;gap:.15rem;min-height:1.375rem;padding:.1rem .35rem;margin:0;background:rgba(var(--ax-sys-color-on-surface),.06);color:rgb(var(--ax-sys-color-on-surface));border:1px solid rgba(var(--ax-sys-color-on-surface),.1);border-radius:.75rem;box-shadow:none;cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}.reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}.reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}.reaction-emoji{font-size:.8125rem;line-height:1;display:inline-block}.reaction-count{font-size:.6875rem;font-weight:500;font-variant-numeric:tabular-nums;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;line-height:1}.reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-primary-600));opacity:.95;font-weight:600}.message-own .reaction-bubble{background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2);color:rgb(var(--ax-sys-color-on-primary-surface))}.message-own .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.2);border-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}.message-own .reaction-bubble-active{background:rgba(var(--ax-sys-color-on-primary-surface),.28);border-color:rgba(var(--ax-sys-color-on-primary-surface),.5)}.message-own .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.34);border-color:rgba(var(--ax-sys-color-on-primary-surface),.6)}.message-own .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.8}.message-own .reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:1}.message-reactions-container{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:.2rem;margin-top:.25rem;justify-content:flex-start}// .message-own .message-reactions-container{// justify-content: flex-end;//}.add-reaction-button.add-reaction-outside{display:none;position:absolute;top:50%;inset-inline-end:-2.25rem;transform:translateY(-50%);align-items:center;justify-content:center;box-sizing:border-box;width:1.8rem;height:1.8rem;padding:0;margin:0;border-radius:50%;cursor:pointer;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));box-shadow:0 1px 2px #0000000f}.add-reaction-button{padding-inline-start:.05rem}.message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-2.25rem;inset-inline-end:auto}.message-item:hover .add-reaction-button.add-reaction-outside,.add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}.add-reaction-button.add-reaction-outside:hover,.add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgb(var(--ax-sys-color-primary-500))}.add-reaction-button.add-reaction-outside i{font-size:.9rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.8}.reaction-picker-popup{position:fixed;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:.65rem;z-index:100;min-width:auto;width:max-content;max-width:min(260px,92vw);box-shadow:0 4px 16px #0000001a;transform:translateY(-100%);margin-top:-.35rem;overflow:hidden}.reaction-picker-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.45rem .5rem .45rem .7rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));min-height:0}.picker-title{font-size:.8125rem;font-weight:600;letter-spacing:.02em;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.picker-close{display:flex;align-items:center;justify-content:center;width:1.6rem;height:1.6rem;padding:0;background:transparent;border:none;border-radius:.25rem;cursor:pointer;font-size:.95rem;color:rgba(var(--ax-sys-color-on-surface),.55);transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.picker-close:hover{background:rgba(var(--ax-sys-color-danger-500),.1);color:rgb(var(--ax-sys-color-danger-500))}.reaction-bubble:focus-visible,.add-reaction-button:focus-visible,.picker-close:focus-visible,.reaction-picker-emoji:focus-visible,.action-trigger:focus-visible,.scroll-to-bottom:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}.reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,1fr);gap:.2rem;padding:.45rem .5rem .5rem}.reaction-picker-emoji{width:2rem;height:2rem;padding:0;background:transparent;border:1px solid transparent;border-radius:.45rem;font-size:1.15rem;line-height:1;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-picker-emoji:hover{// transform: scale(1.15);background:rgb(var(--ax-sys-color-lighter-surface))}.reaction-picker-emoji-active{background:rgb(var(--ax-sys-color-surface))}.reaction-picker-emoji-active:hover{background:rgba(var(--ax-sys-color-primary-500),.25)}.message-actions{padding-bottom:1.5rem;opacity:0;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:10}.message-item:hover .message-actions{opacity:1}.action-trigger{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:var(--ax-sys-border-radius);font-size:.875rem;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.action-trigger:hover{background:rgb(var(--ax-sys-color-light-surface));// transform: scale(1.05)}.shortcut{font-size:.6875rem;opacity:.7}.scroll-to-bottom{position:absolute;bottom:1rem;inset-inline-end:1rem;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));border:none;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:999}.scroll-to-bottom:hover{// transform: scale(1.1)}.slide-in{animation:slideInFromBottom var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.slide-out{opacity:0;transform:translateY(100%);transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "closeOnRouteChange", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i6.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge", "scrollDisabled", "cooldownMs"], outputs: ["scrollThreshold"] }, { kind: "directive", type: AXUploaderZoneDirective, selector: "[axUploaderZone]", inputs: ["multiple", "accept", "fileType", "overlayTemplate", "disableBrowse", "disableDragDrop"], outputs: ["fileChange", "onChanged", "dragEnter", "dragLeave", "dragOver", "onFileUploadComplete", "onFilesUploadComplete"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19739
19830
  }
19740
19831
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListComponent, decorators: [{
19741
19832
  type: Component,
19742
19833
  args: [{ selector: 'ax-conversation-message-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
19743
19834
  CommonModule,
19744
19835
  AXBadgeComponent,
19745
- AXAvatarComponent,
19746
19836
  AXButtonModule,
19747
19837
  AXContextMenuComponent,
19748
19838
  AXDecoratorModule,
19749
- AXImageComponent,
19750
19839
  AXLabelComponent,
19751
19840
  AXLoadingComponent,
19752
19841
  AXFormatModule,
@@ -19755,6 +19844,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
19755
19844
  AXTranslationModule,
19756
19845
  AXInfiniteScrollDirective,
19757
19846
  AXUploaderZoneDirective,
19847
+ AXConversationAvatarComponent,
19758
19848
  ], template: `
19759
19849
  @if (activeConversation(); as conv) {
19760
19850
  @for (cid of [conv.id]; track cid) {
@@ -19845,35 +19935,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
19845
19935
  <!-- Avatar (only for group conversations and received messages) -->
19846
19936
  @if (shouldShowAvatar(message)) {
19847
19937
  <div class="message-avatar">
19848
- @if (avatarTemplate()) {
19849
- <ng-container
19850
- *ngTemplateOutlet="
19851
- avatarTemplate();
19852
- context: {
19853
- $implicit: message,
19854
- size: 32,
19855
- senderName: getSenderName(message),
19856
- senderAvatar: getSenderAvatar(message),
19857
- senderIcon: getSenderAvatarIcon(message),
19858
- }
19859
- "
19860
- ></ng-container>
19861
- } @else {
19862
- <ax-avatar [size]="32">
19863
- @if (getSenderAvatar(message)) {
19864
- <ax-image [src]="getSenderAvatar(message)!" [alt]="getSenderName(message)"></ax-image>
19865
- } @else if (getSenderAvatarIcon(message)) {
19866
- <ax-icon
19867
- ><i
19868
- [class]="'message-avatar-icon ' + getSenderAvatarIcon(message)!"
19869
- aria-hidden="true"
19870
- ></i
19871
- ></ax-icon>
19872
- } @else {
19873
- <ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>
19874
- }
19875
- </ax-avatar>
19876
- }
19938
+ <ax-conversation-avatar
19939
+ kind="user"
19940
+ [userId]="message.senderId"
19941
+ [conversation]="activeConversation()"
19942
+ [message]="message"
19943
+ [size]="32"
19944
+ />
19877
19945
  </div>
19878
19946
  }
19879
19947
 
@@ -20101,7 +20169,6 @@ class AXConversationItemComponent {
20101
20169
  constructor() {
20102
20170
  this.conversationService = inject(AXConversationService);
20103
20171
  this.infoBarService = inject(AXInfoBarService);
20104
- this.avatarTemplate = input(null, ...(ngDevMode ? [{ debugName: "avatarTemplate" }] : []));
20105
20172
  /** Conversation data */
20106
20173
  this.conversation = input.required(...(ngDevMode ? [{ debugName: "conversation" }] : []));
20107
20174
  /** Click event */
@@ -20130,10 +20197,6 @@ class AXConversationItemComponent {
20130
20197
  }
20131
20198
  return classes.join(' ');
20132
20199
  }, ...(ngDevMode ? [{ debugName: "itemClasses" }] : []));
20133
- /** Conversation status for avatar - delegate to utils */
20134
- this.conversationStatus = computed(() => {
20135
- return AXConversationMessageUtilsService.getConversationStatus(this.liveConversation());
20136
- }, ...(ngDevMode ? [{ debugName: "conversationStatus" }] : []));
20137
20200
  /** Typing indicator text - delegate to utils */
20138
20201
  this.typingText = computed(() => {
20139
20202
  return AXConversationMessageUtilsService.getTypingText(this.liveConversation());
@@ -20150,16 +20213,6 @@ class AXConversationItemComponent {
20150
20213
  get registry() {
20151
20214
  return this.conversationService.registry;
20152
20215
  }
20153
- /** Get initials from name - delegate to utils */
20154
- getInitials(name) {
20155
- return AXConversationMessageUtilsService.getInitials(name);
20156
- }
20157
- getConversationAvatar(conversation) {
20158
- return AXConversationMessageUtilsService.getConversationAvatar(conversation);
20159
- }
20160
- getConversationAvatarIcon(conversation) {
20161
- return AXConversationMessageUtilsService.getConversationAvatarIcon(conversation);
20162
- }
20163
20216
  getPreviewTypeKey(type) {
20164
20217
  switch (type) {
20165
20218
  case 'image':
@@ -20222,7 +20275,7 @@ class AXConversationItemComponent {
20222
20275
  }
20223
20276
  }
20224
20277
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
20225
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXConversationItemComponent, isStandalone: true, selector: "ax-conversation-item", inputs: { avatarTemplate: { classPropertyName: "avatarTemplate", publicName: "avatarTemplate", isSignal: true, isRequired: false, transformFunction: null }, conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
20278
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXConversationItemComponent, isStandalone: true, selector: "ax-conversation-item", inputs: { conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
20226
20279
  <div
20227
20280
  [class]="itemClasses()"
20228
20281
  [id]="'conversation-item-' + conversation().id"
@@ -20235,36 +20288,12 @@ class AXConversationItemComponent {
20235
20288
  >
20236
20289
  <!-- Avatar -->
20237
20290
  <div class="item-avatar">
20238
- <div class="avatar-wrapper">
20239
- @if (avatarTemplate()) {
20240
- <ng-container
20241
- *ngTemplateOutlet="
20242
- avatarTemplate();
20243
- context: { $implicit: conversation(), size: 48, icon: getConversationAvatarIcon(liveConversation()) }
20244
- "
20245
- ></ng-container>
20246
- } @else {
20247
- <ax-avatar [size]="48">
20248
- @if (getConversationAvatar(liveConversation()); as avatar) {
20249
- <ax-image [src]="avatar" alt="{{ liveConversation().title }}"></ax-image>
20250
- } @else if (getConversationAvatarIcon(liveConversation()); as icon) {
20251
- <ax-icon
20252
- ><i [class]="'conversation-item-avatar-icon ' + icon" aria-hidden="true"></i
20253
- ></ax-icon>
20254
- } @else {
20255
- <ax-label>{{ getInitials(liveConversation().title) }}</ax-label>
20256
- }
20257
- </ax-avatar>
20258
- }
20259
- @if (conversation().type === 'private') {
20260
- <span
20261
- class="avatar-status"
20262
- [class.status-online]="conversationStatus() === 'online'"
20263
- [class.status-offline]="conversationStatus() === 'offline'"
20264
- [class.status-away]="conversationStatus() === 'away'"
20265
- ></span>
20266
- }
20267
- </div>
20291
+ <ax-conversation-avatar
20292
+ kind="auto"
20293
+ [conversation]="liveConversation()"
20294
+ [size]="48"
20295
+ [showStatus]="conversation().type === 'private'"
20296
+ />
20268
20297
  </div>
20269
20298
 
20270
20299
  <!-- Content -->
@@ -20327,21 +20356,19 @@ class AXConversationItemComponent {
20327
20356
  (onItemClick)="handleContextMenuItemClick($event)"
20328
20357
  >
20329
20358
  </ax-context-menu>
20330
- `, isInline: true, styles: [":host{display:block}.conversation-item{display:flex;align-items:center;gap:.75rem;padding:.375rem .75rem;margin:.375rem;border-radius:.5rem;cursor:pointer;transition:background .2s}.conversation-item:focus-visible,.conversation-item:hover{background:rgb(var(--ax-sys-color-light-surface));outline:none}.conversation-item-active{background:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.conversation-item-active:hover{background:rgb(var(--ax-sys-color-primary-lighter-surface))}.conversation-item-context-active{background:rgb(var(--ax-sys-color-light-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.35)}.conversation-item-active.conversation-item-context-active{background:rgb(var(--ax-sys-color-primary-lighter-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.45)}.item-avatar{flex-shrink:0}.avatar-wrapper{position:relative}.conversation-item-avatar-icon{font-size:1.35rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.avatar-status{position:absolute;bottom:2px;inset-inline-end:2px;width:12px;height:12px;border-radius:50%}.avatar-status.status-online{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-success-500))}// .avatar-status.status-offline{// border: 2px solid rgb(var(--ax-sys-color-surface));// background: rgb(var(--ax-sys-color-neutral));//}.avatar-status.status-away{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-warning-500))}.item-content{display:flex;flex-direction:column;gap:.25rem;flex:1;min-width:0;line-height:1.1rem}.item-header{display:flex;align-items:center;justify-content:space-between;gap:.25rem}.item-title{display:flex;align-items:center;// gap: .25rem;font-weight:600;font-size:.875rem;flex:1;min-width:0}.item-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.item-time{font-variant-numeric:tabular-nums;flex-shrink:0;font-size:.75rem;opacity:.7}.item-description{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;opacity:.7;min-width:0}.typing-indicator{color:rgb(var(--ax-sys-color-primary-500));font-style:italic;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.last-message{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.no-message{// font-weight: 600}.item-badge{flex-shrink:0}.mute-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "closeOnRouteChange", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
20359
+ `, isInline: true, styles: [":host{display:block}.conversation-item{display:flex;align-items:center;gap:.75rem;padding:.375rem .75rem;margin:.375rem;border-radius:.5rem;cursor:pointer;transition:background .2s}.conversation-item:focus-visible,.conversation-item:hover{background:rgb(var(--ax-sys-color-light-surface));outline:none}.conversation-item-active{background:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.conversation-item-active:hover{background:rgb(var(--ax-sys-color-primary-lighter-surface))}.conversation-item-context-active{background:rgb(var(--ax-sys-color-light-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.35)}.conversation-item-active.conversation-item-context-active{background:rgb(var(--ax-sys-color-primary-lighter-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.45)}.item-avatar{flex-shrink:0}.item-content{display:flex;flex-direction:column;gap:.25rem;flex:1;min-width:0;line-height:1.1rem}.item-header{display:flex;align-items:center;justify-content:space-between;gap:.25rem}.item-title{display:flex;align-items:center;// gap: .25rem;font-weight:600;font-size:.875rem;flex:1;min-width:0}.item-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.item-time{font-variant-numeric:tabular-nums;flex-shrink:0;font-size:.75rem;opacity:.7}.item-description{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;opacity:.7;min-width:0}.typing-indicator{color:rgb(var(--ax-sys-color-primary-500));font-style:italic;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.last-message{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.no-message{// font-weight: 600}.item-badge{flex-shrink:0}.mute-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "closeOnRouteChange", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
20331
20360
  }
20332
20361
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationItemComponent, decorators: [{
20333
20362
  type: Component,
20334
20363
  args: [{ selector: 'ax-conversation-item', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
20335
20364
  CommonModule,
20336
20365
  AXDecoratorModule,
20337
- AXAvatarComponent,
20338
20366
  AXBadgeComponent,
20339
- AXImageComponent,
20340
- AXLabelComponent,
20341
20367
  AXContextMenuComponent,
20342
20368
  AXFormatModule,
20343
20369
  AXDateTimeModule,
20344
20370
  AXTranslationModule,
20371
+ AXConversationAvatarComponent,
20345
20372
  ], template: `
20346
20373
  <div
20347
20374
  [class]="itemClasses()"
@@ -20355,36 +20382,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
20355
20382
  >
20356
20383
  <!-- Avatar -->
20357
20384
  <div class="item-avatar">
20358
- <div class="avatar-wrapper">
20359
- @if (avatarTemplate()) {
20360
- <ng-container
20361
- *ngTemplateOutlet="
20362
- avatarTemplate();
20363
- context: { $implicit: conversation(), size: 48, icon: getConversationAvatarIcon(liveConversation()) }
20364
- "
20365
- ></ng-container>
20366
- } @else {
20367
- <ax-avatar [size]="48">
20368
- @if (getConversationAvatar(liveConversation()); as avatar) {
20369
- <ax-image [src]="avatar" alt="{{ liveConversation().title }}"></ax-image>
20370
- } @else if (getConversationAvatarIcon(liveConversation()); as icon) {
20371
- <ax-icon
20372
- ><i [class]="'conversation-item-avatar-icon ' + icon" aria-hidden="true"></i
20373
- ></ax-icon>
20374
- } @else {
20375
- <ax-label>{{ getInitials(liveConversation().title) }}</ax-label>
20376
- }
20377
- </ax-avatar>
20378
- }
20379
- @if (conversation().type === 'private') {
20380
- <span
20381
- class="avatar-status"
20382
- [class.status-online]="conversationStatus() === 'online'"
20383
- [class.status-offline]="conversationStatus() === 'offline'"
20384
- [class.status-away]="conversationStatus() === 'away'"
20385
- ></span>
20386
- }
20387
- </div>
20385
+ <ax-conversation-avatar
20386
+ kind="auto"
20387
+ [conversation]="liveConversation()"
20388
+ [size]="48"
20389
+ [showStatus]="conversation().type === 'private'"
20390
+ />
20388
20391
  </div>
20389
20392
 
20390
20393
  <!-- Content -->
@@ -20447,7 +20450,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
20447
20450
  (onItemClick)="handleContextMenuItemClick($event)"
20448
20451
  >
20449
20452
  </ax-context-menu>
20450
- `, styles: [":host{display:block}.conversation-item{display:flex;align-items:center;gap:.75rem;padding:.375rem .75rem;margin:.375rem;border-radius:.5rem;cursor:pointer;transition:background .2s}.conversation-item:focus-visible,.conversation-item:hover{background:rgb(var(--ax-sys-color-light-surface));outline:none}.conversation-item-active{background:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.conversation-item-active:hover{background:rgb(var(--ax-sys-color-primary-lighter-surface))}.conversation-item-context-active{background:rgb(var(--ax-sys-color-light-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.35)}.conversation-item-active.conversation-item-context-active{background:rgb(var(--ax-sys-color-primary-lighter-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.45)}.item-avatar{flex-shrink:0}.avatar-wrapper{position:relative}.conversation-item-avatar-icon{font-size:1.35rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.avatar-status{position:absolute;bottom:2px;inset-inline-end:2px;width:12px;height:12px;border-radius:50%}.avatar-status.status-online{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-success-500))}// .avatar-status.status-offline{// border: 2px solid rgb(var(--ax-sys-color-surface));// background: rgb(var(--ax-sys-color-neutral));//}.avatar-status.status-away{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-warning-500))}.item-content{display:flex;flex-direction:column;gap:.25rem;flex:1;min-width:0;line-height:1.1rem}.item-header{display:flex;align-items:center;justify-content:space-between;gap:.25rem}.item-title{display:flex;align-items:center;// gap: .25rem;font-weight:600;font-size:.875rem;flex:1;min-width:0}.item-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.item-time{font-variant-numeric:tabular-nums;flex-shrink:0;font-size:.75rem;opacity:.7}.item-description{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;opacity:.7;min-width:0}.typing-indicator{color:rgb(var(--ax-sys-color-primary-500));font-style:italic;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.last-message{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.no-message{// font-weight: 600}.item-badge{flex-shrink:0}.mute-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"] }]
20453
+ `, styles: [":host{display:block}.conversation-item{display:flex;align-items:center;gap:.75rem;padding:.375rem .75rem;margin:.375rem;border-radius:.5rem;cursor:pointer;transition:background .2s}.conversation-item:focus-visible,.conversation-item:hover{background:rgb(var(--ax-sys-color-light-surface));outline:none}.conversation-item-active{background:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.conversation-item-active:hover{background:rgb(var(--ax-sys-color-primary-lighter-surface))}.conversation-item-context-active{background:rgb(var(--ax-sys-color-light-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.35)}.conversation-item-active.conversation-item-context-active{background:rgb(var(--ax-sys-color-primary-lighter-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.45)}.item-avatar{flex-shrink:0}.item-content{display:flex;flex-direction:column;gap:.25rem;flex:1;min-width:0;line-height:1.1rem}.item-header{display:flex;align-items:center;justify-content:space-between;gap:.25rem}.item-title{display:flex;align-items:center;// gap: .25rem;font-weight:600;font-size:.875rem;flex:1;min-width:0}.item-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.item-time{font-variant-numeric:tabular-nums;flex-shrink:0;font-size:.75rem;opacity:.7}.item-description{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;opacity:.7;min-width:0}.typing-indicator{color:rgb(var(--ax-sys-color-primary-500));font-style:italic;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.last-message{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.no-message{// font-weight: 600}.item-badge{flex-shrink:0}.mute-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-inline-start:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"] }]
20451
20454
  }] });
20452
20455
 
20453
20456
  class AXNewConversationDialogComponent extends AXBasePageComponent {
@@ -21204,7 +21207,7 @@ class AXSidebarComponent {
21204
21207
  </ng-content>
21205
21208
  </div>
21206
21209
  </div>
21207
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.sidebar{display:flex;flex-direction:column;height:100%;//background: rgb(var(--ax-sys-color-lightest-surface));// border-inline-end: 1px solid rgb(var(--ax-sys-color-border-light-surface));position:relative}.sidebar-header{min-height:64px;display:flex;align-items:center;gap:.25rem;padding:.75rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.menu-button{flex-shrink:0}.sidebar-search{flex:1}.sidebar-list{flex:1;overflow-y:auto;position:relative;padding-bottom:4rem}.new-conversation-button-container{position:absolute;bottom:0;inset-inline-start:0;inset-inline-end:.25rem;padding:1rem .5rem}.new-conversation-button-container-inner{display:flex;justify-content:center;align-items:center}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface))}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 2rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));gap:1rem}.empty-icon{font-size:4rem;line-height:1;opacity:.5;margin-bottom:.5rem}.empty-title{font-size:1.25rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface))}.empty-description{font-size:.875rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.7;max-width:300px;line-height:1.5}.empty-action{margin-top:.5rem}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.75rem 1rem 1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.load-more-indicator{display:flex;align-items:center;justify-content:center;gap:.3rem;min-height:1.25rem}.load-more-dot{width:.4rem;height:.4rem;border-radius:50%;background:rgb(var(--ax-sys-color-primary-500));animation:axChatLoadMoreDot 1s ease-in-out infinite}.load-more-dot:nth-child(2){animation-delay:.14s}.load-more-dot:nth-child(3){animation-delay:.28s}.load-more-label{font-size:.75rem;opacity:.72;letter-spacing:.01em}.load-more-enter{animation:axChatLoadMoreEnterAppend .32s cubic-bezier(.22,1,.36,1) both}.load-more-leave{animation:axChatLoadMoreLeaveAppend .22s ease both}@keyframes axChatLoadMoreDot{0%,70%,to{transform:translateY(0) scale(1);opacity:.4}35%{transform:translateY(-.28rem) scale(1.08);opacity:1}}@keyframes axChatLoadMoreEnterAppend{0%{opacity:0;transform:translateY(.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes axChatLoadMoreLeaveAppend{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(.35rem)}}@media (prefers-reduced-motion: reduce){.load-more-dot{animation:none;opacity:.65}.load-more-enter,.load-more-leave{animation:none}}// ax-conversation-item:not(:last-child){// border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));//}.tab-icon{font-size:1rem}.conversation-skeleton{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.skeleton-avatar{flex-shrink:0;width:48px;height:48px;border-radius:50%}.skeleton-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:.5rem}.skeleton-header{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.skeleton-title{flex:1;height:1rem;border-radius:.25rem}.skeleton-time{font-variant-numeric:tabular-nums;width:3rem;height:.75rem;border-radius:.25rem}.skeleton-message{height:.75rem;width:80%;border-radius:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$6.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXConversationItemComponent, selector: "ax-conversation-item", inputs: ["avatarTemplate", "conversation"], outputs: ["clicked"] }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge", "scrollDisabled", "cooldownMs"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
21210
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.sidebar{display:flex;flex-direction:column;height:100%;//background: rgb(var(--ax-sys-color-lightest-surface));// border-inline-end: 1px solid rgb(var(--ax-sys-color-border-light-surface));position:relative}.sidebar-header{min-height:64px;display:flex;align-items:center;gap:.25rem;padding:.75rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.menu-button{flex-shrink:0}.sidebar-search{flex:1}.sidebar-list{flex:1;overflow-y:auto;position:relative;padding-bottom:4rem}.new-conversation-button-container{position:absolute;bottom:0;inset-inline-start:0;inset-inline-end:.25rem;padding:1rem .5rem}.new-conversation-button-container-inner{display:flex;justify-content:center;align-items:center}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface))}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 2rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));gap:1rem}.empty-icon{font-size:4rem;line-height:1;opacity:.5;margin-bottom:.5rem}.empty-title{font-size:1.25rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface))}.empty-description{font-size:.875rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.7;max-width:300px;line-height:1.5}.empty-action{margin-top:.5rem}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.75rem 1rem 1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.load-more-indicator{display:flex;align-items:center;justify-content:center;gap:.3rem;min-height:1.25rem}.load-more-dot{width:.4rem;height:.4rem;border-radius:50%;background:rgb(var(--ax-sys-color-primary-500));animation:axChatLoadMoreDot 1s ease-in-out infinite}.load-more-dot:nth-child(2){animation-delay:.14s}.load-more-dot:nth-child(3){animation-delay:.28s}.load-more-label{font-size:.75rem;opacity:.72;letter-spacing:.01em}.load-more-enter{animation:axChatLoadMoreEnterAppend .32s cubic-bezier(.22,1,.36,1) both}.load-more-leave{animation:axChatLoadMoreLeaveAppend .22s ease both}@keyframes axChatLoadMoreDot{0%,70%,to{transform:translateY(0) scale(1);opacity:.4}35%{transform:translateY(-.28rem) scale(1.08);opacity:1}}@keyframes axChatLoadMoreEnterAppend{0%{opacity:0;transform:translateY(.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes axChatLoadMoreLeaveAppend{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(.35rem)}}@media (prefers-reduced-motion: reduce){.load-more-dot{animation:none;opacity:.65}.load-more-enter,.load-more-leave{animation:none}}// ax-conversation-item:not(:last-child){// border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));//}.tab-icon{font-size:1rem}.conversation-skeleton{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.skeleton-avatar{flex-shrink:0;width:48px;height:48px;border-radius:50%}.skeleton-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:.5rem}.skeleton-header{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.skeleton-title{flex:1;height:1rem;border-radius:.25rem}.skeleton-time{font-variant-numeric:tabular-nums;width:3rem;height:.75rem;border-radius:.25rem}.skeleton-message{height:.75rem;width:80%;border-radius:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$6.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXConversationItemComponent, selector: "ax-conversation-item", inputs: ["conversation"], outputs: ["clicked"] }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge", "scrollDisabled", "cooldownMs"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
21208
21211
  }
21209
21212
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXSidebarComponent, decorators: [{
21210
21213
  type: Component,
@@ -21381,7 +21384,7 @@ const DECLARATIONS = [
21381
21384
  * Creates providers array for conversation module
21382
21385
  */
21383
21386
  function createProviders(options, includeServices) {
21384
- const { userApi, conversationApi, messageApi, realtimeApi, config, registry } = options;
21387
+ const { userApi, conversationApi, messageApi, realtimeApi, config, registry, avatarComponents } = options;
21385
21388
  const providers = [];
21386
21389
  if (includeServices) {
21387
21390
  if (!userApi || !conversationApi || !messageApi) {
@@ -21407,6 +21410,18 @@ function createProviders(options, includeServices) {
21407
21410
  if (registry) {
21408
21411
  providers.push({ provide: REGISTRY_CONFIG, useValue: registry });
21409
21412
  }
21413
+ if (avatarComponents?.user) {
21414
+ providers.push({
21415
+ provide: AX_CONVERSATION_USER_AVATAR_COMPONENT,
21416
+ useValue: avatarComponents.user,
21417
+ });
21418
+ }
21419
+ if (avatarComponents?.conversation) {
21420
+ providers.push({
21421
+ provide: AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,
21422
+ useValue: avatarComponents.conversation,
21423
+ });
21424
+ }
21410
21425
  if (includeServices) {
21411
21426
  providers.push(AXMessageRendererRegistry, AXMessageActionRegistry, AXComposerActionRegistry, AXComposerTabRegistry, AXConversationTabRegistry, AXInfoBarActionRegistry, AXConversationItemActionRegistry, AXRegistryService);
21412
21427
  }
@@ -21791,5 +21806,5 @@ function getErrorMessage(code, params) {
21791
21806
  * Generated bundle index. Do not edit.
21792
21807
  */
21793
21808
 
21794
- export { AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, AXCnvMediaPlaybackInfoBarBannerComponent, AXComposerActionRegistry, AXComposerComponent, AXComposerPopupComponent, AXComposerService, AXComposerTabRegistry, AXConversation2Module, AXConversationAiApiKey, AXConversationAiResponderService, AXConversationApi, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationService, AXConversationSharedStorage, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXForwardMessageDialogComponent, AXImagePickerComponent, AXImageRendererComponent, AXInfiniteScrollDirective, AXInfoBarActionRegistry, AXInfoBarComponent, AXInfoBarSearchComponent, AXInfoBarService, AXLocationPickerComponent, AXLocationRendererComponent, AXMessageActionRegistry, AXMessageApi, AXMessageListComponent, AXMessageListNoActiveDefaultComponent, AXMessageListService, AXMessageRendererRegistry, AXNewConversationDialogComponent, AXPickerFooterComponent, AXPickerHeaderComponent, AXRealtimeApi, AXRegistryService, AXSidebarComponent, AXSidebarService, AXStickerRendererComponent, AXStickerTabComponent, AXSystemRendererComponent, AXTextRendererComponent, AXUserApi, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceRecorderComponent, AXVoiceRendererComponent, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_FILE_TYPE_PROVIDERS, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_CURSOR_PREFIX, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_BOT, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, AX_MESSAGE_CURSOR_PREFIX, AX_STICKER_API_KEY, CONNECTION_ERRORS, CONVERSATION_CONFIG, CONVERSATION_ERRORS, CONVERSATION_FILE_TYPES_READY, DEFAULT_COMPOSER_ACTIONS, DEFAULT_COMPOSER_TABS, DEFAULT_CONVERSATION_ITEM_ACTIONS, DEFAULT_CONVERSATION_TABS, DEFAULT_INFO_BAR_ACTIONS, DEFAULT_MESSAGE_ACTIONS, DEFAULT_MESSAGE_RENDERERS, ERROR_HANDLER_CONFIG, ERROR_MESSAGES, FILE_ERRORS, LOCATION_ERRORS, MESSAGE_ERRORS, REGISTRY_CONFIG, URL_ERRORS, USER_ERRORS, applyConversationFilters, applyLocalPreview, axConversationIndexedDbStorage, conversationSharedStorage, createLocalPreviewUrl, createObjectUrl, encodeConversationCursor, encodeMessageCursor, formatErrorMessage, getConversationLastActivity, getConversationMessagesNewestFirst, getErrorMessage, getSortedConversationsForInbox, mergeUploadResult, mergeWithDefaults, normalizeAllConversationMessageIndexes, paginateChatNewestFirst, paginateChatOldestFirst, parseChatCursor, provideConversation, provideConversationComposerFileTypes, provideConversationFileCatalog, registerChatMessage, revokeObjectUrl, sanitizeInput, sortConversationMessageIds, toUploaderReference$1 as toUploaderReference, unregisterChatMessage, validateConversationId, validateEmail, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
21809
+ export { AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, AXCnvMediaPlaybackInfoBarBannerComponent, AXComposerActionRegistry, AXComposerComponent, AXComposerPopupComponent, AXComposerService, AXComposerTabRegistry, AXConversation2Module, AXConversationAiApiKey, AXConversationAiResponderService, AXConversationApi, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationService, AXConversationSharedStorage, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXForwardMessageDialogComponent, AXImagePickerComponent, AXImageRendererComponent, AXInfiniteScrollDirective, AXInfoBarActionRegistry, AXInfoBarComponent, AXInfoBarSearchComponent, AXInfoBarService, AXLocationPickerComponent, AXLocationRendererComponent, AXMessageActionRegistry, AXMessageApi, AXMessageListComponent, AXMessageListNoActiveDefaultComponent, AXMessageListService, AXMessageRendererRegistry, AXNewConversationDialogComponent, AXPickerFooterComponent, AXPickerHeaderComponent, AXRealtimeApi, AXRegistryService, AXSidebarComponent, AXSidebarService, AXStickerRendererComponent, AXStickerTabComponent, AXSystemRendererComponent, AXTextRendererComponent, AXUserApi, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceRecorderComponent, AXVoiceRendererComponent, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_FILE_TYPE_PROVIDERS, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, AX_CONVERSATION_CURSOR_PREFIX, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_BOT, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_USER_AVATAR_COMPONENT, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, AX_MESSAGE_CURSOR_PREFIX, AX_STICKER_API_KEY, CONNECTION_ERRORS, CONVERSATION_CONFIG, CONVERSATION_ERRORS, CONVERSATION_FILE_TYPES_READY, DEFAULT_COMPOSER_ACTIONS, DEFAULT_COMPOSER_TABS, DEFAULT_CONVERSATION_ITEM_ACTIONS, DEFAULT_CONVERSATION_TABS, DEFAULT_INFO_BAR_ACTIONS, DEFAULT_MESSAGE_ACTIONS, DEFAULT_MESSAGE_RENDERERS, ERROR_HANDLER_CONFIG, ERROR_MESSAGES, FILE_ERRORS, LOCATION_ERRORS, MESSAGE_ERRORS, REGISTRY_CONFIG, URL_ERRORS, USER_ERRORS, applyConversationFilters, applyLocalPreview, axConversationIndexedDbStorage, conversationSharedStorage, createLocalPreviewUrl, createObjectUrl, encodeConversationCursor, encodeMessageCursor, formatErrorMessage, getConversationLastActivity, getConversationMessagesNewestFirst, getErrorMessage, getSortedConversationsForInbox, mergeUploadResult, mergeWithDefaults, normalizeAllConversationMessageIndexes, paginateChatNewestFirst, paginateChatOldestFirst, parseChatCursor, provideConversation, provideConversationComposerFileTypes, provideConversationFileCatalog, registerChatMessage, resolveConversationAvatarDisplay, resolvePrivatePeerUserId, resolveUserAvatarDisplay, revokeObjectUrl, sanitizeInput, shouldUseUserAvatarForConversation, sortConversationMessageIds, toUploaderReference$1 as toUploaderReference, unregisterChatMessage, validateConversationId, validateEmail, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
21795
21810
  //# sourceMappingURL=acorex-components-conversation2.mjs.map