@acorex/components 20.4.14 → 20.4.16

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.
@@ -2273,13 +2273,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
2273
2273
  const DB_NAME = 'acorex-conversation-db';
2274
2274
  const DB_VERSION = 1;
2275
2275
  // Store names
2276
- const STORES = {
2276
+ const AXConversationIndexedDbStores = {
2277
2277
  PARTICIPANTS: 'participants',
2278
2278
  CONVERSATIONS: 'conversations',
2279
2279
  MESSAGES: 'messages',
2280
2280
  SETTINGS: 'settings',
2281
2281
  };
2282
- class IndexedDBStorage {
2282
+ class AXConversationIndexedDbStorage {
2283
2283
  constructor() {
2284
2284
  this.db = null;
2285
2285
  this.initPromise = null;
@@ -2302,20 +2302,20 @@ class IndexedDBStorage {
2302
2302
  request.onupgradeneeded = (event) => {
2303
2303
  const db = event.target.result;
2304
2304
  // Create object stores if they don't exist
2305
- if (!db.objectStoreNames.contains(STORES.PARTICIPANTS)) {
2306
- db.createObjectStore(STORES.PARTICIPANTS, { keyPath: 'id' });
2305
+ if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.PARTICIPANTS)) {
2306
+ db.createObjectStore(AXConversationIndexedDbStores.PARTICIPANTS, { keyPath: 'id' });
2307
2307
  }
2308
- if (!db.objectStoreNames.contains(STORES.CONVERSATIONS)) {
2309
- const convStore = db.createObjectStore(STORES.CONVERSATIONS, { keyPath: 'id' });
2308
+ if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.CONVERSATIONS)) {
2309
+ const convStore = db.createObjectStore(AXConversationIndexedDbStores.CONVERSATIONS, { keyPath: 'id' });
2310
2310
  convStore.createIndex('lastMessageAt', 'lastMessageAt', { unique: false });
2311
2311
  }
2312
- if (!db.objectStoreNames.contains(STORES.MESSAGES)) {
2313
- const msgStore = db.createObjectStore(STORES.MESSAGES, { keyPath: 'id' });
2312
+ if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.MESSAGES)) {
2313
+ const msgStore = db.createObjectStore(AXConversationIndexedDbStores.MESSAGES, { keyPath: 'id' });
2314
2314
  msgStore.createIndex('conversationId', 'conversationId', { unique: false });
2315
2315
  msgStore.createIndex('timestamp', 'timestamp', { unique: false });
2316
2316
  }
2317
- if (!db.objectStoreNames.contains(STORES.SETTINGS)) {
2318
- db.createObjectStore(STORES.SETTINGS, { keyPath: 'key' });
2317
+ if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.SETTINGS)) {
2318
+ db.createObjectStore(AXConversationIndexedDbStores.SETTINGS, { keyPath: 'key' });
2319
2319
  }
2320
2320
  };
2321
2321
  });
@@ -2422,56 +2422,57 @@ class IndexedDBStorage {
2422
2422
  // Convenience Methods
2423
2423
  // =====================
2424
2424
  async getParticipant(id) {
2425
- return this.get(STORES.PARTICIPANTS, id);
2425
+ return this.get(AXConversationIndexedDbStores.PARTICIPANTS, id);
2426
2426
  }
2427
2427
  async getAllParticipants() {
2428
- return this.getAll(STORES.PARTICIPANTS);
2428
+ return this.getAll(AXConversationIndexedDbStores.PARTICIPANTS);
2429
2429
  }
2430
2430
  async putParticipant(participant) {
2431
- return this.put(STORES.PARTICIPANTS, participant);
2431
+ return this.put(AXConversationIndexedDbStores.PARTICIPANTS, participant);
2432
2432
  }
2433
2433
  async getConversation(id) {
2434
- return this.get(STORES.CONVERSATIONS, id);
2434
+ return this.get(AXConversationIndexedDbStores.CONVERSATIONS, id);
2435
2435
  }
2436
2436
  async getAllConversations() {
2437
- return this.getAll(STORES.CONVERSATIONS);
2437
+ return this.getAll(AXConversationIndexedDbStores.CONVERSATIONS);
2438
2438
  }
2439
2439
  async putConversation(conversation) {
2440
- return this.put(STORES.CONVERSATIONS, conversation);
2440
+ return this.put(AXConversationIndexedDbStores.CONVERSATIONS, conversation);
2441
2441
  }
2442
2442
  async deleteConversation(id) {
2443
- return this.delete(STORES.CONVERSATIONS, id);
2443
+ return this.delete(AXConversationIndexedDbStores.CONVERSATIONS, id);
2444
2444
  }
2445
2445
  async getMessage(id) {
2446
- return this.get(STORES.MESSAGES, id);
2446
+ return this.get(AXConversationIndexedDbStores.MESSAGES, id);
2447
2447
  }
2448
2448
  async getAllMessages() {
2449
- return this.getAll(STORES.MESSAGES);
2449
+ return this.getAll(AXConversationIndexedDbStores.MESSAGES);
2450
2450
  }
2451
2451
  async getMessagesByConversation(conversationId) {
2452
- return this.getAllByIndex(STORES.MESSAGES, 'conversationId', conversationId);
2452
+ return this.getAllByIndex(AXConversationIndexedDbStores.MESSAGES, 'conversationId', conversationId);
2453
2453
  }
2454
2454
  async putMessage(message) {
2455
- return this.put(STORES.MESSAGES, message);
2455
+ return this.put(AXConversationIndexedDbStores.MESSAGES, message);
2456
2456
  }
2457
2457
  async deleteMessage(id) {
2458
- return this.delete(STORES.MESSAGES, id);
2458
+ return this.delete(AXConversationIndexedDbStores.MESSAGES, id);
2459
2459
  }
2460
2460
  async getSetting(key) {
2461
- const result = await this.get(STORES.SETTINGS, key);
2461
+ const result = await this.get(AXConversationIndexedDbStores.SETTINGS, key);
2462
2462
  return result?.value;
2463
2463
  }
2464
2464
  async putSetting(key, value) {
2465
- return this.put(STORES.SETTINGS, { key, value });
2465
+ return this.put(AXConversationIndexedDbStores.SETTINGS, { key, value });
2466
2466
  }
2467
2467
  }
2468
2468
  // Export singleton instance
2469
- const indexedDBStorage = new IndexedDBStorage();
2469
+ const axConversationIndexedDbStorage = new AXConversationIndexedDbStorage();
2470
2470
 
2471
2471
  var indexeddbStorage = /*#__PURE__*/Object.freeze({
2472
2472
  __proto__: null,
2473
- STORES: STORES,
2474
- indexedDBStorage: indexedDBStorage
2473
+ AXConversationIndexedDbStorage: AXConversationIndexedDbStorage,
2474
+ AXConversationIndexedDbStores: AXConversationIndexedDbStores,
2475
+ axConversationIndexedDbStorage: axConversationIndexedDbStorage
2475
2476
  });
2476
2477
 
2477
2478
  /**
@@ -2480,7 +2481,7 @@ var indexeddbStorage = /*#__PURE__*/Object.freeze({
2480
2481
  * This is NOT a service - just a shared data structure
2481
2482
  */
2482
2483
  // Shared storage instance
2483
- class SharedStorage {
2484
+ class AXConversationSharedStorage {
2484
2485
  constructor() {
2485
2486
  // Connection status
2486
2487
  this.connectionStatus$ = new BehaviorSubject('disconnected');
@@ -2509,13 +2510,13 @@ class SharedStorage {
2509
2510
  try {
2510
2511
  console.log('📂 Loading data from IndexedDB...');
2511
2512
  // Load participants
2512
- const participants = await indexedDBStorage.getAllParticipants();
2513
+ const participants = await axConversationIndexedDbStorage.getAllParticipants();
2513
2514
  participants.forEach((p) => this.participants.set(p.id, p));
2514
2515
  // Load conversations
2515
- const conversations = await indexedDBStorage.getAllConversations();
2516
+ const conversations = await axConversationIndexedDbStorage.getAllConversations();
2516
2517
  conversations.forEach((c) => this.conversations.set(c.id, c));
2517
2518
  // Load messages
2518
- const messages = await indexedDBStorage.getAllMessages();
2519
+ const messages = await axConversationIndexedDbStorage.getAllMessages();
2519
2520
  messages.forEach((m) => {
2520
2521
  this.messages.set(m.id, m);
2521
2522
  const convMessages = this.messagesByConversation.get(m.conversationId) || [];
@@ -2525,7 +2526,7 @@ class SharedStorage {
2525
2526
  }
2526
2527
  });
2527
2528
  // Check if we loaded the seeded flag
2528
- const seededFlag = await indexedDBStorage.getSetting('isSeeded');
2529
+ const seededFlag = await axConversationIndexedDbStorage.getSetting('isSeeded');
2529
2530
  this.isSeeded = seededFlag === true;
2530
2531
  this.isLoadedFromDB = true;
2531
2532
  console.log('✅ Loaded from IndexedDB:', {
@@ -2814,7 +2815,7 @@ class SharedStorage {
2814
2815
  // Store participants in memory and IndexedDB
2815
2816
  for (const p of participants) {
2816
2817
  this.participants.set(p.id, p);
2817
- await indexedDBStorage.putParticipant(p);
2818
+ await axConversationIndexedDbStorage.putParticipant(p);
2818
2819
  }
2819
2820
  // Start presence simulation
2820
2821
  this.startPresenceSimulation();
@@ -2971,7 +2972,7 @@ class SharedStorage {
2971
2972
  // Store conversations in memory and IndexedDB
2972
2973
  for (const c of conversations) {
2973
2974
  this.conversations.set(c.id, c);
2974
- await indexedDBStorage.putConversation(c);
2975
+ await axConversationIndexedDbStorage.putConversation(c);
2975
2976
  }
2976
2977
  // Create messages with ALL types for each conversation
2977
2978
  const messages = [];
@@ -3225,7 +3226,7 @@ class SharedStorage {
3225
3226
  const convMessages = this.messagesByConversation.get(m.conversationId) || [];
3226
3227
  convMessages.push(m.id);
3227
3228
  this.messagesByConversation.set(m.conversationId, convMessages);
3228
- await indexedDBStorage.putMessage(m);
3229
+ await axConversationIndexedDbStorage.putMessage(m);
3229
3230
  }
3230
3231
  // Update conversations with last messages
3231
3232
  conversations[0].lastMessage = messages.find((m) => m.id === 'msg-1-8');
@@ -3235,10 +3236,10 @@ class SharedStorage {
3235
3236
  // Update in memory and IndexedDB
3236
3237
  for (const c of conversations) {
3237
3238
  this.conversations.set(c.id, c);
3238
- await indexedDBStorage.putConversation(c);
3239
+ await axConversationIndexedDbStorage.putConversation(c);
3239
3240
  }
3240
3241
  this.isSeeded = true;
3241
- await indexedDBStorage.putSetting('isSeeded', true);
3242
+ await axConversationIndexedDbStorage.putSetting('isSeeded', true);
3242
3243
  console.log('✅ Initial data seeded successfully!');
3243
3244
  // Start message simulation
3244
3245
  this.startMessageSimulation();
@@ -3415,13 +3416,13 @@ class SharedStorage {
3415
3416
  const convMessages = this.messagesByConversation.get(randomConv.id) || [];
3416
3417
  convMessages.push(newMessage.id);
3417
3418
  this.messagesByConversation.set(randomConv.id, convMessages);
3418
- await indexedDBStorage.putMessage(newMessage);
3419
+ await axConversationIndexedDbStorage.putMessage(newMessage);
3419
3420
  // Update conversation
3420
3421
  randomConv.lastMessage = newMessage;
3421
3422
  randomConv.lastMessageAt = newMessage.timestamp;
3422
3423
  randomConv.unreadCount = (randomConv.unreadCount || 0) + 1;
3423
3424
  this.conversations.set(randomConv.id, randomConv);
3424
- await indexedDBStorage.putConversation(randomConv);
3425
+ await axConversationIndexedDbStorage.putConversation(randomConv);
3425
3426
  // Emit message
3426
3427
  this.messageStream$.next(newMessage);
3427
3428
  this.conversationUpdates$.next(randomConv);
@@ -3456,23 +3457,24 @@ class SharedStorage {
3456
3457
  }
3457
3458
  }
3458
3459
  // Export singleton instance
3459
- const sharedStorage = new SharedStorage();
3460
+ const conversationSharedStorage = new AXConversationSharedStorage();
3460
3461
 
3461
- var sharedStorage$1 = /*#__PURE__*/Object.freeze({
3462
+ var sharedStorage = /*#__PURE__*/Object.freeze({
3462
3463
  __proto__: null,
3463
- sharedStorage: sharedStorage
3464
+ AXConversationSharedStorage: AXConversationSharedStorage,
3465
+ conversationSharedStorage: conversationSharedStorage
3464
3466
  });
3465
3467
 
3466
3468
  /**
3467
3469
  * IndexedDB User API Implementation
3468
3470
  * Implements AXUserApi using IndexedDB backend
3469
3471
  */
3470
- class AXIndexedDBUserApi extends AXUserApi {
3472
+ class AXConversationIndexedDbUserApi extends AXUserApi {
3471
3473
  // =====================
3472
3474
  // User Profile
3473
3475
  // =====================
3474
3476
  async getCurrentUser() {
3475
- const user = sharedStorage.participants.get(sharedStorage.currentUserId);
3477
+ const user = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
3476
3478
  if (!user) {
3477
3479
  throw this.createError('USER_NOT_FOUND', 'Current user not found', 404);
3478
3480
  }
@@ -3498,8 +3500,8 @@ class AXIndexedDBUserApi extends AXUserApi {
3498
3500
  // User Discovery
3499
3501
  // =====================
3500
3502
  async getUsers(filters) {
3501
- const users = Array.from(sharedStorage.participants.values());
3502
- const filtered = users.filter((u) => u.id !== sharedStorage.currentUserId);
3503
+ const users = Array.from(conversationSharedStorage.participants.values());
3504
+ const filtered = users.filter((u) => u.id !== conversationSharedStorage.currentUserId);
3503
3505
  if (!filters?.query)
3504
3506
  return filtered;
3505
3507
  const q = filters.query.toLowerCase();
@@ -3509,7 +3511,7 @@ class AXIndexedDBUserApi extends AXUserApi {
3509
3511
  return this.getUsers({ query });
3510
3512
  }
3511
3513
  async getUserById(userId) {
3512
- const user = sharedStorage.participants.get(userId);
3514
+ const user = conversationSharedStorage.participants.get(userId);
3513
3515
  if (!user) {
3514
3516
  throw this.createError('USER_NOT_FOUND', `User ${userId} not found`, 404);
3515
3517
  }
@@ -3517,7 +3519,7 @@ class AXIndexedDBUserApi extends AXUserApi {
3517
3519
  }
3518
3520
  async getUsersByIds(userIds) {
3519
3521
  return userIds
3520
- .map((id) => sharedStorage.participants.get(id))
3522
+ .map((id) => conversationSharedStorage.participants.get(id))
3521
3523
  .filter((u) => u !== undefined);
3522
3524
  }
3523
3525
  // =====================
@@ -3568,10 +3570,10 @@ class AXIndexedDBUserApi extends AXUserApi {
3568
3570
  // Mock update settings
3569
3571
  await Promise.resolve();
3570
3572
  }
3571
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBUserApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
3572
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBUserApi }); }
3573
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbUserApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
3574
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbUserApi }); }
3573
3575
  }
3574
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBUserApi, decorators: [{
3576
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbUserApi, decorators: [{
3575
3577
  type: Injectable
3576
3578
  }] });
3577
3579
 
@@ -3579,7 +3581,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
3579
3581
  * IndexedDB Conversation Management API Implementation
3580
3582
  * Implements AXConversationManagementApi using IndexedDB backend
3581
3583
  */
3582
- class AXIndexedDBConversationApi extends AXConversationApi {
3584
+ class AXConversationIndexedDbConversationApi extends AXConversationApi {
3583
3585
  // =====================
3584
3586
  // Conversation CRUD
3585
3587
  // =====================
@@ -3591,13 +3593,13 @@ class AXIndexedDBConversationApi extends AXConversationApi {
3591
3593
  avatar: data.avatar,
3592
3594
  description: data.description,
3593
3595
  participants: data.participantIds.map((id) => {
3594
- const participant = sharedStorage.participants.get(id);
3596
+ const participant = conversationSharedStorage.participants.get(id);
3595
3597
  if (!participant) {
3596
3598
  throw this.createError('PARTICIPANT_NOT_FOUND', `Participant ${id} not found`, 404);
3597
3599
  }
3598
3600
  return {
3599
3601
  ...participant,
3600
- role: id === sharedStorage.currentUserId ? 'admin' : 'member',
3602
+ role: id === conversationSharedStorage.currentUserId ? 'admin' : 'member',
3601
3603
  };
3602
3604
  }),
3603
3605
  lastMessageAt: new Date(),
@@ -3618,20 +3620,20 @@ class AXIndexedDBConversationApi extends AXConversationApi {
3618
3620
  createdAt: new Date(),
3619
3621
  updatedAt: new Date(),
3620
3622
  };
3621
- sharedStorage.conversations.set(conversation.id, conversation);
3622
- await indexedDBStorage.putConversation(conversation);
3623
- sharedStorage.conversationUpdates$.next(conversation);
3623
+ conversationSharedStorage.conversations.set(conversation.id, conversation);
3624
+ await axConversationIndexedDbStorage.putConversation(conversation);
3625
+ conversationSharedStorage.conversationUpdates$.next(conversation);
3624
3626
  return conversation;
3625
3627
  }
3626
3628
  async getConversation(conversationId) {
3627
- const conversation = sharedStorage.conversations.get(conversationId);
3629
+ const conversation = conversationSharedStorage.conversations.get(conversationId);
3628
3630
  if (!conversation) {
3629
3631
  throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);
3630
3632
  }
3631
3633
  return conversation;
3632
3634
  }
3633
3635
  async getConversations(pagination, _filters) {
3634
- const items = Array.from(sharedStorage.conversations.values()).sort((a, b) => b.lastMessageAt.getTime() - a.lastMessageAt.getTime());
3636
+ const items = Array.from(conversationSharedStorage.conversations.values()).sort((a, b) => b.lastMessageAt.getTime() - a.lastMessageAt.getTime());
3635
3637
  const start = pagination.page * pagination.pageSize;
3636
3638
  const end = start + pagination.pageSize;
3637
3639
  return {
@@ -3649,21 +3651,21 @@ class AXIndexedDBConversationApi extends AXConversationApi {
3649
3651
  ...updates,
3650
3652
  updatedAt: new Date(),
3651
3653
  };
3652
- sharedStorage.conversations.set(conversationId, updated);
3653
- await indexedDBStorage.putConversation(updated);
3654
- sharedStorage.conversationUpdates$.next(updated);
3654
+ conversationSharedStorage.conversations.set(conversationId, updated);
3655
+ await axConversationIndexedDbStorage.putConversation(updated);
3656
+ conversationSharedStorage.conversationUpdates$.next(updated);
3655
3657
  return updated;
3656
3658
  }
3657
3659
  async deleteConversation(conversationId) {
3658
- sharedStorage.conversations.delete(conversationId);
3659
- await indexedDBStorage.deleteConversation(conversationId);
3660
+ conversationSharedStorage.conversations.delete(conversationId);
3661
+ await axConversationIndexedDbStorage.deleteConversation(conversationId);
3660
3662
  // Also delete associated messages
3661
- const messageIds = sharedStorage.messagesByConversation.get(conversationId) || [];
3663
+ const messageIds = conversationSharedStorage.messagesByConversation.get(conversationId) || [];
3662
3664
  for (const id of messageIds) {
3663
- sharedStorage.messages.delete(id);
3664
- await indexedDBStorage.deleteMessage(id);
3665
+ conversationSharedStorage.messages.delete(id);
3666
+ await axConversationIndexedDbStorage.deleteMessage(id);
3665
3667
  }
3666
- sharedStorage.messagesByConversation.delete(conversationId);
3668
+ conversationSharedStorage.messagesByConversation.delete(conversationId);
3667
3669
  return true;
3668
3670
  }
3669
3671
  // =====================
@@ -3672,14 +3674,14 @@ class AXIndexedDBConversationApi extends AXConversationApi {
3672
3674
  async archiveConversation(conversationId) {
3673
3675
  const conversation = await this.getConversation(conversationId);
3674
3676
  conversation.archived = true;
3675
- sharedStorage.conversations.set(conversationId, conversation);
3676
- await indexedDBStorage.putConversation(conversation);
3677
+ conversationSharedStorage.conversations.set(conversationId, conversation);
3678
+ await axConversationIndexedDbStorage.putConversation(conversation);
3677
3679
  }
3678
3680
  async unarchiveConversation(conversationId) {
3679
3681
  const conversation = await this.getConversation(conversationId);
3680
3682
  conversation.archived = false;
3681
- sharedStorage.conversations.set(conversationId, conversation);
3682
- await indexedDBStorage.putConversation(conversation);
3683
+ conversationSharedStorage.conversations.set(conversationId, conversation);
3684
+ await axConversationIndexedDbStorage.putConversation(conversation);
3683
3685
  }
3684
3686
  async pinConversation(_conversationId) {
3685
3687
  // Mock pin - would set pinned flag in real implementation
@@ -3692,22 +3694,22 @@ class AXIndexedDBConversationApi extends AXConversationApi {
3692
3694
  async markConversationAsRead(conversationId) {
3693
3695
  const conversation = await this.getConversation(conversationId);
3694
3696
  conversation.unreadCount = 0;
3695
- sharedStorage.conversations.set(conversationId, conversation);
3696
- await indexedDBStorage.putConversation(conversation);
3697
- sharedStorage.conversationUpdates$.next(conversation);
3697
+ conversationSharedStorage.conversations.set(conversationId, conversation);
3698
+ await axConversationIndexedDbStorage.putConversation(conversation);
3699
+ conversationSharedStorage.conversationUpdates$.next(conversation);
3698
3700
  }
3699
3701
  async markConversationAsUnread(conversationId) {
3700
3702
  const conversation = await this.getConversation(conversationId);
3701
3703
  conversation.unreadCount = Math.max(1, conversation.unreadCount);
3702
- sharedStorage.conversations.set(conversationId, conversation);
3703
- await indexedDBStorage.putConversation(conversation);
3704
- sharedStorage.conversationUpdates$.next(conversation);
3704
+ conversationSharedStorage.conversations.set(conversationId, conversation);
3705
+ await axConversationIndexedDbStorage.putConversation(conversation);
3706
+ conversationSharedStorage.conversationUpdates$.next(conversation);
3705
3707
  }
3706
3708
  // =====================
3707
3709
  // Search & Filter
3708
3710
  // =====================
3709
3711
  async searchConversations(query) {
3710
- const allConversations = Array.from(sharedStorage.conversations.values());
3712
+ const allConversations = Array.from(conversationSharedStorage.conversations.values());
3711
3713
  const lowerQuery = query.toLowerCase();
3712
3714
  return allConversations.filter((c) => c.title.toLowerCase().includes(lowerQuery) ||
3713
3715
  c.participants.some((p) => p.name.toLowerCase().includes(lowerQuery)));
@@ -3825,10 +3827,10 @@ class AXIndexedDBConversationApi extends AXConversationApi {
3825
3827
  // Mock clear draft
3826
3828
  await Promise.resolve();
3827
3829
  }
3828
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBConversationApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
3829
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBConversationApi }); }
3830
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbConversationApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
3831
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbConversationApi }); }
3830
3832
  }
3831
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBConversationApi, decorators: [{
3833
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbConversationApi, decorators: [{
3832
3834
  type: Injectable
3833
3835
  }] });
3834
3836
 
@@ -3836,12 +3838,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
3836
3838
  * IndexedDB Message API Implementation
3837
3839
  * Implements AXMessageApi using IndexedDB backend
3838
3840
  */
3839
- class AXIndexedDBMessageApi extends AXMessageApi {
3841
+ class AXConversationIndexedDbMessageApi extends AXMessageApi {
3840
3842
  // =====================
3841
3843
  // Message CRUD
3842
3844
  // =====================
3843
3845
  async sendMessage(command) {
3844
- const currentUser = sharedStorage.participants.get(sharedStorage.currentUserId);
3846
+ const currentUser = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
3845
3847
  if (!currentUser) {
3846
3848
  throw this.createError('USER_NOT_FOUND', 'Current user not found', 404);
3847
3849
  }
@@ -3857,37 +3859,37 @@ class AXIndexedDBMessageApi extends AXMessageApi {
3857
3859
  forwarded: command.forwarded,
3858
3860
  forwardedFrom: command.forwardedFrom,
3859
3861
  metadata: command.metadata || {},
3860
- replyTo: command.replyToId ? sharedStorage.messages.get(command.replyToId) : undefined,
3862
+ replyTo: command.replyToId ? conversationSharedStorage.messages.get(command.replyToId) : undefined,
3861
3863
  };
3862
3864
  // Store message in memory and IndexedDB
3863
- sharedStorage.messages.set(message.id, message);
3864
- const convMessages = sharedStorage.messagesByConversation.get(command.conversationId) || [];
3865
+ conversationSharedStorage.messages.set(message.id, message);
3866
+ const convMessages = conversationSharedStorage.messagesByConversation.get(command.conversationId) || [];
3865
3867
  convMessages.push(message.id);
3866
- sharedStorage.messagesByConversation.set(command.conversationId, convMessages);
3867
- await indexedDBStorage.putMessage(message);
3868
+ conversationSharedStorage.messagesByConversation.set(command.conversationId, convMessages);
3869
+ await axConversationIndexedDbStorage.putMessage(message);
3868
3870
  // Update conversation
3869
- const conversation = sharedStorage.conversations.get(command.conversationId);
3871
+ const conversation = conversationSharedStorage.conversations.get(command.conversationId);
3870
3872
  if (conversation) {
3871
3873
  conversation.lastMessageAt = message.timestamp;
3872
3874
  conversation.lastMessage = message;
3873
- sharedStorage.conversations.set(conversation.id, conversation);
3874
- await indexedDBStorage.putConversation(conversation);
3875
- sharedStorage.conversationUpdates$.next(conversation);
3875
+ conversationSharedStorage.conversations.set(conversation.id, conversation);
3876
+ await axConversationIndexedDbStorage.putConversation(conversation);
3877
+ conversationSharedStorage.conversationUpdates$.next(conversation);
3876
3878
  }
3877
- sharedStorage.messageStream$.next(message);
3879
+ conversationSharedStorage.messageStream$.next(message);
3878
3880
  return message;
3879
3881
  }
3880
3882
  async getMessage(messageId) {
3881
- const message = sharedStorage.messages.get(messageId);
3883
+ const message = conversationSharedStorage.messages.get(messageId);
3882
3884
  if (!message) {
3883
3885
  throw this.createError('MESSAGE_NOT_FOUND', 'Message not found', 404);
3884
3886
  }
3885
3887
  return message;
3886
3888
  }
3887
3889
  async getMessages(conversationId, pagination) {
3888
- const messageIds = sharedStorage.messagesByConversation.get(conversationId) || [];
3890
+ const messageIds = conversationSharedStorage.messagesByConversation.get(conversationId) || [];
3889
3891
  const allMessages = messageIds
3890
- .map((id) => sharedStorage.messages.get(id))
3892
+ .map((id) => conversationSharedStorage.messages.get(id))
3891
3893
  .filter((m) => m !== undefined);
3892
3894
  const sorted = allMessages.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
3893
3895
  const start = pagination.page * pagination.pageSize;
@@ -3905,18 +3907,18 @@ class AXIndexedDBMessageApi extends AXMessageApi {
3905
3907
  const message = await this.getMessage(messageId);
3906
3908
  message.payload = payload;
3907
3909
  message.metadata = { ...message.metadata, editedAt: new Date() };
3908
- sharedStorage.messages.set(messageId, message);
3909
- await indexedDBStorage.putMessage(message);
3910
- sharedStorage.messageUpdates$.next(message);
3910
+ conversationSharedStorage.messages.set(messageId, message);
3911
+ await axConversationIndexedDbStorage.putMessage(message);
3912
+ conversationSharedStorage.messageUpdates$.next(message);
3911
3913
  return message;
3912
3914
  }
3913
3915
  async deleteMessage(messageId, _forEveryone) {
3914
3916
  const message = await this.getMessage(messageId);
3915
- sharedStorage.messages.delete(messageId);
3916
- await indexedDBStorage.deleteMessage(messageId);
3917
- const conversationMessages = sharedStorage.messagesByConversation.get(message.conversationId) || [];
3918
- sharedStorage.messagesByConversation.set(message.conversationId, conversationMessages.filter((id) => id !== messageId));
3919
- sharedStorage.messageDeletions$.next(messageId);
3917
+ conversationSharedStorage.messages.delete(messageId);
3918
+ await axConversationIndexedDbStorage.deleteMessage(messageId);
3919
+ const conversationMessages = conversationSharedStorage.messagesByConversation.get(message.conversationId) || [];
3920
+ conversationSharedStorage.messagesByConversation.set(message.conversationId, conversationMessages.filter((id) => id !== messageId));
3921
+ conversationSharedStorage.messageDeletions$.next(messageId);
3920
3922
  }
3921
3923
  async deleteMessages(messageIds, forEveryone) {
3922
3924
  // Mock bulk delete
@@ -3928,9 +3930,9 @@ class AXIndexedDBMessageApi extends AXMessageApi {
3928
3930
  // Message Search
3929
3931
  // =====================
3930
3932
  async searchMessages(conversationId, filters, _pagination) {
3931
- const messageIds = sharedStorage.messagesByConversation.get(conversationId) || [];
3933
+ const messageIds = conversationSharedStorage.messagesByConversation.get(conversationId) || [];
3932
3934
  const allMessages = messageIds
3933
- .map((id) => sharedStorage.messages.get(id))
3935
+ .map((id) => conversationSharedStorage.messages.get(id))
3934
3936
  .filter((m) => m !== undefined);
3935
3937
  const lowerQuery = filters.query.toLowerCase();
3936
3938
  const filtered = allMessages.filter((m) => {
@@ -3958,7 +3960,7 @@ class AXIndexedDBMessageApi extends AXMessageApi {
3958
3960
  // =====================
3959
3961
  async addReaction(messageId, emoji) {
3960
3962
  const message = await this.getMessage(messageId);
3961
- const currentUser = sharedStorage.participants.get(sharedStorage.currentUserId);
3963
+ const currentUser = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
3962
3964
  if (!currentUser)
3963
3965
  return;
3964
3966
  const existingReaction = message.reactions.find((r) => r.emoji === emoji && r.userId === currentUser.id);
@@ -3968,19 +3970,19 @@ class AXIndexedDBMessageApi extends AXMessageApi {
3968
3970
  else {
3969
3971
  message.reactions.push({ emoji, userId: currentUser.id, timestamp: new Date() });
3970
3972
  }
3971
- sharedStorage.messages.set(messageId, message);
3972
- await indexedDBStorage.putMessage(message);
3973
- sharedStorage.messageUpdates$.next(message);
3973
+ conversationSharedStorage.messages.set(messageId, message);
3974
+ await axConversationIndexedDbStorage.putMessage(message);
3975
+ conversationSharedStorage.messageUpdates$.next(message);
3974
3976
  }
3975
3977
  async removeReaction(messageId, emoji) {
3976
3978
  const message = await this.getMessage(messageId);
3977
- const currentUser = sharedStorage.participants.get(sharedStorage.currentUserId);
3979
+ const currentUser = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
3978
3980
  if (!currentUser)
3979
3981
  return;
3980
3982
  message.reactions = message.reactions.filter((r) => !(r.emoji === emoji && r.userId === currentUser.id));
3981
- sharedStorage.messages.set(messageId, message);
3982
- await indexedDBStorage.putMessage(message);
3983
- sharedStorage.messageUpdates$.next(message);
3983
+ conversationSharedStorage.messages.set(messageId, message);
3984
+ await axConversationIndexedDbStorage.putMessage(message);
3985
+ conversationSharedStorage.messageUpdates$.next(message);
3984
3986
  }
3985
3987
  async getAvailableReactions() {
3986
3988
  return ['👍', '❤️', '😂', '😮', '😢', '🙏', '🎉', '🔥'];
@@ -3990,28 +3992,28 @@ class AXIndexedDBMessageApi extends AXMessageApi {
3990
3992
  // =====================
3991
3993
  async markAsRead(conversationId, messageIds) {
3992
3994
  for (const messageId of messageIds) {
3993
- const message = sharedStorage.messages.get(messageId);
3995
+ const message = conversationSharedStorage.messages.get(messageId);
3994
3996
  if (message && message.status !== 'read') {
3995
3997
  message.status = 'read';
3996
- sharedStorage.messages.set(messageId, message);
3997
- await indexedDBStorage.putMessage(message);
3998
- sharedStorage.messageUpdates$.next(message);
3998
+ conversationSharedStorage.messages.set(messageId, message);
3999
+ await axConversationIndexedDbStorage.putMessage(message);
4000
+ conversationSharedStorage.messageUpdates$.next(message);
3999
4001
  }
4000
4002
  }
4001
- const conversation = sharedStorage.conversations.get(conversationId);
4003
+ const conversation = conversationSharedStorage.conversations.get(conversationId);
4002
4004
  if (conversation) {
4003
4005
  conversation.unreadCount = Math.max(0, conversation.unreadCount - messageIds.length);
4004
- sharedStorage.conversations.set(conversationId, conversation);
4005
- await indexedDBStorage.putConversation(conversation);
4006
- sharedStorage.conversationUpdates$.next(conversation);
4006
+ conversationSharedStorage.conversations.set(conversationId, conversation);
4007
+ await axConversationIndexedDbStorage.putConversation(conversation);
4008
+ conversationSharedStorage.conversationUpdates$.next(conversation);
4007
4009
  }
4008
4010
  }
4009
4011
  async markAsUnread(conversationId) {
4010
- const conversation = sharedStorage.conversations.get(conversationId);
4012
+ const conversation = conversationSharedStorage.conversations.get(conversationId);
4011
4013
  if (conversation) {
4012
4014
  conversation.unreadCount = Math.max(1, conversation.unreadCount);
4013
- sharedStorage.conversations.set(conversationId, conversation);
4014
- sharedStorage.conversationUpdates$.next(conversation);
4015
+ conversationSharedStorage.conversations.set(conversationId, conversation);
4016
+ conversationSharedStorage.conversationUpdates$.next(conversation);
4015
4017
  }
4016
4018
  }
4017
4019
  async getReadReceipts(_messageId) {
@@ -4042,7 +4044,7 @@ class AXIndexedDBMessageApi extends AXMessageApi {
4042
4044
  // =====================
4043
4045
  async getMessageReplies(messageId, pagination) {
4044
4046
  // Get all messages that reply to this message
4045
- const allMessages = Array.from(sharedStorage.messages.values());
4047
+ const allMessages = Array.from(conversationSharedStorage.messages.values());
4046
4048
  const replies = allMessages
4047
4049
  .filter((m) => m.replyTo?.id === messageId)
4048
4050
  .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
@@ -4066,13 +4068,13 @@ class AXIndexedDBMessageApi extends AXMessageApi {
4066
4068
  }
4067
4069
  async getReplyCount(messageId) {
4068
4070
  // Count messages that reply to this message
4069
- const allMessages = Array.from(sharedStorage.messages.values());
4071
+ const allMessages = Array.from(conversationSharedStorage.messages.values());
4070
4072
  const replyCount = allMessages.filter((m) => m.replyTo?.id === messageId).length;
4071
4073
  return replyCount;
4072
4074
  }
4073
4075
  async getForwardCount(messageId) {
4074
4076
  // Count messages that were forwarded from this message
4075
- const allMessages = Array.from(sharedStorage.messages.values());
4077
+ const allMessages = Array.from(conversationSharedStorage.messages.values());
4076
4078
  const forwardCount = allMessages.filter((m) => m.forwardedFrom?.messageId === messageId).length;
4077
4079
  return forwardCount;
4078
4080
  }
@@ -4080,19 +4082,19 @@ class AXIndexedDBMessageApi extends AXMessageApi {
4080
4082
  // Typing Indicators
4081
4083
  // =====================
4082
4084
  async sendTypingIndicator(conversationId) {
4083
- const currentUser = sharedStorage.participants.get(sharedStorage.currentUserId);
4084
- sharedStorage.typingIndicators$.next({
4085
+ const currentUser = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
4086
+ conversationSharedStorage.typingIndicators$.next({
4085
4087
  conversationId,
4086
- userId: sharedStorage.currentUserId,
4088
+ userId: conversationSharedStorage.currentUserId,
4087
4089
  userName: currentUser?.name || 'You',
4088
4090
  timestamp: new Date(),
4089
4091
  });
4090
4092
  }
4091
4093
  async stopTypingIndicator(conversationId) {
4092
- const currentUser = sharedStorage.participants.get(sharedStorage.currentUserId);
4093
- sharedStorage.typingIndicators$.next({
4094
+ const currentUser = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
4095
+ conversationSharedStorage.typingIndicators$.next({
4094
4096
  conversationId,
4095
- userId: sharedStorage.currentUserId,
4097
+ userId: conversationSharedStorage.currentUserId,
4096
4098
  userName: currentUser?.name || 'You',
4097
4099
  timestamp: new Date(),
4098
4100
  });
@@ -4159,10 +4161,10 @@ class AXIndexedDBMessageApi extends AXMessageApi {
4159
4161
  // Mock export - return empty JSON
4160
4162
  return JSON.stringify({ messages: [] });
4161
4163
  }
4162
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBMessageApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4163
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBMessageApi }); }
4164
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4165
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageApi }); }
4164
4166
  }
4165
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBMessageApi, decorators: [{
4167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageApi, decorators: [{
4166
4168
  type: Injectable
4167
4169
  }] });
4168
4170
 
@@ -4170,24 +4172,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
4170
4172
  * IndexedDB Realtime API Implementation
4171
4173
  * Implements AXRealtimeApi using IndexedDB backend
4172
4174
  */
4173
- class AXIndexedDBRealtimeApi extends AXRealtimeApi {
4175
+ class AXConversationIndexedDbRealtimeApi extends AXRealtimeApi {
4174
4176
  constructor() {
4175
4177
  super(...arguments);
4176
- this.connectionStatus$ = sharedStorage.connectionStatus$;
4178
+ this.connectionStatus$ = conversationSharedStorage.connectionStatus$;
4177
4179
  }
4178
4180
  // =====================
4179
4181
  // Connection Management
4180
4182
  // =====================
4181
4183
  async connect(_options) {
4182
- sharedStorage.connectionStatus$.next('connecting');
4183
- await sharedStorage.seedIfEmpty();
4184
- sharedStorage.connectionStatus$.next('connected');
4184
+ conversationSharedStorage.connectionStatus$.next('connecting');
4185
+ await conversationSharedStorage.seedIfEmpty();
4186
+ conversationSharedStorage.connectionStatus$.next('connected');
4185
4187
  }
4186
4188
  async disconnect() {
4187
- sharedStorage.connectionStatus$.next('disconnected');
4189
+ conversationSharedStorage.connectionStatus$.next('disconnected');
4188
4190
  }
4189
4191
  isConnected() {
4190
- return sharedStorage.connectionStatus$.value === 'connected';
4192
+ return conversationSharedStorage.connectionStatus$.value === 'connected';
4191
4193
  }
4192
4194
  async reconnect() {
4193
4195
  await this.disconnect();
@@ -4206,23 +4208,23 @@ class AXIndexedDBRealtimeApi extends AXRealtimeApi {
4206
4208
  // Message Events
4207
4209
  // =====================
4208
4210
  subscribeToMessages(conversationId) {
4209
- return sharedStorage.messageStream$.pipe(filter((msg) => msg.conversationId === conversationId));
4211
+ return conversationSharedStorage.messageStream$.pipe(filter((msg) => msg.conversationId === conversationId));
4210
4212
  }
4211
4213
  subscribeToMessageUpdates(_conversationId) {
4212
- return sharedStorage.messageUpdates$;
4214
+ return conversationSharedStorage.messageUpdates$;
4213
4215
  }
4214
4216
  subscribeToMessageDeletions(_conversationId) {
4215
- return sharedStorage.messageDeletions$;
4217
+ return conversationSharedStorage.messageDeletions$;
4216
4218
  }
4217
4219
  subscribeToMessageReactions(_conversationId) {
4218
4220
  // Mock reactions - reuse message updates
4219
- return sharedStorage.messageUpdates$;
4221
+ return conversationSharedStorage.messageUpdates$;
4220
4222
  }
4221
4223
  // =====================
4222
4224
  // Conversation Events
4223
4225
  // =====================
4224
4226
  subscribeToConversationUpdates() {
4225
- return sharedStorage.conversationUpdates$;
4227
+ return conversationSharedStorage.conversationUpdates$;
4226
4228
  }
4227
4229
  subscribeToConversationCreated() {
4228
4230
  // Mock conversation created
@@ -4238,16 +4240,16 @@ class AXIndexedDBRealtimeApi extends AXRealtimeApi {
4238
4240
  subscribeToTypingIndicators(conversationId) {
4239
4241
  // If conversationId is empty, return all typing indicators (for global subscription)
4240
4242
  if (!conversationId) {
4241
- return sharedStorage.typingIndicators$;
4243
+ return conversationSharedStorage.typingIndicators$;
4242
4244
  }
4243
4245
  // Otherwise filter by specific conversation
4244
- return sharedStorage.typingIndicators$.pipe(filter((ind) => ind.conversationId === conversationId));
4246
+ return conversationSharedStorage.typingIndicators$.pipe(filter((ind) => ind.conversationId === conversationId));
4245
4247
  }
4246
4248
  // =====================
4247
4249
  // Presence Updates
4248
4250
  // =====================
4249
4251
  subscribeToPresenceUpdates(_userIds) {
4250
- return sharedStorage.presenceUpdates$;
4252
+ return conversationSharedStorage.presenceUpdates$;
4251
4253
  }
4252
4254
  // =====================
4253
4255
  // Read Receipts
@@ -4309,10 +4311,10 @@ class AXIndexedDBRealtimeApi extends AXRealtimeApi {
4309
4311
  // Mock draft changes
4310
4312
  return new Observable(() => { });
4311
4313
  }
4312
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBRealtimeApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4313
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBRealtimeApi }); }
4314
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbRealtimeApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4315
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbRealtimeApi }); }
4314
4316
  }
4315
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBRealtimeApi, decorators: [{
4317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbRealtimeApi, decorators: [{
4316
4318
  type: Injectable
4317
4319
  }] });
4318
4320
 
@@ -4323,10 +4325,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
4323
4325
  * @security API key should be provided via injection token in production
4324
4326
  * @example
4325
4327
  * ```typescript
4326
- * export const AI_API_KEY = new InjectionToken<string>('AI_API_KEY');
4328
+ * export const AXConversationAiApiKey = new InjectionToken<string>('AXConversationAiApiKey');
4327
4329
  *
4328
4330
  * providers: [
4329
- * { provide: AI_API_KEY, useValue: environment.geminiApiKey }
4331
+ * { provide: AXConversationAiApiKey, useValue: environment.geminiApiKey }
4330
4332
  * ]
4331
4333
  * ```
4332
4334
  */
@@ -4334,7 +4336,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
4334
4336
  * Injection token for AI API key
4335
4337
  * Provide this in your app config to avoid hardcoding the API key
4336
4338
  */
4337
- const AI_API_KEY = new InjectionToken('AI_API_KEY');
4339
+ const AXConversationAiApiKey = new InjectionToken('AXConversationAiApiKey');
4338
4340
  /**
4339
4341
  * Default configuration
4340
4342
  */
@@ -4343,9 +4345,9 @@ const DEFAULT_CONFIG = {
4343
4345
  timeout: 2000,
4344
4346
  useFallbackReplies: true,
4345
4347
  };
4346
- class AXAIResponderService {
4348
+ class AXConversationAiResponderService {
4347
4349
  constructor() {
4348
- this.injectedApiKey = inject(AI_API_KEY, { optional: true });
4350
+ this.injectedApiKey = inject(AXConversationAiApiKey, { optional: true });
4349
4351
  this.config = DEFAULT_CONFIG;
4350
4352
  }
4351
4353
  /**
@@ -4485,10 +4487,10 @@ class AXAIResponderService {
4485
4487
  configure(config) {
4486
4488
  Object.assign(this.config, config);
4487
4489
  }
4488
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXAIResponderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4489
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXAIResponderService, providedIn: 'root' }); }
4490
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationAiResponderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4491
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationAiResponderService, providedIn: 'root' }); }
4490
4492
  }
4491
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXAIResponderService, decorators: [{
4493
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationAiResponderService, decorators: [{
4492
4494
  type: Injectable,
4493
4495
  args: [{
4494
4496
  providedIn: 'root',
@@ -4499,10 +4501,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
4499
4501
  * IndexedDB Message API with AI Auto-Responder
4500
4502
  * Extends IndexedDB Message API to automatically respond to user messages with AI
4501
4503
  */
4502
- class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4504
+ class AXConversationIndexedDbMessageAiApi extends AXConversationIndexedDbMessageApi {
4503
4505
  constructor() {
4504
4506
  super(...arguments);
4505
- this.aiResponder = inject(AXAIResponderService);
4507
+ this.aiResponder = inject(AXConversationAiResponderService);
4506
4508
  this.AI_TYPING_INDICATOR_DELAY = 1000; // 1 second delay to simulate typing
4507
4509
  this.AI_RESPONSE_DELAY = 2000; // 2 seconds delay to simulate typing
4508
4510
  }
@@ -4556,7 +4558,7 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4556
4558
  */
4557
4559
  async generateAIResponse(conversationId, userText, replyToId) {
4558
4560
  try {
4559
- const { sharedStorage } = await Promise.resolve().then(function () { return sharedStorage$1; });
4561
+ const { conversationSharedStorage } = await Promise.resolve().then(function () { return sharedStorage; });
4560
4562
  // Get the conversation to find an AI bot or other participant
4561
4563
  const conversation = await this.getConversationForAI(conversationId);
4562
4564
  if (!conversation) {
@@ -4577,20 +4579,20 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4577
4579
  console.log('🤖 AI Bot:', aiSender.name, 'is preparing to respond...');
4578
4580
  // 1. Mark user's message as READ by AI
4579
4581
  console.log('👁️ AI reading your message...');
4580
- const userMessage = sharedStorage.messages.get(replyToId);
4582
+ const userMessage = conversationSharedStorage.messages.get(replyToId);
4581
4583
  if (userMessage) {
4582
4584
  userMessage.status = 'read';
4583
- sharedStorage.messages.set(replyToId, userMessage);
4584
- sharedStorage.messageUpdates$.next(userMessage);
4585
+ conversationSharedStorage.messages.set(replyToId, userMessage);
4586
+ conversationSharedStorage.messageUpdates$.next(userMessage);
4585
4587
  }
4586
4588
  // 2. Set AI user to ONLINE
4587
4589
  console.log('🟢 AI coming online...');
4588
- const aiUser = sharedStorage.participants.get(aiSender.id);
4590
+ const aiUser = conversationSharedStorage.participants.get(aiSender.id);
4589
4591
  if (aiUser) {
4590
4592
  aiUser.status = 'online';
4591
4593
  aiUser.lastSeen = new Date();
4592
- sharedStorage.participants.set(aiSender.id, aiUser);
4593
- sharedStorage.presenceUpdates$.next({
4594
+ conversationSharedStorage.participants.set(aiSender.id, aiUser);
4595
+ conversationSharedStorage.presenceUpdates$.next({
4594
4596
  userId: aiSender.id,
4595
4597
  status: 'online',
4596
4598
  lastSeen: aiUser.lastSeen,
@@ -4600,7 +4602,7 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4600
4602
  await this.delay(500);
4601
4603
  // 3. Show TYPING indicator
4602
4604
  console.log('✍️ AI is typing...');
4603
- sharedStorage.typingIndicators$.next({
4605
+ conversationSharedStorage.typingIndicators$.next({
4604
4606
  conversationId,
4605
4607
  userId: aiSender.id,
4606
4608
  userName: aiSender.name,
@@ -4609,8 +4611,8 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4609
4611
  // Update conversation typing status
4610
4612
  conversation.status.isTyping = true;
4611
4613
  conversation.status.typingUsers = [aiSender.id];
4612
- sharedStorage.conversations.set(conversationId, conversation);
4613
- sharedStorage.conversationUpdates$.next(conversation);
4614
+ conversationSharedStorage.conversations.set(conversationId, conversation);
4615
+ conversationSharedStorage.conversationUpdates$.next(conversation);
4614
4616
  // 4. Get conversation history (last 20 messages)
4615
4617
  const conversationHistory = await this.getConversationHistory(conversationId, 20);
4616
4618
  console.log('📚 Loaded conversation history:', conversationHistory.split('\n').length, 'messages');
@@ -4624,7 +4626,7 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4624
4626
  await this.delay(typingDelay);
4625
4627
  // 6. Stop TYPING indicator
4626
4628
  console.log('🛑 AI stopped typing...');
4627
- sharedStorage.typingIndicators$.next({
4629
+ conversationSharedStorage.typingIndicators$.next({
4628
4630
  conversationId,
4629
4631
  userId: aiSender.id,
4630
4632
  userName: aiSender.name,
@@ -4632,8 +4634,8 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4632
4634
  });
4633
4635
  conversation.status.isTyping = false;
4634
4636
  conversation.status.typingUsers = [];
4635
- sharedStorage.conversations.set(conversationId, conversation);
4636
- sharedStorage.conversationUpdates$.next(conversation);
4637
+ conversationSharedStorage.conversations.set(conversationId, conversation);
4638
+ conversationSharedStorage.conversationUpdates$.next(conversation);
4637
4639
  // 7. Send AI message
4638
4640
  console.log('📤 Sending AI message from:', aiSender.name);
4639
4641
  await this.createAIMessage(conversationId, aiSender.id, aiResponse, replyToId);
@@ -4642,8 +4644,8 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4642
4644
  setTimeout(() => {
4643
4645
  if (aiUser) {
4644
4646
  aiUser.status = 'away';
4645
- sharedStorage.participants.set(aiSender.id, aiUser);
4646
- sharedStorage.presenceUpdates$.next({
4647
+ conversationSharedStorage.participants.set(aiSender.id, aiUser);
4648
+ conversationSharedStorage.presenceUpdates$.next({
4647
4649
  userId: aiSender.id,
4648
4650
  status: 'away',
4649
4651
  lastSeen: new Date(),
@@ -4662,8 +4664,8 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4662
4664
  async getConversationForAI(conversationId) {
4663
4665
  try {
4664
4666
  // Access shared storage directly
4665
- const { sharedStorage } = await Promise.resolve().then(function () { return sharedStorage$1; });
4666
- return sharedStorage.conversations.get(conversationId);
4667
+ const { conversationSharedStorage } = await Promise.resolve().then(function () { return sharedStorage; });
4668
+ return conversationSharedStorage.conversations.get(conversationId);
4667
4669
  }
4668
4670
  catch {
4669
4671
  return null;
@@ -4674,14 +4676,14 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4674
4676
  */
4675
4677
  async getConversationHistory(conversationId, limit = 20) {
4676
4678
  try {
4677
- const { sharedStorage } = await Promise.resolve().then(function () { return sharedStorage$1; });
4679
+ const { conversationSharedStorage } = await Promise.resolve().then(function () { return sharedStorage; });
4678
4680
  // Get all messages for this conversation
4679
- const messageIds = sharedStorage.messagesByConversation.get(conversationId) || [];
4681
+ const messageIds = conversationSharedStorage.messagesByConversation.get(conversationId) || [];
4680
4682
  // Get last N messages (excluding the very last one which is the current user message)
4681
4683
  const recentMessageIds = messageIds.slice(-limit - 1, -1);
4682
4684
  const messages = [];
4683
4685
  for (const msgId of recentMessageIds) {
4684
- const msg = sharedStorage.messages.get(msgId);
4686
+ const msg = conversationSharedStorage.messages.get(msgId);
4685
4687
  if (msg) {
4686
4688
  messages.push(msg);
4687
4689
  }
@@ -4689,7 +4691,7 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4689
4691
  // Format messages for AI context
4690
4692
  const formattedHistory = messages
4691
4693
  .map((msg) => {
4692
- const sender = sharedStorage.participants.get(msg.senderId);
4694
+ const sender = conversationSharedStorage.participants.get(msg.senderId);
4693
4695
  const senderName = sender?.name || (msg.senderId === 'current-user' ? 'You' : 'Unknown');
4694
4696
  // Extract text from different message types
4695
4697
  let text = '';
@@ -4729,7 +4731,7 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4729
4731
  */
4730
4732
  async createAIMessage(conversationId, senderId, text, replyToId) {
4731
4733
  try {
4732
- const { sharedStorage } = await Promise.resolve().then(function () { return sharedStorage$1; });
4734
+ const { conversationSharedStorage } = await Promise.resolve().then(function () { return sharedStorage; });
4733
4735
  const message = {
4734
4736
  id: `msg-ai-${Date.now()}`,
4735
4737
  conversationId,
@@ -4743,26 +4745,26 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4743
4745
  status: 'sent',
4744
4746
  reactions: [],
4745
4747
  metadata: { isAI: true },
4746
- replyTo: sharedStorage.messages.get(replyToId),
4748
+ replyTo: conversationSharedStorage.messages.get(replyToId),
4747
4749
  };
4748
4750
  // Store message in memory and IndexedDB
4749
- const { indexedDBStorage } = await Promise.resolve().then(function () { return indexeddbStorage; });
4750
- sharedStorage.messages.set(message.id, message);
4751
- const convMessages = sharedStorage.messagesByConversation.get(conversationId) || [];
4751
+ const { axConversationIndexedDbStorage } = await Promise.resolve().then(function () { return indexeddbStorage; });
4752
+ conversationSharedStorage.messages.set(message.id, message);
4753
+ const convMessages = conversationSharedStorage.messagesByConversation.get(conversationId) || [];
4752
4754
  convMessages.push(message.id);
4753
- sharedStorage.messagesByConversation.set(conversationId, convMessages);
4754
- await indexedDBStorage.putMessage(message);
4755
+ conversationSharedStorage.messagesByConversation.set(conversationId, convMessages);
4756
+ await axConversationIndexedDbStorage.putMessage(message);
4755
4757
  // Update conversation
4756
- const conversation = sharedStorage.conversations.get(conversationId);
4758
+ const conversation = conversationSharedStorage.conversations.get(conversationId);
4757
4759
  if (conversation) {
4758
4760
  conversation.lastMessageAt = message.timestamp;
4759
4761
  conversation.lastMessage = message;
4760
- sharedStorage.conversations.set(conversationId, conversation);
4761
- await indexedDBStorage.putConversation(conversation);
4762
- sharedStorage.conversationUpdates$.next(conversation);
4762
+ conversationSharedStorage.conversations.set(conversationId, conversation);
4763
+ await axConversationIndexedDbStorage.putConversation(conversation);
4764
+ conversationSharedStorage.conversationUpdates$.next(conversation);
4763
4765
  }
4764
4766
  // Emit message
4765
- sharedStorage.messageStream$.next(message);
4767
+ conversationSharedStorage.messageStream$.next(message);
4766
4768
  }
4767
4769
  catch (error) {
4768
4770
  console.error('Error creating AI message:', error);
@@ -4774,20 +4776,18 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4774
4776
  delay(ms) {
4775
4777
  return new Promise((resolve) => setTimeout(resolve, ms));
4776
4778
  }
4777
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBMessageAIApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4778
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBMessageAIApi }); }
4779
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageAiApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4780
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageAiApi }); }
4779
4781
  }
4780
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXIndexedDBMessageAIApi, decorators: [{
4782
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageAiApi, decorators: [{
4781
4783
  type: Injectable
4782
4784
  }] });
4783
4785
 
4784
4786
  /**
4785
- * IndexedDB API Implementations
4787
+ * IndexedDB API implementations and storage for @acorex/components/conversation2.
4786
4788
  *
4787
- * These implementations use a shared in-memory storage (shared-storage.ts)
4788
- * to provide mock data for development and testing.
4789
+ * Public symbols use the `AXConversation` prefix.
4789
4790
  */
4790
- // Separated API implementations
4791
4791
 
4792
4792
  /**
4793
4793
  * File Upload Service
@@ -13620,7 +13620,7 @@ class AXComposerComponent {
13620
13620
  </div>
13621
13621
  </ax-popover>
13622
13622
  }
13623
- `, isInline: true, styles: [":host{display:block}.composer-banner{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;background:rgb(var(--ax-sys-color-primary-lightest-surface));border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.25);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.5);color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.banner-content{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.banner-icon,.emoji-icon{font-size:1.25rem;flex-shrink:0}.banner-text{flex:1;min-width:0;cursor:pointer;transition:opacity .2s}.banner-text:hover{opacity:.8}.banner-title{font-size:.75rem;font-weight:600}.banner-subtitle{font-size:.8125rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.8}.banner-close{flex-shrink:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:.375rem;font-size:1rem;cursor:pointer;transition:background .2s}.banner-close:hover{background:rgb(var(--ax-sys-color-light-surface))}.composer-input-container{display:flex;align-items:center;gap:.5rem;padding:.75rem}.composer-actions-left,.composer-actions-right{display:flex;align-items:center;//gap: .5rem}.composer-input-wrapper{display:flex;flex:1;min-width:0}.composer-input{width:100%;min-height:40px;max-height:120px;padding:.5rem .75rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:1.25rem;font-size:.9375rem;font-family:inherit;line-height:1.5;resize:none;outline:none;transition:border-color .2s}.composer-input:focus{border-color:rgb(var(--ax-sys-color-primary-500))}.action-button{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border:none;background:transparent;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:all .2s;flex-shrink:0}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.action-button:disabled{opacity:.5;cursor:not-allowed}.action-send{background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface))}.action-send:hover:not(:disabled){background:rgb(var(--ax-sys-color-primary-600))}.send-icon{font-size:1rem;position:relative;left:-1px}.action-voice{font-size:1.25rem}.composer-attachments{display:flex;flex-wrap:wrap;gap:.5rem;padding:0 1rem 1rem}.attachment-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:rgb(var(--ax-sys-color-light-surface));border-radius:.5rem;font-size:.875rem}.attachment-icon{font-size:1rem}.attachment-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-remove{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;border-radius:50%;font-size:.875rem;cursor:pointer;transition:background .2s}.attachment-remove:hover{background:rgb(var(--ax-sys-color-danger-lightest-surface));color:rgb(var(--ax-sys-color-danger-500))}.typing-indicator-container{padding:0 1rem .5rem;font-size:.75rem;opacity:.7}.composer-component-fullwidth{width:100%;min-height:72px;background:rgb(var(--ax-sys-color-lightest-surface))}.action-badge{position:absolute;top:4px;right:4px;min-width:16px;height:16px;padding:0 4px;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-radius:8px;font-size:.625rem;font-weight:600}.action-button{position:relative}\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: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTextAreaModule }, { kind: "component", type: i3$2.AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXCommonModule }, { kind: "ngmodule", type: AXUploaderModule }, { 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: "ngmodule", type: AXDecoratorModule }, { 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: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i6.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i7.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13623
+ `, isInline: true, styles: [":host{display:block}.composer-banner{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;background:rgb(var(--ax-sys-color-primary-lightest-surface));border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.25);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.5);color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.banner-content{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.banner-icon,.emoji-icon{font-size:1.25rem;flex-shrink:0}.banner-text{flex:1;min-width:0;cursor:pointer;transition:opacity .2s}.banner-text:hover{opacity:.8}.banner-title{font-size:.75rem;font-weight:600}.banner-subtitle{font-size:.8125rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.8}.banner-close{flex-shrink:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:.375rem;font-size:1rem;cursor:pointer;transition:background .2s}.banner-close:hover{background:rgb(var(--ax-sys-color-light-surface))}.composer-input-container{display:flex;align-items:center;gap:.5rem;padding:.75rem}.composer-actions-left,.composer-actions-right{display:flex;align-items:center;//gap: .5rem}.composer-input-wrapper{display:flex;flex:1;min-width:0}.composer-input{width:100%;min-height:40px;max-height:120px;padding:.5rem .75rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:1.25rem;font-size:.9375rem;font-family:inherit;line-height:1.5;resize:none;outline:none;transition:border-color .2s}.composer-input:focus{border-color:rgb(var(--ax-sys-color-primary-500))}.action-button{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border:none;background:transparent;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:all .2s;flex-shrink:0}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.action-button:disabled{opacity:.5;cursor:not-allowed}.action-send{background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface))}.action-send:hover:not(:disabled){background:rgb(var(--ax-sys-color-primary-600))}.send-icon{font-size:1rem;position:relative;left:-1px}.action-voice{font-size:1.25rem}.composer-attachments{display:flex;flex-wrap:wrap;gap:.5rem;padding:0 1rem 1rem}.attachment-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:rgb(var(--ax-sys-color-light-surface));border-radius:.5rem;font-size:.875rem}.attachment-icon{font-size:1rem}.attachment-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-remove{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;border-radius:50%;font-size:.875rem;cursor:pointer;transition:background .2s}.attachment-remove:hover{background:rgb(var(--ax-sys-color-danger-lightest-surface));color:rgb(var(--ax-sys-color-danger-500))}.typing-indicator-container{padding:0 1rem .5rem;font-size:.75rem;opacity:.7}.composer-component-fullwidth{width:100%;min-height:72px;background:rgb(var(--ax-sys-color-lightest-surface))}.action-badge{position:absolute;top:4px;right:4px;min-width:16px;height:16px;padding:0 4px;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-radius:8px;font-size:.625rem;font-weight:600}.action-button{position:relative}\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: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTextAreaModule }, { kind: "component", type: i3$2.AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXCommonModule }, { kind: "ngmodule", type: AXUploaderModule }, { 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: "ngmodule", type: AXDecoratorModule }, { 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: "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: AXDropdownModule }, { kind: "component", type: i7.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13624
13624
  }
13625
13625
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXComposerComponent, decorators: [{
13626
13626
  type: Component,
@@ -14683,7 +14683,7 @@ class AXInfoBarComponent {
14683
14683
  </div>
14684
14684
  }
14685
14685
  }
14686
- `, 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", "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 }); }
14686
+ `, 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 }); }
14687
14687
  }
14688
14688
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXInfoBarComponent, decorators: [{
14689
14689
  type: Component,
@@ -16101,7 +16101,7 @@ class AXMessageListComponent {
16101
16101
  </ax-popover>
16102
16102
  }
16103
16103
  }
16104
- `, 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-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:.375rem .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}.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;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;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:-1.5rem;transform:translateY(-50%);align-items:center;justify-content:center;box-sizing:border-box;width:1.25rem;height:1.25rem;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:-1.5rem;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:.625rem;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:.5rem;z-index:100;min-width:auto;width:max-content;max-width:min(200px,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:.3rem .4rem .3rem .55rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));min-height:0}.picker-title{font-size:.6875rem;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.25rem;height:1.25rem;padding:0;background:transparent;border:none;border-radius:.25rem;cursor:pointer;font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface) / .55);transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.picker-close:hover{background:rgb(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:.08rem;padding:.3rem .35rem .35rem}.reaction-picker-emoji{width:1.5rem;height:1.5rem;padding:0;background:transparent;border:1px solid transparent;border-radius:.35rem;font-size:.95rem;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:rgb(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: 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", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i4$1.AXFormatPipe, name: "format" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16104
+ `, 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-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:.375rem .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}.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;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;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:-1.5rem;transform:translateY(-50%);align-items:center;justify-content:center;box-sizing:border-box;width:1.25rem;height:1.25rem;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:-1.5rem;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:.625rem;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:.5rem;z-index:100;min-width:auto;width:max-content;max-width:min(200px,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:.3rem .4rem .3rem .55rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));min-height:0}.picker-title{font-size:.6875rem;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.25rem;height:1.25rem;padding:0;background:transparent;border:none;border-radius:.25rem;cursor:pointer;font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface) / .55);transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.picker-close:hover{background:rgb(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:.08rem;padding:.3rem .35rem .35rem}.reaction-picker-emoji{width:1.5rem;height:1.5rem;padding:0;background:transparent;border:1px solid transparent;border-radius:.35rem;font-size:.95rem;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:rgb(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: 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: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i4$1.AXFormatPipe, name: "format" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16105
16105
  }
16106
16106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListComponent, decorators: [{
16107
16107
  type: Component,
@@ -17627,9 +17627,9 @@ function createProviders(options, includeServices) {
17627
17627
  if (!userApi || !conversationApi || !messageApi) {
17628
17628
  throw new Error(`Missing required API implementations: userApi, conversationApi, messageApi.
17629
17629
  Example: provideConversation({
17630
- userApi: AXIndexedDBUserApi,
17631
- conversationApi: AXIndexedDBConversationApi,
17632
- messageApi: AXIndexedDBMessageApi,
17630
+ userApi: AXConversationIndexedDbUserApi,
17631
+ conversationApi: AXConversationIndexedDbConversationApi,
17632
+ messageApi: AXConversationIndexedDbMessageApi,
17633
17633
  })
17634
17634
  Import from @acorex/components/conversation2`);
17635
17635
  }
@@ -17731,19 +17731,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
17731
17731
  * @example
17732
17732
  * ```typescript
17733
17733
  * import {
17734
- * AXIndexedDBUserApi,
17735
- * AXIndexedDBConversationApi,
17736
- * AXIndexedDBMessageApi,
17737
- * AXIndexedDBRealtimeApi
17734
+ * AXConversationIndexedDbUserApi,
17735
+ * AXConversationIndexedDbConversationApi,
17736
+ * AXConversationIndexedDbMessageApi,
17737
+ * AXConversationIndexedDbRealtimeApi
17738
17738
  * } from '@acorex/components/conversation2';
17739
17739
  *
17740
17740
  * export const appConfig: ApplicationConfig = {
17741
17741
  * providers: [
17742
17742
  * provideConversation({
17743
- * userApi: AXIndexedDBUserApi,
17744
- * conversationApi: AXIndexedDBConversationApi,
17745
- * messageApi: AXIndexedDBMessageApi,
17746
- * realtimeApi: AXIndexedDBRealtimeApi,
17743
+ * userApi: AXConversationIndexedDbUserApi,
17744
+ * conversationApi: AXConversationIndexedDbConversationApi,
17745
+ * messageApi: AXConversationIndexedDbMessageApi,
17746
+ * realtimeApi: AXConversationIndexedDbRealtimeApi,
17747
17747
  * config: { },
17748
17748
  * registry: { messageActions: [myCustomAction] }
17749
17749
  * })
@@ -18059,5 +18059,5 @@ function getErrorMessage(code, params) {
18059
18059
  * Generated bundle index. Do not edit.
18060
18060
  */
18061
18061
 
18062
- export { AI_API_KEY, AXAIResponderService, AXAudioInfoBarBannerComponent, AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, AXComposerActionRegistry, AXComposerComponent, AXComposerPopupComponent, AXComposerService, AXComposerTabRegistry, AXConversation2Module, AXConversationApi, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationService, AXConversationStoreService, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXFileUploadService, AXForwardMessageDialogComponent, AXImagePickerComponent, AXImageRendererComponent, AXIndexedDBConversationApi, AXIndexedDBMessageAIApi, AXIndexedDBMessageApi, AXIndexedDBRealtimeApi, AXIndexedDBUserApi, 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, 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, formatErrorMessage, getDefaultConversationItemActions, getErrorMessage, mergeWithDefaults, provideConversation, sanitizeInput, validateConversationId, validateEmail, validateFile, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
18062
+ 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, 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 };
18063
18063
  //# sourceMappingURL=acorex-components-conversation2.mjs.map