@acorex/components 20.7.61 → 20.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
@@ -8473,6 +8480,9 @@ class AXConversationIndexedDbConversationApi extends AXConversationApi {
8473
8480
  const updated = {
8474
8481
  ...conversation,
8475
8482
  ...updates,
8483
+ ...(updates.metadata !== undefined
8484
+ ? { metadata: { ...conversation.metadata, ...updates.metadata } }
8485
+ : {}),
8476
8486
  updatedAt: new Date(),
8477
8487
  };
8478
8488
  conversationSharedStorage.conversations.set(conversationId, updated);
@@ -10403,6 +10413,201 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
10403
10413
  `, 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
10414
  }] });
10405
10415
 
10416
+ /** Other participant in a private chat (excludes the current user). */
10417
+ function resolvePrivatePeerUserId(conversation, currentUserId) {
10418
+ if (conversation.type !== 'private') {
10419
+ return undefined;
10420
+ }
10421
+ const currentId = currentUserId ?? 'current-user';
10422
+ return conversation.participants.find((participant) => participant.id !== currentId)?.id;
10423
+ }
10424
+ /** Whether `auto` kind should render a user avatar for this conversation. */
10425
+ function shouldUseUserAvatarForConversation(conversation, currentUserId) {
10426
+ return conversation.type === 'private' && !!resolvePrivatePeerUserId(conversation, currentUserId);
10427
+ }
10428
+ function resolveUserAvatarDisplay(userId, conversation, message) {
10429
+ if (message && conversation) {
10430
+ return {
10431
+ name: AXConversationMessageUtilsService.getSenderName(message, conversation),
10432
+ avatar: AXConversationMessageUtilsService.getSenderAvatar(message, conversation),
10433
+ icon: AXConversationMessageUtilsService.getSenderAvatarIcon(message, conversation),
10434
+ };
10435
+ }
10436
+ const participant = conversation?.participants.find((p) => p.id === userId);
10437
+ return {
10438
+ name: participant?.name ?? userId,
10439
+ avatar: participant?.avatar,
10440
+ icon: participant?.icon,
10441
+ };
10442
+ }
10443
+ function resolveConversationAvatarDisplay(conversation) {
10444
+ return {
10445
+ name: conversation.title,
10446
+ avatar: AXConversationMessageUtilsService.getConversationAvatar(conversation),
10447
+ icon: AXConversationMessageUtilsService.getConversationAvatarIcon(conversation),
10448
+ };
10449
+ }
10450
+
10451
+ /**
10452
+ * Conversation avatar host — renders a registered custom component or built-in fallback.
10453
+ */
10454
+ class AXConversationAvatarComponent {
10455
+ constructor() {
10456
+ this.conversationService = inject(AXConversationService, { optional: true });
10457
+ this.userAvatarComponent = inject(AX_CONVERSATION_USER_AVATAR_COMPONENT, { optional: true });
10458
+ this.conversationAvatarComponent = inject(AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, {
10459
+ optional: true,
10460
+ });
10461
+ this.kind = input('auto', ...(ngDevMode ? [{ debugName: "kind" }] : []));
10462
+ this.userId = input(...(ngDevMode ? [undefined, { debugName: "userId" }] : []));
10463
+ this.conversation = input(...(ngDevMode ? [undefined, { debugName: "conversation" }] : []));
10464
+ this.message = input(...(ngDevMode ? [undefined, { debugName: "message" }] : []));
10465
+ this.size = input(40, ...(ngDevMode ? [{ debugName: "size" }] : []));
10466
+ this.showStatus = input(false, ...(ngDevMode ? [{ debugName: "showStatus" }] : []));
10467
+ this.name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
10468
+ this.avatar = input(...(ngDevMode ? [undefined, { debugName: "avatar" }] : []));
10469
+ this.icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : []));
10470
+ this.currentUserId = computed(() => this.conversationService?.currentUser()?.id, ...(ngDevMode ? [{ debugName: "currentUserId" }] : []));
10471
+ this.resolvedKind = computed(() => {
10472
+ const explicitKind = this.kind();
10473
+ if (explicitKind === 'user') {
10474
+ return 'user';
10475
+ }
10476
+ if (explicitKind === 'conversation') {
10477
+ return 'conversation';
10478
+ }
10479
+ const conversation = this.conversation();
10480
+ if (conversation && shouldUseUserAvatarForConversation(conversation, this.currentUserId())) {
10481
+ return 'user';
10482
+ }
10483
+ return 'conversation';
10484
+ }, ...(ngDevMode ? [{ debugName: "resolvedKind" }] : []));
10485
+ this.resolvedUserId = computed(() => {
10486
+ const explicitUserId = this.userId();
10487
+ if (explicitUserId) {
10488
+ return explicitUserId;
10489
+ }
10490
+ const conversation = this.conversation();
10491
+ if (!conversation || this.resolvedKind() !== 'user') {
10492
+ return undefined;
10493
+ }
10494
+ return resolvePrivatePeerUserId(conversation, this.currentUserId());
10495
+ }, ...(ngDevMode ? [{ debugName: "resolvedUserId" }] : []));
10496
+ this.customComponent = computed(() => {
10497
+ if (this.resolvedKind() === 'user') {
10498
+ return this.resolvedUserId() && this.userAvatarComponent ? this.userAvatarComponent : null;
10499
+ }
10500
+ const conversation = this.conversation();
10501
+ return conversation && this.conversationAvatarComponent ? this.conversationAvatarComponent : null;
10502
+ }, ...(ngDevMode ? [{ debugName: "customComponent" }] : []));
10503
+ this.customInputs = computed(() => {
10504
+ if (this.resolvedKind() === 'user') {
10505
+ return {
10506
+ userId: this.resolvedUserId() ?? '',
10507
+ size: this.size(),
10508
+ };
10509
+ }
10510
+ return {
10511
+ conversationId: this.conversation()?.id ?? '',
10512
+ size: this.size(),
10513
+ };
10514
+ }, ...(ngDevMode ? [{ debugName: "customInputs" }] : []));
10515
+ this.fallbackDisplay = computed(() => {
10516
+ const explicitName = this.name();
10517
+ const explicitAvatar = this.avatar();
10518
+ const explicitIcon = this.icon();
10519
+ if (this.resolvedKind() === 'user') {
10520
+ const userId = this.resolvedUserId();
10521
+ if (!userId) {
10522
+ return { name: explicitName ?? '?', avatar: explicitAvatar, icon: explicitIcon };
10523
+ }
10524
+ const resolved = resolveUserAvatarDisplay(userId, this.conversation(), this.message());
10525
+ return {
10526
+ name: explicitName ?? resolved.name,
10527
+ avatar: explicitAvatar ?? resolved.avatar,
10528
+ icon: explicitIcon ?? resolved.icon,
10529
+ };
10530
+ }
10531
+ const conversation = this.conversation();
10532
+ if (!conversation) {
10533
+ return { name: explicitName ?? '?', avatar: explicitAvatar, icon: explicitIcon };
10534
+ }
10535
+ const resolved = resolveConversationAvatarDisplay(conversation);
10536
+ return {
10537
+ name: explicitName ?? resolved.name,
10538
+ avatar: explicitAvatar ?? resolved.avatar,
10539
+ icon: explicitIcon ?? resolved.icon,
10540
+ };
10541
+ }, ...(ngDevMode ? [{ debugName: "fallbackDisplay" }] : []));
10542
+ this.fallbackInitials = computed(() => AXConversationMessageUtilsService.getInitials(this.fallbackDisplay().name), ...(ngDevMode ? [{ debugName: "fallbackInitials" }] : []));
10543
+ this.resolvedStatus = computed(() => {
10544
+ const conversation = this.conversation();
10545
+ if (!conversation || !this.showStatus()) {
10546
+ return undefined;
10547
+ }
10548
+ return AXConversationMessageUtilsService.getConversationStatus(conversation);
10549
+ }, ...(ngDevMode ? [{ debugName: "resolvedStatus" }] : []));
10550
+ }
10551
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10552
+ 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 } }, host: { properties: { "style.--ax-conversation-avatar-size.px": "size()" } }, ngImport: i0, template: `
10553
+ <div class="ax-conversation-avatar">
10554
+ @if (customComponent(); as component) {
10555
+ <ng-container *ngComponentOutlet="component; inputs: customInputs()" />
10556
+ } @else {
10557
+ <ax-avatar [size]="size()">
10558
+ @if (fallbackDisplay().avatar; as avatarSrc) {
10559
+ <ax-image [src]="avatarSrc" [alt]="fallbackDisplay().name"></ax-image>
10560
+ } @else if (fallbackDisplay().icon; as iconClass) {
10561
+ <ax-icon><i [class]="'ax-conversation-avatar-icon ' + iconClass" aria-hidden="true"></i></ax-icon>
10562
+ } @else {
10563
+ <ax-label>{{ fallbackInitials() }}</ax-label>
10564
+ }
10565
+ </ax-avatar>
10566
+ }
10567
+
10568
+ @if (showStatus() && resolvedStatus(); as presence) {
10569
+ <span
10570
+ class="ax-conversation-avatar-status"
10571
+ [class.status-online]="presence === 'online'"
10572
+ [class.status-offline]="presence === 'offline'"
10573
+ [class.status-away]="presence === 'away'"
10574
+ ></span>
10575
+ }
10576
+ </div>
10577
+ `, isInline: true, styles: [":host{display:inline-flex}.ax-conversation-avatar{position:relative;display:inline-flex}.ax-conversation-avatar-icon{font-size:calc(var(--ax-conversation-avatar-size, 2.5rem) * .5);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 }); }
10578
+ }
10579
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationAvatarComponent, decorators: [{
10580
+ type: Component,
10581
+ args: [{ selector: 'ax-conversation-avatar', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgComponentOutlet, AXAvatarComponent, AXDecoratorModule, AXImageComponent, AXLabelComponent], template: `
10582
+ <div class="ax-conversation-avatar">
10583
+ @if (customComponent(); as component) {
10584
+ <ng-container *ngComponentOutlet="component; inputs: customInputs()" />
10585
+ } @else {
10586
+ <ax-avatar [size]="size()">
10587
+ @if (fallbackDisplay().avatar; as avatarSrc) {
10588
+ <ax-image [src]="avatarSrc" [alt]="fallbackDisplay().name"></ax-image>
10589
+ } @else if (fallbackDisplay().icon; as iconClass) {
10590
+ <ax-icon><i [class]="'ax-conversation-avatar-icon ' + iconClass" aria-hidden="true"></i></ax-icon>
10591
+ } @else {
10592
+ <ax-label>{{ fallbackInitials() }}</ax-label>
10593
+ }
10594
+ </ax-avatar>
10595
+ }
10596
+
10597
+ @if (showStatus() && resolvedStatus(); as presence) {
10598
+ <span
10599
+ class="ax-conversation-avatar-status"
10600
+ [class.status-online]="presence === 'online'"
10601
+ [class.status-offline]="presence === 'offline'"
10602
+ [class.status-away]="presence === 'away'"
10603
+ ></span>
10604
+ }
10605
+ </div>
10606
+ `, host: {
10607
+ '[style.--ax-conversation-avatar-size.px]': 'size()',
10608
+ }, styles: [":host{display:inline-flex}.ax-conversation-avatar{position:relative;display:inline-flex}.ax-conversation-avatar-icon{font-size:calc(var(--ax-conversation-avatar-size, 2.5rem) * .5);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"] }]
10609
+ }] });
10610
+
10406
10611
  class AXConversationDateUtilsService {
10407
10612
  /**
10408
10613
  * Format relative time (e.g., "2m ago", "1h ago")
@@ -10566,10 +10771,6 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
10566
10771
  this.editAvatar = this.conversation.avatar || '';
10567
10772
  }
10568
10773
  }
10569
- /** Get initials from name */
10570
- getInitials(name) {
10571
- return AXConversationMessageUtilsService.getInitials(name);
10572
- }
10573
10774
  /** Get conversation subtitle */
10574
10775
  getSubtitle() {
10575
10776
  return AXConversationMessageUtilsService.getConversationSubtitle(this.conversation);
@@ -10749,13 +10950,7 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
10749
10950
  <div class="conversation-info-panel">
10750
10951
  <!-- Header with Avatar and Title -->
10751
10952
  <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>
10953
+ <ax-conversation-avatar kind="auto" [conversation]="conversation" [size]="80" />
10759
10954
  <div class="conversation-title-container">
10760
10955
  <h2 class="conversation-title">{{ conversation.title }}</h2>
10761
10956
  <h3>{{ conversation.description }}</h3>
@@ -10866,13 +11061,12 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
10866
11061
  <div class="members-list">
10867
11062
  @for (participant of filteredMembers; track participant.id) {
10868
11063
  <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>
11064
+ <ax-conversation-avatar
11065
+ kind="user"
11066
+ [userId]="participant.id"
11067
+ [conversation]="conversation"
11068
+ [size]="40"
11069
+ />
10876
11070
  <div class="member-details">
10877
11071
  <span class="member-name">{{ participant.name }}</span>
10878
11072
  @if (participant.description) {
@@ -11020,7 +11214,7 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
11020
11214
  </div>
11021
11215
  </div>
11022
11216
  }
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" }] }); }
11217
+ `, 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
11218
  }
11025
11219
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationInfoPanelComponent, decorators: [{
11026
11220
  type: Component,
@@ -11029,27 +11223,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
11029
11223
  FormsModule,
11030
11224
  AXTabsModule,
11031
11225
  AXButtonModule,
11032
- AXAvatarComponent,
11033
- AXImageComponent,
11034
11226
  AXDecoratorModule,
11035
11227
  AXLabelComponent,
11036
11228
  AXSwitchModule,
11037
11229
  AXSearchBoxComponent,
11038
11230
  AXTextBoxComponent,
11039
11231
  AXAvatarPickerComponent,
11232
+ AXConversationAvatarComponent,
11040
11233
  AXTranslationModule,
11041
11234
  ], template: `
11042
11235
  @if (conversation) {
11043
11236
  <div class="conversation-info-panel">
11044
11237
  <!-- Header with Avatar and Title -->
11045
11238
  <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>
11239
+ <ax-conversation-avatar kind="auto" [conversation]="conversation" [size]="80" />
11053
11240
  <div class="conversation-title-container">
11054
11241
  <h2 class="conversation-title">{{ conversation.title }}</h2>
11055
11242
  <h3>{{ conversation.description }}</h3>
@@ -11160,13 +11347,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
11160
11347
  <div class="members-list">
11161
11348
  @for (participant of filteredMembers; track participant.id) {
11162
11349
  <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>
11350
+ <ax-conversation-avatar
11351
+ kind="user"
11352
+ [userId]="participant.id"
11353
+ [conversation]="conversation"
11354
+ [size]="40"
11355
+ />
11170
11356
  <div class="member-details">
11171
11357
  <span class="member-name">{{ participant.name }}</span>
11172
11358
  @if (participant.description) {
@@ -14980,6 +15166,29 @@ class AXConversationService {
14980
15166
  */
14981
15167
  async updateConversation(conversationId, updates) {
14982
15168
  try {
15169
+ const { title, description, avatar, icon, metadata, archived } = updates;
15170
+ const apiUpdates = {};
15171
+ if (title !== undefined)
15172
+ apiUpdates.title = title;
15173
+ if (description !== undefined)
15174
+ apiUpdates.description = description;
15175
+ if (avatar !== undefined)
15176
+ apiUpdates.avatar = avatar;
15177
+ if (icon !== undefined)
15178
+ apiUpdates.icon = icon;
15179
+ if (metadata !== undefined)
15180
+ apiUpdates.metadata = metadata;
15181
+ if (Object.keys(apiUpdates).length > 0) {
15182
+ await this.conversationApi.updateConversation(conversationId, apiUpdates);
15183
+ }
15184
+ if (archived !== undefined) {
15185
+ if (archived) {
15186
+ await this.conversationApi.archiveConversation(conversationId);
15187
+ }
15188
+ else {
15189
+ await this.conversationApi.unarchiveConversation(conversationId);
15190
+ }
15191
+ }
14983
15192
  this.state.updateConversation(conversationId, updates);
14984
15193
  }
14985
15194
  catch (error) {
@@ -14994,6 +15203,7 @@ class AXConversationService {
14994
15203
  */
14995
15204
  async updateConversationSettings(conversationId, settings) {
14996
15205
  try {
15206
+ await this.conversationApi.updateConversationSettings(conversationId, settings);
14997
15207
  this.state.updateSettings(conversationId, settings);
14998
15208
  }
14999
15209
  catch (error) {
@@ -15008,6 +15218,7 @@ class AXConversationService {
15008
15218
  */
15009
15219
  async updateConversationTitle(conversationId, title) {
15010
15220
  try {
15221
+ await this.conversationApi.updateConversation(conversationId, { title });
15011
15222
  this.state.updateTitle(conversationId, title);
15012
15223
  }
15013
15224
  catch (error) {
@@ -15022,6 +15233,9 @@ class AXConversationService {
15022
15233
  */
15023
15234
  async updateConversationMetadata(conversationId, metadata) {
15024
15235
  try {
15236
+ const current = this.state.getConversation(conversationId);
15237
+ const mergedMetadata = { ...current?.metadata, ...metadata };
15238
+ await this.conversationApi.updateConversation(conversationId, { metadata: mergedMetadata });
15025
15239
  this.state.updateMetadata(conversationId, metadata);
15026
15240
  }
15027
15241
  catch (error) {
@@ -17483,15 +17697,6 @@ class AXMembersPopoverComponent {
17483
17697
  params: { count: this.conversation().participants.length },
17484
17698
  });
17485
17699
  }
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
17700
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMembersPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17496
17701
  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
17702
  <div class="members-popover">
@@ -17501,15 +17706,12 @@ class AXMembersPopoverComponent {
17501
17706
  <div class="members-list">
17502
17707
  @for (participant of conversation().participants; track participant.id) {
17503
17708
  <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>
17709
+ <ax-conversation-avatar
17710
+ kind="user"
17711
+ [userId]="participant.id"
17712
+ [conversation]="conversation()"
17713
+ [size]="36"
17714
+ />
17513
17715
  <div class="member-info">
17514
17716
  <span class="member-name">{{ participant.name }}</span>
17515
17717
  @if (participant.description) {
@@ -17530,11 +17732,11 @@ class AXMembersPopoverComponent {
17530
17732
  }
17531
17733
  </div>
17532
17734
  </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 }); }
17735
+ `, 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-lightest-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}.member-item:hover{background:rgb(var(--ax-sys-color-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
17736
  }
17535
17737
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMembersPopoverComponent, decorators: [{
17536
17738
  type: Component,
17537
- args: [{ selector: 'ax-conversation-members-popover', imports: [CommonModule, AXAvatarComponent, AXImageComponent, AXLabelComponent, AXDecoratorModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
17739
+ args: [{ selector: 'ax-conversation-members-popover', imports: [CommonModule, AXDecoratorModule, AXConversationAvatarComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
17538
17740
  <div class="members-popover">
17539
17741
  <div class="members-header">
17540
17742
  <span class="members-title">{{ getMembersTitle() }}</span>
@@ -17542,15 +17744,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
17542
17744
  <div class="members-list">
17543
17745
  @for (participant of conversation().participants; track participant.id) {
17544
17746
  <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>
17747
+ <ax-conversation-avatar
17748
+ kind="user"
17749
+ [userId]="participant.id"
17750
+ [conversation]="conversation()"
17751
+ [size]="36"
17752
+ />
17554
17753
  <div class="member-info">
17555
17754
  <span class="member-name">{{ participant.name }}</span>
17556
17755
  @if (participant.description) {
@@ -17571,7 +17770,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
17571
17770
  }
17572
17771
  </div>
17573
17772
  </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"] }]
17773
+ `, 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-lightest-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}.member-item:hover{background:rgb(var(--ax-sys-color-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
17774
  }] });
17576
17775
 
17577
17776
  /**
@@ -17640,16 +17839,6 @@ class AXInfoBarComponent {
17640
17839
  getSubtitle(conversation) {
17641
17840
  return AXConversationMessageUtilsService.getConversationSubtitle(conversation);
17642
17841
  }
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
17842
  /** Handle avatar click */
17654
17843
  onAvatarClick() {
17655
17844
  this.avatarClick.emit();
@@ -17777,23 +17966,12 @@ class AXInfoBarComponent {
17777
17966
  tabindex="0"
17778
17967
  (keydown.enter)="onAvatarClick()"
17779
17968
  >
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
- }
17969
+ <ax-conversation-avatar
17970
+ kind="auto"
17971
+ [conversation]="conversation"
17972
+ [size]="48"
17973
+ [showStatus]="conversation.type === 'private'"
17974
+ />
17797
17975
  </div>
17798
17976
 
17799
17977
  <div class="info-details">
@@ -17895,21 +18073,20 @@ class AXInfoBarComponent {
17895
18073
  </div>
17896
18074
  }
17897
18075
  }
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 }); }
18076
+ `, 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
18077
  }
17900
18078
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXInfoBarComponent, decorators: [{
17901
18079
  type: Component,
17902
18080
  args: [{ selector: 'ax-conversation-info-bar', imports: [
17903
18081
  CommonModule,
17904
18082
  NgComponentOutlet,
17905
- AXAvatarComponent,
17906
18083
  AXButtonModule,
17907
18084
  AXDropdownPanelComponent,
17908
18085
  AXDecoratorModule,
17909
- AXImageComponent,
17910
18086
  AXLabelComponent,
17911
18087
  AXPopoverComponent,
17912
18088
  AXMembersPopoverComponent,
18089
+ AXConversationAvatarComponent,
17913
18090
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
17914
18091
  @if (activeConversation(); as conversation) {
17915
18092
  <div class="info-bar">
@@ -17923,23 +18100,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
17923
18100
  tabindex="0"
17924
18101
  (keydown.enter)="onAvatarClick()"
17925
18102
  >
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
- }
18103
+ <ax-conversation-avatar
18104
+ kind="auto"
18105
+ [conversation]="conversation"
18106
+ [size]="48"
18107
+ [showStatus]="conversation.type === 'private'"
18108
+ />
17943
18109
  </div>
17944
18110
 
17945
18111
  <div class="info-details">
@@ -18041,7 +18207,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
18041
18207
  </div>
18042
18208
  }
18043
18209
  }
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"] }]
18210
+ `, 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
18211
  }] });
18046
18212
 
18047
18213
  class AXForwardMessageDialogComponent {
@@ -18097,18 +18263,6 @@ class AXForwardMessageDialogComponent {
18097
18263
  isSelected(conversationId) {
18098
18264
  return this.selectedConversationIds().includes(conversationId);
18099
18265
  }
18100
- getInitials(name) {
18101
- const parts = name.trim().split(/\s+/).filter(Boolean).slice(0, 2);
18102
- if (parts.length === 0)
18103
- return '?';
18104
- return parts.map((p) => p.charAt(0).toUpperCase()).join('');
18105
- }
18106
- getConversationAvatar(conversation) {
18107
- return AXConversationMessageUtilsService.getConversationAvatar(conversation);
18108
- }
18109
- getConversationAvatarIcon(conversation) {
18110
- return AXConversationMessageUtilsService.getConversationAvatarIcon(conversation);
18111
- }
18112
18266
  getFilteredConversationsForForward() {
18113
18267
  const q = this.forwardSearchQuery().toLowerCase().trim();
18114
18268
  let items = this.allConversations();
@@ -18172,10 +18326,12 @@ class AXForwardMessageDialogComponent {
18172
18326
  }
18173
18327
  }
18174
18328
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXForwardMessageDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18175
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXForwardMessageDialogComponent, isStandalone: true, selector: "ax-forward-message-dialog", inputs: { __popup__: { classPropertyName: "__popup__", publicName: "__popup__", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: AXClosableComponent, useExisting: AXForwardMessageDialogComponent }], viewQueries: [{ propertyName: "forwardListEmptyTpl", first: true, predicate: ["forwardListEmpty"], descendants: true, isSignal: true }, { propertyName: "forwardList", first: true, predicate: ["forwardList"], descendants: true, isSignal: true }], ngImport: i0, template: `
18329
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXForwardMessageDialogComponent, isStandalone: true, selector: "ax-forward-message-dialog", inputs: { __popup__: { classPropertyName: "__popup__", publicName: "__popup__", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
18330
+ { provide: AXClosableComponent, useExisting: AXForwardMessageDialogComponent },
18331
+ ], viewQueries: [{ propertyName: "forwardListEmptyTpl", first: true, predicate: ["forwardListEmpty"], descendants: true, isSignal: true }, { propertyName: "forwardList", first: true, predicate: ["forwardList"], descendants: true, isSignal: true }], ngImport: i0, template: `
18176
18332
  <div class="forward-message-dialog">
18177
18333
  <ng-template #forwardListEmpty>
18178
- <div class="users-list-empty">
18334
+ <div class="forward-list-empty">
18179
18335
  @if (forwardSearchQuery()) {
18180
18336
  {{ '@acorex:chat.dialog.forward-message.no-conversations-search' | translate | async }}
18181
18337
  } @else {
@@ -18185,53 +18341,45 @@ class AXForwardMessageDialogComponent {
18185
18341
  </ng-template>
18186
18342
 
18187
18343
  <div class="dialog-content">
18188
- <div class="form-field">
18189
- <div class="users-list-wrap">
18190
- <ax-list
18191
- #forwardList
18192
- class="users-list"
18193
- [dataSource]="forwardListDataSource"
18194
- [multiple]="true"
18195
- [valueField]="'id'"
18196
- [textField]="'title'"
18197
- [checkbox]="false"
18198
- [itemHeight]="58"
18199
- [ngModel]="selectedConversationIds()"
18200
- (ngModelChange)="selectedConversationIds.set($event ?? [])"
18201
- [emptyTemplate]="forwardListEmptyTpl()"
18202
- [itemTemplate]="forwardItemTpl"
18203
- >
18204
- <ax-header class="users-list-header">
18205
- <div class="users-list-header-inner">
18206
- <ax-search-box
18207
- [value]="forwardSearchQuery()"
18208
- (valueChange)="onForwardSearchChange($event)"
18209
- [placeholder]="'@acorex:chat.placeholders.search-conversations' | translate | async"
18210
- ></ax-search-box>
18211
- </div>
18212
- </ax-header>
18213
- </ax-list>
18214
- </div>
18344
+ <div class="forward-list-wrap">
18345
+ <ax-list
18346
+ #forwardList
18347
+ class="forward-list"
18348
+ [dataSource]="forwardListDataSource"
18349
+ [multiple]="true"
18350
+ [valueField]="'id'"
18351
+ [textField]="'title'"
18352
+ [checkbox]="false"
18353
+ [itemHeight]="52"
18354
+ [ngModel]="selectedConversationIds()"
18355
+ (ngModelChange)="selectedConversationIds.set($event ?? [])"
18356
+ [emptyTemplate]="forwardListEmptyTpl()"
18357
+ [itemTemplate]="forwardItemTpl"
18358
+ >
18359
+ <ax-header class="forward-list-header">
18360
+ <div class="forward-list-header-inner">
18361
+ <ax-search-box
18362
+ [value]="forwardSearchQuery()"
18363
+ (valueChange)="onForwardSearchChange($event)"
18364
+ [placeholder]="'@acorex:chat.placeholders.search-conversations' | translate | async"
18365
+ ></ax-search-box>
18366
+ </div>
18367
+ </ax-header>
18368
+ </ax-list>
18215
18369
  </div>
18216
18370
  </div>
18371
+
18217
18372
  <ng-template #forwardItemTpl let-item>
18218
18373
  @if (conversationFromItem(item); as conversation) {
18219
- <div class="ax-label-container forward-item-content">
18374
+ <div class="forward-item-content">
18220
18375
  <input class="ax-checkbox" type="checkbox" [checked]="isSelected(conversation.id)" tabindex="0" />
18221
- <ax-avatar [size]="36" [color]="'primary'">
18222
- @if (getConversationAvatar(conversation); as avatar) {
18223
- <ax-image [src]="avatar" [alt]="conversation.title"></ax-image>
18224
- } @else if (getConversationAvatarIcon(conversation); as icon) {
18225
- <i [class]="icon" aria-hidden="true"></i>
18226
- } @else {
18227
- <ax-label>{{ getInitials(conversation.title) }}</ax-label>
18228
- }
18229
- </ax-avatar>
18230
- <span class="ax-checkbox-label ax-truncated forward-title-text">{{ conversation.title }}</span>
18376
+ <ax-conversation-avatar kind="auto" [conversation]="conversation" [size]="36" />
18377
+ <span class="forward-title-text ax-truncated">{{ conversation.title }}</span>
18231
18378
  </div>
18232
18379
  }
18233
18380
  </ng-template>
18234
- <ax-footer>
18381
+
18382
+ <ax-footer class="dialog-footer">
18235
18383
  <ax-suffix>
18236
18384
  <ax-button [text]="'@acorex:chat.actions.cancel' | translate | async" [look]="'solid'" (onClick)="onCancel()"></ax-button>
18237
18385
  <ax-button
@@ -18244,25 +18392,23 @@ class AXForwardMessageDialogComponent {
18244
18392
  </ax-suffix>
18245
18393
  </ax-footer>
18246
18394
  </div>
18247
- `, isInline: true, styles: [":host{display:block}.forward-message-dialog{display:flex;flex-direction:column}.form-field{display:flex;flex-direction:column;gap:.35rem}.field-label{font-size:.875rem;font-weight:500;color:var(--ax-text-secondary, #6b7280)}.forward-list-wrap{height:280px;overflow:hidden}.forward-list{display:block;height:100%}.forward-list-header{display:block;position:sticky;top:0;z-index:1;background:rgba(var(--ax-sys-color-lightest-surface));border-bottom:1px solid rgba(var(--ax-sys-color-border-lightest-surface))}.forward-list-header-inner{padding:.5rem .75rem}.forward-list-empty{padding:1rem;text-align:center;font-size:.875rem;color:var(--ax-text-secondary, #6b7280)}.users-list-wrap{height:260px;overflow:hidden;// border: 1px solid rgb(var(--ax-sys-color-border-light-surface));// border-radius: .65rem;// background: rgb(var(--ax-sys-color-surface))}.users-list{display:block;height:100%}.users-list-header{display:block;position:sticky;top:0;z-index:1;// background: rgb(var(--ax-sys-color-lightest-surface));border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.users-list-header-inner{padding:.5rem .625rem}.forward-item-content{height:100%;display:flex;align-items:center;gap:.6rem;padding:.1rem .75rem;min-width:0}.forward-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;font-weight:500}.users-list-empty{padding:1rem;text-align:center;font-size:.85rem;opacity:.7}\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: "component", type: AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "textTemplate", "disabledField", "multiple", "selectionMode", "isItemTruncated", "showItemTooltip", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readonlyChange", "onBlur", "onFocus", "onItemClick", "onItemSelected", "onScrolledIndexChanged"] }, { 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: 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: 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: 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: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }] }); }
18395
+ `, isInline: true, styles: [":host{display:block}.forward-message-dialog{display:flex;flex-direction:column;width:100%;overflow:hidden}.dialog-content{flex:1;min-height:0;overflow:hidden}.forward-list-wrap{height:min(50vh,24rem);overflow:hidden}.forward-list{display:block;height:100%}.forward-list-header{display:block;position:sticky;top:0;z-index:1;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.forward-list-header-inner{padding:.5rem .75rem}.forward-item-content{display:flex;align-items:center;gap:.75rem;height:100%;padding:.5rem;min-width:0;border-radius:.5rem;transition:background-color .2s ease}.forward-title-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;font-weight:500;line-height:1.25rem;color:rgb(var(--ax-sys-color-on-surface))}.forward-list-empty{padding:1.25rem 1rem;text-align:center;font-size:.875rem;opacity:.72;color:rgb(var(--ax-sys-color-on-surface))}.dialog-footer{flex-shrink:0}\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: "component", type: AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "textTemplate", "disabledField", "multiple", "selectionMode", "isItemTruncated", "showItemTooltip", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readonlyChange", "onBlur", "onFocus", "onItemClick", "onItemSelected", "onScrolledIndexChanged"] }, { 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: 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: 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: 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18248
18396
  }
18249
18397
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXForwardMessageDialogComponent, decorators: [{
18250
18398
  type: Component,
18251
- args: [{ selector: 'ax-forward-message-dialog', imports: [
18399
+ args: [{ selector: 'ax-forward-message-dialog', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
18252
18400
  CommonModule,
18253
18401
  FormsModule,
18254
18402
  AXListComponent,
18255
18403
  AXSearchBoxComponent,
18256
18404
  AXButtonComponent,
18257
18405
  AXDecoratorGenericComponent,
18258
- AXAvatarComponent,
18259
- AXImageComponent,
18260
- AXLabelComponent,
18406
+ AXConversationAvatarComponent,
18261
18407
  AXTranslationModule,
18262
18408
  ], template: `
18263
18409
  <div class="forward-message-dialog">
18264
18410
  <ng-template #forwardListEmpty>
18265
- <div class="users-list-empty">
18411
+ <div class="forward-list-empty">
18266
18412
  @if (forwardSearchQuery()) {
18267
18413
  {{ '@acorex:chat.dialog.forward-message.no-conversations-search' | translate | async }}
18268
18414
  } @else {
@@ -18272,53 +18418,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
18272
18418
  </ng-template>
18273
18419
 
18274
18420
  <div class="dialog-content">
18275
- <div class="form-field">
18276
- <div class="users-list-wrap">
18277
- <ax-list
18278
- #forwardList
18279
- class="users-list"
18280
- [dataSource]="forwardListDataSource"
18281
- [multiple]="true"
18282
- [valueField]="'id'"
18283
- [textField]="'title'"
18284
- [checkbox]="false"
18285
- [itemHeight]="58"
18286
- [ngModel]="selectedConversationIds()"
18287
- (ngModelChange)="selectedConversationIds.set($event ?? [])"
18288
- [emptyTemplate]="forwardListEmptyTpl()"
18289
- [itemTemplate]="forwardItemTpl"
18290
- >
18291
- <ax-header class="users-list-header">
18292
- <div class="users-list-header-inner">
18293
- <ax-search-box
18294
- [value]="forwardSearchQuery()"
18295
- (valueChange)="onForwardSearchChange($event)"
18296
- [placeholder]="'@acorex:chat.placeholders.search-conversations' | translate | async"
18297
- ></ax-search-box>
18298
- </div>
18299
- </ax-header>
18300
- </ax-list>
18301
- </div>
18421
+ <div class="forward-list-wrap">
18422
+ <ax-list
18423
+ #forwardList
18424
+ class="forward-list"
18425
+ [dataSource]="forwardListDataSource"
18426
+ [multiple]="true"
18427
+ [valueField]="'id'"
18428
+ [textField]="'title'"
18429
+ [checkbox]="false"
18430
+ [itemHeight]="52"
18431
+ [ngModel]="selectedConversationIds()"
18432
+ (ngModelChange)="selectedConversationIds.set($event ?? [])"
18433
+ [emptyTemplate]="forwardListEmptyTpl()"
18434
+ [itemTemplate]="forwardItemTpl"
18435
+ >
18436
+ <ax-header class="forward-list-header">
18437
+ <div class="forward-list-header-inner">
18438
+ <ax-search-box
18439
+ [value]="forwardSearchQuery()"
18440
+ (valueChange)="onForwardSearchChange($event)"
18441
+ [placeholder]="'@acorex:chat.placeholders.search-conversations' | translate | async"
18442
+ ></ax-search-box>
18443
+ </div>
18444
+ </ax-header>
18445
+ </ax-list>
18302
18446
  </div>
18303
18447
  </div>
18448
+
18304
18449
  <ng-template #forwardItemTpl let-item>
18305
18450
  @if (conversationFromItem(item); as conversation) {
18306
- <div class="ax-label-container forward-item-content">
18451
+ <div class="forward-item-content">
18307
18452
  <input class="ax-checkbox" type="checkbox" [checked]="isSelected(conversation.id)" tabindex="0" />
18308
- <ax-avatar [size]="36" [color]="'primary'">
18309
- @if (getConversationAvatar(conversation); as avatar) {
18310
- <ax-image [src]="avatar" [alt]="conversation.title"></ax-image>
18311
- } @else if (getConversationAvatarIcon(conversation); as icon) {
18312
- <i [class]="icon" aria-hidden="true"></i>
18313
- } @else {
18314
- <ax-label>{{ getInitials(conversation.title) }}</ax-label>
18315
- }
18316
- </ax-avatar>
18317
- <span class="ax-checkbox-label ax-truncated forward-title-text">{{ conversation.title }}</span>
18453
+ <ax-conversation-avatar kind="auto" [conversation]="conversation" [size]="36" />
18454
+ <span class="forward-title-text ax-truncated">{{ conversation.title }}</span>
18318
18455
  </div>
18319
18456
  }
18320
18457
  </ng-template>
18321
- <ax-footer>
18458
+
18459
+ <ax-footer class="dialog-footer">
18322
18460
  <ax-suffix>
18323
18461
  <ax-button [text]="'@acorex:chat.actions.cancel' | translate | async" [look]="'solid'" (onClick)="onCancel()"></ax-button>
18324
18462
  <ax-button
@@ -18331,7 +18469,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
18331
18469
  </ax-suffix>
18332
18470
  </ax-footer>
18333
18471
  </div>
18334
- `, providers: [{ provide: AXClosableComponent, useExisting: AXForwardMessageDialogComponent }], styles: [":host{display:block}.forward-message-dialog{display:flex;flex-direction:column}.form-field{display:flex;flex-direction:column;gap:.35rem}.field-label{font-size:.875rem;font-weight:500;color:var(--ax-text-secondary, #6b7280)}.forward-list-wrap{height:280px;overflow:hidden}.forward-list{display:block;height:100%}.forward-list-header{display:block;position:sticky;top:0;z-index:1;background:rgba(var(--ax-sys-color-lightest-surface));border-bottom:1px solid rgba(var(--ax-sys-color-border-lightest-surface))}.forward-list-header-inner{padding:.5rem .75rem}.forward-list-empty{padding:1rem;text-align:center;font-size:.875rem;color:var(--ax-text-secondary, #6b7280)}.users-list-wrap{height:260px;overflow:hidden;// border: 1px solid rgb(var(--ax-sys-color-border-light-surface));// border-radius: .65rem;// background: rgb(var(--ax-sys-color-surface))}.users-list{display:block;height:100%}.users-list-header{display:block;position:sticky;top:0;z-index:1;// background: rgb(var(--ax-sys-color-lightest-surface));border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.users-list-header-inner{padding:.5rem .625rem}.forward-item-content{height:100%;display:flex;align-items:center;gap:.6rem;padding:.1rem .75rem;min-width:0}.forward-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;font-weight:500}.users-list-empty{padding:1rem;text-align:center;font-size:.85rem;opacity:.7}\n"] }]
18472
+ `, providers: [
18473
+ { provide: AXClosableComponent, useExisting: AXForwardMessageDialogComponent },
18474
+ ], styles: [":host{display:block}.forward-message-dialog{display:flex;flex-direction:column;width:100%;overflow:hidden}.dialog-content{flex:1;min-height:0;overflow:hidden}.forward-list-wrap{height:min(50vh,24rem);overflow:hidden}.forward-list{display:block;height:100%}.forward-list-header{display:block;position:sticky;top:0;z-index:1;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.forward-list-header-inner{padding:.5rem .75rem}.forward-item-content{display:flex;align-items:center;gap:.75rem;height:100%;padding:.5rem;min-width:0;border-radius:.5rem;transition:background-color .2s ease}.forward-title-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;font-weight:500;line-height:1.25rem;color:rgb(var(--ax-sys-color-on-surface))}.forward-list-empty{padding:1.25rem 1rem;text-align:center;font-size:.875rem;opacity:.72;color:rgb(var(--ax-sys-color-on-surface))}.dialog-footer{flex-shrink:0}\n"] }]
18335
18475
  }] });
18336
18476
 
18337
18477
  /**
@@ -18665,8 +18805,6 @@ class AXMessageListComponent {
18665
18805
  this.config = inject(CONVERSATION_CONFIG);
18666
18806
  /** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */
18667
18807
  this.noActiveFallbackComponent = AXMessageListNoActiveDefaultComponent;
18668
- /** Custom avatar template for message list items */
18669
- this.avatarTemplate = input(null, ...(ngDevMode ? [{ debugName: "avatarTemplate" }] : []));
18670
18808
  // Timeout cleanup to prevent memory leaks
18671
18809
  this.timeouts = new Set();
18672
18810
  // Store reply and forward counts from API
@@ -18926,20 +19064,6 @@ class AXMessageListComponent {
18926
19064
  return this.translation.translateSync('@acorex:chat.fallbacks.unknown-user');
18927
19065
  return AXConversationMessageUtilsService.getSenderName(message, conversation);
18928
19066
  }
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
19067
  /** Get original sender name for forwarded messages */
18944
19068
  getOriginalSenderName(message) {
18945
19069
  // Use new forwardedFrom object if available
@@ -19112,10 +19236,6 @@ class AXMessageListComponent {
19112
19236
  getMessageActions(message) {
19113
19237
  return this.messageListService.getMenuActions(message);
19114
19238
  }
19115
- /** Get initials from name */
19116
- getInitials(name) {
19117
- return AXConversationMessageUtilsService.getInitials(name);
19118
- }
19119
19239
  /** Handle reaction click */
19120
19240
  onReactionClick(message, emoji) {
19121
19241
  this.messageListService.reactToMessage(message.id, emoji);
@@ -19400,7 +19520,7 @@ class AXMessageListComponent {
19400
19520
  return message.id;
19401
19521
  }
19402
19522
  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: `
19523
+ 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
19524
  @if (activeConversation(); as conv) {
19405
19525
  @for (cid of [conv.id]; track cid) {
19406
19526
  <div
@@ -19490,35 +19610,13 @@ class AXMessageListComponent {
19490
19610
  <!-- Avatar (only for group conversations and received messages) -->
19491
19611
  @if (shouldShowAvatar(message)) {
19492
19612
  <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
- }
19613
+ <ax-conversation-avatar
19614
+ kind="user"
19615
+ [userId]="message.senderId"
19616
+ [conversation]="activeConversation()"
19617
+ [message]="message"
19618
+ [size]="32"
19619
+ />
19522
19620
  </div>
19523
19621
  }
19524
19622
 
@@ -19735,18 +19833,16 @@ class AXMessageListComponent {
19735
19833
  </div>
19736
19834
  </div>
19737
19835
  }
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 }); }
19836
+ `, 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
19837
  }
19740
19838
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListComponent, decorators: [{
19741
19839
  type: Component,
19742
19840
  args: [{ selector: 'ax-conversation-message-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
19743
19841
  CommonModule,
19744
19842
  AXBadgeComponent,
19745
- AXAvatarComponent,
19746
19843
  AXButtonModule,
19747
19844
  AXContextMenuComponent,
19748
19845
  AXDecoratorModule,
19749
- AXImageComponent,
19750
19846
  AXLabelComponent,
19751
19847
  AXLoadingComponent,
19752
19848
  AXFormatModule,
@@ -19755,6 +19851,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
19755
19851
  AXTranslationModule,
19756
19852
  AXInfiniteScrollDirective,
19757
19853
  AXUploaderZoneDirective,
19854
+ AXConversationAvatarComponent,
19758
19855
  ], template: `
19759
19856
  @if (activeConversation(); as conv) {
19760
19857
  @for (cid of [conv.id]; track cid) {
@@ -19845,35 +19942,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
19845
19942
  <!-- Avatar (only for group conversations and received messages) -->
19846
19943
  @if (shouldShowAvatar(message)) {
19847
19944
  <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
- }
19945
+ <ax-conversation-avatar
19946
+ kind="user"
19947
+ [userId]="message.senderId"
19948
+ [conversation]="activeConversation()"
19949
+ [message]="message"
19950
+ [size]="32"
19951
+ />
19877
19952
  </div>
19878
19953
  }
19879
19954
 
@@ -20101,7 +20176,6 @@ class AXConversationItemComponent {
20101
20176
  constructor() {
20102
20177
  this.conversationService = inject(AXConversationService);
20103
20178
  this.infoBarService = inject(AXInfoBarService);
20104
- this.avatarTemplate = input(null, ...(ngDevMode ? [{ debugName: "avatarTemplate" }] : []));
20105
20179
  /** Conversation data */
20106
20180
  this.conversation = input.required(...(ngDevMode ? [{ debugName: "conversation" }] : []));
20107
20181
  /** Click event */
@@ -20130,10 +20204,6 @@ class AXConversationItemComponent {
20130
20204
  }
20131
20205
  return classes.join(' ');
20132
20206
  }, ...(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
20207
  /** Typing indicator text - delegate to utils */
20138
20208
  this.typingText = computed(() => {
20139
20209
  return AXConversationMessageUtilsService.getTypingText(this.liveConversation());
@@ -20150,16 +20220,6 @@ class AXConversationItemComponent {
20150
20220
  get registry() {
20151
20221
  return this.conversationService.registry;
20152
20222
  }
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
20223
  getPreviewTypeKey(type) {
20164
20224
  switch (type) {
20165
20225
  case 'image':
@@ -20222,7 +20282,7 @@ class AXConversationItemComponent {
20222
20282
  }
20223
20283
  }
20224
20284
  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: `
20285
+ 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
20286
  <div
20227
20287
  [class]="itemClasses()"
20228
20288
  [id]="'conversation-item-' + conversation().id"
@@ -20235,36 +20295,12 @@ class AXConversationItemComponent {
20235
20295
  >
20236
20296
  <!-- Avatar -->
20237
20297
  <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>
20298
+ <ax-conversation-avatar
20299
+ kind="auto"
20300
+ [conversation]="liveConversation()"
20301
+ [size]="48"
20302
+ [showStatus]="conversation().type === 'private'"
20303
+ />
20268
20304
  </div>
20269
20305
 
20270
20306
  <!-- Content -->
@@ -20327,21 +20363,19 @@ class AXConversationItemComponent {
20327
20363
  (onItemClick)="handleContextMenuItemClick($event)"
20328
20364
  >
20329
20365
  </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 }); }
20366
+ `, 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
20367
  }
20332
20368
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationItemComponent, decorators: [{
20333
20369
  type: Component,
20334
20370
  args: [{ selector: 'ax-conversation-item', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
20335
20371
  CommonModule,
20336
20372
  AXDecoratorModule,
20337
- AXAvatarComponent,
20338
20373
  AXBadgeComponent,
20339
- AXImageComponent,
20340
- AXLabelComponent,
20341
20374
  AXContextMenuComponent,
20342
20375
  AXFormatModule,
20343
20376
  AXDateTimeModule,
20344
20377
  AXTranslationModule,
20378
+ AXConversationAvatarComponent,
20345
20379
  ], template: `
20346
20380
  <div
20347
20381
  [class]="itemClasses()"
@@ -20355,36 +20389,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
20355
20389
  >
20356
20390
  <!-- Avatar -->
20357
20391
  <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>
20392
+ <ax-conversation-avatar
20393
+ kind="auto"
20394
+ [conversation]="liveConversation()"
20395
+ [size]="48"
20396
+ [showStatus]="conversation().type === 'private'"
20397
+ />
20388
20398
  </div>
20389
20399
 
20390
20400
  <!-- Content -->
@@ -20447,7 +20457,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
20447
20457
  (onItemClick)="handleContextMenuItemClick($event)"
20448
20458
  >
20449
20459
  </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"] }]
20460
+ `, 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
20461
  }] });
20452
20462
 
20453
20463
  class AXNewConversationDialogComponent extends AXBasePageComponent {
@@ -20564,12 +20574,6 @@ class AXNewConversationDialogComponent extends AXBasePageComponent {
20564
20574
  return null;
20565
20575
  return item.data ?? null;
20566
20576
  }
20567
- getInitials(name) {
20568
- if (!name.trim())
20569
- return '?';
20570
- const parts = name.trim().split(/\s+/).slice(0, 2);
20571
- return parts.map((p) => p.charAt(0).toUpperCase()).join('');
20572
- }
20573
20577
  filteredUsers() {
20574
20578
  const q = this.searchQuery().toLowerCase().trim();
20575
20579
  if (!q)
@@ -20620,7 +20624,9 @@ class AXNewConversationDialogComponent extends AXBasePageComponent {
20620
20624
  }
20621
20625
  }
20622
20626
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXNewConversationDialogComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
20623
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXNewConversationDialogComponent, isStandalone: true, selector: "ax-new-conversation-dialog", inputs: { __popup__: { classPropertyName: "__popup__", publicName: "__popup__", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: AXClosableComponent, useExisting: AXNewConversationDialogComponent }], viewQueries: [{ propertyName: "usersListEmptyTpl", first: true, predicate: ["usersListEmpty"], descendants: true, isSignal: true }, { propertyName: "usersList", first: true, predicate: ["usersList"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
20627
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXNewConversationDialogComponent, isStandalone: true, selector: "ax-new-conversation-dialog", inputs: { __popup__: { classPropertyName: "__popup__", publicName: "__popup__", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
20628
+ { provide: AXClosableComponent, useExisting: AXNewConversationDialogComponent },
20629
+ ], viewQueries: [{ propertyName: "usersListEmptyTpl", first: true, predicate: ["usersListEmpty"], descendants: true, isSignal: true }, { propertyName: "usersList", first: true, predicate: ["usersList"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
20624
20630
  <div class="new-conversation-panel">
20625
20631
  <div class="new-conversation-dialog-content">
20626
20632
  @if (showUserPickerStep()) {
@@ -20634,7 +20640,7 @@ class AXNewConversationDialogComponent extends AXBasePageComponent {
20634
20640
  [checkbox]="false"
20635
20641
  [valueField]="'id'"
20636
20642
  [textField]="'name'"
20637
- [itemHeight]="'auto'"
20643
+ [itemHeight]="52"
20638
20644
  [ngModel]="selectedUserIds()"
20639
20645
  (ngModelChange)="onSelectedUsersChange($event ?? [])"
20640
20646
  [emptyTemplate]="usersListEmptyTpl()"
@@ -20713,13 +20719,14 @@ class AXNewConversationDialogComponent extends AXBasePageComponent {
20713
20719
  @if (userFromItem(item); as user) {
20714
20720
  <div class="user-item-content">
20715
20721
  <input class="ax-checkbox" type="checkbox" [checked]="isUserSelected(user.id)" tabindex="0" />
20716
- <ax-avatar [size]="54" [color]="'primary'">
20717
- @if (user.avatar) {
20718
- <ax-image [src]="user.avatar" [alt]="user.name"></ax-image>
20719
- } @else {
20720
- <ax-label>{{ getInitials(user.name) }}</ax-label>
20721
- }
20722
- </ax-avatar>
20722
+ <ax-conversation-avatar
20723
+ kind="user"
20724
+ [userId]="user.id"
20725
+ [size]="48"
20726
+ [name]="user.name"
20727
+ [avatar]="user.avatar"
20728
+ [icon]="user.icon"
20729
+ />
20723
20730
  <div class="user-item-text">
20724
20731
  <span class="ax-truncated user-name-text">{{ user.name }}</span>
20725
20732
  @if (user.description) {
@@ -20729,7 +20736,7 @@ class AXNewConversationDialogComponent extends AXBasePageComponent {
20729
20736
  </div>
20730
20737
  }
20731
20738
  </ng-template>
20732
- `, isInline: true, styles: [":host{display:block}.new-conversation-panel{display:flex;flex-direction:column;width:100%;overflow:hidden}.new-conversation-dialog-content{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;gap:.75rem}.form-field--grow{flex:1;min-height:0;display:flex;flex-direction:column}.group-details-step{flex:1;min-height:0;padding:.5rem .75rem;display:flex;flex-direction:column;gap:.75rem}.form-field{display:flex;flex-direction:column;gap:.35rem}.field-label{font-size:.875rem;font-weight:500;color:var(--ax-text-secondary, #6b7280)}.title-input{height:2.25rem;border-radius:.5rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-lighter-surface));padding:0 .7rem;color:rgb(var(--ax-sys-color-on-surface));font:inherit}.title-input:focus{outline:2px solid rgba(var(--ax-sys-color-primary-500),.25);outline-offset:0}.users-list-wrap{height:min(50vh,36rem);overflow:hidden}.users-list{display:block;height:100%}.users-list-header{display:block;position:sticky;top:0;z-index:1;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.users-list-header-inner{padding:.5rem .75rem}.user-item-content{display:flex;align-items:center;gap:.5rem;height:100%;padding:.5rem .75rem;min-width:0}.user-item-text{display:flex;flex-direction:column;justify-content:center;min-width:0;flex:1;gap:.1rem}.user-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1rem;line-height:1.5rem;font-weight:500}.user-description-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;line-height:1.25rem;font-weight:400;opacity:.72;color:rgb(var(--ax-sys-color-on-surface))}.users-list-empty{padding:1rem;text-align:center;font-size:.85rem;opacity:.7}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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: "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: AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "textTemplate", "disabledField", "multiple", "selectionMode", "isItemTruncated", "showItemTooltip", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readonlyChange", "onBlur", "onFocus", "onItemClick", "onItemSelected", "onScrolledIndexChanged"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { 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: 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: 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: 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
20739
+ `, isInline: true, styles: [":host{display:block}.new-conversation-panel{display:flex;flex-direction:column;width:100%;overflow:hidden}.new-conversation-dialog-content{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;gap:.75rem}.form-field--grow{flex:1;min-height:0;display:flex;flex-direction:column}.group-details-step{flex:1;min-height:0;padding:.5rem .75rem;display:flex;flex-direction:column;gap:.75rem}.form-field{display:flex;flex-direction:column;gap:.35rem}.field-label{font-size:.875rem;font-weight:500;color:var(--ax-text-secondary, #6b7280)}.title-input{height:2.25rem;border-radius:.5rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-lighter-surface));padding:0 .7rem;color:rgb(var(--ax-sys-color-on-surface));font:inherit}.title-input:focus{outline:2px solid rgba(var(--ax-sys-color-primary-500),.25);outline-offset:0}.users-list-wrap{height:min(50vh,36rem);overflow:hidden}.users-list{display:block;height:100%}.users-list-header{display:block;position:sticky;top:0;z-index:1;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.users-list-header-inner{padding:.5rem .75rem}.user-item-content{display:flex;align-items:center;gap:.75rem;height:100%;padding:.5rem .75rem;min-width:0}.user-item-text{display:flex;flex-direction:column;justify-content:center;min-width:0;flex:1;gap:.125rem}.user-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;line-height:1.25rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface))}.user-description-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;line-height:1.25rem;font-weight:400;opacity:.72;color:rgb(var(--ax-sys-color-on-surface))}.users-list-empty{padding:1rem;text-align:center;font-size:.85rem;opacity:.7}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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: "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: AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "textTemplate", "disabledField", "multiple", "selectionMode", "isItemTruncated", "showItemTooltip", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readonlyChange", "onBlur", "onFocus", "onItemClick", "onItemSelected", "onScrolledIndexChanged"] }, { 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: 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: 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
20733
20740
  }
20734
20741
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXNewConversationDialogComponent, decorators: [{
20735
20742
  type: Component,
@@ -20738,14 +20745,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
20738
20745
  FormsModule,
20739
20746
  AXButtonComponent,
20740
20747
  AXListComponent,
20741
- AXLabelComponent,
20742
20748
  AXSearchBoxComponent,
20743
- AXAvatarComponent,
20744
- AXImageComponent,
20745
20749
  AXDecoratorGenericComponent,
20746
20750
  AXAvatarPickerComponent,
20751
+ AXConversationAvatarComponent,
20747
20752
  AXTranslationModule,
20748
- ], providers: [{ provide: AXClosableComponent, useExisting: AXNewConversationDialogComponent }], template: `
20753
+ ], providers: [
20754
+ { provide: AXClosableComponent, useExisting: AXNewConversationDialogComponent },
20755
+ ], template: `
20749
20756
  <div class="new-conversation-panel">
20750
20757
  <div class="new-conversation-dialog-content">
20751
20758
  @if (showUserPickerStep()) {
@@ -20759,7 +20766,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
20759
20766
  [checkbox]="false"
20760
20767
  [valueField]="'id'"
20761
20768
  [textField]="'name'"
20762
- [itemHeight]="'auto'"
20769
+ [itemHeight]="52"
20763
20770
  [ngModel]="selectedUserIds()"
20764
20771
  (ngModelChange)="onSelectedUsersChange($event ?? [])"
20765
20772
  [emptyTemplate]="usersListEmptyTpl()"
@@ -20838,13 +20845,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
20838
20845
  @if (userFromItem(item); as user) {
20839
20846
  <div class="user-item-content">
20840
20847
  <input class="ax-checkbox" type="checkbox" [checked]="isUserSelected(user.id)" tabindex="0" />
20841
- <ax-avatar [size]="54" [color]="'primary'">
20842
- @if (user.avatar) {
20843
- <ax-image [src]="user.avatar" [alt]="user.name"></ax-image>
20844
- } @else {
20845
- <ax-label>{{ getInitials(user.name) }}</ax-label>
20846
- }
20847
- </ax-avatar>
20848
+ <ax-conversation-avatar
20849
+ kind="user"
20850
+ [userId]="user.id"
20851
+ [size]="48"
20852
+ [name]="user.name"
20853
+ [avatar]="user.avatar"
20854
+ [icon]="user.icon"
20855
+ />
20848
20856
  <div class="user-item-text">
20849
20857
  <span class="ax-truncated user-name-text">{{ user.name }}</span>
20850
20858
  @if (user.description) {
@@ -20854,7 +20862,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
20854
20862
  </div>
20855
20863
  }
20856
20864
  </ng-template>
20857
- `, styles: [":host{display:block}.new-conversation-panel{display:flex;flex-direction:column;width:100%;overflow:hidden}.new-conversation-dialog-content{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;gap:.75rem}.form-field--grow{flex:1;min-height:0;display:flex;flex-direction:column}.group-details-step{flex:1;min-height:0;padding:.5rem .75rem;display:flex;flex-direction:column;gap:.75rem}.form-field{display:flex;flex-direction:column;gap:.35rem}.field-label{font-size:.875rem;font-weight:500;color:var(--ax-text-secondary, #6b7280)}.title-input{height:2.25rem;border-radius:.5rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-lighter-surface));padding:0 .7rem;color:rgb(var(--ax-sys-color-on-surface));font:inherit}.title-input:focus{outline:2px solid rgba(var(--ax-sys-color-primary-500),.25);outline-offset:0}.users-list-wrap{height:min(50vh,36rem);overflow:hidden}.users-list{display:block;height:100%}.users-list-header{display:block;position:sticky;top:0;z-index:1;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.users-list-header-inner{padding:.5rem .75rem}.user-item-content{display:flex;align-items:center;gap:.5rem;height:100%;padding:.5rem .75rem;min-width:0}.user-item-text{display:flex;flex-direction:column;justify-content:center;min-width:0;flex:1;gap:.1rem}.user-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1rem;line-height:1.5rem;font-weight:500}.user-description-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;line-height:1.25rem;font-weight:400;opacity:.72;color:rgb(var(--ax-sys-color-on-surface))}.users-list-empty{padding:1rem;text-align:center;font-size:.85rem;opacity:.7}\n"] }]
20865
+ `, styles: [":host{display:block}.new-conversation-panel{display:flex;flex-direction:column;width:100%;overflow:hidden}.new-conversation-dialog-content{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;gap:.75rem}.form-field--grow{flex:1;min-height:0;display:flex;flex-direction:column}.group-details-step{flex:1;min-height:0;padding:.5rem .75rem;display:flex;flex-direction:column;gap:.75rem}.form-field{display:flex;flex-direction:column;gap:.35rem}.field-label{font-size:.875rem;font-weight:500;color:var(--ax-text-secondary, #6b7280)}.title-input{height:2.25rem;border-radius:.5rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-lighter-surface));padding:0 .7rem;color:rgb(var(--ax-sys-color-on-surface));font:inherit}.title-input:focus{outline:2px solid rgba(var(--ax-sys-color-primary-500),.25);outline-offset:0}.users-list-wrap{height:min(50vh,36rem);overflow:hidden}.users-list{display:block;height:100%}.users-list-header{display:block;position:sticky;top:0;z-index:1;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.users-list-header-inner{padding:.5rem .75rem}.user-item-content{display:flex;align-items:center;gap:.75rem;height:100%;padding:.5rem .75rem;min-width:0}.user-item-text{display:flex;flex-direction:column;justify-content:center;min-width:0;flex:1;gap:.125rem}.user-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;line-height:1.25rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface))}.user-description-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;line-height:1.25rem;font-weight:400;opacity:.72;color:rgb(var(--ax-sys-color-on-surface))}.users-list-empty{padding:1rem;text-align:center;font-size:.85rem;opacity:.7}\n"] }]
20858
20866
  }] });
20859
20867
 
20860
20868
  /**
@@ -21204,7 +21212,7 @@ class AXSidebarComponent {
21204
21212
  </ng-content>
21205
21213
  </div>
21206
21214
  </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 }); }
21215
+ `, 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
21216
  }
21209
21217
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXSidebarComponent, decorators: [{
21210
21218
  type: Component,
@@ -21381,7 +21389,7 @@ const DECLARATIONS = [
21381
21389
  * Creates providers array for conversation module
21382
21390
  */
21383
21391
  function createProviders(options, includeServices) {
21384
- const { userApi, conversationApi, messageApi, realtimeApi, config, registry } = options;
21392
+ const { userApi, conversationApi, messageApi, realtimeApi, config, registry, avatarComponents } = options;
21385
21393
  const providers = [];
21386
21394
  if (includeServices) {
21387
21395
  if (!userApi || !conversationApi || !messageApi) {
@@ -21407,6 +21415,18 @@ function createProviders(options, includeServices) {
21407
21415
  if (registry) {
21408
21416
  providers.push({ provide: REGISTRY_CONFIG, useValue: registry });
21409
21417
  }
21418
+ if (avatarComponents?.user) {
21419
+ providers.push({
21420
+ provide: AX_CONVERSATION_USER_AVATAR_COMPONENT,
21421
+ useValue: avatarComponents.user,
21422
+ });
21423
+ }
21424
+ if (avatarComponents?.conversation) {
21425
+ providers.push({
21426
+ provide: AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT,
21427
+ useValue: avatarComponents.conversation,
21428
+ });
21429
+ }
21410
21430
  if (includeServices) {
21411
21431
  providers.push(AXMessageRendererRegistry, AXMessageActionRegistry, AXComposerActionRegistry, AXComposerTabRegistry, AXConversationTabRegistry, AXInfoBarActionRegistry, AXConversationItemActionRegistry, AXRegistryService);
21412
21432
  }
@@ -21791,5 +21811,5 @@ function getErrorMessage(code, params) {
21791
21811
  * Generated bundle index. Do not edit.
21792
21812
  */
21793
21813
 
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 };
21814
+ 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
21815
  //# sourceMappingURL=acorex-components-conversation2.mjs.map