@acorex/components 20.9.0 → 20.9.1

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 (112) hide show
  1. package/badge/index.d.ts +2 -4
  2. package/conversation/index.d.ts +1213 -33
  3. package/fesm2022/acorex-components-badge.mjs +17 -12
  4. package/fesm2022/acorex-components-badge.mjs.map +1 -1
  5. package/fesm2022/{acorex-components-conversation-open-composer-picker-for-files-CbNyy2Ws.mjs → acorex-components-conversation-open-composer-picker-for-files-BLInQalk.mjs} +2 -3
  6. package/fesm2022/{acorex-components-conversation-open-composer-picker-for-files-CbNyy2Ws.mjs.map → acorex-components-conversation-open-composer-picker-for-files-BLInQalk.mjs.map} +1 -1
  7. package/fesm2022/acorex-components-conversation.mjs +22436 -1
  8. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  9. package/fesm2022/acorex-components-file-viewer.mjs +736 -0
  10. package/fesm2022/acorex-components-file-viewer.mjs.map +1 -0
  11. package/file-viewer/index.d.ts +178 -0
  12. package/package.json +20 -15
  13. package/fesm2022/acorex-components-conversation-acorex-components-conversation-CjVDCoJw.mjs +0 -13711
  14. package/fesm2022/acorex-components-conversation-acorex-components-conversation-CjVDCoJw.mjs.map +0 -1
  15. package/fesm2022/acorex-components-conversation-audio-attachment.component-Ri-Jx210.mjs +0 -119
  16. package/fesm2022/acorex-components-conversation-audio-attachment.component-Ri-Jx210.mjs.map +0 -1
  17. package/fesm2022/acorex-components-conversation-audio-composer.payload-DiMDlVl9.mjs +0 -59
  18. package/fesm2022/acorex-components-conversation-audio-composer.payload-DiMDlVl9.mjs.map +0 -1
  19. package/fesm2022/acorex-components-conversation-audio-picker.component-CqrKBDIF.mjs +0 -432
  20. package/fesm2022/acorex-components-conversation-audio-picker.component-CqrKBDIF.mjs.map +0 -1
  21. package/fesm2022/acorex-components-conversation-audio-renderer.component-CO8owVrA.mjs +0 -177
  22. package/fesm2022/acorex-components-conversation-audio-renderer.component-CO8owVrA.mjs.map +0 -1
  23. package/fesm2022/acorex-components-conversation-audio.payload-CLnYjmYY.mjs +0 -54
  24. package/fesm2022/acorex-components-conversation-audio.payload-CLnYjmYY.mjs.map +0 -1
  25. package/fesm2022/acorex-components-conversation-conversation-audio.file-type-D-hIBwQ2.mjs +0 -100
  26. package/fesm2022/acorex-components-conversation-conversation-audio.file-type-D-hIBwQ2.mjs.map +0 -1
  27. package/fesm2022/acorex-components-conversation-conversation-file.file-type-DQUy3C64.mjs +0 -121
  28. package/fesm2022/acorex-components-conversation-conversation-file.file-type-DQUy3C64.mjs.map +0 -1
  29. package/fesm2022/acorex-components-conversation-conversation-image.file-type-Bd_SkwR0.mjs +0 -84
  30. package/fesm2022/acorex-components-conversation-conversation-image.file-type-Bd_SkwR0.mjs.map +0 -1
  31. package/fesm2022/acorex-components-conversation-conversation-info-media-view.component-BalIIAFB.mjs +0 -238
  32. package/fesm2022/acorex-components-conversation-conversation-info-media-view.component-BalIIAFB.mjs.map +0 -1
  33. package/fesm2022/acorex-components-conversation-conversation-info-panel.component-BJMo9bDd.mjs +0 -1080
  34. package/fesm2022/acorex-components-conversation-conversation-info-panel.component-BJMo9bDd.mjs.map +0 -1
  35. package/fesm2022/acorex-components-conversation-conversation-video.file-type-DyK0bLE5.mjs +0 -102
  36. package/fesm2022/acorex-components-conversation-conversation-video.file-type-DyK0bLE5.mjs.map +0 -1
  37. package/fesm2022/acorex-components-conversation-conversation-voice.file-type-v3rFWDv6.mjs +0 -90
  38. package/fesm2022/acorex-components-conversation-conversation-voice.file-type-v3rFWDv6.mjs.map +0 -1
  39. package/fesm2022/acorex-components-conversation-fallback-renderer.component-DOQkZWwP.mjs +0 -44
  40. package/fesm2022/acorex-components-conversation-fallback-renderer.component-DOQkZWwP.mjs.map +0 -1
  41. package/fesm2022/acorex-components-conversation-file-composer.payload-azPSH99m.mjs +0 -64
  42. package/fesm2022/acorex-components-conversation-file-composer.payload-azPSH99m.mjs.map +0 -1
  43. package/fesm2022/acorex-components-conversation-file-picker.component-cmUkgSF3.mjs +0 -468
  44. package/fesm2022/acorex-components-conversation-file-picker.component-cmUkgSF3.mjs.map +0 -1
  45. package/fesm2022/acorex-components-conversation-file-renderer.component-CpUgRTR4.mjs +0 -125
  46. package/fesm2022/acorex-components-conversation-file-renderer.component-CpUgRTR4.mjs.map +0 -1
  47. package/fesm2022/acorex-components-conversation-file.payload-DXwzNWxT.mjs +0 -50
  48. package/fesm2022/acorex-components-conversation-file.payload-DXwzNWxT.mjs.map +0 -1
  49. package/fesm2022/acorex-components-conversation-format-media-DUD4vA6F.mjs +0 -21
  50. package/fesm2022/acorex-components-conversation-format-media-DUD4vA6F.mjs.map +0 -1
  51. package/fesm2022/acorex-components-conversation-image-attachment.component-BZto5LFo.mjs +0 -77
  52. package/fesm2022/acorex-components-conversation-image-attachment.component-BZto5LFo.mjs.map +0 -1
  53. package/fesm2022/acorex-components-conversation-image-picker.component-G9EEOyDg.mjs +0 -407
  54. package/fesm2022/acorex-components-conversation-image-picker.component-G9EEOyDg.mjs.map +0 -1
  55. package/fesm2022/acorex-components-conversation-image-renderer.component-Bwa6rG6C.mjs +0 -83
  56. package/fesm2022/acorex-components-conversation-image-renderer.component-Bwa6rG6C.mjs.map +0 -1
  57. package/fesm2022/acorex-components-conversation-index-BbrYsQ84.mjs +0 -180
  58. package/fesm2022/acorex-components-conversation-index-BbrYsQ84.mjs.map +0 -1
  59. package/fesm2022/acorex-components-conversation-index-DtGEWeKN.mjs +0 -266
  60. package/fesm2022/acorex-components-conversation-index-DtGEWeKN.mjs.map +0 -1
  61. package/fesm2022/acorex-components-conversation-location-picker.component-Cx993j_c.mjs +0 -149
  62. package/fesm2022/acorex-components-conversation-location-picker.component-Cx993j_c.mjs.map +0 -1
  63. package/fesm2022/acorex-components-conversation-location-renderer.component-BiynmAJw.mjs +0 -118
  64. package/fesm2022/acorex-components-conversation-location-renderer.component-BiynmAJw.mjs.map +0 -1
  65. package/fesm2022/acorex-components-conversation-media-formatters-DV3wEEno.mjs +0 -17
  66. package/fesm2022/acorex-components-conversation-media-formatters-DV3wEEno.mjs.map +0 -1
  67. package/fesm2022/acorex-components-conversation-media-playback-info-bar-banner.component-a7OSpfB1.mjs +0 -140
  68. package/fesm2022/acorex-components-conversation-media-playback-info-bar-banner.component-a7OSpfB1.mjs.map +0 -1
  69. package/fesm2022/acorex-components-conversation-message-renderer-copy-host.component-D_eAnM6v.mjs +0 -33
  70. package/fesm2022/acorex-components-conversation-message-renderer-copy-host.component-D_eAnM6v.mjs.map +0 -1
  71. package/fesm2022/acorex-components-conversation-message-renderer-state.component-DSnNoz1N.mjs +0 -172
  72. package/fesm2022/acorex-components-conversation-message-renderer-state.component-DSnNoz1N.mjs.map +0 -1
  73. package/fesm2022/acorex-components-conversation-pagination-demo-data-DRr9PXjJ.mjs +0 -81
  74. package/fesm2022/acorex-components-conversation-pagination-demo-data-DRr9PXjJ.mjs.map +0 -1
  75. package/fesm2022/acorex-components-conversation-picker-header.component-BhTzlufI.mjs +0 -91
  76. package/fesm2022/acorex-components-conversation-picker-header.component-BhTzlufI.mjs.map +0 -1
  77. package/fesm2022/acorex-components-conversation-picker-toolbar.component-CpyS0j6P.mjs +0 -537
  78. package/fesm2022/acorex-components-conversation-picker-toolbar.component-CpyS0j6P.mjs.map +0 -1
  79. package/fesm2022/acorex-components-conversation-picker-upload-C-PlKPaU.mjs +0 -163
  80. package/fesm2022/acorex-components-conversation-picker-upload-C-PlKPaU.mjs.map +0 -1
  81. package/fesm2022/acorex-components-conversation-playback-banner-sync-BMsx6Fuy.mjs +0 -68
  82. package/fesm2022/acorex-components-conversation-playback-banner-sync-BMsx6Fuy.mjs.map +0 -1
  83. package/fesm2022/acorex-components-conversation-renderer-shared.styles-Digah3Zn.mjs +0 -95
  84. package/fesm2022/acorex-components-conversation-renderer-shared.styles-Digah3Zn.mjs.map +0 -1
  85. package/fesm2022/acorex-components-conversation-search.component-96NI2ERG.mjs +0 -187
  86. package/fesm2022/acorex-components-conversation-search.component-96NI2ERG.mjs.map +0 -1
  87. package/fesm2022/acorex-components-conversation-send-message-media--Rbrne7k.mjs +0 -170
  88. package/fesm2022/acorex-components-conversation-send-message-media--Rbrne7k.mjs.map +0 -1
  89. package/fesm2022/acorex-components-conversation-shared-storage.seed-zFjNXfKF.mjs +0 -750
  90. package/fesm2022/acorex-components-conversation-shared-storage.seed-zFjNXfKF.mjs.map +0 -1
  91. package/fesm2022/acorex-components-conversation-sticker-renderer.component-BZgx_Ylk.mjs +0 -103
  92. package/fesm2022/acorex-components-conversation-sticker-renderer.component-BZgx_Ylk.mjs.map +0 -1
  93. package/fesm2022/acorex-components-conversation-system-renderer.component-D1Aj-LuF.mjs +0 -55
  94. package/fesm2022/acorex-components-conversation-system-renderer.component-D1Aj-LuF.mjs.map +0 -1
  95. package/fesm2022/acorex-components-conversation-text-renderer.component-Cxvwjr2p.mjs +0 -109
  96. package/fesm2022/acorex-components-conversation-text-renderer.component-Cxvwjr2p.mjs.map +0 -1
  97. package/fesm2022/acorex-components-conversation-video-attachment.component-DBY_4Ri2.mjs +0 -105
  98. package/fesm2022/acorex-components-conversation-video-attachment.component-DBY_4Ri2.mjs.map +0 -1
  99. package/fesm2022/acorex-components-conversation-video-composer.payload-CWGxsPg5.mjs +0 -62
  100. package/fesm2022/acorex-components-conversation-video-composer.payload-CWGxsPg5.mjs.map +0 -1
  101. package/fesm2022/acorex-components-conversation-video-picker.component-D1JYwEm_.mjs +0 -446
  102. package/fesm2022/acorex-components-conversation-video-picker.component-D1JYwEm_.mjs.map +0 -1
  103. package/fesm2022/acorex-components-conversation-video-renderer.component-iwf2bU29.mjs +0 -181
  104. package/fesm2022/acorex-components-conversation-video-renderer.component-iwf2bU29.mjs.map +0 -1
  105. package/fesm2022/acorex-components-conversation-video.payload-DfBEjqQ4.mjs +0 -54
  106. package/fesm2022/acorex-components-conversation-video.payload-DfBEjqQ4.mjs.map +0 -1
  107. package/fesm2022/acorex-components-conversation-voice-composer.payload-DLVow7ex.mjs +0 -17
  108. package/fesm2022/acorex-components-conversation-voice-composer.payload-DLVow7ex.mjs.map +0 -1
  109. package/fesm2022/acorex-components-conversation-voice-recorder.component-P8J_5OH0.mjs +0 -328
  110. package/fesm2022/acorex-components-conversation-voice-recorder.component-P8J_5OH0.mjs.map +0 -1
  111. package/fesm2022/acorex-components-conversation-voice-renderer.component-CZpEqbXL.mjs +0 -270
  112. package/fesm2022/acorex-components-conversation-voice-renderer.component-CZpEqbXL.mjs.map +0 -1
@@ -1,1080 +0,0 @@
1
- import { AXClosableComponent, AXComponentCloseEvent } from '@acorex/cdk/common';
2
- import { AXButtonComponent } from '@acorex/components/button';
3
- import { AXDecoratorModule } from '@acorex/components/decorators';
4
- import { AXLabelComponent } from '@acorex/components/label';
5
- import { AXSearchBoxComponent } from '@acorex/components/search-box';
6
- import * as i2 from '@acorex/components/switch';
7
- import { AXSwitchModule } from '@acorex/components/switch';
8
- import { AXTextBoxComponent } from '@acorex/components/text-box';
9
- import { AXToastService } from '@acorex/components/toast';
10
- import * as i3 from '@acorex/core/translation';
11
- import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
12
- import * as i2$1 from '@angular/common';
13
- import { CommonModule } from '@angular/common';
14
- import * as i0 from '@angular/core';
15
- import { inject, output, signal, computed, ChangeDetectionStrategy, Component } from '@angular/core';
16
- import * as i1 from '@angular/forms';
17
- import { FormsModule } from '@angular/forms';
18
- import { n as normalizeImagePayload, a as resolvePrivatePeerUserId, b as resolveParticipantProfile, c as resolvePersistedThumbnailUrl, d as resolveImageDisplayUrl, A as AXConversationService, e as AXConversationMessageUtilsService, f as AXConversationAvatarPickerComponent, g as AXConversationAvatarComponent, h as AXConversationRegistryComponentOutletComponent } from './acorex-components-conversation-acorex-components-conversation-CjVDCoJw.mjs';
19
- import { normalizeAudioPayload } from './acorex-components-conversation-audio.payload-CLnYjmYY.mjs';
20
- import { normalizeFilePayload } from './acorex-components-conversation-file.payload-DXwzNWxT.mjs';
21
- import { normalizeVideoPayload } from './acorex-components-conversation-video.payload-DfBEjqQ4.mjs';
22
-
23
- const AX_CONVERSATION_URL_PATTERN = /https?:\/\/[^\s<>"']+/i;
24
- function messageContainsLink(message) {
25
- return countLinksInMessage(message) > 0;
26
- }
27
- function countLinksInMessage(message) {
28
- if (message.type !== 'text') {
29
- return 0;
30
- }
31
- const payload = message.payload;
32
- if (payload.links?.length) {
33
- return payload.links.length;
34
- }
35
- const text = payload.text ?? '';
36
- const matches = text.match(new RegExp(AX_CONVERSATION_URL_PATTERN.source, 'gi'));
37
- return matches?.length ?? 0;
38
- }
39
- function countMediaItemsInMessage(message) {
40
- const linkCount = countLinksInMessage(message);
41
- if (linkCount > 0) {
42
- return { link: linkCount };
43
- }
44
- switch (message.type) {
45
- case 'image': {
46
- const count = normalizeImagePayload(message.payload).images.length;
47
- return count > 0 ? { image: count } : {};
48
- }
49
- case 'video': {
50
- const count = normalizeVideoPayload(message.payload).videos.length;
51
- return count > 0 ? { video: count } : {};
52
- }
53
- case 'audio': {
54
- const count = normalizeAudioPayload(message.payload).audios.length;
55
- return count > 0 ? { audio: count } : {};
56
- }
57
- case 'file': {
58
- const count = normalizeFilePayload(message.payload).files.length;
59
- return count > 0 ? { file: count } : {};
60
- }
61
- case 'voice':
62
- return { voice: 1 };
63
- case 'sticker':
64
- return { sticker: 1 };
65
- case 'location':
66
- return { location: 1 };
67
- default:
68
- return {};
69
- }
70
- }
71
- function getPrivatePeerParticipant(conversation, currentUserId) {
72
- const peerId = resolvePrivatePeerUserId(conversation, currentUserId);
73
- if (!peerId)
74
- return undefined;
75
- return conversation.participants.find((p) => p.id === peerId);
76
- }
77
- function getConversationProfileFields(conversation, currentUserId) {
78
- const fields = [];
79
- if (conversation.type === 'private') {
80
- const peer = getPrivatePeerParticipant(conversation, currentUserId);
81
- const profile = resolveParticipantProfile(peer);
82
- const addField = (id, labelKey, icon, value) => {
83
- if (value?.trim()) {
84
- fields.push({ id, labelKey, icon, value: value.trim() });
85
- }
86
- };
87
- addField('bio', '@acorex:chat.info-panel.profile.bio', 'fa-light fa-align-left', profile.bio);
88
- addField('phone', '@acorex:chat.info-panel.profile.phone', 'fa-light fa-phone', profile.phone);
89
- addField('email', '@acorex:chat.info-panel.profile.email', 'fa-light fa-envelope', profile.email);
90
- addField('username', '@acorex:chat.info-panel.profile.username', 'fa-light fa-at', profile.username);
91
- addField('location', '@acorex:chat.info-panel.profile.location', 'fa-light fa-location-dot', profile.location);
92
- addField('company', '@acorex:chat.info-panel.profile.company', 'fa-light fa-building', profile.company);
93
- addField('title', '@acorex:chat.info-panel.profile.title', 'fa-light fa-briefcase', profile.title);
94
- if (peer?.description?.trim()) {
95
- fields.unshift({
96
- id: 'description',
97
- labelKey: '@acorex:chat.info-panel.profile.about',
98
- icon: 'fa-light fa-user',
99
- value: peer.description.trim(),
100
- });
101
- }
102
- }
103
- else if (conversation.description?.trim()) {
104
- fields.push({
105
- id: 'description',
106
- labelKey: '@acorex:chat.info-panel.profile.about',
107
- icon: 'fa-light fa-align-left',
108
- value: conversation.description.trim(),
109
- });
110
- }
111
- const groupInfo = conversation.metadata?.['profile']?.groupInfo;
112
- if (groupInfo?.purpose?.trim()) {
113
- fields.push({
114
- id: 'purpose',
115
- labelKey: '@acorex:chat.info-panel.profile.purpose',
116
- icon: 'fa-light fa-bullseye',
117
- value: groupInfo.purpose.trim(),
118
- });
119
- }
120
- return fields;
121
- }
122
- function getConversationMediaCategories(messages) {
123
- const counts = {
124
- image: 0,
125
- video: 0,
126
- file: 0,
127
- audio: 0,
128
- voice: 0,
129
- sticker: 0,
130
- location: 0,
131
- link: 0,
132
- };
133
- for (const message of messages) {
134
- const itemCounts = countMediaItemsInMessage(message);
135
- for (const [categoryId, count] of Object.entries(itemCounts)) {
136
- counts[categoryId] += count;
137
- }
138
- }
139
- const definitions = [
140
- {
141
- id: 'image',
142
- labelKey: '@acorex:chat.info-panel.media.photos',
143
- countLabelKey: '@acorex:chat.info-panel.media.count-photos',
144
- icon: 'fa-light fa-image',
145
- },
146
- {
147
- id: 'video',
148
- labelKey: '@acorex:chat.info-panel.media.videos',
149
- countLabelKey: '@acorex:chat.info-panel.media.count-videos',
150
- icon: 'fa-light fa-video',
151
- },
152
- {
153
- id: 'file',
154
- labelKey: '@acorex:chat.info-panel.media.files',
155
- countLabelKey: '@acorex:chat.info-panel.media.count-files',
156
- icon: 'fa-light fa-file',
157
- },
158
- {
159
- id: 'audio',
160
- labelKey: '@acorex:chat.info-panel.media.audio',
161
- countLabelKey: '@acorex:chat.info-panel.media.count-audio',
162
- icon: 'fa-light fa-headphones',
163
- },
164
- {
165
- id: 'link',
166
- labelKey: '@acorex:chat.info-panel.media.links',
167
- countLabelKey: '@acorex:chat.info-panel.media.count-links',
168
- icon: 'fa-light fa-link',
169
- },
170
- {
171
- id: 'voice',
172
- labelKey: '@acorex:chat.info-panel.media.voice',
173
- countLabelKey: '@acorex:chat.info-panel.media.count-voice',
174
- icon: 'fa-light fa-microphone',
175
- },
176
- {
177
- id: 'sticker',
178
- labelKey: '@acorex:chat.info-panel.media.stickers',
179
- countLabelKey: '@acorex:chat.info-panel.media.count-stickers',
180
- icon: 'fa-light fa-note-sticky',
181
- },
182
- {
183
- id: 'location',
184
- labelKey: '@acorex:chat.info-panel.media.locations',
185
- countLabelKey: '@acorex:chat.info-panel.media.count-locations',
186
- icon: 'fa-light fa-location-dot',
187
- },
188
- ];
189
- return definitions
190
- .map((definition) => ({ ...definition, count: counts[definition.id] }))
191
- .filter((category) => category.count > 0);
192
- }
193
- function filterMessagesByMediaCategory(messages, categoryId) {
194
- return messages.filter((message) => {
195
- if (categoryId === 'link') {
196
- return messageContainsLink(message);
197
- }
198
- return message.type === categoryId;
199
- });
200
- }
201
- function isGridMediaCategory(categoryId) {
202
- return categoryId === 'image' || categoryId === 'sticker';
203
- }
204
- function isAttachmentListCategory(categoryId) {
205
- return categoryId === 'video' || categoryId === 'audio';
206
- }
207
- function buildMediaGalleryTiles(messages, categoryId) {
208
- const filtered = filterMessagesByMediaCategory(messages, categoryId);
209
- const tiles = [];
210
- for (const message of filtered) {
211
- if (categoryId === 'image') {
212
- const payload = normalizeImagePayload(message.payload);
213
- for (const image of payload.images) {
214
- tiles.push({
215
- key: `${message.id}:${image.mediaId ?? image.url ?? tiles.length}`,
216
- message,
217
- kind: 'image',
218
- image,
219
- });
220
- }
221
- continue;
222
- }
223
- if (categoryId === 'video') {
224
- const payload = normalizeVideoPayload(message.payload);
225
- for (const video of payload.videos) {
226
- tiles.push({
227
- key: `${message.id}:${video.mediaId ?? video.url ?? tiles.length}`,
228
- message,
229
- kind: 'video',
230
- video,
231
- });
232
- }
233
- continue;
234
- }
235
- if (categoryId === 'sticker') {
236
- const payload = message.payload;
237
- tiles.push({
238
- key: message.id,
239
- message,
240
- kind: 'sticker',
241
- stickerUrl: payload.url,
242
- stickerAlt: payload.emoji || 'Sticker',
243
- });
244
- }
245
- }
246
- return tiles;
247
- }
248
- function resolveVideoThumbnailUrl(video) {
249
- return resolvePersistedThumbnailUrl(video.thumbnailUrl, video.url) ?? video.url;
250
- }
251
- function resolveGalleryImageUrl(image) {
252
- return resolveImageDisplayUrl(image);
253
- }
254
- function getMessageVideoItems(message) {
255
- if (message.type !== 'video') {
256
- return [];
257
- }
258
- return normalizeVideoPayload(message.payload).videos;
259
- }
260
- function getMessageAudioItems(message) {
261
- if (message.type !== 'audio') {
262
- return [];
263
- }
264
- return normalizeAudioPayload(message.payload).audios;
265
- }
266
- async function fetchAllConversationMessages(messageApi, conversationId, pageSize) {
267
- const collected = [];
268
- let page = 0;
269
- let hasMore = true;
270
- let cursor;
271
- while (hasMore) {
272
- const result = await messageApi.getMessages(conversationId, {
273
- page,
274
- pageSize,
275
- cursor,
276
- });
277
- collected.push(...result.items);
278
- hasMore = result.hasMore;
279
- cursor = result.nextCursor;
280
- page += 1;
281
- if (!result.items.length) {
282
- break;
283
- }
284
- }
285
- return collected.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
286
- }
287
-
288
- /**
289
- * Conversation Info Panel — Telegram-inspired profile / group details sheet.
290
- */
291
- class AXConversationInfoPanelComponent extends AXClosableComponent {
292
- constructor() {
293
- super(...arguments);
294
- this.toastService = inject(AXToastService);
295
- this.translation = inject(AXTranslationService);
296
- this.injectedConversationService = inject(AXConversationService, { optional: true });
297
- this.onClosed = output();
298
- this.activeTab = signal('profile', ...(ngDevMode ? [{ debugName: "activeTab" }] : []));
299
- this.showMemberSearch = signal(false, ...(ngDevMode ? [{ debugName: "showMemberSearch" }] : []));
300
- this.panelView = signal('main', ...(ngDevMode ? [{ debugName: "panelView" }] : []));
301
- this.selectedMediaCategory = signal(null, ...(ngDevMode ? [{ debugName: "selectedMediaCategory" }] : []));
302
- this.mediaViewLoader = () => import('./acorex-components-conversation-conversation-info-media-view.component-BalIIAFB.mjs').then((m) => m.AXConversationInfoMediaViewComponent);
303
- this.conversationMessages = signal([], ...(ngDevMode ? [{ debugName: "conversationMessages" }] : []));
304
- this.loadingMessages = signal(false, ...(ngDevMode ? [{ debugName: "loadingMessages" }] : []));
305
- this.memberSearchQuery = signal('', ...(ngDevMode ? [{ debugName: "memberSearchQuery" }] : []));
306
- this.archived = false;
307
- this.initialNotifications = false;
308
- this.initialArchived = false;
309
- this.editTitle = '';
310
- this.editAvatar = '';
311
- this.groupDetailsSaveInFlight = false;
312
- this.backgroundPresets = [
313
- {
314
- id: 'solid-default',
315
- label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.default'),
316
- value: 'rgb(var(--ax-sys-color-primary-lightest-surface))',
317
- },
318
- {
319
- id: 'solid-graphite',
320
- label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.graphite'),
321
- value: 'rgb(var(--ax-sys-color-lighter-surface))',
322
- },
323
- {
324
- id: 'solid-olive',
325
- label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.olive'),
326
- value: 'rgba(132, 144, 88, 0.24)',
327
- },
328
- {
329
- id: 'solid-sky',
330
- label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.sky'),
331
- value: 'rgba(56, 189, 248, 0.2)',
332
- },
333
- {
334
- id: 'grad-aurora',
335
- label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.aurora'),
336
- value: 'linear-gradient(140deg, #60a5fa 0%, #a78bfa 55%, #f472b6 100%)',
337
- },
338
- {
339
- id: 'grad-sunset',
340
- label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.sunset'),
341
- value: 'linear-gradient(140deg, rgba(251, 113, 133, 0.34) 0%, rgba(251, 191, 36, 0.32) 100%)',
342
- },
343
- ];
344
- this.heroSubtitle = computed(() => {
345
- const conversation = this.liveConversation();
346
- if (!conversation)
347
- return '';
348
- return AXConversationMessageUtilsService.getConversationSubtitle(conversation);
349
- }, ...(ngDevMode ? [{ debugName: "heroSubtitle" }] : []));
350
- this.liveConversation = computed(() => {
351
- const conversation = this.conversation;
352
- if (!conversation?.id)
353
- return conversation;
354
- const fromStore = this.conversationService?.conversations().find((c) => c.id === conversation.id);
355
- return fromStore ?? conversation;
356
- }, ...(ngDevMode ? [{ debugName: "liveConversation" }] : []));
357
- this.isConversationMuted = computed(() => this.liveConversation()?.settings?.notifications === false, ...(ngDevMode ? [{ debugName: "isConversationMuted" }] : []));
358
- this.profileFields = computed(() => {
359
- const conversation = this.liveConversation();
360
- if (!conversation)
361
- return [];
362
- return getConversationProfileFields(conversation, this.conversationService?.currentUser()?.id);
363
- }, ...(ngDevMode ? [{ debugName: "profileFields" }] : []));
364
- this.mediaCategories = computed(() => {
365
- if (!this.conversation)
366
- return [];
367
- return getConversationMediaCategories(this.conversationMessages());
368
- }, ...(ngDevMode ? [{ debugName: "mediaCategories" }] : []));
369
- this.quickActions = computed(() => {
370
- if (!this.conversation)
371
- return [];
372
- const muted = this.isConversationMuted();
373
- const actions = [
374
- {
375
- id: 'mute',
376
- labelKey: muted ? '@acorex:chat.actions.unmute' : '@acorex:chat.actions.mute',
377
- icon: muted ? 'fa-light fa-bell-slash' : 'fa-light fa-bell',
378
- },
379
- ];
380
- if (!this.isPrivateConversation()) {
381
- actions.push({
382
- id: 'leave',
383
- labelKey: '@acorex:chat.actions.leave-and-delete',
384
- icon: 'fa-light fa-door-open',
385
- danger: true,
386
- });
387
- }
388
- return actions;
389
- }, ...(ngDevMode ? [{ debugName: "quickActions" }] : []));
390
- this.filteredMembers = computed(() => {
391
- if (!this.conversation)
392
- return [];
393
- const query = this.memberSearchQuery().toLowerCase().trim();
394
- const members = this.conversation?.participants ?? [];
395
- if (!query)
396
- return members;
397
- return members.filter((p) => p.name.toLowerCase().includes(query) ||
398
- (p.description ?? '').toLowerCase().includes(query) ||
399
- (p.role ?? '').toLowerCase().includes(query));
400
- }, ...(ngDevMode ? [{ debugName: "filteredMembers" }] : []));
401
- }
402
- ngOnInit() {
403
- const resolvedService = this.conversationService ?? this.injectedConversationService;
404
- if (!resolvedService) {
405
- console.warn('AXConversationInfoPanelComponent opened without conversationService.');
406
- this.close();
407
- return;
408
- }
409
- this.conversationService = resolvedService;
410
- if (!this.conversation) {
411
- const activeConversation = this.conversationService.activeConversation();
412
- if (activeConversation) {
413
- this.conversation = activeConversation;
414
- }
415
- else {
416
- console.warn('AXConversationInfoPanelComponent opened without conversation context.');
417
- this.close();
418
- return;
419
- }
420
- }
421
- this.initialNotifications = this.conversation.settings?.notifications ?? true;
422
- this.archived = this.conversation.archived ?? false;
423
- this.initialArchived = this.archived;
424
- this.editTitle = this.conversation.title || '';
425
- this.editAvatar = this.conversation.avatar || '';
426
- void this.loadConversationMessages();
427
- }
428
- async loadConversationMessages() {
429
- this.loadingMessages.set(true);
430
- try {
431
- if (this.conversationService.activeConversationId() === this.conversation.id) {
432
- const activeMessages = this.conversationService.activeMessages();
433
- if (activeMessages.length > 0) {
434
- this.conversationMessages.set(activeMessages);
435
- }
436
- }
437
- const messages = await fetchAllConversationMessages(this.conversationService.messageApi, this.conversation.id, 30);
438
- this.conversationMessages.set(messages);
439
- }
440
- catch (error) {
441
- console.error('Failed to load conversation media messages:', error);
442
- }
443
- finally {
444
- this.loadingMessages.set(false);
445
- }
446
- }
447
- isPrivateConversation() {
448
- return this.conversation.type === 'private';
449
- }
450
- isGroupConversation() {
451
- return this.conversation.type === 'group' || this.conversation.type === 'channel';
452
- }
453
- membersSectionTitle() {
454
- return this.translation.translateSync('@acorex:chat.info-panel.tabs.members-count-upper', {
455
- params: { count: this.conversation.participants.length },
456
- });
457
- }
458
- getMemberRoleLabel(participant) {
459
- switch (participant.role) {
460
- case 'admin':
461
- return '@acorex:chat.info-panel.member-role.admin';
462
- case 'moderator':
463
- return '@acorex:chat.info-panel.member-role.moderator';
464
- default:
465
- return null;
466
- }
467
- }
468
- onMemberSearchChange(value) {
469
- this.memberSearchQuery.set(value ?? '');
470
- }
471
- setActiveTab(tab) {
472
- this.activeTab.set(tab);
473
- }
474
- toggleMemberSearch() {
475
- this.showMemberSearch.update((value) => !value);
476
- if (!this.showMemberSearch()) {
477
- this.memberSearchQuery.set('');
478
- }
479
- }
480
- openMediaCategory(category) {
481
- this.selectedMediaCategory.set(category);
482
- this.panelView.set('media');
483
- }
484
- closeMediaView() {
485
- this.panelView.set('main');
486
- this.selectedMediaCategory.set(null);
487
- }
488
- getMediaViewInputs(category) {
489
- return {
490
- category,
491
- messages: this.conversationMessages(),
492
- conversation: this.conversation,
493
- conversationService: this.conversationService,
494
- onBack: () => this.closeMediaView(),
495
- };
496
- }
497
- getMediaRowLabel(category) {
498
- return this.translation.translateSync(category.countLabelKey, {
499
- params: { count: category.count },
500
- });
501
- }
502
- getMemberSubtitle(participant) {
503
- if (participant.status === 'online') {
504
- return this.translation.translateSync('@acorex:chat.status.online');
505
- }
506
- if (participant.description?.trim())
507
- return participant.description.trim();
508
- if (participant.role && participant.role !== 'member')
509
- return participant.role;
510
- return '';
511
- }
512
- onQuickAction(actionId) {
513
- switch (actionId) {
514
- case 'mute':
515
- void this.toggleConversationMute();
516
- break;
517
- case 'leave':
518
- void this.onLeave();
519
- break;
520
- }
521
- }
522
- async toggleConversationMute() {
523
- const notificationsEnabled = this.liveConversation()?.settings?.notifications ?? true;
524
- await this.onNotificationsChange(!notificationsEnabled);
525
- }
526
- async onNotificationsChange(value) {
527
- try {
528
- await this.conversationService.updateConversationSettings(this.conversation.id, {
529
- notifications: value,
530
- });
531
- const settings = this.conversation.settings ?? { notifications: true, showPreview: true };
532
- this.conversation.settings = { ...settings, notifications: value };
533
- }
534
- catch (error) {
535
- console.error('Failed to update notifications:', error);
536
- }
537
- }
538
- async onArchivedChange(value) {
539
- const previous = this.archived;
540
- this.archived = value;
541
- try {
542
- await this.conversationService.updateConversation(this.conversation.id, { archived: value });
543
- this.conversation.archived = value;
544
- this.initialArchived = value;
545
- }
546
- catch {
547
- this.archived = previous;
548
- }
549
- }
550
- close(data) {
551
- const event = new AXComponentCloseEvent();
552
- event.component = this;
553
- event.data = data;
554
- this.onClosed.emit(event);
555
- }
556
- closeAll() {
557
- this.close();
558
- }
559
- async onLeave() {
560
- const isGroup = this.isGroupConversation();
561
- await this.conversationService.deleteConversation(this.conversation.id);
562
- if (this.conversationService.activeConversation()?.id === this.conversation.id) {
563
- this.conversationService.closeActiveConversation();
564
- }
565
- this.toastService.success(isGroup
566
- ? this.translation.translateSync('@acorex:chat.info-panel.toasts.left-conversation')
567
- : this.translation.translateSync('@acorex:chat.info-panel.toasts.deleted-conversation'));
568
- this.close();
569
- }
570
- onGroupTitleChange(value) {
571
- this.editTitle = value;
572
- clearTimeout(this.groupTitleSaveTimer);
573
- this.groupTitleSaveTimer = setTimeout(() => void this.persistGroupDetails(), 400);
574
- }
575
- onGroupAvatarChange(value) {
576
- this.editAvatar = value;
577
- void this.persistGroupDetails();
578
- }
579
- async persistGroupDetails() {
580
- if (this.isPrivateConversation() || this.groupDetailsSaveInFlight) {
581
- return;
582
- }
583
- const title = this.editTitle.trim();
584
- if (!title) {
585
- return;
586
- }
587
- const nextAvatar = this.editAvatar.trim() || undefined;
588
- const currentTitle = this.conversation.title || '';
589
- const currentAvatar = this.conversation.avatar || undefined;
590
- if (title === currentTitle && nextAvatar === currentAvatar) {
591
- return;
592
- }
593
- this.groupDetailsSaveInFlight = true;
594
- try {
595
- await this.conversationService.updateConversation(this.conversation.id, {
596
- title,
597
- avatar: nextAvatar,
598
- });
599
- this.conversation.title = title;
600
- this.conversation.avatar = nextAvatar;
601
- }
602
- catch (error) {
603
- console.error('Failed to update group details:', error);
604
- this.toastService.danger(this.translation.translateSync('@acorex:chat.info-panel.toasts.failed-group-update'));
605
- }
606
- finally {
607
- this.groupDetailsSaveInFlight = false;
608
- }
609
- }
610
- isBackgroundSelected(value) {
611
- const bg = this.conversation?.metadata?.['messageListBackground'];
612
- return (typeof bg === 'string' ? bg : '') === value;
613
- }
614
- async applyMessageListBackground(value) {
615
- try {
616
- const metadata = {
617
- ...(this.conversation.metadata ?? {}),
618
- messageListBackground: value,
619
- };
620
- await this.conversationService.updateConversationMetadata(this.conversation.id, metadata);
621
- this.conversation.metadata = metadata;
622
- this.toastService.success(value
623
- ? this.translation.translateSync('@acorex:chat.info-panel.toasts.background-updated')
624
- : this.translation.translateSync('@acorex:chat.info-panel.toasts.background-reset'));
625
- }
626
- catch (error) {
627
- console.error('Failed to update message list background:', error);
628
- this.toastService.danger(this.translation.translateSync('@acorex:chat.info-panel.toasts.failed-background-update'));
629
- }
630
- }
631
- getBackgroundAriaLabel(label) {
632
- return this.translation.translateSync('@acorex:chat.info-panel.background.set-label', {
633
- params: { label },
634
- });
635
- }
636
- ngOnDestroy() {
637
- if (this.groupTitleSaveTimer) {
638
- clearTimeout(this.groupTitleSaveTimer);
639
- this.groupTitleSaveTimer = undefined;
640
- void this.persistGroupDetails();
641
- }
642
- const currentNotifications = this.liveConversation()?.settings?.notifications ?? true;
643
- const hasChanges = currentNotifications !== this.initialNotifications ||
644
- this.archived !== this.initialArchived;
645
- if (hasChanges) {
646
- this.toastService.success(this.translation.translateSync('@acorex:chat.info-panel.toasts.settings-saved'));
647
- }
648
- }
649
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationInfoPanelComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
650
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXConversationInfoPanelComponent, isStandalone: true, selector: "ax-conversation-info-panel", outputs: { onClosed: "onClosed" }, providers: [
651
- { provide: AXClosableComponent, useExisting: AXConversationInfoPanelComponent },
652
- ], usesInheritance: true, ngImport: i0, template: `
653
- @if (conversation) {
654
- <div class="tg-info-panel">
655
- @if (panelView() === 'media' && selectedMediaCategory(); as category) {
656
- <ax-conversation-registry-component-outlet
657
- [componentLoader]="mediaViewLoader"
658
- [inputs]="getMediaViewInputs(category)"
659
- />
660
- } @else {
661
- <div class="tg-info-panel__scroll">
662
- <section class="tg-hero">
663
- <ax-conversation-avatar kind="auto" [conversation]="conversation" [size]="96" />
664
- <h2 class="tg-hero__title">{{ conversation.title }}</h2>
665
- <p class="tg-hero__subtitle">{{ heroSubtitle() }}</p>
666
- </section>
667
-
668
- <section class="tg-quick-actions">
669
- @for (action of quickActions(); track action.id) {
670
- <button
671
- type="button"
672
- class="tg-quick-action"
673
- [class.tg-quick-action--danger]="action.danger"
674
- [class.tg-quick-action--active]="action.id === 'mute' && isConversationMuted()"
675
- (click)="onQuickAction(action.id)"
676
- >
677
- <span class="tg-quick-action__icon"><i [class]="action.icon"></i></span>
678
- <span class="tg-quick-action__label">{{ action.labelKey | translate | async }}</span>
679
- </button>
680
- }
681
- </section>
682
-
683
- <nav class="tg-tabs" role="tablist">
684
- <button
685
- type="button"
686
- class="tg-tab"
687
- role="tab"
688
- [class.tg-tab--active]="activeTab() === 'profile'"
689
- [attr.aria-selected]="activeTab() === 'profile'"
690
- (click)="setActiveTab('profile')"
691
- >
692
- {{ '@acorex:chat.info-panel.tabs.profile' | translate | async }}
693
- </button>
694
- <button
695
- type="button"
696
- class="tg-tab"
697
- role="tab"
698
- [class.tg-tab--active]="activeTab() === 'manage'"
699
- [attr.aria-selected]="activeTab() === 'manage'"
700
- (click)="setActiveTab('manage')"
701
- >
702
- {{ '@acorex:chat.info-panel.tabs.manage' | translate | async }}
703
- </button>
704
- </nav>
705
-
706
- @if (activeTab() === 'profile') {
707
- @if (profileFields().length > 0) {
708
- <section class="tg-section tg-details">
709
- @for (field of profileFields(); track field.id) {
710
- <div class="tg-detail-row">
711
- <span class="tg-detail-row__icon"><i [class]="field.icon"></i></span>
712
- <div class="tg-detail-row__content">
713
- <span class="tg-detail-row__value">{{ field.value }}</span>
714
- <span class="tg-detail-row__label">{{ field.labelKey | translate | async }}</span>
715
- </div>
716
- </div>
717
- }
718
- </section>
719
- }
720
-
721
- @if (loadingMessages()) {
722
- <div class="tg-loading">{{ '@acorex:chat.info-panel.media.loading' | translate | async }}</div>
723
- } @else if (mediaCategories().length > 0) {
724
- <section class="tg-section tg-media">
725
- @for (category of mediaCategories(); track category.id) {
726
- <button type="button" class="tg-media-row" (click)="openMediaCategory(category)">
727
- <span class="tg-media-row__icon"><i [class]="category.icon"></i></span>
728
- <span class="tg-media-row__label">{{ getMediaRowLabel(category) }}</span>
729
- <i class="fa-light fa-chevron-right tg-media-row__chevron"></i>
730
- </button>
731
- }
732
- </section>
733
- }
734
-
735
- @if (isGroupConversation()) {
736
- <section class="tg-section tg-members">
737
- <div class="tg-section-header tg-section-header--row">
738
- <span class="tg-section-header__title">{{ membersSectionTitle() }}</span>
739
- <div class="tg-section-header__actions">
740
- <button
741
- type="button"
742
- class="tg-icon-btn"
743
- (click)="toggleMemberSearch()"
744
- [attr.aria-label]="'@acorex:chat.info-panel.placeholders.search-members' | translate | async"
745
- >
746
- <i class="fa-light fa-magnifying-glass"></i>
747
- </button>
748
- </div>
749
- </div>
750
- @if (showMemberSearch()) {
751
- <div class="tg-members-search-wrap">
752
- <ax-search-box
753
- class="tg-members-search"
754
- [value]="memberSearchQuery()"
755
- (valueChange)="onMemberSearchChange($event)"
756
- [placeholder]="'@acorex:chat.info-panel.placeholders.search-members' | translate | async"
757
- ></ax-search-box>
758
- </div>
759
- }
760
- @for (participant of filteredMembers(); track participant.id) {
761
- <div class="tg-member-row">
762
- <ax-conversation-avatar
763
- kind="user"
764
- [userId]="participant.id"
765
- [conversation]="conversation"
766
- [size]="42"
767
- />
768
- <div class="tg-member-row__content">
769
- <span class="tg-member-row__name">{{ participant.name }}</span>
770
- <span
771
- class="tg-member-row__meta"
772
- [class.tg-member-row__meta--online]="participant.status === 'online'"
773
- >
774
- {{ getMemberSubtitle(participant) }}
775
- </span>
776
- </div>
777
- @if (getMemberRoleLabel(participant); as roleLabel) {
778
- <span class="tg-member-row__badge">{{ roleLabel | translate | async }}</span>
779
- }
780
- </div>
781
- }
782
- </section>
783
- }
784
- }
785
-
786
- @if (activeTab() === 'manage') {
787
- <section class="tg-section tg-manage">
788
- @if (!isPrivateConversation()) {
789
- <div class="tg-manage-block">
790
- <ax-label class="tg-manage-label">{{
791
- '@acorex:chat.info-panel.group-details.title' | translate | async
792
- }}</ax-label>
793
- <ax-text-box
794
- [value]="editTitle"
795
- (valueChange)="onGroupTitleChange($event)"
796
- [placeholder]="'@acorex:chat.info-panel.placeholders.enter-group-title' | translate | async"
797
- ></ax-text-box>
798
- <div class="tg-manage-avatar">
799
- <ax-conversation-avatar-picker
800
- [(avatarUrl)]="editAvatar"
801
- (avatarUrlChange)="onGroupAvatarChange($event)"
802
- ></ax-conversation-avatar-picker>
803
- </div>
804
- </div>
805
- }
806
-
807
- <div class="tg-setting-row">
808
- <div class="tg-setting-row__info">
809
- <span class="tg-setting-row__title">{{
810
- '@acorex:chat.info-panel.settings.archived' | translate | async
811
- }}</span>
812
- <span class="tg-setting-row__desc">{{
813
- '@acorex:chat.info-panel.settings.archived-description' | translate | async
814
- }}</span>
815
- </div>
816
- <ax-switch [(ngModel)]="archived" (ngModelChange)="onArchivedChange($event)"></ax-switch>
817
- </div>
818
-
819
- <div class="tg-manage-block tg-background-block">
820
- <ax-label class="tg-manage-label">{{
821
- '@acorex:chat.info-panel.background.title' | translate | async
822
- }}</ax-label>
823
- <p class="tg-background-desc">
824
- {{ '@acorex:chat.info-panel.background.description' | translate | async }}
825
- </p>
826
- <div class="tg-background-grid">
827
- @for (preset of backgroundPresets; track preset.id) {
828
- <button
829
- type="button"
830
- class="tg-background-swatch"
831
- [class.tg-background-swatch--active]="isBackgroundSelected(preset.value)"
832
- [style.background]="preset.value"
833
- (click)="applyMessageListBackground(preset.value)"
834
- [attr.aria-label]="getBackgroundAriaLabel(preset.label)"
835
- >
836
- <span class="tg-background-swatch__label">{{ preset.label }}</span>
837
- </button>
838
- }
839
- </div>
840
- <ax-button
841
- [text]="'@acorex:chat.info-panel.actions.reset-to-default' | translate | async"
842
- [look]="'ghost'"
843
- (onClick)="applyMessageListBackground('')"
844
- ></ax-button>
845
- </div>
846
- </section>
847
- }
848
- </div>
849
- }
850
- </div>
851
- }
852
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.tg-info-panel{display:flex;flex-direction:column;max-height:min(85vh,40rem)}.tg-info-panel__scroll{overflow-y:auto;overscroll-behavior:contain}.tg-hero{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1.25rem 1.5rem 1rem;text-align:center}.tg-hero__title{margin:.25rem 0 0;font-size:1.25rem;font-weight:600;line-height:1.35;color:rgb(var(--ax-sys-color-on-surface));word-break:break-word}.tg-hero__subtitle{margin:0;font-size:.875rem;line-height:1.25rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.65}.tg-quick-actions{display:flex;justify-content:center;gap:.35rem;padding:0 .75rem 1rem;flex-wrap:nowrap}.tg-quick-action{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.35rem;flex:1;min-width:0;max-width:5.5rem;padding:.55rem .4rem;border:none;border-radius:.75rem;background:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-primary-500));cursor:pointer;transition:background-color .15s ease}.tg-quick-action:hover{background:rgb(var(--ax-sys-color-border-light-surface))}.tg-quick-action--danger{color:rgb(var(--ax-sys-color-danger-500))}.tg-quick-action--active{background:rgba(var(--ax-sys-color-warning-500),.14);color:rgb(var(--ax-sys-color-warning-500))}.tg-quick-action--active .tg-quick-action__label{color:rgb(var(--ax-sys-color-warning-500));opacity:1}.tg-quick-action__icon{font-size:1.125rem;line-height:1}.tg-quick-action__label{font-size:.6875rem;font-weight:500;line-height:1.1;color:rgb(var(--ax-sys-color-on-surface));opacity:.85;text-align:center}.tg-tabs{display:flex;gap:0;margin:0 .75rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.tg-tab{flex:1;padding:.65rem .5rem;border:none;border-bottom:2px solid transparent;background:transparent;font-size:.875rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface));opacity:.55;cursor:pointer;transition:opacity .15s ease,color .15s ease,border-color .15s ease}.tg-tab:hover{opacity:.8}.tg-tab--active{opacity:1;color:rgb(var(--ax-sys-color-primary-500));border-bottom-color:rgb(var(--ax-sys-color-primary-500))}.tg-section{// border-top: 1px solid rgb(var(--ax-sys-color-border-light-surface));padding:.25rem 0}.tg-detail-row,.tg-member-row{display:flex;align-items:center;gap:.875rem;padding:.65rem 1rem;min-width:0}.tg-media-row{display:flex;align-items:center;gap:.875rem;width:100%;padding:.7rem 1rem;border:none;background:transparent;text-align:start;cursor:pointer;transition:background-color .15s ease}.tg-media-row:hover{background:rgb(var(--ax-sys-color-lighter-surface))}.tg-media-row__icon{flex-shrink:0;width:1.5rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.75}.tg-media-row__label{flex:1;min-width:0;font-size:.9375rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface))}.tg-media-row__chevron{flex-shrink:0;font-size:.75rem;opacity:.45}.tg-loading{padding:.75rem 1rem 1rem;font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.6;text-align:center}.tg-detail-row__icon{flex-shrink:0;width:1.5rem;text-align:center;color:rgb(var(--ax-sys-color-primary-500));opacity:.9}.tg-detail-row__content,.tg-member-row__content{flex:1;min-width:0;display:flex;flex-direction:column;gap:.125rem}.tg-detail-row__value,.tg-member-row__name{font-size:.9375rem;font-weight:500;line-height:1.3;color:rgb(var(--ax-sys-color-on-surface));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tg-detail-row__label,.tg-member-row__meta{font-size:.75rem;line-height:1.2;color:rgb(var(--ax-sys-color-on-surface));opacity:.6}.tg-member-row__meta--online{color:rgb(var(--ax-sys-color-primary-500));opacity:1}.tg-section-header{display:flex;flex-direction:column;gap:.5rem;padding:.75rem 1rem .35rem}.tg-section-header--row{flex-direction:row;align-items:center;justify-content:space-between}.tg-section-header__actions{display:flex;align-items:center;gap:.25rem}.tg-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;border-radius:999px;background:transparent;color:rgb(var(--ax-sys-color-primary-500));cursor:pointer}.tg-icon-btn:hover{background:rgb(var(--ax-sys-color-lighter-surface))}.tg-members-search-wrap{padding:0 1rem .5rem}.tg-section-header__title{font-size:.75rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:rgb(var(--ax-sys-color-on-surface));opacity:.55}.tg-members-search{width:100%}.tg-member-row__badge{flex-shrink:0;padding:.15rem .5rem;border-radius:999px;font-size:.6875rem;font-weight:600;color:rgb(var(--ax-sys-color-primary-500));background:rgba(var(--ax-sys-color-primary-500),.14)}.tg-manage{padding:.75rem 1rem 1rem;display:flex;flex-direction:column;gap:.75rem}.tg-manage-block{display:flex;flex-direction:column;gap:.5rem}.tg-manage-label{font-size:.8125rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface))}.tg-setting-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.5rem 0}.tg-setting-row__info{flex:1;min-width:0;display:flex;flex-direction:column;gap:.125rem}.tg-setting-row__title{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface))}.tg-setting-row__desc{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.65}.tg-background-desc{margin:0;font-size:.75rem;opacity:.7}.tg-background-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.5rem}.tg-background-swatch{position:relative;height:2.75rem;border-radius:.5rem;border:2px solid transparent;cursor:pointer;overflow:hidden}.tg-background-swatch--active{border-color:rgb(var(--ax-sys-color-primary-500))}.tg-background-swatch__label{position:absolute;inset-inline-start:.35rem;bottom:.2rem;font-size:.65rem;letter-spacing:.1rem;font-weight:300;mix-blend-mode:difference;color:#fff}.tg-danger{padding:.25rem 0 .75rem}.tg-danger-row{display:flex;align-items:center;gap:.75rem;width:100%;padding:.75rem 1rem;border:none;background:transparent;font-size:.9375rem;font-weight:500;color:rgb(var(--ax-sys-color-danger-500));cursor:pointer;text-align:start}.tg-danger-row:hover{background:rgba(var(--ax-sys-color-danger-500),.06)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXSwitchModule }, { kind: "component", type: i2.AXSwitchComponent, selector: "ax-switch", inputs: ["disabled", "readonly", "color", "tabIndex", "value", "name", "isLoading"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "component", type: AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "component", type: AXConversationAvatarPickerComponent, selector: "ax-conversation-avatar-picker", inputs: ["showClearButton", "avatarUrl"], outputs: ["avatarUrlChange", "onFileSelected"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "component", type: AXConversationRegistryComponentOutletComponent, selector: "ax-conversation-registry-component-outlet", inputs: ["component", "componentLoader", "inputs"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
853
- }
854
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationInfoPanelComponent, decorators: [{
855
- type: Component,
856
- args: [{ selector: 'ax-conversation-info-panel', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
857
- CommonModule,
858
- FormsModule,
859
- AXButtonComponent,
860
- AXDecoratorModule,
861
- AXLabelComponent,
862
- AXSearchBoxComponent,
863
- AXSwitchModule,
864
- AXTextBoxComponent,
865
- AXConversationAvatarPickerComponent,
866
- AXConversationAvatarComponent,
867
- AXConversationRegistryComponentOutletComponent,
868
- AXTranslationModule,
869
- ], providers: [
870
- { provide: AXClosableComponent, useExisting: AXConversationInfoPanelComponent },
871
- ], template: `
872
- @if (conversation) {
873
- <div class="tg-info-panel">
874
- @if (panelView() === 'media' && selectedMediaCategory(); as category) {
875
- <ax-conversation-registry-component-outlet
876
- [componentLoader]="mediaViewLoader"
877
- [inputs]="getMediaViewInputs(category)"
878
- />
879
- } @else {
880
- <div class="tg-info-panel__scroll">
881
- <section class="tg-hero">
882
- <ax-conversation-avatar kind="auto" [conversation]="conversation" [size]="96" />
883
- <h2 class="tg-hero__title">{{ conversation.title }}</h2>
884
- <p class="tg-hero__subtitle">{{ heroSubtitle() }}</p>
885
- </section>
886
-
887
- <section class="tg-quick-actions">
888
- @for (action of quickActions(); track action.id) {
889
- <button
890
- type="button"
891
- class="tg-quick-action"
892
- [class.tg-quick-action--danger]="action.danger"
893
- [class.tg-quick-action--active]="action.id === 'mute' && isConversationMuted()"
894
- (click)="onQuickAction(action.id)"
895
- >
896
- <span class="tg-quick-action__icon"><i [class]="action.icon"></i></span>
897
- <span class="tg-quick-action__label">{{ action.labelKey | translate | async }}</span>
898
- </button>
899
- }
900
- </section>
901
-
902
- <nav class="tg-tabs" role="tablist">
903
- <button
904
- type="button"
905
- class="tg-tab"
906
- role="tab"
907
- [class.tg-tab--active]="activeTab() === 'profile'"
908
- [attr.aria-selected]="activeTab() === 'profile'"
909
- (click)="setActiveTab('profile')"
910
- >
911
- {{ '@acorex:chat.info-panel.tabs.profile' | translate | async }}
912
- </button>
913
- <button
914
- type="button"
915
- class="tg-tab"
916
- role="tab"
917
- [class.tg-tab--active]="activeTab() === 'manage'"
918
- [attr.aria-selected]="activeTab() === 'manage'"
919
- (click)="setActiveTab('manage')"
920
- >
921
- {{ '@acorex:chat.info-panel.tabs.manage' | translate | async }}
922
- </button>
923
- </nav>
924
-
925
- @if (activeTab() === 'profile') {
926
- @if (profileFields().length > 0) {
927
- <section class="tg-section tg-details">
928
- @for (field of profileFields(); track field.id) {
929
- <div class="tg-detail-row">
930
- <span class="tg-detail-row__icon"><i [class]="field.icon"></i></span>
931
- <div class="tg-detail-row__content">
932
- <span class="tg-detail-row__value">{{ field.value }}</span>
933
- <span class="tg-detail-row__label">{{ field.labelKey | translate | async }}</span>
934
- </div>
935
- </div>
936
- }
937
- </section>
938
- }
939
-
940
- @if (loadingMessages()) {
941
- <div class="tg-loading">{{ '@acorex:chat.info-panel.media.loading' | translate | async }}</div>
942
- } @else if (mediaCategories().length > 0) {
943
- <section class="tg-section tg-media">
944
- @for (category of mediaCategories(); track category.id) {
945
- <button type="button" class="tg-media-row" (click)="openMediaCategory(category)">
946
- <span class="tg-media-row__icon"><i [class]="category.icon"></i></span>
947
- <span class="tg-media-row__label">{{ getMediaRowLabel(category) }}</span>
948
- <i class="fa-light fa-chevron-right tg-media-row__chevron"></i>
949
- </button>
950
- }
951
- </section>
952
- }
953
-
954
- @if (isGroupConversation()) {
955
- <section class="tg-section tg-members">
956
- <div class="tg-section-header tg-section-header--row">
957
- <span class="tg-section-header__title">{{ membersSectionTitle() }}</span>
958
- <div class="tg-section-header__actions">
959
- <button
960
- type="button"
961
- class="tg-icon-btn"
962
- (click)="toggleMemberSearch()"
963
- [attr.aria-label]="'@acorex:chat.info-panel.placeholders.search-members' | translate | async"
964
- >
965
- <i class="fa-light fa-magnifying-glass"></i>
966
- </button>
967
- </div>
968
- </div>
969
- @if (showMemberSearch()) {
970
- <div class="tg-members-search-wrap">
971
- <ax-search-box
972
- class="tg-members-search"
973
- [value]="memberSearchQuery()"
974
- (valueChange)="onMemberSearchChange($event)"
975
- [placeholder]="'@acorex:chat.info-panel.placeholders.search-members' | translate | async"
976
- ></ax-search-box>
977
- </div>
978
- }
979
- @for (participant of filteredMembers(); track participant.id) {
980
- <div class="tg-member-row">
981
- <ax-conversation-avatar
982
- kind="user"
983
- [userId]="participant.id"
984
- [conversation]="conversation"
985
- [size]="42"
986
- />
987
- <div class="tg-member-row__content">
988
- <span class="tg-member-row__name">{{ participant.name }}</span>
989
- <span
990
- class="tg-member-row__meta"
991
- [class.tg-member-row__meta--online]="participant.status === 'online'"
992
- >
993
- {{ getMemberSubtitle(participant) }}
994
- </span>
995
- </div>
996
- @if (getMemberRoleLabel(participant); as roleLabel) {
997
- <span class="tg-member-row__badge">{{ roleLabel | translate | async }}</span>
998
- }
999
- </div>
1000
- }
1001
- </section>
1002
- }
1003
- }
1004
-
1005
- @if (activeTab() === 'manage') {
1006
- <section class="tg-section tg-manage">
1007
- @if (!isPrivateConversation()) {
1008
- <div class="tg-manage-block">
1009
- <ax-label class="tg-manage-label">{{
1010
- '@acorex:chat.info-panel.group-details.title' | translate | async
1011
- }}</ax-label>
1012
- <ax-text-box
1013
- [value]="editTitle"
1014
- (valueChange)="onGroupTitleChange($event)"
1015
- [placeholder]="'@acorex:chat.info-panel.placeholders.enter-group-title' | translate | async"
1016
- ></ax-text-box>
1017
- <div class="tg-manage-avatar">
1018
- <ax-conversation-avatar-picker
1019
- [(avatarUrl)]="editAvatar"
1020
- (avatarUrlChange)="onGroupAvatarChange($event)"
1021
- ></ax-conversation-avatar-picker>
1022
- </div>
1023
- </div>
1024
- }
1025
-
1026
- <div class="tg-setting-row">
1027
- <div class="tg-setting-row__info">
1028
- <span class="tg-setting-row__title">{{
1029
- '@acorex:chat.info-panel.settings.archived' | translate | async
1030
- }}</span>
1031
- <span class="tg-setting-row__desc">{{
1032
- '@acorex:chat.info-panel.settings.archived-description' | translate | async
1033
- }}</span>
1034
- </div>
1035
- <ax-switch [(ngModel)]="archived" (ngModelChange)="onArchivedChange($event)"></ax-switch>
1036
- </div>
1037
-
1038
- <div class="tg-manage-block tg-background-block">
1039
- <ax-label class="tg-manage-label">{{
1040
- '@acorex:chat.info-panel.background.title' | translate | async
1041
- }}</ax-label>
1042
- <p class="tg-background-desc">
1043
- {{ '@acorex:chat.info-panel.background.description' | translate | async }}
1044
- </p>
1045
- <div class="tg-background-grid">
1046
- @for (preset of backgroundPresets; track preset.id) {
1047
- <button
1048
- type="button"
1049
- class="tg-background-swatch"
1050
- [class.tg-background-swatch--active]="isBackgroundSelected(preset.value)"
1051
- [style.background]="preset.value"
1052
- (click)="applyMessageListBackground(preset.value)"
1053
- [attr.aria-label]="getBackgroundAriaLabel(preset.label)"
1054
- >
1055
- <span class="tg-background-swatch__label">{{ preset.label }}</span>
1056
- </button>
1057
- }
1058
- </div>
1059
- <ax-button
1060
- [text]="'@acorex:chat.info-panel.actions.reset-to-default' | translate | async"
1061
- [look]="'ghost'"
1062
- (onClick)="applyMessageListBackground('')"
1063
- ></ax-button>
1064
- </div>
1065
- </section>
1066
- }
1067
- </div>
1068
- }
1069
- </div>
1070
- }
1071
- `, styles: [":host{display:block;width:100%;height:100%}.tg-info-panel{display:flex;flex-direction:column;max-height:min(85vh,40rem)}.tg-info-panel__scroll{overflow-y:auto;overscroll-behavior:contain}.tg-hero{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1.25rem 1.5rem 1rem;text-align:center}.tg-hero__title{margin:.25rem 0 0;font-size:1.25rem;font-weight:600;line-height:1.35;color:rgb(var(--ax-sys-color-on-surface));word-break:break-word}.tg-hero__subtitle{margin:0;font-size:.875rem;line-height:1.25rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.65}.tg-quick-actions{display:flex;justify-content:center;gap:.35rem;padding:0 .75rem 1rem;flex-wrap:nowrap}.tg-quick-action{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.35rem;flex:1;min-width:0;max-width:5.5rem;padding:.55rem .4rem;border:none;border-radius:.75rem;background:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-primary-500));cursor:pointer;transition:background-color .15s ease}.tg-quick-action:hover{background:rgb(var(--ax-sys-color-border-light-surface))}.tg-quick-action--danger{color:rgb(var(--ax-sys-color-danger-500))}.tg-quick-action--active{background:rgba(var(--ax-sys-color-warning-500),.14);color:rgb(var(--ax-sys-color-warning-500))}.tg-quick-action--active .tg-quick-action__label{color:rgb(var(--ax-sys-color-warning-500));opacity:1}.tg-quick-action__icon{font-size:1.125rem;line-height:1}.tg-quick-action__label{font-size:.6875rem;font-weight:500;line-height:1.1;color:rgb(var(--ax-sys-color-on-surface));opacity:.85;text-align:center}.tg-tabs{display:flex;gap:0;margin:0 .75rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.tg-tab{flex:1;padding:.65rem .5rem;border:none;border-bottom:2px solid transparent;background:transparent;font-size:.875rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface));opacity:.55;cursor:pointer;transition:opacity .15s ease,color .15s ease,border-color .15s ease}.tg-tab:hover{opacity:.8}.tg-tab--active{opacity:1;color:rgb(var(--ax-sys-color-primary-500));border-bottom-color:rgb(var(--ax-sys-color-primary-500))}.tg-section{// border-top: 1px solid rgb(var(--ax-sys-color-border-light-surface));padding:.25rem 0}.tg-detail-row,.tg-member-row{display:flex;align-items:center;gap:.875rem;padding:.65rem 1rem;min-width:0}.tg-media-row{display:flex;align-items:center;gap:.875rem;width:100%;padding:.7rem 1rem;border:none;background:transparent;text-align:start;cursor:pointer;transition:background-color .15s ease}.tg-media-row:hover{background:rgb(var(--ax-sys-color-lighter-surface))}.tg-media-row__icon{flex-shrink:0;width:1.5rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.75}.tg-media-row__label{flex:1;min-width:0;font-size:.9375rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface))}.tg-media-row__chevron{flex-shrink:0;font-size:.75rem;opacity:.45}.tg-loading{padding:.75rem 1rem 1rem;font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.6;text-align:center}.tg-detail-row__icon{flex-shrink:0;width:1.5rem;text-align:center;color:rgb(var(--ax-sys-color-primary-500));opacity:.9}.tg-detail-row__content,.tg-member-row__content{flex:1;min-width:0;display:flex;flex-direction:column;gap:.125rem}.tg-detail-row__value,.tg-member-row__name{font-size:.9375rem;font-weight:500;line-height:1.3;color:rgb(var(--ax-sys-color-on-surface));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tg-detail-row__label,.tg-member-row__meta{font-size:.75rem;line-height:1.2;color:rgb(var(--ax-sys-color-on-surface));opacity:.6}.tg-member-row__meta--online{color:rgb(var(--ax-sys-color-primary-500));opacity:1}.tg-section-header{display:flex;flex-direction:column;gap:.5rem;padding:.75rem 1rem .35rem}.tg-section-header--row{flex-direction:row;align-items:center;justify-content:space-between}.tg-section-header__actions{display:flex;align-items:center;gap:.25rem}.tg-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;border-radius:999px;background:transparent;color:rgb(var(--ax-sys-color-primary-500));cursor:pointer}.tg-icon-btn:hover{background:rgb(var(--ax-sys-color-lighter-surface))}.tg-members-search-wrap{padding:0 1rem .5rem}.tg-section-header__title{font-size:.75rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:rgb(var(--ax-sys-color-on-surface));opacity:.55}.tg-members-search{width:100%}.tg-member-row__badge{flex-shrink:0;padding:.15rem .5rem;border-radius:999px;font-size:.6875rem;font-weight:600;color:rgb(var(--ax-sys-color-primary-500));background:rgba(var(--ax-sys-color-primary-500),.14)}.tg-manage{padding:.75rem 1rem 1rem;display:flex;flex-direction:column;gap:.75rem}.tg-manage-block{display:flex;flex-direction:column;gap:.5rem}.tg-manage-label{font-size:.8125rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface))}.tg-setting-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.5rem 0}.tg-setting-row__info{flex:1;min-width:0;display:flex;flex-direction:column;gap:.125rem}.tg-setting-row__title{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-surface))}.tg-setting-row__desc{font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.65}.tg-background-desc{margin:0;font-size:.75rem;opacity:.7}.tg-background-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.5rem}.tg-background-swatch{position:relative;height:2.75rem;border-radius:.5rem;border:2px solid transparent;cursor:pointer;overflow:hidden}.tg-background-swatch--active{border-color:rgb(var(--ax-sys-color-primary-500))}.tg-background-swatch__label{position:absolute;inset-inline-start:.35rem;bottom:.2rem;font-size:.65rem;letter-spacing:.1rem;font-weight:300;mix-blend-mode:difference;color:#fff}.tg-danger{padding:.25rem 0 .75rem}.tg-danger-row{display:flex;align-items:center;gap:.75rem;width:100%;padding:.75rem 1rem;border:none;background:transparent;font-size:.9375rem;font-weight:500;color:rgb(var(--ax-sys-color-danger-500));cursor:pointer;text-align:start}.tg-danger-row:hover{background:rgba(var(--ax-sys-color-danger-500),.06)}\n"] }]
1072
- }] });
1073
-
1074
- var conversationInfoPanel_component = /*#__PURE__*/Object.freeze({
1075
- __proto__: null,
1076
- AXConversationInfoPanelComponent: AXConversationInfoPanelComponent
1077
- });
1078
-
1079
- export { isAttachmentListCategory as a, buildMediaGalleryTiles as b, getMessageAudioItems as c, conversationInfoPanel_component as d, filterMessagesByMediaCategory as f, getMessageVideoItems as g, isGridMediaCategory as i };
1080
- //# sourceMappingURL=acorex-components-conversation-conversation-info-panel.component-BJMo9bDd.mjs.map