@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
@@ -0,0 +1,1080 @@
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