@acorex/components 21.0.1-next.52 → 21.0.1-next.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/fab/README.md +3 -0
  2. package/fesm2022/acorex-components-accordion.mjs +4 -4
  3. package/fesm2022/acorex-components-action-sheet.mjs +2 -2
  4. package/fesm2022/acorex-components-action-sheet.mjs.map +1 -1
  5. package/fesm2022/acorex-components-alert.mjs +2 -2
  6. package/fesm2022/acorex-components-audio-wave.mjs +2 -2
  7. package/fesm2022/acorex-components-avatar.mjs +2 -2
  8. package/fesm2022/acorex-components-badge.mjs +2 -2
  9. package/fesm2022/acorex-components-bottom-navigation.mjs +2 -2
  10. package/fesm2022/acorex-components-breadcrumbs.mjs +2 -2
  11. package/fesm2022/acorex-components-button-group.mjs +24 -13
  12. package/fesm2022/acorex-components-button-group.mjs.map +1 -1
  13. package/fesm2022/acorex-components-button.mjs +4 -4
  14. package/fesm2022/acorex-components-calendar.mjs +4 -4
  15. package/fesm2022/acorex-components-check-box.mjs +2 -2
  16. package/fesm2022/acorex-components-chips.mjs +2 -2
  17. package/fesm2022/acorex-components-circular-progress.mjs +2 -2
  18. package/fesm2022/acorex-components-code-editor.mjs +2 -2
  19. package/fesm2022/acorex-components-code-editor.mjs.map +1 -1
  20. package/fesm2022/acorex-components-color-box.mjs +2 -2
  21. package/fesm2022/acorex-components-color-palette.mjs +2 -2
  22. package/fesm2022/acorex-components-command.mjs +2 -2
  23. package/fesm2022/acorex-components-comment.mjs +6 -6
  24. package/fesm2022/acorex-components-conversation.mjs +1 -1
  25. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  26. package/fesm2022/acorex-components-conversation2.mjs +3817 -2952
  27. package/fesm2022/acorex-components-conversation2.mjs.map +1 -1
  28. package/fesm2022/acorex-components-data-pager.mjs +2 -2
  29. package/fesm2022/acorex-components-data-table.mjs +2 -2
  30. package/fesm2022/acorex-components-datetime-box.mjs +2 -2
  31. package/fesm2022/acorex-components-datetime-input.mjs +2 -2
  32. package/fesm2022/acorex-components-datetime-picker.mjs +2 -2
  33. package/fesm2022/acorex-components-decorators.mjs +8 -8
  34. package/fesm2022/acorex-components-dialog.mjs +2 -2
  35. package/fesm2022/acorex-components-drawer.mjs +4 -4
  36. package/fesm2022/acorex-components-dropdown-button.mjs +2 -2
  37. package/fesm2022/acorex-components-dropdown.mjs +3 -4
  38. package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
  39. package/fesm2022/acorex-components-editor.mjs +2 -2
  40. package/fesm2022/acorex-components-fab.mjs +114 -0
  41. package/fesm2022/acorex-components-fab.mjs.map +1 -0
  42. package/fesm2022/acorex-components-file-explorer.mjs +1 -1
  43. package/fesm2022/acorex-components-file-explorer.mjs.map +1 -1
  44. package/fesm2022/acorex-components-form.mjs +2 -2
  45. package/fesm2022/acorex-components-image-editor.mjs +14 -14
  46. package/fesm2022/acorex-components-image.mjs +2 -2
  47. package/fesm2022/acorex-components-json-viewer.mjs +2 -2
  48. package/fesm2022/acorex-components-kanban.mjs +2 -2
  49. package/fesm2022/acorex-components-kbd.mjs +2 -2
  50. package/fesm2022/acorex-components-label.mjs +2 -2
  51. package/fesm2022/acorex-components-list.mjs +62 -14
  52. package/fesm2022/acorex-components-list.mjs.map +1 -1
  53. package/fesm2022/acorex-components-loading-dialog.mjs +2 -2
  54. package/fesm2022/acorex-components-loading.mjs +76 -36
  55. package/fesm2022/acorex-components-loading.mjs.map +1 -1
  56. package/fesm2022/acorex-components-map.mjs +2 -2
  57. package/fesm2022/acorex-components-media-viewer.mjs +10 -10
  58. package/fesm2022/acorex-components-menu.mjs +33 -13
  59. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  60. package/fesm2022/{acorex-components-modal-acorex-components-modal-B03hJbP8.mjs → acorex-components-modal-acorex-components-modal-DNU5kOlV.mjs} +4 -4
  61. package/fesm2022/{acorex-components-modal-acorex-components-modal-B03hJbP8.mjs.map → acorex-components-modal-acorex-components-modal-DNU5kOlV.mjs.map} +1 -1
  62. package/fesm2022/{acorex-components-modal-modal-content.component-DrHm0mZ4.mjs → acorex-components-modal-modal-content.component-EDuWk0we.mjs} +4 -4
  63. package/fesm2022/{acorex-components-modal-modal-content.component-DrHm0mZ4.mjs.map → acorex-components-modal-modal-content.component-EDuWk0we.mjs.map} +1 -1
  64. package/fesm2022/acorex-components-modal.mjs +1 -1
  65. package/fesm2022/acorex-components-navbar.mjs +2 -2
  66. package/fesm2022/acorex-components-notification.mjs +2 -2
  67. package/fesm2022/acorex-components-number-box.mjs +2 -2
  68. package/fesm2022/acorex-components-otp.mjs +2 -2
  69. package/fesm2022/acorex-components-paint.mjs +4 -4
  70. package/fesm2022/acorex-components-password-box.mjs +2 -2
  71. package/fesm2022/acorex-components-pdf-reader.mjs +2 -2
  72. package/fesm2022/acorex-components-phone-box.mjs +2 -2
  73. package/fesm2022/acorex-components-picker.mjs +6 -6
  74. package/fesm2022/acorex-components-popover.mjs +4 -3
  75. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  76. package/fesm2022/acorex-components-popup.mjs +3 -2
  77. package/fesm2022/acorex-components-popup.mjs.map +1 -1
  78. package/fesm2022/acorex-components-progress-bar.mjs +2 -2
  79. package/fesm2022/acorex-components-qrcode.mjs +2 -2
  80. package/fesm2022/acorex-components-query-builder.mjs +2 -2
  81. package/fesm2022/acorex-components-query-builder.mjs.map +1 -1
  82. package/fesm2022/acorex-components-radio.mjs +2 -2
  83. package/fesm2022/acorex-components-rail-navigation.mjs +2 -2
  84. package/fesm2022/acorex-components-range-slider.mjs +2 -2
  85. package/fesm2022/acorex-components-rate-picker.mjs +2 -2
  86. package/fesm2022/acorex-components-result.mjs +2 -2
  87. package/fesm2022/acorex-components-routing-progress.mjs +2 -2
  88. package/fesm2022/acorex-components-scheduler.mjs +85 -38
  89. package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
  90. package/fesm2022/acorex-components-select-box.mjs +2 -2
  91. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  92. package/fesm2022/acorex-components-selection-list-2.mjs +2 -2
  93. package/fesm2022/acorex-components-selection-list.mjs +2 -2
  94. package/fesm2022/acorex-components-side-menu.mjs +2 -2
  95. package/fesm2022/acorex-components-skeleton.mjs +2 -2
  96. package/fesm2022/acorex-components-sliding-item.mjs +2 -2
  97. package/fesm2022/acorex-components-step-wizard.mjs +2 -2
  98. package/fesm2022/acorex-components-switch.mjs +2 -2
  99. package/fesm2022/acorex-components-tabs.mjs +2 -2
  100. package/fesm2022/acorex-components-tag-box.mjs +2 -2
  101. package/fesm2022/acorex-components-tag.mjs +2 -2
  102. package/fesm2022/acorex-components-text-area.mjs +2 -2
  103. package/fesm2022/acorex-components-text-box.mjs +2 -2
  104. package/fesm2022/acorex-components-text-box.mjs.map +1 -1
  105. package/fesm2022/acorex-components-time-line.mjs +4 -4
  106. package/fesm2022/acorex-components-toast.mjs +2 -2
  107. package/fesm2022/acorex-components-toolbar.mjs +2 -2
  108. package/fesm2022/acorex-components-tooltip.mjs +7 -2
  109. package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
  110. package/fesm2022/acorex-components-uploader.mjs +6 -6
  111. package/fesm2022/acorex-components-wysiwyg.mjs +6 -6
  112. package/package.json +7 -6
  113. package/types/acorex-components-action-sheet.d.ts +1 -1
  114. package/types/acorex-components-button-group.d.ts +8 -8
  115. package/types/acorex-components-conversation2.d.ts +1106 -863
  116. package/types/acorex-components-fab.d.ts +50 -0
  117. package/types/acorex-components-list.d.ts +23 -1
  118. package/types/acorex-components-loading.d.ts +3 -1
  119. package/types/acorex-components-menu.d.ts +3 -1
  120. package/types/acorex-components-popover.d.ts +2 -1
  121. package/types/acorex-components-scheduler.d.ts +29 -14
  122. package/types/acorex-components-select-box.d.ts +6 -6
  123. package/types/acorex-components-tooltip.d.ts +1 -0
@@ -1,14 +1,16 @@
1
1
  import * as _acorex_components_conversation2 from '@acorex/components/conversation2';
2
2
  import * as _angular_core from '@angular/core';
3
- import { OnDestroy, ViewContainerRef, WritableSignal, Signal, Type, TemplateRef, OnInit, EventEmitter, InjectionToken, ElementRef, ModuleWithProviders, Provider } from '@angular/core';
4
- import { AXComponentCloseEvent, AXHtmlEvent, AXClosableComponent } from '@acorex/cdk/common';
3
+ import { OnDestroy, ViewContainerRef, Type, InputSignal, WritableSignal, Signal, OnInit, EventEmitter, TemplateRef, InjectionToken, ElementRef, ModuleWithProviders, Provider } from '@angular/core';
4
+ import { AXComponentCloseEvent, AXHtmlEvent, AXDataSource, AXClosableComponent } from '@acorex/cdk/common';
5
5
  import { AXUploaderChangedEvent } from '@acorex/cdk/uploader';
6
6
  import * as rxjs from 'rxjs';
7
- import { Observable } from 'rxjs';
7
+ import { Observable, BehaviorSubject, Subject } from 'rxjs';
8
8
  import { AXDialogService } from '@acorex/components/dialog';
9
- import { AXPopupService } from '@acorex/components/popup';
9
+ import { AXPopupService, AXPopupRef } from '@acorex/components/popup';
10
10
  import { AXPopoverComponent } from '@acorex/components/popover';
11
+ import { AXListComponent } from '@acorex/components/list';
11
12
  import { AXContextMenuOpeningEvent, AXContextMenuItemsClickEvent } from '@acorex/components/menu';
13
+ import { AXBasePageComponent } from '@acorex/components/page';
12
14
  import { AXMapMarker } from '@acorex/components/map';
13
15
  import { SafeHtml } from '@angular/platform-browser';
14
16
  import * as i1 from '@angular/common';
@@ -267,25 +269,6 @@ interface AXStickerPayload {
267
269
  /** Emoji representation */
268
270
  emoji?: string;
269
271
  }
270
- /**
271
- * Contact message payload
272
- */
273
- interface AXContactPayload {
274
- /** Message type */
275
- type: 'contact';
276
- /** Contact ID */
277
- id: string;
278
- /** Contact name */
279
- name: string;
280
- /** Phone number */
281
- phoneNumber?: string;
282
- /** Email address */
283
- email?: string;
284
- /** URL address */
285
- url?: string;
286
- /** Avatar URL */
287
- avatar?: string;
288
- }
289
272
  /**
290
273
  * Poll message payload
291
274
  */
@@ -331,12 +314,12 @@ interface AXSystemPayload {
331
314
  /** Related user IDs */
332
315
  userIds?: string[];
333
316
  /** Additional data */
334
- data?: Record<string, any>;
317
+ data?: Record<string, unknown>;
335
318
  }
336
319
  /**
337
320
  * Union type of all message payloads
338
321
  */
339
- type AXMessagePayload = AXTextPayload | AXImagePayload | AXVideoPayload | AXAudioPayload | AXVoicePayload | AXFilePayload | AXLocationPayload | AXStickerPayload | AXContactPayload | AXPollPayload | AXSystemPayload;
322
+ type AXMessagePayload = AXTextPayload | AXImagePayload | AXVideoPayload | AXAudioPayload | AXVoicePayload | AXFilePayload | AXLocationPayload | AXStickerPayload | AXPollPayload | AXSystemPayload;
340
323
 
341
324
  /**
342
325
  * Message Model
@@ -344,7 +327,7 @@ type AXMessagePayload = AXTextPayload | AXImagePayload | AXVideoPayload | AXAudi
344
327
  */
345
328
 
346
329
  type AXMessageStatus = 'sending' | 'sent' | 'delivered' | 'read' | 'failed';
347
- type AXMessageType = 'text' | 'image' | 'video' | 'audio' | 'voice' | 'file' | 'location' | 'sticker' | 'contact' | 'poll' | 'system' | string;
330
+ type AXMessageType = 'text' | 'image' | 'video' | 'audio' | 'voice' | 'file' | 'location' | 'sticker' | 'poll' | 'system' | string;
348
331
  /**
349
332
  * Reaction on a message
350
333
  */
@@ -481,8 +464,17 @@ interface AXParticipant {
481
464
  id: string;
482
465
  /** Display name of the participant */
483
466
  name: string;
467
+ /**
468
+ * Short line shown under the name in lists (e.g. job title, status line).
469
+ * Distinct from long-form bio in optional `metadata` (e.g. profile fields).
470
+ */
471
+ description?: string;
484
472
  /** Avatar/profile image URL */
485
473
  avatar?: string;
474
+ /**
475
+ * Font Awesome icon class(es) used when `avatar` is not set (e.g. `'fa-light fa-user'`).
476
+ */
477
+ icon?: string;
486
478
  /** Role in the conversation (for groups/channels) */
487
479
  role?: AXParticipantRole;
488
480
  /** Current online status */
@@ -498,7 +490,7 @@ interface AXParticipant {
498
490
  * Represents a chat conversation (private, group, or channel)
499
491
  */
500
492
 
501
- type AXConversationType = 'private' | 'group' | 'channel';
493
+ type AXConversationType = 'private' | 'group' | 'channel' | 'bot';
502
494
  /**
503
495
  * Conversation status information
504
496
  */
@@ -548,6 +540,20 @@ interface AXConversationSettings {
548
540
  /** Custom settings */
549
541
  custom?: Record<string, unknown>;
550
542
  }
543
+ /**
544
+ * Conversation metadata
545
+ * Extensible map for app-specific conversation data.
546
+ */
547
+ interface AXConversationMetadata extends Record<string, unknown> {
548
+ /** Optional custom background CSS for message list */
549
+ messageListBackground?: string;
550
+ /** Optional custom empty-state component for the message list. */
551
+ messageListEmptyComponent?: Type<AXMessageListEmptyComponent>;
552
+ }
553
+ /** Contract for custom empty-state components rendered by message list. */
554
+ interface AXMessageListEmptyComponent {
555
+ readonly conversation: InputSignal<AXConversation>;
556
+ }
551
557
  /**
552
558
  * Main Conversation interface
553
559
  */
@@ -560,6 +566,11 @@ interface AXConversation {
560
566
  title: string;
561
567
  /** Conversation avatar/image URL */
562
568
  avatar?: string;
569
+ /**
570
+ * Font Awesome icon class(es) for this conversation when no image avatar is used
571
+ * (e.g. default placeholder for senders without a participant avatar/icon).
572
+ */
573
+ icon?: string;
563
574
  /** Conversation description (for groups/channels) */
564
575
  description?: string;
565
576
  /** List of participants */
@@ -593,7 +604,7 @@ interface AXConversation {
593
604
  /** Draft message text */
594
605
  draft?: string;
595
606
  /** Custom metadata */
596
- metadata?: Record<string, unknown>;
607
+ metadata?: AXConversationMetadata;
597
608
  }
598
609
  /**
599
610
  * Typing indicator
@@ -730,7 +741,7 @@ declare class AXComposerComponent implements OnDestroy {
730
741
  /** Send sticker message */
731
742
  private sendSticker;
732
743
  /** Get inputs for emoji popup component */
733
- getEmojiPopupInputs(): Record<string, any>;
744
+ getEmojiPopupInputs(): Record<string, unknown>;
734
745
  /** Handle attach click */
735
746
  onAttachClick(): void;
736
747
  /** Handle voice click */
@@ -776,7 +787,7 @@ declare class AXComposerComponent implements OnDestroy {
776
787
  /** Handle reply preview click - scroll to original message */
777
788
  onReplyPreviewClick(): void;
778
789
  /** Get inputs for dynamic component */
779
- getComponentInputs(): Record<string, any>;
790
+ getComponentInputs(): Record<string, unknown>;
780
791
  onEnter(event: AXHtmlEvent<KeyboardEvent>): Promise<void>;
781
792
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXComposerComponent, never>;
782
793
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXComposerComponent, "ax-conversation-composer", never, {}, { "messageSent": "messageSent"; "emojiClick": "emojiClick"; "attachClick": "attachClick"; "voiceClick": "voiceClick"; }, never, never, true, never>;
@@ -926,201 +937,6 @@ type AXPresenceStatus = 'online' | 'offline' | 'away' | 'busy' | 'invisible';
926
937
  */
927
938
  type AXUserRole = 'owner' | 'admin' | 'member' | 'guest';
928
939
 
929
- /**
930
- * Abstract User Management API
931
- * Handle user profile management and user operations for conversations
932
- */
933
-
934
- /**
935
- * User profile update data
936
- */
937
- interface AXUserProfileUpdate {
938
- /** Display name */
939
- name?: string;
940
- /** Avatar URL */
941
- avatar?: string;
942
- /** Bio/status text */
943
- bio?: string;
944
- /** Phone number */
945
- phone?: string;
946
- /** Email */
947
- email?: string;
948
- /** Custom fields */
949
- custom?: Record<string, any>;
950
- }
951
- /**
952
- * User search filters
953
- */
954
- interface AXUserSearchFilters {
955
- /** Search query */
956
- query?: string;
957
- /** Filter by online status */
958
- onlineOnly?: boolean;
959
- /** Exclude blocked users */
960
- excludeBlocked?: boolean;
961
- /** Limit results */
962
- limit?: number;
963
- }
964
- /**
965
- * Block/Report reason
966
- */
967
- interface AXBlockReportReason {
968
- /** Reason code */
969
- code: string;
970
- /** Description */
971
- description?: string;
972
- }
973
- /**
974
- * Abstract User Management API
975
- *
976
- * Implement this abstract class to handle user management for conversations.
977
- *
978
- * @example
979
- * ```typescript
980
- * @Injectable()
981
- * export class MyUserApi extends AXUserApi {
982
- * constructor(private http: HttpClient) {
983
- * super();
984
- * }
985
- *
986
- * async getCurrentUser(): Promise<AXParticipant> {
987
- * const response = await this.http.get('/api/users/me').toPromise();
988
- * return response;
989
- * }
990
- *
991
- * // ... implement other methods
992
- * }
993
- * ```
994
- */
995
- declare abstract class AXUserApi {
996
- /**
997
- * Get current authenticated user
998
- *
999
- * @returns Current user information
1000
- * @throws {AXApiError} If user is not authenticated
1001
- */
1002
- abstract getCurrentUser(): Promise<AXParticipant>;
1003
- /**
1004
- * Update current user profile
1005
- *
1006
- * @param updates - Profile updates
1007
- * @returns Updated user information
1008
- * @throws {AXApiError} If update fails
1009
- */
1010
- abstract updateProfile(updates: AXUserProfileUpdate): Promise<AXParticipant>;
1011
- /**
1012
- * Upload user avatar
1013
- *
1014
- * @param file - Avatar image file
1015
- * @returns Avatar URL
1016
- * @throws {AXApiError} If upload fails
1017
- */
1018
- abstract uploadAvatar(file: File): Promise<string>;
1019
- /**
1020
- * Get available users for conversation creation
1021
- *
1022
- * @param filters - Search filters
1023
- * @returns List of users
1024
- * @throws {AXApiError} If request fails
1025
- */
1026
- abstract getUsers(filters?: AXUserSearchFilters): Promise<AXParticipant[]>;
1027
- /**
1028
- * Search users by query
1029
- *
1030
- * @param query - Search query
1031
- * @returns Matching users
1032
- * @throws {AXApiError} If search fails
1033
- */
1034
- abstract searchUsers(query: string): Promise<AXParticipant[]>;
1035
- /**
1036
- * Get user by ID
1037
- *
1038
- * @param userId - User ID
1039
- * @returns User information
1040
- * @throws {AXApiError} If user not found
1041
- */
1042
- abstract getUserById(userId: string): Promise<AXParticipant>;
1043
- /**
1044
- * Get multiple users by IDs
1045
- *
1046
- * @param userIds - Array of user IDs
1047
- * @returns Array of users
1048
- * @throws {AXApiError} If request fails
1049
- */
1050
- abstract getUsersByIds(userIds: string[]): Promise<AXParticipant[]>;
1051
- /**
1052
- * Get user presence status
1053
- *
1054
- * @param userId - User ID
1055
- * @returns Presence information
1056
- * @throws {AXApiError} If request fails
1057
- */
1058
- abstract getUserPresence(userId: string): Promise<AXPresenceUpdate>;
1059
- /**
1060
- * Update current user presence
1061
- *
1062
- * @param status - Presence status
1063
- * @param statusText - Optional status text
1064
- * @throws {AXApiError} If update fails
1065
- */
1066
- abstract updatePresence(status: AXPresenceStatus, statusText?: string): Promise<void>;
1067
- /**
1068
- * Block a user
1069
- *
1070
- * @param userId - User ID to block
1071
- * @param reason - Optional reason
1072
- * @throws {AXApiError} If blocking fails
1073
- */
1074
- abstract blockUser(userId: string, reason?: AXBlockReportReason): Promise<void>;
1075
- /**
1076
- * Unblock a user
1077
- *
1078
- * @param userId - User ID to unblock
1079
- * @throws {AXApiError} If unblocking fails
1080
- */
1081
- abstract unblockUser(userId: string): Promise<void>;
1082
- /**
1083
- * Get list of blocked users
1084
- *
1085
- * @returns Array of blocked user IDs
1086
- * @throws {AXApiError} If request fails
1087
- */
1088
- abstract getBlockedUsers(): Promise<string[]>;
1089
- /**
1090
- * Report a user
1091
- *
1092
- * @param userId - User ID to report
1093
- * @param reason - Report reason
1094
- * @throws {AXApiError} If reporting fails
1095
- */
1096
- abstract reportUser(userId: string, reason: AXBlockReportReason): Promise<void>;
1097
- /**
1098
- * Get user settings
1099
- *
1100
- * @returns User settings
1101
- * @throws {AXApiError} If request fails
1102
- */
1103
- abstract getUserSettings(): Promise<Record<string, any>>;
1104
- /**
1105
- * Update user settings
1106
- *
1107
- * @param settings - Settings to update
1108
- * @throws {AXApiError} If update fails
1109
- */
1110
- abstract updateUserSettings(settings: Record<string, any>): Promise<void>;
1111
- /**
1112
- * Create an API error
1113
- * Helper method for consistent error creation
1114
- *
1115
- * @param code - Error code
1116
- * @param message - Error message
1117
- * @param statusCode - HTTP status code
1118
- * @param details - Additional details
1119
- * @returns API error object
1120
- */
1121
- protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXApiError;
1122
- }
1123
-
1124
940
  /**
1125
941
  * Abstract Conversation Management API
1126
942
  * Handle conversation CRUD operations, participants, and settings
@@ -1141,7 +957,7 @@ interface AXConversationCreateData {
1141
957
  /** Avatar URL */
1142
958
  avatar?: string;
1143
959
  /** Custom metadata */
1144
- metadata?: Record<string, any>;
960
+ metadata?: Record<string, unknown>;
1145
961
  }
1146
962
  /**
1147
963
  * Conversation update data
@@ -1154,7 +970,7 @@ interface AXConversationUpdateData {
1154
970
  /** Avatar URL */
1155
971
  avatar?: string;
1156
972
  /** Custom metadata */
1157
- metadata?: Record<string, any>;
973
+ metadata?: Record<string, unknown>;
1158
974
  }
1159
975
  /**
1160
976
  * Conversation filter options
@@ -1173,7 +989,7 @@ interface AXConversationFilters {
1173
989
  /** Filter by tags */
1174
990
  tags?: string[];
1175
991
  /** Custom filters */
1176
- custom?: Record<string, any>;
992
+ custom?: Record<string, unknown>;
1177
993
  }
1178
994
  /**
1179
995
  * Conversation settings update
@@ -1188,7 +1004,7 @@ interface AXConversationSettingsUpdate {
1188
1004
  /** Show message preview in notifications */
1189
1005
  showPreview?: boolean;
1190
1006
  /** Custom settings */
1191
- custom?: Record<string, any>;
1007
+ custom?: Record<string, unknown>;
1192
1008
  }
1193
1009
  /**
1194
1010
  * Participant update data
@@ -1414,7 +1230,7 @@ declare abstract class AXConversationApi {
1414
1230
  * @returns Paginated media items
1415
1231
  * @throws {AXApiError} If request fails
1416
1232
  */
1417
- abstract getConversationMedia(conversationId: string, pagination?: AXPagination): Promise<AXPaginatedResult<any>>;
1233
+ abstract getConversationMedia(conversationId: string, pagination?: AXPagination): Promise<AXPaginatedResult<unknown>>;
1418
1234
  /**
1419
1235
  * Add tags to conversation
1420
1236
  *
@@ -1768,7 +1584,7 @@ declare abstract class AXMessageApi {
1768
1584
  thumbnailUrl?: string;
1769
1585
  size: number;
1770
1586
  mimeType: string;
1771
- metadata?: Record<string, any>;
1587
+ metadata?: Record<string, unknown>;
1772
1588
  }>;
1773
1589
  /**
1774
1590
  * Update message metadata
@@ -1777,7 +1593,7 @@ declare abstract class AXMessageApi {
1777
1593
  * @param metadata - Metadata to update
1778
1594
  * @throws {AXApiError} If update fails
1779
1595
  */
1780
- abstract updateMessageMetadata(messageId: string, metadata: Record<string, any>): Promise<void>;
1596
+ abstract updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): Promise<void>;
1781
1597
  /**
1782
1598
  * Get message metadata
1783
1599
  *
@@ -1785,7 +1601,7 @@ declare abstract class AXMessageApi {
1785
1601
  * @returns Message metadata
1786
1602
  * @throws {AXApiError} If request fails
1787
1603
  */
1788
- abstract getMessageMetadata(messageId: string): Promise<Record<string, any>>;
1604
+ abstract getMessageMetadata(messageId: string): Promise<Record<string, unknown>>;
1789
1605
  /**
1790
1606
  * Update message status
1791
1607
  *
@@ -1902,7 +1718,7 @@ interface AXNotificationEvent {
1902
1718
  /** Timestamp */
1903
1719
  timestamp: Date;
1904
1720
  /** Custom data */
1905
- data?: Record<string, any>;
1721
+ data?: Record<string, unknown>;
1906
1722
  }
1907
1723
  /**
1908
1724
  * Call event
@@ -2134,7 +1950,7 @@ declare abstract class AXRealtimeApi {
2134
1950
  */
2135
1951
  abstract subscribeToConversationSettingsChanges(conversationId?: string): Observable<{
2136
1952
  conversationId: string;
2137
- settings: Record<string, any>;
1953
+ settings: Record<string, unknown>;
2138
1954
  }>;
2139
1955
  /**
2140
1956
  * Subscribe to draft changes
@@ -2150,45 +1966,236 @@ declare abstract class AXRealtimeApi {
2150
1966
  }
2151
1967
 
2152
1968
  /**
2153
- * Composer tab registration
1969
+ * Abstract User Management API
1970
+ * Handle user profile management and user operations for conversations
2154
1971
  */
2155
- interface AXComposerTab {
2156
- /** Unique tab identifier */
2157
- id: string;
2158
- /** Display title */
2159
- title: string;
2160
- /** Icon name/class */
2161
- icon?: string;
2162
- /** Display order priority (higher = earlier) */
2163
- priority?: number;
2164
- /** Angular component for tab content */
2165
- component: Type<any>;
2166
- /** Default data provider (optional) */
2167
- dataProvider?: () => Observable<any>;
2168
- /** Whether tab is enabled */
2169
- enabled?: boolean;
2170
- /** Custom class for styling */
2171
- className?: string;
2172
- /** Badge text/count */
2173
- badge?: string | number;
2174
- }
1972
+
2175
1973
  /**
2176
- * Composer Tab Registry Service
1974
+ * User profile update data
2177
1975
  */
2178
- declare class AXComposerTabRegistry {
2179
- private readonly _tabs;
2180
- constructor();
2181
- /** All registered tabs */
2182
- readonly tabs: _angular_core.Signal<AXComposerTab[]>;
2183
- /** Enabled tabs sorted by priority */
2184
- readonly enabledTabs: _angular_core.Signal<AXComposerTab[]>;
2185
- /**
2186
- * Register a composer tab
2187
- */
2188
- register(tab: AXComposerTab): void;
2189
- /**
2190
- * Unregister a composer tab
2191
- */
1976
+ interface AXUserProfileUpdate {
1977
+ /** Display name */
1978
+ name?: string;
1979
+ /** Avatar URL */
1980
+ avatar?: string;
1981
+ /** Short line under the name in lists (e.g. job title) */
1982
+ description?: string;
1983
+ /** Bio/status text */
1984
+ bio?: string;
1985
+ /** Phone number */
1986
+ phone?: string;
1987
+ /** Email */
1988
+ email?: string;
1989
+ /** Custom fields */
1990
+ custom?: Record<string, unknown>;
1991
+ }
1992
+ /**
1993
+ * User search filters
1994
+ */
1995
+ interface AXUserSearchFilters {
1996
+ /** Search query */
1997
+ query?: string;
1998
+ /** Filter by online status */
1999
+ onlineOnly?: boolean;
2000
+ /** Exclude blocked users */
2001
+ excludeBlocked?: boolean;
2002
+ /** Limit results */
2003
+ limit?: number;
2004
+ }
2005
+ /**
2006
+ * Block/Report reason
2007
+ */
2008
+ interface AXBlockReportReason {
2009
+ /** Reason code */
2010
+ code: string;
2011
+ /** Description */
2012
+ description?: string;
2013
+ }
2014
+ /**
2015
+ * Abstract User Management API
2016
+ *
2017
+ * Implement this abstract class to handle user management for conversations.
2018
+ *
2019
+ * @example
2020
+ * ```typescript
2021
+ * @Injectable()
2022
+ * export class MyUserApi extends AXUserApi {
2023
+ * constructor(private http: HttpClient) {
2024
+ * super();
2025
+ * }
2026
+ *
2027
+ * async getCurrentUser(): Promise<AXParticipant> {
2028
+ * const response = await this.http.get('/api/users/me').toPromise();
2029
+ * return response;
2030
+ * }
2031
+ *
2032
+ * // ... implement other methods
2033
+ * }
2034
+ * ```
2035
+ */
2036
+ declare abstract class AXUserApi {
2037
+ /**
2038
+ * Get current authenticated user
2039
+ *
2040
+ * @returns Current user information
2041
+ * @throws {AXApiError} If user is not authenticated
2042
+ */
2043
+ abstract getCurrentUser(): Promise<AXParticipant>;
2044
+ /**
2045
+ * Update current user profile
2046
+ *
2047
+ * @param updates - Profile updates
2048
+ * @returns Updated user information
2049
+ * @throws {AXApiError} If update fails
2050
+ */
2051
+ abstract updateProfile(updates: AXUserProfileUpdate): Promise<AXParticipant>;
2052
+ /**
2053
+ * Upload user avatar
2054
+ *
2055
+ * @param file - Avatar image file
2056
+ * @returns Avatar URL
2057
+ * @throws {AXApiError} If upload fails
2058
+ */
2059
+ abstract uploadAvatar(file: File): Promise<string>;
2060
+ /**
2061
+ * Get available users for conversation creation
2062
+ *
2063
+ * @param filters - Search filters
2064
+ * @returns List of users
2065
+ * @throws {AXApiError} If request fails
2066
+ */
2067
+ abstract getUsers(filters?: AXUserSearchFilters): Promise<AXParticipant[]>;
2068
+ /**
2069
+ * Search users by query
2070
+ *
2071
+ * @param query - Search query
2072
+ * @returns Matching users
2073
+ * @throws {AXApiError} If search fails
2074
+ */
2075
+ abstract searchUsers(query: string): Promise<AXParticipant[]>;
2076
+ /**
2077
+ * Get user by ID
2078
+ *
2079
+ * @param userId - User ID
2080
+ * @returns User information
2081
+ * @throws {AXApiError} If user not found
2082
+ */
2083
+ abstract getUserById(userId: string): Promise<AXParticipant>;
2084
+ /**
2085
+ * Get multiple users by IDs
2086
+ *
2087
+ * @param userIds - Array of user IDs
2088
+ * @returns Array of users
2089
+ * @throws {AXApiError} If request fails
2090
+ */
2091
+ abstract getUsersByIds(userIds: string[]): Promise<AXParticipant[]>;
2092
+ /**
2093
+ * Get user presence status
2094
+ *
2095
+ * @param userId - User ID
2096
+ * @returns Presence information
2097
+ * @throws {AXApiError} If request fails
2098
+ */
2099
+ abstract getUserPresence(userId: string): Promise<AXPresenceUpdate>;
2100
+ /**
2101
+ * Update current user presence
2102
+ *
2103
+ * @param status - Presence status
2104
+ * @param statusText - Optional status text
2105
+ * @throws {AXApiError} If update fails
2106
+ */
2107
+ abstract updatePresence(status: AXPresenceStatus, statusText?: string): Promise<void>;
2108
+ /**
2109
+ * Block a user
2110
+ *
2111
+ * @param userId - User ID to block
2112
+ * @param reason - Optional reason
2113
+ * @throws {AXApiError} If blocking fails
2114
+ */
2115
+ abstract blockUser(userId: string, reason?: AXBlockReportReason): Promise<void>;
2116
+ /**
2117
+ * Unblock a user
2118
+ *
2119
+ * @param userId - User ID to unblock
2120
+ * @throws {AXApiError} If unblocking fails
2121
+ */
2122
+ abstract unblockUser(userId: string): Promise<void>;
2123
+ /**
2124
+ * Get list of blocked users
2125
+ *
2126
+ * @returns Array of blocked user IDs
2127
+ * @throws {AXApiError} If request fails
2128
+ */
2129
+ abstract getBlockedUsers(): Promise<string[]>;
2130
+ /**
2131
+ * Report a user
2132
+ *
2133
+ * @param userId - User ID to report
2134
+ * @param reason - Report reason
2135
+ * @throws {AXApiError} If reporting fails
2136
+ */
2137
+ abstract reportUser(userId: string, reason: AXBlockReportReason): Promise<void>;
2138
+ /**
2139
+ * Get user settings
2140
+ *
2141
+ * @returns User settings
2142
+ * @throws {AXApiError} If request fails
2143
+ */
2144
+ abstract getUserSettings(): Promise<Record<string, unknown>>;
2145
+ /**
2146
+ * Update user settings
2147
+ *
2148
+ * @param settings - Settings to update
2149
+ * @throws {AXApiError} If update fails
2150
+ */
2151
+ abstract updateUserSettings(settings: Record<string, unknown>): Promise<void>;
2152
+ /**
2153
+ * Create an API error
2154
+ * Helper method for consistent error creation
2155
+ *
2156
+ * @param code - Error code
2157
+ * @param message - Error message
2158
+ * @param statusCode - HTTP status code
2159
+ * @param details - Additional details
2160
+ * @returns API error object
2161
+ */
2162
+ protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXApiError;
2163
+ }
2164
+
2165
+ /**
2166
+ * Composer tab registration
2167
+ */
2168
+ interface AXComposerTab extends AXRegistryItem {
2169
+ /** Display title */
2170
+ title: string;
2171
+ /** Icon name/class */
2172
+ icon?: string;
2173
+ /** Angular component for tab content */
2174
+ component: Type<unknown>;
2175
+ /** Default data provider (optional) */
2176
+ dataProvider?: () => Observable<unknown>;
2177
+ /** Custom class for styling */
2178
+ className?: string;
2179
+ /** Badge text/count */
2180
+ badge?: string | number;
2181
+ }
2182
+ /**
2183
+ * Composer Tab Registry Service
2184
+ */
2185
+ declare class AXComposerTabRegistry {
2186
+ private readonly _tabs;
2187
+ constructor();
2188
+ /** All registered tabs */
2189
+ readonly tabs: _angular_core.Signal<AXComposerTab[]>;
2190
+ /** Enabled tabs sorted by priority */
2191
+ readonly enabledTabs: _angular_core.Signal<AXComposerTab[]>;
2192
+ /**
2193
+ * Register a composer tab
2194
+ */
2195
+ register(tab: AXComposerTab): void;
2196
+ /**
2197
+ * Unregister a composer tab
2198
+ */
2192
2199
  unregister(id: string): void;
2193
2200
  /**
2194
2201
  * Get tab by ID
@@ -2219,7 +2226,7 @@ interface AXConversationItemActionContext {
2219
2226
  /** Conversation service for conversation operations */
2220
2227
  conversationService?: AXConversationService;
2221
2228
  /** Additional context data */
2222
- data?: Record<string, any>;
2229
+ data?: Record<string, unknown>;
2223
2230
  }
2224
2231
  /**
2225
2232
  * Conversation item action configuration
@@ -2285,21 +2292,15 @@ declare class AXConversationItemActionRegistry extends AXBaseRegistry<AXConversa
2285
2292
  /**
2286
2293
  * Conversation tab registration
2287
2294
  */
2288
- interface AXConversationTab {
2289
- /** Unique tab identifier */
2290
- id: string;
2295
+ interface AXConversationTab extends AXRegistryItem {
2291
2296
  /** Display label */
2292
2297
  label: string;
2293
2298
  /** Icon name/class */
2294
2299
  icon?: string;
2295
- /** Display order priority (higher = earlier) */
2296
- priority?: number;
2297
2300
  /** Filter function to determine which conversations to show */
2298
2301
  filter: (conversations: AXConversation[]) => AXConversation[];
2299
2302
  /** Badge function to compute badge count/text */
2300
2303
  badge?: (conversations: AXConversation[]) => number | string | undefined;
2301
- /** Whether tab is enabled */
2302
- enabled?: boolean;
2303
2304
  /** Custom class for styling */
2304
2305
  className?: string;
2305
2306
  /** Whether this is the default active tab */
@@ -2369,7 +2370,15 @@ interface AXInfoBarActionContext {
2369
2370
  /** Info bar service for UI operations */
2370
2371
  infoBarService?: AXInfoBarService;
2371
2372
  /** Additional context data */
2372
- data?: Record<string, any>;
2373
+ data?: Record<string, unknown>;
2374
+ }
2375
+ /**
2376
+ * Contract for components used as {@link AXInfoBarAction.component}.
2377
+ * Info-bar shell passes at least `{ conversation, service }`.
2378
+ */
2379
+ interface AXInfoBarActionComponent {
2380
+ readonly conversation: InputSignal<AXConversation>;
2381
+ readonly service?: InputSignal<AXInfoBarService | undefined>;
2373
2382
  }
2374
2383
  /**
2375
2384
  * Info bar action configuration
@@ -2391,11 +2400,16 @@ interface AXInfoBarAction extends AXRegistryItem {
2391
2400
  * Component to show when action is activated (for inline actions)
2392
2401
  * If provided, clicking the action will show this component in the info-bar
2393
2402
  */
2394
- component?: Type<unknown>;
2403
+ component?: Type<AXInfoBarActionComponent>;
2395
2404
  /**
2396
2405
  * Whether this action is toggleable (shows/hides component)
2397
2406
  */
2398
2407
  toggleable?: boolean;
2408
+ /**
2409
+ * Whether action component should take full width of the info-bar.
2410
+ * Defaults to `true` when omitted.
2411
+ */
2412
+ fullWidthComponent?: boolean;
2399
2413
  /**
2400
2414
  * Visibility condition
2401
2415
  * @returns true if action should be visible
@@ -2468,20 +2482,16 @@ interface AXMessageActionContext {
2468
2482
  /** Message list service for UI operations */
2469
2483
  messageListService: AXMessageListService;
2470
2484
  /** Custom context data */
2471
- custom?: Record<string, any>;
2485
+ custom?: Record<string, unknown>;
2472
2486
  }
2473
2487
  /**
2474
2488
  * Message action registration
2475
2489
  */
2476
- interface AXMessageAction {
2477
- /** Unique action identifier */
2478
- id: string;
2490
+ interface AXMessageAction extends Omit<AXRegistryItem, 'enabled'> {
2479
2491
  /** Display label */
2480
2492
  label: string;
2481
2493
  /** Icon name/class */
2482
2494
  icon?: string;
2483
- /** Display order priority (higher = earlier) */
2484
- priority?: number;
2485
2495
  /** Show as inline button */
2486
2496
  showInline?: boolean;
2487
2497
  /** Visibility condition */
@@ -2545,6 +2555,11 @@ declare class AXMessageActionRegistry {
2545
2555
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXMessageActionRegistry>;
2546
2556
  }
2547
2557
 
2558
+ /**
2559
+ * Message Renderer Registry
2560
+ * Register custom message renderers for different message types
2561
+ */
2562
+
2548
2563
  /**
2549
2564
  * Message renderer capabilities
2550
2565
  */
@@ -2562,6 +2577,35 @@ interface AXMessageRendererCapabilities {
2562
2577
  /** Custom capabilities */
2563
2578
  custom?: Record<string, boolean>;
2564
2579
  }
2580
+ /**
2581
+ * Remote or binary content lifecycle inside a message renderer (image load, audio decode, etc.).
2582
+ * Use `none` when the renderer has no separate load phase (text, file row, etc.).
2583
+ */
2584
+ type AXMessageRendererContentState = 'none' | 'loading' | 'ready' | 'error';
2585
+ /**
2586
+ * Combined state for a chat message renderer: delivery pipeline plus optional content load.
2587
+ */
2588
+ interface AXMessageRendererState {
2589
+ /** Mirrors `message.status` (sending, sent, delivered, read, failed). */
2590
+ deliveryStatus: AXMessageStatus;
2591
+ /** Media / rich content load; set to `error` from `(error)` handlers on img, audio, video, etc. */
2592
+ contentState: AXMessageRendererContentState;
2593
+ }
2594
+ /**
2595
+ * Contract for components used as {@link AXMessageRenderer.component}.
2596
+ * The message list passes `{ message }`; each view exposes `rendererState` for templates and tooling.
2597
+ */
2598
+ interface AXMessageRendererComponent {
2599
+ readonly message: InputSignal<AXMessage>;
2600
+ readonly rendererState: Signal<AXMessageRendererState>;
2601
+ }
2602
+ /**
2603
+ * Contract for components used as {@link AXMessageRenderer.infoBarBanner}.
2604
+ * Conversation shell passes at least `{ message }`; renderers can pass additional inputs.
2605
+ */
2606
+ interface AXMessageInfoBarBannerComponent {
2607
+ readonly message: InputSignal<AXMessage>;
2608
+ }
2565
2609
  /**
2566
2610
  * Message renderer registration
2567
2611
  */
@@ -2569,7 +2613,12 @@ interface AXMessageRenderer {
2569
2613
  /** Unique type identifier */
2570
2614
  type: string;
2571
2615
  /** Angular component to render this message type */
2572
- component: Type<any>;
2616
+ component: Type<AXMessageRendererComponent>;
2617
+ /**
2618
+ * Optional component rendered as a dismissible banner under info-bar.
2619
+ * Useful for active/interactive message states (e.g. voice playback progress).
2620
+ */
2621
+ infoBarBanner?: Type<AXMessageInfoBarBannerComponent>;
2573
2622
  /** Function to determine if this renderer can handle a message */
2574
2623
  canHandle: (message: AXMessage) => boolean;
2575
2624
  /** Renderer capabilities */
@@ -2578,17 +2627,24 @@ interface AXMessageRenderer {
2578
2627
  displayName?: string;
2579
2628
  /** Icon name/class */
2580
2629
  icon?: string;
2630
+ /**
2631
+ * Optional composer actions co-located with this message type (e.g. pickers that produce this message).
2632
+ * Registered with {@link AXComposerActionRegistry} when the renderer is registered.
2633
+ * Use `AXRegistryConfiguration.composerActions` for actions not tied to a single message renderer.
2634
+ */
2635
+ composerActions?: AXComposerAction[];
2581
2636
  }
2582
2637
  /**
2583
2638
  * Message Renderer Registry Service
2584
2639
  */
2585
2640
  declare class AXMessageRendererRegistry {
2586
2641
  private readonly _renderers;
2642
+ private readonly _composerActions;
2587
2643
  constructor();
2588
2644
  /** All registered renderers */
2589
- readonly renderers: _angular_core.Signal<AXMessageRenderer[]>;
2645
+ readonly renderers: Signal<AXMessageRenderer[]>;
2590
2646
  /** Renderers sorted by priority (highest first) */
2591
- readonly sortedRenderers: _angular_core.Signal<AXMessageRenderer[]>;
2647
+ readonly sortedRenderers: Signal<AXMessageRenderer[]>;
2592
2648
  /**
2593
2649
  * Register a message renderer
2594
2650
  */
@@ -2677,9 +2733,8 @@ declare class AXConversationService {
2677
2733
  private readonly _activeConversationId;
2678
2734
  private readonly _loading;
2679
2735
  private readonly _error;
2680
- private readonly activeRequests;
2681
- private readonly messageQueue;
2682
- private processingQueue;
2736
+ /** Emits when the active conversation changes, cancelling per-conversation subscriptions. */
2737
+ private readonly _conversationSwitch$;
2683
2738
  private readonly _messageReceived$;
2684
2739
  private readonly _messageUpdated$;
2685
2740
  private readonly _messageDeleted$;
@@ -2853,7 +2908,7 @@ declare class AXConversationService {
2853
2908
  * @param conversationId - Conversation ID
2854
2909
  * @param metadata - Metadata to merge
2855
2910
  */
2856
- updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void>;
2911
+ updateConversationMetadata(conversationId: string, metadata: AXConversationMetadata): Promise<void>;
2857
2912
  /**
2858
2913
  * Get conversation by ID
2859
2914
  * @param conversationId - Conversation ID
@@ -2867,7 +2922,7 @@ declare class AXConversationService {
2867
2922
  * @param metadata - Optional metadata (title, avatar, etc.)
2868
2923
  * @returns Created conversation
2869
2924
  */
2870
- createConversation(participantIds: string[], type: 'private' | 'group' | 'channel', metadata?: Record<string, unknown>): Promise<AXConversation>;
2925
+ createConversation(participantIds: string[], type: AXConversationType, metadata?: AXConversationMetadata): Promise<AXConversation>;
2871
2926
  /**
2872
2927
  * Get available users for conversation creation
2873
2928
  * @param query - Optional search query
@@ -3067,14 +3122,20 @@ interface AXComposerActionContext {
3067
3122
  /** Conversation service for conversation operations */
3068
3123
  conversationService?: AXConversationService;
3069
3124
  /** Custom context data */
3070
- custom?: Record<string, any>;
3125
+ custom?: Record<string, unknown>;
3126
+ }
3127
+ /**
3128
+ * Contract for components used as {@link AXComposerAction.component}.
3129
+ * Composer shell passes at least `{ conversation, service }`.
3130
+ */
3131
+ interface AXComposerActionComponent {
3132
+ readonly conversation: InputSignal<AXConversation>;
3133
+ readonly service?: InputSignal<AXComposerService | undefined>;
3071
3134
  }
3072
3135
  /**
3073
3136
  * Composer action registration
3074
3137
  */
3075
- interface AXComposerAction {
3076
- /** Unique action identifier */
3077
- id: string;
3138
+ interface AXComposerAction extends Omit<AXRegistryItem, 'enabled'> {
3078
3139
  /** Display label (for accessibility) */
3079
3140
  label: string;
3080
3141
  /** Icon name/class */
@@ -3083,8 +3144,6 @@ interface AXComposerAction {
3083
3144
  position: 'left' | 'right';
3084
3145
  /** Location: inline (show as button) or menu (show in dropdown menu) */
3085
3146
  location?: 'inline' | 'menu';
3086
- /** Display order priority (higher = earlier) */
3087
- priority?: number;
3088
3147
  /** Visibility condition */
3089
3148
  visible: (context: AXComposerActionContext) => boolean;
3090
3149
  /** Enabled condition */
@@ -3093,7 +3152,7 @@ interface AXComposerAction {
3093
3152
  * Component to show when action is activated
3094
3153
  * If provided, clicking the action will show this component in full-width mode
3095
3154
  */
3096
- component?: Type<unknown>;
3155
+ component?: Type<AXComposerActionComponent>;
3097
3156
  /**
3098
3157
  * Whether this action is toggleable (shows/hides component)
3099
3158
  */
@@ -3257,7 +3316,7 @@ declare class AXComposerService {
3257
3316
 
3258
3317
  declare class AXConversationContainerComponent {
3259
3318
  private readonly conversationService;
3260
- protected readonly config: _acorex_components_conversation2.AXConversationConfig;
3319
+ protected readonly config: Required<_acorex_components_conversation2.AXConversationConfig>;
3261
3320
  /** Custom CSS class */
3262
3321
  readonly customClass: _angular_core.InputSignal<string>;
3263
3322
  /** Loading state */
@@ -3303,6 +3362,8 @@ declare class AXInfoBarComponent {
3303
3362
  readonly activeConversation: _angular_core.Signal<AXConversation>;
3304
3363
  /** Active component from service */
3305
3364
  readonly activeComponent: _angular_core.Signal<_acorex_components_conversation2.AXInfoBarActiveComponent>;
3365
+ /** Active banner from service */
3366
+ readonly activeBanner: _angular_core.Signal<_acorex_components_conversation2.AXInfoBarActiveBanner>;
3306
3367
  /** Members popover reference */
3307
3368
  readonly membersPopoverRef: _angular_core.Signal<AXPopoverComponent>;
3308
3369
  /** Members popover target element */
@@ -3334,9 +3395,13 @@ declare class AXInfoBarComponent {
3334
3395
  /** Handle inline action click */
3335
3396
  onInlineActionClick(actionId: string): Promise<void>;
3336
3397
  /** Get inputs for dynamic component */
3337
- getComponentInputs(): Record<string, any>;
3398
+ getComponentInputs(): Record<string, unknown>;
3399
+ getInlineComponentInputs(): Record<string, unknown>;
3400
+ isActiveComponentFullWidth(): boolean;
3338
3401
  /** Handle close component */
3339
3402
  onCloseComponent(): void;
3403
+ getBannerInputs(): Record<string, unknown>;
3404
+ onCloseBanner(): void;
3340
3405
  /** Handle menu item click */
3341
3406
  onMenuItemClick(item: DropdownMenuItem): Promise<void>;
3342
3407
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarComponent, never>;
@@ -3354,6 +3419,16 @@ interface AXInfoBarActiveComponent {
3354
3419
  /** Component inputs */
3355
3420
  inputs?: Record<string, unknown>;
3356
3421
  }
3422
+ interface AXInfoBarActiveBanner {
3423
+ /** Message that owns this banner */
3424
+ message: AXMessage;
3425
+ /** Banner component */
3426
+ component: Type<AXMessageInfoBarBannerComponent>;
3427
+ /** Additional component inputs (only keys that match declared `input()` on the banner) */
3428
+ inputs?: Record<string, unknown>;
3429
+ /** Callback invoked when the banner is dismissed (e.g. pause playback) */
3430
+ onClose?: () => void;
3431
+ }
3357
3432
  /**
3358
3433
  * Info Bar Service
3359
3434
  * Manages info bar state and actions
@@ -3366,6 +3441,9 @@ declare class AXInfoBarService {
3366
3441
  /** Active component being shown in info-bar */
3367
3442
  private readonly _activeComponent;
3368
3443
  readonly activeComponent: _angular_core.Signal<AXInfoBarActiveComponent>;
3444
+ /** Active banner shown under info-bar */
3445
+ private readonly _activeBanner;
3446
+ readonly activeBanner: _angular_core.Signal<AXInfoBarActiveBanner>;
3369
3447
  /** Search query signal */
3370
3448
  private readonly _searchQuery;
3371
3449
  readonly searchQuery: _angular_core.Signal<string>;
@@ -3374,6 +3452,7 @@ declare class AXInfoBarService {
3374
3452
  /** Current search result index */
3375
3453
  private readonly _currentSearchIndex;
3376
3454
  readonly currentSearchIndex: _angular_core.Signal<number>;
3455
+ constructor();
3377
3456
  /**
3378
3457
  * Get actions for the active conversation
3379
3458
  */
@@ -3398,6 +3477,19 @@ declare class AXInfoBarService {
3398
3477
  * Hide the active component
3399
3478
  */
3400
3479
  hideComponent(): void;
3480
+ /**
3481
+ * Show message-owned banner under info-bar if renderer provides one
3482
+ */
3483
+ showMessageBanner(message: AXMessage, inputs?: Record<string, unknown>): void;
3484
+ /**
3485
+ * Update active banner inputs for a specific message
3486
+ */
3487
+ updateMessageBannerInputs(messageId: string, inputs: Record<string, unknown>): void;
3488
+ /**
3489
+ * Hide active banner. If messageId is provided, hide only when it matches.
3490
+ */
3491
+ hideMessageBanner(messageId?: string): void;
3492
+ isMessageBannerActive(messageId: string): boolean;
3401
3493
  /**
3402
3494
  * Toggle component visibility
3403
3495
  */
@@ -3422,232 +3514,11 @@ declare class AXInfoBarService {
3422
3514
  * Clear search
3423
3515
  */
3424
3516
  clearSearch(): void;
3517
+ private _extractOnClose;
3425
3518
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarService, never>;
3426
3519
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXInfoBarService>;
3427
3520
  }
3428
3521
 
3429
- declare class AXMessageListComponent implements OnDestroy {
3430
- private readonly conversationService;
3431
- private readonly messageListService;
3432
- protected readonly config: _acorex_components_conversation2.AXConversationConfig;
3433
- /** Custom avatar template for message list items */
3434
- readonly avatarTemplate: _angular_core.InputSignal<TemplateRef<AXMessageAvatarTemplateContext>>;
3435
- private readonly timeouts;
3436
- private readonly replyCounts;
3437
- private readonly forwardCounts;
3438
- readonly reactionPickerTarget: _angular_core.WritableSignal<string>;
3439
- readonly reactionPickerElement: _angular_core.WritableSignal<HTMLElement>;
3440
- readonly reactionPopover: _angular_core.Signal<any>;
3441
- readonly availableReactions: _angular_core.WritableSignal<string[]>;
3442
- private get registry();
3443
- /** Message list element reference */
3444
- private readonly messageListRef;
3445
- /** Messages container element reference */
3446
- private readonly messagesContainerRef;
3447
- /** Loading state - use service */
3448
- readonly loading: _angular_core.WritableSignal<boolean>;
3449
- /** Loading more messages state - use service */
3450
- readonly loadingMore: _angular_core.WritableSignal<boolean>;
3451
- /** Show scroll to bottom button - use service */
3452
- readonly showScrollButton: _angular_core.WritableSignal<boolean>;
3453
- /** Active conversation */
3454
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
3455
- /** Messages */
3456
- readonly messages: _angular_core.Signal<AXMessage[]>;
3457
- /** Message action event */
3458
- readonly messageAction: _angular_core.OutputEmitterRef<{
3459
- message: AXMessage;
3460
- action: string;
3461
- }>;
3462
- /** Current user from service */
3463
- readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
3464
- /** Message grouped by date - use service */
3465
- readonly messageGroups: _angular_core.Signal<{
3466
- date: string;
3467
- dateLabel: string;
3468
- messages: AXMessage[];
3469
- }[]>;
3470
- constructor();
3471
- private intersectionObserver?;
3472
- /**
3473
- * Setup intersection observer to mark messages as read when visible
3474
- */
3475
- private setupIntersectionObserver;
3476
- /**
3477
- * Mark message as read
3478
- */
3479
- private markMessageAsRead;
3480
- /** Get message CSS classes */
3481
- getMessageClasses(message: AXMessage): string;
3482
- /** Get bubble CSS classes */
3483
- getBubbleClasses(message: AXMessage): string;
3484
- /** Check if message is from current user */
3485
- isOwnMessage(message: AXMessage): boolean;
3486
- /** Should show avatar */
3487
- shouldShowAvatar(message: AXMessage): boolean;
3488
- /** Should show sender name */
3489
- shouldShowSenderName(message: AXMessage): boolean;
3490
- /** Get sender name */
3491
- getSenderName(message: AXMessage): string;
3492
- /** Get sender avatar */
3493
- getSenderAvatar(message: AXMessage): string | undefined;
3494
- /** Get original sender name for forwarded messages */
3495
- getOriginalSenderName(message: AXMessage): string;
3496
- /** Get forwarded text with sender and conversation info */
3497
- getForwardedText(message: AXMessage): string;
3498
- /** Resolve renderer component for message */
3499
- getRendererComponent(message: AXMessage): _angular_core.Type<any>;
3500
- /** Provide inputs for the dynamic renderer */
3501
- getRendererInputs(message: AXMessage): {
3502
- message: AXMessage;
3503
- };
3504
- /** Get status icon */
3505
- getStatusIcon(message: AXMessage): string;
3506
- /** Get status icon CSS classes */
3507
- getStatusIconClasses(message: AXMessage): string;
3508
- /** Get status tooltip text */
3509
- getStatusTooltip(message: AXMessage): string;
3510
- /** Get first unread message ID */
3511
- readonly firstUnreadMessageId: _angular_core.Signal<string>;
3512
- /** Get grouped reactions */
3513
- getGroupedReactions(message: AXMessage): Array<{
3514
- emoji: string;
3515
- count: number;
3516
- userIds: string[];
3517
- hasReacted: boolean;
3518
- }>;
3519
- /** Get reaction tooltip text */
3520
- getReactionTooltip(reaction: {
3521
- emoji: string;
3522
- count: number;
3523
- userIds: string[];
3524
- hasReacted: boolean;
3525
- }): string;
3526
- /** Toggle reaction picker */
3527
- toggleReactionPicker(messageId: string, event: MouseEvent): void;
3528
- /** Close reaction picker */
3529
- closeReactionPicker(): void;
3530
- /** Check if current user has reacted with specific emoji */
3531
- hasUserReacted(message: AXMessage, emoji: string): boolean;
3532
- /** Check if current user has reacted with specific emoji by message ID */
3533
- hasUserReactedById(messageId: string, emoji: string): boolean;
3534
- /** Handle reaction click by message ID */
3535
- onReactionClickById(messageId: string, emoji: string): void;
3536
- /** Get message by ID */
3537
- getMessageById(messageId: string): AXMessage | undefined;
3538
- /** Load available reactions from API */
3539
- private loadAvailableReactions;
3540
- /** Get message actions from registry */
3541
- getMessageActions(message: AXMessage): _acorex_components_conversation2.AXMessageAction[];
3542
- /** Get initials from name */
3543
- getInitials(name: string): string;
3544
- /** Handle reaction click */
3545
- onReactionClick(message: AXMessage, emoji: string): void;
3546
- /** Handle message action */
3547
- onMessageAction(message: AXMessage, action: any): Promise<void>;
3548
- /** Handle scroll events */
3549
- onScroll(event: Event): void;
3550
- /** Handle infinite scroll threshold */
3551
- onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
3552
- /** Load older messages - delegate to service */
3553
- private loadOlderMessages;
3554
- /** Check if user is near bottom of scroll */
3555
- private isUserNearBottom;
3556
- /** Scroll to bottom */
3557
- scrollToBottom(smooth?: boolean): void;
3558
- /** Scroll to specific message */
3559
- scrollToMessage(messageId: string): void;
3560
- /** Cleanup timeouts and observers on destroy */
3561
- ngOnDestroy(): void;
3562
- /** Get message preview text for reply */
3563
- getMessagePreviewText(message: AXMessage): {
3564
- value: string;
3565
- type: string;
3566
- icon: string;
3567
- };
3568
- /** Get ARIA label for message */
3569
- getMessageAriaLabel(message: AXMessage): string;
3570
- /** Get reply count for a message (fetches from API across all conversations) */
3571
- getReplyCount(message: AXMessage): number;
3572
- /** Get forward count for a message (fetches from API across all conversations) */
3573
- getForwardCount(message: AXMessage): number;
3574
- /**
3575
- * Refresh count for a specific message from API
3576
- * This is called when a new reply or forward is detected globally
3577
- */
3578
- private refreshCount;
3579
- /** Show thread view for a message */
3580
- showThread(message: AXMessage): void;
3581
- /** Handle context menu opening for messages */
3582
- handleMessageContextMenuOpening(event: AXContextMenuOpeningEvent, message: AXMessage): void;
3583
- /** Handle context menu item click for messages */
3584
- handleMessageContextMenuItemClick(event: AXContextMenuItemsClickEvent, message: AXMessage): void;
3585
- /**
3586
- * TrackBy function for message groups
3587
- * Tracks by date only to prevent re-rendering when messages are added
3588
- */
3589
- trackMessageGroup(index: number, group: {
3590
- date: string;
3591
- messages: AXMessage[];
3592
- }): string;
3593
- /**
3594
- * TrackBy function for messages
3595
- * Tracks by ID only to prevent unnecessary re-renders
3596
- */
3597
- trackMessage(index: number, message: AXMessage): string;
3598
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXMessageListComponent, never>;
3599
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXMessageListComponent, "ax-conversation-message-list", never, { "avatarTemplate": { "alias": "avatarTemplate"; "required": false; "isSignal": true; }; }, { "messageAction": "messageAction"; }, never, never, true, never>;
3600
- }
3601
- interface AXMessageAvatarTemplateContext {
3602
- $implicit: AXMessage;
3603
- size: number;
3604
- senderName: string;
3605
- senderAvatar?: string;
3606
- }
3607
-
3608
- declare class AXMessageListService {
3609
- private readonly conversationService;
3610
- private readonly composerService;
3611
- private readonly config;
3612
- private get registry();
3613
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
3614
- readonly activeMessages: _angular_core.Signal<AXMessage[]>;
3615
- readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
3616
- /** Loading state */
3617
- readonly loading: _angular_core.WritableSignal<boolean>;
3618
- /** Loading more messages state */
3619
- readonly loadingMore: _angular_core.WritableSignal<boolean>;
3620
- /** Show scroll to bottom button */
3621
- readonly showScrollButton: _angular_core.WritableSignal<boolean>;
3622
- /** Scroll requests counter */
3623
- readonly scrollRequests: _angular_core.WritableSignal<number>;
3624
- /** Current page for pagination */
3625
- private readonly currentPage;
3626
- /** Has more messages to load */
3627
- private readonly hasMoreMessages;
3628
- /** Message grouped by date */
3629
- readonly messageGroups: _angular_core.Signal<{
3630
- date: string;
3631
- dateLabel: string;
3632
- messages: AXMessage[];
3633
- }[]>;
3634
- /**
3635
- * Load more messages (pagination)
3636
- */
3637
- loadMoreMessages(): Promise<void>;
3638
- /**
3639
- * Reset pagination (call when conversation changes)
3640
- */
3641
- resetPagination(): void;
3642
- getMenuActions(message: AXMessage): _acorex_components_conversation2.AXMessageAction[];
3643
- executeAction(message: AXMessage, actionId: string): Promise<void>;
3644
- reactToMessage(messageId: string, emoji: string): Promise<void>;
3645
- /** Request message list to scroll to bottom */
3646
- requestScrollToBottom(): void;
3647
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXMessageListService, never>;
3648
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXMessageListService>;
3649
- }
3650
-
3651
3522
  /**
3652
3523
  * Conversation Store Service
3653
3524
  * Unified signal-based store for conversations and messages
@@ -3952,6 +3823,7 @@ interface FilePreview {
3952
3823
  }
3953
3824
  declare class AXFileUploadService {
3954
3825
  private readonly config;
3826
+ private readonly platformId;
3955
3827
  private uploadProgress$;
3956
3828
  /**
3957
3829
  * Get upload progress observable
@@ -4004,80 +3876,301 @@ declare class AXFileUploadService {
4004
3876
  /**
4005
3877
  * Validate file type against conversation config
4006
3878
  */
4007
- isFileTypeAllowed(file: File): boolean;
3879
+ isFileTypeAllowed(file: File): boolean;
3880
+ /**
3881
+ * Validate file size against conversation config
3882
+ */
3883
+ isFileSizeAllowed(file: File): boolean;
3884
+ /**
3885
+ * Validate a set of files using conversation config
3886
+ */
3887
+ validateFilesWithConfig(files: File[]): {
3888
+ accepted: File[];
3889
+ rejected: {
3890
+ file: File;
3891
+ reason: string;
3892
+ }[];
3893
+ };
3894
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFileUploadService, never>;
3895
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXFileUploadService>;
3896
+ }
3897
+
3898
+ declare class AXForwardMessageDialogComponent implements OnInit {
3899
+ private readonly toastService;
3900
+ /**
3901
+ * Set by {@link AXPopupComponent} when opened via {@link AXPopupService} so the shell title can update.
3902
+ */
3903
+ readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
3904
+ conversationService: AXConversationService;
3905
+ message: AXMessage;
3906
+ readonly onClosed: EventEmitter<AXComponentCloseEvent>;
3907
+ readonly allConversations: _angular_core.WritableSignal<AXConversation[]>;
3908
+ readonly forwardSearchQuery: _angular_core.WritableSignal<string>;
3909
+ readonly selectedConversationIds: _angular_core.WritableSignal<string[]>;
3910
+ readonly forwardListEmptyTpl: _angular_core.Signal<TemplateRef<unknown>>;
3911
+ readonly forwardList: _angular_core.Signal<AXListComponent>;
3912
+ readonly forwardListDataSource: AXDataSource<unknown>;
3913
+ readonly canForward: _angular_core.Signal<boolean>;
3914
+ private readonly _syncPopupTitleEffect;
3915
+ ngOnInit(): void;
3916
+ onForwardSearchChange(value: string): void;
3917
+ conversationFromItem(item: unknown): AXConversation | null;
3918
+ isSelected(conversationId: string): boolean;
3919
+ getInitials(name: string): string;
3920
+ private getFilteredConversationsForForward;
3921
+ onCancel(): void;
3922
+ onForward(): Promise<void>;
3923
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXForwardMessageDialogComponent, never>;
3924
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXForwardMessageDialogComponent, "ax-forward-message-dialog", never, { "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3925
+ }
3926
+
3927
+ /** Default message list surface when no conversation is selected and no `ax-conversation-message-list-no-active` content is projected. */
3928
+ declare class AXMessageListNoActiveDefaultComponent {
3929
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXMessageListNoActiveDefaultComponent, never>;
3930
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXMessageListNoActiveDefaultComponent, "ax-conversation-message-list-no-active-default", never, {}, {}, never, never, true, never>;
3931
+ }
3932
+
3933
+ declare class AXMessageListComponent implements OnDestroy {
3934
+ private readonly conversationService;
3935
+ private readonly messageListService;
3936
+ protected readonly config: Required<_acorex_components_conversation2.AXConversationConfig>;
3937
+ /**
3938
+ * Background for the message list scroll area from config, or the built-in soft gradient when unset/empty.
3939
+ * Set `messageListBackground` to `transparent` or `none` for a flat look.
3940
+ */
3941
+ messageListBackgroundStyle(): string;
3942
+ resolvedEmptyStateComponent(): Type<AXMessageListEmptyComponent>;
3943
+ /** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */
3944
+ protected readonly noActiveFallbackComponent: typeof AXMessageListNoActiveDefaultComponent;
3945
+ /** Custom avatar template for message list items */
3946
+ readonly avatarTemplate: _angular_core.InputSignal<TemplateRef<AXMessageAvatarTemplateContext>>;
3947
+ private readonly timeouts;
3948
+ private readonly replyCounts;
3949
+ private readonly forwardCounts;
3950
+ readonly reactionPickerTarget: _angular_core.WritableSignal<string>;
3951
+ readonly reactionPickerElement: _angular_core.WritableSignal<HTMLElement>;
3952
+ readonly reactionPopover: _angular_core.Signal<any>;
3953
+ /** Message id whose context menu is open (for active row styling). */
3954
+ readonly contextMenuMessageId: _angular_core.WritableSignal<string>;
3955
+ readonly availableReactions: _angular_core.WritableSignal<string[]>;
3956
+ private get registry();
3957
+ /** Message list element reference */
3958
+ private readonly messageListRef;
3959
+ /** Messages container element reference */
3960
+ private readonly messagesContainerRef;
3961
+ /** Loading state - use service */
3962
+ readonly loading: _angular_core.WritableSignal<boolean>;
3963
+ /** Loading more messages state - use service */
3964
+ readonly loadingMore: _angular_core.WritableSignal<boolean>;
3965
+ /** Show scroll to bottom button - use service */
3966
+ readonly showScrollButton: _angular_core.WritableSignal<boolean>;
3967
+ /** Active conversation */
3968
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
3969
+ /** Messages */
3970
+ readonly messages: _angular_core.Signal<AXMessage[]>;
3971
+ /** Message action event */
3972
+ readonly messageAction: _angular_core.OutputEmitterRef<{
3973
+ message: AXMessage;
3974
+ action: string;
3975
+ }>;
3976
+ /** Current user from service */
3977
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
3978
+ /** Message grouped by date - use service */
3979
+ readonly messageGroups: _angular_core.Signal<{
3980
+ date: string;
3981
+ dateLabel: string;
3982
+ messages: AXMessage[];
3983
+ }[]>;
3984
+ constructor();
3985
+ private intersectionObserver?;
3986
+ /**
3987
+ * Setup intersection observer to mark messages as read when visible
3988
+ */
3989
+ private setupIntersectionObserver;
3990
+ /**
3991
+ * Mark message as read
3992
+ */
3993
+ private markMessageAsRead;
3994
+ /** Get message CSS classes */
3995
+ getMessageClasses(message: AXMessage): string;
3996
+ /** Get bubble CSS classes */
3997
+ getBubbleClasses(message: AXMessage): string;
3998
+ /** Check if message is from current user */
3999
+ isOwnMessage(message: AXMessage): boolean;
4000
+ /** Should show avatar */
4001
+ shouldShowAvatar(message: AXMessage): boolean;
4002
+ /** Should show sender name */
4003
+ shouldShowSenderName(message: AXMessage): boolean;
4004
+ /** Get sender name */
4005
+ getSenderName(message: AXMessage): string;
4006
+ /** Get sender avatar */
4007
+ getSenderAvatar(message: AXMessage): string | undefined;
4008
+ /** Font Awesome icon for sender when no avatar image (participant or conversation icon). */
4009
+ getSenderAvatarIcon(message: AXMessage): string | undefined;
4010
+ /** Get original sender name for forwarded messages */
4011
+ getOriginalSenderName(message: AXMessage): string;
4012
+ /** Get forwarded text with sender and conversation info */
4013
+ getForwardedText(message: AXMessage): string;
4014
+ /** Resolve renderer component for message */
4015
+ getRendererComponent(message: AXMessage): Type<_acorex_components_conversation2.AXMessageRendererComponent>;
4016
+ /** Provide inputs for the dynamic renderer */
4017
+ getRendererInputs(message: AXMessage): {
4018
+ message: AXMessage;
4019
+ };
4020
+ /** Get status icon */
4021
+ getStatusIcon(message: AXMessage): string;
4022
+ /** Get status icon CSS classes */
4023
+ getStatusIconClasses(message: AXMessage): string;
4024
+ /** Get status tooltip text */
4025
+ getStatusTooltip(message: AXMessage): string;
4026
+ /** Get first unread message ID */
4027
+ readonly firstUnreadMessageId: _angular_core.Signal<string>;
4028
+ /** Get grouped reactions */
4029
+ getGroupedReactions(message: AXMessage): Array<{
4030
+ emoji: string;
4031
+ count: number;
4032
+ userIds: string[];
4033
+ hasReacted: boolean;
4034
+ }>;
4035
+ /** Get reaction tooltip text */
4036
+ getReactionTooltip(reaction: {
4037
+ emoji: string;
4038
+ count: number;
4039
+ userIds: string[];
4040
+ hasReacted: boolean;
4041
+ }): string;
4042
+ /** Toggle reaction picker */
4043
+ toggleReactionPicker(messageId: string, event: MouseEvent): void;
4044
+ /** Close reaction picker */
4045
+ closeReactionPicker(): void;
4046
+ /** Check if current user has reacted with specific emoji */
4047
+ hasUserReacted(message: AXMessage, emoji: string): boolean;
4048
+ /** Check if current user has reacted with specific emoji by message ID */
4049
+ hasUserReactedById(messageId: string, emoji: string): boolean;
4050
+ /** Handle reaction click by message ID */
4051
+ onReactionClickById(messageId: string, emoji: string): void;
4052
+ /** Get message by ID */
4053
+ getMessageById(messageId: string): AXMessage | undefined;
4054
+ /** Load available reactions from API */
4055
+ private loadAvailableReactions;
4056
+ /** Get message actions from registry */
4057
+ getMessageActions(message: AXMessage): _acorex_components_conversation2.AXMessageAction[];
4058
+ /** Get initials from name */
4059
+ getInitials(name: string): string;
4060
+ /** Handle reaction click */
4061
+ onReactionClick(message: AXMessage, emoji: string): void;
4062
+ /** Handle message action */
4063
+ onMessageAction(message: AXMessage, action: any): Promise<void>;
4064
+ /** Handle scroll events */
4065
+ onScroll(event: Event): void;
4066
+ /** Handle infinite scroll threshold */
4067
+ onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
4068
+ /** Load older messages - delegate to service */
4069
+ private loadOlderMessages;
4070
+ /** Check if user is near bottom of scroll */
4071
+ private isUserNearBottom;
4072
+ /**
4073
+ * After switching chats, the template may still show loading (no #messagesContainer).
4074
+ * Poll with rAF until the feed exists, then scroll after double rAF so scrollHeight is stable.
4075
+ */
4076
+ private scrollToBottomWhenContainerReady;
4077
+ /** Scroll to bottom */
4078
+ scrollToBottom(smooth?: boolean): void;
4079
+ /** Scroll to specific message */
4080
+ scrollToMessage(messageId: string): void;
4081
+ /** Cleanup timeouts and observers on destroy */
4082
+ ngOnDestroy(): void;
4083
+ /** Get message preview text for reply */
4084
+ getMessagePreviewText(message: AXMessage): {
4085
+ value: string;
4086
+ type: string;
4087
+ icon: string;
4088
+ };
4089
+ /** Get ARIA label for message */
4090
+ getMessageAriaLabel(message: AXMessage): string;
4091
+ /** Get reply count for a message (fetches from API across all conversations) */
4092
+ getReplyCount(message: AXMessage): number;
4093
+ /** Get forward count for a message (fetches from API across all conversations) */
4094
+ getForwardCount(message: AXMessage): number;
4095
+ /**
4096
+ * Refresh count for a specific message from API
4097
+ * This is called when a new reply or forward is detected globally
4098
+ */
4099
+ private refreshCount;
4100
+ /** Handle context menu opening for messages */
4101
+ handleMessageContextMenuOpening(event: AXContextMenuOpeningEvent, message: AXMessage): void;
4102
+ /** Handle context menu item click for messages */
4103
+ handleMessageContextMenuItemClick(event: AXContextMenuItemsClickEvent, message: AXMessage): void;
4008
4104
  /**
4009
- * Validate file size against conversation config
4105
+ * TrackBy function for message groups
4106
+ * Tracks by date only to prevent re-rendering when messages are added
4010
4107
  */
4011
- isFileSizeAllowed(file: File): boolean;
4108
+ trackMessageGroup(index: number, group: {
4109
+ date: string;
4110
+ messages: AXMessage[];
4111
+ }): string;
4012
4112
  /**
4013
- * Validate a set of files using conversation config
4113
+ * TrackBy function for messages
4114
+ * Tracks by ID only to prevent unnecessary re-renders
4014
4115
  */
4015
- validateFilesWithConfig(files: File[]): {
4016
- accepted: File[];
4017
- rejected: {
4018
- file: File;
4019
- reason: string;
4020
- }[];
4021
- };
4022
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFileUploadService, never>;
4023
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXFileUploadService>;
4116
+ trackMessage(index: number, message: AXMessage): string;
4117
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXMessageListComponent, never>;
4118
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXMessageListComponent, "ax-conversation-message-list", never, { "avatarTemplate": { "alias": "avatarTemplate"; "required": false; "isSignal": true; }; }, { "messageAction": "messageAction"; }, never, ["ax-conversation-message-list-empty, [ax-conversation-message-list-empty]", "ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]"], true, never>;
4024
4119
  }
4025
-
4026
- declare class AXForwardMessageDialogComponent implements OnInit {
4027
- /** Toast service for notifications */
4028
- private readonly toastService;
4029
- /** Conversation service (passed via popup data) */
4030
- conversationService: AXConversationService;
4031
- /** Message to forward (passed via popup data) */
4032
- message: AXMessage;
4033
- /** Close event emitter for popup */
4034
- readonly onClosed: EventEmitter<AXComponentCloseEvent>;
4035
- /** Available conversations */
4036
- readonly availableConversations: _angular_core.WritableSignal<AXConversation[]>;
4037
- /** Selected conversation IDs */
4038
- readonly selectedConversationIds: _angular_core.WritableSignal<string[]>;
4039
- /** Can forward message */
4040
- readonly canForward: _angular_core.Signal<boolean>;
4041
- ngOnInit(): Promise<void>;
4042
- /** Handle cancel */
4043
- onCancel(): void;
4044
- /** Handle forward */
4045
- onForward(): Promise<void>;
4046
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXForwardMessageDialogComponent, never>;
4047
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXForwardMessageDialogComponent, "ax-forward-message-dialog", never, {}, {}, never, never, true, never>;
4120
+ interface AXMessageAvatarTemplateContext {
4121
+ $implicit: AXMessage;
4122
+ size: number;
4123
+ senderName: string;
4124
+ senderAvatar?: string;
4125
+ /** Font Awesome class string when there is no `senderAvatar` image. */
4126
+ senderIcon?: string;
4048
4127
  }
4049
4128
 
4050
- declare class AXNewConversationDialogComponent implements OnInit {
4051
- /** Toast service for notifications */
4052
- private readonly toastService;
4053
- /** Conversation service (passed via popup data) */
4054
- conversationService: AXConversationService;
4055
- /** Close event emitter for popup */
4056
- readonly onClosed: EventEmitter<AXComponentCloseEvent>;
4057
- /** Available users */
4058
- readonly availableUsers: _angular_core.WritableSignal<AXParticipant[]>;
4059
- /** Selected user IDs */
4060
- readonly selectedUserIds: _angular_core.WritableSignal<string[]>;
4061
- /** Group title */
4062
- groupTitle: _angular_core.WritableSignal<string>;
4063
- /** Group avatar */
4064
- groupAvatar: _angular_core.WritableSignal<string>;
4065
- /** Is group conversation */
4066
- readonly isGroupConversation: _angular_core.Signal<boolean>;
4067
- /** Can create conversation */
4068
- readonly canCreate: _angular_core.Signal<boolean>;
4069
- ngOnInit(): Promise<void>;
4070
- /** Handle cancel */
4071
- onCancel(): void;
4072
- /** Handle create */
4073
- onCreate(): Promise<void>;
4074
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXNewConversationDialogComponent, never>;
4075
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXNewConversationDialogComponent, "ax-new-conversation-dialog", never, {}, {}, never, never, true, never>;
4129
+ declare class AXMessageListService {
4130
+ private readonly conversationService;
4131
+ private readonly composerService;
4132
+ private readonly config;
4133
+ private get registry();
4134
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation2.AXConversation>;
4135
+ readonly activeMessages: _angular_core.Signal<AXMessage[]>;
4136
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation2.AXParticipant>;
4137
+ /** Loading state */
4138
+ readonly loading: _angular_core.WritableSignal<boolean>;
4139
+ /** Loading more messages state */
4140
+ readonly loadingMore: _angular_core.WritableSignal<boolean>;
4141
+ /** Show scroll to bottom button */
4142
+ readonly showScrollButton: _angular_core.WritableSignal<boolean>;
4143
+ /** Scroll requests counter */
4144
+ readonly scrollRequests: _angular_core.WritableSignal<number>;
4145
+ /** Current page for pagination */
4146
+ private readonly currentPage;
4147
+ /** Has more messages to load */
4148
+ private readonly hasMoreMessages;
4149
+ /** Message grouped by date */
4150
+ readonly messageGroups: _angular_core.Signal<{
4151
+ date: string;
4152
+ dateLabel: string;
4153
+ messages: AXMessage[];
4154
+ }[]>;
4155
+ /**
4156
+ * Load more messages (pagination)
4157
+ */
4158
+ loadMoreMessages(): Promise<void>;
4159
+ /**
4160
+ * Reset pagination (call when conversation changes)
4161
+ */
4162
+ resetPagination(): void;
4163
+ getMenuActions(message: AXMessage): _acorex_components_conversation2.AXMessageAction[];
4164
+ executeAction(message: AXMessage, actionId: string): Promise<void>;
4165
+ reactToMessage(messageId: string, emoji: string): Promise<void>;
4166
+ /** Request message list to scroll to bottom */
4167
+ requestScrollToBottom(): void;
4168
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXMessageListService, never>;
4169
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXMessageListService>;
4076
4170
  }
4077
4171
 
4078
4172
  declare class AXSidebarService {
4079
4173
  private readonly conversationService;
4080
- private readonly popupService;
4081
4174
  private readonly config;
4082
4175
  private get registry();
4083
4176
  readonly searchQuery: _angular_core.WritableSignal<string>;
@@ -4098,7 +4191,6 @@ declare class AXSidebarService {
4098
4191
  setActiveTab(tabId: string): void;
4099
4192
  selectConversation(conversation: AXConversation): void;
4100
4193
  getBadgeValue(tabId: string): string | undefined;
4101
- openNewConversationDialog(): Promise<AXConversation | null>;
4102
4194
  /**
4103
4195
  * Load more conversations (pagination)
4104
4196
  */
@@ -4117,7 +4209,9 @@ declare class AXSidebarService {
4117
4209
 
4118
4210
  declare class AXSidebarComponent implements OnDestroy {
4119
4211
  readonly sidebar: AXSidebarService;
4120
- protected readonly config: _acorex_components_conversation2.AXConversationConfig;
4212
+ protected readonly config: Required<_acorex_components_conversation2.AXConversationConfig>;
4213
+ private readonly conversationService;
4214
+ private readonly popupService;
4121
4215
  /** Conversation selected event */
4122
4216
  readonly conversationSelected: _angular_core.OutputEmitterRef<AXConversation>;
4123
4217
  /** Search debouncing */
@@ -4140,14 +4234,55 @@ declare class AXSidebarComponent implements OnDestroy {
4140
4234
  selectConversation(conversation: AXConversation): void;
4141
4235
  /** Get badge value for tab */
4142
4236
  getBadgeValue(tabId: string): string | undefined;
4143
- /** Open new conversation dialog */
4144
- onNewConversation(): Promise<void>;
4237
+ openNewConversationPopup(): Promise<void>;
4145
4238
  /** Handle infinite scroll threshold - delegate to service */
4146
4239
  onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
4147
4240
  /** Cleanup on destroy */
4148
4241
  ngOnDestroy(): void;
4149
4242
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSidebarComponent, never>;
4150
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSidebarComponent, "ax-conversation-sidebar", never, {}, { "conversationSelected": "conversationSelected"; }, never, never, true, never>;
4243
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSidebarComponent, "ax-conversation-sidebar", never, {}, { "conversationSelected": "conversationSelected"; }, never, ["ax-suffix"], true, never>;
4244
+ }
4245
+
4246
+ type NewConversationWizardStep = 'selectUsers' | 'groupDetails';
4247
+ declare class AXNewConversationDialogComponent extends AXBasePageComponent {
4248
+ conversationService: AXConversationService;
4249
+ private readonly toastService;
4250
+ /**
4251
+ * Injected by {@link AXPopupComponent} when this dialog is opened via {@link AXPopupService}.
4252
+ * Required for `setTitle` / dynamic header — {@link AXBasePageComponent#setTitle} is otherwise unset.
4253
+ */
4254
+ readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
4255
+ readonly availableUsers: _angular_core.WritableSignal<AXParticipant[]>;
4256
+ readonly selectedUserIds: _angular_core.WritableSignal<string[]>;
4257
+ readonly groupTitle: _angular_core.WritableSignal<string>;
4258
+ readonly groupAvatar: _angular_core.WritableSignal<string>;
4259
+ readonly searchQuery: _angular_core.WritableSignal<string>;
4260
+ /** For 2+ users: step 1 = pick users, step 2 = title + avatar. */
4261
+ readonly wizardStep: _angular_core.WritableSignal<NewConversationWizardStep>;
4262
+ readonly showUserPickerStep: _angular_core.Signal<boolean>;
4263
+ readonly showGroupDetailsStep: _angular_core.Signal<boolean>;
4264
+ readonly showNextButton: _angular_core.Signal<boolean>;
4265
+ readonly showGroupBackButton: _angular_core.Signal<boolean>;
4266
+ readonly showCreateButton: _angular_core.Signal<boolean>;
4267
+ readonly canGoNextToGroupDetails: _angular_core.Signal<boolean>;
4268
+ readonly canCreate: _angular_core.Signal<boolean>;
4269
+ private readonly _resetWizardWhenSingleEffect;
4270
+ private readonly _syncPopupTitleEffect;
4271
+ readonly usersListEmptyTpl: _angular_core.Signal<TemplateRef<unknown>>;
4272
+ readonly usersList: _angular_core.Signal<AXListComponent>;
4273
+ readonly usersListDataSource: AXDataSource<unknown>;
4274
+ onCancel(): void;
4275
+ onSelectedUsersChange(ids: string[]): void;
4276
+ onNextToGroupDetails(): void;
4277
+ onBackFromGroupDetails(): void;
4278
+ onSearchChange(value: string): void;
4279
+ isUserSelected(id: string): boolean;
4280
+ userFromItem(item: unknown): AXParticipant | null;
4281
+ getInitials(name: string): string;
4282
+ private filteredUsers;
4283
+ onCreateConversation(): Promise<void>;
4284
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXNewConversationDialogComponent, never>;
4285
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXNewConversationDialogComponent, "ax-new-conversation-dialog", never, { "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4151
4286
  }
4152
4287
 
4153
4288
  declare class AXInfiniteScrollDirective {
@@ -4205,12 +4340,6 @@ interface AXConversationConfig {
4205
4340
  maxSidebarWidth?: number;
4206
4341
  /** Default sidebar width in pixels */
4207
4342
  defaultSidebarWidth?: number;
4208
- /** Virtual scroll item size in pixels */
4209
- virtualScrollItemSize?: number;
4210
- /** Virtual scroll minimum buffer in pixels */
4211
- virtualScrollMinBuffer?: number;
4212
- /** Virtual scroll maximum buffer in pixels */
4213
- virtualScrollMaxBuffer?: number;
4214
4343
  /** Filter cache size */
4215
4344
  filterCacheSize?: number;
4216
4345
  /** Maximum file size in bytes */
@@ -4223,6 +4352,12 @@ interface AXConversationConfig {
4223
4352
  minMessageLength?: number;
4224
4353
  /** Threshold for marking messages as read (0.0 to 1.0, default: 0.3) */
4225
4354
  messageReadThreshold?: number;
4355
+ /**
4356
+ * CSS `background` for the message list (`ax-conversation-message-list` area, all states: loading, empty, messages).
4357
+ * Use full shorthand, or a bare `https://...` / `/path/to.png` (wrapped as `url(...)` with `center/cover`).
4358
+ * Empty string = library default soft gradient. `transparent` or `none` = flat background.
4359
+ */
4360
+ messageListBackground?: string;
4226
4361
  }
4227
4362
 
4228
4363
  /**
@@ -4252,7 +4387,7 @@ declare function mergeWithDefaults(userConfig?: Partial<AXConversationConfig>):
4252
4387
  * Configuration token for conversation component
4253
4388
  * Uses centralized defaults from AX_DEFAULT_CONVERSATION_CONFIG
4254
4389
  */
4255
- declare const CONVERSATION_CONFIG: InjectionToken<AXConversationConfig>;
4390
+ declare const CONVERSATION_CONFIG: InjectionToken<Required<AXConversationConfig>>;
4256
4391
  /**
4257
4392
  * Token for configuring AXErrorHandlerService
4258
4393
  */
@@ -4266,7 +4401,7 @@ declare const ERROR_HANDLER_CONFIG: InjectionToken<Partial<AXErrorHandlerConfig>
4266
4401
  /**
4267
4402
  * Additional message renderers configuration
4268
4403
  * Provide this token to add custom message renderers in addition to built-in ones
4269
- * Note: Built-in renderers (text, image, video, audio, voice, file, location, sticker, contact, system, fallback) are automatically registered
4404
+ * Note: Built-in renderers (text, system, fallback) are registered by default; other types are provided via plugins/constants.
4270
4405
  */
4271
4406
  declare const DEFAULT_MESSAGE_RENDERERS: InjectionToken<AXMessageRenderer[]>;
4272
4407
  /**
@@ -4303,7 +4438,10 @@ declare const DEFAULT_CONVERSATION_ITEM_ACTIONS: InjectionToken<AXConversationIt
4303
4438
  * Registry configuration interface
4304
4439
  */
4305
4440
  interface AXRegistryConfiguration {
4306
- /** Additional message renderers to register (built-in renderers are automatic) */
4441
+ /**
4442
+ * Additional message renderers to register (built-in renderers are automatic).
4443
+ * Each {@link AXMessageRenderer} may include optional `composerActions` for co-located send UX.
4444
+ */
4307
4445
  messageRenderers?: AXMessageRenderer[];
4308
4446
  /** Message actions to register by default */
4309
4447
  messageActions?: AXMessageAction[];
@@ -4324,7 +4462,116 @@ interface AXRegistryConfiguration {
4324
4462
  */
4325
4463
  declare const REGISTRY_CONFIG: InjectionToken<AXRegistryConfiguration>;
4326
4464
 
4327
- declare class AXIndexedDBUserApi extends AXUserApi {
4465
+ /**
4466
+ * IndexedDB Storage Wrapper
4467
+ * Provides persistent storage for conversation data
4468
+ */
4469
+
4470
+ declare const AXConversationIndexedDbStores: {
4471
+ readonly PARTICIPANTS: "participants";
4472
+ readonly CONVERSATIONS: "conversations";
4473
+ readonly MESSAGES: "messages";
4474
+ readonly SETTINGS: "settings";
4475
+ };
4476
+ declare class AXConversationIndexedDbStorage {
4477
+ private db;
4478
+ private initPromise;
4479
+ /**
4480
+ * Initialize IndexedDB
4481
+ */
4482
+ init(): Promise<void>;
4483
+ /**
4484
+ * Get a value from a store
4485
+ */
4486
+ get<T>(storeName: string, key: string): Promise<T | undefined>;
4487
+ /**
4488
+ * Get all values from a store
4489
+ */
4490
+ getAll<T>(storeName: string): Promise<T[]>;
4491
+ /**
4492
+ * Get values by index
4493
+ */
4494
+ getAllByIndex<T>(storeName: string, indexName: string, query: IDBValidKey): Promise<T[]>;
4495
+ /**
4496
+ * Put a value into a store
4497
+ */
4498
+ put<T>(storeName: string, value: T): Promise<void>;
4499
+ /**
4500
+ * Delete a value from a store
4501
+ */
4502
+ delete(storeName: string, key: string): Promise<void>;
4503
+ /**
4504
+ * Clear all data from a store
4505
+ */
4506
+ clear(storeName: string): Promise<void>;
4507
+ getParticipant(id: string): Promise<AXParticipant | undefined>;
4508
+ getAllParticipants(): Promise<AXParticipant[]>;
4509
+ putParticipant(participant: AXParticipant): Promise<void>;
4510
+ getConversation(id: string): Promise<AXConversation | undefined>;
4511
+ getAllConversations(): Promise<AXConversation[]>;
4512
+ putConversation(conversation: AXConversation): Promise<void>;
4513
+ deleteConversation(id: string): Promise<void>;
4514
+ getMessage(id: string): Promise<AXMessage | undefined>;
4515
+ getAllMessages(): Promise<AXMessage[]>;
4516
+ getMessagesByConversation(conversationId: string): Promise<AXMessage[]>;
4517
+ putMessage(message: AXMessage): Promise<void>;
4518
+ deleteMessage(id: string): Promise<void>;
4519
+ getSetting(key: string): Promise<unknown>;
4520
+ putSetting(key: string, value: unknown): Promise<void>;
4521
+ }
4522
+ declare const axConversationIndexedDbStorage: AXConversationIndexedDbStorage;
4523
+
4524
+ /**
4525
+ * Shared In-Memory Storage
4526
+ * Internal storage shared between all IndexedDB API implementations
4527
+ * This is NOT a service - just a shared data structure
4528
+ */
4529
+
4530
+ declare class AXConversationSharedStorage {
4531
+ readonly connectionStatus$: BehaviorSubject<AXConnectionStatus>;
4532
+ readonly participants: Map<string, AXParticipant>;
4533
+ readonly conversations: Map<string, AXConversation>;
4534
+ readonly messages: Map<string, AXMessage>;
4535
+ readonly messagesByConversation: Map<string, string[]>;
4536
+ readonly messageStream$: Subject<AXMessage>;
4537
+ readonly messageUpdates$: Subject<AXMessage>;
4538
+ readonly messageDeletions$: Subject<string>;
4539
+ readonly typingIndicators$: Subject<AXTypingIndicator>;
4540
+ readonly presenceUpdates$: Subject<AXPresenceUpdate>;
4541
+ readonly conversationUpdates$: Subject<AXConversation>;
4542
+ readonly currentUserId = "current-user";
4543
+ private isSeeded;
4544
+ private presenceInterval?;
4545
+ private messageSimulationInterval?;
4546
+ private isLoadedFromDB;
4547
+ /**
4548
+ * Load data from IndexedDB
4549
+ */
4550
+ loadFromIndexedDB(): Promise<void>;
4551
+ /**
4552
+ * Seed initial data if not already seeded
4553
+ */
4554
+ seedIfEmpty(): Promise<void>;
4555
+ /**
4556
+ * Simulate user presence changes (online/offline/away)
4557
+ */
4558
+ private startPresenceSimulation;
4559
+ /**
4560
+ * Simulate random messages from users
4561
+ */
4562
+ private startMessageSimulation;
4563
+ /**
4564
+ * Stop presence simulation
4565
+ */
4566
+ stopPresenceSimulation(): void;
4567
+ /**
4568
+ * Stop message simulation
4569
+ */
4570
+ stopMessageSimulation(): void;
4571
+ }
4572
+ declare const conversationSharedStorage: AXConversationSharedStorage;
4573
+
4574
+ declare class AXConversationIndexedDbUserApi extends AXUserApi {
4328
4575
  getCurrentUser(): Promise<AXParticipant>;
4329
4576
  updateProfile(updates: AXUserProfileUpdate): Promise<AXParticipant>;
4330
4577
  uploadAvatar(file: File): Promise<string>;
@@ -4338,13 +4585,13 @@ declare class AXIndexedDBUserApi extends AXUserApi {
4338
4585
  unblockUser(_userId: string): Promise<void>;
4339
4586
  getBlockedUsers(): Promise<string[]>;
4340
4587
  reportUser(_userId: string, _reason: AXBlockReportReason): Promise<void>;
4341
- getUserSettings(): Promise<Record<string, any>>;
4342
- updateUserSettings(_settings: Record<string, any>): Promise<void>;
4343
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXIndexedDBUserApi, never>;
4344
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXIndexedDBUserApi>;
4588
+ getUserSettings(): Promise<Record<string, unknown>>;
4589
+ updateUserSettings(_settings: Record<string, unknown>): Promise<void>;
4590
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbUserApi, never>;
4591
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbUserApi>;
4345
4592
  }
4346
4593
 
4347
- declare class AXIndexedDBConversationApi extends AXConversationApi {
4594
+ declare class AXConversationIndexedDbConversationApi extends AXConversationApi {
4348
4595
  createConversation(data: AXConversationCreateData): Promise<AXConversation>;
4349
4596
  getConversation(conversationId: string): Promise<AXConversation>;
4350
4597
  getConversations(pagination: AXPagination, _filters?: AXConversationFilters): Promise<AXPaginatedResult<AXConversation>>;
@@ -4368,7 +4615,7 @@ declare class AXIndexedDBConversationApi extends AXConversationApi {
4368
4615
  muteConversation(_conversationId: string, _duration?: number): Promise<void>;
4369
4616
  unmuteConversation(_conversationId: string): Promise<void>;
4370
4617
  uploadConversationAvatar(_conversationId: string, file: File): Promise<string>;
4371
- getConversationMedia(_conversationId: string, _pagination?: AXPagination): Promise<AXPaginatedResult<any>>;
4618
+ getConversationMedia(_conversationId: string, _pagination?: AXPagination): Promise<AXPaginatedResult<unknown>>;
4372
4619
  addConversationTags(_conversationId: string, _tags: string[]): Promise<void>;
4373
4620
  removeConversationTags(_conversationId: string, _tags: string[]): Promise<void>;
4374
4621
  getConversationTags(_conversationId: string): Promise<string[]>;
@@ -4377,11 +4624,11 @@ declare class AXIndexedDBConversationApi extends AXConversationApi {
4377
4624
  saveDraft(_conversationId: string, _draft: string): Promise<void>;
4378
4625
  getDraft(_conversationId: string): Promise<string | null>;
4379
4626
  clearDraft(_conversationId: string): Promise<void>;
4380
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXIndexedDBConversationApi, never>;
4381
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXIndexedDBConversationApi>;
4627
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbConversationApi, never>;
4628
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbConversationApi>;
4382
4629
  }
4383
4630
 
4384
- declare class AXIndexedDBMessageApi extends AXMessageApi {
4631
+ declare class AXConversationIndexedDbMessageApi extends AXMessageApi {
4385
4632
  sendMessage(command: AXSendMessageCommand): Promise<AXMessage>;
4386
4633
  getMessage(messageId: string): Promise<AXMessage>;
4387
4634
  getMessages(conversationId: string, pagination: AXPagination): Promise<AXPaginatedResult<AXMessage>>;
@@ -4410,10 +4657,10 @@ declare class AXIndexedDBMessageApi extends AXMessageApi {
4410
4657
  thumbnailUrl?: string;
4411
4658
  size: number;
4412
4659
  mimeType: string;
4413
- metadata?: Record<string, any>;
4660
+ metadata?: Record<string, unknown>;
4414
4661
  }>;
4415
- updateMessageMetadata(_messageId: string, _metadata: Record<string, any>): Promise<void>;
4416
- getMessageMetadata(_messageId: string): Promise<Record<string, any>>;
4662
+ updateMessageMetadata(_messageId: string, _metadata: Record<string, unknown>): Promise<void>;
4663
+ getMessageMetadata(_messageId: string): Promise<Record<string, unknown>>;
4417
4664
  updateMessageStatus(_messageId: string, _status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed'): Promise<void>;
4418
4665
  getMessageDeliveryStatus(_messageId: string): Promise<{
4419
4666
  delivered: number;
@@ -4423,11 +4670,11 @@ declare class AXIndexedDBMessageApi extends AXMessageApi {
4423
4670
  markMessagesAsRead(_messageIds: string[]): Promise<void>;
4424
4671
  bulkDeleteMessages(_conversationId: string, _messageIds: string[], _forEveryone?: boolean): Promise<void>;
4425
4672
  exportMessages(_conversationId: string, _format: 'json' | 'csv' | 'txt'): Promise<string | Blob>;
4426
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXIndexedDBMessageApi, never>;
4427
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXIndexedDBMessageApi>;
4673
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbMessageApi, never>;
4674
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbMessageApi>;
4428
4675
  }
4429
4676
 
4430
- declare class AXIndexedDBRealtimeApi extends AXRealtimeApi {
4677
+ declare class AXConversationIndexedDbRealtimeApi extends AXRealtimeApi {
4431
4678
  readonly connectionStatus$: Observable<AXConnectionStatus>;
4432
4679
  connect(_options?: AXConnectionOptions): Promise<void>;
4433
4680
  disconnect(): Promise<void>;
@@ -4471,14 +4718,14 @@ declare class AXIndexedDBRealtimeApi extends AXRealtimeApi {
4471
4718
  }>;
4472
4719
  subscribeToConversationSettingsChanges(_conversationId?: string): Observable<{
4473
4720
  conversationId: string;
4474
- settings: Record<string, any>;
4721
+ settings: Record<string, unknown>;
4475
4722
  }>;
4476
4723
  subscribeToDraftChanges(_conversationId?: string): Observable<{
4477
4724
  conversationId: string;
4478
4725
  draft: string | null;
4479
4726
  }>;
4480
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXIndexedDBRealtimeApi, never>;
4481
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXIndexedDBRealtimeApi>;
4727
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbRealtimeApi, never>;
4728
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbRealtimeApi>;
4482
4729
  }
4483
4730
 
4484
4731
  /**
@@ -4488,10 +4735,10 @@ declare class AXIndexedDBRealtimeApi extends AXRealtimeApi {
4488
4735
  * @security API key should be provided via injection token in production
4489
4736
  * @example
4490
4737
  * ```typescript
4491
- * export const AI_API_KEY = new InjectionToken<string>('AI_API_KEY');
4738
+ * export const AXConversationAiApiKey = new InjectionToken<string>('AXConversationAiApiKey');
4492
4739
  *
4493
4740
  * providers: [
4494
- * { provide: AI_API_KEY, useValue: environment.geminiApiKey }
4741
+ * { provide: AXConversationAiApiKey, useValue: environment.geminiApiKey }
4495
4742
  * ]
4496
4743
  * ```
4497
4744
  */
@@ -4500,11 +4747,11 @@ declare class AXIndexedDBRealtimeApi extends AXRealtimeApi {
4500
4747
  * Injection token for AI API key
4501
4748
  * Provide this in your app config to avoid hardcoding the API key
4502
4749
  */
4503
- declare const AI_API_KEY: InjectionToken<string>;
4750
+ declare const AXConversationAiApiKey: InjectionToken<string>;
4504
4751
  /**
4505
4752
  * Configuration for AI Responder
4506
4753
  */
4507
- interface AXAIResponderConfig {
4754
+ interface AXConversationAiResponderConfig {
4508
4755
  /** Maximum retry attempts for failed requests */
4509
4756
  maxRetries?: number;
4510
4757
  /** Timeout for API requests in milliseconds */
@@ -4512,7 +4759,7 @@ interface AXAIResponderConfig {
4512
4759
  /** Enable fallback to random replies on error */
4513
4760
  useFallbackReplies?: boolean;
4514
4761
  }
4515
- declare class AXAIResponderService {
4762
+ declare class AXConversationAiResponderService {
4516
4763
  private readonly injectedApiKey;
4517
4764
  private readonly config;
4518
4765
  /**
@@ -4547,12 +4794,12 @@ declare class AXAIResponderService {
4547
4794
  /**
4548
4795
  * Update configuration
4549
4796
  */
4550
- configure(config: Partial<AXAIResponderConfig>): void;
4551
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXAIResponderService, never>;
4552
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXAIResponderService>;
4797
+ configure(config: Partial<AXConversationAiResponderConfig>): void;
4798
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAiResponderService, never>;
4799
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationAiResponderService>;
4553
4800
  }
4554
4801
 
4555
- declare class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4802
+ declare class AXConversationIndexedDbMessageAiApi extends AXConversationIndexedDbMessageApi {
4556
4803
  private readonly aiResponder;
4557
4804
  private readonly AI_TYPING_INDICATOR_DELAY;
4558
4805
  private readonly AI_RESPONSE_DELAY;
@@ -4584,8 +4831,8 @@ declare class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
4584
4831
  * Delay helper
4585
4832
  */
4586
4833
  private delay;
4587
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXIndexedDBMessageAIApi, never>;
4588
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXIndexedDBMessageAIApi>;
4834
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbMessageAiApi, never>;
4835
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbMessageAiApi>;
4589
4836
  }
4590
4837
 
4591
4838
  interface AudioFile {
@@ -4621,31 +4868,6 @@ declare class AXAudioPickerComponent {
4621
4868
  declare const AX_CONVERSATION_COMPOSER_EMOJI_TAB: AXComposerTab;
4622
4869
  declare const AX_CONVERSATION_COMPOSER_STICKER_TAB: AXComposerTab;
4623
4870
 
4624
- declare class AXContactPickerComponent {
4625
- private readonly composerService;
4626
- private readonly conversationService;
4627
- readonly conversation: _angular_core.InputSignal<AXConversation>;
4628
- readonly onClose: _angular_core.OutputEmitterRef<void>;
4629
- contactName: string;
4630
- contactPhone: string;
4631
- contactEmail: string;
4632
- readonly searchQuery: _angular_core.WritableSignal<string>;
4633
- readonly selectedContact: _angular_core.WritableSignal<AXContactPayload>;
4634
- readonly allContacts: _angular_core.WritableSignal<AXContactPayload[]>;
4635
- readonly filteredContacts: _angular_core.Signal<AXContactPayload[]>;
4636
- readonly canSend: _angular_core.Signal<string | boolean>;
4637
- selectContact(contact: AXContactPayload): void;
4638
- sendContact(): Promise<void>;
4639
- cancel(): void;
4640
- getInitials(name: string): string;
4641
- /** Check if Contact Picker API is supported */
4642
- isContactPickerSupported(): boolean;
4643
- /** Open device contacts using Contact Picker API */
4644
- openDeviceContacts(): Promise<void>;
4645
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXContactPickerComponent, never>;
4646
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXContactPickerComponent, "ax-conversation-contact-picker", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; }, { "onClose": "onClose"; }, never, never, true, never>;
4647
- }
4648
-
4649
4871
  interface Emoji {
4650
4872
  char: string;
4651
4873
  name: string;
@@ -4672,8 +4894,9 @@ declare class AXEmojiTabComponent {
4672
4894
  selectCategory(categoryId: string): void;
4673
4895
  /** Get category CSS classes */
4674
4896
  getCategoryClasses(categoryId: string): string;
4675
- /** Handle search change */
4676
- onSearchChange(event: any): void;
4897
+ onSearchChange(event: {
4898
+ value?: string;
4899
+ }): void;
4677
4900
  /** Select emoji */
4678
4901
  selectEmoji(emoji: string): void;
4679
4902
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXEmojiTabComponent, never>;
@@ -4694,10 +4917,9 @@ declare class AXFilePickerComponent {
4694
4917
  private readonly conversationService;
4695
4918
  private readonly fileUploadService;
4696
4919
  private readonly messageApi;
4920
+ private readonly composerService;
4697
4921
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4698
- readonly service: _angular_core.InputSignal<AXComposerService>;
4699
4922
  readonly fileInput: _angular_core.Signal<ElementRef<HTMLInputElement>>;
4700
- private get composerService();
4701
4923
  readonly files: _angular_core.WritableSignal<AttachedFile[]>;
4702
4924
  readonly isDragging: _angular_core.WritableSignal<boolean>;
4703
4925
  readonly isUploading: _angular_core.WritableSignal<boolean>;
@@ -4718,7 +4940,7 @@ declare class AXFilePickerComponent {
4718
4940
  canSend(): boolean;
4719
4941
  getSendButtonText(): string;
4720
4942
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFilePickerComponent, never>;
4721
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFilePickerComponent, "ax-conversation-file-picker", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "service": { "alias": "service"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4943
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFilePickerComponent, "ax-conversation-file-picker", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
4722
4944
  }
4723
4945
 
4724
4946
  interface ImageFile {
@@ -4753,13 +4975,12 @@ declare class AXLocationPickerComponent {
4753
4975
  private readonly composerService;
4754
4976
  private readonly conversationService;
4755
4977
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4756
- readonly onClose: _angular_core.OutputEmitterRef<void>;
4757
4978
  readonly currentLocation: _angular_core.WritableSignal<AXLocationPayload>;
4758
4979
  onMarkerAdded(event: AXMapMarker): void;
4759
4980
  sendLocation(): Promise<void>;
4760
4981
  cancel(): void;
4761
4982
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXLocationPickerComponent, never>;
4762
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXLocationPickerComponent, "ax-conversation-location-picker", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; }, { "onClose": "onClose"; }, never, never, true, never>;
4983
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXLocationPickerComponent, "ax-conversation-location-picker", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
4763
4984
  }
4764
4985
 
4765
4986
  declare class AXPickerFooterComponent {
@@ -4778,6 +4999,7 @@ declare class AXPickerHeaderComponent {
4778
4999
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPickerHeaderComponent, "ax-picker-header", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; }, { "onClose": "onClose"; }, never, never, true, never>;
4779
5000
  }
4780
5001
 
5002
+ declare const AX_STICKER_API_KEY: InjectionToken<string>;
4781
5003
  interface StickerCategory {
4782
5004
  id: string;
4783
5005
  name: string;
@@ -4786,35 +5008,27 @@ interface StickerCategory {
4786
5008
  }
4787
5009
  declare class AXStickerTabComponent {
4788
5010
  private readonly http;
4789
- /** Sticker selected event */
5011
+ private readonly destroyRef;
5012
+ private readonly apiKey;
4790
5013
  readonly itemSelected: _angular_core.OutputEmitterRef<AXStickerPayload>;
4791
- /** Search query */
4792
5014
  readonly searchQuery: _angular_core.WritableSignal<string>;
4793
- /** Active category ID */
4794
- private readonly activeCategoryId;
4795
- /** Sticker categories */
4796
- readonly stickerCategories: StickerCategory[];
4797
- /** Active stickers */
4798
5015
  readonly activeStickers: _angular_core.WritableSignal<AXStickerPayload[]>;
4799
- /** Loading state */
4800
5016
  readonly loading: _angular_core.WritableSignal<boolean>;
4801
- /** Skeleton items array */
5017
+ readonly stickerCategories: StickerCategory[];
4802
5018
  readonly skeletonItems: number[];
4803
- private readonly GIPHY_API_KEY;
4804
- /** Search debounce timeout */
5019
+ private readonly activeCategoryId;
4805
5020
  private searchTimeout?;
4806
5021
  constructor();
4807
- /** Load stickers from Giphy API */
4808
5022
  private loadStickers;
4809
5023
  /** Select category */
4810
5024
  selectPack(categoryId: string): void;
4811
- /** Search stickers using Giphy API */
4812
5025
  private searchStickers;
4813
- /** Handle search change with debouncing */
4814
- onSearchChange(event: any): void;
5026
+ onSearchChange(event: {
5027
+ value?: string;
5028
+ }): void;
4815
5029
  /** Get category CSS classes */
4816
5030
  getPackClasses(categoryId: string): string;
4817
- /** Select sticker */
5031
+ private mapGiphyStickers;
4818
5032
  selectSticker(sticker: AXStickerPayload): void;
4819
5033
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXStickerTabComponent, never>;
4820
5034
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXStickerTabComponent, "ax-sticker-tab", never, {}, { "itemSelected": "itemSelected"; }, never, never, true, never>;
@@ -4851,36 +5065,27 @@ declare class AXVideoPickerComponent {
4851
5065
  }
4852
5066
 
4853
5067
  declare class AXVoiceRecorderComponent {
5068
+ private readonly platformId;
5069
+ private readonly destroyRef;
4854
5070
  private readonly composerService;
4855
5071
  private readonly conversationService;
4856
5072
  private readonly messageApi;
4857
- /** Conversation context */
4858
5073
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4859
- /** Service reference */
4860
- readonly service: _angular_core.InputSignal<AXComposerService>;
4861
- /** Recording completed event */
4862
5074
  readonly recordingComplete: _angular_core.OutputEmitterRef<Blob>;
4863
- /** Recording cancelled event */
4864
5075
  readonly recordingCancelled: _angular_core.OutputEmitterRef<void>;
4865
- /** Recording state */
4866
5076
  readonly isRecording: _angular_core.WritableSignal<boolean>;
4867
- /** Recording start time */
4868
- private recordingStartTime;
4869
- /** Recording duration in seconds */
4870
5077
  readonly recordingDuration: _angular_core.WritableSignal<number>;
4871
- /** Timer interval */
5078
+ private recordingStartTime;
4872
5079
  private timerInterval?;
4873
- /** Media recorder instance */
4874
5080
  private mediaRecorder?;
4875
- /** Recorded audio chunks */
4876
5081
  private audioChunks;
4877
- /** Formatted time display */
5082
+ private activeStream?;
5083
+ private cancelled;
4878
5084
  readonly formattedTime: _angular_core.Signal<string>;
4879
- /** Start recording */
5085
+ constructor();
4880
5086
  startRecording(): Promise<void>;
4881
5087
  /** Stop recording and send */
4882
5088
  stopRecording(): void;
4883
- /** Cancel recording */
4884
5089
  cancelRecording(): void;
4885
5090
  /** Close the voice recorder */
4886
5091
  cancel(): void;
@@ -4888,8 +5093,9 @@ declare class AXVoiceRecorderComponent {
4888
5093
  private clearTimer;
4889
5094
  /** Send voice message */
4890
5095
  private sendVoiceMessage;
5096
+ private stopAndCleanup;
4891
5097
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVoiceRecorderComponent, never>;
4892
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVoiceRecorderComponent, "ax-conversation-voice-recorder", never, { "conversation": { "alias": "conversation"; "required": false; "isSignal": true; }; "service": { "alias": "service"; "required": false; "isSignal": true; }; }, { "recordingComplete": "recordingComplete"; "recordingCancelled": "recordingCancelled"; }, never, never, true, never>;
5098
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVoiceRecorderComponent, "ax-conversation-voice-recorder", never, { "conversation": { "alias": "conversation"; "required": false; "isSignal": true; }; }, { "recordingComplete": "recordingComplete"; "recordingCancelled": "recordingCancelled"; }, never, never, true, never>;
4893
5099
  }
4894
5100
 
4895
5101
  /**
@@ -4903,8 +5109,7 @@ declare class AXVoiceRecorderComponent {
4903
5109
  * - 40: Image (media)
4904
5110
  * - 50: Video (media)
4905
5111
  * - 60: Audio (media)
4906
- * - 70: Contact (special)
4907
- * - 80: Location (special)
5112
+ * - 70: Location (special)
4908
5113
  */
4909
5114
 
4910
5115
  /**
@@ -4931,10 +5136,6 @@ declare const AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION: AXComposerAction;
4931
5136
  * Audio file picker action
4932
5137
  */
4933
5138
  declare const AX_CONVERSATION_COMPOSER_AUDIO_ACTION: AXComposerAction;
4934
- /**
4935
- * Contact picker action
4936
- */
4937
- declare const AX_CONVERSATION_COMPOSER_CONTACT_ACTION: AXComposerAction;
4938
5139
  /**
4939
5140
  * Location picker action
4940
5141
  */
@@ -4958,6 +5159,11 @@ declare class AXConversationInfoPanelComponent extends AXClosableComponent imple
4958
5159
  activeTab: string;
4959
5160
  editTitle: string;
4960
5161
  editAvatar: string;
5162
+ readonly backgroundPresets: Array<{
5163
+ id: string;
5164
+ label: string;
5165
+ value: string;
5166
+ }>;
4961
5167
  /** Get filtered members based on search */
4962
5168
  get filteredMembers(): _acorex_components_conversation2.AXParticipant[];
4963
5169
  /** Handle tab change */
@@ -4989,12 +5195,17 @@ declare class AXConversationInfoPanelComponent extends AXClosableComponent imple
4989
5195
  canSaveEdit(): boolean;
4990
5196
  /** Save edit */
4991
5197
  saveEdit(): Promise<void>;
5198
+ currentBackground(): string;
5199
+ isBackgroundSelected(value: string): boolean;
5200
+ applyMessageListBackground(value: string): Promise<void>;
4992
5201
  ngOnDestroy(): void;
4993
5202
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationInfoPanelComponent, never>;
4994
5203
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationInfoPanelComponent, "ax-conversation-info-panel", never, {}, { "onClosed": "onClosed"; }, never, never, true, never>;
4995
5204
  }
4996
5205
 
4997
5206
  declare class AXInfoBarSearchComponent {
5207
+ private readonly platformId;
5208
+ private readonly destroyRef;
4998
5209
  private readonly infoBarService;
4999
5210
  private readonly conversationService;
5000
5211
  /** Conversation input */
@@ -5009,6 +5220,7 @@ declare class AXInfoBarSearchComponent {
5009
5220
  readonly currentIndex: _angular_core.Signal<number>;
5010
5221
  /** Messages from conversation */
5011
5222
  readonly messages: _angular_core.Signal<_acorex_components_conversation2.AXMessage[]>;
5223
+ private scrollTimer?;
5012
5224
  constructor();
5013
5225
  /** Handle search input change */
5014
5226
  onSearchChange(value: string): void;
@@ -5020,7 +5232,6 @@ declare class AXInfoBarSearchComponent {
5020
5232
  onPrevious(): void;
5021
5233
  /** Scroll to current search result */
5022
5234
  private scrollToCurrentResult;
5023
- /** Scroll to a specific message */
5024
5235
  private scrollToResult;
5025
5236
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXInfoBarSearchComponent, never>;
5026
5237
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXInfoBarSearchComponent, "ax-info-bar-search", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "service": { "alias": "service"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -5062,155 +5273,158 @@ declare const AX_CONVERSATION_INFO_BAR_DELETE_ACTION: AXInfoBarAction;
5062
5273
  */
5063
5274
  declare const AX_CONVERSATION_INFO_BAR_BLOCK_ACTION: AXInfoBarAction;
5064
5275
 
5065
- declare class AXAudioRendererComponent {
5066
- private readonly platformId;
5067
- /** Message to render */
5276
+ /**
5277
+ * Shared UI for message bubble bodies: sending / failed (with retry) and content load errors,
5278
+ * driven by {@link AXMessageRendererState}.
5279
+ */
5280
+ declare class AXConversationMessageRendererStateComponent {
5281
+ private readonly conversation;
5282
+ readonly rendererState: _angular_core.InputSignal<AXMessageRendererState>;
5068
5283
  readonly message: _angular_core.InputSignal<AXMessage>;
5069
- /** Audio element reference */
5284
+ /** Overrides default text when {@link AXMessageRendererState.contentState} is `error`. */
5285
+ readonly contentErrorLabel: _angular_core.InputSignal<string>;
5286
+ /** Overrides default text when delivery failed. */
5287
+ readonly deliveryFailedLabel: _angular_core.InputSignal<string>;
5288
+ /** Set false when the renderer shows content errors inline (e.g. inline media error state). */
5289
+ readonly showContentErrorChrome: _angular_core.InputSignal<boolean>;
5290
+ /** `inline` matches legacy media rows (e.g. audio): compact danger text under the player. */
5291
+ readonly contentErrorStyle: _angular_core.InputSignal<"inline" | "banner">;
5292
+ /** Icon class for content error (e.g. `fa-light fa-music` for audio). */
5293
+ readonly contentErrorIconClass: _angular_core.InputSignal<string>;
5294
+ /** `below`: render after main bubble body (typical for media). */
5295
+ readonly placement: _angular_core.InputSignal<"above" | "below">;
5296
+ readonly contentRetryEnabled: _angular_core.InputSignal<boolean>;
5297
+ readonly contentRetry: _angular_core.OutputEmitterRef<void>;
5298
+ readonly retryBusy: _angular_core.WritableSignal<boolean>;
5299
+ private readonly currentUser;
5300
+ private readonly isOwn;
5301
+ readonly showSending: _angular_core.Signal<boolean>;
5302
+ readonly showFailed: _angular_core.Signal<boolean>;
5303
+ readonly showContentError: _angular_core.Signal<boolean>;
5304
+ readonly hasVisibleChrome: _angular_core.Signal<boolean>;
5305
+ readonly showRetryButton: _angular_core.Signal<boolean>;
5306
+ readonly contentErrorText: _angular_core.Signal<string>;
5307
+ readonly deliveryFailedText: _angular_core.Signal<string>;
5308
+ onRetry(): Promise<void>;
5309
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationMessageRendererStateComponent, never>;
5310
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationMessageRendererStateComponent, "ax-conversation-message-renderer-state", never, { "rendererState": { "alias": "rendererState"; "required": true; "isSignal": true; }; "message": { "alias": "message"; "required": true; "isSignal": true; }; "contentErrorLabel": { "alias": "contentErrorLabel"; "required": false; "isSignal": true; }; "deliveryFailedLabel": { "alias": "deliveryFailedLabel"; "required": false; "isSignal": true; }; "showContentErrorChrome": { "alias": "showContentErrorChrome"; "required": false; "isSignal": true; }; "contentErrorStyle": { "alias": "contentErrorStyle"; "required": false; "isSignal": true; }; "contentErrorIconClass": { "alias": "contentErrorIconClass"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "contentRetryEnabled": { "alias": "contentRetryEnabled"; "required": false; "isSignal": true; }; }, { "contentRetry": "contentRetry"; }, never, never, true, never>;
5311
+ }
5312
+
5313
+ declare class AXAudioRendererComponent implements AXMessageRendererComponent {
5314
+ private readonly platformId;
5315
+ private readonly destroyRef;
5316
+ private readonly infoBarService;
5070
5317
  private readonly audioElementRef;
5071
- /** Playing state */
5318
+ private readonly _contentState;
5319
+ readonly message: _angular_core.InputSignal<AXMessage>;
5320
+ readonly rendererState: _angular_core.Signal<{
5321
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5322
+ contentState: AXMessageRendererContentState;
5323
+ }>;
5072
5324
  readonly isPlaying: _angular_core.WritableSignal<boolean>;
5073
- /** Muted state */
5074
5325
  readonly isMuted: _angular_core.WritableSignal<boolean>;
5075
- /** Current time in seconds */
5076
5326
  readonly currentTime: _angular_core.WritableSignal<number>;
5077
- /** Duration in seconds */
5078
5327
  readonly duration: _angular_core.WritableSignal<number>;
5079
- /** Error state */
5080
- readonly error: _angular_core.WritableSignal<boolean>;
5081
- /** Audio payload */
5082
5328
  readonly payload: _angular_core.Signal<AXAudioPayload>;
5083
- /** Audio URL */
5084
5329
  readonly audioUrl: _angular_core.Signal<string>;
5085
- /** Title */
5086
5330
  readonly title: _angular_core.Signal<string>;
5087
- /** Progress percentage */
5088
5331
  readonly progress: _angular_core.Signal<number>;
5089
- /** Formatted current time */
5090
5332
  readonly currentTimeFormatted: _angular_core.Signal<string>;
5091
- /** Formatted duration */
5092
5333
  readonly durationFormatted: _angular_core.Signal<string>;
5093
5334
  constructor();
5094
- /** Toggle play/pause */
5095
5335
  togglePlay(): void;
5096
- /** Toggle mute */
5097
5336
  toggleMute(): void;
5098
- /** Handle time update */
5099
5337
  onTimeUpdate(): void;
5100
- /** Handle audio ended */
5101
5338
  onEnded(): void;
5102
- /** Handle audio error */
5103
5339
  onError(): void;
5104
- /** Handle progress bar click */
5105
5340
  onProgressClick(event: MouseEvent): void;
5106
- /** Format time (seconds to MM:SS) */
5107
- private formatTime;
5341
+ private pausePlayback;
5342
+ private syncInfoBarBanner;
5108
5343
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXAudioRendererComponent, never>;
5109
5344
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXAudioRendererComponent, "ax-conversation-audio-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5110
5345
  }
5111
5346
 
5112
- declare class AXContactRendererComponent {
5113
- private readonly toastService;
5114
- /** Message to render */
5347
+ declare class AXAudioInfoBarBannerComponent implements AXMessageInfoBarBannerComponent {
5115
5348
  readonly message: _angular_core.InputSignal<AXMessage>;
5116
- /** Contact payload */
5117
- readonly payload: _angular_core.Signal<AXContactPayload>;
5118
- /** Get initials from name */
5119
- getInitials(name: string): string;
5120
- /** Copy contact information to clipboard */
5121
- copyContact(): Promise<void>;
5122
- /** Format contact information as text */
5123
- private formatContactText;
5124
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXContactRendererComponent, never>;
5125
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXContactRendererComponent, "ax-conversation-contact-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5349
+ readonly title: _angular_core.InputSignal<string>;
5350
+ readonly currentTime: _angular_core.InputSignal<number>;
5351
+ readonly duration: _angular_core.InputSignal<number>;
5352
+ private readonly payload;
5353
+ readonly resolvedTitle: _angular_core.Signal<string>;
5354
+ readonly progressPercent: _angular_core.Signal<number>;
5355
+ readonly timeLabel: _angular_core.Signal<string>;
5356
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXAudioInfoBarBannerComponent, never>;
5357
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXAudioInfoBarBannerComponent, "ax-conversation-audio-info-bar-banner", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5126
5358
  }
5127
5359
 
5128
- declare class AXFallbackRendererComponent {
5129
- /** Message to render */
5360
+ declare class AXFallbackRendererComponent implements AXMessageRendererComponent {
5361
+ private readonly _contentState;
5130
5362
  readonly message: _angular_core.InputSignal<AXMessage>;
5131
- /** Show raw data */
5132
- readonly showRaw: _angular_core.WritableSignal<boolean>;
5133
- /** Message type label */
5363
+ readonly rendererState: _angular_core.Signal<{
5364
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5365
+ contentState: AXMessageRendererContentState;
5366
+ }>;
5134
5367
  readonly messageTypeLabel: _angular_core.Signal<string>;
5135
- /** Has payload data */
5136
- readonly hasPayloadData: _angular_core.Signal<boolean>;
5137
- /** Raw payload as JSON string */
5138
- readonly rawPayload: _angular_core.Signal<string>;
5139
- /** Toggle raw data display */
5140
- toggleRaw(): void;
5368
+ /** Same tone as content-error default in {@link AXConversationMessageRendererStateComponent}. */
5369
+ readonly fallbackDescription: _angular_core.Signal<string>;
5141
5370
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFallbackRendererComponent, never>;
5142
5371
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFallbackRendererComponent, "ax-conversation-fallback-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5143
5372
  }
5144
5373
 
5145
- declare class AXFileRendererComponent {
5146
- /** Message to render */
5374
+ declare class AXFileRendererComponent implements AXMessageRendererComponent {
5375
+ private readonly _contentState;
5147
5376
  readonly message: _angular_core.InputSignal<AXMessage>;
5148
- /** File payload */
5377
+ readonly rendererState: _angular_core.Signal<{
5378
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5379
+ contentState: AXMessageRendererContentState;
5380
+ }>;
5149
5381
  readonly payload: _angular_core.Signal<AXFilePayload>;
5150
- /** File URL */
5151
5382
  readonly fileUrl: _angular_core.Signal<string>;
5152
- /** File name */
5153
5383
  readonly fileName: _angular_core.Signal<string>;
5154
- /** File size in bytes */
5155
5384
  readonly fileSize: _angular_core.Signal<number>;
5156
- /** MIME type */
5157
5385
  readonly mimeType: _angular_core.Signal<string>;
5158
- /** File extension */
5159
5386
  readonly fileExtension: _angular_core.Signal<string>;
5160
- /** File icon color based on extension */
5161
- readonly fileIconColor: _angular_core.Signal<string>;
5162
- /** Formatted file size */
5387
+ readonly swatchColor: _angular_core.Signal<string>;
5163
5388
  readonly formattedSize: _angular_core.Signal<string>;
5164
5389
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFileRendererComponent, never>;
5165
5390
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFileRendererComponent, "ax-conversation-file-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5166
5391
  }
5167
5392
 
5168
- declare class AXImageRendererComponent {
5393
+ declare class AXImageRendererComponent implements AXMessageRendererComponent {
5169
5394
  private readonly platformId;
5170
- /** Message to render */
5395
+ private readonly _contentState;
5171
5396
  readonly message: _angular_core.InputSignal<AXMessage>;
5172
- /** Loading state */
5173
- readonly loading: _angular_core.WritableSignal<boolean>;
5174
- /** Error state */
5175
- readonly error: _angular_core.WritableSignal<boolean>;
5176
- /** Image clicked event */
5397
+ readonly rendererState: _angular_core.Signal<{
5398
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5399
+ contentState: AXMessageRendererContentState;
5400
+ }>;
5177
5401
  readonly imageClick: _angular_core.OutputEmitterRef<string>;
5178
- /** Image payload */
5179
5402
  readonly payload: _angular_core.Signal<AXImagePayload>;
5180
- /** Thumbnail URL */
5181
5403
  readonly thumbnailUrl: _angular_core.Signal<string>;
5182
- /** Alt text */
5183
5404
  readonly alt: _angular_core.Signal<string>;
5184
- /** Caption */
5185
5405
  readonly caption: _angular_core.Signal<string>;
5186
- /** Handle image load */
5406
+ constructor();
5187
5407
  onLoad(): void;
5188
- /** Handle image error */
5189
5408
  onError(): void;
5190
- /** Handle image click */
5191
5409
  onClick(): void;
5192
5410
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXImageRendererComponent, never>;
5193
5411
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXImageRendererComponent, "ax-conversation-image-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, { "imageClick": "imageClick"; }, never, never, true, never>;
5194
5412
  }
5195
5413
 
5196
- declare class AXLocationRendererComponent {
5197
- /** Message to render */
5414
+ declare class AXLocationRendererComponent implements AXMessageRendererComponent {
5415
+ private readonly _contentState;
5198
5416
  readonly message: _angular_core.InputSignal<AXMessage>;
5199
- /** Location payload */
5417
+ readonly rendererState: _angular_core.Signal<{
5418
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5419
+ contentState: AXMessageRendererContentState;
5420
+ }>;
5200
5421
  readonly payload: _angular_core.Signal<AXLocationPayload>;
5201
- /** Latitude */
5202
5422
  readonly latitude: _angular_core.Signal<number>;
5203
- /** Longitude */
5204
5423
  readonly longitude: _angular_core.Signal<number>;
5205
- /** Location name */
5206
5424
  readonly locationName: _angular_core.Signal<string>;
5207
- /** Address */
5208
5425
  readonly address: _angular_core.Signal<string>;
5209
- /** Coordinates text */
5210
5426
  readonly coordinatesText: _angular_core.Signal<string>;
5211
- /** Google Maps URL */
5212
5427
  readonly mapsUrl: _angular_core.Signal<string>;
5213
- /** Markers for the map */
5214
5428
  readonly markers: _angular_core.Signal<{
5215
5429
  latitude: number;
5216
5430
  longitude: number;
@@ -5222,130 +5436,154 @@ declare class AXLocationRendererComponent {
5222
5436
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXLocationRendererComponent, "ax-conversation-location-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5223
5437
  }
5224
5438
 
5225
- declare class AXStickerRendererComponent {
5226
- /** Message to render */
5439
+ declare class AXStickerRendererComponent implements AXMessageRendererComponent {
5440
+ private readonly _contentState;
5227
5441
  readonly message: _angular_core.InputSignal<AXMessage>;
5228
- /** Loading state */
5229
- readonly loading: _angular_core.WritableSignal<boolean>;
5230
- /** Error state */
5231
- readonly error: _angular_core.WritableSignal<boolean>;
5232
- /** Sticker payload */
5442
+ readonly rendererState: _angular_core.Signal<{
5443
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5444
+ contentState: AXMessageRendererContentState;
5445
+ }>;
5233
5446
  readonly payload: _angular_core.Signal<AXStickerPayload>;
5234
- /** Sticker URL */
5235
5447
  readonly stickerUrl: _angular_core.Signal<string>;
5236
- /** Alt text */
5237
5448
  readonly alt: _angular_core.Signal<string>;
5238
- /** Handle image load */
5449
+ constructor();
5239
5450
  onLoad(): void;
5240
- /** Handle image error */
5241
5451
  onError(): void;
5242
5452
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXStickerRendererComponent, never>;
5243
5453
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXStickerRendererComponent, "ax-conversation-sticker-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5244
5454
  }
5245
5455
 
5246
- declare class AXSystemRendererComponent {
5247
- /** Message to render */
5456
+ declare class AXSystemRendererComponent implements AXMessageRendererComponent {
5457
+ private readonly _contentState;
5248
5458
  readonly message: _angular_core.InputSignal<AXMessage>;
5249
- /** System payload */
5459
+ readonly rendererState: _angular_core.Signal<{
5460
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5461
+ contentState: AXMessageRendererContentState;
5462
+ }>;
5250
5463
  readonly payload: _angular_core.Signal<AXSystemPayload>;
5251
- /** Icon class based on system message type */
5252
- readonly iconClass: _angular_core.Signal<"fa-light fa-image" | "fa-light fa-user-plus" | "fa-light fa-user-minus" | "fa-light fa-pen" | "fa-light fa-info-circle">;
5464
+ readonly iconClass: _angular_core.Signal<string>;
5253
5465
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSystemRendererComponent, never>;
5254
5466
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSystemRendererComponent, "ax-conversation-system-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5255
5467
  }
5256
5468
 
5257
- declare class AXTextRendererComponent {
5469
+ declare class AXTextRendererComponent implements AXMessageRendererComponent {
5258
5470
  private readonly infoBarService;
5259
5471
  private readonly sanitizer;
5260
- /** Message to render */
5472
+ private readonly _contentState;
5261
5473
  readonly message: _angular_core.InputSignal<AXMessage>;
5262
- /** Search query from service */
5474
+ readonly rendererState: _angular_core.Signal<{
5475
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5476
+ contentState: AXMessageRendererContentState;
5477
+ }>;
5263
5478
  readonly searchQuery: _angular_core.Signal<string>;
5264
- /** Formatted text with links and search highlights */
5265
5479
  readonly formattedText: _angular_core.Signal<SafeHtml>;
5266
- /** Escape HTML to prevent XSS */
5267
- private escapeHtml;
5268
- /** Convert URLs to clickable links */
5269
5480
  private linkify;
5270
- /** Highlight search query in text */
5271
5481
  private highlightSearch;
5272
5482
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXTextRendererComponent, never>;
5273
5483
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXTextRendererComponent, "ax-conversation-text-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5274
5484
  }
5275
5485
 
5276
- declare class AXVideoRendererComponent {
5486
+ /**
5487
+ * Video message: with thumbnail — tap poster to play inline; without thumbnail — native `<video>` only.
5488
+ */
5489
+ declare class AXVideoRendererComponent implements AXMessageRendererComponent {
5277
5490
  private readonly platformId;
5278
- /** Message to render */
5491
+ private readonly destroyRef;
5492
+ private readonly infoBarService;
5493
+ private readonly videoElementRef;
5494
+ private readonly _contentState;
5279
5495
  readonly message: _angular_core.InputSignal<AXMessage>;
5280
- /** Show video player */
5496
+ readonly rendererState: _angular_core.Signal<{
5497
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5498
+ contentState: AXMessageRendererContentState;
5499
+ }>;
5281
5500
  readonly showPlayer: _angular_core.WritableSignal<boolean>;
5282
- /** Error state */
5283
- readonly error: _angular_core.WritableSignal<boolean>;
5284
- /** Video payload */
5501
+ readonly isPlaying: _angular_core.WritableSignal<boolean>;
5502
+ readonly currentTime: _angular_core.WritableSignal<number>;
5285
5503
  readonly payload: _angular_core.Signal<AXVideoPayload>;
5286
- /** Video URL */
5287
- readonly videoUrl: _angular_core.Signal<string>;
5288
- /** Thumbnail URL */
5504
+ readonly playbackUrl: _angular_core.Signal<string>;
5289
5505
  readonly thumbnailUrl: _angular_core.Signal<string>;
5290
- /** Duration in seconds */
5506
+ readonly hasThumbnail: _angular_core.Signal<boolean>;
5291
5507
  readonly duration: _angular_core.Signal<number>;
5292
- /** Caption */
5293
5508
  readonly caption: _angular_core.Signal<string>;
5294
- /** Play video */
5509
+ readonly durationLabel: _angular_core.Signal<string>;
5510
+ readonly showDurationBadge: _angular_core.Signal<boolean>;
5511
+ readonly playAriaLabel: _angular_core.Signal<string>;
5512
+ constructor();
5295
5513
  playVideo(): void;
5296
- /** Handle video error */
5514
+ onPlay(): void;
5515
+ onPause(): void;
5516
+ onTimeUpdate(): void;
5517
+ onEnded(): void;
5518
+ onThumbLoad(): void;
5519
+ onThumbError(): void;
5520
+ onVideoLoaded(): void;
5297
5521
  onError(): void;
5298
- /** Format duration (seconds to MM:SS) */
5299
- formatDuration(seconds: number): string;
5522
+ private pausePlayback;
5523
+ private syncInfoBarBanner;
5300
5524
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVideoRendererComponent, never>;
5301
5525
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVideoRendererComponent, "ax-conversation-video-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5302
5526
  }
5303
5527
 
5304
- declare class AXVoiceRendererComponent {
5305
- private readonly platformId;
5306
- /** Message to render */
5528
+ declare class AXVideoInfoBarBannerComponent implements AXMessageInfoBarBannerComponent {
5307
5529
  readonly message: _angular_core.InputSignal<AXMessage>;
5308
- /** Audio element reference */
5530
+ readonly title: _angular_core.InputSignal<string>;
5531
+ readonly currentTime: _angular_core.InputSignal<number>;
5532
+ readonly duration: _angular_core.InputSignal<number>;
5533
+ private readonly payload;
5534
+ readonly resolvedTitle: _angular_core.Signal<string>;
5535
+ readonly progressPercent: _angular_core.Signal<number>;
5536
+ readonly timeLabel: _angular_core.Signal<string>;
5537
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVideoInfoBarBannerComponent, never>;
5538
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVideoInfoBarBannerComponent, "ax-conversation-video-info-bar-banner", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5539
+ }
5540
+
5541
+ declare class AXVoiceRendererComponent implements AXMessageRendererComponent {
5542
+ private readonly platformId;
5543
+ private readonly destroyRef;
5544
+ private readonly infoBarService;
5309
5545
  private readonly audioElementRef;
5310
- /** Playing state */
5546
+ private readonly _contentState;
5547
+ readonly message: _angular_core.InputSignal<AXMessage>;
5548
+ readonly rendererState: _angular_core.Signal<{
5549
+ deliveryStatus: _acorex_components_conversation2.AXMessageStatus;
5550
+ contentState: AXMessageRendererContentState;
5551
+ }>;
5311
5552
  readonly isPlaying: _angular_core.WritableSignal<boolean>;
5312
- /** Current time in seconds */
5313
5553
  readonly currentTime: _angular_core.WritableSignal<number>;
5314
- /** Duration in seconds */
5315
5554
  readonly duration: _angular_core.WritableSignal<number>;
5316
- /** Error state */
5317
- readonly error: _angular_core.WritableSignal<boolean>;
5318
- /** Playback speed */
5319
5555
  readonly playbackSpeed: _angular_core.WritableSignal<number>;
5320
- /** Available playback speeds */
5321
5556
  private readonly speeds;
5322
- /** Voice payload */
5323
5557
  readonly payload: _angular_core.Signal<AXVoicePayload>;
5324
- /** Voice URL */
5325
5558
  readonly voiceUrl: _angular_core.Signal<string>;
5326
- /** Waveform data (simplified visualization) */
5327
5559
  readonly waveformBars: _angular_core.Signal<number[]>;
5328
- /** Active bar index based on progress */
5329
5560
  readonly activeBarIndex: _angular_core.Signal<number>;
5330
- /** Formatted current time or duration */
5331
- readonly currentTimeFormatted: _angular_core.Signal<string>;
5561
+ readonly timeLabel: _angular_core.Signal<string>;
5332
5562
  constructor();
5333
- /** Toggle play/pause */
5334
5563
  togglePlay(): void;
5335
- /** Cycle through playback speeds */
5336
5564
  cyclePlaybackSpeed(): void;
5337
- /** Handle time update */
5338
5565
  onTimeUpdate(): void;
5339
- /** Handle audio ended */
5340
5566
  onEnded(): void;
5341
- /** Handle audio error */
5342
5567
  onError(): void;
5343
- /** Format time (seconds to MM:SS) */
5344
- private formatTime;
5568
+ private pausePlayback;
5569
+ private syncInfoBarBanner;
5345
5570
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVoiceRendererComponent, never>;
5346
5571
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVoiceRendererComponent, "ax-conversation-voice-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5347
5572
  }
5348
5573
 
5574
+ declare class AXVoiceInfoBarBannerComponent implements AXMessageInfoBarBannerComponent {
5575
+ readonly message: _angular_core.InputSignal<AXMessage>;
5576
+ readonly title: _angular_core.InputSignal<string>;
5577
+ readonly currentTime: _angular_core.InputSignal<number>;
5578
+ readonly duration: _angular_core.InputSignal<number>;
5579
+ private readonly payload;
5580
+ readonly resolvedTitle: _angular_core.Signal<string>;
5581
+ readonly progressPercent: _angular_core.Signal<number>;
5582
+ readonly timeLabel: _angular_core.Signal<string>;
5583
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXVoiceInfoBarBannerComponent, never>;
5584
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXVoiceInfoBarBannerComponent, "ax-conversation-voice-info-bar-banner", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5585
+ }
5586
+
5349
5587
  /**
5350
5588
  * Default Message Actions Plugin
5351
5589
  * Individual message action constants
@@ -5385,7 +5623,6 @@ declare const AX_CONVERSATION_VOICE_RENDERER: AXMessageRenderer;
5385
5623
  declare const AX_CONVERSATION_FILE_RENDERER: AXMessageRenderer;
5386
5624
  declare const AX_CONVERSATION_LOCATION_RENDERER: AXMessageRenderer;
5387
5625
  declare const AX_CONVERSATION_STICKER_RENDERER: AXMessageRenderer;
5388
- declare const AX_CONVERSATION_CONTACT_RENDERER: AXMessageRenderer;
5389
5626
  declare const AX_CONVERSATION_SYSTEM_RENDERER: AXMessageRenderer;
5390
5627
  declare const AX_CONVERSATION_FALLBACK_RENDERER: AXMessageRenderer;
5391
5628
 
@@ -5435,6 +5672,7 @@ declare const AX_CONVERSATION_TAB_ALL: AXConversationTab;
5435
5672
  declare const AX_CONVERSATION_TAB_PRIVATE: AXConversationTab;
5436
5673
  declare const AX_CONVERSATION_TAB_GROUPS: AXConversationTab;
5437
5674
  declare const AX_CONVERSATION_TAB_CHANNELS: AXConversationTab;
5675
+ declare const AX_CONVERSATION_TAB_BOT: AXConversationTab;
5438
5676
  declare const AX_CONVERSATION_TAB_UNREAD: AXConversationTab;
5439
5677
  declare const AX_CONVERSATION_TAB_ARCHIVED: AXConversationTab;
5440
5678
 
@@ -5477,19 +5715,19 @@ declare class AXConversation2Module {
5477
5715
  * @example
5478
5716
  * ```typescript
5479
5717
  * import {
5480
- * AXIndexedDBUserApi,
5481
- * AXIndexedDBConversationApi,
5482
- * AXIndexedDBMessageApi,
5483
- * AXIndexedDBRealtimeApi
5718
+ * AXConversationIndexedDbUserApi,
5719
+ * AXConversationIndexedDbConversationApi,
5720
+ * AXConversationIndexedDbMessageApi,
5721
+ * AXConversationIndexedDbRealtimeApi
5484
5722
  * } from '@acorex/components/conversation2';
5485
5723
  *
5486
5724
  * export const appConfig: ApplicationConfig = {
5487
5725
  * providers: [
5488
5726
  * provideConversation({
5489
- * userApi: AXIndexedDBUserApi,
5490
- * conversationApi: AXIndexedDBConversationApi,
5491
- * messageApi: AXIndexedDBMessageApi,
5492
- * realtimeApi: AXIndexedDBRealtimeApi,
5727
+ * userApi: AXConversationIndexedDbUserApi,
5728
+ * conversationApi: AXConversationIndexedDbConversationApi,
5729
+ * messageApi: AXConversationIndexedDbMessageApi,
5730
+ * realtimeApi: AXConversationIndexedDbRealtimeApi,
5493
5731
  * config: { },
5494
5732
  * registry: { messageActions: [myCustomAction] }
5495
5733
  * })
@@ -5528,9 +5766,14 @@ declare class AXConversationMessageUtilsService {
5528
5766
  */
5529
5767
  static getSenderName(message: AXMessage, conversation: AXConversation): string;
5530
5768
  /**
5531
- * Get sender avatar
5769
+ * Get sender avatar image URL (takes precedence over {@link getSenderAvatarIcon}).
5532
5770
  */
5533
5771
  static getSenderAvatar(message: AXMessage, conversation: AXConversation): string | undefined;
5772
+ /**
5773
+ * Font Awesome icon class(es) for the sender when there is no avatar image:
5774
+ * participant `icon` first, then conversation-level `icon`.
5775
+ */
5776
+ static getSenderAvatarIcon(message: AXMessage, conversation: AXConversation): string | undefined;
5534
5777
  /**
5535
5778
  * Get initials from name
5536
5779
  */
@@ -5556,7 +5799,7 @@ declare class AXConversationMessageUtilsService {
5556
5799
  */
5557
5800
  static isOwnMessage(message: AXMessage, currentUserId: string): boolean;
5558
5801
  /**
5559
- * Get message status icon
5802
+ * Get message status icon class (Font Awesome)
5560
5803
  */
5561
5804
  static getStatusIcon(message: AXMessage): string;
5562
5805
  /**
@@ -6136,5 +6379,5 @@ declare function getErrorMessage(code: string, params?: Record<string, string |
6136
6379
  */
6137
6380
  type AXErrorCode = typeof MESSAGE_ERRORS[keyof typeof MESSAGE_ERRORS]['code'] | typeof FILE_ERRORS[keyof typeof FILE_ERRORS]['code'] | typeof USER_ERRORS[keyof typeof USER_ERRORS]['code'] | typeof CONVERSATION_ERRORS[keyof typeof CONVERSATION_ERRORS]['code'] | typeof CONNECTION_ERRORS[keyof typeof CONNECTION_ERRORS]['code'] | typeof LOCATION_ERRORS[keyof typeof LOCATION_ERRORS]['code'] | typeof URL_ERRORS[keyof typeof URL_ERRORS]['code'] | typeof PERMISSION_ERRORS[keyof typeof PERMISSION_ERRORS]['code'];
6138
6381
 
6139
- export { AI_API_KEY, AXAIResponderService, AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, AXComposerActionRegistry, AXComposerComponent, AXComposerPopupComponent, AXComposerService, AXComposerTabRegistry, AXContactPickerComponent, AXContactRendererComponent, AXConversation2Module, AXConversationApi, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, 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, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceRecorderComponent, AXVoiceRendererComponent, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_CONTACT_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_CONTACT_RENDERER, 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 };
6140
- export type { AXAIResponderConfig, AXApiError, AXAudioPayload, AXBlockReportReason, AXCallEvent, AXComposerAction, AXComposerActionContext, AXComposerActiveComponent, AXComposerTab, AXConnectionEvent, AXConnectionOptions, AXConnectionStatus, AXContactPayload, AXConversation, AXConversationConfig, AXConversationCreateData, AXConversationError, AXConversationFilter, AXConversationFilters, AXConversationItemAction, AXConversationItemActionContext, AXConversationOptions, AXConversationPermissions, AXConversationSettings, AXConversationSettingsUpdate, AXConversationSort, AXConversationStatus, AXConversationTab, AXConversationType, AXConversationUpdateData, AXDeleteMessageCommand, AXEditMessageCommand, AXErrorCode, AXErrorHandlerConfig, AXErrorMessage, AXErrorSeverity, AXFilePayload, AXFileValidationResult, AXGroupedReaction, AXImagePayload, AXInfoBarAction, AXInfoBarActionContext, AXInfoBarActiveComponent, AXLink, AXLinkPreview, AXLocationPayload, AXMention, AXMessage, AXMessageAction, AXMessageActionContext, AXMessageAvatarTemplateContext, AXMessageForwardData, AXMessagePayload, AXMessageRenderer, AXMessageRendererCapabilities, AXMessageSearchFilters, AXMessageStatus, AXMessageType, AXNotificationEvent, AXPaginatedResult, AXPagination, AXParticipant, AXParticipantRole, AXParticipantStatus, AXParticipantUpdate, AXPinnedMessage, AXPollOption, AXPollPayload, AXPresenceStatus, AXPresenceUpdate, AXReaction, AXReadReceipt, AXRegistryConfiguration, AXRegistryItem, AXSendMessageCommand, AXStickerPayload, AXSystemPayload, AXTextFormat, AXTextPayload, AXTypingIndicator, AXUserProfileUpdate, AXUserRole, AXUserSearchFilters, AXValidationResult, AXVideoPayload, AXVoicePayload, DropdownMenuItem, FilePreview, FileUploadProgress };
6382
+ export { AXAudioInfoBarBannerComponent, AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, AXComposerActionRegistry, AXComposerComponent, AXComposerPopupComponent, AXComposerService, AXComposerTabRegistry, AXConversation2Module, AXConversationAiApiKey, AXConversationAiResponderService, AXConversationApi, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationService, AXConversationSharedStorage, AXConversationStoreService, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXFileUploadService, AXForwardMessageDialogComponent, AXImagePickerComponent, AXImageRendererComponent, AXInfiniteScrollDirective, AXInfoBarActionRegistry, AXInfoBarComponent, AXInfoBarSearchComponent, AXInfoBarService, AXLocationPickerComponent, AXLocationRendererComponent, AXMessageActionRegistry, AXMessageApi, AXMessageListComponent, AXMessageListNoActiveDefaultComponent, AXMessageListService, AXMessageRendererRegistry, AXNewConversationDialogComponent, AXPickerFooterComponent, AXPickerHeaderComponent, AXRealtimeApi, AXRegistryService, AXSidebarComponent, AXSidebarService, AXStickerRendererComponent, AXStickerTabComponent, AXSystemRendererComponent, AXTextRendererComponent, AXUserApi, AXVideoInfoBarBannerComponent, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceInfoBarBannerComponent, AXVoiceRecorderComponent, AXVoiceRendererComponent, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_COPY_ACTION, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_BOT, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, AX_STICKER_API_KEY, CONNECTION_ERRORS, CONVERSATION_CONFIG, CONVERSATION_ERRORS, DEFAULT_COMPOSER_ACTIONS, DEFAULT_COMPOSER_TABS, DEFAULT_CONVERSATION_ITEM_ACTIONS, DEFAULT_CONVERSATION_TABS, DEFAULT_INFO_BAR_ACTIONS, DEFAULT_MESSAGE_ACTIONS, DEFAULT_MESSAGE_RENDERERS, ERROR_HANDLER_CONFIG, ERROR_MESSAGES, FILE_ERRORS, LOCATION_ERRORS, MESSAGE_ERRORS, PERMISSION_ERRORS, REGISTRY_CONFIG, URL_ERRORS, USER_ERRORS, axConversationIndexedDbStorage, conversationSharedStorage, formatErrorMessage, getDefaultConversationItemActions, getErrorMessage, mergeWithDefaults, provideConversation, sanitizeInput, validateConversationId, validateEmail, validateFile, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
6383
+ export type { AXApiError, AXAudioPayload, AXBlockReportReason, AXCallEvent, AXComposerAction, AXComposerActionComponent, AXComposerActionContext, AXComposerActiveComponent, AXComposerTab, AXConnectionEvent, AXConnectionOptions, AXConnectionStatus, AXConversation, AXConversationAiResponderConfig, AXConversationConfig, AXConversationCreateData, AXConversationError, AXConversationFilter, AXConversationFilters, AXConversationItemAction, AXConversationItemActionContext, AXConversationMetadata, AXConversationOptions, AXConversationPermissions, AXConversationSettings, AXConversationSettingsUpdate, AXConversationSort, AXConversationStatus, AXConversationTab, AXConversationType, AXConversationUpdateData, AXDeleteMessageCommand, AXEditMessageCommand, AXErrorCode, AXErrorHandlerConfig, AXErrorMessage, AXErrorSeverity, AXFilePayload, AXFileValidationResult, AXGroupedReaction, AXImagePayload, AXInfoBarAction, AXInfoBarActionComponent, AXInfoBarActionContext, AXInfoBarActiveBanner, AXInfoBarActiveComponent, AXLink, AXLinkPreview, AXLocationPayload, AXMention, AXMessage, AXMessageAction, AXMessageActionContext, AXMessageAvatarTemplateContext, AXMessageForwardData, AXMessageInfoBarBannerComponent, AXMessageListEmptyComponent, AXMessagePayload, AXMessageRenderer, AXMessageRendererCapabilities, AXMessageRendererComponent, AXMessageRendererContentState, AXMessageRendererState, AXMessageSearchFilters, AXMessageStatus, AXMessageType, AXNotificationEvent, AXPaginatedResult, AXPagination, AXParticipant, AXParticipantRole, AXParticipantStatus, AXParticipantUpdate, AXPinnedMessage, AXPollOption, AXPollPayload, AXPresenceStatus, AXPresenceUpdate, AXReaction, AXReadReceipt, AXRegistryConfiguration, AXRegistryItem, AXSendMessageCommand, AXStickerPayload, AXSystemPayload, AXTextFormat, AXTextPayload, AXTypingIndicator, AXUserProfileUpdate, AXUserRole, AXUserSearchFilters, AXValidationResult, AXVideoPayload, AXVoicePayload, DropdownMenuItem, FilePreview, FileUploadProgress };