@acorex/components 20.8.32 โ†’ 20.9.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 (128) hide show
  1. package/conversation/README.md +462 -2
  2. package/conversation/index.d.ts +5400 -485
  3. package/fesm2022/acorex-components-calendar.mjs +3 -2
  4. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  5. package/fesm2022/acorex-components-conversation-acorex-components-conversation-CjVDCoJw.mjs +13711 -0
  6. package/fesm2022/acorex-components-conversation-acorex-components-conversation-CjVDCoJw.mjs.map +1 -0
  7. package/fesm2022/acorex-components-conversation-audio-attachment.component-Ri-Jx210.mjs +119 -0
  8. package/fesm2022/acorex-components-conversation-audio-attachment.component-Ri-Jx210.mjs.map +1 -0
  9. package/fesm2022/acorex-components-conversation-audio-composer.payload-DiMDlVl9.mjs +59 -0
  10. package/fesm2022/acorex-components-conversation-audio-composer.payload-DiMDlVl9.mjs.map +1 -0
  11. package/fesm2022/acorex-components-conversation-audio-picker.component-CqrKBDIF.mjs +432 -0
  12. package/fesm2022/acorex-components-conversation-audio-picker.component-CqrKBDIF.mjs.map +1 -0
  13. package/fesm2022/acorex-components-conversation-audio-renderer.component-CO8owVrA.mjs +177 -0
  14. package/fesm2022/acorex-components-conversation-audio-renderer.component-CO8owVrA.mjs.map +1 -0
  15. package/fesm2022/acorex-components-conversation-audio.payload-CLnYjmYY.mjs +54 -0
  16. package/fesm2022/acorex-components-conversation-audio.payload-CLnYjmYY.mjs.map +1 -0
  17. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-CYutyq7i.mjs +101 -0
  18. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-CYutyq7i.mjs.map +1 -0
  19. package/fesm2022/acorex-components-conversation-conversation-audio.file-type-D-hIBwQ2.mjs +100 -0
  20. package/fesm2022/acorex-components-conversation-conversation-audio.file-type-D-hIBwQ2.mjs.map +1 -0
  21. package/fesm2022/acorex-components-conversation-conversation-file.file-type-DQUy3C64.mjs +121 -0
  22. package/fesm2022/acorex-components-conversation-conversation-file.file-type-DQUy3C64.mjs.map +1 -0
  23. package/fesm2022/acorex-components-conversation-conversation-image.file-type-Bd_SkwR0.mjs +84 -0
  24. package/fesm2022/acorex-components-conversation-conversation-image.file-type-Bd_SkwR0.mjs.map +1 -0
  25. package/fesm2022/acorex-components-conversation-conversation-info-media-view.component-BalIIAFB.mjs +238 -0
  26. package/fesm2022/acorex-components-conversation-conversation-info-media-view.component-BalIIAFB.mjs.map +1 -0
  27. package/fesm2022/acorex-components-conversation-conversation-info-panel.component-BJMo9bDd.mjs +1080 -0
  28. package/fesm2022/acorex-components-conversation-conversation-info-panel.component-BJMo9bDd.mjs.map +1 -0
  29. package/fesm2022/acorex-components-conversation-conversation-video.file-type-DyK0bLE5.mjs +102 -0
  30. package/fesm2022/acorex-components-conversation-conversation-video.file-type-DyK0bLE5.mjs.map +1 -0
  31. package/fesm2022/acorex-components-conversation-conversation-voice.file-type-v3rFWDv6.mjs +90 -0
  32. package/fesm2022/acorex-components-conversation-conversation-voice.file-type-v3rFWDv6.mjs.map +1 -0
  33. package/fesm2022/acorex-components-conversation-emoji-categories-C7Gm95V0.mjs +1840 -0
  34. package/fesm2022/acorex-components-conversation-emoji-categories-C7Gm95V0.mjs.map +1 -0
  35. package/fesm2022/acorex-components-conversation-fallback-renderer.component-DOQkZWwP.mjs +44 -0
  36. package/fesm2022/acorex-components-conversation-fallback-renderer.component-DOQkZWwP.mjs.map +1 -0
  37. package/fesm2022/acorex-components-conversation-file-composer.payload-azPSH99m.mjs +64 -0
  38. package/fesm2022/acorex-components-conversation-file-composer.payload-azPSH99m.mjs.map +1 -0
  39. package/fesm2022/acorex-components-conversation-file-picker.component-cmUkgSF3.mjs +468 -0
  40. package/fesm2022/acorex-components-conversation-file-picker.component-cmUkgSF3.mjs.map +1 -0
  41. package/fesm2022/acorex-components-conversation-file-renderer.component-CpUgRTR4.mjs +125 -0
  42. package/fesm2022/acorex-components-conversation-file-renderer.component-CpUgRTR4.mjs.map +1 -0
  43. package/fesm2022/acorex-components-conversation-file.payload-DXwzNWxT.mjs +50 -0
  44. package/fesm2022/acorex-components-conversation-file.payload-DXwzNWxT.mjs.map +1 -0
  45. package/fesm2022/acorex-components-conversation-format-media-DUD4vA6F.mjs +21 -0
  46. package/fesm2022/acorex-components-conversation-format-media-DUD4vA6F.mjs.map +1 -0
  47. package/fesm2022/acorex-components-conversation-image-attachment.component-BZto5LFo.mjs +77 -0
  48. package/fesm2022/acorex-components-conversation-image-attachment.component-BZto5LFo.mjs.map +1 -0
  49. package/fesm2022/acorex-components-conversation-image-picker.component-G9EEOyDg.mjs +407 -0
  50. package/fesm2022/acorex-components-conversation-image-picker.component-G9EEOyDg.mjs.map +1 -0
  51. package/fesm2022/acorex-components-conversation-image-renderer.component-Bwa6rG6C.mjs +83 -0
  52. package/fesm2022/acorex-components-conversation-image-renderer.component-Bwa6rG6C.mjs.map +1 -0
  53. package/fesm2022/acorex-components-conversation-index-BbrYsQ84.mjs +180 -0
  54. package/fesm2022/acorex-components-conversation-index-BbrYsQ84.mjs.map +1 -0
  55. package/fesm2022/acorex-components-conversation-index-DtGEWeKN.mjs +266 -0
  56. package/fesm2022/acorex-components-conversation-index-DtGEWeKN.mjs.map +1 -0
  57. package/fesm2022/acorex-components-conversation-location-picker.component-Cx993j_c.mjs +149 -0
  58. package/fesm2022/acorex-components-conversation-location-picker.component-Cx993j_c.mjs.map +1 -0
  59. package/fesm2022/acorex-components-conversation-location-renderer.component-BiynmAJw.mjs +118 -0
  60. package/fesm2022/acorex-components-conversation-location-renderer.component-BiynmAJw.mjs.map +1 -0
  61. package/fesm2022/acorex-components-conversation-media-formatters-DV3wEEno.mjs +17 -0
  62. package/fesm2022/acorex-components-conversation-media-formatters-DV3wEEno.mjs.map +1 -0
  63. package/fesm2022/acorex-components-conversation-media-playback-info-bar-banner.component-a7OSpfB1.mjs +140 -0
  64. package/fesm2022/acorex-components-conversation-media-playback-info-bar-banner.component-a7OSpfB1.mjs.map +1 -0
  65. package/fesm2022/acorex-components-conversation-message-renderer-copy-host.component-D_eAnM6v.mjs +33 -0
  66. package/fesm2022/acorex-components-conversation-message-renderer-copy-host.component-D_eAnM6v.mjs.map +1 -0
  67. package/fesm2022/acorex-components-conversation-message-renderer-state.component-DSnNoz1N.mjs +172 -0
  68. package/fesm2022/acorex-components-conversation-message-renderer-state.component-DSnNoz1N.mjs.map +1 -0
  69. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-CbNyy2Ws.mjs +224 -0
  70. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-CbNyy2Ws.mjs.map +1 -0
  71. package/fesm2022/acorex-components-conversation-pagination-demo-data-DRr9PXjJ.mjs +81 -0
  72. package/fesm2022/acorex-components-conversation-pagination-demo-data-DRr9PXjJ.mjs.map +1 -0
  73. package/fesm2022/acorex-components-conversation-picker-header.component-BhTzlufI.mjs +91 -0
  74. package/fesm2022/acorex-components-conversation-picker-header.component-BhTzlufI.mjs.map +1 -0
  75. package/fesm2022/acorex-components-conversation-picker-toolbar.component-CpyS0j6P.mjs +537 -0
  76. package/fesm2022/acorex-components-conversation-picker-toolbar.component-CpyS0j6P.mjs.map +1 -0
  77. package/fesm2022/acorex-components-conversation-picker-upload-C-PlKPaU.mjs +163 -0
  78. package/fesm2022/acorex-components-conversation-picker-upload-C-PlKPaU.mjs.map +1 -0
  79. package/fesm2022/acorex-components-conversation-playback-banner-sync-BMsx6Fuy.mjs +68 -0
  80. package/fesm2022/acorex-components-conversation-playback-banner-sync-BMsx6Fuy.mjs.map +1 -0
  81. package/fesm2022/acorex-components-conversation-renderer-shared.styles-Digah3Zn.mjs +95 -0
  82. package/fesm2022/acorex-components-conversation-renderer-shared.styles-Digah3Zn.mjs.map +1 -0
  83. package/fesm2022/acorex-components-conversation-search.component-96NI2ERG.mjs +187 -0
  84. package/fesm2022/acorex-components-conversation-search.component-96NI2ERG.mjs.map +1 -0
  85. package/fesm2022/acorex-components-conversation-send-message-media--Rbrne7k.mjs +170 -0
  86. package/fesm2022/acorex-components-conversation-send-message-media--Rbrne7k.mjs.map +1 -0
  87. package/fesm2022/acorex-components-conversation-shared-storage.seed-zFjNXfKF.mjs +750 -0
  88. package/fesm2022/acorex-components-conversation-shared-storage.seed-zFjNXfKF.mjs.map +1 -0
  89. package/fesm2022/acorex-components-conversation-sticker-renderer.component-BZgx_Ylk.mjs +103 -0
  90. package/fesm2022/acorex-components-conversation-sticker-renderer.component-BZgx_Ylk.mjs.map +1 -0
  91. package/fesm2022/acorex-components-conversation-system-renderer.component-D1Aj-LuF.mjs +55 -0
  92. package/fesm2022/acorex-components-conversation-system-renderer.component-D1Aj-LuF.mjs.map +1 -0
  93. package/fesm2022/acorex-components-conversation-text-renderer.component-Cxvwjr2p.mjs +109 -0
  94. package/fesm2022/acorex-components-conversation-text-renderer.component-Cxvwjr2p.mjs.map +1 -0
  95. package/fesm2022/acorex-components-conversation-video-attachment.component-DBY_4Ri2.mjs +105 -0
  96. package/fesm2022/acorex-components-conversation-video-attachment.component-DBY_4Ri2.mjs.map +1 -0
  97. package/fesm2022/acorex-components-conversation-video-composer.payload-CWGxsPg5.mjs +62 -0
  98. package/fesm2022/acorex-components-conversation-video-composer.payload-CWGxsPg5.mjs.map +1 -0
  99. package/fesm2022/acorex-components-conversation-video-picker.component-D1JYwEm_.mjs +446 -0
  100. package/fesm2022/acorex-components-conversation-video-picker.component-D1JYwEm_.mjs.map +1 -0
  101. package/fesm2022/acorex-components-conversation-video-renderer.component-iwf2bU29.mjs +181 -0
  102. package/fesm2022/acorex-components-conversation-video-renderer.component-iwf2bU29.mjs.map +1 -0
  103. package/fesm2022/acorex-components-conversation-video.payload-DfBEjqQ4.mjs +54 -0
  104. package/fesm2022/acorex-components-conversation-video.payload-DfBEjqQ4.mjs.map +1 -0
  105. package/fesm2022/acorex-components-conversation-voice-composer.payload-DLVow7ex.mjs +17 -0
  106. package/fesm2022/acorex-components-conversation-voice-composer.payload-DLVow7ex.mjs.map +1 -0
  107. package/fesm2022/acorex-components-conversation-voice-recorder.component-P8J_5OH0.mjs +328 -0
  108. package/fesm2022/acorex-components-conversation-voice-recorder.component-P8J_5OH0.mjs.map +1 -0
  109. package/fesm2022/acorex-components-conversation-voice-renderer.component-CZpEqbXL.mjs +270 -0
  110. package/fesm2022/acorex-components-conversation-voice-renderer.component-CZpEqbXL.mjs.map +1 -0
  111. package/fesm2022/acorex-components-conversation.mjs +1 -1402
  112. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  113. package/fesm2022/acorex-components-data-table.mjs +2 -2
  114. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  115. package/fesm2022/acorex-components-rest-api-generator.mjs +2 -2
  116. package/fesm2022/acorex-components-rest-api-generator.mjs.map +1 -1
  117. package/fesm2022/acorex-components-scheduler-picker.mjs +22 -14
  118. package/fesm2022/acorex-components-scheduler-picker.mjs.map +1 -1
  119. package/fesm2022/acorex-components-step-wizard.mjs +2 -2
  120. package/fesm2022/acorex-components-step-wizard.mjs.map +1 -1
  121. package/fesm2022/acorex-components-tree-view-legacy.mjs +2 -2
  122. package/fesm2022/acorex-components-tree-view-legacy.mjs.map +1 -1
  123. package/package.json +35 -39
  124. package/scheduler-picker/index.d.ts +2 -0
  125. package/conversation2/README.md +0 -463
  126. package/conversation2/index.d.ts +0 -6410
  127. package/fesm2022/acorex-components-conversation2.mjs +0 -22331
  128. package/fesm2022/acorex-components-conversation2.mjs.map +0 -1
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@acorex/components",
3
- "version": "20.8.32",
3
+ "version": "20.9.0",
4
4
  "peerDependencies": {
5
- "@acorex/core": "20.8.32",
6
- "@acorex/cdk": "20.8.32",
5
+ "@acorex/core": "20.9.0",
6
+ "@acorex/cdk": "20.9.0",
7
7
  "polytype": ">=0.17.0",
8
8
  "angular-imask": ">=7.6.1",
9
9
  "gridstack": ">=12.0.0",
@@ -60,14 +60,14 @@
60
60
  "types": "./accordion/index.d.ts",
61
61
  "default": "./fesm2022/acorex-components-accordion.mjs"
62
62
  },
63
- "./action-sheet": {
64
- "types": "./action-sheet/index.d.ts",
65
- "default": "./fesm2022/acorex-components-action-sheet.mjs"
66
- },
67
63
  "./alert": {
68
64
  "types": "./alert/index.d.ts",
69
65
  "default": "./fesm2022/acorex-components-alert.mjs"
70
66
  },
67
+ "./action-sheet": {
68
+ "types": "./action-sheet/index.d.ts",
69
+ "default": "./fesm2022/acorex-components-action-sheet.mjs"
70
+ },
71
71
  "./aspect-ratio": {
72
72
  "types": "./aspect-ratio/index.d.ts",
73
73
  "default": "./fesm2022/acorex-components-aspect-ratio.mjs"
@@ -96,26 +96,26 @@
96
96
  "types": "./breadcrumbs/index.d.ts",
97
97
  "default": "./fesm2022/acorex-components-breadcrumbs.mjs"
98
98
  },
99
- "./button": {
100
- "types": "./button/index.d.ts",
101
- "default": "./fesm2022/acorex-components-button.mjs"
102
- },
103
99
  "./button-group": {
104
100
  "types": "./button-group/index.d.ts",
105
101
  "default": "./fesm2022/acorex-components-button-group.mjs"
106
102
  },
103
+ "./button": {
104
+ "types": "./button/index.d.ts",
105
+ "default": "./fesm2022/acorex-components-button.mjs"
106
+ },
107
107
  "./calendar": {
108
108
  "types": "./calendar/index.d.ts",
109
109
  "default": "./fesm2022/acorex-components-calendar.mjs"
110
110
  },
111
- "./check-box": {
112
- "types": "./check-box/index.d.ts",
113
- "default": "./fesm2022/acorex-components-check-box.mjs"
114
- },
115
111
  "./chips": {
116
112
  "types": "./chips/index.d.ts",
117
113
  "default": "./fesm2022/acorex-components-chips.mjs"
118
114
  },
115
+ "./check-box": {
116
+ "types": "./check-box/index.d.ts",
117
+ "default": "./fesm2022/acorex-components-check-box.mjs"
118
+ },
119
119
  "./circular-progress": {
120
120
  "types": "./circular-progress/index.d.ts",
121
121
  "default": "./fesm2022/acorex-components-circular-progress.mjs"
@@ -148,10 +148,6 @@
148
148
  "types": "./conversation/index.d.ts",
149
149
  "default": "./fesm2022/acorex-components-conversation.mjs"
150
150
  },
151
- "./conversation2": {
152
- "types": "./conversation2/index.d.ts",
153
- "default": "./fesm2022/acorex-components-conversation2.mjs"
154
- },
155
151
  "./cron-job": {
156
152
  "types": "./cron-job/index.d.ts",
157
153
  "default": "./fesm2022/acorex-components-cron-job.mjs"
@@ -260,6 +256,10 @@
260
256
  "types": "./loading/index.d.ts",
261
257
  "default": "./fesm2022/acorex-components-loading.mjs"
262
258
  },
259
+ "./loading-dialog": {
260
+ "types": "./loading-dialog/index.d.ts",
261
+ "default": "./fesm2022/acorex-components-loading-dialog.mjs"
262
+ },
263
263
  "./map": {
264
264
  "types": "./map/index.d.ts",
265
265
  "default": "./fesm2022/acorex-components-map.mjs"
@@ -268,10 +268,6 @@
268
268
  "types": "./media-viewer/index.d.ts",
269
269
  "default": "./fesm2022/acorex-components-media-viewer.mjs"
270
270
  },
271
- "./loading-dialog": {
272
- "types": "./loading-dialog/index.d.ts",
273
- "default": "./fesm2022/acorex-components-loading-dialog.mjs"
274
- },
275
271
  "./menu": {
276
272
  "types": "./menu/index.d.ts",
277
273
  "default": "./fesm2022/acorex-components-menu.mjs"
@@ -300,14 +296,14 @@
300
296
  "types": "./otp/index.d.ts",
301
297
  "default": "./fesm2022/acorex-components-otp.mjs"
302
298
  },
303
- "./paint": {
304
- "types": "./paint/index.d.ts",
305
- "default": "./fesm2022/acorex-components-paint.mjs"
306
- },
307
299
  "./page": {
308
300
  "types": "./page/index.d.ts",
309
301
  "default": "./fesm2022/acorex-components-page.mjs"
310
302
  },
303
+ "./paint": {
304
+ "types": "./paint/index.d.ts",
305
+ "default": "./fesm2022/acorex-components-paint.mjs"
306
+ },
311
307
  "./password-box": {
312
308
  "types": "./password-box/index.d.ts",
313
309
  "default": "./fesm2022/acorex-components-password-box.mjs"
@@ -324,14 +320,14 @@
324
320
  "types": "./picker/index.d.ts",
325
321
  "default": "./fesm2022/acorex-components-picker.mjs"
326
322
  },
327
- "./popup": {
328
- "types": "./popup/index.d.ts",
329
- "default": "./fesm2022/acorex-components-popup.mjs"
330
- },
331
323
  "./popover": {
332
324
  "types": "./popover/index.d.ts",
333
325
  "default": "./fesm2022/acorex-components-popover.mjs"
334
326
  },
327
+ "./popup": {
328
+ "types": "./popup/index.d.ts",
329
+ "default": "./fesm2022/acorex-components-popup.mjs"
330
+ },
335
331
  "./progress-bar": {
336
332
  "types": "./progress-bar/index.d.ts",
337
333
  "default": "./fesm2022/acorex-components-progress-bar.mjs"
@@ -396,26 +392,26 @@
396
392
  "types": "./select-box/index.d.ts",
397
393
  "default": "./fesm2022/acorex-components-select-box.mjs"
398
394
  },
399
- "./selection-list-2": {
400
- "types": "./selection-list-2/index.d.ts",
401
- "default": "./fesm2022/acorex-components-selection-list-2.mjs"
402
- },
403
395
  "./selection-list": {
404
396
  "types": "./selection-list/index.d.ts",
405
397
  "default": "./fesm2022/acorex-components-selection-list.mjs"
406
398
  },
399
+ "./selection-list-2": {
400
+ "types": "./selection-list-2/index.d.ts",
401
+ "default": "./fesm2022/acorex-components-selection-list-2.mjs"
402
+ },
407
403
  "./side-menu": {
408
404
  "types": "./side-menu/index.d.ts",
409
405
  "default": "./fesm2022/acorex-components-side-menu.mjs"
410
406
  },
411
- "./slider": {
412
- "types": "./slider/index.d.ts",
413
- "default": "./fesm2022/acorex-components-slider.mjs"
414
- },
415
407
  "./skeleton": {
416
408
  "types": "./skeleton/index.d.ts",
417
409
  "default": "./fesm2022/acorex-components-skeleton.mjs"
418
410
  },
411
+ "./slider": {
412
+ "types": "./slider/index.d.ts",
413
+ "default": "./fesm2022/acorex-components-slider.mjs"
414
+ },
419
415
  "./sliding-item": {
420
416
  "types": "./sliding-item/index.d.ts",
421
417
  "default": "./fesm2022/acorex-components-sliding-item.mjs"
@@ -855,6 +855,8 @@ declare class AXSchedulerPickerService {
855
855
  * Parses standard cron format: minute hour day month weekday
856
856
  */
857
857
  fromCronExpression(cron: string): Promise<AXSchedulerPickerValue | null>;
858
+ /** cron-parser v5 field values may include special chars (L, W, โ€ฆ); keep numbers only. */
859
+ private cronFieldNumericValues;
858
860
  /**
859
861
  * Analyze a cron field to extract interval and values
860
862
  */
@@ -1,463 +0,0 @@
1
- # @acorex/components/conversation2
2
-
3
- A modern, fully-featured conversation/chat component for Angular 18+. Built with signals, standalone components, and extensibility in mind.
4
-
5
- ## ๐Ÿš€ Features
6
-
7
- - **Real-time Messaging** - Live message updates with WebSocket support
8
- - **Multiple Message Types** - Text, images, videos, audio, voice, files, locations, stickers, contacts
9
- - **Rich Interactions** - Reactions, replies, message editing, deletion, forwarding
10
- - **Group & Private Chats** - Support for 1-on-1 and group conversations
11
- - **Typing Indicators** - Real-time typing status
12
- - **Read Receipts** - Message delivery and read status
13
- - **Infinite Scroll** - Efficient pagination for message history
14
- - **Search** - Search within conversations and messages
15
- - **Extensible** - Plugin system for custom message renderers and actions
16
- - **Responsive** - Mobile-friendly design
17
- - **Accessibility** - ARIA labels and keyboard navigation
18
-
19
- ## ๐Ÿ“ฆ Installation
20
-
21
- ```bash
22
- npm install @acorex/components/conversation2
23
- ```
24
-
25
- ## ๐Ÿ”ง Peer Dependencies
26
-
27
- This package requires the following peer dependencies:
28
-
29
- ### Required Angular Dependencies
30
-
31
- ```json
32
- {
33
- "@angular/common": "^18.0.0",
34
- "@angular/core": "^18.0.0",
35
- "@angular/forms": "^18.0.0",
36
- "rxjs": "^7.8.0"
37
- }
38
- ```
39
-
40
- ### Required Acorex Dependencies
41
-
42
- #### Core Packages
43
-
44
- - `@acorex/cdk/common` - Common utilities and directives
45
- - `@acorex/core/date-time` - Date and time formatting
46
- - `@acorex/core/format` - General formatting utilities
47
-
48
- #### Component Packages
49
-
50
- - `@acorex/components/avatar` - User avatars
51
- - `@acorex/components/badge` - Notification badges
52
- - `@acorex/components/button` - Button components
53
- - `@acorex/components/decorators` - Decorative elements
54
- - `@acorex/components/dialog` - Dialog service
55
- - `@acorex/components/dropdown` - Dropdown panels
56
- - `@acorex/components/image` - Image components
57
- - `@acorex/components/label` - Label components
58
- - `@acorex/components/loading` - Loading indicators
59
- - `@acorex/components/menu` - Context menus
60
- - `@acorex/components/popover` - Popover components
61
- - `@acorex/components/popup` - Popup service
62
- - `@acorex/components/search-box` - Search functionality
63
- - `@acorex/components/select-box` - Select dropdowns
64
- - `@acorex/components/tabs` - Tab components
65
- - `@acorex/components/text-area` - Text input areas
66
- - `@acorex/components/text-box` - Text input boxes
67
- - `@acorex/components/toast` - Toast notifications
68
- - `@acorex/components/tooltip` - Tooltips
69
- - `@acorex/components/uploader` - File upload functionality
70
-
71
- ## ๐ŸŽฏ Quick Start
72
-
73
- > **New to Conversation2?** Check out our [5-Minute Quick Start Guide](./docs/QUICK-START.md) for the fastest way to get started!
74
-
75
- ### Detailed Setup
76
-
77
- ### 1. Standalone Application (Recommended)
78
-
79
- ```typescript
80
- import { ApplicationConfig } from '@angular/core';
81
- import {
82
- provideConversation,
83
- AXIndexedDBUserApi,
84
- AXIndexedDBConversationApi,
85
- AXIndexedDBMessageApi,
86
- AXIndexedDBRealtimeApi,
87
- } from '@acorex/components/conversation2';
88
-
89
- export const appConfig: ApplicationConfig = {
90
- providers: [
91
- MyAppUploaderService,
92
- provideConversation({
93
- userApi: AXIndexedDBUserApi,
94
- conversationApi: AXIndexedDBConversationApi,
95
- messageApi: AXIndexedDBMessageApi,
96
- realtimeApi: AXIndexedDBRealtimeApi, // optional
97
- config: {
98
- messagePageSize: 50,
99
- conversationPageSize: 30,
100
- },
101
- registry: {
102
- // Optional: Register custom message renderers, actions, etc.
103
- },
104
- }),
105
- ],
106
- };
107
- ```
108
-
109
- ### 2. NgModule Application (Legacy)
110
-
111
- ```typescript
112
- import { NgModule } from '@angular/core';
113
- import {
114
- AXConversation2Module,
115
- AXIndexedDBUserApi,
116
- AXIndexedDBConversationApi,
117
- AXIndexedDBMessageApi,
118
- AXIndexedDBRealtimeApi,
119
- } from '@acorex/components/conversation2';
120
-
121
- @NgModule({
122
- imports: [
123
- AXConversation2Module.forRoot({
124
- userApi: AXIndexedDBUserApi,
125
- conversationApi: AXIndexedDBConversationApi,
126
- messageApi: AXIndexedDBMessageApi,
127
- realtimeApi: AXIndexedDBRealtimeApi,
128
- config: { /* ... */ },
129
- }),
130
- ],
131
- })
132
- export class AppModule {}
133
- ```
134
-
135
- ### 3. Use in Template
136
-
137
- ```html
138
- <ax-conversation-container></ax-conversation-container>
139
- ```
140
-
141
- ## ๐Ÿ”Œ API Implementation
142
-
143
- You must provide an API implementation that extends `AXConversationApi`:
144
-
145
- ```typescript
146
- import { Injectable } from '@angular/core';
147
- import { HttpClient } from '@angular/common/http';
148
- import { AXConversationApi, AXPagination, AXPaginatedResult } from '@acorex/components/conversation2';
149
-
150
- @Injectable()
151
- export class MyConversationApi extends AXConversationApi {
152
- constructor(private http: HttpClient) {
153
- super();
154
- }
155
-
156
- async connect(): Promise<void> {
157
- // Initialize WebSocket connection
158
- }
159
-
160
- async fetchConversations(pagination: AXPagination): Promise<AXPaginatedResult<AXConversation>> {
161
- const response = await this.http.get('/api/conversations', {
162
- params: { page: pagination.page, pageSize: pagination.pageSize }
163
- }).toPromise();
164
- return response;
165
- }
166
-
167
- // Implement other required methods...
168
- }
169
- ```
170
-
171
- ### Built-in API Implementations
172
-
173
- #### IndexedDB API (Development/Demo)
174
-
175
- ```typescript
176
- import {
177
- provideConversation,
178
- AXIndexedDBUserApi,
179
- AXIndexedDBConversationApi,
180
- AXIndexedDBMessageApi,
181
- AXIndexedDBRealtimeApi,
182
- } from '@acorex/components/conversation2';
183
-
184
- // Provides in-memory storage with sample data
185
- // Perfect for development and demos
186
- provideConversation({
187
- userApi: AXIndexedDBUserApi,
188
- conversationApi: AXIndexedDBConversationApi,
189
- messageApi: AXIndexedDBMessageApi,
190
- realtimeApi: AXIndexedDBRealtimeApi,
191
- });
192
- ```
193
-
194
- Register a service that subscribes to `AXUploaderService.onUpload`, `onResolveUrl`, and `onDeleteMedia` (see showcase `AXShowcaseConversationIndexedDbUploaderService`).
195
-
196
- #### IndexedDB with AI API (AI-Powered Demo)
197
-
198
- ```typescript
199
- import {
200
- provideConversation,
201
- AXIndexedDBUserApi,
202
- AXIndexedDBConversationApi,
203
- AXIndexedDBMessageAIApi,
204
- AXIndexedDBRealtimeApi,
205
- } from '@acorex/components/conversation2';
206
-
207
- // Includes AI-powered auto-responses via message API
208
- provideConversation({
209
- userApi: AXIndexedDBUserApi,
210
- conversationApi: AXIndexedDBConversationApi,
211
- messageApi: AXIndexedDBMessageAIApi,
212
- realtimeApi: AXIndexedDBRealtimeApi,
213
- });
214
- ```
215
-
216
- ## โš™๏ธ Configuration
217
-
218
- ### Conversation Config
219
-
220
- ```typescript
221
- interface AXConversationConfig {
222
- // Pagination
223
- messagePageSize?: number; // Default: 50
224
- conversationPageSize?: number; // Default: 30
225
- infiniteScrollThreshold?: number; // Default: 200px
226
- scrollThreshold?: number; // Default: 100px
227
-
228
- // UI Behavior
229
- messageHighlightDuration?: number; // Default: 2000ms
230
- typingIndicatorTimeout?: number; // Default: 3000ms
231
- }
232
- ```
233
-
234
- ### Registry Configuration
235
-
236
- ```typescript
237
- interface AXRegistryConfiguration {
238
- messageRenderers?: AXMessageRenderer[];
239
- messageActions?: AXMessageAction[];
240
- composerActions?: AXComposerAction[];
241
- composerTabs?: AXComposerTab[];
242
- conversationTabs?: AXConversationTab[];
243
- infoBarActions?: AXInfoBarAction[];
244
- conversationItemActions?: AXConversationItemAction[];
245
- }
246
- ```
247
-
248
- ## ๐ŸŽจ Customization
249
-
250
- ### Custom Message Renderer
251
-
252
- ```typescript
253
- import { Component, input } from '@angular/core';
254
- import { AXMessageRenderer } from '@acorex/components/conversation2';
255
-
256
- @Component({
257
- selector: 'my-custom-renderer',
258
- template: `<div>{{ message().payload.customData }}</div>`
259
- })
260
- export class MyCustomRendererComponent {
261
- message = input.required<AXMessage>();
262
- }
263
-
264
- const myRenderer: AXMessageRenderer = {
265
- type: 'custom',
266
- component: MyCustomRendererComponent,
267
- priority: 100
268
- };
269
-
270
- // Register in config
271
- provideConversation({
272
- api: MyApi,
273
- registry: {
274
- messageRenderers: [myRenderer]
275
- }
276
- });
277
- ```
278
-
279
- ### Custom Message Action
280
-
281
- ```typescript
282
- const forwardAction: AXMessageAction = {
283
- id: 'forward',
284
- label: 'Forward',
285
- icon: 'forward',
286
- shortcut: 'Ctrl+F',
287
- enabled: (message, user) => message.senderId === user.id,
288
- execute: async (message, service) => {
289
- // Forward logic
290
- }
291
- };
292
-
293
- provideConversation({
294
- api: MyApi,
295
- registry: {
296
- messageActions: [forwardAction]
297
- }
298
- });
299
- ```
300
-
301
- ## ๐Ÿ“ฑ Components
302
-
303
- ### Main Components
304
-
305
- - `<ax-conversation-container>` - Full conversation UI with sidebar, messages, and composer
306
- - `<ax-conversation-sidebar>` - Conversation list sidebar
307
- - `<ax-conversation-message-list>` - Message list with virtual scrolling
308
- - `<ax-conversation-composer>` - Message input area
309
- - `<ax-conversation-info-bar>` - Conversation header with actions
310
-
311
- ### Usage Examples
312
-
313
- ```html
314
- <!-- Full conversation UI -->
315
- <ax-conversation-container></ax-conversation-container>
316
-
317
- <!-- Custom layout -->
318
- <div class="my-chat-layout">
319
- <ax-conversation-sidebar></ax-conversation-sidebar>
320
- <div class="chat-main">
321
- <ax-conversation-info-bar></ax-conversation-info-bar>
322
- <ax-conversation-message-list></ax-conversation-message-list>
323
- <ax-conversation-composer></ax-conversation-composer>
324
- </div>
325
- </div>
326
- ```
327
-
328
- ## ๐ŸŽญ Services
329
-
330
- ### AXConversationService
331
-
332
- Main service for conversation operations:
333
-
334
- ```typescript
335
- import { inject } from '@angular/core';
336
- import { AXConversationService } from '@acorex/components/conversation2';
337
-
338
- export class MyComponent {
339
- private conversationService = inject(AXConversationService);
340
-
341
- async sendMessage() {
342
- await this.conversationService.sendMessage({
343
- conversationId: 'conv-123',
344
- type: 'text',
345
- payload: { text: 'Hello!' }
346
- });
347
- }
348
-
349
- async createConversation() {
350
- const conv = await this.conversationService.createConversation(
351
- ['user-1', 'user-2'],
352
- 'private'
353
- );
354
- }
355
- }
356
- ```
357
-
358
- ## ๐Ÿงช Testing
359
-
360
- ```typescript
361
- import { TestBed } from '@angular/core/testing';
362
- import { provideConversation, AXConversationService } from '@acorex/components/conversation2';
363
- import { MockUserApi, MockConversationApi, MockMessageApi } from './mocks/mock-apis';
364
-
365
- describe('MyComponent', () => {
366
- beforeEach(() => {
367
- TestBed.configureTestingModule({
368
- providers: [
369
- provideConversation({
370
- userApi: MockUserApi,
371
- conversationApi: MockConversationApi,
372
- messageApi: MockMessageApi,
373
- }),
374
- ],
375
- });
376
- });
377
-
378
- it('should send message', async () => {
379
- const service = TestBed.inject(AXConversationService);
380
- const message = await service.sendMessage({
381
- conversationId: 'test',
382
- type: 'text',
383
- payload: { text: 'Test' },
384
- });
385
- expect(message).toBeDefined();
386
- });
387
- });
388
- ```
389
-
390
- ## ๐ŸŽฏ Message Types
391
-
392
- Supported message types out of the box:
393
-
394
- - **text** - Plain text messages
395
- - **image** - Image messages with thumbnails
396
- - **video** - Video messages with playback
397
- - **audio** - Audio file messages
398
- - **voice** - Voice recordings
399
- - **file** - Generic file attachments
400
- - **location** - Location sharing
401
- - **sticker** - Sticker messages
402
- - **contact** - Contact card sharing
403
- - **system** - System notifications
404
-
405
- ## ๐Ÿ”’ Security Considerations
406
-
407
- - **API Keys**: Never hardcode API keys in source code. Use environment variables or injection tokens.
408
- - **File Upload**: Validate file types and sizes on both client and server.
409
- - **XSS Protection**: All user content is sanitized by default.
410
- - **Authentication**: Implement proper authentication in your API layer.
411
-
412
- ## ๐Ÿ“Š Performance Tips
413
-
414
- 1. **Virtual Scrolling**: Enabled by default for large message lists
415
- 2. **Lazy Loading**: Images and media are loaded on demand
416
- 3. **Pagination**: Messages are loaded in pages to reduce initial load
417
- 4. **Debouncing**: Typing indicators are debounced to reduce network traffic
418
- 5. **Memoization**: Use computed signals for expensive calculations
419
-
420
- ## ๐Ÿ› Troubleshooting
421
-
422
- ### Common Issues
423
-
424
- **Issue**: Messages not appearing
425
-
426
- - Check if API is connected: `conversationService.connectionStatus$()`
427
- - Verify API implementation returns correct data structure
428
-
429
- **Issue**: File upload fails
430
-
431
- - Check composer file-type catalogs and per-action `uploadConstraints` (`allowedMimeTypes`, `minSize`, `maxSize`)
432
- - Register a handler service subscribed to `AXUploaderService.onUpload` (and resolve/delete events) with progress and `AbortSignal` support
433
-
434
- **Issue**: Styling issues
435
-
436
- - Ensure all Acorex component styles are imported
437
- - Check for CSS conflicts with global styles
438
-
439
- ## ๐Ÿ“š Additional Resources
440
-
441
- - [Quick Start Guide](./docs/QUICK-START.md) - Get started in 5 minutes
442
- - [Architecture Overview](./docs/ARCHITECTURE-OVERVIEW.md) - Understand the module structure
443
- - [API Documentation](./docs/ARCHITECTURE-APIS.md) - Implement custom backends
444
- - [Component Guide](./docs/ARCHITECTURE-COMPONENTS.md) - Learn about components
445
- - [Plugin System](./docs/ARCHITECTURE-PLUGINS.md) - Extend functionality
446
- - [Usage Guide](./docs/USAGE-GUIDE.md) - Advanced usage patterns
447
-
448
- ## ๐Ÿค Contributing
449
-
450
- Contributions are welcome! Please read our [Contributing Guide](./CONTRIBUTING.md) for details.
451
-
452
- ## ๐Ÿ“„ License
453
-
454
- MIT License - see LICENSE file for details
455
-
456
- ## ๐Ÿ”„ Changelog
457
-
458
- See [CHANGELOG.md](./CHANGELOG.md) for version history and updates.
459
-
460
- ## ๐Ÿ’ฌ Support
461
-
462
- - GitHub Issues: [Report a bug](https://github.com/acorexui/acorex-ui/issues)
463
- - Discussions: [Ask questions](https://github.com/acorexui/acorex-ui/discussions)