@acorex/components 20.6.7 → 20.6.9

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.
@@ -58,57 +58,6 @@ import { AXBasePageComponent } from '@acorex/components/page';
58
58
  * Common types used across all API services
59
59
  */
60
60
 
61
- /**
62
- * Abstract User Management API
63
- * Handle user profile management and user operations for conversations
64
- */
65
- /**
66
- * Abstract User Management API
67
- *
68
- * Implement this abstract class to handle user management for conversations.
69
- *
70
- * @example
71
- * ```typescript
72
- * @Injectable()
73
- * export class MyUserApi extends AXUserApi {
74
- * constructor(private http: HttpClient) {
75
- * super();
76
- * }
77
- *
78
- * async getCurrentUser(): Promise<AXParticipant> {
79
- * const response = await this.http.get('/api/users/me').toPromise();
80
- * return response;
81
- * }
82
- *
83
- * // ... implement other methods
84
- * }
85
- * ```
86
- */
87
- class AXUserApi {
88
- // =====================
89
- // Error Handling Helper
90
- // =====================
91
- /**
92
- * Create an API error
93
- * Helper method for consistent error creation
94
- *
95
- * @param code - Error code
96
- * @param message - Error message
97
- * @param statusCode - HTTP status code
98
- * @param details - Additional details
99
- * @returns API error object
100
- */
101
- createError(code, message, statusCode, details) {
102
- return {
103
- code,
104
- message,
105
- statusCode,
106
- details,
107
- timestamp: new Date(),
108
- };
109
- }
110
- }
111
-
112
61
  /**
113
62
  * Abstract Conversation Management API
114
63
  * Handle conversation CRUD operations, participants, and settings
@@ -252,6 +201,57 @@ class AXMessageApi {
252
201
  class AXRealtimeApi {
253
202
  }
254
203
 
204
+ /**
205
+ * Abstract User Management API
206
+ * Handle user profile management and user operations for conversations
207
+ */
208
+ /**
209
+ * Abstract User Management API
210
+ *
211
+ * Implement this abstract class to handle user management for conversations.
212
+ *
213
+ * @example
214
+ * ```typescript
215
+ * @Injectable()
216
+ * export class MyUserApi extends AXUserApi {
217
+ * constructor(private http: HttpClient) {
218
+ * super();
219
+ * }
220
+ *
221
+ * async getCurrentUser(): Promise<AXParticipant> {
222
+ * const response = await this.http.get('/api/users/me').toPromise();
223
+ * return response;
224
+ * }
225
+ *
226
+ * // ... implement other methods
227
+ * }
228
+ * ```
229
+ */
230
+ class AXUserApi {
231
+ // =====================
232
+ // Error Handling Helper
233
+ // =====================
234
+ /**
235
+ * Create an API error
236
+ * Helper method for consistent error creation
237
+ *
238
+ * @param code - Error code
239
+ * @param message - Error message
240
+ * @param statusCode - HTTP status code
241
+ * @param details - Additional details
242
+ * @returns API error object
243
+ */
244
+ createError(code, message, statusCode, details) {
245
+ return {
246
+ code,
247
+ message,
248
+ statusCode,
249
+ details,
250
+ timestamp: new Date(),
251
+ };
252
+ }
253
+ }
254
+
255
255
  /**
256
256
  * API Services
257
257
  * Export all abstract API classes and types
@@ -11129,58 +11129,71 @@ function getDefaultConversationItemActions() {
11129
11129
  * Default Conversation Tabs Plugin
11130
11130
  * Provides sidebar conversation filter tabs (all, private, groups, etc.)
11131
11131
  */
11132
+ function conversationHasUnread(c) {
11133
+ return (c.unreadCount ?? 0) > 0;
11134
+ }
11135
+ /** Number of conversations (in the same scope as each tab's `filter`) that have any unread messages — not sum of unread counts. */
11136
+ function countConversationsWithUnreadInScope(conversations, scope) {
11137
+ const n = scope(conversations).filter(conversationHasUnread).length;
11138
+ return n || undefined;
11139
+ }
11132
11140
  // Individual conversation tab constants (no aggregate arrays)
11133
11141
  const AX_CONVERSATION_TAB_ALL = {
11134
11142
  id: 'all',
11135
11143
  label: 'All',
11136
- icon: 'chat',
11144
+ icon: 'fa-light fa-comments',
11137
11145
  priority: 100,
11138
11146
  filter: (conversations) => conversations,
11139
- badge: (conversations) => conversations.length || undefined,
11147
+ badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c),
11140
11148
  default: true,
11141
11149
  };
11142
11150
  const AX_CONVERSATION_TAB_PRIVATE = {
11143
11151
  id: 'private',
11144
11152
  label: 'Private',
11145
- icon: 'person',
11153
+ icon: 'fa-light fa-user',
11146
11154
  priority: 90,
11147
11155
  filter: (conversations) => conversations.filter((c) => c.type === 'private'),
11148
- badge: (conversations) => conversations.filter((c) => c.type === 'private').length || undefined,
11156
+ badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.type === 'private')),
11149
11157
  };
11150
11158
  const AX_CONVERSATION_TAB_GROUPS = {
11151
11159
  id: 'groups',
11152
11160
  label: 'Groups',
11153
- icon: 'group',
11161
+ icon: 'fa-light fa-users',
11154
11162
  priority: 80,
11155
11163
  filter: (conversations) => conversations.filter((c) => c.type === 'group'),
11156
- badge: (conversations) => conversations.filter((c) => c.type === 'group').length || undefined,
11164
+ badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.type === 'group')),
11157
11165
  };
11158
11166
  const AX_CONVERSATION_TAB_CHANNELS = {
11159
11167
  id: 'channels',
11160
11168
  label: 'Channels',
11161
- icon: 'campaign',
11169
+ icon: 'fa-light fa-hashtag',
11162
11170
  priority: 70,
11163
11171
  filter: (conversations) => conversations.filter((c) => c.type === 'channel'),
11164
- badge: (conversations) => conversations.filter((c) => c.type === 'channel').length || undefined,
11172
+ badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.type === 'channel')),
11173
+ };
11174
+ const AX_CONVERSATION_TAB_BOT = {
11175
+ id: 'bot',
11176
+ label: 'Bots',
11177
+ icon: 'fa-light fa-robot',
11178
+ priority: 65,
11179
+ filter: (conversations) => conversations.filter((c) => c.type === 'bot'),
11180
+ badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.type === 'bot')),
11165
11181
  };
11166
11182
  const AX_CONVERSATION_TAB_UNREAD = {
11167
11183
  id: 'unread',
11168
11184
  label: 'Unread',
11169
- icon: 'mark_chat_unread',
11185
+ icon: 'fa-light fa-envelope',
11170
11186
  priority: 60,
11171
11187
  filter: (conversations) => conversations.filter((c) => c.unreadCount > 0),
11172
- badge: (conversations) => {
11173
- const unreadCount = conversations.reduce((sum, c) => sum + c.unreadCount, 0);
11174
- return unreadCount || undefined;
11175
- },
11188
+ badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.unreadCount > 0)),
11176
11189
  };
11177
11190
  const AX_CONVERSATION_TAB_ARCHIVED = {
11178
11191
  id: 'archived',
11179
11192
  label: 'Archived',
11180
- icon: 'archive',
11193
+ icon: 'fa-light fa-archive',
11181
11194
  priority: 50,
11182
11195
  filter: (conversations) => conversations.filter((c) => c.archived),
11183
- badge: (conversations) => conversations.filter((c) => c.archived).length || undefined,
11196
+ badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.archived)),
11184
11197
  enabled: false, // Disabled by default
11185
11198
  };
11186
11199
 
@@ -14717,6 +14730,10 @@ class AXInfoBarComponent {
14717
14730
  <ax-avatar [size]="48">
14718
14731
  @if (conversation.avatar) {
14719
14732
  <ax-image [src]="conversation.avatar" alt="{{ conversation.title }}"></ax-image>
14733
+ } @else if (conversation.icon) {
14734
+ <ax-icon
14735
+ ><i [class]="'info-bar-avatar-icon ' + conversation.icon" aria-hidden="true"></i
14736
+ ></ax-icon>
14720
14737
  } @else {
14721
14738
  <ax-label>{{ getInitials(conversation.title) }}</ax-label>
14722
14739
  }
@@ -14833,7 +14850,7 @@ class AXInfoBarComponent {
14833
14850
  </div>
14834
14851
  }
14835
14852
  }
14836
- `, isInline: true, styles: [":host{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}.info-banner{position:relative;z-index:1;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.5);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.25);background:rgb(var(--ax-sys-color-primary-lightest-surface));box-shadow:0 6px 16px rgb(var(--ax-sys-color-on-surface),.08),0 2px 6px rgb(var(--ax-sys-color-on-surface),.05)}.info-banner__content{flex:1;min-width:0}.info-banner__close{flex-shrink:0}.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;left:0;right: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(100%)}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(100%);transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}.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$5.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", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXMembersPopoverComponent, selector: "ax-conversation-members-popover", inputs: ["conversation"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14853
+ `, isInline: true, styles: [":host{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}.info-banner{position:relative;z-index:1;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.5);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.25);background:rgb(var(--ax-sys-color-primary-lightest-surface));box-shadow:0 6px 16px rgb(var(--ax-sys-color-on-surface),.08),0 2px 6px rgb(var(--ax-sys-color-on-surface),.05)}.info-banner__content{flex:1;min-width:0}.info-banner__close{flex-shrink:0}.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;left:0;right: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(100%)}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(100%);transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}.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$5.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", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXMembersPopoverComponent, selector: "ax-conversation-members-popover", inputs: ["conversation"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14837
14854
  }
14838
14855
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXInfoBarComponent, decorators: [{
14839
14856
  type: Component,
@@ -14864,6 +14881,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
14864
14881
  <ax-avatar [size]="48">
14865
14882
  @if (conversation.avatar) {
14866
14883
  <ax-image [src]="conversation.avatar" alt="{{ conversation.title }}"></ax-image>
14884
+ } @else if (conversation.icon) {
14885
+ <ax-icon
14886
+ ><i [class]="'info-bar-avatar-icon ' + conversation.icon" aria-hidden="true"></i
14887
+ ></ax-icon>
14867
14888
  } @else {
14868
14889
  <ax-label>{{ getInitials(conversation.title) }}</ax-label>
14869
14890
  }
@@ -14980,7 +15001,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
14980
15001
  </div>
14981
15002
  }
14982
15003
  }
14983
- `, styles: [":host{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}.info-banner{position:relative;z-index:1;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.5);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.25);background:rgb(var(--ax-sys-color-primary-lightest-surface));box-shadow:0 6px 16px rgb(var(--ax-sys-color-on-surface),.08),0 2px 6px rgb(var(--ax-sys-color-on-surface),.05)}.info-banner__content{flex:1;min-width:0}.info-banner__close{flex-shrink:0}.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;left:0;right: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(100%)}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(100%);transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}.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"] }]
15004
+ `, styles: [":host{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}.info-banner{position:relative;z-index:1;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.5);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.25);background:rgb(var(--ax-sys-color-primary-lightest-surface));box-shadow:0 6px 16px rgb(var(--ax-sys-color-on-surface),.08),0 2px 6px rgb(var(--ax-sys-color-on-surface),.05)}.info-banner__content{flex:1;min-width:0}.info-banner__close{flex-shrink:0}.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;left:0;right: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(100%)}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(100%);transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}.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"] }]
14984
15005
  }] });
14985
15006
 
14986
15007
  class AXForwardMessageDialogComponent {
@@ -15370,14 +15391,12 @@ class AXMessageListEmptyDefaultComponent {
15370
15391
  return 'conversation';
15371
15392
  }
15372
15393
  }, ...(ngDevMode ? [{ debugName: "conversationKindLabel" }] : []));
15373
- this.conversationPreposition = computed(() => this.conversation().type === 'private' ? 'with' : 'in', ...(ngDevMode ? [{ debugName: "conversationPreposition" }] : []));
15394
+ this.conversationPreposition = computed(() => (this.conversation().type === 'private' ? 'with' : 'in'), ...(ngDevMode ? [{ debugName: "conversationPreposition" }] : []));
15374
15395
  }
15375
15396
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListEmptyDefaultComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15376
15397
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.3", type: AXMessageListEmptyDefaultComponent, isStandalone: true, selector: "ax-conversation-message-list-empty-default", inputs: { conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "ax-message-empty-host" }, ngImport: i0, template: `
15377
15398
  <div class="ax-message-empty" role="status" aria-label="No messages in this conversation">
15378
15399
  <div class="ax-message-empty__ambient" aria-hidden="true">
15379
- <span class="ax-message-empty__orb ax-message-empty__orb--a"></span>
15380
- <span class="ax-message-empty__orb ax-message-empty__orb--b"></span>
15381
15400
  <span class="ax-message-empty__grid"></span>
15382
15401
  </div>
15383
15402
 
@@ -15393,11 +15412,12 @@ class AXMessageListEmptyDefaultComponent {
15393
15412
  <h3 class="ax-message-empty__title">No messages yet</h3>
15394
15413
  <p class="ax-message-empty__desc">
15395
15414
  Start the {{ conversationKindLabel() }} {{ conversationPreposition() }}
15396
- <span class="ax-message-empty__name">{{ conversation().title }}</span>.
15415
+ <span class="ax-message-empty__name">{{ conversation().title }}</span
15416
+ >.
15397
15417
  </p>
15398
15418
  </div>
15399
15419
  </div>
15400
- `, isInline: true, styles: [":host.ax-message-empty-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-empty{position:relative;isolation:isolate;padding:.25rem}.ax-message-empty__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-empty__orb{position:absolute;border-radius:50%;filter:blur(48px);opacity:.45;animation:ax-empty-float 14s ease-in-out infinite}.ax-message-empty__orb--a{width:min(14rem,55vw);height:min(14rem,55vw);top:-5%;left:50%;translate:-50% 0;background:radial-gradient(circle at 30% 30%,rgba(var(--ax-sys-color-primary-400),.55),rgba(var(--ax-sys-color-primary-600),.12) 55%,transparent 70%)}.ax-message-empty__orb--b{width:min(11rem,45vw);height:min(11rem,45vw);bottom:-10%;right:-5%;background:radial-gradient(circle at 70% 60%,rgba(var(--ax-sys-color-primary-300),.35),rgba(var(--ax-sys-color-primary-500),.08) 50%,transparent 68%);animation-delay:-7s}.ax-message-empty__grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-empty__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55));box-shadow:0 0 0 1px rgba(var(--ax-sys-color-on-surface),.03) inset,0 24px 48px -28px rgba(var(--ax-sys-color-on-surface),.18);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:ax-empty-card-in .65s cubic-bezier(.22,1,.36,1) both}.ax-message-empty__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-empty__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),rgba(var(--ax-sys-color-primary-500),0) 70%);animation:ax-empty-pulse 3.2s ease-in-out infinite}.ax-message-empty__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22);box-shadow:0 1px rgba(var(--ax-sys-color-on-primary-surface),.06) inset,0 12px 28px -16px rgba(var(--ax-sys-color-primary-600),.45)}.ax-message-empty__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-empty__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-empty__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-empty__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}.ax-message-empty__name{font-weight:600;color:rgb(var(--ax-sys-color-on-surface));opacity:.88}@keyframes ax-empty-card-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ax-empty-float{0%,to{transform:translate(0) scale(1)}50%{transform:translate(4%,6%) scale(1.05)}}@keyframes ax-empty-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media (prefers-reduced-motion: reduce){.ax-message-empty__orb,.ax-message-empty__pulse,.ax-message-empty__card{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15420
+ `, isInline: true, styles: [":host.ax-message-empty-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-empty{position:relative;isolation:isolate;padding:.25rem}.ax-message-empty__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-empty__grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-empty__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55));box-shadow:0 0 0 1px rgba(var(--ax-sys-color-on-surface),.03) inset,0 24px 48px -28px rgba(var(--ax-sys-color-on-surface),.18);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:ax-empty-card-in .65s cubic-bezier(.22,1,.36,1) both}.ax-message-empty__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-empty__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),rgba(var(--ax-sys-color-primary-500),0) 70%);animation:ax-empty-pulse 3.2s ease-in-out infinite}.ax-message-empty__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22);box-shadow:0 1px rgba(var(--ax-sys-color-on-primary-surface),.06) inset,0 12px 28px -16px rgba(var(--ax-sys-color-primary-600),.45)}.ax-message-empty__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-empty__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-empty__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-empty__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}.ax-message-empty__name{font-weight:600;color:rgb(var(--ax-sys-color-on-surface));opacity:.88}@keyframes ax-empty-card-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ax-empty-float{0%,to{transform:translate(0) scale(1)}50%{transform:translate(4%,6%) scale(1.05)}}@keyframes ax-empty-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media (prefers-reduced-motion: reduce){.ax-message-empty__pulse,.ax-message-empty__card{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15401
15421
  }
15402
15422
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListEmptyDefaultComponent, decorators: [{
15403
15423
  type: Component,
@@ -15406,8 +15426,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
15406
15426
  }, template: `
15407
15427
  <div class="ax-message-empty" role="status" aria-label="No messages in this conversation">
15408
15428
  <div class="ax-message-empty__ambient" aria-hidden="true">
15409
- <span class="ax-message-empty__orb ax-message-empty__orb--a"></span>
15410
- <span class="ax-message-empty__orb ax-message-empty__orb--b"></span>
15411
15429
  <span class="ax-message-empty__grid"></span>
15412
15430
  </div>
15413
15431
 
@@ -15423,11 +15441,66 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
15423
15441
  <h3 class="ax-message-empty__title">No messages yet</h3>
15424
15442
  <p class="ax-message-empty__desc">
15425
15443
  Start the {{ conversationKindLabel() }} {{ conversationPreposition() }}
15426
- <span class="ax-message-empty__name">{{ conversation().title }}</span>.
15444
+ <span class="ax-message-empty__name">{{ conversation().title }}</span
15445
+ >.
15427
15446
  </p>
15428
15447
  </div>
15429
15448
  </div>
15430
- `, styles: [":host.ax-message-empty-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-empty{position:relative;isolation:isolate;padding:.25rem}.ax-message-empty__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-empty__orb{position:absolute;border-radius:50%;filter:blur(48px);opacity:.45;animation:ax-empty-float 14s ease-in-out infinite}.ax-message-empty__orb--a{width:min(14rem,55vw);height:min(14rem,55vw);top:-5%;left:50%;translate:-50% 0;background:radial-gradient(circle at 30% 30%,rgba(var(--ax-sys-color-primary-400),.55),rgba(var(--ax-sys-color-primary-600),.12) 55%,transparent 70%)}.ax-message-empty__orb--b{width:min(11rem,45vw);height:min(11rem,45vw);bottom:-10%;right:-5%;background:radial-gradient(circle at 70% 60%,rgba(var(--ax-sys-color-primary-300),.35),rgba(var(--ax-sys-color-primary-500),.08) 50%,transparent 68%);animation-delay:-7s}.ax-message-empty__grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-empty__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55));box-shadow:0 0 0 1px rgba(var(--ax-sys-color-on-surface),.03) inset,0 24px 48px -28px rgba(var(--ax-sys-color-on-surface),.18);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:ax-empty-card-in .65s cubic-bezier(.22,1,.36,1) both}.ax-message-empty__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-empty__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),rgba(var(--ax-sys-color-primary-500),0) 70%);animation:ax-empty-pulse 3.2s ease-in-out infinite}.ax-message-empty__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22);box-shadow:0 1px rgba(var(--ax-sys-color-on-primary-surface),.06) inset,0 12px 28px -16px rgba(var(--ax-sys-color-primary-600),.45)}.ax-message-empty__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-empty__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-empty__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-empty__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}.ax-message-empty__name{font-weight:600;color:rgb(var(--ax-sys-color-on-surface));opacity:.88}@keyframes ax-empty-card-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ax-empty-float{0%,to{transform:translate(0) scale(1)}50%{transform:translate(4%,6%) scale(1.05)}}@keyframes ax-empty-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media (prefers-reduced-motion: reduce){.ax-message-empty__orb,.ax-message-empty__pulse,.ax-message-empty__card{animation:none}}\n"] }]
15449
+ `, styles: [":host.ax-message-empty-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-empty{position:relative;isolation:isolate;padding:.25rem}.ax-message-empty__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-empty__grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-empty__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55));box-shadow:0 0 0 1px rgba(var(--ax-sys-color-on-surface),.03) inset,0 24px 48px -28px rgba(var(--ax-sys-color-on-surface),.18);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:ax-empty-card-in .65s cubic-bezier(.22,1,.36,1) both}.ax-message-empty__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-empty__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),rgba(var(--ax-sys-color-primary-500),0) 70%);animation:ax-empty-pulse 3.2s ease-in-out infinite}.ax-message-empty__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22);box-shadow:0 1px rgba(var(--ax-sys-color-on-primary-surface),.06) inset,0 12px 28px -16px rgba(var(--ax-sys-color-primary-600),.45)}.ax-message-empty__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-empty__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-empty__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-empty__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}.ax-message-empty__name{font-weight:600;color:rgb(var(--ax-sys-color-on-surface));opacity:.88}@keyframes ax-empty-card-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ax-empty-float{0%,to{transform:translate(0) scale(1)}50%{transform:translate(4%,6%) scale(1.05)}}@keyframes ax-empty-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media (prefers-reduced-motion: reduce){.ax-message-empty__pulse,.ax-message-empty__card{animation:none}}\n"] }]
15450
+ }] });
15451
+
15452
+ /** Default message list surface when no conversation is selected and no `ax-conversation-message-list-no-active` content is projected. */
15453
+ class AXMessageListNoActiveDefaultComponent {
15454
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListNoActiveDefaultComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15455
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.3", type: AXMessageListNoActiveDefaultComponent, isStandalone: true, selector: "ax-conversation-message-list-no-active-default", host: { classAttribute: "ax-message-no-active-host" }, ngImport: i0, template: `
15456
+ <div class="ax-message-no-active" role="status" aria-label="No conversation selected">
15457
+ <div class="ax-message-no-active__ambient" aria-hidden="true">
15458
+ <span class="ax-message-no-active__grid"></span>
15459
+ </div>
15460
+
15461
+ <div class="ax-message-no-active__card">
15462
+ <div class="ax-message-no-active__icon-stack">
15463
+ <span class="ax-message-no-active__pulse" aria-hidden="true"></span>
15464
+ <div class="ax-message-no-active__icon-bg">
15465
+ <i class="fa-light fa-comments" aria-hidden="true"></i>
15466
+ </div>
15467
+ </div>
15468
+
15469
+ <p class="ax-message-no-active__eyebrow">Your inbox</p>
15470
+ <h3 class="ax-message-no-active__title">No conversation open</h3>
15471
+ <p class="ax-message-no-active__desc">
15472
+ Select a chat from the list to read and send messages, or start a new one when you are ready.
15473
+ </p>
15474
+ </div>
15475
+ </div>
15476
+ `, isInline: true, styles: [":host.ax-message-no-active-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-no-active{position:relative;isolation:isolate;padding:.25rem}.ax-message-no-active__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-no-active__grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-no-active__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55));backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:ax-no-active-card-in .65s cubic-bezier(.22,1,.36,1) both}.ax-message-no-active__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-no-active__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),rgba(var(--ax-sys-color-primary-500),0) 70%);animation:ax-no-active-pulse 3.2s ease-in-out infinite}.ax-message-no-active__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22)}.ax-message-no-active__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-no-active__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-no-active__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-no-active__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}@keyframes ax-no-active-card-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ax-no-active-float{0%,to{transform:translate(0) scale(1)}50%{transform:translate(4%,6%) scale(1.05)}}@keyframes ax-no-active-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media (prefers-reduced-motion: reduce){.ax-message-no-active__pulse,.ax-message-no-active__card{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15477
+ }
15478
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListNoActiveDefaultComponent, decorators: [{
15479
+ type: Component,
15480
+ args: [{ selector: 'ax-conversation-message-list-no-active-default', changeDetection: ChangeDetectionStrategy.OnPush, imports: [], host: {
15481
+ class: 'ax-message-no-active-host',
15482
+ }, template: `
15483
+ <div class="ax-message-no-active" role="status" aria-label="No conversation selected">
15484
+ <div class="ax-message-no-active__ambient" aria-hidden="true">
15485
+ <span class="ax-message-no-active__grid"></span>
15486
+ </div>
15487
+
15488
+ <div class="ax-message-no-active__card">
15489
+ <div class="ax-message-no-active__icon-stack">
15490
+ <span class="ax-message-no-active__pulse" aria-hidden="true"></span>
15491
+ <div class="ax-message-no-active__icon-bg">
15492
+ <i class="fa-light fa-comments" aria-hidden="true"></i>
15493
+ </div>
15494
+ </div>
15495
+
15496
+ <p class="ax-message-no-active__eyebrow">Your inbox</p>
15497
+ <h3 class="ax-message-no-active__title">No conversation open</h3>
15498
+ <p class="ax-message-no-active__desc">
15499
+ Select a chat from the list to read and send messages, or start a new one when you are ready.
15500
+ </p>
15501
+ </div>
15502
+ </div>
15503
+ `, styles: [":host.ax-message-no-active-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-no-active{position:relative;isolation:isolate;padding:.25rem}.ax-message-no-active__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-no-active__grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-no-active__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55));backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:ax-no-active-card-in .65s cubic-bezier(.22,1,.36,1) both}.ax-message-no-active__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-no-active__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),rgba(var(--ax-sys-color-primary-500),0) 70%);animation:ax-no-active-pulse 3.2s ease-in-out infinite}.ax-message-no-active__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22)}.ax-message-no-active__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-no-active__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-no-active__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-no-active__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}@keyframes ax-no-active-card-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ax-no-active-float{0%,to{transform:translate(0) scale(1)}50%{transform:translate(4%,6%) scale(1.05)}}@keyframes ax-no-active-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media (prefers-reduced-motion: reduce){.ax-message-no-active__pulse,.ax-message-no-active__card{animation:none}}\n"] }]
15431
15504
  }] });
15432
15505
 
15433
15506
  /**
@@ -15489,6 +15562,8 @@ class AXMessageListComponent {
15489
15562
  this.conversationService = inject(AXConversationService);
15490
15563
  this.messageListService = inject(AXMessageListService);
15491
15564
  this.config = inject(CONVERSATION_CONFIG);
15565
+ /** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */
15566
+ this.noActiveFallbackComponent = AXMessageListNoActiveDefaultComponent;
15492
15567
  /** Custom avatar template for message list items */
15493
15568
  this.avatarTemplate = input(null, ...(ngDevMode ? [{ debugName: "avatarTemplate" }] : []));
15494
15569
  // Timeout cleanup to prevent memory leaks
@@ -15500,6 +15575,8 @@ class AXMessageListComponent {
15500
15575
  this.reactionPickerTarget = signal(null, ...(ngDevMode ? [{ debugName: "reactionPickerTarget" }] : []));
15501
15576
  this.reactionPickerElement = signal(null, ...(ngDevMode ? [{ debugName: "reactionPickerElement" }] : []));
15502
15577
  this.reactionPopover = viewChild('reactionPopover', ...(ngDevMode ? [{ debugName: "reactionPopover" }] : []));
15578
+ /** Message id whose context menu is open (for active row styling). */
15579
+ this.contextMenuMessageId = signal(null, ...(ngDevMode ? [{ debugName: "contextMenuMessageId" }] : []));
15503
15580
  // Available reaction emojis from API
15504
15581
  this.availableReactions = signal([], ...(ngDevMode ? [{ debugName: "availableReactions" }] : []));
15505
15582
  /** Message list element reference */
@@ -15555,14 +15632,16 @@ class AXMessageListComponent {
15555
15632
  const currentConversationId = conversation?.id || null;
15556
15633
  // Use untracked to get previous ID without creating dependency
15557
15634
  untracked(() => {
15635
+ if (currentConversationId !== previousConversationId) {
15636
+ this.contextMenuMessageId.set(null);
15637
+ }
15558
15638
  // Only scroll if the conversation ID actually changed (not just updated)
15559
15639
  if (currentConversationId && currentConversationId !== previousConversationId) {
15560
15640
  // Reset pagination state for new conversation
15561
15641
  this.messageListService.resetPagination();
15562
- // Scroll to bottom when opening a conversation
15563
- setTimeout(() => {
15564
- this.scrollToBottom(false); // Instant scroll, no smooth animation
15565
- }, 100);
15642
+ // Wait until the messages branch mounts (#messagesContainer) after loading, then scroll
15643
+ // after layout — avoids no-op scroll during loading and jitter vs the surface enter animation.
15644
+ queueMicrotask(() => this.scrollToBottomWhenContainerReady());
15566
15645
  }
15567
15646
  // Update previous ID
15568
15647
  previousConversationId = currentConversationId;
@@ -15689,6 +15768,9 @@ class AXMessageListComponent {
15689
15768
  if (this.isOwnMessage(message)) {
15690
15769
  classes.push('message-own');
15691
15770
  }
15771
+ if (this.contextMenuMessageId() === message.id) {
15772
+ classes.push('message-item-context-active');
15773
+ }
15692
15774
  return classes.join(' ');
15693
15775
  }
15694
15776
  /** Get bubble CSS classes */
@@ -15961,6 +16043,29 @@ class AXMessageListComponent {
15961
16043
  const isNearBottom = scrollHeight - scrollTop - clientHeight < this.config.scrollThreshold;
15962
16044
  return isNearBottom;
15963
16045
  }
16046
+ /**
16047
+ * After switching chats, the template may still show loading (no #messagesContainer).
16048
+ * Poll with rAF until the feed exists, then scroll after double rAF so scrollHeight is stable.
16049
+ */
16050
+ scrollToBottomWhenContainerReady() {
16051
+ const maxAttempts = 120;
16052
+ let attempts = 0;
16053
+ const tick = () => {
16054
+ const el = this.messagesContainerRef()?.nativeElement;
16055
+ if (el) {
16056
+ requestAnimationFrame(() => {
16057
+ requestAnimationFrame(() => {
16058
+ this.scrollToBottom(false);
16059
+ });
16060
+ });
16061
+ return;
16062
+ }
16063
+ if (++attempts < maxAttempts) {
16064
+ requestAnimationFrame(tick);
16065
+ }
16066
+ };
16067
+ requestAnimationFrame(tick);
16068
+ }
15964
16069
  /** Scroll to bottom */
15965
16070
  scrollToBottom(smooth = true) {
15966
16071
  const element = this.messagesContainerRef()?.nativeElement;
@@ -16065,6 +16170,7 @@ class AXMessageListComponent {
16065
16170
  }
16066
16171
  /** Handle context menu opening for messages */
16067
16172
  handleMessageContextMenuOpening(event, message) {
16173
+ this.contextMenuMessageId.set(message.id);
16068
16174
  const actions = this.getMessageActions(message);
16069
16175
  const currentUser = this.currentUser();
16070
16176
  if (!currentUser)
@@ -16082,6 +16188,7 @@ class AXMessageListComponent {
16082
16188
  }
16083
16189
  /** Handle context menu item click for messages */
16084
16190
  handleMessageContextMenuItemClick(event, message) {
16191
+ this.contextMenuMessageId.set(null);
16085
16192
  const action = event.item.data;
16086
16193
  if (action) {
16087
16194
  // Execute the action using message list service
@@ -16106,248 +16213,253 @@ class AXMessageListComponent {
16106
16213
  }
16107
16214
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
16108
16215
  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: `
16109
- @if (activeConversation()) {
16110
- <div
16111
- class="message-list"
16112
- #messageList
16113
- role="log"
16114
- aria-label="Message list"
16115
- aria-live="polite"
16116
- [style.background]="messageListBackgroundStyle()"
16117
- >
16118
- @if (loading()) {
16119
- <div class="list-loading" role="status" aria-label="Loading messages">
16120
- <ax-loading></ax-loading>
16121
- <ax-label>Loading messages...</ax-label>
16122
- </div>
16123
- } @else if (messages().length === 0) {
16124
- <div class="list-empty" role="status" aria-label="No messages">
16125
- <ng-content select="ax-conversation-message-list-empty, [ax-conversation-message-list-empty]">
16126
- <ng-container
16127
- *ngComponentOutlet="resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }"
16128
- ></ng-container>
16129
- </ng-content>
16130
- </div>
16131
- } @else {
16132
- <div
16133
- class="messages-container"
16134
- (scroll)="onScroll($event)"
16135
- axInfiniteScroll
16136
- [threshold]="config.infiniteScrollThreshold"
16137
- [edge]="'top'"
16138
- (scrollThreshold)="onScrollThreshold($event)"
16139
- #messagesContainer
16140
- role="feed"
16141
- aria-label="Messages"
16142
- >
16143
- @if (loadingMore()) {
16144
- <div class="list-loading-more" role="status" aria-label="Loading older messages">
16145
- <ax-loading></ax-loading>
16146
- <ax-label>Loading older messages...</ax-label>
16147
- </div>
16148
- }
16149
- @for (group of messageGroups(); track trackMessageGroup($index, group)) {
16150
- <!-- Date Separator -->
16151
- <div class="date-separator" role="separator" [attr.aria-label]="'Messages from ' + group.dateLabel">
16152
- <ax-badge [text]="group.dateLabel" class="date-text"></ax-badge>
16153
- </div>
16216
+ @if (activeConversation(); as conv) {
16217
+ @for (cid of [conv.id]; track cid) {
16218
+ <div
16219
+ class="message-list message-list--conversation-surface"
16220
+ #messageList
16221
+ role="log"
16222
+ aria-label="Message list"
16223
+ aria-live="polite"
16224
+ [style.background]="messageListBackgroundStyle()"
16225
+ >
16226
+ @if (loading()) {
16227
+ <div class="list-loading" role="status" aria-label="Loading messages">
16228
+ <ax-loading></ax-loading>
16229
+ <ax-label>Loading messages...</ax-label>
16230
+ </div>
16231
+ } @else if (messages().length === 0) {
16232
+ <div class="list-empty" role="status" aria-label="No messages">
16233
+ <ng-content select="ax-conversation-message-list-empty, [ax-conversation-message-list-empty]">
16234
+ <ng-container
16235
+ *ngComponentOutlet="resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }"
16236
+ ></ng-container>
16237
+ </ng-content>
16238
+ </div>
16239
+ } @else {
16240
+ <div
16241
+ class="messages-container"
16242
+ (scroll)="onScroll($event)"
16243
+ axInfiniteScroll
16244
+ [threshold]="config.infiniteScrollThreshold"
16245
+ [edge]="'top'"
16246
+ (scrollThreshold)="onScrollThreshold($event)"
16247
+ #messagesContainer
16248
+ role="feed"
16249
+ aria-label="Messages"
16250
+ >
16251
+ @if (loadingMore()) {
16252
+ <div class="list-loading-more" role="status" aria-label="Loading older messages">
16253
+ <ax-loading></ax-loading>
16254
+ <ax-label>Loading older messages...</ax-label>
16255
+ </div>
16256
+ }
16257
+ @for (group of messageGroups(); track trackMessageGroup($index, group)) {
16258
+ <!-- Date Separator -->
16259
+ <div class="date-separator" role="separator" [attr.aria-label]="'Messages from ' + group.dateLabel">
16260
+ <ax-badge [text]="group.dateLabel" class="date-text"></ax-badge>
16261
+ </div>
16154
16262
 
16155
- <!-- Messages in this date group -->
16156
- @for (message of group.messages; track trackMessage($index, message)) {
16157
- <div
16158
- [class]="getMessageClasses(message)"
16159
- role="article"
16160
- [attr.aria-label]="getMessageAriaLabel(message)"
16161
- [id]="'message-' + message.id"
16162
- animate.enter="fade-slide-in"
16163
- >
16164
- <!-- Avatar (only for group conversations and received messages) -->
16165
- @if (shouldShowAvatar(message)) {
16166
- <div class="message-avatar">
16167
- @if (avatarTemplate()) {
16168
- <ng-container
16169
- *ngTemplateOutlet="
16170
- avatarTemplate();
16171
- context: {
16172
- $implicit: message,
16173
- size: 32,
16174
- senderName: getSenderName(message),
16175
- senderAvatar: getSenderAvatar(message),
16176
- senderIcon: getSenderAvatarIcon(message),
16263
+ <!-- Messages in this date group -->
16264
+ @for (message of group.messages; track trackMessage($index, message)) {
16265
+ <div
16266
+ [class]="getMessageClasses(message)"
16267
+ role="article"
16268
+ [attr.aria-label]="getMessageAriaLabel(message)"
16269
+ [id]="'message-' + message.id"
16270
+ >
16271
+ <!-- Avatar (only for group conversations and received messages) -->
16272
+ @if (shouldShowAvatar(message)) {
16273
+ <div class="message-avatar">
16274
+ @if (avatarTemplate()) {
16275
+ <ng-container
16276
+ *ngTemplateOutlet="
16277
+ avatarTemplate();
16278
+ context: {
16279
+ $implicit: message,
16280
+ size: 32,
16281
+ senderName: getSenderName(message),
16282
+ senderAvatar: getSenderAvatar(message),
16283
+ senderIcon: getSenderAvatarIcon(message),
16284
+ }
16285
+ "
16286
+ ></ng-container>
16287
+ } @else {
16288
+ <ax-avatar [size]="32">
16289
+ @if (getSenderAvatar(message)) {
16290
+ <ax-image [src]="getSenderAvatar(message)!" [alt]="getSenderName(message)"></ax-image>
16291
+ } @else if (getSenderAvatarIcon(message)) {
16292
+ <ax-icon
16293
+ ><i
16294
+ [class]="'message-avatar-icon ' + getSenderAvatarIcon(message)!"
16295
+ aria-hidden="true"
16296
+ ></i
16297
+ ></ax-icon>
16298
+ } @else {
16299
+ <ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>
16177
16300
  }
16178
- "
16179
- ></ng-container>
16180
- } @else {
16181
- <ax-avatar [size]="32" [color]="'primary'">
16182
- @if (getSenderAvatar(message)) {
16183
- <ax-image [src]="getSenderAvatar(message)!" [alt]="getSenderName(message)"></ax-image>
16184
- } @else if (getSenderAvatarIcon(message)) {
16185
- <ax-icon
16186
- ><i
16187
- [class]="'message-avatar-icon ' + getSenderAvatarIcon(message)!"
16188
- aria-hidden="true"
16189
- ></i
16190
- ></ax-icon>
16191
- } @else {
16192
- <ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>
16193
- }
16194
- </ax-avatar>
16195
- }
16196
- </div>
16197
- }
16301
+ </ax-avatar>
16302
+ }
16303
+ </div>
16304
+ }
16198
16305
 
16199
- <div class="message-content-row" [class.message-content-row-own]="isOwnMessage(message)">
16200
- <button
16201
- type="button"
16202
- class="add-reaction-button add-reaction-outside"
16203
- [class.add-reaction-visible]="reactionPickerTarget() === message.id"
16204
- (click)="toggleReactionPicker(message.id, $event)"
16205
- [attr.aria-label]="'Add reaction to message'"
16206
- #reactionButton
16207
- >
16208
- <i class="fa-light fa-face-smile"></i>
16209
- </button>
16306
+ <div class="message-content-row" [class.message-content-row-own]="isOwnMessage(message)">
16307
+ <button
16308
+ type="button"
16309
+ class="add-reaction-button add-reaction-outside"
16310
+ [class.add-reaction-visible]="reactionPickerTarget() === message.id"
16311
+ (click)="toggleReactionPicker(message.id, $event)"
16312
+ [attr.aria-label]="'Add reaction to message'"
16313
+ #reactionButton
16314
+ >
16315
+ <i class="fa-light fa-face-smile"></i>
16316
+ </button>
16210
16317
 
16211
- <div
16212
- class="message-bubble-container"
16213
- [id]="'message-bubble-' + message.id"
16214
- [attr.data-message-id]="message.id"
16215
- >
16216
16318
  <div
16217
- [class]="getBubbleClasses(message)"
16218
- [class.message-bubble-sent]="message.senderId === currentUser()?.id"
16219
- [class.message-bubble-received]="message.senderId !== currentUser()?.id"
16319
+ class="message-bubble-container"
16320
+ [id]="'message-bubble-' + message.id"
16321
+ [attr.data-message-id]="message.id"
16220
16322
  >
16221
- <!-- Sender name (only for group conversations and received messages) -->
16222
- @if (shouldShowSenderName(message)) {
16223
- <div class="message-sender">{{ getSenderName(message) }}:</div>
16224
- }
16323
+ <div
16324
+ [class]="getBubbleClasses(message)"
16325
+ [class.message-bubble-sent]="message.senderId === currentUser()?.id"
16326
+ [class.message-bubble-received]="message.senderId !== currentUser()?.id"
16327
+ >
16328
+ <!-- Sender name (only for group conversations and received messages) -->
16329
+ @if (shouldShowSenderName(message)) {
16330
+ <div class="message-sender">{{ getSenderName(message) }}:</div>
16331
+ }
16225
16332
 
16226
- <!-- Reply Preview -->
16227
- @if (message.replyTo) {
16228
- <div
16229
- class="reply-preview"
16230
- (click)="scrollToMessage(message.replyTo.id)"
16231
- role="button"
16232
- [attr.aria-label]="'Reply to ' + getSenderName(message.replyTo)"
16233
- (keydown.enter)="scrollToMessage(message.replyTo.id)"
16234
- (keydown.space)="scrollToMessage(message.replyTo.id)"
16235
- >
16236
- <div class="reply-preview-content">
16237
- <div class="reply-preview-sender">{{ getSenderName(message.replyTo) }}</div>
16238
- <div class="reply-preview-text">
16239
- @if (getMessagePreviewText(message.replyTo); as preview) {
16240
- <span class="last-message">
16241
- @if (preview.type !== 'text') {
16242
- <i [class]="preview.icon"></i
16243
- >{{ '@acorex:chat.' + preview.type | translate | async }}
16244
- } @else {
16245
- {{ preview.value }}
16246
- }
16247
- </span>
16248
- }
16333
+ <!-- Reply Preview -->
16334
+ @if (message.replyTo) {
16335
+ <div
16336
+ class="reply-preview"
16337
+ (click)="scrollToMessage(message.replyTo.id)"
16338
+ role="button"
16339
+ [attr.aria-label]="'Reply to ' + getSenderName(message.replyTo)"
16340
+ (keydown.enter)="scrollToMessage(message.replyTo.id)"
16341
+ (keydown.space)="scrollToMessage(message.replyTo.id)"
16342
+ >
16343
+ <div class="reply-preview-content">
16344
+ <div class="reply-preview-sender">{{ getSenderName(message.replyTo) }}</div>
16345
+ <div class="reply-preview-text">
16346
+ @if (getMessagePreviewText(message.replyTo); as preview) {
16347
+ <span class="last-message">
16348
+ @if (preview.type !== 'text') {
16349
+ <i [class]="preview.icon"></i
16350
+ >{{ '@acorex:chat.' + preview.type | translate | async }}
16351
+ } @else {
16352
+ {{ preview.value }}
16353
+ }
16354
+ </span>
16355
+ }
16356
+ </div>
16249
16357
  </div>
16250
16358
  </div>
16251
- </div>
16252
- }
16253
-
16254
- <!-- Forwarded Indicator -->
16255
- @if (message.forwarded) {
16256
- <div class="forwarded-preview">
16257
- <i class="fa-solid fa-share"></i>
16258
- <span class="forwarded-text">{{ getForwardedText(message) }}</span>
16259
- </div>
16260
- }
16359
+ }
16261
16360
 
16262
- <ng-container
16263
- *ngComponentOutlet="getRendererComponent(message); inputs: getRendererInputs(message)"
16264
- ></ng-container>
16265
-
16266
- @if (message.reactions.length > 0) {
16267
- <div class="message-reactions-container">
16268
- <div class="message-reactions-bubbles">
16269
- @for (reaction of getGroupedReactions(message); track reaction.emoji) {
16270
- <button
16271
- type="button"
16272
- class="reaction-bubble"
16273
- [class.reaction-bubble-active]="reaction.hasReacted"
16274
- (click)="onReactionClick(message, reaction.emoji)"
16275
- [attr.aria-label]="reaction.emoji + ' ' + reaction.count"
16276
- >
16277
- <span class="reaction-emoji">{{ reaction.emoji }}</span>
16278
- @if (reaction.count > 1) {
16279
- <span class="reaction-count">{{ reaction.count }}</span>
16280
- }
16281
- </button>
16282
- }
16361
+ <!-- Forwarded Indicator -->
16362
+ @if (message.forwarded) {
16363
+ <div class="forwarded-preview">
16364
+ <i class="fa-solid fa-share"></i>
16365
+ <span class="forwarded-text">{{ getForwardedText(message) }}</span>
16283
16366
  </div>
16284
- </div>
16285
- }
16286
-
16287
- <!-- Message Footer -->
16288
- <div class="message-footer">
16289
- @if (getReplyCount(message) > 0) {
16290
- <span class="message-footer-count" [attr.aria-label]="getReplyCount(message) + ' replies'">
16291
- <i class="fa-solid fa-message" aria-hidden="true"></i>
16292
- <span class="message-footer-count-value">{{ getReplyCount(message) }}</span>
16293
- </span>
16294
- }
16295
- @if (getForwardCount(message) > 0) {
16296
- <span
16297
- class="message-footer-count"
16298
- [attr.aria-label]="getForwardCount(message) + ' forwards'"
16299
- >
16300
- <i class="fa-solid fa-share" aria-hidden="true"></i>
16301
- <span class="message-footer-count-value">{{ getForwardCount(message) }}</span>
16302
- </span>
16303
- }
16304
- @if (getReplyCount(message) > 0 || getForwardCount(message) > 0) {
16305
- <span class="message-footer-split" aria-hidden="true"></span>
16306
- }
16307
- <span class="message-time">{{ message.timestamp | format: 'timeleft' | async }}</span>
16308
- @if (message.editedAt) {
16309
- <span class="edited-indicator">
16310
- <span>Edited</span>
16311
- </span>
16312
16367
  }
16313
- @if (isOwnMessage(message)) {
16314
- <span [class]="getStatusIconClasses(message)">
16315
- <ax-icon><i [class]="getStatusIcon(message)"></i></ax-icon>
16316
- </span>
16368
+
16369
+ <ng-container
16370
+ *ngComponentOutlet="getRendererComponent(message); inputs: getRendererInputs(message)"
16371
+ ></ng-container>
16372
+
16373
+ @if (message.reactions.length > 0) {
16374
+ <div class="message-reactions-container">
16375
+ <div class="message-reactions-bubbles">
16376
+ @for (reaction of getGroupedReactions(message); track reaction.emoji) {
16377
+ <button
16378
+ type="button"
16379
+ class="reaction-bubble"
16380
+ [class.reaction-bubble-active]="reaction.hasReacted"
16381
+ (click)="onReactionClick(message, reaction.emoji)"
16382
+ [attr.aria-label]="reaction.emoji + ' ' + reaction.count"
16383
+ >
16384
+ <span class="reaction-emoji">{{ reaction.emoji }}</span>
16385
+ @if (reaction.count > 1) {
16386
+ <span class="reaction-count">{{ reaction.count }}</span>
16387
+ }
16388
+ </button>
16389
+ }
16390
+ </div>
16391
+ </div>
16317
16392
  }
16393
+
16394
+ <!-- Message Footer -->
16395
+ <div class="message-footer">
16396
+ @if (getReplyCount(message) > 0) {
16397
+ <span
16398
+ class="message-footer-count"
16399
+ [attr.aria-label]="getReplyCount(message) + ' replies'"
16400
+ >
16401
+ <i class="fa-solid fa-message" aria-hidden="true"></i>
16402
+ <span class="message-footer-count-value">{{ getReplyCount(message) }}</span>
16403
+ </span>
16404
+ }
16405
+ @if (getForwardCount(message) > 0) {
16406
+ <span
16407
+ class="message-footer-count"
16408
+ [attr.aria-label]="getForwardCount(message) + ' forwards'"
16409
+ >
16410
+ <i class="fa-solid fa-share" aria-hidden="true"></i>
16411
+ <span class="message-footer-count-value">{{ getForwardCount(message) }}</span>
16412
+ </span>
16413
+ }
16414
+ @if (getReplyCount(message) > 0 || getForwardCount(message) > 0) {
16415
+ <span class="message-footer-split" aria-hidden="true"></span>
16416
+ }
16417
+ <span class="message-time">{{ message.timestamp | format: 'timeleft' | async }}</span>
16418
+ @if (message.editedAt) {
16419
+ <span class="edited-indicator">
16420
+ <span>Edited</span>
16421
+ </span>
16422
+ }
16423
+ @if (isOwnMessage(message)) {
16424
+ <span [class]="getStatusIconClasses(message)">
16425
+ <ax-icon><i [class]="getStatusIcon(message)"></i></ax-icon>
16426
+ </span>
16427
+ }
16428
+ </div>
16318
16429
  </div>
16319
16430
  </div>
16320
16431
  </div>
16321
- </div>
16322
16432
 
16323
- <!-- Context Menu for Message Actions -->
16324
- <ax-context-menu
16325
- [target]="'#message-bubble-' + message.id"
16326
- [openOn]="'click'"
16327
- [closeOn]="'click'"
16328
- (onOpening)="handleMessageContextMenuOpening($event, message)"
16329
- (onItemClick)="handleMessageContextMenuItemClick($event, message)"
16330
- >
16331
- </ax-context-menu>
16332
- </div>
16433
+ <!-- Context Menu for Message Actions -->
16434
+ <ax-context-menu
16435
+ [target]="'#message-bubble-' + message.id"
16436
+ [openOn]="'click'"
16437
+ [closeOn]="'click'"
16438
+ (onOpening)="handleMessageContextMenuOpening($event, message)"
16439
+ (onClose)="contextMenuMessageId.set(null)"
16440
+ (onItemClick)="handleMessageContextMenuItemClick($event, message)"
16441
+ >
16442
+ </ax-context-menu>
16443
+ </div>
16444
+ }
16333
16445
  }
16334
- }
16335
- </div>
16446
+ </div>
16336
16447
 
16337
- <!-- Scroll to Bottom Button -->
16338
- @if (showScrollButton()) {
16339
- <ax-button
16340
- class="scroll-to-bottom"
16341
- (onClick)="scrollToBottom()"
16342
- animate.enter="slide-in"
16343
- animate.leave="slide-out"
16344
- [text]="'↓'"
16345
- [look]="'solid'"
16346
- aria-label="Scroll to bottom of messages"
16347
- ></ax-button>
16448
+ <!-- Scroll to Bottom Button -->
16449
+ @if (showScrollButton()) {
16450
+ <ax-button
16451
+ class="scroll-to-bottom"
16452
+ (onClick)="scrollToBottom()"
16453
+ animate.enter="slide-in"
16454
+ animate.leave="slide-out"
16455
+ [text]="'↓'"
16456
+ [look]="'solid'"
16457
+ aria-label="Scroll to bottom of messages"
16458
+ ></ax-button>
16459
+ }
16348
16460
  }
16349
- }
16350
- </div>
16461
+ </div>
16462
+ }
16351
16463
 
16352
16464
  <!-- Reaction Picker Popover -->
16353
16465
  @if (reactionPickerTarget()) {
@@ -16382,8 +16494,16 @@ class AXMessageListComponent {
16382
16494
  </div>
16383
16495
  </ax-popover>
16384
16496
  }
16497
+ } @else {
16498
+ <div class="message-list message-list--no-active" role="region" aria-label="No conversation selected">
16499
+ <div class="list-no-active">
16500
+ <ng-content select="ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]">
16501
+ <ng-container *ngComponentOutlet="noActiveFallbackComponent"></ng-container>
16502
+ </ng-content>
16503
+ </div>
16504
+ </div>
16385
16505
  }
16386
- `, isInline: true, styles: [":host{display:block;height:100%;position:relative}.message-list{height:100%}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;padding:3rem 2rem;gap:1.25rem;animation:fadeInUp .5s ease-out}@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:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.messages-container{width:100%;height:100%;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-highlight{background-color:rgba(var(--ax-sys-color-primary-500),.1);border-radius:.5rem}.fade-slide-in{animation:fadeSlideIn var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes fadeSlideIn{0%{opacity:0;// transform: translateX(20%)}to{opacity:1;// transform: translateX(0)}}.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:70%;min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}.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;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-bottom-left-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;left:-.7rem;border-top-left-radius:86%;corner-shape:scoop}.message-bubble-sent{border-bottom-right-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;right:-.7rem;border-top-right-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;right: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$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$5.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", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { 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", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }, { kind: "pipe", type: i6$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16506
+ `, isInline: true, styles: [":host{display:block;height:100%;position:relative}.message-list{height:100%}.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-direction:column;align-items:center;justify-content:center;height:100%;text-align:center}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;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:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.messages-container{width:100%;height:100%;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:70%;min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}.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;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-bottom-left-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;left:-.7rem;border-top-left-radius:86%;corner-shape:scoop}.message-bubble-sent{border-bottom-right-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;right:-.7rem;border-top-right-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;right: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$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$5.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", "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", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }, { kind: "pipe", type: i6$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16387
16507
  }
16388
16508
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListComponent, decorators: [{
16389
16509
  type: Component,
@@ -16403,248 +16523,253 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
16403
16523
  AXTranslationModule,
16404
16524
  AXInfiniteScrollDirective,
16405
16525
  ], template: `
16406
- @if (activeConversation()) {
16407
- <div
16408
- class="message-list"
16409
- #messageList
16410
- role="log"
16411
- aria-label="Message list"
16412
- aria-live="polite"
16413
- [style.background]="messageListBackgroundStyle()"
16414
- >
16415
- @if (loading()) {
16416
- <div class="list-loading" role="status" aria-label="Loading messages">
16417
- <ax-loading></ax-loading>
16418
- <ax-label>Loading messages...</ax-label>
16419
- </div>
16420
- } @else if (messages().length === 0) {
16421
- <div class="list-empty" role="status" aria-label="No messages">
16422
- <ng-content select="ax-conversation-message-list-empty, [ax-conversation-message-list-empty]">
16423
- <ng-container
16424
- *ngComponentOutlet="resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }"
16425
- ></ng-container>
16426
- </ng-content>
16427
- </div>
16428
- } @else {
16429
- <div
16430
- class="messages-container"
16431
- (scroll)="onScroll($event)"
16432
- axInfiniteScroll
16433
- [threshold]="config.infiniteScrollThreshold"
16434
- [edge]="'top'"
16435
- (scrollThreshold)="onScrollThreshold($event)"
16436
- #messagesContainer
16437
- role="feed"
16438
- aria-label="Messages"
16439
- >
16440
- @if (loadingMore()) {
16441
- <div class="list-loading-more" role="status" aria-label="Loading older messages">
16442
- <ax-loading></ax-loading>
16443
- <ax-label>Loading older messages...</ax-label>
16444
- </div>
16445
- }
16446
- @for (group of messageGroups(); track trackMessageGroup($index, group)) {
16447
- <!-- Date Separator -->
16448
- <div class="date-separator" role="separator" [attr.aria-label]="'Messages from ' + group.dateLabel">
16449
- <ax-badge [text]="group.dateLabel" class="date-text"></ax-badge>
16450
- </div>
16526
+ @if (activeConversation(); as conv) {
16527
+ @for (cid of [conv.id]; track cid) {
16528
+ <div
16529
+ class="message-list message-list--conversation-surface"
16530
+ #messageList
16531
+ role="log"
16532
+ aria-label="Message list"
16533
+ aria-live="polite"
16534
+ [style.background]="messageListBackgroundStyle()"
16535
+ >
16536
+ @if (loading()) {
16537
+ <div class="list-loading" role="status" aria-label="Loading messages">
16538
+ <ax-loading></ax-loading>
16539
+ <ax-label>Loading messages...</ax-label>
16540
+ </div>
16541
+ } @else if (messages().length === 0) {
16542
+ <div class="list-empty" role="status" aria-label="No messages">
16543
+ <ng-content select="ax-conversation-message-list-empty, [ax-conversation-message-list-empty]">
16544
+ <ng-container
16545
+ *ngComponentOutlet="resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }"
16546
+ ></ng-container>
16547
+ </ng-content>
16548
+ </div>
16549
+ } @else {
16550
+ <div
16551
+ class="messages-container"
16552
+ (scroll)="onScroll($event)"
16553
+ axInfiniteScroll
16554
+ [threshold]="config.infiniteScrollThreshold"
16555
+ [edge]="'top'"
16556
+ (scrollThreshold)="onScrollThreshold($event)"
16557
+ #messagesContainer
16558
+ role="feed"
16559
+ aria-label="Messages"
16560
+ >
16561
+ @if (loadingMore()) {
16562
+ <div class="list-loading-more" role="status" aria-label="Loading older messages">
16563
+ <ax-loading></ax-loading>
16564
+ <ax-label>Loading older messages...</ax-label>
16565
+ </div>
16566
+ }
16567
+ @for (group of messageGroups(); track trackMessageGroup($index, group)) {
16568
+ <!-- Date Separator -->
16569
+ <div class="date-separator" role="separator" [attr.aria-label]="'Messages from ' + group.dateLabel">
16570
+ <ax-badge [text]="group.dateLabel" class="date-text"></ax-badge>
16571
+ </div>
16451
16572
 
16452
- <!-- Messages in this date group -->
16453
- @for (message of group.messages; track trackMessage($index, message)) {
16454
- <div
16455
- [class]="getMessageClasses(message)"
16456
- role="article"
16457
- [attr.aria-label]="getMessageAriaLabel(message)"
16458
- [id]="'message-' + message.id"
16459
- animate.enter="fade-slide-in"
16460
- >
16461
- <!-- Avatar (only for group conversations and received messages) -->
16462
- @if (shouldShowAvatar(message)) {
16463
- <div class="message-avatar">
16464
- @if (avatarTemplate()) {
16465
- <ng-container
16466
- *ngTemplateOutlet="
16467
- avatarTemplate();
16468
- context: {
16469
- $implicit: message,
16470
- size: 32,
16471
- senderName: getSenderName(message),
16472
- senderAvatar: getSenderAvatar(message),
16473
- senderIcon: getSenderAvatarIcon(message),
16573
+ <!-- Messages in this date group -->
16574
+ @for (message of group.messages; track trackMessage($index, message)) {
16575
+ <div
16576
+ [class]="getMessageClasses(message)"
16577
+ role="article"
16578
+ [attr.aria-label]="getMessageAriaLabel(message)"
16579
+ [id]="'message-' + message.id"
16580
+ >
16581
+ <!-- Avatar (only for group conversations and received messages) -->
16582
+ @if (shouldShowAvatar(message)) {
16583
+ <div class="message-avatar">
16584
+ @if (avatarTemplate()) {
16585
+ <ng-container
16586
+ *ngTemplateOutlet="
16587
+ avatarTemplate();
16588
+ context: {
16589
+ $implicit: message,
16590
+ size: 32,
16591
+ senderName: getSenderName(message),
16592
+ senderAvatar: getSenderAvatar(message),
16593
+ senderIcon: getSenderAvatarIcon(message),
16594
+ }
16595
+ "
16596
+ ></ng-container>
16597
+ } @else {
16598
+ <ax-avatar [size]="32">
16599
+ @if (getSenderAvatar(message)) {
16600
+ <ax-image [src]="getSenderAvatar(message)!" [alt]="getSenderName(message)"></ax-image>
16601
+ } @else if (getSenderAvatarIcon(message)) {
16602
+ <ax-icon
16603
+ ><i
16604
+ [class]="'message-avatar-icon ' + getSenderAvatarIcon(message)!"
16605
+ aria-hidden="true"
16606
+ ></i
16607
+ ></ax-icon>
16608
+ } @else {
16609
+ <ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>
16474
16610
  }
16475
- "
16476
- ></ng-container>
16477
- } @else {
16478
- <ax-avatar [size]="32" [color]="'primary'">
16479
- @if (getSenderAvatar(message)) {
16480
- <ax-image [src]="getSenderAvatar(message)!" [alt]="getSenderName(message)"></ax-image>
16481
- } @else if (getSenderAvatarIcon(message)) {
16482
- <ax-icon
16483
- ><i
16484
- [class]="'message-avatar-icon ' + getSenderAvatarIcon(message)!"
16485
- aria-hidden="true"
16486
- ></i
16487
- ></ax-icon>
16488
- } @else {
16489
- <ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>
16490
- }
16491
- </ax-avatar>
16492
- }
16493
- </div>
16494
- }
16611
+ </ax-avatar>
16612
+ }
16613
+ </div>
16614
+ }
16495
16615
 
16496
- <div class="message-content-row" [class.message-content-row-own]="isOwnMessage(message)">
16497
- <button
16498
- type="button"
16499
- class="add-reaction-button add-reaction-outside"
16500
- [class.add-reaction-visible]="reactionPickerTarget() === message.id"
16501
- (click)="toggleReactionPicker(message.id, $event)"
16502
- [attr.aria-label]="'Add reaction to message'"
16503
- #reactionButton
16504
- >
16505
- <i class="fa-light fa-face-smile"></i>
16506
- </button>
16616
+ <div class="message-content-row" [class.message-content-row-own]="isOwnMessage(message)">
16617
+ <button
16618
+ type="button"
16619
+ class="add-reaction-button add-reaction-outside"
16620
+ [class.add-reaction-visible]="reactionPickerTarget() === message.id"
16621
+ (click)="toggleReactionPicker(message.id, $event)"
16622
+ [attr.aria-label]="'Add reaction to message'"
16623
+ #reactionButton
16624
+ >
16625
+ <i class="fa-light fa-face-smile"></i>
16626
+ </button>
16507
16627
 
16508
- <div
16509
- class="message-bubble-container"
16510
- [id]="'message-bubble-' + message.id"
16511
- [attr.data-message-id]="message.id"
16512
- >
16513
16628
  <div
16514
- [class]="getBubbleClasses(message)"
16515
- [class.message-bubble-sent]="message.senderId === currentUser()?.id"
16516
- [class.message-bubble-received]="message.senderId !== currentUser()?.id"
16629
+ class="message-bubble-container"
16630
+ [id]="'message-bubble-' + message.id"
16631
+ [attr.data-message-id]="message.id"
16517
16632
  >
16518
- <!-- Sender name (only for group conversations and received messages) -->
16519
- @if (shouldShowSenderName(message)) {
16520
- <div class="message-sender">{{ getSenderName(message) }}:</div>
16521
- }
16633
+ <div
16634
+ [class]="getBubbleClasses(message)"
16635
+ [class.message-bubble-sent]="message.senderId === currentUser()?.id"
16636
+ [class.message-bubble-received]="message.senderId !== currentUser()?.id"
16637
+ >
16638
+ <!-- Sender name (only for group conversations and received messages) -->
16639
+ @if (shouldShowSenderName(message)) {
16640
+ <div class="message-sender">{{ getSenderName(message) }}:</div>
16641
+ }
16522
16642
 
16523
- <!-- Reply Preview -->
16524
- @if (message.replyTo) {
16525
- <div
16526
- class="reply-preview"
16527
- (click)="scrollToMessage(message.replyTo.id)"
16528
- role="button"
16529
- [attr.aria-label]="'Reply to ' + getSenderName(message.replyTo)"
16530
- (keydown.enter)="scrollToMessage(message.replyTo.id)"
16531
- (keydown.space)="scrollToMessage(message.replyTo.id)"
16532
- >
16533
- <div class="reply-preview-content">
16534
- <div class="reply-preview-sender">{{ getSenderName(message.replyTo) }}</div>
16535
- <div class="reply-preview-text">
16536
- @if (getMessagePreviewText(message.replyTo); as preview) {
16537
- <span class="last-message">
16538
- @if (preview.type !== 'text') {
16539
- <i [class]="preview.icon"></i
16540
- >{{ '@acorex:chat.' + preview.type | translate | async }}
16541
- } @else {
16542
- {{ preview.value }}
16543
- }
16544
- </span>
16545
- }
16643
+ <!-- Reply Preview -->
16644
+ @if (message.replyTo) {
16645
+ <div
16646
+ class="reply-preview"
16647
+ (click)="scrollToMessage(message.replyTo.id)"
16648
+ role="button"
16649
+ [attr.aria-label]="'Reply to ' + getSenderName(message.replyTo)"
16650
+ (keydown.enter)="scrollToMessage(message.replyTo.id)"
16651
+ (keydown.space)="scrollToMessage(message.replyTo.id)"
16652
+ >
16653
+ <div class="reply-preview-content">
16654
+ <div class="reply-preview-sender">{{ getSenderName(message.replyTo) }}</div>
16655
+ <div class="reply-preview-text">
16656
+ @if (getMessagePreviewText(message.replyTo); as preview) {
16657
+ <span class="last-message">
16658
+ @if (preview.type !== 'text') {
16659
+ <i [class]="preview.icon"></i
16660
+ >{{ '@acorex:chat.' + preview.type | translate | async }}
16661
+ } @else {
16662
+ {{ preview.value }}
16663
+ }
16664
+ </span>
16665
+ }
16666
+ </div>
16546
16667
  </div>
16547
16668
  </div>
16548
- </div>
16549
- }
16550
-
16551
- <!-- Forwarded Indicator -->
16552
- @if (message.forwarded) {
16553
- <div class="forwarded-preview">
16554
- <i class="fa-solid fa-share"></i>
16555
- <span class="forwarded-text">{{ getForwardedText(message) }}</span>
16556
- </div>
16557
- }
16669
+ }
16558
16670
 
16559
- <ng-container
16560
- *ngComponentOutlet="getRendererComponent(message); inputs: getRendererInputs(message)"
16561
- ></ng-container>
16562
-
16563
- @if (message.reactions.length > 0) {
16564
- <div class="message-reactions-container">
16565
- <div class="message-reactions-bubbles">
16566
- @for (reaction of getGroupedReactions(message); track reaction.emoji) {
16567
- <button
16568
- type="button"
16569
- class="reaction-bubble"
16570
- [class.reaction-bubble-active]="reaction.hasReacted"
16571
- (click)="onReactionClick(message, reaction.emoji)"
16572
- [attr.aria-label]="reaction.emoji + ' ' + reaction.count"
16573
- >
16574
- <span class="reaction-emoji">{{ reaction.emoji }}</span>
16575
- @if (reaction.count > 1) {
16576
- <span class="reaction-count">{{ reaction.count }}</span>
16577
- }
16578
- </button>
16579
- }
16671
+ <!-- Forwarded Indicator -->
16672
+ @if (message.forwarded) {
16673
+ <div class="forwarded-preview">
16674
+ <i class="fa-solid fa-share"></i>
16675
+ <span class="forwarded-text">{{ getForwardedText(message) }}</span>
16580
16676
  </div>
16581
- </div>
16582
- }
16583
-
16584
- <!-- Message Footer -->
16585
- <div class="message-footer">
16586
- @if (getReplyCount(message) > 0) {
16587
- <span class="message-footer-count" [attr.aria-label]="getReplyCount(message) + ' replies'">
16588
- <i class="fa-solid fa-message" aria-hidden="true"></i>
16589
- <span class="message-footer-count-value">{{ getReplyCount(message) }}</span>
16590
- </span>
16591
- }
16592
- @if (getForwardCount(message) > 0) {
16593
- <span
16594
- class="message-footer-count"
16595
- [attr.aria-label]="getForwardCount(message) + ' forwards'"
16596
- >
16597
- <i class="fa-solid fa-share" aria-hidden="true"></i>
16598
- <span class="message-footer-count-value">{{ getForwardCount(message) }}</span>
16599
- </span>
16600
16677
  }
16601
- @if (getReplyCount(message) > 0 || getForwardCount(message) > 0) {
16602
- <span class="message-footer-split" aria-hidden="true"></span>
16603
- }
16604
- <span class="message-time">{{ message.timestamp | format: 'timeleft' | async }}</span>
16605
- @if (message.editedAt) {
16606
- <span class="edited-indicator">
16607
- <span>Edited</span>
16608
- </span>
16609
- }
16610
- @if (isOwnMessage(message)) {
16611
- <span [class]="getStatusIconClasses(message)">
16612
- <ax-icon><i [class]="getStatusIcon(message)"></i></ax-icon>
16613
- </span>
16678
+
16679
+ <ng-container
16680
+ *ngComponentOutlet="getRendererComponent(message); inputs: getRendererInputs(message)"
16681
+ ></ng-container>
16682
+
16683
+ @if (message.reactions.length > 0) {
16684
+ <div class="message-reactions-container">
16685
+ <div class="message-reactions-bubbles">
16686
+ @for (reaction of getGroupedReactions(message); track reaction.emoji) {
16687
+ <button
16688
+ type="button"
16689
+ class="reaction-bubble"
16690
+ [class.reaction-bubble-active]="reaction.hasReacted"
16691
+ (click)="onReactionClick(message, reaction.emoji)"
16692
+ [attr.aria-label]="reaction.emoji + ' ' + reaction.count"
16693
+ >
16694
+ <span class="reaction-emoji">{{ reaction.emoji }}</span>
16695
+ @if (reaction.count > 1) {
16696
+ <span class="reaction-count">{{ reaction.count }}</span>
16697
+ }
16698
+ </button>
16699
+ }
16700
+ </div>
16701
+ </div>
16614
16702
  }
16703
+
16704
+ <!-- Message Footer -->
16705
+ <div class="message-footer">
16706
+ @if (getReplyCount(message) > 0) {
16707
+ <span
16708
+ class="message-footer-count"
16709
+ [attr.aria-label]="getReplyCount(message) + ' replies'"
16710
+ >
16711
+ <i class="fa-solid fa-message" aria-hidden="true"></i>
16712
+ <span class="message-footer-count-value">{{ getReplyCount(message) }}</span>
16713
+ </span>
16714
+ }
16715
+ @if (getForwardCount(message) > 0) {
16716
+ <span
16717
+ class="message-footer-count"
16718
+ [attr.aria-label]="getForwardCount(message) + ' forwards'"
16719
+ >
16720
+ <i class="fa-solid fa-share" aria-hidden="true"></i>
16721
+ <span class="message-footer-count-value">{{ getForwardCount(message) }}</span>
16722
+ </span>
16723
+ }
16724
+ @if (getReplyCount(message) > 0 || getForwardCount(message) > 0) {
16725
+ <span class="message-footer-split" aria-hidden="true"></span>
16726
+ }
16727
+ <span class="message-time">{{ message.timestamp | format: 'timeleft' | async }}</span>
16728
+ @if (message.editedAt) {
16729
+ <span class="edited-indicator">
16730
+ <span>Edited</span>
16731
+ </span>
16732
+ }
16733
+ @if (isOwnMessage(message)) {
16734
+ <span [class]="getStatusIconClasses(message)">
16735
+ <ax-icon><i [class]="getStatusIcon(message)"></i></ax-icon>
16736
+ </span>
16737
+ }
16738
+ </div>
16615
16739
  </div>
16616
16740
  </div>
16617
16741
  </div>
16618
- </div>
16619
16742
 
16620
- <!-- Context Menu for Message Actions -->
16621
- <ax-context-menu
16622
- [target]="'#message-bubble-' + message.id"
16623
- [openOn]="'click'"
16624
- [closeOn]="'click'"
16625
- (onOpening)="handleMessageContextMenuOpening($event, message)"
16626
- (onItemClick)="handleMessageContextMenuItemClick($event, message)"
16627
- >
16628
- </ax-context-menu>
16629
- </div>
16743
+ <!-- Context Menu for Message Actions -->
16744
+ <ax-context-menu
16745
+ [target]="'#message-bubble-' + message.id"
16746
+ [openOn]="'click'"
16747
+ [closeOn]="'click'"
16748
+ (onOpening)="handleMessageContextMenuOpening($event, message)"
16749
+ (onClose)="contextMenuMessageId.set(null)"
16750
+ (onItemClick)="handleMessageContextMenuItemClick($event, message)"
16751
+ >
16752
+ </ax-context-menu>
16753
+ </div>
16754
+ }
16630
16755
  }
16631
- }
16632
- </div>
16756
+ </div>
16633
16757
 
16634
- <!-- Scroll to Bottom Button -->
16635
- @if (showScrollButton()) {
16636
- <ax-button
16637
- class="scroll-to-bottom"
16638
- (onClick)="scrollToBottom()"
16639
- animate.enter="slide-in"
16640
- animate.leave="slide-out"
16641
- [text]="'↓'"
16642
- [look]="'solid'"
16643
- aria-label="Scroll to bottom of messages"
16644
- ></ax-button>
16758
+ <!-- Scroll to Bottom Button -->
16759
+ @if (showScrollButton()) {
16760
+ <ax-button
16761
+ class="scroll-to-bottom"
16762
+ (onClick)="scrollToBottom()"
16763
+ animate.enter="slide-in"
16764
+ animate.leave="slide-out"
16765
+ [text]="'↓'"
16766
+ [look]="'solid'"
16767
+ aria-label="Scroll to bottom of messages"
16768
+ ></ax-button>
16769
+ }
16645
16770
  }
16646
- }
16647
- </div>
16771
+ </div>
16772
+ }
16648
16773
 
16649
16774
  <!-- Reaction Picker Popover -->
16650
16775
  @if (reactionPickerTarget()) {
@@ -16679,8 +16804,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
16679
16804
  </div>
16680
16805
  </ax-popover>
16681
16806
  }
16807
+ } @else {
16808
+ <div class="message-list message-list--no-active" role="region" aria-label="No conversation selected">
16809
+ <div class="list-no-active">
16810
+ <ng-content select="ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]">
16811
+ <ng-container *ngComponentOutlet="noActiveFallbackComponent"></ng-container>
16812
+ </ng-content>
16813
+ </div>
16814
+ </div>
16682
16815
  }
16683
- `, styles: [":host{display:block;height:100%;position:relative}.message-list{height:100%}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;padding:3rem 2rem;gap:1.25rem;animation:fadeInUp .5s ease-out}@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:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.messages-container{width:100%;height:100%;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-highlight{background-color:rgba(var(--ax-sys-color-primary-500),.1);border-radius:.5rem}.fade-slide-in{animation:fadeSlideIn var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes fadeSlideIn{0%{opacity:0;// transform: translateX(20%)}to{opacity:1;// transform: translateX(0)}}.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:70%;min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}.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;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-bottom-left-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;left:-.7rem;border-top-left-radius:86%;corner-shape:scoop}.message-bubble-sent{border-bottom-right-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;right:-.7rem;border-top-right-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;right: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"] }]
16816
+ `, styles: [":host{display:block;height:100%;position:relative}.message-list{height:100%}.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-direction:column;align-items:center;justify-content:center;height:100%;text-align:center}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;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:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.messages-container{width:100%;height:100%;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:70%;min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}.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;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-bottom-left-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;left:-.7rem;border-top-left-radius:86%;corner-shape:scoop}.message-bubble-sent{border-bottom-right-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;right:-.7rem;border-top-right-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;right: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"] }]
16684
16817
  }], ctorParameters: () => [] });
16685
16818
 
16686
16819
  /**
@@ -16707,12 +16840,17 @@ class AXConversationItemComponent {
16707
16840
  const activeConv = this.conversationService.activeConversation();
16708
16841
  return activeConv?.id === this.conversation().id;
16709
16842
  }, ...(ngDevMode ? [{ debugName: "isActive" }] : []));
16843
+ /** True while this row's context menu is open */
16844
+ this.contextMenuOpen = signal(false, ...(ngDevMode ? [{ debugName: "contextMenuOpen" }] : []));
16710
16845
  /** Item CSS classes - delegate to component logic */
16711
16846
  this.itemClasses = computed(() => {
16712
16847
  const classes = ['conversation-item'];
16713
16848
  if (this.isActive()) {
16714
16849
  classes.push('conversation-item-active');
16715
16850
  }
16851
+ if (this.contextMenuOpen()) {
16852
+ classes.push('conversation-item-context-active');
16853
+ }
16716
16854
  return classes.join(' ');
16717
16855
  }, ...(ngDevMode ? [{ debugName: "itemClasses" }] : []));
16718
16856
  /** Conversation status for avatar - delegate to utils */
@@ -16745,6 +16883,7 @@ class AXConversationItemComponent {
16745
16883
  }
16746
16884
  /** Handle context menu opening for conversations */
16747
16885
  handleContextMenuOpening(event) {
16886
+ this.contextMenuOpen.set(true);
16748
16887
  const conversation = this.liveConversation();
16749
16888
  const actions = this.registry.conversationItemActions.getActionsForConversation(conversation);
16750
16889
  // Convert conversation item actions to context menu items
@@ -16768,6 +16907,7 @@ class AXConversationItemComponent {
16768
16907
  }
16769
16908
  /** Handle context menu item click for conversations */
16770
16909
  async handleContextMenuItemClick(event) {
16910
+ this.contextMenuOpen.set(false);
16771
16911
  const action = event.item.data;
16772
16912
  const conversation = this.liveConversation();
16773
16913
  if (action && conversation && action.handler) {
@@ -16896,10 +17036,11 @@ class AXConversationItemComponent {
16896
17036
  [openOn]="'click'"
16897
17037
  [closeOn]="'click'"
16898
17038
  (onOpening)="handleContextMenuOpening($event)"
17039
+ (onClose)="contextMenuOpen.set(false)"
16899
17040
  (onItemClick)="handleContextMenuItemClick($event)"
16900
17041
  >
16901
17042
  </ax-context-menu>
16902
- `, 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))}.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;right: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-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.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", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17043
+ `, 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;right: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-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.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", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16903
17044
  }
16904
17045
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationItemComponent, decorators: [{
16905
17046
  type: Component,
@@ -17026,10 +17167,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
17026
17167
  [openOn]="'click'"
17027
17168
  [closeOn]="'click'"
17028
17169
  (onOpening)="handleContextMenuOpening($event)"
17170
+ (onClose)="contextMenuOpen.set(false)"
17029
17171
  (onItemClick)="handleContextMenuItemClick($event)"
17030
17172
  >
17031
17173
  </ax-context-menu>
17032
- `, 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))}.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;right: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-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"] }]
17174
+ `, 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;right: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-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"] }]
17033
17175
  }] });
17034
17176
 
17035
17177
  class AXNewConversationDialogComponent extends AXBasePageComponent {
@@ -17474,7 +17616,9 @@ class AXSidebarService {
17474
17616
  return `${c.id}:${time}`;
17475
17617
  })
17476
17618
  .join('|');
17477
- const cacheKey = `${conversations.length}-${query}-${tabId}-${pinnedIds}-${timestampsHash}`;
17619
+ // Unread counts affect tab badges and list relevance — include so cache invalidates when only reads change
17620
+ const unreadHash = conversations.map((c) => `${c.id}:${c.unreadCount ?? 0}`).join('|');
17621
+ const cacheKey = `${conversations.length}-${query}-${tabId}-${pinnedIds}-${timestampsHash}-${unreadHash}`;
17478
17622
  // Return cached result if available
17479
17623
  if (this.filterCache.has(cacheKey)) {
17480
17624
  const cached = this.filterCache.get(cacheKey);
@@ -17686,16 +17830,18 @@ class AXSidebarComponent {
17686
17830
  <ax-tabs (onActiveTabChanged)="onTabChange($event)" [look]="'with-line'" [style.overflow]="'hidden'">
17687
17831
  @for (tab of enabledTabs(); track tab.id) {
17688
17832
  <ax-tab-item [text]="tab.label" [key]="tab.id">
17689
- <ng-template #prefix>
17690
- @if (tab.icon) {
17691
- <ax-label class="tab-icon">{{ tab.icon }}</ax-label>
17692
- }
17693
- </ng-template>
17694
- <ng-template #suffix>
17695
- @if (tab.badge && getBadgeValue(tab.id)) {
17696
- <ax-badge [text]="getBadgeValue(tab.id)" [color]="'primary'" />
17697
- }
17698
- </ng-template>
17833
+ @if (tab.icon) {
17834
+ <ax-prefix>
17835
+ <ax-icon>
17836
+ <i [class]="'tab-icon ' + tab.icon" aria-hidden="true"></i>
17837
+ </ax-icon>
17838
+ </ax-prefix>
17839
+ }
17840
+ @if (tab.badge && getBadgeValue(tab.id); as badgeText) {
17841
+ <ax-suffix>
17842
+ <ax-badge [text]="badgeText" [color]="'primary'" />
17843
+ </ax-suffix>
17844
+ }
17699
17845
  </ax-tab-item>
17700
17846
  }
17701
17847
  </ax-tabs>
@@ -17760,12 +17906,13 @@ class AXSidebarComponent {
17760
17906
  </ng-content>
17761
17907
  </div>
17762
17908
  </div>
17763
- `, 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;left:0;right:.25rem;padding:1rem .5rem;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.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:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}// 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: "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: "component", type: AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXConversationItemComponent, selector: "ax-conversation-item", inputs: ["avatarTemplate", "conversation"], outputs: ["clicked"] }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17909
+ `, 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;left:0;right:.25rem;padding:1rem .5rem;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.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:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}// 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: "component", type: AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXConversationItemComponent, selector: "ax-conversation-item", inputs: ["avatarTemplate", "conversation"], outputs: ["clicked"] }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17764
17910
  }
17765
17911
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXSidebarComponent, decorators: [{
17766
17912
  type: Component,
17767
17913
  args: [{ selector: 'ax-conversation-sidebar', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
17768
17914
  CommonModule,
17915
+ AXDecoratorModule,
17769
17916
  AXTabsComponent,
17770
17917
  AXTabItemComponent,
17771
17918
  AXBadgeComponent,
@@ -17796,16 +17943,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
17796
17943
  <ax-tabs (onActiveTabChanged)="onTabChange($event)" [look]="'with-line'" [style.overflow]="'hidden'">
17797
17944
  @for (tab of enabledTabs(); track tab.id) {
17798
17945
  <ax-tab-item [text]="tab.label" [key]="tab.id">
17799
- <ng-template #prefix>
17800
- @if (tab.icon) {
17801
- <ax-label class="tab-icon">{{ tab.icon }}</ax-label>
17802
- }
17803
- </ng-template>
17804
- <ng-template #suffix>
17805
- @if (tab.badge && getBadgeValue(tab.id)) {
17806
- <ax-badge [text]="getBadgeValue(tab.id)" [color]="'primary'" />
17807
- }
17808
- </ng-template>
17946
+ @if (tab.icon) {
17947
+ <ax-prefix>
17948
+ <ax-icon>
17949
+ <i [class]="'tab-icon ' + tab.icon" aria-hidden="true"></i>
17950
+ </ax-icon>
17951
+ </ax-prefix>
17952
+ }
17953
+ @if (tab.badge && getBadgeValue(tab.id); as badgeText) {
17954
+ <ax-suffix>
17955
+ <ax-badge [text]="badgeText" [color]="'primary'" />
17956
+ </ax-suffix>
17957
+ }
17809
17958
  </ax-tab-item>
17810
17959
  }
17811
17960
  </ax-tabs>
@@ -18357,5 +18506,5 @@ function getErrorMessage(code, params) {
18357
18506
  * Generated bundle index. Do not edit.
18358
18507
  */
18359
18508
 
18360
- export { AXAudioInfoBarBannerComponent, AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, 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, AXConversationStoreService, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXFileUploadService, AXForwardMessageDialogComponent, AXImagePickerComponent, AXImageRendererComponent, AXInfiniteScrollDirective, AXInfoBarActionRegistry, AXInfoBarComponent, AXInfoBarSearchComponent, AXInfoBarService, AXLocationPickerComponent, AXLocationRendererComponent, AXMessageActionRegistry, AXMessageApi, AXMessageListComponent, AXMessageListService, AXMessageRendererRegistry, AXNewConversationDialogComponent, AXPickerFooterComponent, AXPickerHeaderComponent, AXRealtimeApi, AXRegistryService, AXSidebarComponent, AXSidebarService, AXStickerRendererComponent, AXStickerTabComponent, AXSystemRendererComponent, AXTextRendererComponent, AXUserApi, AXVideoInfoBarBannerComponent, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceInfoBarBannerComponent, 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_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_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_COPY_ACTION, 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_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_STICKER_API_KEY, CONNECTION_ERRORS, CONVERSATION_CONFIG, CONVERSATION_ERRORS, 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, PERMISSION_ERRORS, REGISTRY_CONFIG, URL_ERRORS, USER_ERRORS, axConversationIndexedDbStorage, conversationSharedStorage, formatErrorMessage, getDefaultConversationItemActions, getErrorMessage, mergeWithDefaults, provideConversation, sanitizeInput, validateConversationId, validateEmail, validateFile, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
18509
+ export { AXAudioInfoBarBannerComponent, AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, 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, AXConversationStoreService, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXFileUploadService, 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, AXVideoInfoBarBannerComponent, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceInfoBarBannerComponent, 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_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_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_COPY_ACTION, 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_STICKER_API_KEY, CONNECTION_ERRORS, CONVERSATION_CONFIG, CONVERSATION_ERRORS, 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, PERMISSION_ERRORS, REGISTRY_CONFIG, URL_ERRORS, USER_ERRORS, axConversationIndexedDbStorage, conversationSharedStorage, formatErrorMessage, getDefaultConversationItemActions, getErrorMessage, mergeWithDefaults, provideConversation, sanitizeInput, validateConversationId, validateEmail, validateFile, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
18361
18510
  //# sourceMappingURL=acorex-components-conversation2.mjs.map