@acorex/components 22.0.0 → 22.0.1-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/emoji/README.md +3 -0
  2. package/emojipicker/README.md +3 -0
  3. package/fesm2022/acorex-components-accordion.mjs +4 -4
  4. package/fesm2022/acorex-components-accordion.mjs.map +1 -1
  5. package/fesm2022/acorex-components-audio-wave.mjs +291 -267
  6. package/fesm2022/acorex-components-audio-wave.mjs.map +1 -1
  7. package/fesm2022/acorex-components-bubble.mjs +71 -0
  8. package/fesm2022/acorex-components-bubble.mjs.map +1 -0
  9. package/fesm2022/acorex-components-button-group.mjs +12 -5
  10. package/fesm2022/acorex-components-button-group.mjs.map +1 -1
  11. package/fesm2022/acorex-components-button.mjs +2 -2
  12. package/fesm2022/acorex-components-button.mjs.map +1 -1
  13. package/fesm2022/acorex-components-calendar.mjs +321 -118
  14. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  15. package/fesm2022/acorex-components-combo-box.mjs +238 -48
  16. package/fesm2022/acorex-components-combo-box.mjs.map +1 -1
  17. package/fesm2022/acorex-components-conversation-acorex-components-conversation-DDkiZfPb.mjs +19058 -0
  18. package/fesm2022/acorex-components-conversation-acorex-components-conversation-DDkiZfPb.mjs.map +1 -0
  19. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-COUB9zrM.mjs +50 -0
  20. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-COUB9zrM.mjs.map +1 -0
  21. package/fesm2022/acorex-components-conversation-image-picker-editor-dialog.component-COT96F_v.mjs +87 -0
  22. package/fesm2022/acorex-components-conversation-image-picker-editor-dialog.component-COT96F_v.mjs.map +1 -0
  23. package/fesm2022/acorex-components-conversation-picker-rename-file-dialog.component-CH3Q6Hry.mjs +65 -0
  24. package/fesm2022/acorex-components-conversation-picker-rename-file-dialog.component-CH3Q6Hry.mjs.map +1 -0
  25. package/fesm2022/acorex-components-conversation.mjs +1 -15470
  26. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  27. package/fesm2022/acorex-components-cron-job.mjs +1 -1
  28. package/fesm2022/acorex-components-cron-job.mjs.map +1 -1
  29. package/fesm2022/acorex-components-data-pager.mjs +4 -4
  30. package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
  31. package/fesm2022/acorex-components-data-table.mjs +126 -30
  32. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  33. package/fesm2022/acorex-components-datetime-picker.mjs +1 -1
  34. package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
  35. package/fesm2022/acorex-components-decorators.mjs +36 -6
  36. package/fesm2022/acorex-components-decorators.mjs.map +1 -1
  37. package/fesm2022/acorex-components-dialog.mjs +1 -1
  38. package/fesm2022/acorex-components-dialog.mjs.map +1 -1
  39. package/fesm2022/acorex-components-dropdown-button.mjs +1 -1
  40. package/fesm2022/acorex-components-dropdown-button.mjs.map +1 -1
  41. package/fesm2022/acorex-components-emoji.mjs +74 -0
  42. package/fesm2022/acorex-components-emoji.mjs.map +1 -0
  43. package/fesm2022/acorex-components-emojipicker.mjs +425 -0
  44. package/fesm2022/acorex-components-emojipicker.mjs.map +1 -0
  45. package/fesm2022/acorex-components-fab.mjs +2 -2
  46. package/fesm2022/acorex-components-fab.mjs.map +1 -1
  47. package/fesm2022/acorex-components-file-viewer.mjs +339 -89
  48. package/fesm2022/acorex-components-file-viewer.mjs.map +1 -1
  49. package/fesm2022/acorex-components-form.mjs +1 -1
  50. package/fesm2022/acorex-components-form.mjs.map +1 -1
  51. package/fesm2022/acorex-components-highlight.mjs +80 -0
  52. package/fesm2022/acorex-components-highlight.mjs.map +1 -0
  53. package/fesm2022/acorex-components-image-editor.mjs +686 -416
  54. package/fesm2022/acorex-components-image-editor.mjs.map +1 -1
  55. package/fesm2022/acorex-components-inline-reaction.mjs +111 -0
  56. package/fesm2022/acorex-components-inline-reaction.mjs.map +1 -0
  57. package/fesm2022/acorex-components-kanban.mjs +1 -1
  58. package/fesm2022/acorex-components-kanban.mjs.map +1 -1
  59. package/fesm2022/acorex-components-loading-dialog.mjs +1 -1
  60. package/fesm2022/acorex-components-loading-dialog.mjs.map +1 -1
  61. package/fesm2022/acorex-components-lookup.mjs +742 -134
  62. package/fesm2022/acorex-components-lookup.mjs.map +1 -1
  63. package/fesm2022/acorex-components-map.mjs +7 -0
  64. package/fesm2022/acorex-components-map.mjs.map +1 -1
  65. package/fesm2022/acorex-components-menu.mjs +96 -16
  66. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  67. package/fesm2022/acorex-components-message-status.mjs +71 -0
  68. package/fesm2022/acorex-components-message-status.mjs.map +1 -0
  69. package/fesm2022/acorex-components-message-time.mjs +36 -0
  70. package/fesm2022/acorex-components-message-time.mjs.map +1 -0
  71. package/fesm2022/acorex-components-message.mjs +120 -0
  72. package/fesm2022/acorex-components-message.mjs.map +1 -0
  73. package/fesm2022/acorex-components-notification.mjs +1 -1
  74. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  75. package/fesm2022/acorex-components-paint.mjs +1 -1
  76. package/fesm2022/acorex-components-paint.mjs.map +1 -1
  77. package/fesm2022/acorex-components-popover.mjs +19 -8
  78. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  79. package/fesm2022/acorex-components-popup.mjs +1 -1
  80. package/fesm2022/acorex-components-popup.mjs.map +1 -1
  81. package/fesm2022/acorex-components-rail-navigation.mjs +2 -2
  82. package/fesm2022/acorex-components-rail-navigation.mjs.map +1 -1
  83. package/fesm2022/acorex-components-range-slider.mjs +2 -2
  84. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  85. package/fesm2022/acorex-components-reaction.mjs +144 -0
  86. package/fesm2022/acorex-components-reaction.mjs.map +1 -0
  87. package/fesm2022/acorex-components-rest-api-generator.mjs +5 -5
  88. package/fesm2022/acorex-components-rest-api-generator.mjs.map +1 -1
  89. package/fesm2022/acorex-components-rrule.mjs +1 -1
  90. package/fesm2022/acorex-components-rrule.mjs.map +1 -1
  91. package/fesm2022/acorex-components-scheduler-picker.mjs +5 -5
  92. package/fesm2022/acorex-components-scheduler-picker.mjs.map +1 -1
  93. package/fesm2022/acorex-components-scheduler.mjs +1 -1
  94. package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
  95. package/fesm2022/acorex-components-selection-list.mjs +1 -2
  96. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  97. package/fesm2022/acorex-components-tabs.mjs +510 -74
  98. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  99. package/fesm2022/acorex-components-tree-view.mjs +49 -6
  100. package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
  101. package/fesm2022/acorex-components-wysiwyg.mjs +76 -6
  102. package/fesm2022/acorex-components-wysiwyg.mjs.map +1 -1
  103. package/highlight/README.md +13 -0
  104. package/inline-reaction/README.md +3 -0
  105. package/lookup/README.md +1 -1
  106. package/message/README.md +3 -0
  107. package/message-status/README.md +3 -0
  108. package/message-time/README.md +3 -0
  109. package/package.json +42 -12
  110. package/reaction/README.md +3 -0
  111. package/types/acorex-components-audio-wave.d.ts +132 -73
  112. package/types/acorex-components-bubble.d.ts +31 -0
  113. package/types/acorex-components-button-group.d.ts +4 -0
  114. package/types/acorex-components-button.d.ts +1 -1
  115. package/types/acorex-components-calendar.d.ts +41 -9
  116. package/types/acorex-components-combo-box.d.ts +34 -4
  117. package/types/acorex-components-conversation.d.ts +1745 -1322
  118. package/types/acorex-components-data-table.d.ts +27 -7
  119. package/types/acorex-components-decorators.d.ts +13 -1
  120. package/types/acorex-components-emoji.d.ts +42 -0
  121. package/types/acorex-components-emojipicker.d.ts +146 -0
  122. package/types/acorex-components-file-viewer.d.ts +48 -4
  123. package/types/acorex-components-highlight.d.ts +31 -0
  124. package/types/acorex-components-image-editor.d.ts +68 -48
  125. package/types/acorex-components-inline-reaction.d.ts +52 -0
  126. package/types/acorex-components-lookup.d.ts +213 -82
  127. package/types/acorex-components-map.d.ts +5 -0
  128. package/types/acorex-components-menu.d.ts +15 -3
  129. package/types/acorex-components-message-status.d.ts +23 -0
  130. package/types/acorex-components-message-time.d.ts +19 -0
  131. package/types/acorex-components-message.d.ts +59 -0
  132. package/types/acorex-components-popover.d.ts +5 -3
  133. package/types/acorex-components-reaction.d.ts +85 -0
  134. package/types/acorex-components-selection-list.d.ts +1 -1
  135. package/types/acorex-components-tabs.d.ts +148 -19
  136. package/types/acorex-components-tree-view.d.ts +31 -2
  137. package/types/acorex-components-wysiwyg.d.ts +13 -0
  138. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-DCcRJYfF.mjs +0 -50
  139. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-DCcRJYfF.mjs.map +0 -1
  140. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-DnSW908R.mjs +0 -210
  141. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-DnSW908R.mjs.map +0 -1
  142. package/fesm2022/acorex-components-flow-chart.mjs +0 -735
  143. package/fesm2022/acorex-components-flow-chart.mjs.map +0 -1
  144. package/fesm2022/acorex-components-query-builder.mjs +0 -267
  145. package/fesm2022/acorex-components-query-builder.mjs.map +0 -1
  146. package/flow-chart/README.md +0 -3
  147. package/query-builder/README.md +0 -3
  148. package/types/acorex-components-flow-chart.d.ts +0 -187
  149. package/types/acorex-components-query-builder.d.ts +0 -52
@@ -1,7 +1,8 @@
1
1
  import * as _acorex_components_conversation from '@acorex/components/conversation';
2
2
  import * as _angular_core from '@angular/core';
3
- import { OnDestroy, ViewContainerRef, Type, InputSignal, WritableSignal, Signal, Provider, OnInit, EventEmitter, TemplateRef, ElementRef, InjectionToken, ModuleWithProviders } from '@angular/core';
3
+ import { OnDestroy, ViewContainerRef, Type, InputSignal, WritableSignal, Signal, Provider, EventEmitter, TemplateRef, InjectionToken, ElementRef, ModuleWithProviders } from '@angular/core';
4
4
  import { AXComponentCloseEvent, AXHtmlEvent, AXClickEvent, AXDataSource, AXPlacement } from '@acorex/cdk/common';
5
+ import { AXTranslationService } from '@acorex/core/translation';
5
6
  import * as _acorex_components_action_sheet from '@acorex/components/action-sheet';
6
7
  import { AXActionSheetRef } from '@acorex/components/action-sheet';
7
8
  import * as _acorex_components_popup from '@acorex/components/popup';
@@ -15,11 +16,12 @@ import { AXContextMenuOpeningEvent, AXContextMenuItemsClickEvent } from '@acorex
15
16
  import { AXTabLocation } from '@acorex/components/tabs';
16
17
  import { AXBasePageComponent } from '@acorex/components/page';
17
18
  import * as _acorex_core_file from '@acorex/core/file';
18
- import { AXFileTypeInfoProvider, AXFileType, AXFileTypeRegistryService, AXFileService, AXFileTypeExtensionHint, AXFileTypeOpenContext } from '@acorex/core/file';
19
- import { AXTranslationService } from '@acorex/core/translation';
19
+ import { AXFileTypeRegistryService, AXFileTypeExtensionHint, AXFileTypeOpenContext, AXFileTypeInfoProvider, AXFileType, AXFileService } from '@acorex/core/file';
20
20
  import { AXToastService } from '@acorex/components/toast';
21
21
  import { AXValidationRuleResult } from '@acorex/core/validation';
22
22
  import { AXMapMarker } from '@acorex/components/map';
23
+ import { AXWaveConfig, AXAudioWaveChangeEvent } from '@acorex/components/audio-wave';
24
+ import { AXRangeSliderValue } from '@acorex/components/range-slider';
23
25
  import { SafeHtml } from '@angular/platform-browser';
24
26
  import * as i1 from '@angular/common';
25
27
  import * as i2 from '@angular/forms';
@@ -183,6 +185,7 @@ interface AXConversationFileMediaItem extends AXConversationMediaItemFields {
183
185
  mimeType: string;
184
186
  thumbnailUrl?: string;
185
187
  extension?: string;
188
+ duration?: number;
186
189
  }
187
190
  interface AXConversationFilePayload {
188
191
  type: 'file';
@@ -447,6 +450,11 @@ interface AXConversationParticipant {
447
450
  icon?: string;
448
451
  /** Role in the conversation (for groups/channels) */
449
452
  role?: AXConversationParticipantRole;
453
+ /**
454
+ * When this user joined the conversation.
455
+ * Used for admin succession when the creator leaves a group or channel.
456
+ */
457
+ joinedAt?: Date;
450
458
  /** Custom metadata */
451
459
  metadata?: Record<string, unknown>;
452
460
  }
@@ -526,6 +534,12 @@ interface AXConversation {
526
534
  pinned?: boolean;
527
535
  /** Whether conversation is archived */
528
536
  archived?: boolean;
537
+ /**
538
+ * Viewer-scoped history cursor (Telegram-style).
539
+ * Messages at or before this timestamp are omitted for the current user only.
540
+ * Filled by the conversation/message APIs; never leak another user's cutoff.
541
+ */
542
+ historyClearedAt?: Date;
529
543
  /** Custom metadata */
530
544
  metadata?: AXConversationMetadata;
531
545
  }
@@ -687,8 +701,6 @@ declare class AXConversationComposerService {
687
701
  private readonly generationState;
688
702
  private readonly translation;
689
703
  private readonly popupService;
690
- private readonly actionSheetService;
691
- private readonly platform;
692
704
  private readonly config;
693
705
  private readonly _activeActionOverlay;
694
706
  private get registry();
@@ -1163,6 +1175,24 @@ declare class AXConversationTabRegistry {
1163
1175
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationTabRegistry>;
1164
1176
  }
1165
1177
 
1178
+ /** Visual chrome around a message body in the list. */
1179
+ type AXConversationMessageChrome = 'bubble' | 'plain';
1180
+ /** Max consecutive emoji graphemes that render as a jumbo (sticker-sized) text message. */
1181
+ declare const AX_CONVERSATION_JUMBO_EMOJI_MAX = 3;
1182
+ /**
1183
+ * Resolve registry chrome config to a concrete value.
1184
+ * Default is {@link AXConversationMessageChrome bubble}.
1185
+ */
1186
+ declare function resolveMessageChrome(chrome: AXConversationMessageChrome | ((message: AXConversationMessage) => AXConversationMessageChrome) | undefined, message: AXConversationMessage): AXConversationMessageChrome;
1187
+ /** Visible graphemes in trimmed text (whitespace between emojis is dropped). */
1188
+ declare function listTextGraphemes(text: string | null | undefined): string[];
1189
+ /** Count emoji graphemes in trimmed text; `0` when mixed with other characters. */
1190
+ declare function countLoneEmojis(text: string | null | undefined): number;
1191
+ declare function isJumboEmojiText(text: string | null | undefined): boolean;
1192
+ declare function isJumboEmojiTextMessage(message: AXConversationMessage): boolean;
1193
+ /** Types that never sit inside a bubble cluster with neighboring messages. */
1194
+ declare function isPlainChromeMessage(message: AXConversationMessage): boolean;
1195
+
1166
1196
  /**
1167
1197
  * Message Renderer Registry
1168
1198
  * Register custom message renderers for different message types
@@ -1237,6 +1267,12 @@ interface AXConversationMessageRenderer {
1237
1267
  canHandle: (message: AXConversationMessage) => boolean;
1238
1268
  /** Renderer capabilities */
1239
1269
  capabilities: AXConversationMessageRendererCapabilities;
1270
+ /**
1271
+ * List chrome for this message type.
1272
+ * `plain` removes bubble fill, padding, shadow, and tail. Default is `bubble`.
1273
+ * Pass a function when chrome depends on payload (e.g. jumbo emoji text).
1274
+ */
1275
+ chrome?: AXConversationMessageChrome | ((message: AXConversationMessage) => AXConversationMessageChrome);
1240
1276
  /** Display name */
1241
1277
  displayName?: string;
1242
1278
  /** Icon name/class */
@@ -1263,6 +1299,9 @@ declare class AXConversationMessageRendererRegistry {
1263
1299
  readonly renderers: Signal<AXConversationMessageRenderer[]>;
1264
1300
  /** Renderers sorted by priority (highest first) */
1265
1301
  readonly sortedRenderers: Signal<AXConversationMessageRenderer[]>;
1302
+ /** O(1) lookup by message type. Rebuilt when the registry changes. */
1303
+ private readonly rendererByType;
1304
+ private readonly missingRendererTypesWarned;
1266
1305
  /**
1267
1306
  * Register a message renderer
1268
1307
  */
@@ -1272,13 +1311,15 @@ declare class AXConversationMessageRendererRegistry {
1272
1311
  */
1273
1312
  unregister(type: string): void;
1274
1313
  /**
1275
- * Get renderer for a specific message
1314
+ * Get renderer for a specific message (exact type match).
1315
+ * Missing types are warned once; callers should fall back to the `fallback` renderer.
1276
1316
  */
1277
1317
  getRenderer(message: AXConversationMessage): AXConversationMessageRenderer | undefined;
1278
1318
  /**
1279
1319
  * Get renderer by type
1280
1320
  */
1281
1321
  getRendererByType(type: string): AXConversationMessageRenderer | undefined;
1322
+ private warnMissingRenderer;
1282
1323
  /**
1283
1324
  * Check if a message type is supported
1284
1325
  */
@@ -1626,7 +1667,13 @@ declare class AXConversationComposerComponent implements OnDestroy {
1626
1667
  private readonly composerService;
1627
1668
  private readonly messageListService;
1628
1669
  private readonly config;
1629
- private readonly translation;
1670
+ protected readonly translation: AXTranslationService;
1671
+ private readonly uploader;
1672
+ private readonly platform;
1673
+ private readonly fileService;
1674
+ private readonly toast;
1675
+ private readonly actionSheetService;
1676
+ private readonly hostRef;
1630
1677
  /** Access registry through conversation service */
1631
1678
  protected get composerActionRegistry(): _acorex_components_conversation.AXConversationComposerActionRegistry;
1632
1679
  /** Composer text area reference */
@@ -1714,8 +1761,13 @@ declare class AXConversationComposerComponent implements OnDestroy {
1714
1761
  onAttachMenuPanelMouseLeave(): void;
1715
1762
  private scheduleAttachMenuClose;
1716
1763
  private clearAttachMenuCloseTimer;
1717
- /** Handle attach menu click */
1764
+ /** Desktop: open an all-files chooser. Mobile: toggle the attachment dropdown. */
1718
1765
  onAttachMenuClick(event: AXClickEvent): void;
1766
+ /** Open the OS file picker for any file, then route to the matching composer picker. */
1767
+ private openSmartAttachChooser;
1768
+ /** OS file paste (Ctrl+V) while the composer is focused. */
1769
+ onComposerPaste(event: ClipboardEvent): void;
1770
+ private composerPickerDeps;
1719
1771
  /** Handle attachment menu action selection */
1720
1772
  onAttachMenuAction(actionId: string): Promise<void>;
1721
1773
  /** Handle primary button click (send / cancel / stopping / voice / locked). */
@@ -1788,6 +1840,8 @@ declare class AXConversationContainerComponent {
1788
1840
  private readonly actionSheetService;
1789
1841
  private readonly hostRef;
1790
1842
  private readonly platformId;
1843
+ private readonly document;
1844
+ private readonly destroyRef;
1791
1845
  protected readonly config: Required<_acorex_components_conversation.AXConversationConfig>;
1792
1846
  constructor();
1793
1847
  private get registry();
@@ -1802,11 +1856,7 @@ declare class AXConversationContainerComponent {
1802
1856
  /** Container CSS classes */
1803
1857
  readonly containerClasses: _angular_core.Signal<string>;
1804
1858
  closeActiveConversation(): void;
1805
- /**
1806
- * When the user pastes files copied from the OS (e.g. Ctrl+V after copying in Explorer),
1807
- * open the same composer picker popup used for message-list drag-and-drop.
1808
- */
1809
- onDocumentPaste(event: ClipboardEvent): Promise<void>;
1859
+ private openPastedFiles;
1810
1860
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationContainerComponent, never>;
1811
1861
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationContainerComponent, "ax-conversation-container", never, { "customClass": { "alias": "customClass"; "required": false; "isSignal": true; }; }, {}, never, ["ax-conversation-sidebar, [ax-conversation-sidebar]", "ax-conversation-info-bar, [ax-conversation-info-bar]", "ax-conversation-message-list, [ax-conversation-message-list]", "ax-conversation-composer, [ax-conversation-composer]", "ax-conversation-empty"], true, never>;
1812
1862
  }
@@ -1817,6 +1867,8 @@ declare class AXConversationContainerDirective {
1817
1867
  private readonly fileService;
1818
1868
  private readonly hostRef;
1819
1869
  private readonly platformId;
1870
+ private readonly document;
1871
+ private readonly destroyRef;
1820
1872
  private readonly translation;
1821
1873
  private readonly toast;
1822
1874
  private readonly platform;
@@ -1831,7 +1883,7 @@ declare class AXConversationContainerDirective {
1831
1883
  /** Error state */
1832
1884
  readonly error: _angular_core.Signal<Error>;
1833
1885
  closeActiveConversation(): void;
1834
- onDocumentPaste(event: ClipboardEvent): Promise<void>;
1886
+ private openPastedFiles;
1835
1887
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationContainerDirective, never>;
1836
1888
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXConversationContainerDirective, "[axConversationContainer]", never, {}, {}, never, never, true, never>;
1837
1889
  }
@@ -1858,6 +1910,7 @@ declare class AXConversationInfoBarComponent {
1858
1910
  readonly activeConversation: _angular_core.Signal<AXConversation>;
1859
1911
  readonly activeComponent: _angular_core.Signal<_acorex_components_conversation.AXConversationInfoBarActiveComponent>;
1860
1912
  readonly activeBanner: _angular_core.Signal<_acorex_components_conversation.AXConversationInfoBarActiveBanner>;
1913
+ readonly bannerInputs: _angular_core.Signal<{}>;
1861
1914
  readonly membersPopoverTarget: _angular_core.WritableSignal<HTMLElement>;
1862
1915
  readonly actionLoading: _angular_core.WritableSignal<boolean>;
1863
1916
  readonly infoClick: _angular_core.OutputEmitterRef<void>;
@@ -1868,6 +1921,7 @@ declare class AXConversationInfoBarComponent {
1868
1921
  readonly menuItems: _angular_core.Signal<AXConversationDropdownMenuItem[]>;
1869
1922
  getStatus(conversation: AXConversation): _acorex_components_conversation.AXConversationPresenceStatus;
1870
1923
  getSubtitle(conversation: AXConversation): string;
1924
+ isTyping(conversation: AXConversation): boolean;
1871
1925
  onInfoLeftClick(): void;
1872
1926
  onInlineActionClick(actionId: string): Promise<void>;
1873
1927
  private activateAction;
@@ -1875,7 +1929,6 @@ declare class AXConversationInfoBarComponent {
1875
1929
  getInlineComponentInputs(): Record<string, unknown>;
1876
1930
  isActiveComponentFullWidth(): boolean;
1877
1931
  onCloseComponent(): void;
1878
- getBannerInputs(): Record<string, unknown>;
1879
1932
  onCloseBanner(): void;
1880
1933
  onMenuItemClick(item: AXConversationDropdownMenuItem): Promise<void>;
1881
1934
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationInfoBarComponent, never>;
@@ -2026,6 +2079,17 @@ interface AXConversationUpdateData {
2026
2079
  /** Custom metadata */
2027
2080
  metadata?: Record<string, unknown>;
2028
2081
  }
2082
+ /**
2083
+ * Options for {@link AXConversationApi.deleteConversation}.
2084
+ */
2085
+ interface AXConversationDeleteOptions {
2086
+ /**
2087
+ * Private: destroy the chat for every participant (Telegram "delete for both").
2088
+ * Group/channel: only valid for the creator — destroys the room for everyone.
2089
+ * Defaults to `false` (hide / clear history for the current user only).
2090
+ */
2091
+ forEveryone?: boolean;
2092
+ }
2029
2093
  /**
2030
2094
  * Conversation filter options
2031
2095
  */
@@ -2116,12 +2180,14 @@ declare abstract class AXConversationApi {
2116
2180
  */
2117
2181
  abstract updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation>;
2118
2182
  /**
2119
- * Delete conversation
2183
+ * Delete or hide a conversation for the current user.
2120
2184
  *
2121
2185
  * @param conversationId - Conversation ID
2186
+ * @param options - `forEveryone` destroys the room; omit/false hides it for the current user only
2187
+ * (private chats keep the peer's history). Group/channel leave should use {@link leaveConversation}.
2122
2188
  * @throws {AXConversationApiError} If deletion fails
2123
2189
  */
2124
- abstract deleteConversation(conversationId: string): Promise<boolean>;
2190
+ abstract deleteConversation(conversationId: string, options?: AXConversationDeleteOptions): Promise<boolean>;
2125
2191
  /**
2126
2192
  * Archive conversation
2127
2193
  *
@@ -3269,6 +3335,7 @@ declare class AXConversationService {
3269
3335
  * Handle new message received
3270
3336
  */
3271
3337
  private handleNewMessage;
3338
+ private applyIncomingMessage;
3272
3339
  /**
3273
3340
  * Handle message update
3274
3341
  */
@@ -3297,6 +3364,7 @@ declare class AXConversationService {
3297
3364
  private handleConversationUpdate;
3298
3365
  private handleConversationCreated;
3299
3366
  private handleConversationDeleted;
3367
+ private removeConversationFromInbox;
3300
3368
  private handleReadReceipt;
3301
3369
  private handleMessageStatusChange;
3302
3370
  /**
@@ -3367,9 +3435,8 @@ declare class AXConversationService {
3367
3435
  */
3368
3436
  markConversationAsRead(conversationId: string): Promise<void>;
3369
3437
  /**
3370
- * Delete a conversation
3371
- * Shows confirmation dialog, then deletes from server and store
3372
- * @param conversationId - Conversation ID
3438
+ * Delete, hide, or leave a conversation.
3439
+ * Opens a confirmation popup (checkbox for private/creator destroy), then updates the store.
3373
3440
  */
3374
3441
  deleteConversation(conversationId: string): Promise<boolean>;
3375
3442
  /**
@@ -3647,9 +3714,13 @@ declare class AXConversationErrorHandlerService {
3647
3714
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationErrorHandlerService>;
3648
3715
  }
3649
3716
 
3650
- declare class AXConversationForwardMessageDialogComponent implements OnInit {
3717
+ declare class AXConversationForwardMessageDialogComponent {
3651
3718
  private readonly toastService;
3652
3719
  private readonly translation;
3720
+ private readonly config;
3721
+ private readonly destroyRef;
3722
+ private searchDebounceTimer?;
3723
+ constructor();
3653
3724
  /**
3654
3725
  * Set by {@link AXPopupComponent} when opened via {@link AXPopupService} so the shell title can update.
3655
3726
  */
@@ -3662,20 +3733,26 @@ declare class AXConversationForwardMessageDialogComponent implements OnInit {
3662
3733
  /** Assigned from `open(..., { data: { message } })`. */
3663
3734
  message: AXConversationMessage;
3664
3735
  readonly onClosed: EventEmitter<AXComponentCloseEvent>;
3665
- readonly allConversations: _angular_core.WritableSignal<AXConversation[]>;
3736
+ readonly availableUsers: _angular_core.WritableSignal<AXConversationParticipant[]>;
3666
3737
  readonly forwardSearchQuery: _angular_core.WritableSignal<string>;
3667
- readonly selectedConversationIds: _angular_core.WritableSignal<string[]>;
3738
+ readonly selectedUserIds: _angular_core.WritableSignal<string[]>;
3668
3739
  readonly forwardListEmptyTpl: _angular_core.Signal<TemplateRef<unknown>>;
3740
+ readonly forwardListLoadingTpl: _angular_core.Signal<TemplateRef<unknown>>;
3669
3741
  readonly forwardList: _angular_core.Signal<AXListComponent>;
3670
3742
  readonly forwardListDataSource: AXDataSource<unknown>;
3671
3743
  readonly isForwarding: _angular_core.Signal<boolean>;
3672
3744
  readonly canForward: _angular_core.Signal<boolean>;
3673
3745
  private readonly _syncPopupTitleEffect;
3674
- ngOnInit(): void;
3675
3746
  onForwardSearchChange(value: string): void;
3676
- conversationFromItem(item: unknown): AXConversation | null;
3677
- isSelected(conversationId: string): boolean;
3678
- private getFilteredConversationsForForward;
3747
+ userFromItem(item: unknown): AXConversationParticipant | null;
3748
+ isSelected(userId: string): boolean;
3749
+ private mergeUsersCache;
3750
+ private seedUsersFromConversations;
3751
+ private loadUsersForForward;
3752
+ private getSortedUsersForForward;
3753
+ private isExcludedUser;
3754
+ private getExcludedUserIds;
3755
+ private resolveConversationIdForUser;
3679
3756
  onCancel(): void;
3680
3757
  onForward(): Promise<void>;
3681
3758
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationForwardMessageDialogComponent, never>;
@@ -3693,274 +3770,287 @@ declare class AXConversationMessageListNoActiveDefaultComponent {
3693
3770
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationMessageListNoActiveDefaultComponent, "ax-conversation-message-list-no-active-default", never, {}, {}, never, never, true, never>;
3694
3771
  }
3695
3772
 
3696
- declare class AXConversationMessageListComponent implements OnDestroy {
3697
- private readonly conversationService;
3698
- private readonly messageListService;
3699
- private readonly composerService;
3700
- private readonly fileService;
3701
- private readonly toast;
3702
- private readonly infoBarService;
3703
- private readonly translation;
3704
- private readonly document;
3705
- private readonly platform;
3706
- private readonly actionSheetService;
3707
- protected readonly config: Required<_acorex_components_conversation.AXConversationConfig>;
3773
+ interface AXConversationAvatarDisplay {
3774
+ name: string;
3775
+ avatar?: string;
3776
+ icon?: string;
3777
+ }
3778
+ /** Conversation types that resolve a single peer participant for viewer-scoped avatar/title. */
3779
+ declare const AX_CONVERSATION_PEER_AVATAR_TYPES: ReadonlySet<AXConversationType>;
3780
+ /**
3781
+ * Other participant in a peer-scoped conversation (excludes the current viewer).
3782
+ * Applies to private 1:1 and bot assist chats with exactly one non-viewer participant.
3783
+ */
3784
+ declare function resolveConversationPeerUserId(conversation: AXConversation, currentUserId?: string): string | undefined;
3785
+ /** Other participant in a private chat (excludes the current user). */
3786
+ declare function resolvePrivatePeerUserId(conversation: AXConversation, currentUserId?: string): string | undefined;
3787
+ /** Peer participant for private and bot conversations. */
3788
+ declare function resolveConversationPeerParticipant(conversation: AXConversation, currentUserId?: string): AXConversationParticipant | undefined;
3789
+ /** Whether `auto` kind should render a registered user avatar for this conversation. */
3790
+ declare function shouldUseUserAvatarForConversation(conversation: AXConversation, currentUserId?: string): boolean;
3791
+ declare function resolveUserAvatarDisplay(userId: string, conversation: AXConversation | undefined, message?: AXConversationMessage): AXConversationAvatarDisplay;
3792
+ declare function resolveConversationAvatarDisplay(conversation: AXConversation, currentUserId?: string): AXConversationAvatarDisplay;
3793
+
3794
+ interface AXConversationMessageListBackgroundPreset {
3795
+ id: string;
3796
+ value: AXConversationMessageListThemeBackground;
3797
+ }
3798
+ /** Library default when no per-conversation or global background is set (pattern-5 tile + gradient wash). */
3799
+ declare const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND: AXConversationMessageListThemeBackground;
3800
+ /** Predefined chat-area backgrounds for the info panel (light + dark variants). */
3801
+ declare const AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS: AXConversationMessageListBackgroundPreset[];
3802
+ declare const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID = "solid-default";
3803
+
3804
+ /** Subtle Telegram-style chat-area wash when `messageListBackground` is not set (theme-aware). */
3805
+ declare const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND: string;
3806
+ declare function isMessageListThemeBackground(value: unknown): value is AXConversationMessageListThemeBackground;
3807
+ /** Pick the raw CSS string for the active theme; `undefined` when unset. */
3808
+ declare function resolveMessageListBackgroundRaw(value: AXConversationMessageListBackground | undefined, isDark: boolean): string | undefined;
3809
+ /** Turn bare `https://...` or `/path` into valid CSS `background` for images. */
3810
+ declare function normalizeMessageListBackgroundValue(raw: string): string;
3811
+ /** Whether the built-in pattern-5 wallpaper (gradient + tiled SVG) should be used. */
3812
+ declare function usesDefaultMessageListWallpaper(value: AXConversationMessageListBackground | undefined): boolean;
3813
+ /** Resolve config/metadata background for the active theme, with library default fallback. */
3814
+ declare function resolveMessageListBackgroundStyle(value: AXConversationMessageListBackground | undefined, isDark: boolean): string;
3815
+ /** Whether two stored backgrounds represent the same preset (supports legacy string values). */
3816
+ declare function isSameMessageListBackground(a: AXConversationMessageListBackground | undefined, b: AXConversationMessageListThemeBackground, isDark: boolean): boolean;
3817
+
3818
+ interface AXConversationForwardUserSortEntry {
3819
+ user: AXConversationParticipant;
3820
+ conversation?: AXConversation;
3821
+ }
3822
+ /** Default Font Awesome icon for group conversations without a custom avatar image. */
3823
+ declare const AX_CONVERSATION_DEFAULT_GROUP_ICON = "fa-light fa-users";
3824
+ /** Default Font Awesome icon for private/bot conversations without a custom avatar image. */
3825
+ declare const AX_CONVERSATION_DEFAULT_USER_ICON = "fa-light fa-user";
3826
+ /** True when the stored title is a placeholder, not a user-defined name. */
3827
+ declare function isGenericPrivateConversationTitle(title: string | undefined): boolean;
3828
+ /**
3829
+ * Find an existing private 1:1 conversation between the current user and a peer.
3830
+ * Matches conversations with exactly those two participants.
3831
+ */
3832
+ declare function findExistingPrivateConversation(conversations: AXConversation[], currentUserId: string, peerUserId: string): AXConversation | undefined;
3833
+ /**
3834
+ * Sort users for forward picker: existing private chats first (most recent on top), then others by name.
3835
+ */
3836
+ declare function sortUsersForForward(users: AXConversationParticipant[], conversations: AXConversation[], currentUserId: string): AXConversationParticipant[];
3837
+ /** Other participant in a private 1v1 chat (excludes the current viewer). */
3838
+ declare function resolvePrivatePeerParticipant(conversation: AXConversation, currentUserId?: string): AXConversationParticipant | undefined;
3839
+ /**
3840
+ * Resolves the display title for the current viewer.
3841
+ * Private and bot peer-scoped chats show the other participant's name when no custom title is set.
3842
+ */
3843
+ declare function resolveConversationTitleForViewer(conversation: AXConversation, currentUserId?: string): string;
3844
+ /**
3845
+ * Returns a viewer-scoped copy of a conversation with dynamic peer title/avatar/icon.
3846
+ * Does not mutate the source object.
3847
+ */
3848
+ declare function resolveConversationForViewer(conversation: AXConversation, currentUserId?: string): AXConversation;
3849
+ /** Whether message reactions are enabled for a conversation. Defaults to `true` when omitted. */
3850
+ declare function isConversationReactionsEnabled(conversation?: AXConversation | null): boolean;
3851
+
3852
+ /** Group and channel rooms share join/leave and creator-destroy rules. */
3853
+ declare function isGroupLikeConversation(conversationOrType: AXConversation | AXConversationType | undefined): boolean;
3854
+ /** True when `userId` created this room (falls back to owner/admin if `creatorId` is missing). */
3855
+ declare function isConversationRoomCreator(conversation: AXConversation, userId?: string): boolean;
3856
+ /** Earliest joiner; stable tie-break by participant id. */
3857
+ declare function pickEarliestJoinedParticipant(participants: AXConversationParticipant[]): AXConversationParticipant | undefined;
3858
+ /**
3859
+ * Whether a message should appear for a viewer after a one-sided history clear.
3860
+ * Exclusive: the cutoff instant itself is hidden (cleared "up to now").
3861
+ */
3862
+ declare function isMessageVisibleAfterHistoryCutoff(timestamp: Date | string | number, historyClearedAt?: Date | string | number | null): boolean;
3863
+
3864
+ /** Resolves typed `profile`, falling back to legacy `metadata.profile`. */
3865
+ declare function resolveParticipantProfile(participant?: AXConversationParticipant): AXConversationUserProfile;
3866
+
3867
+ type AXConversationDateSeparatorKind = 'today' | 'yesterday' | 'other';
3868
+ declare class AXConversationDateUtilsService {
3708
3869
  /**
3709
- * Background for the message list scroll area from config, or the built-in soft wash when unset/empty.
3710
- * Set `messageListBackground` to `transparent` or `none` for a flat look.
3711
- * Supports `{ light, dark }` for theme-specific backgrounds.
3870
+ * Format relative time (e.g., "2m ago", "1h ago")
3712
3871
  */
3713
- readonly messageListUsesDefaultWallpaper: _angular_core.Signal<boolean>;
3714
- readonly messageListWallpaperDark: _angular_core.Signal<boolean>;
3715
- readonly messageListBackgroundStyle: _angular_core.Signal<string>;
3716
- resolvedEmptyStateComponent(): Type<AXConversationMessageListEmptyComponent>;
3717
- /** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */
3718
- protected readonly noActiveFallbackComponent: typeof AXConversationMessageListNoActiveDefaultComponent;
3719
- private readonly timeouts;
3720
- readonly reactionPickerTarget: _angular_core.WritableSignal<string>;
3721
- readonly reactionPickerElement: _angular_core.WritableSignal<HTMLElement>;
3722
- readonly reactionPickerPlacement: _angular_core.WritableSignal<AXPlacement>;
3723
- readonly reactionPopover: _angular_core.Signal<any>;
3724
- /** Message id whose context menu is open (for active row styling). */
3725
- readonly contextMenuMessageId: _angular_core.WritableSignal<string>;
3726
- /** True while files are dragged over the message list drop zone. */
3727
- readonly messageListDragging: _angular_core.WritableSignal<boolean>;
3728
- /** True when the message list uses single-column adaptive layout (matches CSS container query). */
3729
- readonly isAdaptiveWideLayout: _angular_core.WritableSignal<boolean>;
3730
- /** While true, older history is being prepended — do not auto-scroll to the latest message. */
3731
- private restoringScrollAfterPrepend;
3732
- private adaptiveLayoutResizeObserver?;
3733
- readonly availableReactions: _angular_core.WritableSignal<string[]>;
3734
- private reactionsLoading;
3735
- private get registry();
3736
- /** Message list element reference */
3737
- private readonly messageListRef;
3738
- /** Messages container element reference */
3739
- private readonly messagesContainerRef;
3740
- /** Loading state - use service */
3741
- readonly loading: _angular_core.Signal<boolean>;
3742
- /** Loading more messages state - use service */
3743
- readonly loadingMore: _angular_core.WritableSignal<boolean>;
3744
- /** Whether older messages remain on the server */
3745
- readonly hasMoreMessages: _angular_core.Signal<boolean>;
3746
- /** Show scroll to bottom button - use service */
3747
- readonly showScrollButton: _angular_core.WritableSignal<boolean>;
3748
- /** Active conversation */
3749
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation.AXConversation>;
3750
- readonly isGroupConversation: _angular_core.Signal<boolean>;
3751
- /** Placeholder indices for the initial message list skeleton. */
3752
- protected readonly loadingSkeletonItems: readonly [0, 1, 2, 3, 4, 5];
3753
- /** Whether the active conversation allows message reactions. */
3754
- readonly reactionsEnabled: _angular_core.Signal<boolean>;
3755
- /** Messages */
3756
- readonly messages: _angular_core.Signal<AXConversationMessage[]>;
3757
- /** Message action event */
3758
- readonly messageAction: _angular_core.OutputEmitterRef<{
3759
- message: AXConversationMessage;
3760
- action: string;
3761
- }>;
3762
- /** Current user from service */
3763
- readonly currentUser: _angular_core.Signal<_acorex_components_conversation.AXConversationUser>;
3764
- /** Message grouped by date - use service */
3765
- readonly messageGroups: _angular_core.Signal<{
3766
- date: string;
3767
- dateLabel: string;
3768
- messages: AXConversationMessage[];
3769
- }[]>;
3770
- constructor();
3771
- private intersectionObserver?;
3772
- private readonly readIntersectionObserver;
3773
- private readonly observedReadMessageIds;
3872
+ static formatRelativeTime(date: Date): string;
3873
+ /** Resolve whether a message date should show Today, Yesterday, or a formatted date. */
3874
+ static getDateSeparatorKind(date: Date): AXConversationDateSeparatorKind;
3774
3875
  /**
3775
- * Setup intersection observer to mark messages as read when visible
3876
+ * Format date label for non-relative separators (localized calendar date).
3776
3877
  */
3777
- private setupIntersectionObserver;
3878
+ static formatDateLabel(date: Date, locale?: string): string;
3778
3879
  /**
3779
- * Mark message as read
3880
+ * Check if two dates are the same day
3780
3881
  */
3781
- private markMessageAsRead;
3782
- /** Get message CSS classes */
3783
- getMessageClasses(message: AXConversationMessage): string;
3784
- /** Get bubble CSS classes */
3785
- getBubbleClasses(message: AXConversationMessage): string;
3786
- /** Check if message is from current user */
3787
- isOwnMessage(message: AXConversationMessage): boolean;
3788
- /** Whether the avatar slot is rendered (visibility is CSS-controlled per layout mode). */
3789
- shouldRenderAvatar(message: AXConversationMessage): boolean;
3790
- /** Should show sender name */
3791
- shouldShowSenderName(message: AXConversationMessage): boolean;
3792
- /** Get sender name */
3793
- getSenderName(message: AXConversationMessage): string;
3794
- /** Get original sender name for forwarded messages */
3795
- getOriginalSenderName(message: AXConversationMessage): string;
3796
- /** Get forwarded text with sender and conversation info */
3797
- getForwardedText(message: AXConversationMessage): string;
3798
- /** Resolve renderer component for message */
3799
- getRendererComponent(message: AXConversationMessage): Type<_acorex_components_conversation.AXConversationMessageRendererComponent>;
3800
- /** Resolve lazy renderer loader for message */
3801
- private static readonly fallbackRendererLoader;
3802
- getRendererComponentLoader(message: AXConversationMessage): (() => Promise<Type<_acorex_components_conversation.AXConversationMessageRendererComponent>>) | (() => Promise<typeof _acorex_components_conversation.AXConversationFallbackRendererComponent>);
3803
- /** Provide inputs for the dynamic renderer */
3804
- getRendererInputs(message: AXConversationMessage): {
3805
- message: AXConversationMessage;
3806
- };
3807
- /** Get status icon */
3808
- getStatusIcon(message: AXConversationMessage): string;
3809
- /** Get status icon CSS classes */
3810
- getStatusIconClasses(message: AXConversationMessage): string;
3811
- /** Get status tooltip text */
3812
- getStatusTooltip(message: AXConversationMessage): string;
3813
- /** Get first unread message ID */
3814
- readonly firstUnreadMessageId: _angular_core.Signal<string>;
3815
- /** Get grouped reactions */
3816
- getGroupedReactions(message: AXConversationMessage): Array<{
3817
- emoji: string;
3818
- count: number;
3819
- userIds: string[];
3820
- hasReacted: boolean;
3821
- }>;
3822
- /** Get reaction tooltip text */
3823
- getReactionTooltip(reaction: {
3824
- emoji: string;
3825
- count: number;
3826
- userIds: string[];
3827
- hasReacted: boolean;
3828
- }): string;
3829
- /** Whether reactions can be shown or added for a message in the active conversation. */
3830
- messageSupportsReactions(message: AXConversationMessage): boolean;
3831
- /** Toggle reaction picker */
3832
- toggleReactionPicker(message: AXConversationMessage, event: MouseEvent): void;
3833
- /** Close reaction picker */
3834
- closeReactionPicker(): void;
3835
- /** Check if current user has reacted with specific emoji */
3836
- hasUserReacted(message: AXConversationMessage, emoji: string): boolean;
3837
- /** Check if current user has reacted with specific emoji by message ID */
3838
- hasUserReactedById(messageId: string, emoji: string): boolean;
3839
- /** Handle reaction click by message ID */
3840
- onReactionClickById(messageId: string, emoji: string): void;
3841
- /** Get message by ID */
3842
- getMessageById(messageId: string): AXConversationMessage | undefined;
3843
- /** Load available reactions when the picker is opened (session-cached in service). */
3844
- private ensureAvailableReactions;
3845
- /** Get message actions from registry */
3846
- getMessageActions(message: AXConversationMessage): _acorex_components_conversation.AXConversationMessageAction[];
3847
- /** Handle reaction click */
3848
- onReactionClick(message: AXConversationMessage, emoji: string): void;
3849
- /** Handle message action */
3850
- onMessageAction(message: AXConversationMessage, action: any): Promise<void>;
3851
- /** Handle scroll events */
3852
- onScroll(event: Event): void;
3853
- /** Handle infinite scroll threshold */
3854
- onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
3855
- /** Load older messages - delegate to service and preserve scroll anchor */
3856
- private loadOlderMessages;
3882
+ static isSameDay(date1: Date, date2: Date): boolean;
3857
3883
  /**
3858
- * Keep the user's viewport on the same messages after older rows are inserted above.
3884
+ * Get date key for grouping (YYYY-MM-DD)
3859
3885
  */
3860
- private restoreScrollPositionAfterPrepend;
3861
- /** Check if user is near bottom of scroll */
3862
- private isUserNearBottom;
3886
+ static getDateKey(date: Date): string;
3863
3887
  /**
3864
- * After switching chats, the template may still show loading (no #messagesContainer).
3865
- * Poll with rAF until the feed exists, then scroll after double rAF so scrollHeight is stable.
3888
+ * Format time (HH:MM)
3866
3889
  */
3867
- private scrollToBottomWhenContainerReady;
3868
- /** Scroll to bottom */
3869
- scrollToBottom(smooth?: boolean): void;
3870
- /** Scroll to specific message */
3871
- scrollToMessage(messageId: string): void;
3872
- /** Cleanup timeouts and observers on destroy */
3873
- ngOnDestroy(): void;
3874
- /** Get message preview text for reply */
3875
- getMessagePreviewText(message: AXConversationMessage): {
3876
- value: string;
3877
- type: string;
3878
- icon: string;
3879
- };
3880
- /** Get ARIA label for message */
3881
- getMessageAriaLabel(message: AXConversationMessage): string;
3882
- getDateSeparatorAriaLabel(dateLabel: string): string;
3883
- getReplyCount(message: AXConversationMessage): number;
3884
- getForwardCount(message: AXConversationMessage): number;
3885
- onMessageListDragEnter(): void;
3886
- onMessageListDragLeave(): void;
3887
- /** Open the matching composer picker popup when files are dropped on the message list. */
3888
- onMessageListFilesDropped(event: AXUploaderFileChangeEvent): Promise<void>;
3889
- private composerPickerDeps;
3890
- /** Handle context menu opening for messages */
3891
- handleMessageContextMenuOpening(event: AXContextMenuOpeningEvent, message: AXConversationMessage): void;
3892
- /** Handle context menu item click for messages */
3893
- handleMessageContextMenuItemClick(event: AXContextMenuItemsClickEvent, message: AXConversationMessage): void;
3894
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationMessageListComponent, never>;
3895
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationMessageListComponent, "ax-conversation-message-list", never, {}, { "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>;
3890
+ static formatTime(date: Date): string;
3896
3891
  }
3897
3892
 
3898
- declare class AXConversationMessageListService {
3899
- private readonly conversationService;
3900
- private get registry();
3901
- readonly activeConversation: _angular_core.Signal<_acorex_components_conversation.AXConversation>;
3902
- readonly activeMessages: _angular_core.Signal<AXConversationMessage[]>;
3903
- readonly currentUser: _angular_core.Signal<_acorex_components_conversation.AXConversationUser>;
3904
- /** Initial message history load (conversation switch) */
3905
- readonly loading: _angular_core.Signal<boolean>;
3906
- /** Loading older messages (scroll-up pagination) */
3907
- readonly loadingMore: _angular_core.WritableSignal<boolean>;
3908
- /** Whether older messages can be loaded */
3909
- readonly hasMoreMessages: _angular_core.Signal<boolean>;
3910
- /** Show scroll to bottom button */
3911
- readonly showScrollButton: _angular_core.WritableSignal<boolean>;
3912
- /** Scroll requests counter */
3913
- readonly scrollRequests: _angular_core.WritableSignal<number>;
3914
- /** Live renderer instances keyed by message id (for message actions). */
3915
- private readonly _rendererInstances;
3916
- /**
3917
- * Reply counts merged from API fields and loaded messages.
3918
- */
3919
- readonly replyCounts: _angular_core.Signal<Map<string, number>>;
3893
+ /**
3894
+ * Message Utilities Service
3895
+ * Helper functions for message formatting and display
3896
+ */
3897
+
3898
+ /** Position of a message inside a consecutive same-sender cluster (Telegram grouping). */
3899
+ type AXConversationMessageClusterRole = 'single' | 'start' | 'middle' | 'end';
3900
+ declare class AXConversationMessageUtilsService {
3901
+ static getInitials(name: string): string;
3902
+ static getMessageText(message: AXConversationMessage): string;
3903
+ static getPreviewText(message: AXConversationMessage, maxLength?: number): {
3904
+ value: string;
3905
+ type: string;
3906
+ icon: string;
3907
+ };
3908
+ static isOwnMessage(message: AXConversationMessage, currentUserId: string): boolean;
3909
+ static getSenderName(message: AXConversationMessage, conversation: AXConversation): string;
3910
+ static getSenderAvatar(message: AXConversationMessage, conversation: AXConversation): string | undefined;
3911
+ static getSenderAvatarIcon(message: AXConversationMessage, conversation: AXConversation): string | undefined;
3912
+ static getConversationAvatar(conversation: AXConversation): string | undefined;
3913
+ static getConversationAvatarIcon(conversation: AXConversation): string | undefined;
3914
+ static getConversationStatus(conversation: AXConversation, presence?: AXConversationUserPresence): AXConversationPresenceStatus | undefined;
3915
+ /** Consecutive same-sender messages within this window share one Telegram-style cluster. */
3916
+ static readonly MESSAGE_CLUSTER_MAX_GAP_MS: number;
3917
+ /** Palette of existing theme tokens used to color group sender names (not bubble chrome). */
3918
+ private static readonly SENDER_NAME_COLORS;
3919
+ static toTimestampMs(value: Date | string | number): number;
3920
+ static shouldGroupMessages(message: AXConversationMessage, previousMessage?: AXConversationMessage): boolean;
3921
+ static getMessageClusterRole(message: AXConversationMessage, previousMessage?: AXConversationMessage, nextMessage?: AXConversationMessage): AXConversationMessageClusterRole;
3922
+ static getSenderNameColor(senderId: string): string;
3923
+ static getUserPresenceStatus(presence?: AXConversationUserPresence): AXConversationPresenceStatus | undefined;
3924
+ static getTypingText(conversation: AXConversation, typingUserIds: string[]): string;
3925
+ static formatLastSeen(date: Date): string;
3926
+ static getPrivateChatSubtitle(conversation: AXConversation, presence?: AXConversationUserPresence, currentUserId?: string): string;
3927
+ static getConversationSubtitle(conversation: AXConversation, options?: {
3928
+ typingUserIds?: string[];
3929
+ peerPresence?: AXConversationUserPresence;
3930
+ currentUserId?: string;
3931
+ }): string;
3932
+ }
3933
+
3934
+ /**
3935
+ * Conversation feature flags for configurable bundle size.
3936
+ */
3937
+ type AXConversationComposerTabFeature = 'emoji' | 'sticker';
3938
+ interface AXConversationFeatures {
3939
+ /** Enabled built-in composer popup tabs (`emoji`, `sticker`). Defaults to none when omitted. */
3940
+ composerTabs?: AXConversationComposerTabFeature[];
3941
+ }
3942
+ declare function resolveConversationComposerTabs(features?: AXConversationFeatures): readonly AXConversationComposerTabFeature[];
3943
+ declare function isComposerTabEnabled(tab: AXConversationComposerTabFeature, features?: AXConversationFeatures): boolean;
3944
+
3945
+ /**
3946
+ * Conversation Configuration Interface
3947
+ * Centralized configuration values to avoid magic numbers
3948
+ */
3949
+ /**
3950
+ * Sidebar conversation tabs layout.
3951
+ * - `vertical`: horizontal tab strip above the conversation list.
3952
+ * - `horizontal`: vertical tab strip at inline-start beside the list (`ax-tabs` location `start`).
3953
+ */
3954
+ type AXConversationSidebarTabsOrientation = 'vertical' | 'horizontal';
3955
+ /**
3956
+ * Main configuration interface for the conversation component
3957
+ */
3958
+ interface AXConversationConfig {
3959
+ /** Number of messages to load per page */
3960
+ messagePageSize?: number;
3961
+ /** Number of conversations to load per page */
3962
+ conversationPageSize?: number;
3963
+ /** Scroll threshold for detecting scroll events */
3964
+ scrollThreshold?: number;
3965
+ /** Infinite scroll threshold */
3966
+ infiniteScrollThreshold?: number;
3967
+ /** Typing indicator timeout in milliseconds */
3968
+ typingIndicatorTimeout?: number;
3969
+ /** Typing indicator emit throttle in milliseconds while composing (default: 3000) */
3970
+ typingIndicatorThrottle?: number;
3971
+ /** How long to show received typing indicators in the UI (default: 4000) */
3972
+ typingDisplayDuration?: number;
3973
+ /** Message highlight duration in milliseconds */
3974
+ messageHighlightDuration?: number;
3975
+ /** Search debounce delay in milliseconds */
3976
+ debounceSearch?: number;
3977
+ /** Maximum messages per conversation */
3978
+ maxMessagesPerConversation?: number;
3979
+ /** Maximum total messages in store */
3980
+ maxTotalMessages?: number;
3981
+ /** Maximum cached conversations */
3982
+ maxCachedConversations?: number;
3983
+ /** Minimum sidebar width in pixels */
3984
+ minSidebarWidth?: number;
3985
+ /** Maximum sidebar width in pixels */
3986
+ maxSidebarWidth?: number;
3987
+ /** Default sidebar width in pixels */
3988
+ defaultSidebarWidth?: number;
3920
3989
  /**
3921
- * Forward counts merged from API fields and loaded messages.
3990
+ * Sidebar conversation tabs layout.
3991
+ * `vertical` places a horizontal tab strip above the list; `horizontal` places a vertical tab strip at inline-start beside the list.
3922
3992
  */
3923
- readonly forwardCounts: _angular_core.Signal<Map<string, number>>;
3924
- registerRendererInstance(messageId: string, instance: AXConversationMessageRendererComponent): void;
3925
- unregisterRendererInstance(messageId: string): void;
3926
- getRendererInstance(messageId: string): AXConversationMessageRendererComponent | undefined;
3927
- getReplyCount(messageId: string): number;
3928
- getForwardCount(messageId: string): number;
3929
- /** Message grouped by date */
3930
- readonly messageGroups: _angular_core.Signal<{
3931
- date: string;
3932
- dateLabel: string;
3933
- messages: AXConversationMessage[];
3934
- }[]>;
3993
+ sidebarTabsOrientation?: AXConversationSidebarTabsOrientation;
3994
+ /** Maximum message length in characters */
3995
+ maxMessageLength?: number;
3996
+ /** Minimum message length in characters */
3997
+ minMessageLength?: number;
3998
+ /** Max attachments per message when a composer action omits `maxFiles`. */
3999
+ maxFilesPerMessage?: number;
4000
+ /** Threshold for marking messages as read (0.0 to 1.0, default: 0.3) */
4001
+ messageReadThreshold?: number;
4002
+ /** Debounce window (ms) before flushing batched read-receipt API calls (default: 3000) */
4003
+ messageReadDebounce?: number;
3935
4004
  /**
3936
- * Load older messages when the user scrolls near the top.
4005
+ * When true, marks the whole conversation as read once when it is selected (single API call).
4006
+ * Per-message intersection observer still handles new messages received while the chat is open.
3937
4007
  */
3938
- loadMoreMessages(): Promise<boolean>;
4008
+ markConversationReadOnSelect?: boolean;
3939
4009
  /**
3940
- * Reset pagination when switching conversations (page 0 is loaded by {@link AXConversationService.selectConversation}).
4010
+ * CSS `background` for the message list (`ax-conversation-message-list` area, all states: loading, empty, messages).
4011
+ * Use full shorthand, or a bare `https://...` / `/path/to.png` (wrapped as `url(...)` with `center/cover`).
4012
+ * Pass a string for the same value in both themes, or `{ light, dark }` for theme-specific backgrounds.
4013
+ * Empty string = Telegram-inspired theme-aware library default (`{ light, dark }`). `transparent` or `none` = flat background.
3941
4014
  */
3942
- resetPagination(): void;
3943
- getMenuActions(message: AXConversationMessage): _acorex_components_conversation.AXConversationMessageAction[];
3944
- executeAction(message: AXConversationMessage, actionId: string): Promise<void>;
3945
- reactToMessage(messageId: string, emoji: string): Promise<void>;
3946
- /** Request message list to scroll to bottom */
3947
- requestScrollToBottom(): void;
3948
- private buildCountMap;
3949
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationMessageListService, never>;
3950
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationMessageListService>;
4015
+ messageListBackground?: AXConversationMessageListBackground;
4016
+ /** Optional feature flags to reduce bundle size per app. */
4017
+ features?: AXConversationFeatures;
4018
+ /** Log API calls made by AXConversationService to the console (default: false). */
4019
+ debugApiLogging?: boolean;
3951
4020
  }
3952
4021
 
3953
- declare class AXConversationAvatarPickerComponent {
3954
- readonly fileInput: _angular_core.Signal<ElementRef<HTMLInputElement>>;
3955
- readonly showClearButton: _angular_core.InputSignal<boolean>;
3956
- readonly avatarUrl: _angular_core.ModelSignal<string>;
3957
- readonly onFileSelected: _angular_core.OutputEmitterRef<string>;
3958
- triggerFileInput(): void;
3959
- onFileInputChange(event: Event): Promise<void>;
3960
- clearAvatar(): void;
3961
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAvatarPickerComponent, never>;
3962
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAvatarPickerComponent, "ax-conversation-avatar-picker", never, { "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "avatarUrl": { "alias": "avatarUrl"; "required": false; "isSignal": true; }; }, { "avatarUrl": "avatarUrlChange"; "onFileSelected": "onFileSelected"; }, never, never, true, never>;
3963
- }
4022
+ /**
4023
+ * Default Configuration Values
4024
+ * Centralized defaults to avoid magic numbers throughout the codebase
4025
+ */
4026
+
4027
+ /**
4028
+ * Default conversation configuration
4029
+ * All values are explicitly defined here for easy maintenance and documentation
4030
+ */
4031
+ declare const AX_DEFAULT_CONVERSATION_CONFIG: Required<AXConversationConfig>;
4032
+ /**
4033
+ * Helper function to merge user config with defaults
4034
+ * Properly handles array merging to avoid reference issues
4035
+ * @param userConfig - User-provided configuration
4036
+ * @returns Merged configuration with all required fields
4037
+ */
4038
+ declare function mergeWithDefaults(userConfig?: Partial<AXConversationConfig>): Required<AXConversationConfig>;
4039
+
4040
+ /**
4041
+ * Dependency Injection Tokens
4042
+ * InjectionTokens for configuration and dependencies
4043
+ */
4044
+
4045
+ /**
4046
+ * Configuration token for conversation component
4047
+ * Uses centralized defaults from AX_DEFAULT_CONVERSATION_CONFIG
4048
+ */
4049
+ declare const AX_CONVERSATION_CONFIG: InjectionToken<Required<AXConversationConfig>>;
4050
+ /**
4051
+ * Token for configuring AXConversationErrorHandlerService
4052
+ */
4053
+ declare const AX_CONVERSATION_ERROR_HANDLER_CONFIG: InjectionToken<Partial<AXConversationErrorHandlerConfig>>;
3964
4054
 
3965
4055
  /**
3966
4056
  * Pluggable avatar components for the conversation UI.
@@ -3998,467 +4088,823 @@ interface AXConversationAvatarComponents {
3998
4088
  conversation?: Type<AXConversationConversationAvatarComponent>;
3999
4089
  }
4000
4090
 
4001
- declare class AXConversationAvatarComponent {
4002
- private readonly conversationService;
4003
- private readonly userAvatarComponent;
4004
- private readonly conversationAvatarComponent;
4005
- readonly kind: _angular_core.InputSignal<AXConversationAvatarKind>;
4006
- readonly userId: _angular_core.InputSignal<string>;
4007
- readonly conversation: _angular_core.InputSignal<AXConversation>;
4008
- readonly message: _angular_core.InputSignal<AXConversationMessage>;
4009
- readonly size: _angular_core.InputSignal<number>;
4010
- readonly showStatus: _angular_core.InputSignal<boolean>;
4011
- readonly name: _angular_core.InputSignal<string>;
4012
- readonly avatar: _angular_core.InputSignal<string>;
4013
- readonly icon: _angular_core.InputSignal<string>;
4014
- private readonly currentUserId;
4015
- readonly resolvedKind: _angular_core.Signal<"user" | "conversation">;
4016
- readonly resolvedUserId: _angular_core.Signal<string>;
4017
- readonly customComponent: _angular_core.Signal<Type<unknown>>;
4018
- readonly customInputs: _angular_core.Signal<Record<string, unknown>>;
4019
- readonly filteredCustomInputs: _angular_core.Signal<Record<string, unknown>>;
4020
- readonly fallbackDisplay: _angular_core.Signal<{
4021
- name: string;
4022
- avatar: string;
4023
- icon: string;
4024
- }>;
4025
- readonly fallbackInitials: _angular_core.Signal<string>;
4026
- readonly resolvedStatus: _angular_core.Signal<_acorex_components_conversation.AXConversationPresenceStatus>;
4027
- readonly statusBadgePresence: _angular_core.Signal<"online" | "offline" | "away" | "busy">;
4028
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAvatarComponent, never>;
4029
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAvatarComponent, "ax-conversation-avatar", never, { "kind": { "alias": "kind"; "required": false; "isSignal": true; }; "userId": { "alias": "userId"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "showStatus": { "alias": "showStatus"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "avatar": { "alias": "avatar"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4030
- }
4031
-
4032
- interface AXConversationRegistryComponentRef {
4033
- component?: Type<unknown>;
4034
- componentLoader?: () => Promise<Type<unknown>>;
4035
- }
4036
- declare class AXConversationRegistryComponentOutletComponent {
4037
- readonly component: _angular_core.InputSignal<Type<unknown>>;
4038
- readonly componentLoader: _angular_core.InputSignal<() => Promise<Type<unknown>>>;
4039
- readonly inputs: _angular_core.InputSignal<Record<string, unknown>>;
4040
- readonly resolvedComponent: _angular_core.WritableSignal<Type<unknown>>;
4041
- /** Avoid re-loading when the parent re-binds the same lazy loader reference. */
4042
- private activeLoader;
4043
- constructor();
4044
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationRegistryComponentOutletComponent, never>;
4045
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationRegistryComponentOutletComponent, "ax-conversation-registry-component-outlet", never, { "component": { "alias": "component"; "required": false; "isSignal": true; }; "componentLoader": { "alias": "componentLoader"; "required": false; "isSignal": true; }; "inputs": { "alias": "inputs"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4046
- }
4047
- /** Resolve a registry component reference, preferring lazy loaders when provided. */
4048
- declare function hasRegistryComponent(ref?: AXConversationRegistryComponentRef): boolean;
4091
+ /**
4092
+ * Registry Configuration Tokens
4093
+ * Injection tokens for configuring default registry values
4094
+ */
4049
4095
 
4050
- declare class AXConversationSidebarService {
4051
- private readonly conversationService;
4052
- constructor();
4053
- private get registry();
4054
- readonly searchQuery: _angular_core.WritableSignal<string>;
4055
- readonly activeTabId: _angular_core.WritableSignal<string>;
4056
- readonly loadingMore: _angular_core.WritableSignal<boolean>;
4057
- readonly conversations: _angular_core.Signal<AXConversation[]>;
4058
- readonly loading: _angular_core.Signal<boolean>;
4059
- readonly hasMoreConversations: _angular_core.Signal<boolean>;
4060
- readonly enabledTabs: _angular_core.Signal<_acorex_components_conversation.AXConversationTab[]>;
4061
- readonly filteredConversations: _angular_core.Signal<AXConversation[]>;
4062
- /**
4063
- * Filter and sort conversations
4064
- */
4065
- private filterAndSort;
4066
- setSearchQuery(q: string): void;
4067
- setActiveTab(tabId: string): void;
4068
- selectConversation(conversation: AXConversation): void;
4069
- getBadgeValue(tabId: string): string | undefined;
4070
- /**
4071
- * Load more conversations when the user scrolls near the bottom of the sidebar list.
4072
- */
4073
- loadMoreConversations(): Promise<void>;
4074
- /**
4075
- * Handle scroll threshold (for infinite scroll)
4076
- */
4077
- onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
4078
- /**
4079
- * Reload conversation list from the first page (e.g. pull-to-refresh).
4080
- */
4081
- reloadConversations(): Promise<void>;
4082
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationSidebarService, never>;
4083
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationSidebarService>;
4084
- }
4085
-
4086
- declare class AXConversationSidebarComponent implements OnDestroy {
4087
- readonly sidebar: AXConversationSidebarService;
4088
- protected readonly config: Required<_acorex_components_conversation.AXConversationConfig>;
4089
- private readonly conversationService;
4090
- private readonly popupService;
4091
- private readonly translation;
4092
- private readonly ngZone;
4093
- private readonly cdr;
4094
- /** Conversation selected event */
4095
- readonly conversationSelected: _angular_core.OutputEmitterRef<AXConversation>;
4096
- /** Search debouncing */
4097
- private readonly searchSubject;
4098
- /** Derived state for template */
4099
- readonly enabledTabs: _angular_core.Signal<_acorex_components_conversation.AXConversationTab[]>;
4100
- readonly filteredConversations: _angular_core.Signal<AXConversation[]>;
4101
- readonly loading: _angular_core.Signal<boolean>;
4102
- readonly loadingMore: _angular_core.WritableSignal<boolean>;
4103
- readonly hasMoreConversations: _angular_core.Signal<boolean>;
4104
- readonly isSidebarTabsHorizontal: _angular_core.Signal<boolean>;
4105
- readonly sidebarTabLocation: _angular_core.Signal<AXTabLocation>;
4106
- constructor();
4107
- /** Handle search input change with debouncing */
4108
- onSearchChange(value: string): void;
4109
- /** Handle tab change from ax-tabs */
4110
- onTabChange(event: {
4111
- tab?: {
4112
- key?: string;
4113
- };
4114
- }): void;
4115
- /** Select a conversation */
4116
- selectConversation(conversation: AXConversation): void;
4117
- /** Get badge value for tab */
4118
- getBadgeValue(tabId: string): string | undefined;
4119
- getTabLabel(tabId: string): string;
4120
- openNewConversationPopup(): Promise<void>;
4121
- /** Handle infinite scroll threshold - delegate to service */
4122
- onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
4123
- /** Cleanup on destroy */
4124
- ngOnDestroy(): void;
4125
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationSidebarComponent, never>;
4126
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationSidebarComponent, "ax-conversation-sidebar", never, {}, { "conversationSelected": "conversationSelected"; }, never, ["ax-suffix"], true, never>;
4127
- }
4128
-
4129
- type AXConversationNewWizardStep = 'selectUsers' | 'groupDetails';
4130
- declare class AXConversationNewDialogComponent extends AXBasePageComponent {
4131
- /**
4132
- * Assigned by {@link AXPopupComponent} from `open(..., { data: { conversationService } })`.
4133
- * Not injected: popup content is created on the root view container, so route-scoped providers
4134
- * would not see the same `AXConversationService` instance as the conversation feature.
4135
- */
4136
- conversationService: AXConversationService;
4137
- private readonly toastService;
4138
- private readonly translation;
4139
- private readonly config;
4140
- private readonly destroyRef;
4141
- private searchDebounceTimer?;
4142
- constructor();
4096
+ /**
4097
+ * Additional message renderers configuration
4098
+ * Provide this token to add custom message renderers in addition to built-in ones
4099
+ * Note: Built-in renderers (text, system, fallback) are registered by default; other types are provided via plugins/constants.
4100
+ */
4101
+ declare const AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS: InjectionToken<AXConversationMessageRenderer[]>;
4102
+ /**
4103
+ * Default message actions configuration
4104
+ * Provide this token to override default message actions
4105
+ */
4106
+ declare const AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS: InjectionToken<AXConversationMessageAction[]>;
4107
+ /**
4108
+ * Default composer tabs configuration
4109
+ * Provide this token to override default composer tabs (emoji, stickers, etc.)
4110
+ */
4111
+ declare const AX_CONVERSATION_DEFAULT_COMPOSER_TABS: InjectionToken<AXConversationComposerTab[]>;
4112
+ /**
4113
+ * Default composer actions configuration
4114
+ * Provide this token to override default composer actions (attach, voice, etc.)
4115
+ */
4116
+ declare const AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS: InjectionToken<AXConversationComposerAction[]>;
4117
+ /**
4118
+ * Default conversation tabs configuration
4119
+ * Provide this token to override default conversation tabs (all, private, groups, etc.)
4120
+ */
4121
+ declare const AX_CONVERSATION_DEFAULT_CONVERSATION_TABS: InjectionToken<AXConversationTab[]>;
4122
+ /**
4123
+ * Default info bar actions configuration
4124
+ * Provide this token to override default info bar actions (mute, archive, block, etc.)
4125
+ */
4126
+ declare const AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS: InjectionToken<AXConversationInfoBarAction[]>;
4127
+ /**
4128
+ * Default conversation item actions configuration
4129
+ * Provide this token to override default conversation item actions (mute, delete, archive, etc.)
4130
+ */
4131
+ declare const AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS: InjectionToken<AXConversationItemAction[]>;
4132
+ /**
4133
+ * Registry configuration interface
4134
+ */
4135
+ interface AXConversationRegistryConfiguration {
4143
4136
  /**
4144
- * Injected by {@link AXPopupComponent} when this dialog is opened via {@link AXPopupService}.
4145
- * Required for `setTitle` / dynamic header — {@link AXBasePageComponent#setTitle} is otherwise unset.
4137
+ * Additional message renderers to register (built-in renderers are automatic).
4138
+ * Each {@link AXConversationMessageRenderer} may include optional `composerActions` for co-located send UX.
4146
4139
  */
4147
- readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
4148
- readonly availableUsers: _angular_core.WritableSignal<AXConversationParticipant[]>;
4149
- readonly selectedUserIds: _angular_core.WritableSignal<string[]>;
4150
- readonly groupTitle: _angular_core.WritableSignal<string>;
4151
- readonly groupAvatar: _angular_core.WritableSignal<string>;
4152
- readonly searchQuery: _angular_core.WritableSignal<string>;
4153
- readonly creating: _angular_core.WritableSignal<boolean>;
4154
- /** For 2+ users: step 1 = pick users, step 2 = title + avatar. */
4155
- readonly wizardStep: _angular_core.WritableSignal<AXConversationNewWizardStep>;
4156
- readonly showUserPickerStep: _angular_core.Signal<boolean>;
4157
- readonly showGroupDetailsStep: _angular_core.Signal<boolean>;
4158
- readonly showNextButton: _angular_core.Signal<boolean>;
4159
- readonly showGroupBackButton: _angular_core.Signal<boolean>;
4160
- readonly showCreateButton: _angular_core.Signal<boolean>;
4161
- readonly canGoNextToGroupDetails: _angular_core.Signal<boolean>;
4162
- readonly canCreate: _angular_core.Signal<boolean>;
4163
- private readonly _resetWizardWhenSingleEffect;
4164
- private readonly _syncPopupTitleEffect;
4165
- readonly usersListEmptyTpl: _angular_core.Signal<TemplateRef<unknown>>;
4166
- readonly usersListLoadingTpl: _angular_core.Signal<TemplateRef<unknown>>;
4167
- readonly usersList: _angular_core.Signal<AXListComponent>;
4168
- readonly usersListDataSource: AXDataSource<unknown>;
4169
- onCancel(): void;
4170
- onSelectedUsersChange(ids: string[]): void;
4171
- onNextToGroupDetails(): void;
4172
- onBackFromGroupDetails(): void;
4173
- onSearchChange(value: string): void;
4174
- isUserSelected(id: string): boolean;
4175
- userFromItem(item: unknown): AXConversationParticipant | null;
4176
- private mergeUsersCache;
4177
- onCreateConversation(): Promise<void>;
4178
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationNewDialogComponent, never>;
4179
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationNewDialogComponent, "ax-conversation-new-dialog", never, { "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4140
+ messageRenderers?: AXConversationMessageRenderer[];
4141
+ /** Message actions to register by default */
4142
+ messageActions?: AXConversationMessageAction[];
4143
+ /** Composer tabs to register by default */
4144
+ composerTabs?: AXConversationComposerTab[];
4145
+ /** Composer actions to register by default */
4146
+ composerActions?: AXConversationComposerAction[];
4147
+ /** Conversation tabs to register by default */
4148
+ conversationTabs?: AXConversationTab[];
4149
+ /** Info bar actions to register by default */
4150
+ infoBarActions?: AXConversationInfoBarAction[];
4151
+ /** Conversation item actions to register by default */
4152
+ conversationItemActions?: AXConversationItemAction[];
4180
4153
  }
4154
+ /**
4155
+ * Complete registry configuration token
4156
+ * Provide this for comprehensive registry configuration
4157
+ */
4158
+ declare const AX_CONVERSATION_REGISTRY_CONFIG: InjectionToken<AXConversationRegistryConfiguration>;
4181
4159
 
4182
- declare class AXConversationInfiniteScrollDirective {
4183
- private readonly elementRef;
4184
- private readonly platformId;
4185
- /** Threshold in pixels from the edge to trigger the event */
4186
- readonly threshold: _angular_core.InputSignal<number>;
4187
- /** Which edge to watch: 'top', 'bottom', or 'both' */
4188
- readonly edge: _angular_core.InputSignal<"top" | "bottom" | "both">;
4189
- /** When true, scroll events are ignored (e.g. while a page is loading). */
4190
- readonly scrollDisabled: _angular_core.InputSignal<boolean>;
4191
- /** Minimum time between emissions (ms) to avoid duplicate API calls. */
4192
- readonly cooldownMs: _angular_core.InputSignal<number>;
4193
- /** Event emitted when scrolling reaches the threshold */
4194
- readonly scrollThreshold: _angular_core.OutputEmitterRef<"top" | "bottom">;
4195
- private lastScrollTop;
4196
- private ticking;
4197
- private lastEmitAt;
4198
- private pendingEmit;
4199
- constructor();
4200
- private setupScrollListener;
4201
- private handleScroll;
4202
- private emitThreshold;
4203
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationInfiniteScrollDirective, never>;
4204
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXConversationInfiniteScrollDirective, "[axInfiniteScroll]", never, { "threshold": { "alias": "threshold"; "required": false; "isSignal": true; }; "edge": { "alias": "edge"; "required": false; "isSignal": true; }; "scrollDisabled": { "alias": "scrollDisabled"; "required": false; "isSignal": true; }; "cooldownMs": { "alias": "cooldownMs"; "required": false; "isSignal": true; }; }, { "scrollThreshold": "scrollThreshold"; }, never, never, true, never>;
4205
- }
4160
+ /**
4161
+ * Validation Utilities
4162
+ * Centralized validation functions for messages and user input
4163
+ */
4206
4164
 
4207
4165
  /**
4208
- * Conversation feature flags for configurable bundle size.
4166
+ * Validation result interface
4209
4167
  */
4210
- type AXConversationComposerTabFeature = 'emoji' | 'sticker';
4211
- interface AXConversationFeatures {
4212
- /** Enabled built-in composer popup tabs (`emoji`, `sticker`). Defaults to none when omitted. */
4213
- composerTabs?: AXConversationComposerTabFeature[];
4168
+ interface AXConversationValidationResult {
4169
+ /** Whether validation passed */
4170
+ valid: boolean;
4171
+ /** Error message if validation failed */
4172
+ error?: string;
4173
+ /** Error code for programmatic handling */
4174
+ errorCode?: string;
4214
4175
  }
4215
- declare function resolveConversationComposerTabs(features?: AXConversationFeatures): readonly AXConversationComposerTabFeature[];
4216
- declare function isComposerTabEnabled(tab: AXConversationComposerTabFeature, features?: AXConversationFeatures): boolean;
4217
-
4218
4176
  /**
4219
- * Conversation Configuration Interface
4220
- * Centralized configuration values to avoid magic numbers
4177
+ * Validate message text content
4178
+ * @param text - Text to validate
4179
+ * @param config - Configuration for validation rules
4180
+ * @returns Validation result
4221
4181
  */
4182
+ declare function validateMessageText(text: string | undefined, config: AXConversationConfig): AXConversationValidationResult;
4222
4183
  /**
4223
- * Sidebar conversation tabs layout.
4224
- * - `vertical`: horizontal tab strip above the conversation list.
4225
- * - `horizontal`: vertical tab strip at inline-start beside the list (`ax-tabs` location `start`).
4184
+ * Validate conversation ID
4185
+ * @param conversationId - Conversation ID to validate
4186
+ * @returns Validation result
4226
4187
  */
4227
- type AXConversationSidebarTabsOrientation = 'vertical' | 'horizontal';
4188
+ declare function validateConversationId(conversationId: string | undefined): AXConversationValidationResult;
4228
4189
  /**
4229
- * Main configuration interface for the conversation component
4190
+ * Validate message type
4191
+ * @param type - Message type to validate
4192
+ * @returns Validation result
4230
4193
  */
4231
- interface AXConversationConfig {
4232
- /** Number of messages to load per page */
4233
- messagePageSize?: number;
4234
- /** Number of conversations to load per page */
4235
- conversationPageSize?: number;
4236
- /** Scroll threshold for detecting scroll events */
4237
- scrollThreshold?: number;
4238
- /** Infinite scroll threshold */
4239
- infiniteScrollThreshold?: number;
4240
- /** Typing indicator timeout in milliseconds */
4241
- typingIndicatorTimeout?: number;
4242
- /** Typing indicator emit throttle in milliseconds while composing (default: 3000) */
4243
- typingIndicatorThrottle?: number;
4244
- /** How long to show received typing indicators in the UI (default: 4000) */
4245
- typingDisplayDuration?: number;
4246
- /** Message highlight duration in milliseconds */
4247
- messageHighlightDuration?: number;
4248
- /** Search debounce delay in milliseconds */
4249
- debounceSearch?: number;
4250
- /** Maximum messages per conversation */
4251
- maxMessagesPerConversation?: number;
4252
- /** Maximum total messages in store */
4253
- maxTotalMessages?: number;
4254
- /** Maximum cached conversations */
4255
- maxCachedConversations?: number;
4256
- /** Minimum sidebar width in pixels */
4257
- minSidebarWidth?: number;
4258
- /** Maximum sidebar width in pixels */
4259
- maxSidebarWidth?: number;
4260
- /** Default sidebar width in pixels */
4261
- defaultSidebarWidth?: number;
4262
- /**
4263
- * Sidebar conversation tabs layout.
4264
- * `vertical` places a horizontal tab strip above the list; `horizontal` places a vertical tab strip at inline-start beside the list.
4265
- */
4266
- sidebarTabsOrientation?: AXConversationSidebarTabsOrientation;
4267
- /** Maximum message length in characters */
4268
- maxMessageLength?: number;
4269
- /** Minimum message length in characters */
4270
- minMessageLength?: number;
4271
- /** Max attachments per message when a composer action omits `maxFiles`. */
4272
- maxFilesPerMessage?: number;
4273
- /** Threshold for marking messages as read (0.0 to 1.0, default: 0.3) */
4274
- messageReadThreshold?: number;
4275
- /** Debounce window (ms) before flushing batched read-receipt API calls (default: 3000) */
4276
- messageReadDebounce?: number;
4277
- /**
4278
- * When true, marks the whole conversation as read once when it is selected (single API call).
4279
- * Per-message intersection observer still handles new messages received while the chat is open.
4280
- */
4281
- markConversationReadOnSelect?: boolean;
4282
- /**
4283
- * CSS `background` for the message list (`ax-conversation-message-list` area, all states: loading, empty, messages).
4284
- * Use full shorthand, or a bare `https://...` / `/path/to.png` (wrapped as `url(...)` with `center/cover`).
4285
- * Pass a string for the same value in both themes, or `{ light, dark }` for theme-specific backgrounds.
4286
- * Empty string = Telegram-inspired theme-aware library default (`{ light, dark }`). `transparent` or `none` = flat background.
4287
- */
4288
- messageListBackground?: AXConversationMessageListBackground;
4289
- /** Optional feature flags to reduce bundle size per app. */
4290
- features?: AXConversationFeatures;
4291
- /** Log API calls made by AXConversationService to the console (default: false). */
4292
- debugApiLogging?: boolean;
4293
- }
4294
-
4295
- /**
4296
- * Default Configuration Values
4297
- * Centralized defaults to avoid magic numbers throughout the codebase
4298
- */
4299
-
4300
- /**
4301
- * Default conversation configuration
4302
- * All values are explicitly defined here for easy maintenance and documentation
4303
- */
4304
- declare const AX_DEFAULT_CONVERSATION_CONFIG: Required<AXConversationConfig>;
4305
- /**
4306
- * Helper function to merge user config with defaults
4307
- * Properly handles array merging to avoid reference issues
4308
- * @param userConfig - User-provided configuration
4309
- * @returns Merged configuration with all required fields
4310
- */
4311
- declare function mergeWithDefaults(userConfig?: Partial<AXConversationConfig>): Required<AXConversationConfig>;
4312
-
4313
- /**
4314
- * Dependency Injection Tokens
4315
- * InjectionTokens for configuration and dependencies
4316
- */
4317
-
4318
- /**
4319
- * Configuration token for conversation component
4320
- * Uses centralized defaults from AX_DEFAULT_CONVERSATION_CONFIG
4321
- */
4322
- declare const AX_CONVERSATION_CONFIG: InjectionToken<Required<AXConversationConfig>>;
4323
- /**
4324
- * Token for configuring AXConversationErrorHandlerService
4325
- */
4326
- declare const AX_CONVERSATION_ERROR_HANDLER_CONFIG: InjectionToken<Partial<AXConversationErrorHandlerConfig>>;
4327
-
4328
- /**
4329
- * Registry Configuration Tokens
4330
- * Injection tokens for configuring default registry values
4331
- */
4332
-
4333
- /**
4334
- * Additional message renderers configuration
4335
- * Provide this token to add custom message renderers in addition to built-in ones
4336
- * Note: Built-in renderers (text, system, fallback) are registered by default; other types are provided via plugins/constants.
4337
- */
4338
- declare const AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS: InjectionToken<AXConversationMessageRenderer[]>;
4194
+ declare function validateMessageType(type: AXConversationMessageType | undefined): AXConversationValidationResult;
4339
4195
  /**
4340
- * Default message actions configuration
4341
- * Provide this token to override default message actions
4196
+ * Validate message payload
4197
+ * @param payload - Message payload to validate
4198
+ * @param type - Message type
4199
+ * @returns Validation result
4342
4200
  */
4343
- declare const AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS: InjectionToken<AXConversationMessageAction[]>;
4201
+ declare function validateMessagePayload(payload: AXConversationMessagePayload | undefined, type: AXConversationMessageType): Promise<AXConversationValidationResult>;
4344
4202
  /**
4345
- * Default composer tabs configuration
4346
- * Provide this token to override default composer tabs (emoji, stickers, etc.)
4203
+ * Validate user ID
4204
+ * @param userId - User ID to validate
4205
+ * @returns Validation result
4347
4206
  */
4348
- declare const AX_CONVERSATION_DEFAULT_COMPOSER_TABS: InjectionToken<AXConversationComposerTab[]>;
4207
+ declare function validateUserId(userId: string | undefined): AXConversationValidationResult;
4349
4208
  /**
4350
- * Default composer actions configuration
4351
- * Provide this token to override default composer actions (attach, voice, etc.)
4209
+ * Validate array of user IDs
4210
+ * @param userIds - Array of user IDs to validate
4211
+ * @param minCount - Minimum number of users required
4212
+ * @param maxCount - Maximum number of users allowed
4213
+ * @returns Validation result
4352
4214
  */
4353
- declare const AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS: InjectionToken<AXConversationComposerAction[]>;
4215
+ declare function validateUserIds(userIds: string[] | undefined, minCount?: number, maxCount?: number): AXConversationValidationResult;
4354
4216
  /**
4355
- * Default conversation tabs configuration
4356
- * Provide this token to override default conversation tabs (all, private, groups, etc.)
4217
+ * Validate email address
4218
+ * @param email - Email to validate
4219
+ * @returns Validation result
4357
4220
  */
4358
- declare const AX_CONVERSATION_DEFAULT_CONVERSATION_TABS: InjectionToken<AXConversationTab[]>;
4221
+ declare function validateEmail(email: string | undefined): AXConversationValidationResult;
4359
4222
  /**
4360
- * Default info bar actions configuration
4361
- * Provide this token to override default info bar actions (mute, archive, block, etc.)
4223
+ * Validate URL
4224
+ * @param url - URL to validate
4225
+ * @returns Validation result
4362
4226
  */
4363
- declare const AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS: InjectionToken<AXConversationInfoBarAction[]>;
4227
+ declare function validateUrl(url: string | undefined): AXConversationValidationResult;
4364
4228
  /**
4365
- * Default conversation item actions configuration
4366
- * Provide this token to override default conversation item actions (mute, delete, archive, etc.)
4229
+ * Sanitize user input to prevent XSS
4230
+ * Note: Angular provides built-in sanitization, but this is an additional layer
4231
+ * @param input - User input to sanitize
4232
+ * @returns Sanitized input
4367
4233
  */
4368
- declare const AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS: InjectionToken<AXConversationItemAction[]>;
4234
+ declare function sanitizeInput(input: string): string;
4369
4235
  /**
4370
- * Registry configuration interface
4236
+ * Validate latitude coordinate
4237
+ * @param latitude - Latitude to validate
4238
+ * @returns Validation result
4371
4239
  */
4372
- interface AXConversationRegistryConfiguration {
4373
- /**
4374
- * Additional message renderers to register (built-in renderers are automatic).
4375
- * Each {@link AXConversationMessageRenderer} may include optional `composerActions` for co-located send UX.
4376
- */
4377
- messageRenderers?: AXConversationMessageRenderer[];
4378
- /** Message actions to register by default */
4379
- messageActions?: AXConversationMessageAction[];
4380
- /** Composer tabs to register by default */
4381
- composerTabs?: AXConversationComposerTab[];
4382
- /** Composer actions to register by default */
4383
- composerActions?: AXConversationComposerAction[];
4384
- /** Conversation tabs to register by default */
4385
- conversationTabs?: AXConversationTab[];
4386
- /** Info bar actions to register by default */
4387
- infoBarActions?: AXConversationInfoBarAction[];
4388
- /** Conversation item actions to register by default */
4389
- conversationItemActions?: AXConversationItemAction[];
4390
- }
4240
+ declare function validateLatitude(latitude: number | undefined | null): AXConversationValidationResult;
4391
4241
  /**
4392
- * Complete registry configuration token
4393
- * Provide this for comprehensive registry configuration
4242
+ * Validate longitude coordinate
4243
+ * @param longitude - Longitude to validate
4244
+ * @returns Validation result
4394
4245
  */
4395
- declare const AX_CONVERSATION_REGISTRY_CONFIG: InjectionToken<AXConversationRegistryConfiguration>;
4396
-
4397
- declare const AX_CONVERSATION_AUDIO_PRESENTATION: {
4398
- readonly icon: "fa-light fa-music text-amber-500";
4399
- readonly title: "Audio";
4400
- };
4401
- declare function conversationAudioUtilities(): NonNullable<AXFileType['utilities']>;
4402
- declare function createConversationAudioFileType(): AXFileType;
4403
- declare class AXConversationAudioFileTypeProvider extends AXFileTypeInfoProvider {
4404
- items(): Promise<AXFileType<{
4405
- [x: string]: (ctx: _acorex_core_file.AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown;
4406
- }>[]>;
4407
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAudioFileTypeProvider, never>;
4408
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationAudioFileTypeProvider>;
4409
- }
4410
-
4411
- declare function audioItemFromUpload(file: File, result: AXConversationUploaderResult, duration: number): AXConversationAudioMediaItem;
4412
- declare function mergeAudioUploadResult(payload: AXConversationMessagePayload, result: AXUploadResult): AXConversationMessagePayload;
4413
- declare function applyAudioLocalPreview(payload: AXConversationMessagePayload, localUrl: string, mimeType?: string): AXConversationMessagePayload;
4246
+ declare function validateLongitude(longitude: number | undefined | null): AXConversationValidationResult;
4414
4247
 
4415
- /**
4416
- * Shared upload state and helpers for composer media pickers.
4417
- */
4248
+ /** Infer extension/MIME hints from a persisted message payload. */
4249
+ declare function inferFileExtensionHintFromMessage(message: AXConversationMessage): AXFileTypeExtensionHint;
4250
+ /** Use file-type `copy` on the message when `message.fileType` is set; otherwise fallback. */
4251
+ declare function copyWithFileTypeFallback(message: AXConversationMessage, registry: AXFileTypeRegistryService, fallback: () => string): Promise<string>;
4252
+ /** Use file-type `open` on the message when `message.fileType` is set. */
4253
+ declare function openWithFileType(message: AXConversationMessage, registry: AXFileTypeRegistryService, ctx: AXFileTypeOpenContext): Promise<boolean>;
4418
4254
 
4419
- /** Stable id for `@for` tracking while upload state is patched immutably. */
4420
- declare function createPickerUploadItemId(): string;
4421
- interface AXConversationComposerPickerUploadItem {
4255
+ interface AXConversationInfoProfileField {
4422
4256
  id: string;
4423
- file: File;
4424
- preview?: string;
4425
- duration?: number;
4426
- uploadProgress?: number;
4427
- uploading?: boolean;
4428
- uploaded?: boolean;
4429
- uploadedUrl?: string;
4430
- mediaId?: string;
4431
- error?: string;
4432
- abortController?: AbortController;
4257
+ labelKey: string;
4258
+ value: string;
4259
+ icon: string;
4433
4260
  }
4434
- declare function getPickerCancelUploadLabel(translation: AXTranslationService): string;
4435
- declare function abortPickerUploads(items: Iterable<{
4436
- abortController?: AbortController;
4437
- } | null | undefined>): void;
4438
- interface AXConversationCleanupPickerUploadsOptions {
4439
- retainUploaded?: boolean;
4261
+ type AXConversationMediaCategoryId = 'image' | 'video' | 'file' | 'audio' | 'voice' | 'sticker' | 'location' | 'link';
4262
+ interface AXConversationMediaCategory {
4263
+ id: AXConversationMediaCategoryId;
4264
+ labelKey: string;
4265
+ countLabelKey: string;
4266
+ icon: string;
4267
+ count: number;
4440
4268
  }
4441
- /** Upload finished; reference is {@link mediaId} and/or a non-empty session url. */
4442
- declare function isPickerItemReadyToSend(item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId'>): boolean;
4443
- /** Build uploader result shape for {@link *ItemFromUpload} after picker upload. */
4444
- declare function pickerItemToUploadResult(item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId' | 'file'>): {
4445
- url: string;
4446
- mediaId?: string;
4447
- mimeType: string;
4448
- size: number;
4449
- } | null;
4450
- declare function pickerItemToMediaReference(item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId' | 'file'>): AXConversationUploaderReference | null;
4451
- declare function deleteUploadedPickerMedia(uploader: AXUploaderService, items: Iterable<AXConversationComposerPickerUploadItem | null | undefined>): Promise<void>;
4452
- declare function cleanupPickerUploads(uploader: AXUploaderService, items: Iterable<AXConversationComposerPickerUploadItem | null | undefined>, options?: AXConversationCleanupPickerUploadsOptions): void;
4453
- declare function revokePickerBlobPreviews(items: Iterable<{
4454
- preview?: string;
4455
- } | null | undefined>): void;
4456
- declare function isUploadAborted(error: unknown, signal?: AbortSignal): boolean;
4457
- declare function limitFilesToCapacity(files: File[], currentCount: number, maxFiles: number): File[];
4458
- declare function uploadPickerFile(uploader: AXUploaderService, conversationId: string, file: File, onProgress: (percent: number) => void, signal?: AbortSignal): Promise<{
4459
- url: string;
4460
- mediaId?: string;
4461
- mimeType: string;
4269
+ declare function messageContainsLink(message: AXConversationMessage): boolean;
4270
+ declare function getPrivatePeerParticipant(conversation: AXConversation, currentUserId?: string): AXConversationParticipant | undefined;
4271
+ declare function getConversationProfileFields(conversation: AXConversation, currentUserId?: string): AXConversationInfoProfileField[];
4272
+ declare function getConversationMediaCategories(messages: AXConversationMessage[]): AXConversationMediaCategory[];
4273
+ declare function filterMessagesByMediaCategory(messages: AXConversationMessage[], categoryId: AXConversationMediaCategoryId): AXConversationMessage[];
4274
+ declare function isGridMediaCategory(categoryId: AXConversationMediaCategoryId): boolean;
4275
+ declare function isAttachmentListCategory(categoryId: AXConversationMediaCategoryId): boolean;
4276
+ interface AXConversationMediaGalleryTile {
4277
+ key: string;
4278
+ message: AXConversationMessage;
4279
+ kind: 'image' | 'video' | 'sticker';
4280
+ image?: AXConversationImageMediaItem;
4281
+ video?: AXConversationVideoMediaItem;
4282
+ stickerUrl?: string;
4283
+ stickerAlt?: string;
4284
+ }
4285
+ declare function buildMediaGalleryTiles(messages: AXConversationMessage[], categoryId: AXConversationMediaCategoryId): AXConversationMediaGalleryTile[];
4286
+ declare function resolveVideoThumbnailUrl(video: AXConversationVideoMediaItem): string | undefined;
4287
+ declare function resolveGalleryImageUrl(image: AXConversationImageMediaItem): string | undefined;
4288
+ declare function getMessageVideoItems(message: AXConversationMessage): AXConversationVideoMediaItem[];
4289
+ declare function getMessageAudioItems(message: AXConversationMessage): AXConversationAudioMediaItem[];
4290
+ interface AXConversationMediaPageResult {
4291
+ items: AXConversationMessage[];
4292
+ hasMore: boolean;
4293
+ nextCursor?: string;
4294
+ page: number;
4295
+ }
4296
+ declare function fetchConversationMediaPage(conversationApi: AXConversationApi, conversationId: string, page: number, pageSize?: number, cursor?: string): Promise<AXConversationMediaPageResult>;
4297
+ /** Merge media API results with in-memory messages needed for link/sticker/voice/location tabs. */
4298
+ declare function mergeInfoPanelMessages(mediaMessages: AXConversationMessage[], supplemental: AXConversationMessage[]): AXConversationMessage[];
4299
+ declare function filterSupplementalInfoPanelMessages(messages: AXConversationMessage[]): AXConversationMessage[];
4300
+
4301
+ interface AXConversationMessageDateGroup {
4302
+ date: string;
4303
+ dateKind: AXConversationDateSeparatorKind;
4304
+ dateLabel?: string;
4305
+ messages: AXConversationMessage[];
4306
+ }
4307
+ declare class AXConversationMessageListService {
4308
+ private readonly conversationService;
4309
+ private readonly translation;
4310
+ private readonly eventService;
4311
+ private readonly activeLocale;
4312
+ private readonly translationRevision;
4313
+ private get registry();
4314
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation.AXConversation>;
4315
+ readonly activeMessages: _angular_core.Signal<AXConversationMessage[]>;
4316
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation.AXConversationUser>;
4317
+ /** Initial message history load (conversation switch) */
4318
+ readonly loading: _angular_core.Signal<boolean>;
4319
+ /** Loading older messages (scroll-up pagination) */
4320
+ readonly loadingMore: _angular_core.WritableSignal<boolean>;
4321
+ /** Whether older messages can be loaded */
4322
+ readonly hasMoreMessages: _angular_core.Signal<boolean>;
4323
+ /** Show scroll to bottom button */
4324
+ readonly showScrollButton: _angular_core.WritableSignal<boolean>;
4325
+ /** Scroll requests counter */
4326
+ readonly scrollRequests: _angular_core.WritableSignal<number>;
4327
+ /** Live renderer instances keyed by message id (for message actions). */
4328
+ private readonly _rendererInstances;
4329
+ /**
4330
+ * Reply counts merged from API fields and loaded messages.
4331
+ */
4332
+ readonly replyCounts: _angular_core.Signal<Map<string, number>>;
4333
+ /**
4334
+ * Forward counts merged from API fields and loaded messages.
4335
+ */
4336
+ readonly forwardCounts: _angular_core.Signal<Map<string, number>>;
4337
+ registerRendererInstance(messageId: string, instance: AXConversationMessageRendererComponent): void;
4338
+ unregisterRendererInstance(messageId: string): void;
4339
+ getRendererInstance(messageId: string): AXConversationMessageRendererComponent | undefined;
4340
+ getReplyCount(messageId: string): number;
4341
+ getForwardCount(messageId: string): number;
4342
+ /** Message grouped by date */
4343
+ readonly messageGroups: _angular_core.Signal<AXConversationMessageDateGroup[]>;
4344
+ /**
4345
+ * Load older messages when the user scrolls near the top.
4346
+ */
4347
+ loadMoreMessages(): Promise<boolean>;
4348
+ /**
4349
+ * Reset pagination when switching conversations (page 0 is loaded by {@link AXConversationService.selectConversation}).
4350
+ */
4351
+ resetPagination(): void;
4352
+ getMenuActions(message: AXConversationMessage): _acorex_components_conversation.AXConversationMessageAction[];
4353
+ executeAction(message: AXConversationMessage, actionId: string): Promise<void>;
4354
+ reactToMessage(messageId: string, emoji: string): Promise<void>;
4355
+ /** Request message list to scroll to bottom */
4356
+ requestScrollToBottom(): void;
4357
+ private buildCountMap;
4358
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationMessageListService, never>;
4359
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationMessageListService>;
4360
+ }
4361
+
4362
+ declare class AXConversationMessageListComponent implements OnDestroy {
4363
+ private readonly conversationService;
4364
+ private readonly messageListService;
4365
+ private readonly composerService;
4366
+ private readonly fileService;
4367
+ private readonly toast;
4368
+ private readonly infoBarService;
4369
+ protected readonly translation: AXTranslationService;
4370
+ private readonly document;
4371
+ private readonly platform;
4372
+ private readonly actionSheetService;
4373
+ private readonly ngZone;
4374
+ private readonly cdr;
4375
+ protected readonly config: Required<_acorex_components_conversation.AXConversationConfig>;
4376
+ /**
4377
+ * Background for the message list scroll area from config, or the built-in soft wash when unset/empty.
4378
+ * Set `messageListBackground` to `transparent` or `none` for a flat look.
4379
+ * Supports `{ light, dark }` for theme-specific backgrounds.
4380
+ */
4381
+ readonly messageListUsesDefaultWallpaper: _angular_core.Signal<boolean>;
4382
+ readonly messageListWallpaperDark: _angular_core.Signal<boolean>;
4383
+ readonly messageListBackgroundStyle: _angular_core.Signal<string>;
4384
+ resolvedEmptyStateComponent(): Type<AXConversationMessageListEmptyComponent>;
4385
+ /** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */
4386
+ protected readonly noActiveFallbackComponent: typeof AXConversationMessageListNoActiveDefaultComponent;
4387
+ private readonly timeouts;
4388
+ private dateSeparatorFadeTimer;
4389
+ readonly reactionPickerTarget: _angular_core.WritableSignal<string>;
4390
+ readonly reactionPickerElement: _angular_core.WritableSignal<HTMLElement>;
4391
+ readonly reactionPickerPlacement: _angular_core.WritableSignal<AXPlacement>;
4392
+ readonly reactionPopover: _angular_core.Signal<any>;
4393
+ /** Message id whose context menu is open (for active row styling). */
4394
+ readonly contextMenuMessageId: _angular_core.WritableSignal<string>;
4395
+ private readonly contextMenuMessage;
4396
+ private readonly messageActionsMenu;
4397
+ /** True while files are dragged over the message list drop zone. */
4398
+ readonly messageListDragging: _angular_core.WritableSignal<boolean>;
4399
+ /** True when the message list uses single-column adaptive layout (matches CSS container query). */
4400
+ readonly isAdaptiveWideLayout: _angular_core.WritableSignal<boolean>;
4401
+ /** While true, older history is being prepended — do not auto-scroll to the latest message. */
4402
+ private restoringScrollAfterPrepend;
4403
+ /**
4404
+ * Stick to the latest message across layout shifts (media decode, lazy outlets).
4405
+ * Cleared as soon as the user scrolls up — even within `scrollThreshold` —
4406
+ * otherwise ResizeObserver keeps yanking the feed back to the bottom.
4407
+ */
4408
+ private pinnedToBottom;
4409
+ /**
4410
+ * True while we assign `scrollTop`. Kept until the following animation frame
4411
+ * because some browsers dispatch `scroll` asynchronously after `scrollTop` writes.
4412
+ */
4413
+ private programmaticScroll;
4414
+ private programmaticScrollGen;
4415
+ private adaptiveLayoutResizeObserver?;
4416
+ private documentClickListener?;
4417
+ readonly availableReactions: _angular_core.WritableSignal<string[]>;
4418
+ private reactionsLoading;
4419
+ private get registry();
4420
+ /** Message list element reference */
4421
+ private readonly messageListRef;
4422
+ /** Messages container element reference */
4423
+ private readonly messagesContainerRef;
4424
+ /** Loading state - use service */
4425
+ readonly loading: _angular_core.Signal<boolean>;
4426
+ /** Loading more messages state - use service */
4427
+ readonly loadingMore: _angular_core.WritableSignal<boolean>;
4428
+ /** Whether older messages remain on the server */
4429
+ readonly hasMoreMessages: _angular_core.Signal<boolean>;
4430
+ /** Show scroll to bottom button - use service */
4431
+ readonly showScrollButton: _angular_core.WritableSignal<boolean>;
4432
+ /** Active conversation */
4433
+ readonly activeConversation: _angular_core.Signal<_acorex_components_conversation.AXConversation>;
4434
+ readonly isGroupConversation: _angular_core.Signal<boolean>;
4435
+ /** Placeholder rows for the initial message list skeleton. */
4436
+ protected readonly loadingSkeletonItems: readonly [0, 1, 2, 3, 4, 5, 6, 7];
4437
+ /**
4438
+ * Conversation whose feed has already been pinned to the latest message.
4439
+ * Compared with the active id in `feedReady` so a chat switch hides the list
4440
+ * in the same render — before the effect that pins the new history.
4441
+ */
4442
+ private readonly pinnedConversationId;
4443
+ private feedRevealGeneration;
4444
+ private feedRevealRaf;
4445
+ /** False until this conversation is pinned to the bottom (never shows history from the top). */
4446
+ readonly feedReady: _angular_core.Signal<boolean>;
4447
+ /**
4448
+ * Keep the skeleton up until the feed is pinned. The real list stays
4449
+ * `visibility: hidden` underneath so bubbles never show through the cover.
4450
+ */
4451
+ readonly showOpenCover: _angular_core.Signal<boolean>;
4452
+ /** Whether the active conversation allows message reactions. */
4453
+ readonly reactionsEnabled: _angular_core.Signal<boolean>;
4454
+ /** Messages */
4455
+ readonly messages: _angular_core.Signal<AXConversationMessage[]>;
4456
+ /** Messages keyed by id for O(1) lookups during intersection callbacks. */
4457
+ private readonly messagesById;
4458
+ /** Message action event */
4459
+ readonly messageAction: _angular_core.OutputEmitterRef<{
4460
+ message: AXConversationMessage;
4461
+ action: string;
4462
+ }>;
4463
+ /** Current user from service */
4464
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation.AXConversationUser>;
4465
+ /** Message grouped by date - use service */
4466
+ readonly messageGroups: _angular_core.Signal<AXConversationMessageDateGroup[]>;
4467
+ constructor();
4468
+ private intersectionObserver?;
4469
+ private readonly readIntersectionObserver;
4470
+ private readonly observedReadMessageIds;
4471
+ /**
4472
+ * Setup intersection observer to mark messages as read when visible
4473
+ */
4474
+ private setupIntersectionObserver;
4475
+ /**
4476
+ * Keep the viewport stable when layout changes.
4477
+ * ResizeObserver runs after layout and before paint — apply scrollTop in the
4478
+ * callback (not rAF) so the browser never paints a jump.
4479
+ *
4480
+ * Near the bottom, pin to the latest message (media decode, lazy outlets).
4481
+ * Further up, only compensate rows that grew fully above the viewport.
4482
+ */
4483
+ private setupMediaScrollCompensation;
4484
+ /**
4485
+ * Mark message as read
4486
+ */
4487
+ private markMessageAsRead;
4488
+ /** Check if message is from current user */
4489
+ isOwnMessage(message: AXConversationMessage): boolean;
4490
+ /** Get first unread message ID */
4491
+ readonly firstUnreadMessageId: _angular_core.Signal<string>;
4492
+ /** Whether reactions can be shown or added for a message in the active conversation. */
4493
+ messageSupportsReactions(message: AXConversationMessage): boolean;
4494
+ /** Toggle reaction picker */
4495
+ toggleReactionPicker(message: AXConversationMessage, event: MouseEvent): void;
4496
+ /** Close reaction picker */
4497
+ closeReactionPicker(): void;
4498
+ /** Check if current user has reacted with specific emoji */
4499
+ hasUserReacted(message: AXConversationMessage, emoji: string): boolean;
4500
+ /** Check if current user has reacted with specific emoji by message ID */
4501
+ hasUserReactedById(messageId: string, emoji: string): boolean;
4502
+ /** Handle reaction click by message ID */
4503
+ onReactionClickById(messageId: string, emoji: string): void;
4504
+ /** Get message by ID */
4505
+ getMessageById(messageId: string): AXConversationMessage | undefined;
4506
+ /** Load available reactions when the picker is opened (session-cached in service). */
4507
+ private ensureAvailableReactions;
4508
+ /** Get message actions from registry */
4509
+ getMessageActions(message: AXConversationMessage): _acorex_components_conversation.AXConversationMessageAction[];
4510
+ /** Handle reaction click */
4511
+ onReactionClick(message: AXConversationMessage, emoji: string): void;
4512
+ /** Handle message action */
4513
+ onMessageAction(message: AXConversationMessage, action: any): Promise<void>;
4514
+ /** Handle infinite scroll threshold */
4515
+ onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
4516
+ /** Load older messages - delegate to service and preserve scroll anchor */
4517
+ private loadOlderMessages;
4518
+ /**
4519
+ * Keep the user's viewport on the same messages after older rows are inserted above.
4520
+ */
4521
+ private applyPrependScrollRestore;
4522
+ private revealStuckDateSeparators;
4523
+ private syncDateSeparatorStuckState;
4524
+ private scheduleDateSeparatorFade;
4525
+ private clearDateSeparatorFadeTimer;
4526
+ /** Distance from the last pixel of the feed. */
4527
+ private distanceFromBottom;
4528
+ /** True when the viewport is at the latest message (not merely within `scrollThreshold`). */
4529
+ private isStuckToBottom;
4530
+ /**
4531
+ * Assign scrollTop without the listener treating it as a user scroll.
4532
+ * The flag stays set until the next frame so async `scroll` events are ignored.
4533
+ */
4534
+ private writeScrollTop;
4535
+ /** Pin the feed to the latest message before the next paint. */
4536
+ private pinFeedToBottom;
4537
+ /** Hide the feed and pin to the latest message before the first visible paint. */
4538
+ private beginFeedReveal;
4539
+ private cancelFeedReveal;
4540
+ /**
4541
+ * Pin to the latest message, then reveal. Two frames is enough — stick-to-bottom
4542
+ * holds later media growth. Waiting for loaders here left a blank gap after the skeleton.
4543
+ */
4544
+ private scheduleFeedPin;
4545
+ /** Start nearby lazy images so they decode while stick-to-bottom holds the viewport. */
4546
+ private primeOpenViewportMedia;
4547
+ /** Scroll to bottom */
4548
+ scrollToBottom(smooth?: boolean): void;
4549
+ /** Scroll to specific message */
4550
+ scrollToMessage(messageId: string): void;
4551
+ /** Cleanup timeouts and observers on destroy */
4552
+ ngOnDestroy(): void;
4553
+ /** Get ARIA label for a date separator. */
4554
+ getDateSeparatorAriaLabel(group: AXConversationMessageDateGroup): string;
4555
+ resolveDateSeparatorLabel(group: AXConversationMessageDateGroup): string;
4556
+ onMessageListDragEnter(): void;
4557
+ onMessageListDragLeave(): void;
4558
+ /** Open the matching composer picker popup when files are dropped on the message list. */
4559
+ onMessageListFilesDropped(event: AXUploaderFileChangeEvent): Promise<void>;
4560
+ private composerPickerDeps;
4561
+ /**
4562
+ * Open the shared message-actions menu from a single delegated listener.
4563
+ * Per-row `ax-context-menu` instances each register capture-phase scroll listeners
4564
+ * and were the main source of scroll jank.
4565
+ */
4566
+ onMessagesFeedContextMenu(event: MouseEvent): void;
4567
+ onMessageContextMenuClose(): void;
4568
+ /** Handle context menu opening for messages */
4569
+ handleMessageContextMenuOpening(event: AXContextMenuOpeningEvent): void;
4570
+ /** Handle context menu item click for messages */
4571
+ handleMessageContextMenuItemClick(event: AXContextMenuItemsClickEvent): void;
4572
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationMessageListComponent, never>;
4573
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationMessageListComponent, "ax-conversation-message-list", never, {}, { "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>;
4574
+ }
4575
+
4576
+ declare class AXConversationAvatarPickerComponent {
4577
+ readonly fileInput: _angular_core.Signal<ElementRef<HTMLInputElement>>;
4578
+ readonly showClearButton: _angular_core.InputSignal<boolean>;
4579
+ readonly avatarUrl: _angular_core.ModelSignal<string>;
4580
+ readonly onFileSelected: _angular_core.OutputEmitterRef<string>;
4581
+ triggerFileInput(): void;
4582
+ onFileInputChange(event: Event): Promise<void>;
4583
+ clearAvatar(): void;
4584
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAvatarPickerComponent, never>;
4585
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAvatarPickerComponent, "ax-conversation-avatar-picker", never, { "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "avatarUrl": { "alias": "avatarUrl"; "required": false; "isSignal": true; }; }, { "avatarUrl": "avatarUrlChange"; "onFileSelected": "onFileSelected"; }, never, never, true, never>;
4586
+ }
4587
+
4588
+ declare class AXConversationAvatarComponent {
4589
+ private readonly conversationService;
4590
+ private readonly userAvatarComponent;
4591
+ private readonly conversationAvatarComponent;
4592
+ readonly kind: _angular_core.InputSignal<AXConversationAvatarKind>;
4593
+ readonly userId: _angular_core.InputSignal<string>;
4594
+ readonly conversation: _angular_core.InputSignal<AXConversation>;
4595
+ readonly message: _angular_core.InputSignal<AXConversationMessage>;
4596
+ readonly size: _angular_core.InputSignal<number>;
4597
+ readonly showStatus: _angular_core.InputSignal<boolean>;
4598
+ readonly name: _angular_core.InputSignal<string>;
4599
+ readonly avatar: _angular_core.InputSignal<string>;
4600
+ readonly icon: _angular_core.InputSignal<string>;
4601
+ private readonly currentUserId;
4602
+ readonly resolvedKind: _angular_core.Signal<"user" | "conversation">;
4603
+ readonly resolvedUserId: _angular_core.Signal<string>;
4604
+ readonly customComponent: _angular_core.Signal<Type<unknown>>;
4605
+ readonly customInputs: _angular_core.Signal<Record<string, unknown>>;
4606
+ readonly filteredCustomInputs: _angular_core.Signal<Record<string, unknown>>;
4607
+ readonly fallbackDisplay: _angular_core.Signal<{
4608
+ name: string;
4609
+ avatar: string;
4610
+ icon: string;
4611
+ }>;
4612
+ readonly fallbackInitials: _angular_core.Signal<string>;
4613
+ readonly resolvedStatus: _angular_core.Signal<_acorex_components_conversation.AXConversationPresenceStatus>;
4614
+ readonly statusBadgePresence: _angular_core.Signal<"online" | "offline" | "away" | "busy">;
4615
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAvatarComponent, never>;
4616
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAvatarComponent, "ax-conversation-avatar", never, { "kind": { "alias": "kind"; "required": false; "isSignal": true; }; "userId": { "alias": "userId"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "showStatus": { "alias": "showStatus"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "avatar": { "alias": "avatar"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4617
+ }
4618
+
4619
+ interface AXConversationRegistryComponentRef {
4620
+ component?: Type<unknown>;
4621
+ componentLoader?: () => Promise<Type<unknown>>;
4622
+ }
4623
+ /** Placeholder shown while a lazy registry component is loading. */
4624
+ type AXConversationOutletSkeleton = 'auto' | 'text' | 'media' | 'none';
4625
+ declare class AXConversationRegistryComponentOutletComponent {
4626
+ readonly component: _angular_core.InputSignal<Type<unknown>>;
4627
+ readonly componentLoader: _angular_core.InputSignal<() => Promise<Type<unknown>>>;
4628
+ readonly inputs: _angular_core.InputSignal<Record<string, unknown>>;
4629
+ /**
4630
+ * Skeleton while a `componentLoader` is in flight.
4631
+ * `auto` uses `inputs.message.type`: text/system → single line, other types → multi-line.
4632
+ */
4633
+ readonly skeleton: _angular_core.InputSignal<AXConversationOutletSkeleton>;
4634
+ readonly resolvedComponent: _angular_core.WritableSignal<Type<unknown>>;
4635
+ private readonly pending;
4636
+ readonly isLoading: _angular_core.Signal<boolean>;
4637
+ protected readonly skeletonVariant: _angular_core.Signal<"text" | "none" | "media" | "lines">;
4638
+ /** Avoid re-loading when the parent re-binds the same lazy loader reference. */
4639
+ private activeLoader;
4640
+ constructor();
4641
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationRegistryComponentOutletComponent, never>;
4642
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationRegistryComponentOutletComponent, "ax-conversation-registry-component-outlet", never, { "component": { "alias": "component"; "required": false; "isSignal": true; }; "componentLoader": { "alias": "componentLoader"; "required": false; "isSignal": true; }; "inputs": { "alias": "inputs"; "required": false; "isSignal": true; }; "skeleton": { "alias": "skeleton"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4643
+ }
4644
+ /** Resolve a registry component reference, preferring lazy loaders when provided. */
4645
+ declare function hasRegistryComponent(ref?: AXConversationRegistryComponentRef): boolean;
4646
+
4647
+ declare class AXConversationSidebarService {
4648
+ private readonly conversationService;
4649
+ constructor();
4650
+ private get registry();
4651
+ readonly searchQuery: _angular_core.WritableSignal<string>;
4652
+ readonly activeTabId: _angular_core.WritableSignal<string>;
4653
+ readonly loadingMore: _angular_core.WritableSignal<boolean>;
4654
+ readonly conversations: _angular_core.Signal<AXConversation[]>;
4655
+ readonly loading: _angular_core.Signal<boolean>;
4656
+ readonly hasMoreConversations: _angular_core.Signal<boolean>;
4657
+ readonly enabledTabs: _angular_core.Signal<_acorex_components_conversation.AXConversationTab[]>;
4658
+ readonly filteredConversations: _angular_core.Signal<AXConversation[]>;
4659
+ /**
4660
+ * Filter and sort conversations
4661
+ */
4662
+ private filterAndSort;
4663
+ setSearchQuery(q: string): void;
4664
+ setActiveTab(tabId: string): void;
4665
+ selectConversation(conversation: AXConversation): void;
4666
+ getBadgeValue(tabId: string): string | undefined;
4667
+ /**
4668
+ * Load more conversations when the user scrolls near the bottom of the sidebar list.
4669
+ */
4670
+ loadMoreConversations(): Promise<void>;
4671
+ /**
4672
+ * Handle scroll threshold (for infinite scroll)
4673
+ */
4674
+ onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
4675
+ /**
4676
+ * Reload conversation list from the first page (e.g. pull-to-refresh).
4677
+ */
4678
+ reloadConversations(): Promise<void>;
4679
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationSidebarService, never>;
4680
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationSidebarService>;
4681
+ }
4682
+
4683
+ declare class AXConversationSidebarComponent implements OnDestroy {
4684
+ readonly sidebar: AXConversationSidebarService;
4685
+ protected readonly config: Required<_acorex_components_conversation.AXConversationConfig>;
4686
+ private readonly conversationService;
4687
+ private readonly popupService;
4688
+ private readonly translation;
4689
+ private readonly ngZone;
4690
+ private readonly cdr;
4691
+ /** Conversation selected event */
4692
+ readonly conversationSelected: _angular_core.OutputEmitterRef<AXConversation>;
4693
+ /** Search debouncing */
4694
+ private readonly searchSubject;
4695
+ /** Derived state for template */
4696
+ readonly enabledTabs: _angular_core.Signal<_acorex_components_conversation.AXConversationTab[]>;
4697
+ readonly filteredConversations: _angular_core.Signal<AXConversation[]>;
4698
+ readonly loading: _angular_core.Signal<boolean>;
4699
+ readonly loadingMore: _angular_core.WritableSignal<boolean>;
4700
+ readonly hasMoreConversations: _angular_core.Signal<boolean>;
4701
+ readonly isSidebarTabsHorizontal: _angular_core.Signal<boolean>;
4702
+ readonly sidebarTabLocation: _angular_core.Signal<AXTabLocation>;
4703
+ constructor();
4704
+ /** Handle search input change with debouncing */
4705
+ onSearchChange(value: string): void;
4706
+ /** Handle tab change from ax-tabs */
4707
+ onTabChange(event: {
4708
+ tab?: {
4709
+ key?: string;
4710
+ };
4711
+ }): void;
4712
+ /** Select a conversation */
4713
+ selectConversation(conversation: AXConversation): void;
4714
+ /** Get badge value for tab */
4715
+ getBadgeValue(tabId: string): string | undefined;
4716
+ getTabLabel(tabId: string): string;
4717
+ openNewConversationPopup(): Promise<void>;
4718
+ /** Handle infinite scroll threshold - delegate to service */
4719
+ onScrollThreshold(edge: 'top' | 'bottom'): Promise<void>;
4720
+ /** Cleanup on destroy */
4721
+ ngOnDestroy(): void;
4722
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationSidebarComponent, never>;
4723
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationSidebarComponent, "ax-conversation-sidebar", never, {}, { "conversationSelected": "conversationSelected"; }, never, ["ax-suffix"], true, never>;
4724
+ }
4725
+
4726
+ type AXConversationNewWizardStep = 'selectUsers' | 'groupDetails';
4727
+ declare class AXConversationNewDialogComponent extends AXBasePageComponent {
4728
+ /**
4729
+ * Assigned by {@link AXPopupComponent} from `open(..., { data: { conversationService } })`.
4730
+ * Not injected: popup content is created on the root view container, so route-scoped providers
4731
+ * would not see the same `AXConversationService` instance as the conversation feature.
4732
+ */
4733
+ conversationService: AXConversationService;
4734
+ private readonly toastService;
4735
+ private readonly translation;
4736
+ private readonly config;
4737
+ private readonly destroyRef;
4738
+ private readonly popupService;
4739
+ private searchDebounceTimer?;
4740
+ constructor();
4741
+ /**
4742
+ * Injected by {@link AXPopupComponent} when this dialog is opened via {@link AXPopupService}.
4743
+ * Required for `setTitle` / dynamic header — {@link AXBasePageComponent#setTitle} is otherwise unset.
4744
+ */
4745
+ readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
4746
+ readonly availableUsers: _angular_core.WritableSignal<AXConversationParticipant[]>;
4747
+ readonly selectedUserIds: _angular_core.WritableSignal<string[]>;
4748
+ readonly groupTitle: _angular_core.WritableSignal<string>;
4749
+ readonly groupAvatar: _angular_core.WritableSignal<string>;
4750
+ readonly groupAvatarFileName: _angular_core.WritableSignal<string>;
4751
+ readonly searchQuery: _angular_core.WritableSignal<string>;
4752
+ readonly creating: _angular_core.WritableSignal<boolean>;
4753
+ /** For 2+ users: step 1 = pick users, step 2 = title + avatar. */
4754
+ readonly wizardStep: _angular_core.WritableSignal<AXConversationNewWizardStep>;
4755
+ readonly showUserPickerStep: _angular_core.Signal<boolean>;
4756
+ readonly showGroupDetailsStep: _angular_core.Signal<boolean>;
4757
+ readonly showNextButton: _angular_core.Signal<boolean>;
4758
+ readonly showGroupBackButton: _angular_core.Signal<boolean>;
4759
+ readonly showCreateButton: _angular_core.Signal<boolean>;
4760
+ readonly canGoNextToGroupDetails: _angular_core.Signal<boolean>;
4761
+ readonly canCreate: _angular_core.Signal<boolean>;
4762
+ private readonly _resetWizardWhenSingleEffect;
4763
+ private readonly _syncPopupTitleEffect;
4764
+ readonly usersListEmptyTpl: _angular_core.Signal<TemplateRef<unknown>>;
4765
+ readonly usersListLoadingTpl: _angular_core.Signal<TemplateRef<unknown>>;
4766
+ readonly usersList: _angular_core.Signal<AXListComponent>;
4767
+ private readonly groupNameInput;
4768
+ private readonly groupPhotoInput;
4769
+ readonly groupPhotoAriaLabel: _angular_core.Signal<string>;
4770
+ readonly usersListDataSource: AXDataSource<unknown>;
4771
+ onCancel(): void;
4772
+ onSelectedUsersChange(ids: string[]): void;
4773
+ onNextToGroupDetails(): void;
4774
+ onBackFromGroupDetails(): void;
4775
+ onPickGroupPhoto(): void;
4776
+ onClearGroupPhoto(): void;
4777
+ onEditGroupPhoto(): Promise<void>;
4778
+ onGroupPhotoSelected(event: Event): Promise<void>;
4779
+ private openGroupPhotoEditor;
4780
+ onSearchChange(value: string): void;
4781
+ isUserSelected(id: string): boolean;
4782
+ userFromItem(item: unknown): AXConversationParticipant | null;
4783
+ private mergeUsersCache;
4784
+ onCreateConversation(): Promise<void>;
4785
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationNewDialogComponent, never>;
4786
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationNewDialogComponent, "ax-conversation-new-dialog", never, { "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4787
+ }
4788
+
4789
+ type AXConversationDeleteDialogMode = 'private' | 'leave' | 'destroy-room';
4790
+ interface AXConversationDeleteDialogResult {
4791
+ confirmed: boolean;
4792
+ forEveryone: boolean;
4793
+ }
4794
+ declare class AXConversationDeleteDialogComponent {
4795
+ private readonly translation;
4796
+ /**
4797
+ * Assigned by {@link AXPopupComponent} from `open(..., { data })`.
4798
+ */
4799
+ conversation: AXConversation;
4800
+ mode: AXConversationDeleteDialogMode;
4801
+ peerName?: string;
4802
+ readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
4803
+ forEveryone: boolean;
4804
+ readonly onClosed: EventEmitter<AXComponentCloseEvent>;
4805
+ readonly showCheckbox: _angular_core.Signal<boolean>;
4806
+ readonly messageText: _angular_core.Signal<string>;
4807
+ readonly checkboxLabel: _angular_core.Signal<string>;
4808
+ readonly confirmLabel: _angular_core.Signal<string>;
4809
+ confirm(): void;
4810
+ cancel(): void;
4811
+ private close;
4812
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationDeleteDialogComponent, never>;
4813
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationDeleteDialogComponent, "ax-conversation-delete-dialog", never, { "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4814
+ }
4815
+
4816
+ declare class AXConversationInfiniteScrollDirective {
4817
+ private readonly elementRef;
4818
+ private readonly platformId;
4819
+ private readonly ngZone;
4820
+ private readonly destroyRef;
4821
+ /** Threshold in pixels from the edge to trigger the event */
4822
+ readonly threshold: _angular_core.InputSignal<number>;
4823
+ /** Which edge to watch: 'top', 'bottom', or 'both' */
4824
+ readonly edge: _angular_core.InputSignal<"top" | "bottom" | "both">;
4825
+ /** When true, scroll events are ignored (e.g. while a page is loading). */
4826
+ readonly scrollDisabled: _angular_core.InputSignal<boolean>;
4827
+ /** Minimum time between emissions (ms) to avoid duplicate API calls. */
4828
+ readonly cooldownMs: _angular_core.InputSignal<number>;
4829
+ /** Event emitted when scrolling reaches the threshold */
4830
+ readonly scrollThreshold: _angular_core.OutputEmitterRef<"top" | "bottom">;
4831
+ private lastScrollTop;
4832
+ private ticking;
4833
+ private lastEmitAt;
4834
+ private pendingEmit;
4835
+ constructor();
4836
+ private setupScrollListener;
4837
+ private handleScroll;
4838
+ private emitThreshold;
4839
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationInfiniteScrollDirective, never>;
4840
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXConversationInfiniteScrollDirective, "[axInfiniteScroll]", never, { "threshold": { "alias": "threshold"; "required": false; "isSignal": true; }; "edge": { "alias": "edge"; "required": false; "isSignal": true; }; "scrollDisabled": { "alias": "scrollDisabled"; "required": false; "isSignal": true; }; "cooldownMs": { "alias": "cooldownMs"; "required": false; "isSignal": true; }; }, { "scrollThreshold": "scrollThreshold"; }, never, never, true, never>;
4841
+ }
4842
+
4843
+ declare const AX_CONVERSATION_AUDIO_PRESENTATION: {
4844
+ readonly icon: "fa-light fa-music text-amber-500";
4845
+ readonly title: "Audio";
4846
+ };
4847
+ declare function conversationAudioUtilities(): NonNullable<AXFileType['utilities']>;
4848
+ declare function createConversationAudioFileType(): AXFileType;
4849
+ declare class AXConversationAudioFileTypeProvider extends AXFileTypeInfoProvider {
4850
+ items(): Promise<AXFileType<{
4851
+ [x: string]: (ctx: _acorex_core_file.AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown;
4852
+ }>[]>;
4853
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAudioFileTypeProvider, never>;
4854
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationAudioFileTypeProvider>;
4855
+ }
4856
+
4857
+ declare function audioItemFromUpload(file: File, result: AXConversationUploaderResult, duration: number): AXConversationAudioMediaItem;
4858
+ declare function mergeAudioUploadResult(payload: AXConversationMessagePayload, result: AXUploadResult): AXConversationMessagePayload;
4859
+ declare function applyAudioLocalPreview(payload: AXConversationMessagePayload, localUrl: string, mimeType?: string): AXConversationMessagePayload;
4860
+
4861
+ /**
4862
+ * Shared upload state and helpers for composer media pickers.
4863
+ */
4864
+
4865
+ /** Stable id for `@for` tracking while upload state is patched immutably. */
4866
+ declare function createPickerUploadItemId(): string;
4867
+ interface AXConversationComposerPickerUploadItem {
4868
+ id: string;
4869
+ file: File;
4870
+ preview?: string;
4871
+ duration?: number;
4872
+ uploadProgress?: number;
4873
+ uploading?: boolean;
4874
+ uploaded?: boolean;
4875
+ uploadedUrl?: string;
4876
+ mediaId?: string;
4877
+ error?: string;
4878
+ abortController?: AbortController;
4879
+ }
4880
+ declare function getPickerCancelUploadLabel(translation: AXTranslationService): string;
4881
+ declare function abortPickerUploads(items: Iterable<{
4882
+ abortController?: AbortController;
4883
+ } | null | undefined>): void;
4884
+ interface AXConversationCleanupPickerUploadsOptions {
4885
+ retainUploaded?: boolean;
4886
+ }
4887
+ /** Upload finished; reference is {@link mediaId} and/or a non-empty session url. */
4888
+ declare function isPickerItemReadyToSend(item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId'>): boolean;
4889
+ /** Build uploader result shape for {@link *ItemFromUpload} after picker upload. */
4890
+ declare function pickerItemToUploadResult(item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId' | 'file'>): {
4891
+ url: string;
4892
+ mediaId?: string;
4893
+ mimeType: string;
4894
+ size: number;
4895
+ } | null;
4896
+ declare function pickerItemToMediaReference(item: Pick<AXConversationComposerPickerUploadItem, 'uploaded' | 'uploadedUrl' | 'mediaId' | 'file'>): AXConversationUploaderReference | null;
4897
+ declare function deleteUploadedPickerMedia(uploader: AXUploaderService, items: Iterable<AXConversationComposerPickerUploadItem | null | undefined>): Promise<void>;
4898
+ declare function cleanupPickerUploads(uploader: AXUploaderService, items: Iterable<AXConversationComposerPickerUploadItem | null | undefined>, options?: AXConversationCleanupPickerUploadsOptions): void;
4899
+ declare function revokePickerBlobPreviews(items: Iterable<{
4900
+ preview?: string;
4901
+ } | null | undefined>): void;
4902
+ declare function isUploadAborted(error: unknown, signal?: AbortSignal): boolean;
4903
+ declare function limitFilesToCapacity(files: File[], currentCount: number, maxFiles: number): File[];
4904
+ declare function uploadPickerFile(uploader: AXUploaderService, conversationId: string, file: File, onProgress: (percent: number) => void, signal?: AbortSignal): Promise<{
4905
+ url: string;
4906
+ mediaId?: string;
4907
+ mimeType: string;
4462
4908
  size: number;
4463
4909
  }>;
4464
4910
  declare function notifyMaxFilesCapacityExceeded(toast: AXToastService, translation: AXTranslationService, maxFiles: number): void;
@@ -4487,6 +4933,7 @@ declare class AXConversationAudioPickerComponent implements OnDestroy, AXConvers
4487
4933
  private readonly fileTypeRegistry;
4488
4934
  private readonly platformId;
4489
4935
  private readonly toast;
4936
+ private readonly popupService;
4490
4937
  readonly translation: AXTranslationService;
4491
4938
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4492
4939
  readonly maxFiles: _angular_core.InputSignal<number>;
@@ -4498,10 +4945,11 @@ declare class AXConversationAudioPickerComponent implements OnDestroy, AXConvers
4498
4945
  readonly audioFiles: _angular_core.WritableSignal<AXConversationAudioFile[]>;
4499
4946
  readonly isDragging: _angular_core.WritableSignal<boolean>;
4500
4947
  private readonly pickerShell;
4501
- readonly typeIconClass: "fa-light fa-music text-amber-500";
4502
4948
  readonly emptyIconClass: _angular_core.Signal<"fa-light fa-music text-amber-500" | "fa-light fa-cloud-arrow-up">;
4503
4949
  private catalogFileTypeDef?;
4504
4950
  caption: string;
4951
+ groupItems: boolean;
4952
+ sendAsDocuments: boolean;
4505
4953
  readonly allowMultiple: _angular_core.Signal<boolean>;
4506
4954
  constructor();
4507
4955
  activate(): Promise<void>;
@@ -4512,11 +4960,15 @@ declare class AXConversationAudioPickerComponent implements OnDestroy, AXConvers
4512
4960
  private uploadAudioAt;
4513
4961
  private patchAudio;
4514
4962
  removeAudio(index: number): void;
4963
+ renameAudio(index: number): Promise<void>;
4964
+ replaceAttachment(index: number): Promise<void>;
4515
4965
  sendAudio(): Promise<void>;
4966
+ private sendAudioAsDocuments;
4516
4967
  canSend(): boolean;
4517
4968
  getUploadingLabel(progress: number): string;
4518
4969
  getCancelUploadLabel(): string;
4519
4970
  getHeaderTitle(): string;
4971
+ truncateFileName(fileName: string): string;
4520
4972
  onAddMoreFiles(): void;
4521
4973
  cancel(): void;
4522
4974
  ngOnDestroy(): void;
@@ -4586,15 +5038,12 @@ declare class AXConversationFileFileTypeProvider extends AXFileTypeInfoProvider
4586
5038
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationFileFileTypeProvider>;
4587
5039
  }
4588
5040
 
4589
- declare function fileItemFromUpload(file: File, result: AXConversationUploaderResult): AXConversationFileMediaItem;
5041
+ declare function fileItemFromUpload(file: File, result: AXConversationUploaderResult, extras?: {
5042
+ duration?: number;
5043
+ }): AXConversationFileMediaItem;
4590
5044
  declare function mergeFileUploadResult(payload: AXConversationMessagePayload, result: AXUploadResult): AXConversationMessagePayload;
4591
5045
  declare function applyFileLocalPreview(payload: AXConversationMessagePayload, localUrl: string, mimeType?: string): AXConversationMessagePayload;
4592
5046
 
4593
- interface AXConversationPickerFileBadge {
4594
- ext: string;
4595
- color: string;
4596
- }
4597
-
4598
5047
  interface AXConversationAttachedFile extends AXConversationComposerPickerUploadItem {
4599
5048
  icon: string;
4600
5049
  type: 'image' | 'video' | 'audio' | 'file';
@@ -4610,6 +5059,7 @@ declare class AXConversationFilePickerComponent implements OnDestroy, AXConversa
4610
5059
  private readonly composerServiceFromInjector;
4611
5060
  private get composerService();
4612
5061
  private readonly toast;
5062
+ private readonly popupService;
4613
5063
  readonly translation: AXTranslationService;
4614
5064
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4615
5065
  readonly maxFiles: _angular_core.InputSignal<number>;
@@ -4626,22 +5076,27 @@ declare class AXConversationFilePickerComponent implements OnDestroy, AXConversa
4626
5076
  readonly emptyIconClass: _angular_core.Signal<"fa-light fa-file text-neutral-500" | "fa-light fa-cloud-arrow-up">;
4627
5077
  private catalogFileTypeDef?;
4628
5078
  caption: string;
5079
+ groupItems: boolean;
4629
5080
  constructor();
4630
5081
  activate(): Promise<void>;
4631
5082
  private createUtilityContext;
4632
5083
  private getCatalogFileTypeDef;
4633
5084
  private pickerKind;
4634
5085
  handleFiles(fileList: File[]): Promise<void>;
5086
+ private buildAttachedFileEntry;
4635
5087
  private uploadFile;
4636
5088
  removeFile(index: number): void;
5089
+ renameFile(index: number): Promise<void>;
5090
+ replaceAttachment(index: number): Promise<void>;
4637
5091
  sendFiles(): Promise<void>;
4638
5092
  private updateFileProgress;
4639
5093
  private uploadFileWithProgress;
4640
5094
  cancel(): void;
4641
5095
  ngOnDestroy(): void;
4642
5096
  private dismissPicker;
5097
+ private revokePreview;
4643
5098
  getHeaderTitle(): string;
4644
- getFileBadge(fileName: string): AXConversationPickerFileBadge;
5099
+ truncateFileName(fileName: string): string;
4645
5100
  onAddMoreFiles(): void;
4646
5101
  getCancelUploadLabel(): string;
4647
5102
  formatFileSize(bytes: number): string;
@@ -4669,6 +5124,12 @@ declare class AXConversationImageFileTypeProvider extends AXFileTypeInfoProvider
4669
5124
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationImageFileTypeProvider>;
4670
5125
  }
4671
5126
 
5127
+ type AXConversationMediaGalleryLayoutMode = 'single' | 'dual' | 'triple' | 'masonry';
5128
+ interface AXConversationMediaGalleryRow<T> {
5129
+ items: T[];
5130
+ startIndex: number;
5131
+ }
5132
+
4672
5133
  interface AXConversationImageFile extends AXConversationComposerPickerUploadItem {
4673
5134
  preview: string;
4674
5135
  }
@@ -4680,6 +5141,7 @@ declare class AXConversationImagePickerComponent implements OnDestroy, AXConvers
4680
5141
  private readonly composerServiceFromInjector;
4681
5142
  private get composerService();
4682
5143
  private readonly uploader;
5144
+ private readonly popupService;
4683
5145
  private readonly fileService;
4684
5146
  private readonly fileTypeRegistry;
4685
5147
  private readonly platformId;
@@ -4697,7 +5159,11 @@ declare class AXConversationImagePickerComponent implements OnDestroy, AXConvers
4697
5159
  readonly isDragging: _angular_core.WritableSignal<boolean>;
4698
5160
  readonly emptyIconClass: _angular_core.Signal<"fa-light fa-image text-purple-500" | "fa-light fa-cloud-arrow-up">;
4699
5161
  caption: string;
5162
+ groupItems: boolean;
5163
+ sendAsDocuments: boolean;
4700
5164
  readonly allowMultiple: _angular_core.Signal<boolean>;
5165
+ readonly layoutMode: _angular_core.Signal<AXConversationMediaGalleryLayoutMode>;
5166
+ readonly mediaRows: _angular_core.Signal<AXConversationMediaGalleryRow<AXConversationImageFile>[]>;
4701
5167
  private imageFileType?;
4702
5168
  constructor();
4703
5169
  activate(): Promise<void>;
@@ -4707,7 +5173,11 @@ declare class AXConversationImagePickerComponent implements OnDestroy, AXConvers
4707
5173
  private uploadImageAt;
4708
5174
  private patchImage;
4709
5175
  removeImage(index: number): void;
5176
+ replaceAttachment(index: number): Promise<void>;
5177
+ editImage(index: number): Promise<void>;
5178
+ private applyReplacementFile;
4710
5179
  sendImages(): Promise<void>;
5180
+ private sendImagesAsDocuments;
4711
5181
  canSend(): boolean;
4712
5182
  getUploadingLabel(progress: number): string;
4713
5183
  getCancelUploadLabel(): string;
@@ -4741,12 +5211,16 @@ declare class AXConversationLocationPickerComponent {
4741
5211
  }
4742
5212
 
4743
5213
  declare class AXConversationPickerFooterComponent {
4744
- readonly sendText: _angular_core.InputSignal<string>;
5214
+ readonly showAdd: _angular_core.InputSignal<boolean>;
5215
+ readonly addLabel: _angular_core.InputSignal<string>;
5216
+ readonly cancelLabel: _angular_core.InputSignal<string>;
5217
+ readonly sendLabel: _angular_core.InputSignal<string>;
4745
5218
  readonly sendDisabled: _angular_core.InputSignal<boolean>;
5219
+ readonly onAdd: _angular_core.OutputEmitterRef<void>;
4746
5220
  readonly onCancel: _angular_core.OutputEmitterRef<void>;
4747
5221
  readonly onSend: _angular_core.OutputEmitterRef<void>;
4748
5222
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationPickerFooterComponent, never>;
4749
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationPickerFooterComponent, "ax-conversation-picker-footer", never, { "sendText": { "alias": "sendText"; "required": true; "isSignal": true; }; "sendDisabled": { "alias": "sendDisabled"; "required": false; "isSignal": true; }; }, { "onCancel": "onCancel"; "onSend": "onSend"; }, never, never, true, never>;
5223
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationPickerFooterComponent, "ax-conversation-picker-footer", never, { "showAdd": { "alias": "showAdd"; "required": false; "isSignal": true; }; "addLabel": { "alias": "addLabel"; "required": false; "isSignal": true; }; "cancelLabel": { "alias": "cancelLabel"; "required": true; "isSignal": true; }; "sendLabel": { "alias": "sendLabel"; "required": true; "isSignal": true; }; "sendDisabled": { "alias": "sendDisabled"; "required": false; "isSignal": true; }; }, { "onAdd": "onAdd"; "onCancel": "onCancel"; "onSend": "onSend"; }, never, never, true, never>;
4750
5224
  }
4751
5225
 
4752
5226
  declare class AXConversationPickerHeaderComponent {
@@ -4759,6 +5233,17 @@ declare class AXConversationPickerHeaderComponent {
4759
5233
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationPickerHeaderComponent, "ax-conversation-picker-header", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "showMenu": { "alias": "showMenu"; "required": false; "isSignal": true; }; "addMoreLabel": { "alias": "addMoreLabel"; "required": false; "isSignal": true; }; }, { "onClose": "onClose"; "onAddMore": "onAddMore"; }, never, never, true, never>;
4760
5234
  }
4761
5235
 
5236
+ /** Extract OS-copied files from a paste event (e.g. Ctrl+V after copying a file in Explorer). */
5237
+ declare function filesFromClipboardEvent(event: ClipboardEvent): File[];
5238
+
5239
+ interface AXConversationMediaDimensions {
5240
+ width: number;
5241
+ height: number;
5242
+ duration: number;
5243
+ }
5244
+ declare function probeImageDimensions(source: Blob | string): Promise<Pick<AXConversationMediaDimensions, 'width' | 'height'>>;
5245
+ declare function probeVideoMedia(source: Blob): Promise<AXConversationMediaDimensions>;
5246
+
4762
5247
  declare function formatFileSize(bytes: number): string;
4763
5248
  declare function formatDuration(seconds: number): string;
4764
5249
 
@@ -4771,14 +5256,29 @@ declare function resolvePersistableMediaUrl(url: string | undefined): string | u
4771
5256
  /** First non-empty URL for img/video/audio at runtime (includes resolved blob: URLs). */
4772
5257
  declare function pickDisplayMediaUrl(...candidates: (string | null | undefined)[]): string;
4773
5258
 
4774
- /** Telegram-style caption row with emoji affordance and circular send button. */
5259
+ /** Caption field with emoji picker for composer media pickers. */
4775
5260
  declare class AXConversationPickerCaptionComponent {
4776
5261
  readonly translation: AXTranslationService;
4777
5262
  readonly caption: _angular_core.ModelSignal<string>;
5263
+ readonly showInlineSend: _angular_core.InputSignal<boolean>;
4778
5264
  readonly sendDisabled: _angular_core.InputSignal<boolean>;
4779
5265
  readonly onSend: _angular_core.OutputEmitterRef<void>;
5266
+ private readonly emojiPopoverRef;
5267
+ onEmojiClick(event: AXClickEvent): void;
5268
+ onEmojiSelected(emoji: string): void;
5269
+ onCaptionKeyDown(event: AXHtmlEvent<KeyboardEvent>): void;
4780
5270
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationPickerCaptionComponent, never>;
4781
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationPickerCaptionComponent, "ax-conversation-picker-caption", never, { "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "sendDisabled": { "alias": "sendDisabled"; "required": false; "isSignal": true; }; }, { "caption": "captionChange"; "onSend": "onSend"; }, never, never, true, never>;
5271
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationPickerCaptionComponent, "ax-conversation-picker-caption", never, { "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "showInlineSend": { "alias": "showInlineSend"; "required": false; "isSignal": true; }; "sendDisabled": { "alias": "sendDisabled"; "required": false; "isSignal": true; }; }, { "caption": "captionChange"; "onSend": "onSend"; }, never, never, true, never>;
5272
+ }
5273
+
5274
+ /** Grouping and delivery options shown below composer picker previews. */
5275
+ declare class AXConversationPickerOptionsComponent {
5276
+ readonly showGroupItems: _angular_core.InputSignal<boolean>;
5277
+ readonly showSendAsDocuments: _angular_core.InputSignal<boolean>;
5278
+ readonly groupItems: _angular_core.ModelSignal<boolean>;
5279
+ readonly sendAsDocuments: _angular_core.ModelSignal<boolean>;
5280
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationPickerOptionsComponent, never>;
5281
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationPickerOptionsComponent, "ax-conversation-picker-options", never, { "showGroupItems": { "alias": "showGroupItems"; "required": false; "isSignal": true; }; "showSendAsDocuments": { "alias": "showSendAsDocuments"; "required": false; "isSignal": true; }; "groupItems": { "alias": "groupItems"; "required": false; "isSignal": true; }; "sendAsDocuments": { "alias": "sendAsDocuments"; "required": false; "isSignal": true; }; }, { "groupItems": "groupItemsChange"; "sendAsDocuments": "sendAsDocumentsChange"; }, never, never, true, never>;
4782
5282
  }
4783
5283
 
4784
5284
  /** Shared drag-and-drop handlers for composer pickers. */
@@ -4800,12 +5300,19 @@ declare class AXConversationPickerEmptyComponent {
4800
5300
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationPickerEmptyComponent, "ax-conversation-picker-empty", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "hint": { "alias": "hint"; "required": true; "isSignal": true; }; "iconClass": { "alias": "iconClass"; "required": true; "isSignal": true; }; "dragOver": { "alias": "dragOver"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4801
5301
  }
4802
5302
 
5303
+ /** Active composer picker paste handlers (top-most popup wins). */
5304
+ type AXConversationPickerPasteHandler = (files: File[]) => void;
5305
+ declare function registerComposerPickerPasteHandler(handler: AXConversationPickerPasteHandler): () => void;
5306
+ declare function getActiveComposerPickerPasteHandler(): AXConversationPickerPasteHandler | undefined;
5307
+
4803
5308
  /**
4804
5309
  * Wraps composer pickers with {@link AXUploaderZoneDirective} for browse, drop, and validation.
4805
5310
  */
4806
5311
  declare class AXConversationPickerShellComponent {
4807
5312
  private readonly toast;
4808
5313
  private readonly translation;
5314
+ private readonly uploader;
5315
+ private readonly destroyRef;
4809
5316
  private readonly zone;
4810
5317
  readonly fileType: _angular_core.InputSignal<string>;
4811
5318
  readonly multiple: _angular_core.InputSignal<boolean>;
@@ -4813,9 +5320,13 @@ declare class AXConversationPickerShellComponent {
4813
5320
  readonly dragEnter: _angular_core.OutputEmitterRef<DragEvent>;
4814
5321
  readonly dragLeave: _angular_core.OutputEmitterRef<DragEvent>;
4815
5322
  readonly dragOver: _angular_core.OutputEmitterRef<DragEvent>;
5323
+ constructor();
4816
5324
  /** Open the OS file picker for this shell's catalog. */
4817
5325
  browse(): Promise<void>;
5326
+ protected onHostPaste(event: ClipboardEvent): void;
4818
5327
  protected onZoneFileChange(event: AXUploaderFileChangeEvent): void;
5328
+ private ingestPastedFiles;
5329
+ private emitValidatedFiles;
4819
5330
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationPickerShellComponent, never>;
4820
5331
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationPickerShellComponent, "ax-conversation-picker-shell", never, { "fileType": { "alias": "fileType"; "required": true; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; }, { "filesSelected": "filesSelected"; "dragEnter": "dragEnter"; "dragLeave": "dragLeave"; "dragOver": "dragOver"; }, never, ["*"], true, never>;
4821
5332
  }
@@ -4838,6 +5349,7 @@ declare class AXConversationStickerTabComponent {
4838
5349
  private readonly http;
4839
5350
  private readonly destroyRef;
4840
5351
  private readonly apiKey;
5352
+ protected readonly translation: AXTranslationService;
4841
5353
  readonly itemSelected: _angular_core.OutputEmitterRef<AXConversationStickerPayload>;
4842
5354
  readonly searchQuery: _angular_core.WritableSignal<string>;
4843
5355
  readonly activeStickers: _angular_core.WritableSignal<AXConversationStickerPayload[]>;
@@ -4876,13 +5388,18 @@ declare class AXConversationVideoFileTypeProvider extends AXFileTypeInfoProvider
4876
5388
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationVideoFileTypeProvider>;
4877
5389
  }
4878
5390
 
4879
- declare function videoItemFromUpload(file: File, result: AXConversationUploaderResult, duration: number): AXConversationVideoMediaItem;
5391
+ declare function videoItemFromUpload(file: File, result: AXConversationUploaderResult, duration: number, size?: {
5392
+ width?: number;
5393
+ height?: number;
5394
+ }): Promise<AXConversationVideoMediaItem>;
4880
5395
  declare function mergeVideoUploadResult(payload: AXConversationMessagePayload, result: AXUploadResult): AXConversationMessagePayload;
4881
5396
  declare function applyVideoLocalPreview(payload: AXConversationMessagePayload, localUrl: string, mimeType?: string): AXConversationMessagePayload;
4882
5397
 
4883
5398
  interface AXConversationVideoFile extends AXConversationComposerPickerUploadItem {
4884
5399
  preview?: string;
4885
5400
  duration?: number;
5401
+ width?: number;
5402
+ height?: number;
4886
5403
  }
4887
5404
  declare class AXConversationVideoPickerComponent implements OnDestroy, AXConversationComposerActionComponent {
4888
5405
  private uploadsDismissed;
@@ -4907,7 +5424,11 @@ declare class AXConversationVideoPickerComponent implements OnDestroy, AXConvers
4907
5424
  readonly isDragging: _angular_core.WritableSignal<boolean>;
4908
5425
  private readonly pickerShell;
4909
5426
  caption: string;
5427
+ groupItems: boolean;
5428
+ sendAsDocuments: boolean;
4910
5429
  readonly allowMultiple: _angular_core.Signal<boolean>;
5430
+ readonly layoutMode: _angular_core.Signal<AXConversationMediaGalleryLayoutMode>;
5431
+ readonly mediaRows: _angular_core.Signal<AXConversationMediaGalleryRow<AXConversationVideoFile>[]>;
4911
5432
  readonly typeIconClass: "fa-light fa-video ax-text-blue-500";
4912
5433
  readonly emptyIconClass: _angular_core.Signal<"fa-light fa-video ax-text-blue-500" | "fa-light fa-cloud-arrow-up">;
4913
5434
  private catalogFileTypeDef?;
@@ -4920,7 +5441,9 @@ declare class AXConversationVideoPickerComponent implements OnDestroy, AXConvers
4920
5441
  private uploadVideoAt;
4921
5442
  private patchVideo;
4922
5443
  removeVideo(index: number): void;
5444
+ replaceAttachment(index: number): Promise<void>;
4923
5445
  sendVideos(): Promise<void>;
5446
+ private sendVideosAsDocuments;
4924
5447
  canSend(): boolean;
4925
5448
  getUploadingLabel(progress: number): string;
4926
5449
  getCancelUploadLabel(): string;
@@ -4974,31 +5497,71 @@ declare class AXConversationVoiceRecorderComponent implements AXConversationComp
4974
5497
  readonly recordingComplete: _angular_core.OutputEmitterRef<Blob>;
4975
5498
  readonly recordingCancelled: _angular_core.OutputEmitterRef<void>;
4976
5499
  readonly isRecording: _angular_core.WritableSignal<boolean>;
5500
+ readonly isPreview: _angular_core.WritableSignal<boolean>;
5501
+ readonly isPlayingPreview: _angular_core.WritableSignal<boolean>;
4977
5502
  readonly isUploading: _angular_core.WritableSignal<boolean>;
4978
5503
  readonly uploadProgress: _angular_core.WritableSignal<number>;
4979
5504
  readonly recordingDuration: _angular_core.WritableSignal<number>;
5505
+ readonly previewUrl: _angular_core.WritableSignal<string>;
5506
+ readonly livePeaks: _angular_core.WritableSignal<number[]>;
5507
+ readonly liveBarCount: _angular_core.WritableSignal<number>;
4980
5508
  private recordingStartTime;
4981
5509
  private timerInterval?;
4982
5510
  private mediaRecorder?;
4983
5511
  private audioChunks;
4984
5512
  private activeStream?;
4985
5513
  private cancelled;
5514
+ private sendAfterStop;
5515
+ private sendInFlight;
5516
+ private awaitingPreviewData;
5517
+ private previewBlob;
4986
5518
  private uploadAbortController?;
5519
+ private audioContext?;
5520
+ private analyser?;
5521
+ private timeDomain;
5522
+ private rafId;
5523
+ private lastLivePeakAt;
5524
+ private waveResizeObserver?;
5525
+ private readonly waveWrapRef;
5526
+ private readonly waveRef;
4987
5527
  readonly formattedTime: _angular_core.Signal<string>;
5528
+ readonly canSend: _angular_core.Signal<boolean>;
5529
+ readonly liveDisplayBars: _angular_core.Signal<{
5530
+ index: number;
5531
+ recorded: boolean;
5532
+ height: number;
5533
+ }[]>;
5534
+ readonly waveConfig: _angular_core.Signal<AXWaveConfig>;
4988
5535
  constructor();
4989
5536
  activate(): Promise<void>;
4990
5537
  startRecording(): Promise<void>;
4991
5538
  private dismissHost;
4992
- /** Stop recording and send */
5539
+ toggleStopOrContinue(): void;
4993
5540
  stopRecording(): void;
5541
+ sendRecording(): void;
5542
+ deleteRecording(): void;
4994
5543
  cancelRecording(): void;
4995
- /** Close the voice recorder */
4996
5544
  cancel(): void;
5545
+ togglePreview(): void;
5546
+ onWaveStatusChanged(event: AXAudioWaveChangeEvent): void;
4997
5547
  abortInProgressUploads(): void;
4998
- /** Clear timer */
5548
+ private pauseRecording;
5549
+ private continueRecording;
5550
+ private flushPreviewIfWaiting;
5551
+ private buildRecordingBlob;
5552
+ private discardActiveRecorder;
5553
+ private releaseStream;
5554
+ private startLiveWave;
5555
+ private observeWaveWidth;
5556
+ private updateBarCount;
5557
+ private tickLiveWave;
5558
+ private stopLiveWave;
5559
+ private enterPreview;
5560
+ private pausePreview;
5561
+ private clearPreview;
5562
+ private clearPreviewUrl;
4999
5563
  private clearTimer;
5000
5564
  getUploadingLabel(): string;
5001
- /** Send voice message */
5002
5565
  private sendVoiceMessage;
5003
5566
  private stopAndCleanup;
5004
5567
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationVoiceRecorderComponent, never>;
@@ -5117,7 +5680,10 @@ declare const AX_CONVERSATION_INFO_BAR_BLOCK_ACTION: AXConversationInfoBarAction
5117
5680
  declare function toUploaderReference(item: AXConversationMediaItemFields): AXConversationUploaderReference;
5118
5681
 
5119
5682
  declare class AXConversationAudioAttachmentComponent {
5683
+ private readonly platformId;
5684
+ protected readonly translation: AXTranslationService;
5120
5685
  readonly item: _angular_core.InputSignal<AXConversationAudioMediaItem>;
5686
+ readonly look: _angular_core.InputSignal<"file" | "player">;
5121
5687
  readonly playingChange: _angular_core.OutputEmitterRef<boolean>;
5122
5688
  readonly timeUpdate: _angular_core.OutputEmitterRef<number>;
5123
5689
  readonly durationChange: _angular_core.OutputEmitterRef<number>;
@@ -5126,23 +5692,45 @@ declare class AXConversationAudioAttachmentComponent {
5126
5692
  private readonly audioElementRef;
5127
5693
  private readonly mediaReference;
5128
5694
  private readonly resolvedUrl;
5695
+ readonly isPlaying: _angular_core.WritableSignal<boolean>;
5696
+ readonly currentTime: _angular_core.WritableSignal<number>;
5697
+ readonly liveDuration: _angular_core.WritableSignal<number>;
5698
+ readonly coverVisible: _angular_core.WritableSignal<boolean>;
5129
5699
  readonly audioUrl: _angular_core.Signal<string>;
5130
5700
  readonly title: _angular_core.Signal<string>;
5701
+ readonly coverUrl: _angular_core.Signal<string>;
5131
5702
  readonly duration: _angular_core.Signal<number>;
5703
+ readonly effectiveDuration: _angular_core.Signal<number>;
5704
+ readonly sliderMax: _angular_core.Signal<number>;
5705
+ readonly currentTimeLabel: _angular_core.Signal<string>;
5132
5706
  readonly durationLabel: _angular_core.Signal<string>;
5707
+ readonly downloadName: _angular_core.Signal<string>;
5708
+ constructor();
5133
5709
  togglePlay(): void;
5710
+ onPlayClick(event: AXClickEvent): void;
5711
+ onNativePlayClick(event: Event): void;
5134
5712
  pause(): void;
5713
+ setPlaybackRate(rate: number): void;
5714
+ setMuted(muted: boolean): void;
5715
+ onSeek(value: AXRangeSliderValue): void;
5135
5716
  onPlay(): void;
5136
5717
  onPause(): void;
5137
5718
  onTimeUpdate(): void;
5138
5719
  onLoadedMetadata(): void;
5139
5720
  onEnded(): void;
5140
5721
  onError(): void;
5722
+ onCoverError(): void;
5141
5723
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAudioAttachmentComponent, never>;
5142
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAudioAttachmentComponent, "ax-conversation-audio-attachment", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; }, { "playingChange": "playingChange"; "timeUpdate": "timeUpdate"; "durationChange": "durationChange"; "playbackEnded": "playbackEnded"; "playbackError": "playbackError"; }, never, never, true, never>;
5724
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAudioAttachmentComponent, "ax-conversation-audio-attachment", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "look": { "alias": "look"; "required": false; "isSignal": true; }; }, { "playingChange": "playingChange"; "timeUpdate": "timeUpdate"; "durationChange": "durationChange"; "playbackEnded": "playbackEnded"; "playbackError": "playbackError"; }, never, never, true, never>;
5143
5725
  }
5144
5726
 
5727
+ type AXConversationFileVisualKind = 'image' | 'video' | 'audio' | 'file';
5728
+
5145
5729
  declare class AXConversationFileAttachmentComponent {
5730
+ private readonly platformId;
5731
+ private readonly document;
5732
+ protected readonly translation: AXTranslationService;
5733
+ private readonly thumbImage;
5146
5734
  readonly item: _angular_core.InputSignal<AXConversationFileMediaItem>;
5147
5735
  private readonly mediaReference;
5148
5736
  private readonly resolvedUrl;
@@ -5150,8 +5738,12 @@ declare class AXConversationFileAttachmentComponent {
5150
5738
  readonly fileName: _angular_core.Signal<string>;
5151
5739
  readonly fileSize: _angular_core.Signal<number>;
5152
5740
  readonly fileExtension: _angular_core.Signal<string>;
5153
- readonly swatchColor: _angular_core.Signal<string>;
5154
5741
  readonly formattedSize: _angular_core.Signal<string>;
5742
+ readonly kind: _angular_core.Signal<AXConversationFileVisualKind>;
5743
+ readonly isMedia: _angular_core.Signal<boolean>;
5744
+ readonly thumbUrl: _angular_core.Signal<string>;
5745
+ readonly previewSrc: _angular_core.Signal<string>;
5746
+ openImage(event: Event): void;
5155
5747
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationFileAttachmentComponent, never>;
5156
5748
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationFileAttachmentComponent, "ax-conversation-file-attachment", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5157
5749
  }
@@ -5165,16 +5757,19 @@ declare class AXConversationImageAttachmentComponent {
5165
5757
  private readonly document;
5166
5758
  readonly item: _angular_core.InputSignal<AXConversationImageMediaItem>;
5167
5759
  readonly alt: _angular_core.InputSignal<string>;
5760
+ /** When false, skip aspect-ratio reservation (gallery cells already have a fixed size). */
5761
+ readonly reserveAspect: _angular_core.InputSignal<boolean>;
5168
5762
  readonly ready: _angular_core.WritableSignal<boolean>;
5763
+ readonly aspectRatio: _angular_core.Signal<string>;
5169
5764
  private readonly mediaReference;
5170
5765
  private readonly resolvedUrl;
5171
5766
  readonly displayUrl: _angular_core.Signal<string>;
5172
5767
  constructor();
5173
5768
  onImageLoad(): void;
5174
5769
  onImageError(): void;
5175
- toggleFullscreen(event: MouseEvent): void;
5770
+ toggleFullscreen(event: AXClickEvent): void;
5176
5771
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationImageAttachmentComponent, never>;
5177
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationImageAttachmentComponent, "ax-conversation-image-attachment", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5772
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationImageAttachmentComponent, "ax-conversation-image-attachment", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "reserveAspect": { "alias": "reserveAspect"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5178
5773
  }
5179
5774
 
5180
5775
  interface AXConversationPlaybackBannerInputs {
@@ -5187,8 +5782,12 @@ interface AXConversationPlaybackBannerInputs {
5187
5782
  playbackSpeed?: number;
5188
5783
  onCycleSpeed?: () => void;
5189
5784
  showSpeedControl?: boolean;
5785
+ isMuted?: boolean;
5786
+ onToggleMute?: () => void;
5787
+ showMuteControl?: boolean;
5190
5788
  }
5191
5789
  declare class AXConversationMediaPlaybackInfoBarBannerComponent implements AXConversationMessageInfoBarBannerComponent {
5790
+ protected readonly translation: AXTranslationService;
5192
5791
  readonly message: _angular_core.InputSignal<AXConversationMessage>;
5193
5792
  readonly title: _angular_core.InputSignal<string>;
5194
5793
  readonly currentTime: _angular_core.InputSignal<number>;
@@ -5198,14 +5797,18 @@ declare class AXConversationMediaPlaybackInfoBarBannerComponent implements AXCon
5198
5797
  readonly playbackSpeed: _angular_core.InputSignal<number>;
5199
5798
  readonly onCycleSpeed: _angular_core.InputSignal<() => void>;
5200
5799
  readonly showSpeedControl: _angular_core.InputSignal<boolean>;
5800
+ readonly isMuted: _angular_core.InputSignal<boolean>;
5801
+ readonly onToggleMute: _angular_core.InputSignal<() => void>;
5802
+ readonly showMuteControl: _angular_core.InputSignal<boolean>;
5201
5803
  readonly iconClass: _angular_core.Signal<string>;
5202
5804
  readonly resolvedTitle: _angular_core.Signal<string>;
5203
5805
  readonly progressPercent: _angular_core.Signal<number>;
5204
5806
  readonly timeLabel: _angular_core.Signal<string>;
5205
5807
  onTogglePlayClick(): void;
5206
5808
  onCycleSpeedClick(): void;
5809
+ onToggleMuteClick(): void;
5207
5810
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationMediaPlaybackInfoBarBannerComponent, never>;
5208
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationMediaPlaybackInfoBarBannerComponent, "ax-conversation-media-playback-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; }; "isPlaying": { "alias": "isPlaying"; "required": false; "isSignal": true; }; "onTogglePlay": { "alias": "onTogglePlay"; "required": false; "isSignal": true; }; "playbackSpeed": { "alias": "playbackSpeed"; "required": false; "isSignal": true; }; "onCycleSpeed": { "alias": "onCycleSpeed"; "required": false; "isSignal": true; }; "showSpeedControl": { "alias": "showSpeedControl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5811
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationMediaPlaybackInfoBarBannerComponent, "ax-conversation-media-playback-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; }; "isPlaying": { "alias": "isPlaying"; "required": false; "isSignal": true; }; "onTogglePlay": { "alias": "onTogglePlay"; "required": false; "isSignal": true; }; "playbackSpeed": { "alias": "playbackSpeed"; "required": false; "isSignal": true; }; "onCycleSpeed": { "alias": "onCycleSpeed"; "required": false; "isSignal": true; }; "showSpeedControl": { "alias": "showSpeedControl"; "required": false; "isSignal": true; }; "isMuted": { "alias": "isMuted"; "required": false; "isSignal": true; }; "onToggleMute": { "alias": "onToggleMute"; "required": false; "isSignal": true; }; "showMuteControl": { "alias": "showMuteControl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5209
5812
  }
5210
5813
 
5211
5814
  /**
@@ -5255,10 +5858,11 @@ declare class AXConversationMessageRendererStateComponent {
5255
5858
  readonly contentRetry: _angular_core.OutputEmitterRef<void>;
5256
5859
  readonly retryBusy: _angular_core.WritableSignal<boolean>;
5257
5860
  private readonly currentUser;
5258
- private readonly isOwn;
5861
+ readonly isOwn: _angular_core.Signal<boolean>;
5259
5862
  readonly showFailed: _angular_core.Signal<boolean>;
5260
5863
  readonly showContentError: _angular_core.Signal<boolean>;
5261
5864
  readonly hasVisibleChrome: _angular_core.Signal<boolean>;
5865
+ readonly resolvedContentErrorIconClass: _angular_core.Signal<string>;
5262
5866
  readonly contentErrorText: _angular_core.Signal<string>;
5263
5867
  readonly deliveryFailedText: _angular_core.Signal<string>;
5264
5868
  onRetry(): Promise<void>;
@@ -5276,6 +5880,8 @@ declare function syncPlaybackInfoBarBanner(infoBar: AXConversationInfoBarService
5276
5880
 
5277
5881
  declare class AXConversationVideoAttachmentComponent {
5278
5882
  readonly item: _angular_core.InputSignal<AXConversationVideoMediaItem>;
5883
+ /** When false, skip aspect-ratio reservation (gallery cells already have a fixed size). */
5884
+ readonly reserveAspect: _angular_core.InputSignal<boolean>;
5279
5885
  readonly playingChange: _angular_core.OutputEmitterRef<boolean>;
5280
5886
  readonly timeUpdate: _angular_core.OutputEmitterRef<number>;
5281
5887
  readonly durationChange: _angular_core.OutputEmitterRef<number>;
@@ -5287,6 +5893,7 @@ declare class AXConversationVideoAttachmentComponent {
5287
5893
  readonly playbackUrl: _angular_core.Signal<string>;
5288
5894
  readonly duration: _angular_core.Signal<number>;
5289
5895
  readonly durationLabel: _angular_core.Signal<string>;
5896
+ readonly aspectRatio: _angular_core.Signal<string>;
5290
5897
  togglePlay(): void;
5291
5898
  pause(): void;
5292
5899
  onLoadedMetadata(): void;
@@ -5296,7 +5903,7 @@ declare class AXConversationVideoAttachmentComponent {
5296
5903
  onEnded(): void;
5297
5904
  onError(): void;
5298
5905
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationVideoAttachmentComponent, never>;
5299
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationVideoAttachmentComponent, "ax-conversation-video-attachment", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; }, { "playingChange": "playingChange"; "timeUpdate": "timeUpdate"; "durationChange": "durationChange"; "playbackEnded": "playbackEnded"; "playbackError": "playbackError"; }, never, never, true, never>;
5906
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationVideoAttachmentComponent, "ax-conversation-video-attachment", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "reserveAspect": { "alias": "reserveAspect"; "required": false; "isSignal": true; }; }, { "playingChange": "playingChange"; "timeUpdate": "timeUpdate"; "durationChange": "durationChange"; "playbackEnded": "playbackEnded"; "playbackError": "playbackError"; }, never, never, true, never>;
5300
5907
  }
5301
5908
 
5302
5909
  declare class AXConversationAudioRendererComponent extends AXConversationMessageRendererCopyHostComponent {
@@ -5306,185 +5913,27 @@ declare class AXConversationAudioRendererComponent extends AXConversationMessage
5306
5913
  private readonly infoBarService;
5307
5914
  private readonly attachments;
5308
5915
  private readonly _contentState;
5309
- private readonly activeTrackIndex;
5310
- private readonly isPlaying;
5311
- private readonly currentTime;
5312
- private readonly duration;
5313
- readonly message: _angular_core.InputSignal<AXConversationMessage>;
5314
- readonly rendererState: _angular_core.Signal<{
5315
- deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5316
- contentState: AXConversationMessageRendererContentState;
5317
- }>;
5318
- readonly payload: _angular_core.Signal<AXConversationAudioPayload>;
5319
- readonly audios: _angular_core.Signal<_acorex_components_conversation.AXConversationAudioMediaItem[]>;
5320
- readonly caption: _angular_core.Signal<string>;
5321
- readonly audioLoadErrorLabel: _angular_core.Signal<string>;
5322
- copy(): Promise<string>;
5323
- constructor();
5324
- onPlayingChange(index: number, playing: boolean): void;
5325
- onTimeUpdate(index: number, time: number): void;
5326
- onDurationChange(index: number, duration: number): void;
5327
- onPlaybackEnded(index: number): void;
5328
- onPlaybackError(): void;
5329
- togglePlay(): void;
5330
- private pauseOtherTracks;
5331
- private pausePlayback;
5332
- private syncInfoBarBanner;
5333
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAudioRendererComponent, never>;
5334
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAudioRendererComponent, "ax-conversation-audio-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5335
- }
5336
-
5337
- declare function normalizeAudioPayload(payload: AXConversationAudioPayload): AXConversationAudioPayload;
5338
-
5339
- declare class AXConversationFallbackRendererComponent implements AXConversationMessageRendererComponent {
5340
- private readonly _contentState;
5341
- readonly message: _angular_core.InputSignal<AXConversationMessage>;
5342
- readonly rendererState: _angular_core.Signal<{
5343
- deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5344
- contentState: AXConversationMessageRendererContentState;
5345
- }>;
5346
- readonly messageTypeLabel: _angular_core.Signal<string>;
5347
- /** Same tone as content-error default in {@link AXConversationMessageRendererStateComponent}. */
5348
- readonly fallbackDescription: _angular_core.Signal<string>;
5349
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationFallbackRendererComponent, never>;
5350
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationFallbackRendererComponent, "ax-conversation-fallback-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5351
- }
5352
-
5353
- declare class AXConversationFileRendererComponent extends AXConversationMessageRendererCopyHostComponent {
5354
- private readonly fileTypes;
5355
- readonly message: _angular_core.InputSignal<AXConversationMessage>;
5356
- readonly rendererState: _angular_core.Signal<{
5357
- deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5358
- contentState: "ready";
5359
- }>;
5360
- readonly payload: _angular_core.Signal<AXConversationFilePayload>;
5361
- readonly files: _angular_core.Signal<_acorex_components_conversation.AXConversationFileMediaItem[]>;
5362
- readonly caption: _angular_core.Signal<string>;
5363
- copy(): Promise<string>;
5364
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationFileRendererComponent, never>;
5365
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationFileRendererComponent, "ax-conversation-file-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5366
- }
5367
-
5368
- declare function normalizeFilePayload(payload: AXConversationFilePayload): AXConversationFilePayload;
5369
-
5370
- declare class AXConversationImageRendererComponent extends AXConversationMessageRendererCopyHostComponent {
5371
- private readonly fileTypes;
5372
- readonly message: _angular_core.InputSignal<AXConversationMessage>;
5373
- readonly rendererState: _angular_core.Signal<{
5374
- deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5375
- contentState: "ready";
5376
- }>;
5377
- readonly payload: _angular_core.Signal<AXConversationImagePayload>;
5378
- readonly images: _angular_core.Signal<_acorex_components_conversation.AXConversationImageMediaItem[]>;
5379
- readonly caption: _angular_core.Signal<string>;
5380
- copy(): Promise<string>;
5381
- readonly gridModeClass: _angular_core.Signal<"ax-conversation-msg__grid--single" | "ax-conversation-msg__grid--dual" | "ax-conversation-msg__grid--multi">;
5382
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationImageRendererComponent, never>;
5383
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationImageRendererComponent, "ax-conversation-image-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5384
- }
5385
-
5386
- /** Format image message payload for rendering (array shape, safe thumbnails). */
5387
- declare function normalizeImagePayload(payload: AXConversationImagePayload): AXConversationImagePayload;
5388
- /** Preferred URL for grid / lightbox (never inline base64 thumbnails). */
5389
- declare function resolveImageDisplayUrl(image: AXConversationImageMediaItem): string | undefined;
5390
-
5391
- declare class AXConversationLocationRendererComponent extends AXConversationMessageRendererCopyHostComponent {
5392
- private readonly _contentState;
5393
- readonly message: _angular_core.InputSignal<AXConversationMessage>;
5394
- readonly rendererState: _angular_core.Signal<{
5395
- deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5396
- contentState: AXConversationMessageRendererContentState;
5397
- }>;
5398
- readonly payload: _angular_core.Signal<AXConversationLocationPayload>;
5399
- readonly latitude: _angular_core.Signal<number>;
5400
- readonly longitude: _angular_core.Signal<number>;
5401
- readonly locationName: _angular_core.Signal<string>;
5402
- readonly address: _angular_core.Signal<string>;
5403
- readonly coordinatesText: _angular_core.Signal<string>;
5404
- readonly mapsUrl: _angular_core.Signal<string>;
5405
- copy(): string;
5406
- readonly markers: _angular_core.Signal<{
5407
- latitude: number;
5408
- longitude: number;
5409
- popup: string;
5410
- popupOpen: boolean;
5411
- popupCloseButton: boolean;
5412
- }[]>;
5413
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationLocationRendererComponent, never>;
5414
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationLocationRendererComponent, "ax-conversation-location-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5415
- }
5416
-
5417
- declare class AXConversationStickerRendererComponent implements AXConversationMessageRendererComponent {
5418
- private readonly _contentState;
5419
- readonly message: _angular_core.InputSignal<AXConversationMessage>;
5420
- readonly rendererState: _angular_core.Signal<{
5421
- deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5422
- contentState: AXConversationMessageRendererContentState;
5423
- }>;
5424
- readonly payload: _angular_core.Signal<AXConversationStickerPayload>;
5425
- private readonly mediaReference;
5426
- private readonly resolvedUrl;
5427
- readonly stickerUrl: _angular_core.Signal<string>;
5428
- readonly alt: _angular_core.Signal<string>;
5429
- constructor();
5430
- onLoad(): void;
5431
- onError(): void;
5432
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationStickerRendererComponent, never>;
5433
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationStickerRendererComponent, "ax-conversation-sticker-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5434
- }
5435
-
5436
- declare class AXConversationSystemRendererComponent implements AXConversationMessageRendererComponent {
5437
- private readonly _contentState;
5438
- readonly message: _angular_core.InputSignal<AXConversationMessage>;
5439
- readonly rendererState: _angular_core.Signal<{
5440
- deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5441
- contentState: AXConversationMessageRendererContentState;
5442
- }>;
5443
- readonly payload: _angular_core.Signal<AXConversationSystemPayload>;
5444
- readonly iconClass: _angular_core.Signal<string>;
5445
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationSystemRendererComponent, never>;
5446
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationSystemRendererComponent, "ax-conversation-system-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5447
- }
5448
-
5449
- declare class AXConversationTextRendererComponent extends AXConversationMessageRendererCopyHostComponent {
5450
- private readonly infoBarService;
5451
- private readonly sanitizer;
5452
- private readonly _contentState;
5453
- readonly message: _angular_core.InputSignal<AXConversationMessage>;
5454
- readonly rendererState: _angular_core.Signal<{
5455
- deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5456
- contentState: AXConversationMessageRendererContentState;
5457
- }>;
5458
- readonly searchQuery: _angular_core.Signal<string>;
5459
- copy(): string;
5460
- readonly formattedText: _angular_core.Signal<SafeHtml>;
5461
- private linkify;
5462
- private highlightSearch;
5463
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationTextRendererComponent, never>;
5464
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationTextRendererComponent, "ax-conversation-text-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5465
- }
5466
-
5467
- declare class AXConversationVideoRendererComponent extends AXConversationMessageRendererCopyHostComponent {
5468
- private readonly fileTypes;
5469
- private readonly translation;
5470
- private readonly platformId;
5471
- private readonly destroyRef;
5472
- private readonly infoBarService;
5473
- private readonly attachments;
5474
- private readonly _contentState;
5475
- private readonly activeVideoIndex;
5916
+ private readonly activeTrackIndex;
5917
+ private readonly isPlaying;
5918
+ private readonly currentTime;
5919
+ private readonly duration;
5920
+ readonly playbackSpeed: _angular_core.WritableSignal<number>;
5921
+ readonly isMuted: _angular_core.WritableSignal<boolean>;
5922
+ private lastBannerSyncAt;
5923
+ private readonly speeds;
5924
+ private readonly bannerTogglePlay;
5925
+ private readonly bannerClose;
5926
+ private readonly bannerCycleSpeed;
5927
+ private readonly bannerToggleMute;
5476
5928
  readonly message: _angular_core.InputSignal<AXConversationMessage>;
5477
5929
  readonly rendererState: _angular_core.Signal<{
5478
5930
  deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5479
5931
  contentState: AXConversationMessageRendererContentState;
5480
5932
  }>;
5481
- readonly isPlaying: _angular_core.WritableSignal<boolean>;
5482
- readonly currentTime: _angular_core.WritableSignal<number>;
5483
- readonly duration: _angular_core.WritableSignal<number>;
5484
- readonly payload: _angular_core.Signal<AXConversationVideoPayload>;
5485
- readonly videos: _angular_core.Signal<_acorex_components_conversation.AXConversationVideoMediaItem[]>;
5933
+ readonly payload: _angular_core.Signal<AXConversationAudioPayload>;
5934
+ readonly audios: _angular_core.Signal<_acorex_components_conversation.AXConversationAudioMediaItem[]>;
5486
5935
  readonly caption: _angular_core.Signal<string>;
5487
- readonly videoLoadErrorLabel: _angular_core.Signal<string>;
5936
+ readonly audioLoadErrorLabel: _angular_core.Signal<string>;
5488
5937
  copy(): Promise<string>;
5489
5938
  constructor();
5490
5939
  onPlayingChange(index: number, playing: boolean): void;
@@ -5493,498 +5942,472 @@ declare class AXConversationVideoRendererComponent extends AXConversationMessage
5493
5942
  onPlaybackEnded(index: number): void;
5494
5943
  onPlaybackError(): void;
5495
5944
  togglePlay(): void;
5496
- private pauseOtherVideos;
5945
+ cyclePlaybackSpeed(): void;
5946
+ toggleMute(): void;
5947
+ private pauseOtherTracks;
5497
5948
  private pausePlayback;
5949
+ private applyPlaybackSettings;
5498
5950
  private syncInfoBarBanner;
5499
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationVideoRendererComponent, never>;
5500
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationVideoRendererComponent, "ax-conversation-video-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5951
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAudioRendererComponent, never>;
5952
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAudioRendererComponent, "ax-conversation-audio-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5501
5953
  }
5502
5954
 
5503
- declare function normalizeVideoPayload(payload: AXConversationVideoPayload): AXConversationVideoPayload;
5955
+ declare function normalizeAudioPayload(payload: AXConversationAudioPayload): AXConversationAudioPayload;
5504
5956
 
5505
- declare class AXConversationVoiceRendererComponent extends AXConversationMessageRendererCopyHostComponent {
5957
+ declare class AXConversationFallbackRendererComponent implements AXConversationMessageRendererComponent {
5958
+ private readonly _contentState;
5959
+ readonly message: _angular_core.InputSignal<AXConversationMessage>;
5960
+ readonly rendererState: _angular_core.Signal<{
5961
+ deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5962
+ contentState: AXConversationMessageRendererContentState;
5963
+ }>;
5964
+ readonly messageTypeLabel: _angular_core.Signal<string>;
5965
+ /** Same tone as content-error default in {@link AXConversationMessageRendererStateComponent}. */
5966
+ readonly fallbackDescription: _angular_core.Signal<string>;
5967
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationFallbackRendererComponent, never>;
5968
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationFallbackRendererComponent, "ax-conversation-fallback-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5969
+ }
5970
+
5971
+ declare class AXConversationFileRendererComponent extends AXConversationMessageRendererCopyHostComponent {
5506
5972
  private readonly fileTypes;
5507
5973
  private readonly translation;
5508
- private readonly platformId;
5509
5974
  private readonly destroyRef;
5510
5975
  private readonly infoBarService;
5511
- private readonly audioElementRef;
5976
+ private readonly audioAttachments;
5512
5977
  private readonly _contentState;
5978
+ private readonly activeTrackIndex;
5979
+ private readonly isPlaying;
5980
+ private readonly currentTime;
5981
+ private readonly duration;
5982
+ readonly playbackSpeed: _angular_core.WritableSignal<number>;
5983
+ readonly isMuted: _angular_core.WritableSignal<boolean>;
5984
+ private lastBannerSyncAt;
5985
+ private readonly speeds;
5986
+ private readonly bannerTogglePlay;
5987
+ private readonly bannerClose;
5988
+ private readonly bannerCycleSpeed;
5989
+ private readonly bannerToggleMute;
5513
5990
  readonly message: _angular_core.InputSignal<AXConversationMessage>;
5514
5991
  readonly rendererState: _angular_core.Signal<{
5515
5992
  deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
5516
5993
  contentState: AXConversationMessageRendererContentState;
5517
5994
  }>;
5518
- readonly isPlaying: _angular_core.WritableSignal<boolean>;
5519
- readonly currentTime: _angular_core.WritableSignal<number>;
5520
- readonly duration: _angular_core.WritableSignal<number>;
5521
- readonly playbackSpeed: _angular_core.WritableSignal<number>;
5522
- private readonly speeds;
5523
- readonly payload: _angular_core.Signal<AXConversationVoicePayload>;
5524
- private readonly mediaReference;
5525
- private readonly resolvedUrl;
5526
- readonly voiceUrl: _angular_core.Signal<string>;
5527
- readonly waveformBars: _angular_core.Signal<number[]>;
5528
- readonly activeBarIndex: _angular_core.Signal<number>;
5529
- readonly timeLabel: _angular_core.Signal<string>;
5530
- readonly voiceLoadErrorLabel: _angular_core.Signal<string>;
5995
+ readonly payload: _angular_core.Signal<AXConversationFilePayload>;
5996
+ readonly files: _angular_core.Signal<AXConversationFileMediaItem[]>;
5997
+ readonly caption: _angular_core.Signal<string>;
5998
+ readonly fileRows: _angular_core.Signal<{
5999
+ file: AXConversationFileMediaItem;
6000
+ isAudio: boolean;
6001
+ audio: _acorex_components_conversation.AXConversationAudioMediaItem;
6002
+ trackIndex: number;
6003
+ }[]>;
5531
6004
  copy(): Promise<string>;
5532
6005
  constructor();
6006
+ isAudioFile(file: AXConversationFileMediaItem): boolean;
6007
+ onPlayingChange(trackIndex: number, playing: boolean): void;
6008
+ onTimeUpdate(trackIndex: number, time: number): void;
6009
+ onDurationChange(trackIndex: number, duration: number): void;
6010
+ onPlaybackEnded(trackIndex: number): void;
6011
+ onPlaybackError(): void;
5533
6012
  togglePlay(): void;
5534
6013
  cyclePlaybackSpeed(): void;
5535
- onTimeUpdate(): void;
5536
- onEnded(): void;
5537
- onError(): void;
6014
+ toggleMute(): void;
6015
+ private pauseOtherTracks;
5538
6016
  private pausePlayback;
6017
+ private applyPlaybackSettings;
5539
6018
  private syncInfoBarBanner;
5540
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationVoiceRendererComponent, never>;
5541
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationVoiceRendererComponent, "ax-conversation-voice-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
6019
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationFileRendererComponent, never>;
6020
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationFileRendererComponent, "ax-conversation-file-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5542
6021
  }
5543
6022
 
5544
- /**
5545
- * Default Message Actions Plugin
5546
- * Individual message action constants
5547
- */
5548
-
5549
- /**
5550
- * Reply to message
5551
- */
5552
- declare const AX_CONVERSATION_MESSAGE_REPLY_ACTION: AXConversationMessageAction;
5553
- /**
5554
- * Edit own message (text only)
5555
- */
5556
- declare const AX_CONVERSATION_MESSAGE_EDIT_ACTION: AXConversationMessageAction;
5557
- /**
5558
- * Delete own message
5559
- */
5560
- declare const AX_CONVERSATION_MESSAGE_DELETE_ACTION: AXConversationMessageAction;
5561
- /**
5562
- * Forward message to another conversation
5563
- */
5564
- declare const AX_CONVERSATION_MESSAGE_FORWARD_ACTION: AXConversationMessageAction;
5565
-
5566
- declare const AX_CONVERSATION_TEXT_RENDERER: AXConversationMessageRenderer;
5567
-
5568
- declare const AX_CONVERSATION_IMAGE_RENDERER: AXConversationMessageRenderer;
5569
-
5570
- declare const AX_CONVERSATION_VIDEO_RENDERER: AXConversationMessageRenderer;
5571
-
5572
- declare const AX_CONVERSATION_AUDIO_RENDERER: AXConversationMessageRenderer;
5573
-
5574
- declare const AX_CONVERSATION_VOICE_RENDERER: AXConversationMessageRenderer;
5575
-
5576
- declare const AX_CONVERSATION_FILE_RENDERER: AXConversationMessageRenderer;
5577
-
5578
- declare const AX_CONVERSATION_LOCATION_RENDERER: AXConversationMessageRenderer;
5579
-
5580
- declare const AX_CONVERSATION_STICKER_RENDERER: AXConversationMessageRenderer;
5581
-
5582
- declare const AX_CONVERSATION_SYSTEM_RENDERER: AXConversationMessageRenderer;
5583
-
5584
- declare const AX_CONVERSATION_FALLBACK_RENDERER: AXConversationMessageRenderer;
5585
-
5586
- /**
5587
- * Default Conversation Item Actions Plugin
5588
- * Individual action constants with AX_ prefix naming convention
5589
- */
5590
-
5591
- /**
5592
- * Mute/Unmute conversation notifications
5593
- */
5594
- declare const AX_CONVERSATION_ITEM_MUTE_ACTION: AXConversationItemAction;
5595
- /**
5596
- * Pin/Unpin conversation to top
5597
- */
5598
- declare const AX_CONVERSATION_ITEM_PIN_ACTION: AXConversationItemAction;
5599
- /**
5600
- * Mark conversation as read
5601
- */
5602
- declare const AX_CONVERSATION_ITEM_MARK_READ_ACTION: AXConversationItemAction;
5603
- /**
5604
- * Divider separator before destructive actions
5605
- */
5606
- declare const AX_CONVERSATION_ITEM_DIVIDER: AXConversationItemAction;
5607
- /**
5608
- * Delete/Leave conversation action (smart action that adapts based on conversation type)
5609
- * - Private: "Delete" - Deletes the conversation
5610
- * - Group/Channel: "Leave & Delete" - Leaves the group and removes it from list
5611
- */
5612
- declare const AX_CONVERSATION_ITEM_DELETE_ACTION: AXConversationItemAction;
5613
- /**
5614
- * Block/Unblock user (private conversations only)
5615
- */
5616
- declare const AX_CONVERSATION_ITEM_BLOCK_ACTION: AXConversationItemAction;
5617
-
5618
- /**
5619
- * Default Conversation Tabs Plugin
5620
- * Provides sidebar conversation filter tabs (all, private, groups, etc.)
5621
- */
5622
-
5623
- declare const AX_CONVERSATION_TAB_ALL: AXConversationTab;
5624
- declare const AX_CONVERSATION_TAB_PRIVATE: AXConversationTab;
5625
- declare const AX_CONVERSATION_TAB_GROUPS: AXConversationTab;
5626
- declare const AX_CONVERSATION_TAB_CHANNELS: AXConversationTab;
5627
- declare const AX_CONVERSATION_TAB_BOT: AXConversationTab;
5628
- declare const AX_CONVERSATION_TAB_UNREAD: AXConversationTab;
5629
- declare const AX_CONVERSATION_TAB_ARCHIVED: AXConversationTab;
6023
+ declare function fileItemAsAudioMedia(item: AXConversationFileMediaItem): AXConversationAudioMediaItem;
6024
+ declare function normalizeFilePayload(payload: AXConversationFilePayload): AXConversationFilePayload;
5630
6025
 
5631
- declare class AXConversationDefaultConversationAvatarComponent {
5632
- private readonly conversationService;
5633
- private readonly userAvatarComponent;
5634
- readonly conversationId: _angular_core.InputSignal<string>;
5635
- readonly size: _angular_core.InputSignal<number>;
5636
- private readonly currentUserId;
5637
- private readonly conversation;
5638
- readonly peerUserId: _angular_core.Signal<string>;
5639
- readonly useUserAvatar: _angular_core.Signal<_angular_core.Type<_acorex_components_conversation.AXConversationUserAvatarComponent>>;
5640
- readonly userAvatarInputs: _angular_core.Signal<{
5641
- userId: string;
5642
- size: number;
5643
- displayName: string;
5644
- displayAvatar: string;
5645
- displayIcon: string;
6026
+ declare class AXConversationImageRendererComponent extends AXConversationMessageRendererCopyHostComponent {
6027
+ private readonly fileTypes;
6028
+ protected readonly translation: AXTranslationService;
6029
+ readonly message: _angular_core.InputSignal<AXConversationMessage>;
6030
+ readonly rendererState: _angular_core.Signal<{
6031
+ deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
6032
+ contentState: "ready";
5646
6033
  }>;
5647
- readonly filteredUserAvatarInputs: _angular_core.Signal<Record<string, unknown>>;
5648
- readonly fallbackDisplay: _angular_core.Signal<_acorex_components_conversation.AXConversationAvatarDisplay>;
5649
- readonly fallbackInitials: _angular_core.Signal<string>;
5650
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationDefaultConversationAvatarComponent, never>;
5651
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationDefaultConversationAvatarComponent, "ax-conversation-default-conversation-avatar", never, { "conversationId": { "alias": "conversationId"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5652
- }
5653
-
5654
- /**
5655
- * Configuration options for conversation module
5656
- */
5657
- interface AXConversationOptions {
5658
- /** User API implementation (required) */
5659
- userApi: Type<AXConversationUserApi>;
5660
- /** Conversation Management API implementation (required) */
5661
- conversationApi: Type<AXConversationApi>;
5662
- /** Message API implementation (required) */
5663
- messageApi: Type<AXConversationMessageApi>;
5664
- /** Realtime API implementation (optional) */
5665
- realtimeApi?: Type<AXConversationRealtimeApi>;
5666
- /** Configuration overrides */
5667
- config?: Partial<AXConversationConfig>;
5668
- /** Registry configuration */
5669
- registry?: Partial<AXConversationRegistryConfiguration>;
5670
- /** Optional custom avatar components for the entire conversation UI */
5671
- avatarComponents?: AXConversationAvatarComponents;
5672
- }
5673
- declare class AXConversationModule {
5674
- /**
5675
- * Configure module for root module with singleton services.
5676
- * @deprecated Use standalone components with provideConversation()
5677
- */
5678
- static forRoot(options: AXConversationOptions): ModuleWithProviders<AXConversationModule>;
5679
- /**
5680
- * Configure module for lazy-loaded feature modules.
5681
- * Reuses singleton services from root, optionally overrides config/registry.
5682
- */
5683
- static forChild(options?: Omit<AXConversationOptions, 'userApi' | 'conversationApi' | 'messageApi' | 'realtimeApi'>): ModuleWithProviders<AXConversationModule>;
5684
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationModule, never>;
5685
- static ɵmod: _angular_core.ɵɵNgModuleDeclaration<AXConversationModule, never, [typeof i1.CommonModule, typeof i2.FormsModule, typeof AXConversationContainerComponent, typeof AXConversationSidebarComponent, typeof AXConversationInfoBarComponent, typeof AXConversationMessageListComponent, typeof AXConversationComposerComponent, typeof AXConversationInfiniteScrollDirective, typeof AXConversationDefaultConversationAvatarComponent], [typeof AXConversationContainerComponent, typeof AXConversationSidebarComponent, typeof AXConversationInfoBarComponent, typeof AXConversationMessageListComponent, typeof AXConversationComposerComponent, typeof AXConversationInfiniteScrollDirective]>;
5686
- static ɵinj: _angular_core.ɵɵInjectorDeclaration<AXConversationModule>;
5687
- }
5688
- /**
5689
- * Provides conversation functionality for standalone applications.
5690
- * Use in app config or route providers.
5691
- *
5692
- * @example
5693
- * ```typescript
5694
- * import {
5695
- * AXConversationIndexedDbUserApi,
5696
- * AXConversationIndexedDbConversationApi,
5697
- * AXConversationIndexedDbMessageApi,
5698
- * AXConversationIndexedDbRealtimeApi
5699
- * } from '@acorex/components/conversation';
5700
- *
5701
- * export const appConfig: ApplicationConfig = {
5702
- * providers: [
5703
- * provideConversation({
5704
- * userApi: AXConversationIndexedDbUserApi,
5705
- * conversationApi: AXConversationIndexedDbConversationApi,
5706
- * messageApi: AXConversationIndexedDbMessageApi,
5707
- * realtimeApi: AXConversationIndexedDbRealtimeApi,
5708
- * config: { },
5709
- * registry: { messageActions: [myCustomAction] }
5710
- * })
5711
- * ]
5712
- * };
5713
- * ```
5714
- */
5715
- declare function provideConversation(options: AXConversationOptions): Provider[];
5716
-
5717
- interface AXConversationAvatarDisplay {
5718
- name: string;
5719
- avatar?: string;
5720
- icon?: string;
6034
+ readonly payload: _angular_core.Signal<AXConversationImagePayload>;
6035
+ readonly images: _angular_core.Signal<_acorex_components_conversation.AXConversationImageMediaItem[]>;
6036
+ readonly caption: _angular_core.Signal<string>;
6037
+ readonly imageAlt: _angular_core.Signal<string>;
6038
+ readonly imageLoadErrorLabel: _angular_core.Signal<string>;
6039
+ copy(): Promise<string>;
6040
+ readonly layoutMode: _angular_core.Signal<AXConversationMediaGalleryLayoutMode>;
6041
+ readonly imageRows: _angular_core.Signal<AXConversationMediaGalleryRow<_acorex_components_conversation.AXConversationImageMediaItem>[]>;
6042
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationImageRendererComponent, never>;
6043
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationImageRendererComponent, "ax-conversation-image-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5721
6044
  }
5722
- /** Conversation types that resolve a single peer participant for viewer-scoped avatar/title. */
5723
- declare const AX_CONVERSATION_PEER_AVATAR_TYPES: ReadonlySet<AXConversationType>;
5724
- /**
5725
- * Other participant in a peer-scoped conversation (excludes the current viewer).
5726
- * Applies to private 1:1 and bot assist chats with exactly one non-viewer participant.
5727
- */
5728
- declare function resolveConversationPeerUserId(conversation: AXConversation, currentUserId?: string): string | undefined;
5729
- /** Other participant in a private chat (excludes the current user). */
5730
- declare function resolvePrivatePeerUserId(conversation: AXConversation, currentUserId?: string): string | undefined;
5731
- /** Peer participant for private and bot conversations. */
5732
- declare function resolveConversationPeerParticipant(conversation: AXConversation, currentUserId?: string): AXConversationParticipant | undefined;
5733
- /** Whether `auto` kind should render a registered user avatar for this conversation. */
5734
- declare function shouldUseUserAvatarForConversation(conversation: AXConversation, currentUserId?: string): boolean;
5735
- declare function resolveUserAvatarDisplay(userId: string, conversation: AXConversation | undefined, message?: AXConversationMessage): AXConversationAvatarDisplay;
5736
- declare function resolveConversationAvatarDisplay(conversation: AXConversation, currentUserId?: string): AXConversationAvatarDisplay;
5737
6045
 
5738
- interface AXConversationMessageListBackgroundPreset {
5739
- id: string;
5740
- value: AXConversationMessageListThemeBackground;
6046
+ /** Format image message payload for rendering (array shape, safe thumbnails). */
6047
+ declare function normalizeImagePayload(payload: AXConversationImagePayload): AXConversationImagePayload;
6048
+ /** Preferred URL for grid / lightbox (never inline base64 thumbnails). */
6049
+ declare function resolveImageDisplayUrl(image: AXConversationImageMediaItem): string | undefined;
6050
+
6051
+ declare class AXConversationLocationRendererComponent extends AXConversationMessageRendererCopyHostComponent {
6052
+ private readonly _contentState;
6053
+ private readonly platformId;
6054
+ private readonly document;
6055
+ private readonly fullScreen;
6056
+ private readonly destroyRef;
6057
+ private readonly mapHost;
6058
+ private readonly map;
6059
+ protected readonly translation: AXTranslationService;
6060
+ readonly message: _angular_core.InputSignal<AXConversationMessage>;
6061
+ readonly rendererState: _angular_core.Signal<{
6062
+ deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
6063
+ contentState: AXConversationMessageRendererContentState;
6064
+ }>;
6065
+ readonly payload: _angular_core.Signal<AXConversationLocationPayload>;
6066
+ readonly latitude: _angular_core.Signal<number>;
6067
+ readonly longitude: _angular_core.Signal<number>;
6068
+ readonly locationName: _angular_core.Signal<string>;
6069
+ readonly address: _angular_core.Signal<string>;
6070
+ readonly coordinatesText: _angular_core.Signal<string>;
6071
+ readonly mapsUrl: _angular_core.Signal<string>;
6072
+ copy(): string;
6073
+ readonly markers: _angular_core.Signal<{
6074
+ latitude: number;
6075
+ longitude: number;
6076
+ popup: string;
6077
+ popupOpen: boolean;
6078
+ popupCloseButton: boolean;
6079
+ }[]>;
6080
+ readonly mapIsFullscreen: _angular_core.Signal<boolean>;
6081
+ readonly mapFullscreenLabel: _angular_core.Signal<string>;
6082
+ readonly mapFullscreenIconClass: _angular_core.Signal<"fa-light fa-compress" | "fa-light fa-expand">;
6083
+ constructor();
6084
+ openInMaps(event: AXClickEvent): void;
6085
+ toggleMapFullscreen(event: AXClickEvent): void;
6086
+ private exitMapFullscreen;
6087
+ protected scheduleMapResize(): void;
6088
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationLocationRendererComponent, never>;
6089
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationLocationRendererComponent, "ax-conversation-location-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5741
6090
  }
5742
- /** Library default when no per-conversation or global background is set (pattern-5 tile + gradient wash). */
5743
- declare const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND: AXConversationMessageListThemeBackground;
5744
- /** Predefined chat-area backgrounds for the info panel (light + dark variants). */
5745
- declare const AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS: AXConversationMessageListBackgroundPreset[];
5746
- declare const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID = "solid-default";
5747
6091
 
5748
- /** Subtle Telegram-style chat-area wash when `messageListBackground` is not set (theme-aware). */
5749
- declare const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND: string;
5750
- declare function isMessageListThemeBackground(value: unknown): value is AXConversationMessageListThemeBackground;
5751
- /** Pick the raw CSS string for the active theme; `undefined` when unset. */
5752
- declare function resolveMessageListBackgroundRaw(value: AXConversationMessageListBackground | undefined, isDark: boolean): string | undefined;
5753
- /** Turn bare `https://...` or `/path` into valid CSS `background` for images. */
5754
- declare function normalizeMessageListBackgroundValue(raw: string): string;
5755
- /** Whether the built-in pattern-5 wallpaper (gradient + tiled SVG) should be used. */
5756
- declare function usesDefaultMessageListWallpaper(value: AXConversationMessageListBackground | undefined): boolean;
5757
- /** Resolve config/metadata background for the active theme, with library default fallback. */
5758
- declare function resolveMessageListBackgroundStyle(value: AXConversationMessageListBackground | undefined, isDark: boolean): string;
5759
- /** Whether two stored backgrounds represent the same preset (supports legacy string values). */
5760
- declare function isSameMessageListBackground(a: AXConversationMessageListBackground | undefined, b: AXConversationMessageListThemeBackground, isDark: boolean): boolean;
6092
+ declare class AXConversationStickerRendererComponent implements AXConversationMessageRendererComponent {
6093
+ private readonly _contentState;
6094
+ protected readonly translation: AXTranslationService;
6095
+ readonly message: _angular_core.InputSignal<AXConversationMessage>;
6096
+ readonly rendererState: _angular_core.Signal<{
6097
+ deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
6098
+ contentState: AXConversationMessageRendererContentState;
6099
+ }>;
6100
+ readonly payload: _angular_core.Signal<AXConversationStickerPayload>;
6101
+ private readonly mediaReference;
6102
+ private readonly resolvedUrl;
6103
+ readonly stickerUrl: _angular_core.Signal<string>;
6104
+ readonly alt: _angular_core.Signal<string>;
6105
+ readonly aspectRatio: _angular_core.Signal<string>;
6106
+ constructor();
6107
+ onLoad(): void;
6108
+ onError(): void;
6109
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationStickerRendererComponent, never>;
6110
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationStickerRendererComponent, "ax-conversation-sticker-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
6111
+ }
5761
6112
 
5762
- /** Default Font Awesome icon for group conversations without a custom avatar image. */
5763
- declare const AX_CONVERSATION_DEFAULT_GROUP_ICON = "fa-light fa-users";
5764
- /** Default Font Awesome icon for private/bot conversations without a custom avatar image. */
5765
- declare const AX_CONVERSATION_DEFAULT_USER_ICON = "fa-light fa-user";
5766
- /** True when the stored title is a placeholder, not a user-defined name. */
5767
- declare function isGenericPrivateConversationTitle(title: string | undefined): boolean;
5768
- /**
5769
- * Find an existing private 1:1 conversation between the current user and a peer.
5770
- * Matches conversations with exactly those two participants.
5771
- */
5772
- declare function findExistingPrivateConversation(conversations: AXConversation[], currentUserId: string, peerUserId: string): AXConversation | undefined;
5773
- /** Other participant in a private 1v1 chat (excludes the current viewer). */
5774
- declare function resolvePrivatePeerParticipant(conversation: AXConversation, currentUserId?: string): AXConversationParticipant | undefined;
5775
- /**
5776
- * Resolves the display title for the current viewer.
5777
- * Private and bot peer-scoped chats show the other participant's name when no custom title is set.
5778
- */
5779
- declare function resolveConversationTitleForViewer(conversation: AXConversation, currentUserId?: string): string;
5780
- /**
5781
- * Returns a viewer-scoped copy of a conversation with dynamic peer title/avatar/icon.
5782
- * Does not mutate the source object.
5783
- */
5784
- declare function resolveConversationForViewer(conversation: AXConversation, currentUserId?: string): AXConversation;
5785
- /** Whether message reactions are enabled for a conversation. Defaults to `true` when omitted. */
5786
- declare function isConversationReactionsEnabled(conversation?: AXConversation | null): boolean;
6113
+ declare class AXConversationSystemRendererComponent implements AXConversationMessageRendererComponent {
6114
+ private readonly _contentState;
6115
+ readonly message: _angular_core.InputSignal<AXConversationMessage>;
6116
+ readonly rendererState: _angular_core.Signal<{
6117
+ deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
6118
+ contentState: AXConversationMessageRendererContentState;
6119
+ }>;
6120
+ readonly payload: _angular_core.Signal<AXConversationSystemPayload>;
6121
+ readonly iconClass: _angular_core.Signal<string>;
6122
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationSystemRendererComponent, never>;
6123
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationSystemRendererComponent, "ax-conversation-system-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
6124
+ }
5787
6125
 
5788
- /** Resolves typed `profile`, falling back to legacy `metadata.profile`. */
5789
- declare function resolveParticipantProfile(participant?: AXConversationParticipant): AXConversationUserProfile;
6126
+ declare class AXConversationTextRendererComponent extends AXConversationMessageRendererCopyHostComponent {
6127
+ private readonly infoBarService;
6128
+ private readonly sanitizer;
6129
+ private readonly _contentState;
6130
+ readonly message: _angular_core.InputSignal<AXConversationMessage>;
6131
+ readonly rendererState: _angular_core.Signal<{
6132
+ deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
6133
+ contentState: AXConversationMessageRendererContentState;
6134
+ }>;
6135
+ readonly searchQuery: _angular_core.Signal<string>;
6136
+ copy(): string;
6137
+ readonly jumboCount: _angular_core.Signal<number>;
6138
+ readonly isJumbo: _angular_core.Signal<boolean>;
6139
+ readonly jumboText: _angular_core.Signal<string>;
6140
+ readonly jumboGraphemes: _angular_core.Signal<string[]>;
6141
+ readonly formattedText: _angular_core.Signal<SafeHtml>;
6142
+ private linkify;
6143
+ private highlightSearch;
6144
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationTextRendererComponent, never>;
6145
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationTextRendererComponent, "ax-conversation-text-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
6146
+ }
5790
6147
 
5791
- declare class AXConversationDateUtilsService {
5792
- /**
5793
- * Format relative time (e.g., "2m ago", "1h ago")
5794
- */
5795
- static formatRelativeTime(date: Date): string;
5796
- /**
5797
- * Format date label (Today, Yesterday, or date)
5798
- */
5799
- static formatDateLabel(date: Date): string;
5800
- /**
5801
- * Check if two dates are the same day
5802
- */
5803
- static isSameDay(date1: Date, date2: Date): boolean;
5804
- /**
5805
- * Get date key for grouping (YYYY-MM-DD)
5806
- */
5807
- static getDateKey(date: Date): string;
5808
- /**
5809
- * Format time (HH:MM)
5810
- */
5811
- static formatTime(date: Date): string;
6148
+ declare class AXConversationVideoRendererComponent extends AXConversationMessageRendererCopyHostComponent {
6149
+ private readonly fileTypes;
6150
+ private readonly translation;
6151
+ private readonly platformId;
6152
+ private readonly destroyRef;
6153
+ private readonly infoBarService;
6154
+ private readonly attachments;
6155
+ private readonly _contentState;
6156
+ private readonly activeVideoIndex;
6157
+ readonly message: _angular_core.InputSignal<AXConversationMessage>;
6158
+ readonly rendererState: _angular_core.Signal<{
6159
+ deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
6160
+ contentState: AXConversationMessageRendererContentState;
6161
+ }>;
6162
+ readonly isPlaying: _angular_core.WritableSignal<boolean>;
6163
+ readonly currentTime: _angular_core.WritableSignal<number>;
6164
+ readonly duration: _angular_core.WritableSignal<number>;
6165
+ readonly payload: _angular_core.Signal<AXConversationVideoPayload>;
6166
+ readonly videos: _angular_core.Signal<_acorex_components_conversation.AXConversationVideoMediaItem[]>;
6167
+ readonly caption: _angular_core.Signal<string>;
6168
+ readonly videoLoadErrorLabel: _angular_core.Signal<string>;
6169
+ readonly layoutMode: _angular_core.Signal<AXConversationMediaGalleryLayoutMode>;
6170
+ readonly videoRows: _angular_core.Signal<AXConversationMediaGalleryRow<_acorex_components_conversation.AXConversationVideoMediaItem>[]>;
6171
+ copy(): Promise<string>;
6172
+ constructor();
6173
+ onPlayingChange(index: number, playing: boolean): void;
6174
+ onTimeUpdate(index: number, time: number): void;
6175
+ onDurationChange(index: number, duration: number): void;
6176
+ onPlaybackEnded(index: number): void;
6177
+ onPlaybackError(): void;
6178
+ togglePlay(): void;
6179
+ private pauseOtherVideos;
6180
+ private pausePlayback;
6181
+ private syncInfoBarBanner;
6182
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationVideoRendererComponent, never>;
6183
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationVideoRendererComponent, "ax-conversation-video-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5812
6184
  }
5813
6185
 
5814
- /**
5815
- * Message Utilities Service
5816
- * Helper functions for message formatting and display
5817
- */
6186
+ declare function normalizeVideoPayload(payload: AXConversationVideoPayload): AXConversationVideoPayload;
5818
6187
 
5819
- declare class AXConversationMessageUtilsService {
5820
- static getInitials(name: string): string;
5821
- static getMessageText(message: AXConversationMessage): string;
5822
- static getPreviewText(message: AXConversationMessage, maxLength?: number): {
5823
- value: string;
5824
- type: string;
5825
- icon: string;
5826
- };
5827
- static isOwnMessage(message: AXConversationMessage, currentUserId: string): boolean;
5828
- static getSenderName(message: AXConversationMessage, conversation: AXConversation): string;
5829
- static getSenderAvatar(message: AXConversationMessage, conversation: AXConversation): string | undefined;
5830
- static getSenderAvatarIcon(message: AXConversationMessage, conversation: AXConversation): string | undefined;
5831
- static getConversationAvatar(conversation: AXConversation): string | undefined;
5832
- static getConversationAvatarIcon(conversation: AXConversation): string | undefined;
5833
- static getStatusIcon(message: AXConversationMessage): string;
5834
- static getConversationStatus(conversation: AXConversation, presence?: AXConversationUserPresence): AXConversationPresenceStatus | undefined;
5835
- static getDeliveryStatusIcon(status: AXConversationMessage['status']): string;
5836
- static shouldGroupMessages(message: AXConversationMessage, previousMessage?: AXConversationMessage): boolean;
5837
- static getUserPresenceStatus(presence?: AXConversationUserPresence): AXConversationPresenceStatus | undefined;
5838
- static getTypingText(conversation: AXConversation, typingUserIds: string[]): string;
5839
- static formatLastSeen(date: Date): string;
5840
- static getPrivateChatSubtitle(conversation: AXConversation, presence?: AXConversationUserPresence, currentUserId?: string): string;
5841
- static getConversationSubtitle(conversation: AXConversation, options?: {
5842
- typingUserIds?: string[];
5843
- peerPresence?: AXConversationUserPresence;
5844
- currentUserId?: string;
5845
- }): string;
6188
+ declare class AXConversationVoiceRendererComponent extends AXConversationMessageRendererCopyHostComponent {
6189
+ private readonly fileTypes;
6190
+ protected readonly translation: AXTranslationService;
6191
+ private readonly platformId;
6192
+ private readonly destroyRef;
6193
+ private readonly infoBarService;
6194
+ private readonly conversationService;
6195
+ private readonly waveRef;
6196
+ private readonly _contentState;
6197
+ readonly message: _angular_core.InputSignal<AXConversationMessage>;
6198
+ readonly rendererState: _angular_core.Signal<{
6199
+ deliveryStatus: _acorex_components_conversation.AXConversationMessageStatus;
6200
+ contentState: AXConversationMessageRendererContentState;
6201
+ }>;
6202
+ readonly isPlaying: _angular_core.WritableSignal<boolean>;
6203
+ readonly currentTime: _angular_core.WritableSignal<number>;
6204
+ readonly duration: _angular_core.WritableSignal<number>;
6205
+ readonly playbackSpeed: _angular_core.WritableSignal<number>;
6206
+ readonly isMuted: _angular_core.WritableSignal<boolean>;
6207
+ private readonly speeds;
6208
+ private lastBannerSyncAt;
6209
+ private readonly bannerTogglePlay;
6210
+ private readonly bannerClose;
6211
+ private readonly bannerCycleSpeed;
6212
+ private readonly bannerToggleMute;
6213
+ readonly payload: _angular_core.Signal<AXConversationVoicePayload>;
6214
+ private readonly mediaReference;
6215
+ private readonly resolvedUrl;
6216
+ readonly voiceUrl: _angular_core.Signal<string>;
6217
+ readonly isOwnMessage: _angular_core.Signal<boolean>;
6218
+ readonly waveConfig: _angular_core.Signal<AXWaveConfig>;
6219
+ readonly displayDuration: _angular_core.Signal<number>;
6220
+ readonly timeLabel: _angular_core.Signal<string>;
6221
+ readonly voiceLoadErrorLabel: _angular_core.Signal<string>;
6222
+ copy(): Promise<string>;
6223
+ constructor();
6224
+ togglePlay(): void;
6225
+ cyclePlaybackSpeed(): void;
6226
+ toggleMute(): void;
6227
+ onWaveStatusChanged(event: AXAudioWaveChangeEvent): void;
6228
+ onEnded(): void;
6229
+ onError(): void;
6230
+ private pausePlayback;
6231
+ private isWavePlayable;
6232
+ private applyPlaybackSettings;
6233
+ private syncPlaybackTimeFromWave;
6234
+ private syncInfoBarBanner;
6235
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationVoiceRendererComponent, never>;
6236
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationVoiceRendererComponent, "ax-conversation-voice-renderer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
5846
6237
  }
5847
6238
 
5848
6239
  /**
5849
- * Validation Utilities
5850
- * Centralized validation functions for messages and user input
6240
+ * Default Message Actions Plugin
6241
+ * Individual message action constants
5851
6242
  */
5852
6243
 
5853
6244
  /**
5854
- * Validation result interface
6245
+ * Reply to message
5855
6246
  */
5856
- interface AXConversationValidationResult {
5857
- /** Whether validation passed */
5858
- valid: boolean;
5859
- /** Error message if validation failed */
5860
- error?: string;
5861
- /** Error code for programmatic handling */
5862
- errorCode?: string;
5863
- }
6247
+ declare const AX_CONVERSATION_MESSAGE_REPLY_ACTION: AXConversationMessageAction;
5864
6248
  /**
5865
- * Validate message text content
5866
- * @param text - Text to validate
5867
- * @param config - Configuration for validation rules
5868
- * @returns Validation result
6249
+ * Edit own message (text only)
5869
6250
  */
5870
- declare function validateMessageText(text: string | undefined, config: AXConversationConfig): AXConversationValidationResult;
6251
+ declare const AX_CONVERSATION_MESSAGE_EDIT_ACTION: AXConversationMessageAction;
5871
6252
  /**
5872
- * Validate conversation ID
5873
- * @param conversationId - Conversation ID to validate
5874
- * @returns Validation result
6253
+ * Delete own message
5875
6254
  */
5876
- declare function validateConversationId(conversationId: string | undefined): AXConversationValidationResult;
6255
+ declare const AX_CONVERSATION_MESSAGE_DELETE_ACTION: AXConversationMessageAction;
5877
6256
  /**
5878
- * Validate message type
5879
- * @param type - Message type to validate
5880
- * @returns Validation result
6257
+ * Forward message to another conversation
5881
6258
  */
5882
- declare function validateMessageType(type: AXConversationMessageType | undefined): AXConversationValidationResult;
6259
+ declare const AX_CONVERSATION_MESSAGE_FORWARD_ACTION: AXConversationMessageAction;
6260
+
6261
+ declare const AX_CONVERSATION_TEXT_RENDERER: AXConversationMessageRenderer;
6262
+
6263
+ declare const AX_CONVERSATION_IMAGE_RENDERER: AXConversationMessageRenderer;
6264
+
6265
+ declare const AX_CONVERSATION_VIDEO_RENDERER: AXConversationMessageRenderer;
6266
+
6267
+ declare const AX_CONVERSATION_AUDIO_RENDERER: AXConversationMessageRenderer;
6268
+
6269
+ declare const AX_CONVERSATION_VOICE_RENDERER: AXConversationMessageRenderer;
6270
+
6271
+ declare const AX_CONVERSATION_FILE_RENDERER: AXConversationMessageRenderer;
6272
+
6273
+ declare const AX_CONVERSATION_LOCATION_RENDERER: AXConversationMessageRenderer;
6274
+
6275
+ declare const AX_CONVERSATION_STICKER_RENDERER: AXConversationMessageRenderer;
6276
+
6277
+ declare const AX_CONVERSATION_SYSTEM_RENDERER: AXConversationMessageRenderer;
6278
+
6279
+ declare const AX_CONVERSATION_FALLBACK_RENDERER: AXConversationMessageRenderer;
6280
+
5883
6281
  /**
5884
- * Validate message payload
5885
- * @param payload - Message payload to validate
5886
- * @param type - Message type
5887
- * @returns Validation result
6282
+ * Default Conversation Item Actions Plugin
6283
+ * Individual action constants with AX_ prefix naming convention
5888
6284
  */
5889
- declare function validateMessagePayload(payload: AXConversationMessagePayload | undefined, type: AXConversationMessageType): Promise<AXConversationValidationResult>;
6285
+
5890
6286
  /**
5891
- * Validate user ID
5892
- * @param userId - User ID to validate
5893
- * @returns Validation result
6287
+ * Mute/Unmute conversation notifications
5894
6288
  */
5895
- declare function validateUserId(userId: string | undefined): AXConversationValidationResult;
6289
+ declare const AX_CONVERSATION_ITEM_MUTE_ACTION: AXConversationItemAction;
5896
6290
  /**
5897
- * Validate array of user IDs
5898
- * @param userIds - Array of user IDs to validate
5899
- * @param minCount - Minimum number of users required
5900
- * @param maxCount - Maximum number of users allowed
5901
- * @returns Validation result
6291
+ * Pin/Unpin conversation to top
5902
6292
  */
5903
- declare function validateUserIds(userIds: string[] | undefined, minCount?: number, maxCount?: number): AXConversationValidationResult;
6293
+ declare const AX_CONVERSATION_ITEM_PIN_ACTION: AXConversationItemAction;
5904
6294
  /**
5905
- * Validate email address
5906
- * @param email - Email to validate
5907
- * @returns Validation result
6295
+ * Mark conversation as read
5908
6296
  */
5909
- declare function validateEmail(email: string | undefined): AXConversationValidationResult;
6297
+ declare const AX_CONVERSATION_ITEM_MARK_READ_ACTION: AXConversationItemAction;
5910
6298
  /**
5911
- * Validate URL
5912
- * @param url - URL to validate
5913
- * @returns Validation result
6299
+ * Divider separator before destructive actions
5914
6300
  */
5915
- declare function validateUrl(url: string | undefined): AXConversationValidationResult;
6301
+ declare const AX_CONVERSATION_ITEM_DIVIDER: AXConversationItemAction;
5916
6302
  /**
5917
- * Sanitize user input to prevent XSS
5918
- * Note: Angular provides built-in sanitization, but this is an additional layer
5919
- * @param input - User input to sanitize
5920
- * @returns Sanitized input
6303
+ * Delete/Leave conversation action (smart action that adapts based on conversation type)
6304
+ * - Private: "Delete" - Deletes the conversation
6305
+ * - Group/Channel: "Leave & Delete" - Leaves the group and removes it from list
5921
6306
  */
5922
- declare function sanitizeInput(input: string): string;
6307
+ declare const AX_CONVERSATION_ITEM_DELETE_ACTION: AXConversationItemAction;
5923
6308
  /**
5924
- * Validate latitude coordinate
5925
- * @param latitude - Latitude to validate
5926
- * @returns Validation result
6309
+ * Block/Unblock user (private conversations only)
5927
6310
  */
5928
- declare function validateLatitude(latitude: number | undefined | null): AXConversationValidationResult;
6311
+ declare const AX_CONVERSATION_ITEM_BLOCK_ACTION: AXConversationItemAction;
6312
+
5929
6313
  /**
5930
- * Validate longitude coordinate
5931
- * @param longitude - Longitude to validate
5932
- * @returns Validation result
6314
+ * Default Conversation Tabs Plugin
6315
+ * Provides sidebar conversation filter tabs (all, private, groups, etc.)
5933
6316
  */
5934
- declare function validateLongitude(longitude: number | undefined | null): AXConversationValidationResult;
5935
6317
 
5936
- /** Infer extension/MIME hints from a persisted message payload. */
5937
- declare function inferFileExtensionHintFromMessage(message: AXConversationMessage): AXFileTypeExtensionHint;
5938
- /** Use file-type `copy` on the message when `message.fileType` is set; otherwise fallback. */
5939
- declare function copyWithFileTypeFallback(message: AXConversationMessage, registry: AXFileTypeRegistryService, fallback: () => string): Promise<string>;
5940
- /** Use file-type `open` on the message when `message.fileType` is set. */
5941
- declare function openWithFileType(message: AXConversationMessage, registry: AXFileTypeRegistryService, ctx: AXFileTypeOpenContext): Promise<boolean>;
6318
+ declare const AX_CONVERSATION_TAB_ALL: AXConversationTab;
6319
+ declare const AX_CONVERSATION_TAB_PRIVATE: AXConversationTab;
6320
+ declare const AX_CONVERSATION_TAB_GROUPS: AXConversationTab;
6321
+ declare const AX_CONVERSATION_TAB_CHANNELS: AXConversationTab;
6322
+ declare const AX_CONVERSATION_TAB_BOT: AXConversationTab;
6323
+ declare const AX_CONVERSATION_TAB_UNREAD: AXConversationTab;
6324
+ declare const AX_CONVERSATION_TAB_ARCHIVED: AXConversationTab;
5942
6325
 
5943
- interface AXConversationInfoProfileField {
5944
- id: string;
5945
- labelKey: string;
5946
- value: string;
5947
- icon: string;
5948
- }
5949
- type AXConversationMediaCategoryId = 'image' | 'video' | 'file' | 'audio' | 'voice' | 'sticker' | 'location' | 'link';
5950
- interface AXConversationMediaCategory {
5951
- id: AXConversationMediaCategoryId;
5952
- labelKey: string;
5953
- countLabelKey: string;
5954
- icon: string;
5955
- count: number;
6326
+ declare class AXConversationDefaultConversationAvatarComponent {
6327
+ private readonly conversationService;
6328
+ private readonly userAvatarComponent;
6329
+ readonly conversationId: _angular_core.InputSignal<string>;
6330
+ readonly size: _angular_core.InputSignal<number>;
6331
+ private readonly currentUserId;
6332
+ private readonly conversation;
6333
+ readonly peerUserId: _angular_core.Signal<string>;
6334
+ readonly useUserAvatar: _angular_core.Signal<_angular_core.Type<_acorex_components_conversation.AXConversationUserAvatarComponent>>;
6335
+ readonly userAvatarInputs: _angular_core.Signal<{
6336
+ userId: string;
6337
+ size: number;
6338
+ displayName: string;
6339
+ displayAvatar: string;
6340
+ displayIcon: string;
6341
+ }>;
6342
+ readonly filteredUserAvatarInputs: _angular_core.Signal<Record<string, unknown>>;
6343
+ readonly fallbackDisplay: _angular_core.Signal<_acorex_components_conversation.AXConversationAvatarDisplay>;
6344
+ readonly fallbackInitials: _angular_core.Signal<string>;
6345
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationDefaultConversationAvatarComponent, never>;
6346
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationDefaultConversationAvatarComponent, "ax-conversation-default-conversation-avatar", never, { "conversationId": { "alias": "conversationId"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5956
6347
  }
5957
- declare function messageContainsLink(message: AXConversationMessage): boolean;
5958
- declare function getPrivatePeerParticipant(conversation: AXConversation, currentUserId?: string): AXConversationParticipant | undefined;
5959
- declare function getConversationProfileFields(conversation: AXConversation, currentUserId?: string): AXConversationInfoProfileField[];
5960
- declare function getConversationMediaCategories(messages: AXConversationMessage[]): AXConversationMediaCategory[];
5961
- declare function filterMessagesByMediaCategory(messages: AXConversationMessage[], categoryId: AXConversationMediaCategoryId): AXConversationMessage[];
5962
- declare function isGridMediaCategory(categoryId: AXConversationMediaCategoryId): boolean;
5963
- declare function isAttachmentListCategory(categoryId: AXConversationMediaCategoryId): boolean;
5964
- interface AXConversationMediaGalleryTile {
5965
- key: string;
5966
- message: AXConversationMessage;
5967
- kind: 'image' | 'video' | 'sticker';
5968
- image?: AXConversationImageMediaItem;
5969
- video?: AXConversationVideoMediaItem;
5970
- stickerUrl?: string;
5971
- stickerAlt?: string;
6348
+
6349
+ /**
6350
+ * Configuration options for conversation module
6351
+ */
6352
+ interface AXConversationOptions {
6353
+ /** User API implementation (required) */
6354
+ userApi: Type<AXConversationUserApi>;
6355
+ /** Conversation Management API implementation (required) */
6356
+ conversationApi: Type<AXConversationApi>;
6357
+ /** Message API implementation (required) */
6358
+ messageApi: Type<AXConversationMessageApi>;
6359
+ /** Realtime API implementation (optional) */
6360
+ realtimeApi?: Type<AXConversationRealtimeApi>;
6361
+ /** Configuration overrides */
6362
+ config?: Partial<AXConversationConfig>;
6363
+ /** Registry configuration */
6364
+ registry?: Partial<AXConversationRegistryConfiguration>;
6365
+ /** Optional custom avatar components for the entire conversation UI */
6366
+ avatarComponents?: AXConversationAvatarComponents;
5972
6367
  }
5973
- declare function buildMediaGalleryTiles(messages: AXConversationMessage[], categoryId: AXConversationMediaCategoryId): AXConversationMediaGalleryTile[];
5974
- declare function resolveVideoThumbnailUrl(video: AXConversationVideoMediaItem): string | undefined;
5975
- declare function resolveGalleryImageUrl(image: AXConversationImageMediaItem): string | undefined;
5976
- declare function getMessageVideoItems(message: AXConversationMessage): AXConversationVideoMediaItem[];
5977
- declare function getMessageAudioItems(message: AXConversationMessage): AXConversationAudioMediaItem[];
5978
- interface AXConversationMediaPageResult {
5979
- items: AXConversationMessage[];
5980
- hasMore: boolean;
5981
- nextCursor?: string;
5982
- page: number;
6368
+ declare class AXConversationModule {
6369
+ /**
6370
+ * Configure module for root module with singleton services.
6371
+ * @deprecated Use standalone components with provideConversation()
6372
+ */
6373
+ static forRoot(options: AXConversationOptions): ModuleWithProviders<AXConversationModule>;
6374
+ /**
6375
+ * Configure module for lazy-loaded feature modules.
6376
+ * Reuses singleton services from root, optionally overrides config/registry.
6377
+ */
6378
+ static forChild(options?: Omit<AXConversationOptions, 'userApi' | 'conversationApi' | 'messageApi' | 'realtimeApi'>): ModuleWithProviders<AXConversationModule>;
6379
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationModule, never>;
6380
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<AXConversationModule, never, [typeof i1.CommonModule, typeof i2.FormsModule, typeof AXConversationContainerComponent, typeof AXConversationSidebarComponent, typeof AXConversationInfoBarComponent, typeof AXConversationMessageListComponent, typeof AXConversationComposerComponent, typeof AXConversationInfiniteScrollDirective, typeof AXConversationDefaultConversationAvatarComponent], [typeof AXConversationContainerComponent, typeof AXConversationSidebarComponent, typeof AXConversationInfoBarComponent, typeof AXConversationMessageListComponent, typeof AXConversationComposerComponent, typeof AXConversationInfiniteScrollDirective]>;
6381
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<AXConversationModule>;
5983
6382
  }
5984
- declare function fetchConversationMediaPage(conversationApi: AXConversationApi, conversationId: string, page: number, pageSize?: number, cursor?: string): Promise<AXConversationMediaPageResult>;
5985
- /** Merge media API results with in-memory messages needed for link/sticker/voice/location tabs. */
5986
- declare function mergeInfoPanelMessages(mediaMessages: AXConversationMessage[], supplemental: AXConversationMessage[]): AXConversationMessage[];
5987
- declare function filterSupplementalInfoPanelMessages(messages: AXConversationMessage[]): AXConversationMessage[];
6383
+ /**
6384
+ * Provides conversation functionality for standalone applications.
6385
+ * Use in app config or route providers.
6386
+ *
6387
+ * @example
6388
+ * ```typescript
6389
+ * import {
6390
+ * AXConversationIndexedDbUserApi,
6391
+ * AXConversationIndexedDbConversationApi,
6392
+ * AXConversationIndexedDbMessageApi,
6393
+ * AXConversationIndexedDbRealtimeApi
6394
+ * } from '@acorex/components/conversation';
6395
+ *
6396
+ * export const appConfig: ApplicationConfig = {
6397
+ * providers: [
6398
+ * provideConversation({
6399
+ * userApi: AXConversationIndexedDbUserApi,
6400
+ * conversationApi: AXConversationIndexedDbConversationApi,
6401
+ * messageApi: AXConversationIndexedDbMessageApi,
6402
+ * realtimeApi: AXConversationIndexedDbRealtimeApi,
6403
+ * config: { },
6404
+ * registry: { messageActions: [myCustomAction] }
6405
+ * })
6406
+ * ]
6407
+ * };
6408
+ * ```
6409
+ */
6410
+ declare function provideConversation(options: AXConversationOptions): Provider[];
5988
6411
 
5989
6412
  /**
5990
6413
  * Error Message Constants
@@ -6378,5 +6801,5 @@ declare function getErrorMessage(code: string, params?: Record<string, string |
6378
6801
  */
6379
6802
  type AXConversationErrorCode = typeof AX_CONVERSATION_MESSAGE_ERRORS[keyof typeof AX_CONVERSATION_MESSAGE_ERRORS]['code'] | typeof AX_CONVERSATION_FILE_ERRORS[keyof typeof AX_CONVERSATION_FILE_ERRORS]['code'] | typeof AX_CONVERSATION_USER_ERRORS[keyof typeof AX_CONVERSATION_USER_ERRORS]['code'] | typeof AX_CONVERSATION_ERRORS[keyof typeof AX_CONVERSATION_ERRORS]['code'] | typeof AX_CONVERSATION_CONNECTION_ERRORS[keyof typeof AX_CONVERSATION_CONNECTION_ERRORS]['code'] | typeof AX_CONVERSATION_LOCATION_ERRORS[keyof typeof AX_CONVERSATION_LOCATION_ERRORS]['code'] | typeof AX_CONVERSATION_URL_ERRORS[keyof typeof AX_CONVERSATION_URL_ERRORS]['code'];
6380
6803
 
6381
- export { AXConversationApi, AXConversationApiLoggerService, AXConversationAudioAttachmentComponent, AXConversationAudioFileTypeProvider, AXConversationAudioPickerComponent, AXConversationAudioRendererComponent, AXConversationAvatarComponent, AXConversationAvatarPickerComponent, AXConversationBaseRegistry, AXConversationComposerActionRegistry, AXConversationComposerComponent, AXConversationComposerFileTypesProvider, AXConversationComposerGenerationStateService, AXConversationComposerPopupComponent, AXConversationComposerService, AXConversationComposerTabRegistry, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationEmojiTabComponent, AXConversationErrorHandlerService, AXConversationFallbackRendererComponent, AXConversationFileAttachmentComponent, AXConversationFileFileTypeProvider, AXConversationFilePickerComponent, AXConversationFileRendererComponent, AXConversationForwardMessageDialogComponent, AXConversationImageAttachmentComponent, AXConversationImageFileTypeProvider, AXConversationImagePickerComponent, AXConversationImageRendererComponent, AXConversationInfiniteScrollDirective, AXConversationInfoBarActionRegistry, AXConversationInfoBarComponent, AXConversationInfoBarSearchComponent, AXConversationInfoBarService, AXConversationItemActionRegistry, AXConversationLocationPickerComponent, AXConversationLocationRendererComponent, AXConversationMediaPlaybackInfoBarBannerComponent, AXConversationMessageActionRegistry, AXConversationMessageApi, AXConversationMessageListComponent, AXConversationMessageListNoActiveDefaultComponent, AXConversationMessageListService, AXConversationMessageRendererCopyHostComponent, AXConversationMessageRendererRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationModule, AXConversationNewDialogComponent, AXConversationPickerCaptionComponent, AXConversationPickerEmptyComponent, AXConversationPickerFooterComponent, AXConversationPickerHeaderComponent, AXConversationPickerShellComponent, AXConversationPickerToolbarComponent, AXConversationRealtimeApi, AXConversationRegistryComponentOutletComponent, AXConversationRegistryService, AXConversationService, AXConversationSidebarComponent, AXConversationSidebarService, AXConversationStickerRendererComponent, AXConversationStickerTabComponent, AXConversationSystemRendererComponent, AXConversationTabRegistry, AXConversationTextRendererComponent, AXConversationUserApi, AXConversationVideoAttachmentComponent, AXConversationVideoFileTypeProvider, AXConversationVideoPickerComponent, AXConversationVideoRendererComponent, AXConversationVoiceFileTypeProvider, AXConversationVoiceRecorderComponent, AXConversationVoiceRendererComponent, AX_CONVERSATION_AUDIO_CATALOG, AX_CONVERSATION_AUDIO_PRESENTATION, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_BUILTIN_COMPOSER_TABS, 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_CONFIG, AX_CONVERSATION_CONNECTION_ERRORS, AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS, AX_CONVERSATION_DEFAULT_COMPOSER_TABS, AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS, AX_CONVERSATION_DEFAULT_CONVERSATION_TABS, AX_CONVERSATION_DEFAULT_GROUP_ICON, AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS, AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND, AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS, AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES, AX_CONVERSATION_DEFAULT_USER_ICON, AX_CONVERSATION_ERRORS, AX_CONVERSATION_ERROR_HANDLER_CONFIG, AX_CONVERSATION_ERROR_MESSAGES, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_CATALOG, AX_CONVERSATION_FILE_ERRORS, AX_CONVERSATION_FILE_PRESENTATION, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_FILE_TYPES_READY, AX_CONVERSATION_IMAGE_CATALOG, AX_CONVERSATION_IMAGE_PRESENTATION, 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_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_ERRORS, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_ERRORS, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE, AX_CONVERSATION_PEER_AVATAR_TYPES, AX_CONVERSATION_REGISTRY_CONFIG, AX_CONVERSATION_STICKER_API_KEY, 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_URL_ERRORS, AX_CONVERSATION_USER_AVATAR_COMPONENT, AX_CONVERSATION_USER_ERRORS, AX_CONVERSATION_VIDEO_CATALOG, AX_CONVERSATION_VIDEO_PRESENTATION, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_CATALOG, AX_CONVERSATION_VOICE_PRESENTATION, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, abortPickerUploads, applyAudioLocalPreview, applyFileLocalPreview, applyLocalPreview, applyVideoLocalPreview, applyVoiceLocalPreview, audioItemFromUpload, bindMediaRendererContentState, buildMediaGalleryTiles, canShowRendererContentError, cleanupPickerUploads, conversationAudioUtilities, conversationFileUtilities, conversationImageUtilities, conversationVideoUtilities, conversationVoiceUtilities, copyWithFileTypeFallback, createConversationAudioFileType, createConversationFileFileType, createConversationImageFileType, createConversationVideoFileType, createConversationVoiceFileType, createLocalPreviewUrl, createObjectUrl, createPickerDragHandlers, createPickerUploadItemId, createResolvedMediaUrlSignal, deleteUploadedPickerMedia, dismissComposerPickerHost, ensureConversationFileCatalogRegistered, fetchConversationMediaPage, fileItemFromUpload, filterMessagesByMediaCategory, filterSupplementalInfoPanelMessages, findExistingPrivateConversation, formatDuration, formatErrorMessage, formatFileByteSize, formatFileSize, formatMediaDuration, formatPickerValidationMessage, getConversationMediaCategories, getConversationProfileFields, getErrorMessage, getMessageAudioItems, getMessageVideoItems, getPickerCancelUploadLabel, getPrivatePeerParticipant, hasRegistryComponent, inferFileExtensionHintFromMessage, isAttachmentListCategory, isComposerTabEnabled, isConversationReactionsEnabled, isGenericPrivateConversationTitle, isGridMediaCategory, isMessageDeliveryPending, isMessageListThemeBackground, isNonPersistableMediaUrl, isPickerItemReadyToSend, isSameMessageListBackground, isUploadAborted, limitFilesToCapacity, mediaCopyText, mergeAudioUploadResult, mergeFileUploadResult, mergeInfoPanelMessages, mergeUploadResult, mergeVideoUploadResult, mergeVoiceUploadResult, mergeWithDefaults, messageContainsLink, normalizeAudioPayload, normalizeFilePayload, normalizeImagePayload, normalizeMessageListBackgroundValue, normalizeVideoPayload, notifyMaxFilesCapacityExceeded, notifyPickerValidationErrors, openWithFileType, pickDisplayMediaUrl, pickerItemToMediaReference, pickerItemToUploadResult, provideConversation, provideConversationComposerFileTypes, provideConversationFileCatalog, reportMediaLoadError, resolveComposerMaxFiles, resolveConversationAvatarDisplay, resolveConversationComposerTabs, resolveConversationForViewer, resolveConversationMessageFileType, resolveConversationPeerParticipant, resolveConversationPeerUserId, resolveConversationTitleForViewer, resolveGalleryImageUrl, resolveImageDisplayUrl, resolveMessageListBackgroundRaw, resolveMessageListBackgroundStyle, resolveParticipantProfile, resolvePersistableMediaUrl, resolvePersistedThumbnailUrl, resolvePrivatePeerParticipant, resolvePrivatePeerUserId, resolveUserAvatarDisplay, resolveVideoThumbnailUrl, revokeObjectUrl, revokePickerBlobPreviews, sanitizeInput, shouldUseUserAvatarForConversation, syncPlaybackInfoBarBanner, toUploaderReference as toMediaItemUploaderReference, toUploaderReference$1 as toUploaderReference, uploadPickerFile, usesDefaultMessageListWallpaper, validateConversationId, validateEmail, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds, videoItemFromUpload };
6382
- export type { AXConversation, AXConversationApiError, AXConversationApiLogEntry, AXConversationApiName, AXConversationAudioMediaItem, AXConversationAudioPayload, AXConversationAvatarComponents, AXConversationAvatarDisplay, AXConversationAvatarKind, AXConversationBlockReportReason, AXConversationCleanupPickerUploadsOptions, AXConversationComposerAction, AXConversationComposerActionComponent, AXConversationComposerActionContext, AXConversationComposerGenerationPhase, AXConversationComposerPickerUploadItem, AXConversationComposerPrimaryButtonMode, AXConversationComposerTab, AXConversationComposerTabFeature, AXConversationConfig, AXConversationConnectionStatus, AXConversationConversationAvatarComponent, AXConversationCreateData, AXConversationDeleteMessageCommand, AXConversationDropdownMenuItem, AXConversationEditMessageCommand, AXConversationError, AXConversationErrorCode, AXConversationErrorHandlerConfig, AXConversationErrorMessage, AXConversationErrorSeverity, AXConversationFeatures, AXConversationFileMediaItem, AXConversationFilePayload, AXConversationFilter, AXConversationFilters, AXConversationGroupedReaction, AXConversationImageMediaItem, AXConversationImagePayload, AXConversationInfoBarAction, AXConversationInfoBarActionComponent, AXConversationInfoBarActionContext, AXConversationInfoBarActiveBanner, AXConversationInfoBarActiveComponent, AXConversationInfoProfileField, AXConversationItemAction, AXConversationItemActionContext, AXConversationLink, AXConversationLinkPreview, AXConversationLoadMessagesResult, AXConversationLocationPayload, AXConversationMediaCategory, AXConversationMediaCategoryId, AXConversationMediaGalleryTile, AXConversationMediaItemFields, AXConversationMediaPageResult, AXConversationMention, AXConversationMessage, AXConversationMessageAction, AXConversationMessageActionContext, AXConversationMessageForwardData, AXConversationMessageInfoBarBannerComponent, AXConversationMessageListBackground, AXConversationMessageListBackgroundPreset, AXConversationMessageListEmptyComponent, AXConversationMessageListThemeBackground, AXConversationMessagePayload, AXConversationMessageRenderer, AXConversationMessageRendererCapabilities, AXConversationMessageRendererComponent, AXConversationMessageRendererContentState, AXConversationMessageRendererState, AXConversationMessageSearchFilters, AXConversationMessageStatus, AXConversationMessageType, AXConversationMetadata, AXConversationOptions, AXConversationPaginatedResult, AXConversationPagination, AXConversationPaginationState, AXConversationParticipant, AXConversationParticipantRole, AXConversationParticipantUpdate, AXConversationPinnedMessage, AXConversationPlaybackBannerInputs, AXConversationPollOption, AXConversationPollPayload, AXConversationPresenceStatus, AXConversationPresenceUpdate, AXConversationReaction, AXConversationReadReceipt, AXConversationRegistryComponentRef, AXConversationRegistryConfiguration, AXConversationRegistryItem, AXConversationRoomPreferences, AXConversationRoomPreferencesMap, AXConversationSendMessageCommand, AXConversationSendMessageOptions, AXConversationSendMessageUploadSource, AXConversationSettingsUpdate, AXConversationSidebarTabsOrientation, AXConversationSort, AXConversationStickerPayload, AXConversationSystemPayload, AXConversationTab, AXConversationTextFormat, AXConversationTextPayload, AXConversationType, AXConversationTypingIndicator, AXConversationUpdateData, AXConversationUploadOptions, AXConversationUploaderFilePreview, AXConversationUploaderReference, AXConversationUploaderResult, AXConversationUser, AXConversationUserAvatarComponent, AXConversationUserPresence, AXConversationUserProfile, AXConversationUserProfileUpdate, AXConversationUserSearchFilters, AXConversationValidationResult, AXConversationVideoMediaItem, AXConversationVideoPayload, AXConversationVoicePayload };
6804
+ export { AXConversationApi, AXConversationApiLoggerService, AXConversationAudioAttachmentComponent, AXConversationAudioFileTypeProvider, AXConversationAudioPickerComponent, AXConversationAudioRendererComponent, AXConversationAvatarComponent, AXConversationAvatarPickerComponent, AXConversationBaseRegistry, AXConversationComposerActionRegistry, AXConversationComposerComponent, AXConversationComposerFileTypesProvider, AXConversationComposerGenerationStateService, AXConversationComposerPopupComponent, AXConversationComposerService, AXConversationComposerTabRegistry, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationDeleteDialogComponent, AXConversationEmojiTabComponent, AXConversationErrorHandlerService, AXConversationFallbackRendererComponent, AXConversationFileAttachmentComponent, AXConversationFileFileTypeProvider, AXConversationFilePickerComponent, AXConversationFileRendererComponent, AXConversationForwardMessageDialogComponent, AXConversationImageAttachmentComponent, AXConversationImageFileTypeProvider, AXConversationImagePickerComponent, AXConversationImageRendererComponent, AXConversationInfiniteScrollDirective, AXConversationInfoBarActionRegistry, AXConversationInfoBarComponent, AXConversationInfoBarSearchComponent, AXConversationInfoBarService, AXConversationItemActionRegistry, AXConversationLocationPickerComponent, AXConversationLocationRendererComponent, AXConversationMediaPlaybackInfoBarBannerComponent, AXConversationMessageActionRegistry, AXConversationMessageApi, AXConversationMessageListComponent, AXConversationMessageListNoActiveDefaultComponent, AXConversationMessageListService, AXConversationMessageRendererCopyHostComponent, AXConversationMessageRendererRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationModule, AXConversationNewDialogComponent, AXConversationPickerCaptionComponent, AXConversationPickerEmptyComponent, AXConversationPickerFooterComponent, AXConversationPickerHeaderComponent, AXConversationPickerOptionsComponent, AXConversationPickerShellComponent, AXConversationPickerToolbarComponent, AXConversationRealtimeApi, AXConversationRegistryComponentOutletComponent, AXConversationRegistryService, AXConversationService, AXConversationSidebarComponent, AXConversationSidebarService, AXConversationStickerRendererComponent, AXConversationStickerTabComponent, AXConversationSystemRendererComponent, AXConversationTabRegistry, AXConversationTextRendererComponent, AXConversationUserApi, AXConversationVideoAttachmentComponent, AXConversationVideoFileTypeProvider, AXConversationVideoPickerComponent, AXConversationVideoRendererComponent, AXConversationVoiceFileTypeProvider, AXConversationVoiceRecorderComponent, AXConversationVoiceRendererComponent, AX_CONVERSATION_AUDIO_CATALOG, AX_CONVERSATION_AUDIO_PRESENTATION, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_BUILTIN_COMPOSER_TABS, 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_CONFIG, AX_CONVERSATION_CONNECTION_ERRORS, AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS, AX_CONVERSATION_DEFAULT_COMPOSER_TABS, AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS, AX_CONVERSATION_DEFAULT_CONVERSATION_TABS, AX_CONVERSATION_DEFAULT_GROUP_ICON, AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS, AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND, AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS, AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES, AX_CONVERSATION_DEFAULT_USER_ICON, AX_CONVERSATION_ERRORS, AX_CONVERSATION_ERROR_HANDLER_CONFIG, AX_CONVERSATION_ERROR_MESSAGES, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_CATALOG, AX_CONVERSATION_FILE_ERRORS, AX_CONVERSATION_FILE_PRESENTATION, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_FILE_TYPES_READY, AX_CONVERSATION_IMAGE_CATALOG, AX_CONVERSATION_IMAGE_PRESENTATION, 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_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_JUMBO_EMOJI_MAX, AX_CONVERSATION_LOCATION_ERRORS, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_ERRORS, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE, AX_CONVERSATION_PEER_AVATAR_TYPES, AX_CONVERSATION_REGISTRY_CONFIG, AX_CONVERSATION_STICKER_API_KEY, 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_URL_ERRORS, AX_CONVERSATION_USER_AVATAR_COMPONENT, AX_CONVERSATION_USER_ERRORS, AX_CONVERSATION_VIDEO_CATALOG, AX_CONVERSATION_VIDEO_PRESENTATION, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_CATALOG, AX_CONVERSATION_VOICE_PRESENTATION, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, abortPickerUploads, applyAudioLocalPreview, applyFileLocalPreview, applyLocalPreview, applyVideoLocalPreview, applyVoiceLocalPreview, audioItemFromUpload, bindMediaRendererContentState, buildMediaGalleryTiles, canShowRendererContentError, cleanupPickerUploads, conversationAudioUtilities, conversationFileUtilities, conversationImageUtilities, conversationVideoUtilities, conversationVoiceUtilities, copyWithFileTypeFallback, countLoneEmojis, createConversationAudioFileType, createConversationFileFileType, createConversationImageFileType, createConversationVideoFileType, createConversationVoiceFileType, createLocalPreviewUrl, createObjectUrl, createPickerDragHandlers, createPickerUploadItemId, createResolvedMediaUrlSignal, deleteUploadedPickerMedia, dismissComposerPickerHost, ensureConversationFileCatalogRegistered, fetchConversationMediaPage, fileItemAsAudioMedia, fileItemFromUpload, filesFromClipboardEvent, filterMessagesByMediaCategory, filterSupplementalInfoPanelMessages, findExistingPrivateConversation, formatDuration, formatErrorMessage, formatFileByteSize, formatFileSize, formatMediaDuration, formatPickerValidationMessage, getActiveComposerPickerPasteHandler, getConversationMediaCategories, getConversationProfileFields, getErrorMessage, getMessageAudioItems, getMessageVideoItems, getPickerCancelUploadLabel, getPrivatePeerParticipant, hasRegistryComponent, inferFileExtensionHintFromMessage, isAttachmentListCategory, isComposerTabEnabled, isConversationReactionsEnabled, isConversationRoomCreator, isGenericPrivateConversationTitle, isGridMediaCategory, isGroupLikeConversation, isJumboEmojiText, isJumboEmojiTextMessage, isMessageDeliveryPending, isMessageListThemeBackground, isMessageVisibleAfterHistoryCutoff, isNonPersistableMediaUrl, isPickerItemReadyToSend, isPlainChromeMessage, isSameMessageListBackground, isUploadAborted, limitFilesToCapacity, listTextGraphemes, mediaCopyText, mergeAudioUploadResult, mergeFileUploadResult, mergeInfoPanelMessages, mergeUploadResult, mergeVideoUploadResult, mergeVoiceUploadResult, mergeWithDefaults, messageContainsLink, normalizeAudioPayload, normalizeFilePayload, normalizeImagePayload, normalizeMessageListBackgroundValue, normalizeVideoPayload, notifyMaxFilesCapacityExceeded, notifyPickerValidationErrors, openWithFileType, pickDisplayMediaUrl, pickEarliestJoinedParticipant, pickerItemToMediaReference, pickerItemToUploadResult, probeImageDimensions, probeVideoMedia, provideConversation, provideConversationComposerFileTypes, provideConversationFileCatalog, registerComposerPickerPasteHandler, reportMediaLoadError, resolveComposerMaxFiles, resolveConversationAvatarDisplay, resolveConversationComposerTabs, resolveConversationForViewer, resolveConversationMessageFileType, resolveConversationPeerParticipant, resolveConversationPeerUserId, resolveConversationTitleForViewer, resolveGalleryImageUrl, resolveImageDisplayUrl, resolveMessageChrome, resolveMessageListBackgroundRaw, resolveMessageListBackgroundStyle, resolveParticipantProfile, resolvePersistableMediaUrl, resolvePersistedThumbnailUrl, resolvePrivatePeerParticipant, resolvePrivatePeerUserId, resolveUserAvatarDisplay, resolveVideoThumbnailUrl, revokeObjectUrl, revokePickerBlobPreviews, sanitizeInput, shouldUseUserAvatarForConversation, sortUsersForForward, syncPlaybackInfoBarBanner, toUploaderReference as toMediaItemUploaderReference, toUploaderReference$1 as toUploaderReference, uploadPickerFile, usesDefaultMessageListWallpaper, validateConversationId, validateEmail, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds, videoItemFromUpload };
6805
+ export type { AXConversation, AXConversationApiError, AXConversationApiLogEntry, AXConversationApiName, AXConversationAudioMediaItem, AXConversationAudioPayload, AXConversationAvatarComponents, AXConversationAvatarDisplay, AXConversationAvatarKind, AXConversationBlockReportReason, AXConversationCleanupPickerUploadsOptions, AXConversationComposerAction, AXConversationComposerActionComponent, AXConversationComposerActionContext, AXConversationComposerGenerationPhase, AXConversationComposerPickerUploadItem, AXConversationComposerPrimaryButtonMode, AXConversationComposerTab, AXConversationComposerTabFeature, AXConversationConfig, AXConversationConnectionStatus, AXConversationConversationAvatarComponent, AXConversationCreateData, AXConversationDateSeparatorKind, AXConversationDeleteDialogMode, AXConversationDeleteDialogResult, AXConversationDeleteMessageCommand, AXConversationDeleteOptions, AXConversationDropdownMenuItem, AXConversationEditMessageCommand, AXConversationError, AXConversationErrorCode, AXConversationErrorHandlerConfig, AXConversationErrorMessage, AXConversationErrorSeverity, AXConversationFeatures, AXConversationFileMediaItem, AXConversationFilePayload, AXConversationFilter, AXConversationFilters, AXConversationForwardUserSortEntry, AXConversationGroupedReaction, AXConversationImageMediaItem, AXConversationImagePayload, AXConversationInfoBarAction, AXConversationInfoBarActionComponent, AXConversationInfoBarActionContext, AXConversationInfoBarActiveBanner, AXConversationInfoBarActiveComponent, AXConversationInfoProfileField, AXConversationItemAction, AXConversationItemActionContext, AXConversationLink, AXConversationLinkPreview, AXConversationLoadMessagesResult, AXConversationLocationPayload, AXConversationMediaCategory, AXConversationMediaCategoryId, AXConversationMediaDimensions, AXConversationMediaGalleryTile, AXConversationMediaItemFields, AXConversationMediaPageResult, AXConversationMention, AXConversationMessage, AXConversationMessageAction, AXConversationMessageActionContext, AXConversationMessageChrome, AXConversationMessageClusterRole, AXConversationMessageDateGroup, AXConversationMessageForwardData, AXConversationMessageInfoBarBannerComponent, AXConversationMessageListBackground, AXConversationMessageListBackgroundPreset, AXConversationMessageListEmptyComponent, AXConversationMessageListThemeBackground, AXConversationMessagePayload, AXConversationMessageRenderer, AXConversationMessageRendererCapabilities, AXConversationMessageRendererComponent, AXConversationMessageRendererContentState, AXConversationMessageRendererState, AXConversationMessageSearchFilters, AXConversationMessageStatus, AXConversationMessageType, AXConversationMetadata, AXConversationOptions, AXConversationOutletSkeleton, AXConversationPaginatedResult, AXConversationPagination, AXConversationPaginationState, AXConversationParticipant, AXConversationParticipantRole, AXConversationParticipantUpdate, AXConversationPickerPasteHandler, AXConversationPinnedMessage, AXConversationPlaybackBannerInputs, AXConversationPollOption, AXConversationPollPayload, AXConversationPresenceStatus, AXConversationPresenceUpdate, AXConversationReaction, AXConversationReadReceipt, AXConversationRegistryComponentRef, AXConversationRegistryConfiguration, AXConversationRegistryItem, AXConversationRoomPreferences, AXConversationRoomPreferencesMap, AXConversationSendMessageCommand, AXConversationSendMessageOptions, AXConversationSendMessageUploadSource, AXConversationSettingsUpdate, AXConversationSidebarTabsOrientation, AXConversationSort, AXConversationStickerPayload, AXConversationSystemPayload, AXConversationTab, AXConversationTextFormat, AXConversationTextPayload, AXConversationType, AXConversationTypingIndicator, AXConversationUpdateData, AXConversationUploadOptions, AXConversationUploaderFilePreview, AXConversationUploaderReference, AXConversationUploaderResult, AXConversationUser, AXConversationUserAvatarComponent, AXConversationUserPresence, AXConversationUserProfile, AXConversationUserProfileUpdate, AXConversationUserSearchFilters, AXConversationValidationResult, AXConversationVideoMediaItem, AXConversationVideoPayload, AXConversationVoicePayload };