@acorex/components 20.6.7 → 20.6.9
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.
- package/conversation2/index.d.ts +215 -199
- package/fesm2022/acorex-components-conversation2.mjs +701 -552
- package/fesm2022/acorex-components-conversation2.mjs.map +1 -1
- package/fesm2022/acorex-components-file-explorer.mjs +1 -1
- package/fesm2022/acorex-components-file-explorer.mjs.map +1 -1
- package/fesm2022/acorex-components-list.mjs +53 -9
- package/fesm2022/acorex-components-list.mjs.map +1 -1
- package/fesm2022/acorex-components-menu.mjs +30 -10
- package/fesm2022/acorex-components-menu.mjs.map +1 -1
- package/list/index.d.ts +22 -1
- package/menu/index.d.ts +3 -1
- package/package.json +27 -27
|
@@ -58,57 +58,6 @@ import { AXBasePageComponent } from '@acorex/components/page';
|
|
|
58
58
|
* Common types used across all API services
|
|
59
59
|
*/
|
|
60
60
|
|
|
61
|
-
/**
|
|
62
|
-
* Abstract User Management API
|
|
63
|
-
* Handle user profile management and user operations for conversations
|
|
64
|
-
*/
|
|
65
|
-
/**
|
|
66
|
-
* Abstract User Management API
|
|
67
|
-
*
|
|
68
|
-
* Implement this abstract class to handle user management for conversations.
|
|
69
|
-
*
|
|
70
|
-
* @example
|
|
71
|
-
* ```typescript
|
|
72
|
-
* @Injectable()
|
|
73
|
-
* export class MyUserApi extends AXUserApi {
|
|
74
|
-
* constructor(private http: HttpClient) {
|
|
75
|
-
* super();
|
|
76
|
-
* }
|
|
77
|
-
*
|
|
78
|
-
* async getCurrentUser(): Promise<AXParticipant> {
|
|
79
|
-
* const response = await this.http.get('/api/users/me').toPromise();
|
|
80
|
-
* return response;
|
|
81
|
-
* }
|
|
82
|
-
*
|
|
83
|
-
* // ... implement other methods
|
|
84
|
-
* }
|
|
85
|
-
* ```
|
|
86
|
-
*/
|
|
87
|
-
class AXUserApi {
|
|
88
|
-
// =====================
|
|
89
|
-
// Error Handling Helper
|
|
90
|
-
// =====================
|
|
91
|
-
/**
|
|
92
|
-
* Create an API error
|
|
93
|
-
* Helper method for consistent error creation
|
|
94
|
-
*
|
|
95
|
-
* @param code - Error code
|
|
96
|
-
* @param message - Error message
|
|
97
|
-
* @param statusCode - HTTP status code
|
|
98
|
-
* @param details - Additional details
|
|
99
|
-
* @returns API error object
|
|
100
|
-
*/
|
|
101
|
-
createError(code, message, statusCode, details) {
|
|
102
|
-
return {
|
|
103
|
-
code,
|
|
104
|
-
message,
|
|
105
|
-
statusCode,
|
|
106
|
-
details,
|
|
107
|
-
timestamp: new Date(),
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
61
|
/**
|
|
113
62
|
* Abstract Conversation Management API
|
|
114
63
|
* Handle conversation CRUD operations, participants, and settings
|
|
@@ -252,6 +201,57 @@ class AXMessageApi {
|
|
|
252
201
|
class AXRealtimeApi {
|
|
253
202
|
}
|
|
254
203
|
|
|
204
|
+
/**
|
|
205
|
+
* Abstract User Management API
|
|
206
|
+
* Handle user profile management and user operations for conversations
|
|
207
|
+
*/
|
|
208
|
+
/**
|
|
209
|
+
* Abstract User Management API
|
|
210
|
+
*
|
|
211
|
+
* Implement this abstract class to handle user management for conversations.
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* ```typescript
|
|
215
|
+
* @Injectable()
|
|
216
|
+
* export class MyUserApi extends AXUserApi {
|
|
217
|
+
* constructor(private http: HttpClient) {
|
|
218
|
+
* super();
|
|
219
|
+
* }
|
|
220
|
+
*
|
|
221
|
+
* async getCurrentUser(): Promise<AXParticipant> {
|
|
222
|
+
* const response = await this.http.get('/api/users/me').toPromise();
|
|
223
|
+
* return response;
|
|
224
|
+
* }
|
|
225
|
+
*
|
|
226
|
+
* // ... implement other methods
|
|
227
|
+
* }
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
class AXUserApi {
|
|
231
|
+
// =====================
|
|
232
|
+
// Error Handling Helper
|
|
233
|
+
// =====================
|
|
234
|
+
/**
|
|
235
|
+
* Create an API error
|
|
236
|
+
* Helper method for consistent error creation
|
|
237
|
+
*
|
|
238
|
+
* @param code - Error code
|
|
239
|
+
* @param message - Error message
|
|
240
|
+
* @param statusCode - HTTP status code
|
|
241
|
+
* @param details - Additional details
|
|
242
|
+
* @returns API error object
|
|
243
|
+
*/
|
|
244
|
+
createError(code, message, statusCode, details) {
|
|
245
|
+
return {
|
|
246
|
+
code,
|
|
247
|
+
message,
|
|
248
|
+
statusCode,
|
|
249
|
+
details,
|
|
250
|
+
timestamp: new Date(),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
255
|
/**
|
|
256
256
|
* API Services
|
|
257
257
|
* Export all abstract API classes and types
|
|
@@ -11129,58 +11129,71 @@ function getDefaultConversationItemActions() {
|
|
|
11129
11129
|
* Default Conversation Tabs Plugin
|
|
11130
11130
|
* Provides sidebar conversation filter tabs (all, private, groups, etc.)
|
|
11131
11131
|
*/
|
|
11132
|
+
function conversationHasUnread(c) {
|
|
11133
|
+
return (c.unreadCount ?? 0) > 0;
|
|
11134
|
+
}
|
|
11135
|
+
/** Number of conversations (in the same scope as each tab's `filter`) that have any unread messages — not sum of unread counts. */
|
|
11136
|
+
function countConversationsWithUnreadInScope(conversations, scope) {
|
|
11137
|
+
const n = scope(conversations).filter(conversationHasUnread).length;
|
|
11138
|
+
return n || undefined;
|
|
11139
|
+
}
|
|
11132
11140
|
// Individual conversation tab constants (no aggregate arrays)
|
|
11133
11141
|
const AX_CONVERSATION_TAB_ALL = {
|
|
11134
11142
|
id: 'all',
|
|
11135
11143
|
label: 'All',
|
|
11136
|
-
icon: '
|
|
11144
|
+
icon: 'fa-light fa-comments',
|
|
11137
11145
|
priority: 100,
|
|
11138
11146
|
filter: (conversations) => conversations,
|
|
11139
|
-
badge: (conversations) => conversations
|
|
11147
|
+
badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c),
|
|
11140
11148
|
default: true,
|
|
11141
11149
|
};
|
|
11142
11150
|
const AX_CONVERSATION_TAB_PRIVATE = {
|
|
11143
11151
|
id: 'private',
|
|
11144
11152
|
label: 'Private',
|
|
11145
|
-
icon: '
|
|
11153
|
+
icon: 'fa-light fa-user',
|
|
11146
11154
|
priority: 90,
|
|
11147
11155
|
filter: (conversations) => conversations.filter((c) => c.type === 'private'),
|
|
11148
|
-
badge: (conversations) => conversations.filter((
|
|
11156
|
+
badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.type === 'private')),
|
|
11149
11157
|
};
|
|
11150
11158
|
const AX_CONVERSATION_TAB_GROUPS = {
|
|
11151
11159
|
id: 'groups',
|
|
11152
11160
|
label: 'Groups',
|
|
11153
|
-
icon: '
|
|
11161
|
+
icon: 'fa-light fa-users',
|
|
11154
11162
|
priority: 80,
|
|
11155
11163
|
filter: (conversations) => conversations.filter((c) => c.type === 'group'),
|
|
11156
|
-
badge: (conversations) => conversations.filter((
|
|
11164
|
+
badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.type === 'group')),
|
|
11157
11165
|
};
|
|
11158
11166
|
const AX_CONVERSATION_TAB_CHANNELS = {
|
|
11159
11167
|
id: 'channels',
|
|
11160
11168
|
label: 'Channels',
|
|
11161
|
-
icon: '
|
|
11169
|
+
icon: 'fa-light fa-hashtag',
|
|
11162
11170
|
priority: 70,
|
|
11163
11171
|
filter: (conversations) => conversations.filter((c) => c.type === 'channel'),
|
|
11164
|
-
badge: (conversations) => conversations.filter((
|
|
11172
|
+
badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.type === 'channel')),
|
|
11173
|
+
};
|
|
11174
|
+
const AX_CONVERSATION_TAB_BOT = {
|
|
11175
|
+
id: 'bot',
|
|
11176
|
+
label: 'Bots',
|
|
11177
|
+
icon: 'fa-light fa-robot',
|
|
11178
|
+
priority: 65,
|
|
11179
|
+
filter: (conversations) => conversations.filter((c) => c.type === 'bot'),
|
|
11180
|
+
badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.type === 'bot')),
|
|
11165
11181
|
};
|
|
11166
11182
|
const AX_CONVERSATION_TAB_UNREAD = {
|
|
11167
11183
|
id: 'unread',
|
|
11168
11184
|
label: 'Unread',
|
|
11169
|
-
icon: '
|
|
11185
|
+
icon: 'fa-light fa-envelope',
|
|
11170
11186
|
priority: 60,
|
|
11171
11187
|
filter: (conversations) => conversations.filter((c) => c.unreadCount > 0),
|
|
11172
|
-
badge: (conversations) =>
|
|
11173
|
-
const unreadCount = conversations.reduce((sum, c) => sum + c.unreadCount, 0);
|
|
11174
|
-
return unreadCount || undefined;
|
|
11175
|
-
},
|
|
11188
|
+
badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.unreadCount > 0)),
|
|
11176
11189
|
};
|
|
11177
11190
|
const AX_CONVERSATION_TAB_ARCHIVED = {
|
|
11178
11191
|
id: 'archived',
|
|
11179
11192
|
label: 'Archived',
|
|
11180
|
-
icon: 'archive',
|
|
11193
|
+
icon: 'fa-light fa-archive',
|
|
11181
11194
|
priority: 50,
|
|
11182
11195
|
filter: (conversations) => conversations.filter((c) => c.archived),
|
|
11183
|
-
badge: (conversations) => conversations.filter((
|
|
11196
|
+
badge: (conversations) => countConversationsWithUnreadInScope(conversations, (c) => c.filter((x) => x.archived)),
|
|
11184
11197
|
enabled: false, // Disabled by default
|
|
11185
11198
|
};
|
|
11186
11199
|
|
|
@@ -14717,6 +14730,10 @@ class AXInfoBarComponent {
|
|
|
14717
14730
|
<ax-avatar [size]="48">
|
|
14718
14731
|
@if (conversation.avatar) {
|
|
14719
14732
|
<ax-image [src]="conversation.avatar" alt="{{ conversation.title }}"></ax-image>
|
|
14733
|
+
} @else if (conversation.icon) {
|
|
14734
|
+
<ax-icon
|
|
14735
|
+
><i [class]="'info-bar-avatar-icon ' + conversation.icon" aria-hidden="true"></i
|
|
14736
|
+
></ax-icon>
|
|
14720
14737
|
} @else {
|
|
14721
14738
|
<ax-label>{{ getInitials(conversation.title) }}</ax-label>
|
|
14722
14739
|
}
|
|
@@ -14833,7 +14850,7 @@ class AXInfoBarComponent {
|
|
|
14833
14850
|
</div>
|
|
14834
14851
|
}
|
|
14835
14852
|
}
|
|
14836
|
-
`, isInline: true, styles: [":host{display:block}.info-bar{position:relative;display:flex;align-items:center;justify-content:space-between;overflow:hidden;padding:.5rem;line-height:1.1rem;min-height:64px;gap:.75rem}.info-banner{position:relative;z-index:1;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.5);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.25);background:rgb(var(--ax-sys-color-primary-lightest-surface));box-shadow:0 6px 16px rgb(var(--ax-sys-color-on-surface),.08),0 2px 6px rgb(var(--ax-sys-color-on-surface),.05)}.info-banner__content{flex:1;min-width:0}.info-banner__close{flex-shrink:0}.info-bar-empty{justify-content:center;opacity:.6}.info-left{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.info-details{flex:1;min-width:0}.info-title{margin:0;font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-subtitle-with-status{display:flex;align-items:center;gap:.375rem;margin:.125rem 0 0}.online-badge{color:#22c55e;font-size:.625rem;line-height:1;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.info-subtitle{margin:0;font-size:.85rem;letter-spacing:.02rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.7}.info-subtitle.clickable{cursor:pointer;transition:opacity .2s}.info-subtitle.clickable:hover{opacity:1;text-decoration:underline}.info-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.info-component-fullwidth{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:1rem;background:rgb(var(--ax-sys-color-lightest-surface));z-index:10}.slide-in{animation:slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(100%);transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}.info-component-fullwidth>*:first-child{flex:1;min-width:0}.action-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:.5rem;font-size:1.25rem;cursor:pointer;transition:background .2s}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.search-container{display:flex;align-items:center;gap:.5rem;width:100%;min-width:200px}.search-input{flex:1;min-width:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.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: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXMembersPopoverComponent, selector: "ax-conversation-members-popover", inputs: ["conversation"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
14853
|
+
`, isInline: true, styles: [":host{display:block}.info-bar{position:relative;display:flex;align-items:center;justify-content:space-between;overflow:hidden;padding:.5rem;line-height:1.1rem;min-height:64px;gap:.75rem}.info-banner{position:relative;z-index:1;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.5);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.25);background:rgb(var(--ax-sys-color-primary-lightest-surface));box-shadow:0 6px 16px rgb(var(--ax-sys-color-on-surface),.08),0 2px 6px rgb(var(--ax-sys-color-on-surface),.05)}.info-banner__content{flex:1;min-width:0}.info-banner__close{flex-shrink:0}.info-bar-empty{justify-content:center;opacity:.6}.info-left{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.avatar-wrapper ax-icon{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.info-bar-avatar-icon{font-size:1.35rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.info-details{flex:1;min-width:0}.info-title{margin:0;font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-subtitle-with-status{display:flex;align-items:center;gap:.375rem;margin:.125rem 0 0}.online-badge{color:#22c55e;font-size:.625rem;line-height:1;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.info-subtitle{margin:0;font-size:.85rem;letter-spacing:.02rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.7}.info-subtitle.clickable{cursor:pointer;transition:opacity .2s}.info-subtitle.clickable:hover{opacity:1;text-decoration:underline}.info-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.info-component-fullwidth{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:1rem;background:rgb(var(--ax-sys-color-lightest-surface));z-index:10}.slide-in{animation:slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(100%);transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}.info-component-fullwidth>*:first-child{flex:1;min-width:0}.action-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:.5rem;font-size:1.25rem;cursor:pointer;transition:background .2s}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.search-container{display:flex;align-items:center;gap:.5rem;width:100%;min-width:200px}.search-input{flex:1;min-width:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.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: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXMembersPopoverComponent, selector: "ax-conversation-members-popover", inputs: ["conversation"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
14837
14854
|
}
|
|
14838
14855
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXInfoBarComponent, decorators: [{
|
|
14839
14856
|
type: Component,
|
|
@@ -14864,6 +14881,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
14864
14881
|
<ax-avatar [size]="48">
|
|
14865
14882
|
@if (conversation.avatar) {
|
|
14866
14883
|
<ax-image [src]="conversation.avatar" alt="{{ conversation.title }}"></ax-image>
|
|
14884
|
+
} @else if (conversation.icon) {
|
|
14885
|
+
<ax-icon
|
|
14886
|
+
><i [class]="'info-bar-avatar-icon ' + conversation.icon" aria-hidden="true"></i
|
|
14887
|
+
></ax-icon>
|
|
14867
14888
|
} @else {
|
|
14868
14889
|
<ax-label>{{ getInitials(conversation.title) }}</ax-label>
|
|
14869
14890
|
}
|
|
@@ -14980,7 +15001,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
14980
15001
|
</div>
|
|
14981
15002
|
}
|
|
14982
15003
|
}
|
|
14983
|
-
`, styles: [":host{display:block}.info-bar{position:relative;display:flex;align-items:center;justify-content:space-between;overflow:hidden;padding:.5rem;line-height:1.1rem;min-height:64px;gap:.75rem}.info-banner{position:relative;z-index:1;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.5);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.25);background:rgb(var(--ax-sys-color-primary-lightest-surface));box-shadow:0 6px 16px rgb(var(--ax-sys-color-on-surface),.08),0 2px 6px rgb(var(--ax-sys-color-on-surface),.05)}.info-banner__content{flex:1;min-width:0}.info-banner__close{flex-shrink:0}.info-bar-empty{justify-content:center;opacity:.6}.info-left{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.info-details{flex:1;min-width:0}.info-title{margin:0;font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-subtitle-with-status{display:flex;align-items:center;gap:.375rem;margin:.125rem 0 0}.online-badge{color:#22c55e;font-size:.625rem;line-height:1;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.info-subtitle{margin:0;font-size:.85rem;letter-spacing:.02rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.7}.info-subtitle.clickable{cursor:pointer;transition:opacity .2s}.info-subtitle.clickable:hover{opacity:1;text-decoration:underline}.info-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.info-component-fullwidth{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:1rem;background:rgb(var(--ax-sys-color-lightest-surface));z-index:10}.slide-in{animation:slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(100%);transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}.info-component-fullwidth>*:first-child{flex:1;min-width:0}.action-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:.5rem;font-size:1.25rem;cursor:pointer;transition:background .2s}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.search-container{display:flex;align-items:center;gap:.5rem;width:100%;min-width:200px}.search-input{flex:1;min-width:0}\n"] }]
|
|
15004
|
+
`, styles: [":host{display:block}.info-bar{position:relative;display:flex;align-items:center;justify-content:space-between;overflow:hidden;padding:.5rem;line-height:1.1rem;min-height:64px;gap:.75rem}.info-banner{position:relative;z-index:1;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.5);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.25);background:rgb(var(--ax-sys-color-primary-lightest-surface));box-shadow:0 6px 16px rgb(var(--ax-sys-color-on-surface),.08),0 2px 6px rgb(var(--ax-sys-color-on-surface),.05)}.info-banner__content{flex:1;min-width:0}.info-banner__close{flex-shrink:0}.info-bar-empty{justify-content:center;opacity:.6}.info-left{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.avatar-wrapper ax-icon{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.info-bar-avatar-icon{font-size:1.35rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.info-details{flex:1;min-width:0}.info-title{margin:0;font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-subtitle-with-status{display:flex;align-items:center;gap:.375rem;margin:.125rem 0 0}.online-badge{color:#22c55e;font-size:.625rem;line-height:1;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.info-subtitle{margin:0;font-size:.85rem;letter-spacing:.02rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.7}.info-subtitle.clickable{cursor:pointer;transition:opacity .2s}.info-subtitle.clickable:hover{opacity:1;text-decoration:underline}.info-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.info-component-fullwidth{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:1rem;background:rgb(var(--ax-sys-color-lightest-surface));z-index:10}.slide-in{animation:slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(100%);transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}.info-component-fullwidth>*:first-child{flex:1;min-width:0}.action-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:.5rem;font-size:1.25rem;cursor:pointer;transition:background .2s}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.search-container{display:flex;align-items:center;gap:.5rem;width:100%;min-width:200px}.search-input{flex:1;min-width:0}\n"] }]
|
|
14984
15005
|
}] });
|
|
14985
15006
|
|
|
14986
15007
|
class AXForwardMessageDialogComponent {
|
|
@@ -15370,14 +15391,12 @@ class AXMessageListEmptyDefaultComponent {
|
|
|
15370
15391
|
return 'conversation';
|
|
15371
15392
|
}
|
|
15372
15393
|
}, ...(ngDevMode ? [{ debugName: "conversationKindLabel" }] : []));
|
|
15373
|
-
this.conversationPreposition = computed(() => this.conversation().type === 'private' ? 'with' : 'in', ...(ngDevMode ? [{ debugName: "conversationPreposition" }] : []));
|
|
15394
|
+
this.conversationPreposition = computed(() => (this.conversation().type === 'private' ? 'with' : 'in'), ...(ngDevMode ? [{ debugName: "conversationPreposition" }] : []));
|
|
15374
15395
|
}
|
|
15375
15396
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListEmptyDefaultComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
15376
15397
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.3", type: AXMessageListEmptyDefaultComponent, isStandalone: true, selector: "ax-conversation-message-list-empty-default", inputs: { conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "ax-message-empty-host" }, ngImport: i0, template: `
|
|
15377
15398
|
<div class="ax-message-empty" role="status" aria-label="No messages in this conversation">
|
|
15378
15399
|
<div class="ax-message-empty__ambient" aria-hidden="true">
|
|
15379
|
-
<span class="ax-message-empty__orb ax-message-empty__orb--a"></span>
|
|
15380
|
-
<span class="ax-message-empty__orb ax-message-empty__orb--b"></span>
|
|
15381
15400
|
<span class="ax-message-empty__grid"></span>
|
|
15382
15401
|
</div>
|
|
15383
15402
|
|
|
@@ -15393,11 +15412,12 @@ class AXMessageListEmptyDefaultComponent {
|
|
|
15393
15412
|
<h3 class="ax-message-empty__title">No messages yet</h3>
|
|
15394
15413
|
<p class="ax-message-empty__desc">
|
|
15395
15414
|
Start the {{ conversationKindLabel() }} {{ conversationPreposition() }}
|
|
15396
|
-
<span class="ax-message-empty__name">{{ conversation().title }}</span
|
|
15415
|
+
<span class="ax-message-empty__name">{{ conversation().title }}</span
|
|
15416
|
+
>.
|
|
15397
15417
|
</p>
|
|
15398
15418
|
</div>
|
|
15399
15419
|
</div>
|
|
15400
|
-
`, isInline: true, styles: [":host.ax-message-empty-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-empty{position:relative;isolation:isolate;padding:.25rem}.ax-message-empty__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-
|
|
15420
|
+
`, isInline: true, styles: [":host.ax-message-empty-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-empty{position:relative;isolation:isolate;padding:.25rem}.ax-message-empty__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-empty__grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-empty__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55));box-shadow:0 0 0 1px rgba(var(--ax-sys-color-on-surface),.03) inset,0 24px 48px -28px rgba(var(--ax-sys-color-on-surface),.18);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:ax-empty-card-in .65s cubic-bezier(.22,1,.36,1) both}.ax-message-empty__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-empty__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),rgba(var(--ax-sys-color-primary-500),0) 70%);animation:ax-empty-pulse 3.2s ease-in-out infinite}.ax-message-empty__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22);box-shadow:0 1px rgba(var(--ax-sys-color-on-primary-surface),.06) inset,0 12px 28px -16px rgba(var(--ax-sys-color-primary-600),.45)}.ax-message-empty__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-empty__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-empty__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-empty__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}.ax-message-empty__name{font-weight:600;color:rgb(var(--ax-sys-color-on-surface));opacity:.88}@keyframes ax-empty-card-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ax-empty-float{0%,to{transform:translate(0) scale(1)}50%{transform:translate(4%,6%) scale(1.05)}}@keyframes ax-empty-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media (prefers-reduced-motion: reduce){.ax-message-empty__pulse,.ax-message-empty__card{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
15401
15421
|
}
|
|
15402
15422
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListEmptyDefaultComponent, decorators: [{
|
|
15403
15423
|
type: Component,
|
|
@@ -15406,8 +15426,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
15406
15426
|
}, template: `
|
|
15407
15427
|
<div class="ax-message-empty" role="status" aria-label="No messages in this conversation">
|
|
15408
15428
|
<div class="ax-message-empty__ambient" aria-hidden="true">
|
|
15409
|
-
<span class="ax-message-empty__orb ax-message-empty__orb--a"></span>
|
|
15410
|
-
<span class="ax-message-empty__orb ax-message-empty__orb--b"></span>
|
|
15411
15429
|
<span class="ax-message-empty__grid"></span>
|
|
15412
15430
|
</div>
|
|
15413
15431
|
|
|
@@ -15423,11 +15441,66 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
15423
15441
|
<h3 class="ax-message-empty__title">No messages yet</h3>
|
|
15424
15442
|
<p class="ax-message-empty__desc">
|
|
15425
15443
|
Start the {{ conversationKindLabel() }} {{ conversationPreposition() }}
|
|
15426
|
-
<span class="ax-message-empty__name">{{ conversation().title }}</span
|
|
15444
|
+
<span class="ax-message-empty__name">{{ conversation().title }}</span
|
|
15445
|
+
>.
|
|
15427
15446
|
</p>
|
|
15428
15447
|
</div>
|
|
15429
15448
|
</div>
|
|
15430
|
-
`, styles: [":host.ax-message-empty-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-empty{position:relative;isolation:isolate;padding:.25rem}.ax-message-empty__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-
|
|
15449
|
+
`, styles: [":host.ax-message-empty-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-empty{position:relative;isolation:isolate;padding:.25rem}.ax-message-empty__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-empty__grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-empty__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55));box-shadow:0 0 0 1px rgba(var(--ax-sys-color-on-surface),.03) inset,0 24px 48px -28px rgba(var(--ax-sys-color-on-surface),.18);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:ax-empty-card-in .65s cubic-bezier(.22,1,.36,1) both}.ax-message-empty__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-empty__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),rgba(var(--ax-sys-color-primary-500),0) 70%);animation:ax-empty-pulse 3.2s ease-in-out infinite}.ax-message-empty__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22);box-shadow:0 1px rgba(var(--ax-sys-color-on-primary-surface),.06) inset,0 12px 28px -16px rgba(var(--ax-sys-color-primary-600),.45)}.ax-message-empty__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-empty__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-empty__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-empty__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}.ax-message-empty__name{font-weight:600;color:rgb(var(--ax-sys-color-on-surface));opacity:.88}@keyframes ax-empty-card-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ax-empty-float{0%,to{transform:translate(0) scale(1)}50%{transform:translate(4%,6%) scale(1.05)}}@keyframes ax-empty-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media (prefers-reduced-motion: reduce){.ax-message-empty__pulse,.ax-message-empty__card{animation:none}}\n"] }]
|
|
15450
|
+
}] });
|
|
15451
|
+
|
|
15452
|
+
/** Default message list surface when no conversation is selected and no `ax-conversation-message-list-no-active` content is projected. */
|
|
15453
|
+
class AXMessageListNoActiveDefaultComponent {
|
|
15454
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListNoActiveDefaultComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
15455
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.3", type: AXMessageListNoActiveDefaultComponent, isStandalone: true, selector: "ax-conversation-message-list-no-active-default", host: { classAttribute: "ax-message-no-active-host" }, ngImport: i0, template: `
|
|
15456
|
+
<div class="ax-message-no-active" role="status" aria-label="No conversation selected">
|
|
15457
|
+
<div class="ax-message-no-active__ambient" aria-hidden="true">
|
|
15458
|
+
<span class="ax-message-no-active__grid"></span>
|
|
15459
|
+
</div>
|
|
15460
|
+
|
|
15461
|
+
<div class="ax-message-no-active__card">
|
|
15462
|
+
<div class="ax-message-no-active__icon-stack">
|
|
15463
|
+
<span class="ax-message-no-active__pulse" aria-hidden="true"></span>
|
|
15464
|
+
<div class="ax-message-no-active__icon-bg">
|
|
15465
|
+
<i class="fa-light fa-comments" aria-hidden="true"></i>
|
|
15466
|
+
</div>
|
|
15467
|
+
</div>
|
|
15468
|
+
|
|
15469
|
+
<p class="ax-message-no-active__eyebrow">Your inbox</p>
|
|
15470
|
+
<h3 class="ax-message-no-active__title">No conversation open</h3>
|
|
15471
|
+
<p class="ax-message-no-active__desc">
|
|
15472
|
+
Select a chat from the list to read and send messages, or start a new one when you are ready.
|
|
15473
|
+
</p>
|
|
15474
|
+
</div>
|
|
15475
|
+
</div>
|
|
15476
|
+
`, isInline: true, styles: [":host.ax-message-no-active-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-no-active{position:relative;isolation:isolate;padding:.25rem}.ax-message-no-active__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-no-active__grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-no-active__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55));backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:ax-no-active-card-in .65s cubic-bezier(.22,1,.36,1) both}.ax-message-no-active__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-no-active__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),rgba(var(--ax-sys-color-primary-500),0) 70%);animation:ax-no-active-pulse 3.2s ease-in-out infinite}.ax-message-no-active__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22)}.ax-message-no-active__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-no-active__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-no-active__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-no-active__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}@keyframes ax-no-active-card-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ax-no-active-float{0%,to{transform:translate(0) scale(1)}50%{transform:translate(4%,6%) scale(1.05)}}@keyframes ax-no-active-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media (prefers-reduced-motion: reduce){.ax-message-no-active__pulse,.ax-message-no-active__card{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
15477
|
+
}
|
|
15478
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListNoActiveDefaultComponent, decorators: [{
|
|
15479
|
+
type: Component,
|
|
15480
|
+
args: [{ selector: 'ax-conversation-message-list-no-active-default', changeDetection: ChangeDetectionStrategy.OnPush, imports: [], host: {
|
|
15481
|
+
class: 'ax-message-no-active-host',
|
|
15482
|
+
}, template: `
|
|
15483
|
+
<div class="ax-message-no-active" role="status" aria-label="No conversation selected">
|
|
15484
|
+
<div class="ax-message-no-active__ambient" aria-hidden="true">
|
|
15485
|
+
<span class="ax-message-no-active__grid"></span>
|
|
15486
|
+
</div>
|
|
15487
|
+
|
|
15488
|
+
<div class="ax-message-no-active__card">
|
|
15489
|
+
<div class="ax-message-no-active__icon-stack">
|
|
15490
|
+
<span class="ax-message-no-active__pulse" aria-hidden="true"></span>
|
|
15491
|
+
<div class="ax-message-no-active__icon-bg">
|
|
15492
|
+
<i class="fa-light fa-comments" aria-hidden="true"></i>
|
|
15493
|
+
</div>
|
|
15494
|
+
</div>
|
|
15495
|
+
|
|
15496
|
+
<p class="ax-message-no-active__eyebrow">Your inbox</p>
|
|
15497
|
+
<h3 class="ax-message-no-active__title">No conversation open</h3>
|
|
15498
|
+
<p class="ax-message-no-active__desc">
|
|
15499
|
+
Select a chat from the list to read and send messages, or start a new one when you are ready.
|
|
15500
|
+
</p>
|
|
15501
|
+
</div>
|
|
15502
|
+
</div>
|
|
15503
|
+
`, styles: [":host.ax-message-no-active-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-no-active{position:relative;isolation:isolate;padding:.25rem}.ax-message-no-active__ambient{position:absolute;top:-2rem;right:-1rem;bottom:-1rem;left:-1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-no-active__grid{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-no-active__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55));backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:ax-no-active-card-in .65s cubic-bezier(.22,1,.36,1) both}.ax-message-no-active__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-no-active__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),rgba(var(--ax-sys-color-primary-500),0) 70%);animation:ax-no-active-pulse 3.2s ease-in-out infinite}.ax-message-no-active__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22)}.ax-message-no-active__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-no-active__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-no-active__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-no-active__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}@keyframes ax-no-active-card-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes ax-no-active-float{0%,to{transform:translate(0) scale(1)}50%{transform:translate(4%,6%) scale(1.05)}}@keyframes ax-no-active-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media (prefers-reduced-motion: reduce){.ax-message-no-active__pulse,.ax-message-no-active__card{animation:none}}\n"] }]
|
|
15431
15504
|
}] });
|
|
15432
15505
|
|
|
15433
15506
|
/**
|
|
@@ -15489,6 +15562,8 @@ class AXMessageListComponent {
|
|
|
15489
15562
|
this.conversationService = inject(AXConversationService);
|
|
15490
15563
|
this.messageListService = inject(AXMessageListService);
|
|
15491
15564
|
this.config = inject(CONVERSATION_CONFIG);
|
|
15565
|
+
/** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */
|
|
15566
|
+
this.noActiveFallbackComponent = AXMessageListNoActiveDefaultComponent;
|
|
15492
15567
|
/** Custom avatar template for message list items */
|
|
15493
15568
|
this.avatarTemplate = input(null, ...(ngDevMode ? [{ debugName: "avatarTemplate" }] : []));
|
|
15494
15569
|
// Timeout cleanup to prevent memory leaks
|
|
@@ -15500,6 +15575,8 @@ class AXMessageListComponent {
|
|
|
15500
15575
|
this.reactionPickerTarget = signal(null, ...(ngDevMode ? [{ debugName: "reactionPickerTarget" }] : []));
|
|
15501
15576
|
this.reactionPickerElement = signal(null, ...(ngDevMode ? [{ debugName: "reactionPickerElement" }] : []));
|
|
15502
15577
|
this.reactionPopover = viewChild('reactionPopover', ...(ngDevMode ? [{ debugName: "reactionPopover" }] : []));
|
|
15578
|
+
/** Message id whose context menu is open (for active row styling). */
|
|
15579
|
+
this.contextMenuMessageId = signal(null, ...(ngDevMode ? [{ debugName: "contextMenuMessageId" }] : []));
|
|
15503
15580
|
// Available reaction emojis from API
|
|
15504
15581
|
this.availableReactions = signal([], ...(ngDevMode ? [{ debugName: "availableReactions" }] : []));
|
|
15505
15582
|
/** Message list element reference */
|
|
@@ -15555,14 +15632,16 @@ class AXMessageListComponent {
|
|
|
15555
15632
|
const currentConversationId = conversation?.id || null;
|
|
15556
15633
|
// Use untracked to get previous ID without creating dependency
|
|
15557
15634
|
untracked(() => {
|
|
15635
|
+
if (currentConversationId !== previousConversationId) {
|
|
15636
|
+
this.contextMenuMessageId.set(null);
|
|
15637
|
+
}
|
|
15558
15638
|
// Only scroll if the conversation ID actually changed (not just updated)
|
|
15559
15639
|
if (currentConversationId && currentConversationId !== previousConversationId) {
|
|
15560
15640
|
// Reset pagination state for new conversation
|
|
15561
15641
|
this.messageListService.resetPagination();
|
|
15562
|
-
//
|
|
15563
|
-
|
|
15564
|
-
|
|
15565
|
-
}, 100);
|
|
15642
|
+
// Wait until the messages branch mounts (#messagesContainer) after loading, then scroll
|
|
15643
|
+
// after layout — avoids no-op scroll during loading and jitter vs the surface enter animation.
|
|
15644
|
+
queueMicrotask(() => this.scrollToBottomWhenContainerReady());
|
|
15566
15645
|
}
|
|
15567
15646
|
// Update previous ID
|
|
15568
15647
|
previousConversationId = currentConversationId;
|
|
@@ -15689,6 +15768,9 @@ class AXMessageListComponent {
|
|
|
15689
15768
|
if (this.isOwnMessage(message)) {
|
|
15690
15769
|
classes.push('message-own');
|
|
15691
15770
|
}
|
|
15771
|
+
if (this.contextMenuMessageId() === message.id) {
|
|
15772
|
+
classes.push('message-item-context-active');
|
|
15773
|
+
}
|
|
15692
15774
|
return classes.join(' ');
|
|
15693
15775
|
}
|
|
15694
15776
|
/** Get bubble CSS classes */
|
|
@@ -15961,6 +16043,29 @@ class AXMessageListComponent {
|
|
|
15961
16043
|
const isNearBottom = scrollHeight - scrollTop - clientHeight < this.config.scrollThreshold;
|
|
15962
16044
|
return isNearBottom;
|
|
15963
16045
|
}
|
|
16046
|
+
/**
|
|
16047
|
+
* After switching chats, the template may still show loading (no #messagesContainer).
|
|
16048
|
+
* Poll with rAF until the feed exists, then scroll after double rAF so scrollHeight is stable.
|
|
16049
|
+
*/
|
|
16050
|
+
scrollToBottomWhenContainerReady() {
|
|
16051
|
+
const maxAttempts = 120;
|
|
16052
|
+
let attempts = 0;
|
|
16053
|
+
const tick = () => {
|
|
16054
|
+
const el = this.messagesContainerRef()?.nativeElement;
|
|
16055
|
+
if (el) {
|
|
16056
|
+
requestAnimationFrame(() => {
|
|
16057
|
+
requestAnimationFrame(() => {
|
|
16058
|
+
this.scrollToBottom(false);
|
|
16059
|
+
});
|
|
16060
|
+
});
|
|
16061
|
+
return;
|
|
16062
|
+
}
|
|
16063
|
+
if (++attempts < maxAttempts) {
|
|
16064
|
+
requestAnimationFrame(tick);
|
|
16065
|
+
}
|
|
16066
|
+
};
|
|
16067
|
+
requestAnimationFrame(tick);
|
|
16068
|
+
}
|
|
15964
16069
|
/** Scroll to bottom */
|
|
15965
16070
|
scrollToBottom(smooth = true) {
|
|
15966
16071
|
const element = this.messagesContainerRef()?.nativeElement;
|
|
@@ -16065,6 +16170,7 @@ class AXMessageListComponent {
|
|
|
16065
16170
|
}
|
|
16066
16171
|
/** Handle context menu opening for messages */
|
|
16067
16172
|
handleMessageContextMenuOpening(event, message) {
|
|
16173
|
+
this.contextMenuMessageId.set(message.id);
|
|
16068
16174
|
const actions = this.getMessageActions(message);
|
|
16069
16175
|
const currentUser = this.currentUser();
|
|
16070
16176
|
if (!currentUser)
|
|
@@ -16082,6 +16188,7 @@ class AXMessageListComponent {
|
|
|
16082
16188
|
}
|
|
16083
16189
|
/** Handle context menu item click for messages */
|
|
16084
16190
|
handleMessageContextMenuItemClick(event, message) {
|
|
16191
|
+
this.contextMenuMessageId.set(null);
|
|
16085
16192
|
const action = event.item.data;
|
|
16086
16193
|
if (action) {
|
|
16087
16194
|
// Execute the action using message list service
|
|
@@ -16106,248 +16213,253 @@ class AXMessageListComponent {
|
|
|
16106
16213
|
}
|
|
16107
16214
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
16108
16215
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXMessageListComponent, isStandalone: true, selector: "ax-conversation-message-list", inputs: { avatarTemplate: { classPropertyName: "avatarTemplate", publicName: "avatarTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { messageAction: "messageAction" }, viewQueries: [{ propertyName: "reactionPopover", first: true, predicate: ["reactionPopover"], descendants: true, isSignal: true }, { propertyName: "messageListRef", first: true, predicate: ["messageList"], descendants: true, isSignal: true }, { propertyName: "messagesContainerRef", first: true, predicate: ["messagesContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
16109
|
-
@if (activeConversation()) {
|
|
16110
|
-
|
|
16111
|
-
|
|
16112
|
-
|
|
16113
|
-
|
|
16114
|
-
|
|
16115
|
-
|
|
16116
|
-
|
|
16117
|
-
|
|
16118
|
-
|
|
16119
|
-
|
|
16120
|
-
<
|
|
16121
|
-
|
|
16122
|
-
|
|
16123
|
-
|
|
16124
|
-
|
|
16125
|
-
<
|
|
16126
|
-
<ng-
|
|
16127
|
-
|
|
16128
|
-
|
|
16129
|
-
|
|
16130
|
-
|
|
16131
|
-
|
|
16132
|
-
|
|
16133
|
-
|
|
16134
|
-
|
|
16135
|
-
|
|
16136
|
-
|
|
16137
|
-
|
|
16138
|
-
|
|
16139
|
-
|
|
16140
|
-
|
|
16141
|
-
|
|
16142
|
-
|
|
16143
|
-
|
|
16144
|
-
|
|
16145
|
-
<
|
|
16146
|
-
|
|
16147
|
-
|
|
16148
|
-
|
|
16149
|
-
|
|
16150
|
-
|
|
16151
|
-
|
|
16152
|
-
<
|
|
16153
|
-
|
|
16216
|
+
@if (activeConversation(); as conv) {
|
|
16217
|
+
@for (cid of [conv.id]; track cid) {
|
|
16218
|
+
<div
|
|
16219
|
+
class="message-list message-list--conversation-surface"
|
|
16220
|
+
#messageList
|
|
16221
|
+
role="log"
|
|
16222
|
+
aria-label="Message list"
|
|
16223
|
+
aria-live="polite"
|
|
16224
|
+
[style.background]="messageListBackgroundStyle()"
|
|
16225
|
+
>
|
|
16226
|
+
@if (loading()) {
|
|
16227
|
+
<div class="list-loading" role="status" aria-label="Loading messages">
|
|
16228
|
+
<ax-loading></ax-loading>
|
|
16229
|
+
<ax-label>Loading messages...</ax-label>
|
|
16230
|
+
</div>
|
|
16231
|
+
} @else if (messages().length === 0) {
|
|
16232
|
+
<div class="list-empty" role="status" aria-label="No messages">
|
|
16233
|
+
<ng-content select="ax-conversation-message-list-empty, [ax-conversation-message-list-empty]">
|
|
16234
|
+
<ng-container
|
|
16235
|
+
*ngComponentOutlet="resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }"
|
|
16236
|
+
></ng-container>
|
|
16237
|
+
</ng-content>
|
|
16238
|
+
</div>
|
|
16239
|
+
} @else {
|
|
16240
|
+
<div
|
|
16241
|
+
class="messages-container"
|
|
16242
|
+
(scroll)="onScroll($event)"
|
|
16243
|
+
axInfiniteScroll
|
|
16244
|
+
[threshold]="config.infiniteScrollThreshold"
|
|
16245
|
+
[edge]="'top'"
|
|
16246
|
+
(scrollThreshold)="onScrollThreshold($event)"
|
|
16247
|
+
#messagesContainer
|
|
16248
|
+
role="feed"
|
|
16249
|
+
aria-label="Messages"
|
|
16250
|
+
>
|
|
16251
|
+
@if (loadingMore()) {
|
|
16252
|
+
<div class="list-loading-more" role="status" aria-label="Loading older messages">
|
|
16253
|
+
<ax-loading></ax-loading>
|
|
16254
|
+
<ax-label>Loading older messages...</ax-label>
|
|
16255
|
+
</div>
|
|
16256
|
+
}
|
|
16257
|
+
@for (group of messageGroups(); track trackMessageGroup($index, group)) {
|
|
16258
|
+
<!-- Date Separator -->
|
|
16259
|
+
<div class="date-separator" role="separator" [attr.aria-label]="'Messages from ' + group.dateLabel">
|
|
16260
|
+
<ax-badge [text]="group.dateLabel" class="date-text"></ax-badge>
|
|
16261
|
+
</div>
|
|
16154
16262
|
|
|
16155
|
-
|
|
16156
|
-
|
|
16157
|
-
|
|
16158
|
-
|
|
16159
|
-
|
|
16160
|
-
|
|
16161
|
-
|
|
16162
|
-
|
|
16163
|
-
|
|
16164
|
-
|
|
16165
|
-
|
|
16166
|
-
|
|
16167
|
-
|
|
16168
|
-
|
|
16169
|
-
|
|
16170
|
-
|
|
16171
|
-
|
|
16172
|
-
|
|
16173
|
-
|
|
16174
|
-
|
|
16175
|
-
|
|
16176
|
-
|
|
16263
|
+
<!-- Messages in this date group -->
|
|
16264
|
+
@for (message of group.messages; track trackMessage($index, message)) {
|
|
16265
|
+
<div
|
|
16266
|
+
[class]="getMessageClasses(message)"
|
|
16267
|
+
role="article"
|
|
16268
|
+
[attr.aria-label]="getMessageAriaLabel(message)"
|
|
16269
|
+
[id]="'message-' + message.id"
|
|
16270
|
+
>
|
|
16271
|
+
<!-- Avatar (only for group conversations and received messages) -->
|
|
16272
|
+
@if (shouldShowAvatar(message)) {
|
|
16273
|
+
<div class="message-avatar">
|
|
16274
|
+
@if (avatarTemplate()) {
|
|
16275
|
+
<ng-container
|
|
16276
|
+
*ngTemplateOutlet="
|
|
16277
|
+
avatarTemplate();
|
|
16278
|
+
context: {
|
|
16279
|
+
$implicit: message,
|
|
16280
|
+
size: 32,
|
|
16281
|
+
senderName: getSenderName(message),
|
|
16282
|
+
senderAvatar: getSenderAvatar(message),
|
|
16283
|
+
senderIcon: getSenderAvatarIcon(message),
|
|
16284
|
+
}
|
|
16285
|
+
"
|
|
16286
|
+
></ng-container>
|
|
16287
|
+
} @else {
|
|
16288
|
+
<ax-avatar [size]="32">
|
|
16289
|
+
@if (getSenderAvatar(message)) {
|
|
16290
|
+
<ax-image [src]="getSenderAvatar(message)!" [alt]="getSenderName(message)"></ax-image>
|
|
16291
|
+
} @else if (getSenderAvatarIcon(message)) {
|
|
16292
|
+
<ax-icon
|
|
16293
|
+
><i
|
|
16294
|
+
[class]="'message-avatar-icon ' + getSenderAvatarIcon(message)!"
|
|
16295
|
+
aria-hidden="true"
|
|
16296
|
+
></i
|
|
16297
|
+
></ax-icon>
|
|
16298
|
+
} @else {
|
|
16299
|
+
<ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>
|
|
16177
16300
|
}
|
|
16178
|
-
|
|
16179
|
-
|
|
16180
|
-
|
|
16181
|
-
|
|
16182
|
-
@if (getSenderAvatar(message)) {
|
|
16183
|
-
<ax-image [src]="getSenderAvatar(message)!" [alt]="getSenderName(message)"></ax-image>
|
|
16184
|
-
} @else if (getSenderAvatarIcon(message)) {
|
|
16185
|
-
<ax-icon
|
|
16186
|
-
><i
|
|
16187
|
-
[class]="'message-avatar-icon ' + getSenderAvatarIcon(message)!"
|
|
16188
|
-
aria-hidden="true"
|
|
16189
|
-
></i
|
|
16190
|
-
></ax-icon>
|
|
16191
|
-
} @else {
|
|
16192
|
-
<ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>
|
|
16193
|
-
}
|
|
16194
|
-
</ax-avatar>
|
|
16195
|
-
}
|
|
16196
|
-
</div>
|
|
16197
|
-
}
|
|
16301
|
+
</ax-avatar>
|
|
16302
|
+
}
|
|
16303
|
+
</div>
|
|
16304
|
+
}
|
|
16198
16305
|
|
|
16199
|
-
|
|
16200
|
-
|
|
16201
|
-
|
|
16202
|
-
|
|
16203
|
-
|
|
16204
|
-
|
|
16205
|
-
|
|
16206
|
-
|
|
16207
|
-
|
|
16208
|
-
|
|
16209
|
-
|
|
16306
|
+
<div class="message-content-row" [class.message-content-row-own]="isOwnMessage(message)">
|
|
16307
|
+
<button
|
|
16308
|
+
type="button"
|
|
16309
|
+
class="add-reaction-button add-reaction-outside"
|
|
16310
|
+
[class.add-reaction-visible]="reactionPickerTarget() === message.id"
|
|
16311
|
+
(click)="toggleReactionPicker(message.id, $event)"
|
|
16312
|
+
[attr.aria-label]="'Add reaction to message'"
|
|
16313
|
+
#reactionButton
|
|
16314
|
+
>
|
|
16315
|
+
<i class="fa-light fa-face-smile"></i>
|
|
16316
|
+
</button>
|
|
16210
16317
|
|
|
16211
|
-
<div
|
|
16212
|
-
class="message-bubble-container"
|
|
16213
|
-
[id]="'message-bubble-' + message.id"
|
|
16214
|
-
[attr.data-message-id]="message.id"
|
|
16215
|
-
>
|
|
16216
16318
|
<div
|
|
16217
|
-
|
|
16218
|
-
[
|
|
16219
|
-
[
|
|
16319
|
+
class="message-bubble-container"
|
|
16320
|
+
[id]="'message-bubble-' + message.id"
|
|
16321
|
+
[attr.data-message-id]="message.id"
|
|
16220
16322
|
>
|
|
16221
|
-
|
|
16222
|
-
|
|
16223
|
-
|
|
16224
|
-
|
|
16323
|
+
<div
|
|
16324
|
+
[class]="getBubbleClasses(message)"
|
|
16325
|
+
[class.message-bubble-sent]="message.senderId === currentUser()?.id"
|
|
16326
|
+
[class.message-bubble-received]="message.senderId !== currentUser()?.id"
|
|
16327
|
+
>
|
|
16328
|
+
<!-- Sender name (only for group conversations and received messages) -->
|
|
16329
|
+
@if (shouldShowSenderName(message)) {
|
|
16330
|
+
<div class="message-sender">{{ getSenderName(message) }}:</div>
|
|
16331
|
+
}
|
|
16225
16332
|
|
|
16226
|
-
|
|
16227
|
-
|
|
16228
|
-
|
|
16229
|
-
|
|
16230
|
-
|
|
16231
|
-
|
|
16232
|
-
|
|
16233
|
-
|
|
16234
|
-
|
|
16235
|
-
|
|
16236
|
-
|
|
16237
|
-
|
|
16238
|
-
|
|
16239
|
-
|
|
16240
|
-
|
|
16241
|
-
|
|
16242
|
-
|
|
16243
|
-
|
|
16244
|
-
|
|
16245
|
-
|
|
16246
|
-
|
|
16247
|
-
|
|
16248
|
-
|
|
16333
|
+
<!-- Reply Preview -->
|
|
16334
|
+
@if (message.replyTo) {
|
|
16335
|
+
<div
|
|
16336
|
+
class="reply-preview"
|
|
16337
|
+
(click)="scrollToMessage(message.replyTo.id)"
|
|
16338
|
+
role="button"
|
|
16339
|
+
[attr.aria-label]="'Reply to ' + getSenderName(message.replyTo)"
|
|
16340
|
+
(keydown.enter)="scrollToMessage(message.replyTo.id)"
|
|
16341
|
+
(keydown.space)="scrollToMessage(message.replyTo.id)"
|
|
16342
|
+
>
|
|
16343
|
+
<div class="reply-preview-content">
|
|
16344
|
+
<div class="reply-preview-sender">{{ getSenderName(message.replyTo) }}</div>
|
|
16345
|
+
<div class="reply-preview-text">
|
|
16346
|
+
@if (getMessagePreviewText(message.replyTo); as preview) {
|
|
16347
|
+
<span class="last-message">
|
|
16348
|
+
@if (preview.type !== 'text') {
|
|
16349
|
+
<i [class]="preview.icon"></i
|
|
16350
|
+
>{{ '@acorex:chat.' + preview.type | translate | async }}
|
|
16351
|
+
} @else {
|
|
16352
|
+
{{ preview.value }}
|
|
16353
|
+
}
|
|
16354
|
+
</span>
|
|
16355
|
+
}
|
|
16356
|
+
</div>
|
|
16249
16357
|
</div>
|
|
16250
16358
|
</div>
|
|
16251
|
-
|
|
16252
|
-
}
|
|
16253
|
-
|
|
16254
|
-
<!-- Forwarded Indicator -->
|
|
16255
|
-
@if (message.forwarded) {
|
|
16256
|
-
<div class="forwarded-preview">
|
|
16257
|
-
<i class="fa-solid fa-share"></i>
|
|
16258
|
-
<span class="forwarded-text">{{ getForwardedText(message) }}</span>
|
|
16259
|
-
</div>
|
|
16260
|
-
}
|
|
16359
|
+
}
|
|
16261
16360
|
|
|
16262
|
-
|
|
16263
|
-
|
|
16264
|
-
|
|
16265
|
-
|
|
16266
|
-
|
|
16267
|
-
<div class="message-reactions-container">
|
|
16268
|
-
<div class="message-reactions-bubbles">
|
|
16269
|
-
@for (reaction of getGroupedReactions(message); track reaction.emoji) {
|
|
16270
|
-
<button
|
|
16271
|
-
type="button"
|
|
16272
|
-
class="reaction-bubble"
|
|
16273
|
-
[class.reaction-bubble-active]="reaction.hasReacted"
|
|
16274
|
-
(click)="onReactionClick(message, reaction.emoji)"
|
|
16275
|
-
[attr.aria-label]="reaction.emoji + ' ' + reaction.count"
|
|
16276
|
-
>
|
|
16277
|
-
<span class="reaction-emoji">{{ reaction.emoji }}</span>
|
|
16278
|
-
@if (reaction.count > 1) {
|
|
16279
|
-
<span class="reaction-count">{{ reaction.count }}</span>
|
|
16280
|
-
}
|
|
16281
|
-
</button>
|
|
16282
|
-
}
|
|
16361
|
+
<!-- Forwarded Indicator -->
|
|
16362
|
+
@if (message.forwarded) {
|
|
16363
|
+
<div class="forwarded-preview">
|
|
16364
|
+
<i class="fa-solid fa-share"></i>
|
|
16365
|
+
<span class="forwarded-text">{{ getForwardedText(message) }}</span>
|
|
16283
16366
|
</div>
|
|
16284
|
-
</div>
|
|
16285
|
-
}
|
|
16286
|
-
|
|
16287
|
-
<!-- Message Footer -->
|
|
16288
|
-
<div class="message-footer">
|
|
16289
|
-
@if (getReplyCount(message) > 0) {
|
|
16290
|
-
<span class="message-footer-count" [attr.aria-label]="getReplyCount(message) + ' replies'">
|
|
16291
|
-
<i class="fa-solid fa-message" aria-hidden="true"></i>
|
|
16292
|
-
<span class="message-footer-count-value">{{ getReplyCount(message) }}</span>
|
|
16293
|
-
</span>
|
|
16294
|
-
}
|
|
16295
|
-
@if (getForwardCount(message) > 0) {
|
|
16296
|
-
<span
|
|
16297
|
-
class="message-footer-count"
|
|
16298
|
-
[attr.aria-label]="getForwardCount(message) + ' forwards'"
|
|
16299
|
-
>
|
|
16300
|
-
<i class="fa-solid fa-share" aria-hidden="true"></i>
|
|
16301
|
-
<span class="message-footer-count-value">{{ getForwardCount(message) }}</span>
|
|
16302
|
-
</span>
|
|
16303
|
-
}
|
|
16304
|
-
@if (getReplyCount(message) > 0 || getForwardCount(message) > 0) {
|
|
16305
|
-
<span class="message-footer-split" aria-hidden="true"></span>
|
|
16306
|
-
}
|
|
16307
|
-
<span class="message-time">{{ message.timestamp | format: 'timeleft' | async }}</span>
|
|
16308
|
-
@if (message.editedAt) {
|
|
16309
|
-
<span class="edited-indicator">
|
|
16310
|
-
<span>Edited</span>
|
|
16311
|
-
</span>
|
|
16312
16367
|
}
|
|
16313
|
-
|
|
16314
|
-
|
|
16315
|
-
|
|
16316
|
-
|
|
16368
|
+
|
|
16369
|
+
<ng-container
|
|
16370
|
+
*ngComponentOutlet="getRendererComponent(message); inputs: getRendererInputs(message)"
|
|
16371
|
+
></ng-container>
|
|
16372
|
+
|
|
16373
|
+
@if (message.reactions.length > 0) {
|
|
16374
|
+
<div class="message-reactions-container">
|
|
16375
|
+
<div class="message-reactions-bubbles">
|
|
16376
|
+
@for (reaction of getGroupedReactions(message); track reaction.emoji) {
|
|
16377
|
+
<button
|
|
16378
|
+
type="button"
|
|
16379
|
+
class="reaction-bubble"
|
|
16380
|
+
[class.reaction-bubble-active]="reaction.hasReacted"
|
|
16381
|
+
(click)="onReactionClick(message, reaction.emoji)"
|
|
16382
|
+
[attr.aria-label]="reaction.emoji + ' ' + reaction.count"
|
|
16383
|
+
>
|
|
16384
|
+
<span class="reaction-emoji">{{ reaction.emoji }}</span>
|
|
16385
|
+
@if (reaction.count > 1) {
|
|
16386
|
+
<span class="reaction-count">{{ reaction.count }}</span>
|
|
16387
|
+
}
|
|
16388
|
+
</button>
|
|
16389
|
+
}
|
|
16390
|
+
</div>
|
|
16391
|
+
</div>
|
|
16317
16392
|
}
|
|
16393
|
+
|
|
16394
|
+
<!-- Message Footer -->
|
|
16395
|
+
<div class="message-footer">
|
|
16396
|
+
@if (getReplyCount(message) > 0) {
|
|
16397
|
+
<span
|
|
16398
|
+
class="message-footer-count"
|
|
16399
|
+
[attr.aria-label]="getReplyCount(message) + ' replies'"
|
|
16400
|
+
>
|
|
16401
|
+
<i class="fa-solid fa-message" aria-hidden="true"></i>
|
|
16402
|
+
<span class="message-footer-count-value">{{ getReplyCount(message) }}</span>
|
|
16403
|
+
</span>
|
|
16404
|
+
}
|
|
16405
|
+
@if (getForwardCount(message) > 0) {
|
|
16406
|
+
<span
|
|
16407
|
+
class="message-footer-count"
|
|
16408
|
+
[attr.aria-label]="getForwardCount(message) + ' forwards'"
|
|
16409
|
+
>
|
|
16410
|
+
<i class="fa-solid fa-share" aria-hidden="true"></i>
|
|
16411
|
+
<span class="message-footer-count-value">{{ getForwardCount(message) }}</span>
|
|
16412
|
+
</span>
|
|
16413
|
+
}
|
|
16414
|
+
@if (getReplyCount(message) > 0 || getForwardCount(message) > 0) {
|
|
16415
|
+
<span class="message-footer-split" aria-hidden="true"></span>
|
|
16416
|
+
}
|
|
16417
|
+
<span class="message-time">{{ message.timestamp | format: 'timeleft' | async }}</span>
|
|
16418
|
+
@if (message.editedAt) {
|
|
16419
|
+
<span class="edited-indicator">
|
|
16420
|
+
<span>Edited</span>
|
|
16421
|
+
</span>
|
|
16422
|
+
}
|
|
16423
|
+
@if (isOwnMessage(message)) {
|
|
16424
|
+
<span [class]="getStatusIconClasses(message)">
|
|
16425
|
+
<ax-icon><i [class]="getStatusIcon(message)"></i></ax-icon>
|
|
16426
|
+
</span>
|
|
16427
|
+
}
|
|
16428
|
+
</div>
|
|
16318
16429
|
</div>
|
|
16319
16430
|
</div>
|
|
16320
16431
|
</div>
|
|
16321
|
-
</div>
|
|
16322
16432
|
|
|
16323
|
-
|
|
16324
|
-
|
|
16325
|
-
|
|
16326
|
-
|
|
16327
|
-
|
|
16328
|
-
|
|
16329
|
-
|
|
16330
|
-
|
|
16331
|
-
|
|
16332
|
-
|
|
16433
|
+
<!-- Context Menu for Message Actions -->
|
|
16434
|
+
<ax-context-menu
|
|
16435
|
+
[target]="'#message-bubble-' + message.id"
|
|
16436
|
+
[openOn]="'click'"
|
|
16437
|
+
[closeOn]="'click'"
|
|
16438
|
+
(onOpening)="handleMessageContextMenuOpening($event, message)"
|
|
16439
|
+
(onClose)="contextMenuMessageId.set(null)"
|
|
16440
|
+
(onItemClick)="handleMessageContextMenuItemClick($event, message)"
|
|
16441
|
+
>
|
|
16442
|
+
</ax-context-menu>
|
|
16443
|
+
</div>
|
|
16444
|
+
}
|
|
16333
16445
|
}
|
|
16334
|
-
|
|
16335
|
-
</div>
|
|
16446
|
+
</div>
|
|
16336
16447
|
|
|
16337
|
-
|
|
16338
|
-
|
|
16339
|
-
|
|
16340
|
-
|
|
16341
|
-
|
|
16342
|
-
|
|
16343
|
-
|
|
16344
|
-
|
|
16345
|
-
|
|
16346
|
-
|
|
16347
|
-
|
|
16448
|
+
<!-- Scroll to Bottom Button -->
|
|
16449
|
+
@if (showScrollButton()) {
|
|
16450
|
+
<ax-button
|
|
16451
|
+
class="scroll-to-bottom"
|
|
16452
|
+
(onClick)="scrollToBottom()"
|
|
16453
|
+
animate.enter="slide-in"
|
|
16454
|
+
animate.leave="slide-out"
|
|
16455
|
+
[text]="'↓'"
|
|
16456
|
+
[look]="'solid'"
|
|
16457
|
+
aria-label="Scroll to bottom of messages"
|
|
16458
|
+
></ax-button>
|
|
16459
|
+
}
|
|
16348
16460
|
}
|
|
16349
|
-
|
|
16350
|
-
|
|
16461
|
+
</div>
|
|
16462
|
+
}
|
|
16351
16463
|
|
|
16352
16464
|
<!-- Reaction Picker Popover -->
|
|
16353
16465
|
@if (reactionPickerTarget()) {
|
|
@@ -16382,8 +16494,16 @@ class AXMessageListComponent {
|
|
|
16382
16494
|
</div>
|
|
16383
16495
|
</ax-popover>
|
|
16384
16496
|
}
|
|
16497
|
+
} @else {
|
|
16498
|
+
<div class="message-list message-list--no-active" role="region" aria-label="No conversation selected">
|
|
16499
|
+
<div class="list-no-active">
|
|
16500
|
+
<ng-content select="ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]">
|
|
16501
|
+
<ng-container *ngComponentOutlet="noActiveFallbackComponent"></ng-container>
|
|
16502
|
+
</ng-content>
|
|
16503
|
+
</div>
|
|
16504
|
+
</div>
|
|
16385
16505
|
}
|
|
16386
|
-
`, isInline: true, styles: [":host{display:block;height:100%;position:relative}.message-list{height:100%}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;padding:3rem 2rem;gap:1.25rem;animation:fadeInUp .5s ease-out}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.empty-icon{font-size:5.5rem;line-height:1;opacity:.35;margin-bottom:.5rem;filter:grayscale(.2)}.empty-title{font-size:1.625rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface));letter-spacing:-.02em}.empty-description{font-size:1.0625rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;max-width:420px;line-height:1.7}.spinner{width:32px;height:32px;border:3px solid rgb(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));border-radius:50%;animation:spin .8s linear infinite;margin-bottom:1rem}@keyframes spin{to{transform:rotate(360deg)}}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.messages-container{width:100%;height:100%;overflow-y:auto;overflow-x:hidden}.date-separator{position:sticky;z-index:150;top:0;display:flex;align-items:center;justify-content:center;padding:.5rem 0}.date-text{padding:.25rem .75rem;background:rgb(var(--ax-sys-color-lighter-surface));font-size:.75rem;font-weight:500;border-radius:1rem;width:7rem;display:flex;justify-content:center;align-items:center}.unread-separator{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;padding:0 1rem}.unread-separator-line{flex:1;height:1px;background:rgb(var(--ax-sys-color-primary-500));opacity:.3}.unread-separator-text{font-size:.75rem;font-weight:600;color:rgb(var(--ax-sys-color-primary-500));text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}.message-item{position:relative;display:flex;padding:.5rem 1rem;gap:.5rem;line-height:1rem;align-items:end;transition:background-color .3s ease}.message-highlight{background-color:rgba(var(--ax-sys-color-primary-500),.1);border-radius:.5rem}.fade-slide-in{animation:fadeSlideIn var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes fadeSlideIn{0%{opacity:0;// transform: translateX(20%)}to{opacity:1;// transform: translateX(0)}}.message-own{flex-direction:row-reverse}.message-avatar{flex-shrink:0}.message-avatar-icon{font-size:1rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.message-content-row{display:flex;flex-direction:row;align-items:flex-end;max-width:70%;min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}.message-content-row-own{justify-content:flex-end}.message-item:not(.message-own) .message-content-row{justify-content:flex-start}.message-bubble-container{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;max-width:100%;position:relative}.message-own .message-bubble-container{align-items:flex-end}.message-sender{font-size:.75rem;font-weight:600;margin-bottom:.1rem}.message-bubble{position:relative;display:flex;flex-direction:column;padding:.5rem .5rem .1rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));word-wrap:break-word;transition:background-color .3s ease}.reply-preview{padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .reply-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .reply-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.reply-preview-line{width:3px;background:currentColor;opacity:.5;border-radius:1.5px;flex-shrink:0}.reply-preview-content{flex:1;min-width:0}.reply-preview-sender{font-size:.75rem;font-weight:600;margin-bottom:.125rem;color:rgb(var(--ax-sys-color-primary-600))}.reply-preview-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.message-own .reply-preview-sender{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .reply-preview-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.last-message{display:flex;align-items:center;gap:.25rem}.forwarded-preview{display:flex;align-items:center;gap:.375rem;padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .forwarded-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .forwarded-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.forwarded-preview i{font-size:.8125rem;flex-shrink:0;color:rgb(var(--ax-sys-color-primary-600))}.forwarded-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.message-own .forwarded-preview i{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .forwarded-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.message-bubble-received{border-bottom-left-radius:.125rem}.message-bubble-received:before{content:\"\";display:block;background:rgb(var(--ax-sys-color-lightest-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;left:-.7rem;border-top-left-radius:86%;corner-shape:scoop}.message-bubble-sent{border-bottom-right-radius:.125rem}.message-bubble-sent:after{content:\"\";display:block;background:rgb(var(--ax-sys-color-primary-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;right:-.7rem;border-top-right-radius:86%;corner-shape:scoop}.message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.message-content{font-size:.9375rem;line-height:1.5;white-space:pre-wrap}.message-footer{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;padding-inline-start:.25rem;margin-top:.1rem;gap:.25rem;font-size:.6875rem;opacity:.7;letter-spacing:.05rem;-webkit-user-select:none;user-select:none}.message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-variant-numeric:tabular-nums;font-size:.675rem}.message-footer-count i{font-size:.625rem;opacity:.9}.message-footer-count-value{font-weight:600}.message-footer-split{flex-shrink:0;align-self:center;width:1px;height:.65rem;background:rgb(var(--ax-sys-color-border-light-surface));opacity:.9;margin-inline:.2rem}.message-time{font-variant-numeric:tabular-nums;font-size:.675rem}.edited-indicator{display:inline-flex;align-items:center;gap:.25rem;font-size:.675rem;opacity:.75;padding-inline-start:.35rem;border-inline-start:1px solid rgb(var(--ax-sys-color-border-light-surface))}.status-icon{display:inline-flex;align-items:center}.status-icon i{font-size:.75rem}.status-read{color:rgb(var(--ax-sys-color-primary-200))}.status-failed{color:rgb(var(--ax-sys-color-danger-200))}.message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}.reaction-bubble{display:inline-flex;align-items:center;justify-content:center;gap:.15rem;min-height:1.375rem;padding:.1rem .35rem;margin:0;background:rgba(var(--ax-sys-color-on-surface),.06);color:rgb(var(--ax-sys-color-on-surface));border:1px solid rgba(var(--ax-sys-color-on-surface),.1);border-radius:.75rem;box-shadow:none;cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}.reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}.reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}.reaction-emoji{font-size:.8125rem;line-height:1;display:inline-block}.reaction-count{font-size:.6875rem;font-weight:500;font-variant-numeric:tabular-nums;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;line-height:1}.reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-primary-600));opacity:.95;font-weight:600}.message-own .reaction-bubble{background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2);color:rgb(var(--ax-sys-color-on-primary-surface))}.message-own .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.2);border-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}.message-own .reaction-bubble-active{background:rgba(var(--ax-sys-color-on-primary-surface),.28);border-color:rgba(var(--ax-sys-color-on-primary-surface),.5)}.message-own .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.34);border-color:rgba(var(--ax-sys-color-on-primary-surface),.6)}.message-own .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.8}.message-own .reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:1}.message-reactions-container{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:.2rem;margin-top:.25rem;justify-content:flex-start}.message-own .message-reactions-container{justify-content:flex-end}.add-reaction-button.add-reaction-outside{display:none;position:absolute;top:50%;inset-inline-end:-2.25rem;transform:translateY(-50%);align-items:center;justify-content:center;box-sizing:border-box;width:1.8rem;height:1.8rem;padding:0;margin:0;border-radius:50%;cursor:pointer;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));box-shadow:0 1px 2px #0000000f}.add-reaction-button{padding-inline-start:.05rem}.message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-2.25rem;inset-inline-end:auto}.message-item:hover .add-reaction-button.add-reaction-outside,.add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}.add-reaction-button.add-reaction-outside:hover,.add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgb(var(--ax-sys-color-primary-500))}.add-reaction-button.add-reaction-outside i{font-size:.9rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.8}.reaction-picker-popup{position:fixed;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:.65rem;z-index:100;min-width:auto;width:max-content;max-width:min(260px,92vw);box-shadow:0 4px 16px #0000001a;transform:translateY(-100%);margin-top:-.35rem;overflow:hidden}.reaction-picker-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.45rem .5rem .45rem .7rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));min-height:0}.picker-title{font-size:.8125rem;font-weight:600;letter-spacing:.02em;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.picker-close{display:flex;align-items:center;justify-content:center;width:1.6rem;height:1.6rem;padding:0;background:transparent;border:none;border-radius:.25rem;cursor:pointer;font-size:.95rem;color:rgba(var(--ax-sys-color-on-surface),.55);transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.picker-close:hover{background:rgba(var(--ax-sys-color-danger-500),.1);color:rgb(var(--ax-sys-color-danger-500))}.reaction-bubble:focus-visible,.add-reaction-button:focus-visible,.picker-close:focus-visible,.reaction-picker-emoji:focus-visible,.action-trigger:focus-visible,.scroll-to-bottom:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}.reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,1fr);gap:.2rem;padding:.45rem .5rem .5rem}.reaction-picker-emoji{width:2rem;height:2rem;padding:0;background:transparent;border:1px solid transparent;border-radius:.45rem;font-size:1.15rem;line-height:1;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-picker-emoji:hover{// transform: scale(1.15);background:rgb(var(--ax-sys-color-lighter-surface))}.reaction-picker-emoji-active{background:rgb(var(--ax-sys-color-surface))}.reaction-picker-emoji-active:hover{background:rgba(var(--ax-sys-color-primary-500),.25)}.message-actions{padding-bottom:1.5rem;opacity:0;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:10}.message-item:hover .message-actions{opacity:1}.action-trigger{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:var(--ax-sys-border-radius);font-size:.875rem;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.action-trigger:hover{background:rgb(var(--ax-sys-color-light-surface));// transform: scale(1.05)}.shortcut{font-size:.6875rem;opacity:.7}.scroll-to-bottom{position:absolute;bottom:1rem;right:1rem;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));border:none;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:999}.scroll-to-bottom:hover{// transform: scale(1.1)}.slide-in{animation:slideInFromBottom var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.slide-out{opacity:0;transform:translateY(100%);transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.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: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i6.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }, { kind: "pipe", type: i6$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
16506
|
+
`, isInline: true, styles: [":host{display:block;height:100%;position:relative}.message-list{height:100%}.message-list--conversation-surface{animation:axConversationSurfaceIn .36s cubic-bezier(.22,1,.36,1) both}@keyframes axConversationSurfaceIn{0%{opacity:0}to{opacity:1}}@media (prefers-reduced-motion: reduce){.message-list--conversation-surface{animation:axConversationSurfaceInReduced .18s ease both}}@keyframes axConversationSurfaceInReduced{0%{opacity:.92}to{opacity:1}}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;padding:3rem 2rem;gap:1.25rem;animation:fadeInUp .5s ease-out}.message-list--no-active{height:100%}.list-no-active{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:12rem}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.empty-icon{font-size:5.5rem;line-height:1;opacity:.35;margin-bottom:.5rem;filter:grayscale(.2)}.empty-title{font-size:1.625rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface));letter-spacing:-.02em}.empty-description{font-size:1.0625rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;max-width:420px;line-height:1.7}.spinner{width:32px;height:32px;border:3px solid rgb(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));border-radius:50%;animation:spin .8s linear infinite;margin-bottom:1rem}@keyframes spin{to{transform:rotate(360deg)}}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.messages-container{width:100%;height:100%;overflow-y:auto;overflow-x:hidden}.date-separator{position:sticky;z-index:150;top:0;display:flex;align-items:center;justify-content:center;padding:.5rem 0}.date-text{padding:.25rem .75rem;background:rgb(var(--ax-sys-color-lighter-surface));font-size:.75rem;font-weight:500;border-radius:1rem;width:7rem;display:flex;justify-content:center;align-items:center}.unread-separator{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;padding:0 1rem}.unread-separator-line{flex:1;height:1px;background:rgb(var(--ax-sys-color-primary-500));opacity:.3}.unread-separator-text{font-size:.75rem;font-weight:600;color:rgb(var(--ax-sys-color-primary-500));text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}.message-item{position:relative;display:flex;padding:.5rem 1rem;gap:.5rem;line-height:1rem;align-items:end;transition:background-color .3s ease}.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.09);border-radius:.5rem;box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.22)}.message-own.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.12)}.message-highlight{background-color:rgba(var(--ax-sys-color-primary-500),.1);border-radius:.5rem}.message-own{flex-direction:row-reverse}.message-avatar{flex-shrink:0}.message-avatar-icon{font-size:1rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.message-content-row{display:flex;flex-direction:row;align-items:flex-end;max-width:70%;min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}.message-content-row-own{justify-content:flex-end}.message-item:not(.message-own) .message-content-row{justify-content:flex-start}.message-bubble-container{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;max-width:100%;position:relative}.message-own .message-bubble-container{align-items:flex-end}.message-sender{font-size:.75rem;font-weight:600;margin-bottom:.1rem}.message-bubble{position:relative;display:flex;flex-direction:column;padding:.5rem .5rem .1rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));word-wrap:break-word;transition:background-color .3s ease}.reply-preview{padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .reply-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .reply-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.reply-preview-line{width:3px;background:currentColor;opacity:.5;border-radius:1.5px;flex-shrink:0}.reply-preview-content{flex:1;min-width:0}.reply-preview-sender{font-size:.75rem;font-weight:600;margin-bottom:.125rem;color:rgb(var(--ax-sys-color-primary-600))}.reply-preview-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.message-own .reply-preview-sender{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .reply-preview-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.last-message{display:flex;align-items:center;gap:.25rem}.forwarded-preview{display:flex;align-items:center;gap:.375rem;padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .forwarded-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .forwarded-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.forwarded-preview i{font-size:.8125rem;flex-shrink:0;color:rgb(var(--ax-sys-color-primary-600))}.forwarded-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.message-own .forwarded-preview i{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .forwarded-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.message-bubble-received{border-bottom-left-radius:.125rem}.message-bubble-received:before{content:\"\";display:block;background:rgb(var(--ax-sys-color-lightest-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;left:-.7rem;border-top-left-radius:86%;corner-shape:scoop}.message-bubble-sent{border-bottom-right-radius:.125rem}.message-bubble-sent:after{content:\"\";display:block;background:rgb(var(--ax-sys-color-primary-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;right:-.7rem;border-top-right-radius:86%;corner-shape:scoop}.message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.message-content{font-size:.9375rem;line-height:1.5;white-space:pre-wrap}.message-footer{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;padding-inline-start:.25rem;margin-top:.1rem;gap:.25rem;font-size:.6875rem;opacity:.7;letter-spacing:.05rem;-webkit-user-select:none;user-select:none}.message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-variant-numeric:tabular-nums;font-size:.675rem}.message-footer-count i{font-size:.625rem;opacity:.9}.message-footer-count-value{font-weight:600}.message-footer-split{flex-shrink:0;align-self:center;width:1px;height:.65rem;background:rgb(var(--ax-sys-color-border-light-surface));opacity:.9;margin-inline:.2rem}.message-time{font-variant-numeric:tabular-nums;font-size:.675rem}.edited-indicator{display:inline-flex;align-items:center;gap:.25rem;font-size:.675rem;opacity:.75;padding-inline-start:.35rem;border-inline-start:1px solid rgb(var(--ax-sys-color-border-light-surface))}.status-icon{display:inline-flex;align-items:center}.status-icon i{font-size:.75rem}.status-read{color:rgb(var(--ax-sys-color-primary-200))}.status-failed{color:rgb(var(--ax-sys-color-danger-200))}.message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}.reaction-bubble{display:inline-flex;align-items:center;justify-content:center;gap:.15rem;min-height:1.375rem;padding:.1rem .35rem;margin:0;background:rgba(var(--ax-sys-color-on-surface),.06);color:rgb(var(--ax-sys-color-on-surface));border:1px solid rgba(var(--ax-sys-color-on-surface),.1);border-radius:.75rem;box-shadow:none;cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}.reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}.reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}.reaction-emoji{font-size:.8125rem;line-height:1;display:inline-block}.reaction-count{font-size:.6875rem;font-weight:500;font-variant-numeric:tabular-nums;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;line-height:1}.reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-primary-600));opacity:.95;font-weight:600}.message-own .reaction-bubble{background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2);color:rgb(var(--ax-sys-color-on-primary-surface))}.message-own .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.2);border-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}.message-own .reaction-bubble-active{background:rgba(var(--ax-sys-color-on-primary-surface),.28);border-color:rgba(var(--ax-sys-color-on-primary-surface),.5)}.message-own .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.34);border-color:rgba(var(--ax-sys-color-on-primary-surface),.6)}.message-own .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.8}.message-own .reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:1}.message-reactions-container{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:.2rem;margin-top:.25rem;justify-content:flex-start}// .message-own .message-reactions-container{// justify-content: flex-end;//}.add-reaction-button.add-reaction-outside{display:none;position:absolute;top:50%;inset-inline-end:-2.25rem;transform:translateY(-50%);align-items:center;justify-content:center;box-sizing:border-box;width:1.8rem;height:1.8rem;padding:0;margin:0;border-radius:50%;cursor:pointer;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));box-shadow:0 1px 2px #0000000f}.add-reaction-button{padding-inline-start:.05rem}.message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-2.25rem;inset-inline-end:auto}.message-item:hover .add-reaction-button.add-reaction-outside,.add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}.add-reaction-button.add-reaction-outside:hover,.add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgb(var(--ax-sys-color-primary-500))}.add-reaction-button.add-reaction-outside i{font-size:.9rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.8}.reaction-picker-popup{position:fixed;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:.65rem;z-index:100;min-width:auto;width:max-content;max-width:min(260px,92vw);box-shadow:0 4px 16px #0000001a;transform:translateY(-100%);margin-top:-.35rem;overflow:hidden}.reaction-picker-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.45rem .5rem .45rem .7rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));min-height:0}.picker-title{font-size:.8125rem;font-weight:600;letter-spacing:.02em;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.picker-close{display:flex;align-items:center;justify-content:center;width:1.6rem;height:1.6rem;padding:0;background:transparent;border:none;border-radius:.25rem;cursor:pointer;font-size:.95rem;color:rgba(var(--ax-sys-color-on-surface),.55);transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.picker-close:hover{background:rgba(var(--ax-sys-color-danger-500),.1);color:rgb(var(--ax-sys-color-danger-500))}.reaction-bubble:focus-visible,.add-reaction-button:focus-visible,.picker-close:focus-visible,.reaction-picker-emoji:focus-visible,.action-trigger:focus-visible,.scroll-to-bottom:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}.reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,1fr);gap:.2rem;padding:.45rem .5rem .5rem}.reaction-picker-emoji{width:2rem;height:2rem;padding:0;background:transparent;border:1px solid transparent;border-radius:.45rem;font-size:1.15rem;line-height:1;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-picker-emoji:hover{// transform: scale(1.15);background:rgb(var(--ax-sys-color-lighter-surface))}.reaction-picker-emoji-active{background:rgb(var(--ax-sys-color-surface))}.reaction-picker-emoji-active:hover{background:rgba(var(--ax-sys-color-primary-500),.25)}.message-actions{padding-bottom:1.5rem;opacity:0;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:10}.message-item:hover .message-actions{opacity:1}.action-trigger{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:var(--ax-sys-border-radius);font-size:.875rem;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.action-trigger:hover{background:rgb(var(--ax-sys-color-light-surface));// transform: scale(1.05)}.shortcut{font-size:.6875rem;opacity:.7}.scroll-to-bottom{position:absolute;bottom:1rem;right:1rem;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));border:none;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:999}.scroll-to-bottom:hover{// transform: scale(1.1)}.slide-in{animation:slideInFromBottom var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.slide-out{opacity:0;transform:translateY(100%);transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.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: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i6.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }, { kind: "pipe", type: i6$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
16387
16507
|
}
|
|
16388
16508
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListComponent, decorators: [{
|
|
16389
16509
|
type: Component,
|
|
@@ -16403,248 +16523,253 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
16403
16523
|
AXTranslationModule,
|
|
16404
16524
|
AXInfiniteScrollDirective,
|
|
16405
16525
|
], template: `
|
|
16406
|
-
@if (activeConversation()) {
|
|
16407
|
-
|
|
16408
|
-
|
|
16409
|
-
|
|
16410
|
-
|
|
16411
|
-
|
|
16412
|
-
|
|
16413
|
-
|
|
16414
|
-
|
|
16415
|
-
|
|
16416
|
-
|
|
16417
|
-
<
|
|
16418
|
-
|
|
16419
|
-
|
|
16420
|
-
|
|
16421
|
-
|
|
16422
|
-
<
|
|
16423
|
-
<ng-
|
|
16424
|
-
|
|
16425
|
-
|
|
16426
|
-
|
|
16427
|
-
|
|
16428
|
-
|
|
16429
|
-
|
|
16430
|
-
|
|
16431
|
-
|
|
16432
|
-
|
|
16433
|
-
|
|
16434
|
-
|
|
16435
|
-
|
|
16436
|
-
|
|
16437
|
-
|
|
16438
|
-
|
|
16439
|
-
|
|
16440
|
-
|
|
16441
|
-
|
|
16442
|
-
<
|
|
16443
|
-
|
|
16444
|
-
|
|
16445
|
-
|
|
16446
|
-
|
|
16447
|
-
|
|
16448
|
-
|
|
16449
|
-
<
|
|
16450
|
-
|
|
16526
|
+
@if (activeConversation(); as conv) {
|
|
16527
|
+
@for (cid of [conv.id]; track cid) {
|
|
16528
|
+
<div
|
|
16529
|
+
class="message-list message-list--conversation-surface"
|
|
16530
|
+
#messageList
|
|
16531
|
+
role="log"
|
|
16532
|
+
aria-label="Message list"
|
|
16533
|
+
aria-live="polite"
|
|
16534
|
+
[style.background]="messageListBackgroundStyle()"
|
|
16535
|
+
>
|
|
16536
|
+
@if (loading()) {
|
|
16537
|
+
<div class="list-loading" role="status" aria-label="Loading messages">
|
|
16538
|
+
<ax-loading></ax-loading>
|
|
16539
|
+
<ax-label>Loading messages...</ax-label>
|
|
16540
|
+
</div>
|
|
16541
|
+
} @else if (messages().length === 0) {
|
|
16542
|
+
<div class="list-empty" role="status" aria-label="No messages">
|
|
16543
|
+
<ng-content select="ax-conversation-message-list-empty, [ax-conversation-message-list-empty]">
|
|
16544
|
+
<ng-container
|
|
16545
|
+
*ngComponentOutlet="resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }"
|
|
16546
|
+
></ng-container>
|
|
16547
|
+
</ng-content>
|
|
16548
|
+
</div>
|
|
16549
|
+
} @else {
|
|
16550
|
+
<div
|
|
16551
|
+
class="messages-container"
|
|
16552
|
+
(scroll)="onScroll($event)"
|
|
16553
|
+
axInfiniteScroll
|
|
16554
|
+
[threshold]="config.infiniteScrollThreshold"
|
|
16555
|
+
[edge]="'top'"
|
|
16556
|
+
(scrollThreshold)="onScrollThreshold($event)"
|
|
16557
|
+
#messagesContainer
|
|
16558
|
+
role="feed"
|
|
16559
|
+
aria-label="Messages"
|
|
16560
|
+
>
|
|
16561
|
+
@if (loadingMore()) {
|
|
16562
|
+
<div class="list-loading-more" role="status" aria-label="Loading older messages">
|
|
16563
|
+
<ax-loading></ax-loading>
|
|
16564
|
+
<ax-label>Loading older messages...</ax-label>
|
|
16565
|
+
</div>
|
|
16566
|
+
}
|
|
16567
|
+
@for (group of messageGroups(); track trackMessageGroup($index, group)) {
|
|
16568
|
+
<!-- Date Separator -->
|
|
16569
|
+
<div class="date-separator" role="separator" [attr.aria-label]="'Messages from ' + group.dateLabel">
|
|
16570
|
+
<ax-badge [text]="group.dateLabel" class="date-text"></ax-badge>
|
|
16571
|
+
</div>
|
|
16451
16572
|
|
|
16452
|
-
|
|
16453
|
-
|
|
16454
|
-
|
|
16455
|
-
|
|
16456
|
-
|
|
16457
|
-
|
|
16458
|
-
|
|
16459
|
-
|
|
16460
|
-
|
|
16461
|
-
|
|
16462
|
-
|
|
16463
|
-
|
|
16464
|
-
|
|
16465
|
-
|
|
16466
|
-
|
|
16467
|
-
|
|
16468
|
-
|
|
16469
|
-
|
|
16470
|
-
|
|
16471
|
-
|
|
16472
|
-
|
|
16473
|
-
|
|
16573
|
+
<!-- Messages in this date group -->
|
|
16574
|
+
@for (message of group.messages; track trackMessage($index, message)) {
|
|
16575
|
+
<div
|
|
16576
|
+
[class]="getMessageClasses(message)"
|
|
16577
|
+
role="article"
|
|
16578
|
+
[attr.aria-label]="getMessageAriaLabel(message)"
|
|
16579
|
+
[id]="'message-' + message.id"
|
|
16580
|
+
>
|
|
16581
|
+
<!-- Avatar (only for group conversations and received messages) -->
|
|
16582
|
+
@if (shouldShowAvatar(message)) {
|
|
16583
|
+
<div class="message-avatar">
|
|
16584
|
+
@if (avatarTemplate()) {
|
|
16585
|
+
<ng-container
|
|
16586
|
+
*ngTemplateOutlet="
|
|
16587
|
+
avatarTemplate();
|
|
16588
|
+
context: {
|
|
16589
|
+
$implicit: message,
|
|
16590
|
+
size: 32,
|
|
16591
|
+
senderName: getSenderName(message),
|
|
16592
|
+
senderAvatar: getSenderAvatar(message),
|
|
16593
|
+
senderIcon: getSenderAvatarIcon(message),
|
|
16594
|
+
}
|
|
16595
|
+
"
|
|
16596
|
+
></ng-container>
|
|
16597
|
+
} @else {
|
|
16598
|
+
<ax-avatar [size]="32">
|
|
16599
|
+
@if (getSenderAvatar(message)) {
|
|
16600
|
+
<ax-image [src]="getSenderAvatar(message)!" [alt]="getSenderName(message)"></ax-image>
|
|
16601
|
+
} @else if (getSenderAvatarIcon(message)) {
|
|
16602
|
+
<ax-icon
|
|
16603
|
+
><i
|
|
16604
|
+
[class]="'message-avatar-icon ' + getSenderAvatarIcon(message)!"
|
|
16605
|
+
aria-hidden="true"
|
|
16606
|
+
></i
|
|
16607
|
+
></ax-icon>
|
|
16608
|
+
} @else {
|
|
16609
|
+
<ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>
|
|
16474
16610
|
}
|
|
16475
|
-
|
|
16476
|
-
|
|
16477
|
-
|
|
16478
|
-
|
|
16479
|
-
@if (getSenderAvatar(message)) {
|
|
16480
|
-
<ax-image [src]="getSenderAvatar(message)!" [alt]="getSenderName(message)"></ax-image>
|
|
16481
|
-
} @else if (getSenderAvatarIcon(message)) {
|
|
16482
|
-
<ax-icon
|
|
16483
|
-
><i
|
|
16484
|
-
[class]="'message-avatar-icon ' + getSenderAvatarIcon(message)!"
|
|
16485
|
-
aria-hidden="true"
|
|
16486
|
-
></i
|
|
16487
|
-
></ax-icon>
|
|
16488
|
-
} @else {
|
|
16489
|
-
<ax-label>{{ getInitials(getSenderName(message)) }}</ax-label>
|
|
16490
|
-
}
|
|
16491
|
-
</ax-avatar>
|
|
16492
|
-
}
|
|
16493
|
-
</div>
|
|
16494
|
-
}
|
|
16611
|
+
</ax-avatar>
|
|
16612
|
+
}
|
|
16613
|
+
</div>
|
|
16614
|
+
}
|
|
16495
16615
|
|
|
16496
|
-
|
|
16497
|
-
|
|
16498
|
-
|
|
16499
|
-
|
|
16500
|
-
|
|
16501
|
-
|
|
16502
|
-
|
|
16503
|
-
|
|
16504
|
-
|
|
16505
|
-
|
|
16506
|
-
|
|
16616
|
+
<div class="message-content-row" [class.message-content-row-own]="isOwnMessage(message)">
|
|
16617
|
+
<button
|
|
16618
|
+
type="button"
|
|
16619
|
+
class="add-reaction-button add-reaction-outside"
|
|
16620
|
+
[class.add-reaction-visible]="reactionPickerTarget() === message.id"
|
|
16621
|
+
(click)="toggleReactionPicker(message.id, $event)"
|
|
16622
|
+
[attr.aria-label]="'Add reaction to message'"
|
|
16623
|
+
#reactionButton
|
|
16624
|
+
>
|
|
16625
|
+
<i class="fa-light fa-face-smile"></i>
|
|
16626
|
+
</button>
|
|
16507
16627
|
|
|
16508
|
-
<div
|
|
16509
|
-
class="message-bubble-container"
|
|
16510
|
-
[id]="'message-bubble-' + message.id"
|
|
16511
|
-
[attr.data-message-id]="message.id"
|
|
16512
|
-
>
|
|
16513
16628
|
<div
|
|
16514
|
-
|
|
16515
|
-
[
|
|
16516
|
-
[
|
|
16629
|
+
class="message-bubble-container"
|
|
16630
|
+
[id]="'message-bubble-' + message.id"
|
|
16631
|
+
[attr.data-message-id]="message.id"
|
|
16517
16632
|
>
|
|
16518
|
-
|
|
16519
|
-
|
|
16520
|
-
|
|
16521
|
-
|
|
16633
|
+
<div
|
|
16634
|
+
[class]="getBubbleClasses(message)"
|
|
16635
|
+
[class.message-bubble-sent]="message.senderId === currentUser()?.id"
|
|
16636
|
+
[class.message-bubble-received]="message.senderId !== currentUser()?.id"
|
|
16637
|
+
>
|
|
16638
|
+
<!-- Sender name (only for group conversations and received messages) -->
|
|
16639
|
+
@if (shouldShowSenderName(message)) {
|
|
16640
|
+
<div class="message-sender">{{ getSenderName(message) }}:</div>
|
|
16641
|
+
}
|
|
16522
16642
|
|
|
16523
|
-
|
|
16524
|
-
|
|
16525
|
-
|
|
16526
|
-
|
|
16527
|
-
|
|
16528
|
-
|
|
16529
|
-
|
|
16530
|
-
|
|
16531
|
-
|
|
16532
|
-
|
|
16533
|
-
|
|
16534
|
-
|
|
16535
|
-
|
|
16536
|
-
|
|
16537
|
-
|
|
16538
|
-
|
|
16539
|
-
|
|
16540
|
-
|
|
16541
|
-
|
|
16542
|
-
|
|
16543
|
-
|
|
16544
|
-
|
|
16545
|
-
|
|
16643
|
+
<!-- Reply Preview -->
|
|
16644
|
+
@if (message.replyTo) {
|
|
16645
|
+
<div
|
|
16646
|
+
class="reply-preview"
|
|
16647
|
+
(click)="scrollToMessage(message.replyTo.id)"
|
|
16648
|
+
role="button"
|
|
16649
|
+
[attr.aria-label]="'Reply to ' + getSenderName(message.replyTo)"
|
|
16650
|
+
(keydown.enter)="scrollToMessage(message.replyTo.id)"
|
|
16651
|
+
(keydown.space)="scrollToMessage(message.replyTo.id)"
|
|
16652
|
+
>
|
|
16653
|
+
<div class="reply-preview-content">
|
|
16654
|
+
<div class="reply-preview-sender">{{ getSenderName(message.replyTo) }}</div>
|
|
16655
|
+
<div class="reply-preview-text">
|
|
16656
|
+
@if (getMessagePreviewText(message.replyTo); as preview) {
|
|
16657
|
+
<span class="last-message">
|
|
16658
|
+
@if (preview.type !== 'text') {
|
|
16659
|
+
<i [class]="preview.icon"></i
|
|
16660
|
+
>{{ '@acorex:chat.' + preview.type | translate | async }}
|
|
16661
|
+
} @else {
|
|
16662
|
+
{{ preview.value }}
|
|
16663
|
+
}
|
|
16664
|
+
</span>
|
|
16665
|
+
}
|
|
16666
|
+
</div>
|
|
16546
16667
|
</div>
|
|
16547
16668
|
</div>
|
|
16548
|
-
|
|
16549
|
-
}
|
|
16550
|
-
|
|
16551
|
-
<!-- Forwarded Indicator -->
|
|
16552
|
-
@if (message.forwarded) {
|
|
16553
|
-
<div class="forwarded-preview">
|
|
16554
|
-
<i class="fa-solid fa-share"></i>
|
|
16555
|
-
<span class="forwarded-text">{{ getForwardedText(message) }}</span>
|
|
16556
|
-
</div>
|
|
16557
|
-
}
|
|
16669
|
+
}
|
|
16558
16670
|
|
|
16559
|
-
|
|
16560
|
-
|
|
16561
|
-
|
|
16562
|
-
|
|
16563
|
-
|
|
16564
|
-
<div class="message-reactions-container">
|
|
16565
|
-
<div class="message-reactions-bubbles">
|
|
16566
|
-
@for (reaction of getGroupedReactions(message); track reaction.emoji) {
|
|
16567
|
-
<button
|
|
16568
|
-
type="button"
|
|
16569
|
-
class="reaction-bubble"
|
|
16570
|
-
[class.reaction-bubble-active]="reaction.hasReacted"
|
|
16571
|
-
(click)="onReactionClick(message, reaction.emoji)"
|
|
16572
|
-
[attr.aria-label]="reaction.emoji + ' ' + reaction.count"
|
|
16573
|
-
>
|
|
16574
|
-
<span class="reaction-emoji">{{ reaction.emoji }}</span>
|
|
16575
|
-
@if (reaction.count > 1) {
|
|
16576
|
-
<span class="reaction-count">{{ reaction.count }}</span>
|
|
16577
|
-
}
|
|
16578
|
-
</button>
|
|
16579
|
-
}
|
|
16671
|
+
<!-- Forwarded Indicator -->
|
|
16672
|
+
@if (message.forwarded) {
|
|
16673
|
+
<div class="forwarded-preview">
|
|
16674
|
+
<i class="fa-solid fa-share"></i>
|
|
16675
|
+
<span class="forwarded-text">{{ getForwardedText(message) }}</span>
|
|
16580
16676
|
</div>
|
|
16581
|
-
</div>
|
|
16582
|
-
}
|
|
16583
|
-
|
|
16584
|
-
<!-- Message Footer -->
|
|
16585
|
-
<div class="message-footer">
|
|
16586
|
-
@if (getReplyCount(message) > 0) {
|
|
16587
|
-
<span class="message-footer-count" [attr.aria-label]="getReplyCount(message) + ' replies'">
|
|
16588
|
-
<i class="fa-solid fa-message" aria-hidden="true"></i>
|
|
16589
|
-
<span class="message-footer-count-value">{{ getReplyCount(message) }}</span>
|
|
16590
|
-
</span>
|
|
16591
|
-
}
|
|
16592
|
-
@if (getForwardCount(message) > 0) {
|
|
16593
|
-
<span
|
|
16594
|
-
class="message-footer-count"
|
|
16595
|
-
[attr.aria-label]="getForwardCount(message) + ' forwards'"
|
|
16596
|
-
>
|
|
16597
|
-
<i class="fa-solid fa-share" aria-hidden="true"></i>
|
|
16598
|
-
<span class="message-footer-count-value">{{ getForwardCount(message) }}</span>
|
|
16599
|
-
</span>
|
|
16600
16677
|
}
|
|
16601
|
-
|
|
16602
|
-
|
|
16603
|
-
|
|
16604
|
-
|
|
16605
|
-
|
|
16606
|
-
|
|
16607
|
-
|
|
16608
|
-
|
|
16609
|
-
|
|
16610
|
-
|
|
16611
|
-
|
|
16612
|
-
|
|
16613
|
-
|
|
16678
|
+
|
|
16679
|
+
<ng-container
|
|
16680
|
+
*ngComponentOutlet="getRendererComponent(message); inputs: getRendererInputs(message)"
|
|
16681
|
+
></ng-container>
|
|
16682
|
+
|
|
16683
|
+
@if (message.reactions.length > 0) {
|
|
16684
|
+
<div class="message-reactions-container">
|
|
16685
|
+
<div class="message-reactions-bubbles">
|
|
16686
|
+
@for (reaction of getGroupedReactions(message); track reaction.emoji) {
|
|
16687
|
+
<button
|
|
16688
|
+
type="button"
|
|
16689
|
+
class="reaction-bubble"
|
|
16690
|
+
[class.reaction-bubble-active]="reaction.hasReacted"
|
|
16691
|
+
(click)="onReactionClick(message, reaction.emoji)"
|
|
16692
|
+
[attr.aria-label]="reaction.emoji + ' ' + reaction.count"
|
|
16693
|
+
>
|
|
16694
|
+
<span class="reaction-emoji">{{ reaction.emoji }}</span>
|
|
16695
|
+
@if (reaction.count > 1) {
|
|
16696
|
+
<span class="reaction-count">{{ reaction.count }}</span>
|
|
16697
|
+
}
|
|
16698
|
+
</button>
|
|
16699
|
+
}
|
|
16700
|
+
</div>
|
|
16701
|
+
</div>
|
|
16614
16702
|
}
|
|
16703
|
+
|
|
16704
|
+
<!-- Message Footer -->
|
|
16705
|
+
<div class="message-footer">
|
|
16706
|
+
@if (getReplyCount(message) > 0) {
|
|
16707
|
+
<span
|
|
16708
|
+
class="message-footer-count"
|
|
16709
|
+
[attr.aria-label]="getReplyCount(message) + ' replies'"
|
|
16710
|
+
>
|
|
16711
|
+
<i class="fa-solid fa-message" aria-hidden="true"></i>
|
|
16712
|
+
<span class="message-footer-count-value">{{ getReplyCount(message) }}</span>
|
|
16713
|
+
</span>
|
|
16714
|
+
}
|
|
16715
|
+
@if (getForwardCount(message) > 0) {
|
|
16716
|
+
<span
|
|
16717
|
+
class="message-footer-count"
|
|
16718
|
+
[attr.aria-label]="getForwardCount(message) + ' forwards'"
|
|
16719
|
+
>
|
|
16720
|
+
<i class="fa-solid fa-share" aria-hidden="true"></i>
|
|
16721
|
+
<span class="message-footer-count-value">{{ getForwardCount(message) }}</span>
|
|
16722
|
+
</span>
|
|
16723
|
+
}
|
|
16724
|
+
@if (getReplyCount(message) > 0 || getForwardCount(message) > 0) {
|
|
16725
|
+
<span class="message-footer-split" aria-hidden="true"></span>
|
|
16726
|
+
}
|
|
16727
|
+
<span class="message-time">{{ message.timestamp | format: 'timeleft' | async }}</span>
|
|
16728
|
+
@if (message.editedAt) {
|
|
16729
|
+
<span class="edited-indicator">
|
|
16730
|
+
<span>Edited</span>
|
|
16731
|
+
</span>
|
|
16732
|
+
}
|
|
16733
|
+
@if (isOwnMessage(message)) {
|
|
16734
|
+
<span [class]="getStatusIconClasses(message)">
|
|
16735
|
+
<ax-icon><i [class]="getStatusIcon(message)"></i></ax-icon>
|
|
16736
|
+
</span>
|
|
16737
|
+
}
|
|
16738
|
+
</div>
|
|
16615
16739
|
</div>
|
|
16616
16740
|
</div>
|
|
16617
16741
|
</div>
|
|
16618
|
-
</div>
|
|
16619
16742
|
|
|
16620
|
-
|
|
16621
|
-
|
|
16622
|
-
|
|
16623
|
-
|
|
16624
|
-
|
|
16625
|
-
|
|
16626
|
-
|
|
16627
|
-
|
|
16628
|
-
|
|
16629
|
-
|
|
16743
|
+
<!-- Context Menu for Message Actions -->
|
|
16744
|
+
<ax-context-menu
|
|
16745
|
+
[target]="'#message-bubble-' + message.id"
|
|
16746
|
+
[openOn]="'click'"
|
|
16747
|
+
[closeOn]="'click'"
|
|
16748
|
+
(onOpening)="handleMessageContextMenuOpening($event, message)"
|
|
16749
|
+
(onClose)="contextMenuMessageId.set(null)"
|
|
16750
|
+
(onItemClick)="handleMessageContextMenuItemClick($event, message)"
|
|
16751
|
+
>
|
|
16752
|
+
</ax-context-menu>
|
|
16753
|
+
</div>
|
|
16754
|
+
}
|
|
16630
16755
|
}
|
|
16631
|
-
|
|
16632
|
-
</div>
|
|
16756
|
+
</div>
|
|
16633
16757
|
|
|
16634
|
-
|
|
16635
|
-
|
|
16636
|
-
|
|
16637
|
-
|
|
16638
|
-
|
|
16639
|
-
|
|
16640
|
-
|
|
16641
|
-
|
|
16642
|
-
|
|
16643
|
-
|
|
16644
|
-
|
|
16758
|
+
<!-- Scroll to Bottom Button -->
|
|
16759
|
+
@if (showScrollButton()) {
|
|
16760
|
+
<ax-button
|
|
16761
|
+
class="scroll-to-bottom"
|
|
16762
|
+
(onClick)="scrollToBottom()"
|
|
16763
|
+
animate.enter="slide-in"
|
|
16764
|
+
animate.leave="slide-out"
|
|
16765
|
+
[text]="'↓'"
|
|
16766
|
+
[look]="'solid'"
|
|
16767
|
+
aria-label="Scroll to bottom of messages"
|
|
16768
|
+
></ax-button>
|
|
16769
|
+
}
|
|
16645
16770
|
}
|
|
16646
|
-
|
|
16647
|
-
|
|
16771
|
+
</div>
|
|
16772
|
+
}
|
|
16648
16773
|
|
|
16649
16774
|
<!-- Reaction Picker Popover -->
|
|
16650
16775
|
@if (reactionPickerTarget()) {
|
|
@@ -16679,8 +16804,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
16679
16804
|
</div>
|
|
16680
16805
|
</ax-popover>
|
|
16681
16806
|
}
|
|
16807
|
+
} @else {
|
|
16808
|
+
<div class="message-list message-list--no-active" role="region" aria-label="No conversation selected">
|
|
16809
|
+
<div class="list-no-active">
|
|
16810
|
+
<ng-content select="ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]">
|
|
16811
|
+
<ng-container *ngComponentOutlet="noActiveFallbackComponent"></ng-container>
|
|
16812
|
+
</ng-content>
|
|
16813
|
+
</div>
|
|
16814
|
+
</div>
|
|
16682
16815
|
}
|
|
16683
|
-
`, styles: [":host{display:block;height:100%;position:relative}.message-list{height:100%}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;padding:3rem 2rem;gap:1.25rem;animation:fadeInUp .5s ease-out}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.empty-icon{font-size:5.5rem;line-height:1;opacity:.35;margin-bottom:.5rem;filter:grayscale(.2)}.empty-title{font-size:1.625rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface));letter-spacing:-.02em}.empty-description{font-size:1.0625rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;max-width:420px;line-height:1.7}.spinner{width:32px;height:32px;border:3px solid rgb(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));border-radius:50%;animation:spin .8s linear infinite;margin-bottom:1rem}@keyframes spin{to{transform:rotate(360deg)}}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.messages-container{width:100%;height:100%;overflow-y:auto;overflow-x:hidden}.date-separator{position:sticky;z-index:150;top:0;display:flex;align-items:center;justify-content:center;padding:.5rem 0}.date-text{padding:.25rem .75rem;background:rgb(var(--ax-sys-color-lighter-surface));font-size:.75rem;font-weight:500;border-radius:1rem;width:7rem;display:flex;justify-content:center;align-items:center}.unread-separator{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;padding:0 1rem}.unread-separator-line{flex:1;height:1px;background:rgb(var(--ax-sys-color-primary-500));opacity:.3}.unread-separator-text{font-size:.75rem;font-weight:600;color:rgb(var(--ax-sys-color-primary-500));text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}.message-item{position:relative;display:flex;padding:.5rem 1rem;gap:.5rem;line-height:1rem;align-items:end;transition:background-color .3s ease}.message-highlight{background-color:rgba(var(--ax-sys-color-primary-500),.1);border-radius:.5rem}.fade-slide-in{animation:fadeSlideIn var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes fadeSlideIn{0%{opacity:0;// transform: translateX(20%)}to{opacity:1;// transform: translateX(0)}}.message-own{flex-direction:row-reverse}.message-avatar{flex-shrink:0}.message-avatar-icon{font-size:1rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.message-content-row{display:flex;flex-direction:row;align-items:flex-end;max-width:70%;min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}.message-content-row-own{justify-content:flex-end}.message-item:not(.message-own) .message-content-row{justify-content:flex-start}.message-bubble-container{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;max-width:100%;position:relative}.message-own .message-bubble-container{align-items:flex-end}.message-sender{font-size:.75rem;font-weight:600;margin-bottom:.1rem}.message-bubble{position:relative;display:flex;flex-direction:column;padding:.5rem .5rem .1rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));word-wrap:break-word;transition:background-color .3s ease}.reply-preview{padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .reply-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .reply-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.reply-preview-line{width:3px;background:currentColor;opacity:.5;border-radius:1.5px;flex-shrink:0}.reply-preview-content{flex:1;min-width:0}.reply-preview-sender{font-size:.75rem;font-weight:600;margin-bottom:.125rem;color:rgb(var(--ax-sys-color-primary-600))}.reply-preview-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.message-own .reply-preview-sender{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .reply-preview-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.last-message{display:flex;align-items:center;gap:.25rem}.forwarded-preview{display:flex;align-items:center;gap:.375rem;padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .forwarded-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .forwarded-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.forwarded-preview i{font-size:.8125rem;flex-shrink:0;color:rgb(var(--ax-sys-color-primary-600))}.forwarded-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.message-own .forwarded-preview i{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .forwarded-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.message-bubble-received{border-bottom-left-radius:.125rem}.message-bubble-received:before{content:\"\";display:block;background:rgb(var(--ax-sys-color-lightest-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;left:-.7rem;border-top-left-radius:86%;corner-shape:scoop}.message-bubble-sent{border-bottom-right-radius:.125rem}.message-bubble-sent:after{content:\"\";display:block;background:rgb(var(--ax-sys-color-primary-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;right:-.7rem;border-top-right-radius:86%;corner-shape:scoop}.message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.message-content{font-size:.9375rem;line-height:1.5;white-space:pre-wrap}.message-footer{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;padding-inline-start:.25rem;margin-top:.1rem;gap:.25rem;font-size:.6875rem;opacity:.7;letter-spacing:.05rem;-webkit-user-select:none;user-select:none}.message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-variant-numeric:tabular-nums;font-size:.675rem}.message-footer-count i{font-size:.625rem;opacity:.9}.message-footer-count-value{font-weight:600}.message-footer-split{flex-shrink:0;align-self:center;width:1px;height:.65rem;background:rgb(var(--ax-sys-color-border-light-surface));opacity:.9;margin-inline:.2rem}.message-time{font-variant-numeric:tabular-nums;font-size:.675rem}.edited-indicator{display:inline-flex;align-items:center;gap:.25rem;font-size:.675rem;opacity:.75;padding-inline-start:.35rem;border-inline-start:1px solid rgb(var(--ax-sys-color-border-light-surface))}.status-icon{display:inline-flex;align-items:center}.status-icon i{font-size:.75rem}.status-read{color:rgb(var(--ax-sys-color-primary-200))}.status-failed{color:rgb(var(--ax-sys-color-danger-200))}.message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}.reaction-bubble{display:inline-flex;align-items:center;justify-content:center;gap:.15rem;min-height:1.375rem;padding:.1rem .35rem;margin:0;background:rgba(var(--ax-sys-color-on-surface),.06);color:rgb(var(--ax-sys-color-on-surface));border:1px solid rgba(var(--ax-sys-color-on-surface),.1);border-radius:.75rem;box-shadow:none;cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}.reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}.reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}.reaction-emoji{font-size:.8125rem;line-height:1;display:inline-block}.reaction-count{font-size:.6875rem;font-weight:500;font-variant-numeric:tabular-nums;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;line-height:1}.reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-primary-600));opacity:.95;font-weight:600}.message-own .reaction-bubble{background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2);color:rgb(var(--ax-sys-color-on-primary-surface))}.message-own .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.2);border-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}.message-own .reaction-bubble-active{background:rgba(var(--ax-sys-color-on-primary-surface),.28);border-color:rgba(var(--ax-sys-color-on-primary-surface),.5)}.message-own .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.34);border-color:rgba(var(--ax-sys-color-on-primary-surface),.6)}.message-own .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.8}.message-own .reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:1}.message-reactions-container{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:.2rem;margin-top:.25rem;justify-content:flex-start}.message-own .message-reactions-container{justify-content:flex-end}.add-reaction-button.add-reaction-outside{display:none;position:absolute;top:50%;inset-inline-end:-2.25rem;transform:translateY(-50%);align-items:center;justify-content:center;box-sizing:border-box;width:1.8rem;height:1.8rem;padding:0;margin:0;border-radius:50%;cursor:pointer;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));box-shadow:0 1px 2px #0000000f}.add-reaction-button{padding-inline-start:.05rem}.message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-2.25rem;inset-inline-end:auto}.message-item:hover .add-reaction-button.add-reaction-outside,.add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}.add-reaction-button.add-reaction-outside:hover,.add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgb(var(--ax-sys-color-primary-500))}.add-reaction-button.add-reaction-outside i{font-size:.9rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.8}.reaction-picker-popup{position:fixed;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:.65rem;z-index:100;min-width:auto;width:max-content;max-width:min(260px,92vw);box-shadow:0 4px 16px #0000001a;transform:translateY(-100%);margin-top:-.35rem;overflow:hidden}.reaction-picker-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.45rem .5rem .45rem .7rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));min-height:0}.picker-title{font-size:.8125rem;font-weight:600;letter-spacing:.02em;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.picker-close{display:flex;align-items:center;justify-content:center;width:1.6rem;height:1.6rem;padding:0;background:transparent;border:none;border-radius:.25rem;cursor:pointer;font-size:.95rem;color:rgba(var(--ax-sys-color-on-surface),.55);transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.picker-close:hover{background:rgba(var(--ax-sys-color-danger-500),.1);color:rgb(var(--ax-sys-color-danger-500))}.reaction-bubble:focus-visible,.add-reaction-button:focus-visible,.picker-close:focus-visible,.reaction-picker-emoji:focus-visible,.action-trigger:focus-visible,.scroll-to-bottom:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}.reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,1fr);gap:.2rem;padding:.45rem .5rem .5rem}.reaction-picker-emoji{width:2rem;height:2rem;padding:0;background:transparent;border:1px solid transparent;border-radius:.45rem;font-size:1.15rem;line-height:1;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-picker-emoji:hover{// transform: scale(1.15);background:rgb(var(--ax-sys-color-lighter-surface))}.reaction-picker-emoji-active{background:rgb(var(--ax-sys-color-surface))}.reaction-picker-emoji-active:hover{background:rgba(var(--ax-sys-color-primary-500),.25)}.message-actions{padding-bottom:1.5rem;opacity:0;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:10}.message-item:hover .message-actions{opacity:1}.action-trigger{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:var(--ax-sys-border-radius);font-size:.875rem;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.action-trigger:hover{background:rgb(var(--ax-sys-color-light-surface));// transform: scale(1.05)}.shortcut{font-size:.6875rem;opacity:.7}.scroll-to-bottom{position:absolute;bottom:1rem;right:1rem;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));border:none;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:999}.scroll-to-bottom:hover{// transform: scale(1.1)}.slide-in{animation:slideInFromBottom var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.slide-out{opacity:0;transform:translateY(100%);transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}\n"] }]
|
|
16816
|
+
`, styles: [":host{display:block;height:100%;position:relative}.message-list{height:100%}.message-list--conversation-surface{animation:axConversationSurfaceIn .36s cubic-bezier(.22,1,.36,1) both}@keyframes axConversationSurfaceIn{0%{opacity:0}to{opacity:1}}@media (prefers-reduced-motion: reduce){.message-list--conversation-surface{animation:axConversationSurfaceInReduced .18s ease both}}@keyframes axConversationSurfaceInReduced{0%{opacity:.92}to{opacity:1}}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;padding:3rem 2rem;gap:1.25rem;animation:fadeInUp .5s ease-out}.message-list--no-active{height:100%}.list-no-active{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:12rem}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.empty-icon{font-size:5.5rem;line-height:1;opacity:.35;margin-bottom:.5rem;filter:grayscale(.2)}.empty-title{font-size:1.625rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface));letter-spacing:-.02em}.empty-description{font-size:1.0625rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;max-width:420px;line-height:1.7}.spinner{width:32px;height:32px;border:3px solid rgb(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));border-radius:50%;animation:spin .8s linear infinite;margin-bottom:1rem}@keyframes spin{to{transform:rotate(360deg)}}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.messages-container{width:100%;height:100%;overflow-y:auto;overflow-x:hidden}.date-separator{position:sticky;z-index:150;top:0;display:flex;align-items:center;justify-content:center;padding:.5rem 0}.date-text{padding:.25rem .75rem;background:rgb(var(--ax-sys-color-lighter-surface));font-size:.75rem;font-weight:500;border-radius:1rem;width:7rem;display:flex;justify-content:center;align-items:center}.unread-separator{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;padding:0 1rem}.unread-separator-line{flex:1;height:1px;background:rgb(var(--ax-sys-color-primary-500));opacity:.3}.unread-separator-text{font-size:.75rem;font-weight:600;color:rgb(var(--ax-sys-color-primary-500));text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}.message-item{position:relative;display:flex;padding:.5rem 1rem;gap:.5rem;line-height:1rem;align-items:end;transition:background-color .3s ease}.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.09);border-radius:.5rem;box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.22)}.message-own.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.12)}.message-highlight{background-color:rgba(var(--ax-sys-color-primary-500),.1);border-radius:.5rem}.message-own{flex-direction:row-reverse}.message-avatar{flex-shrink:0}.message-avatar-icon{font-size:1rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.message-content-row{display:flex;flex-direction:row;align-items:flex-end;max-width:70%;min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}.message-content-row-own{justify-content:flex-end}.message-item:not(.message-own) .message-content-row{justify-content:flex-start}.message-bubble-container{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;max-width:100%;position:relative}.message-own .message-bubble-container{align-items:flex-end}.message-sender{font-size:.75rem;font-weight:600;margin-bottom:.1rem}.message-bubble{position:relative;display:flex;flex-direction:column;padding:.5rem .5rem .1rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));word-wrap:break-word;transition:background-color .3s ease}.reply-preview{padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .reply-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .reply-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.reply-preview-line{width:3px;background:currentColor;opacity:.5;border-radius:1.5px;flex-shrink:0}.reply-preview-content{flex:1;min-width:0}.reply-preview-sender{font-size:.75rem;font-weight:600;margin-bottom:.125rem;color:rgb(var(--ax-sys-color-primary-600))}.reply-preview-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.message-own .reply-preview-sender{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .reply-preview-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.last-message{display:flex;align-items:center;gap:.25rem}.forwarded-preview{display:flex;align-items:center;gap:.375rem;padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .forwarded-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .forwarded-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.forwarded-preview i{font-size:.8125rem;flex-shrink:0;color:rgb(var(--ax-sys-color-primary-600))}.forwarded-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.message-own .forwarded-preview i{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .forwarded-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.message-bubble-received{border-bottom-left-radius:.125rem}.message-bubble-received:before{content:\"\";display:block;background:rgb(var(--ax-sys-color-lightest-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;left:-.7rem;border-top-left-radius:86%;corner-shape:scoop}.message-bubble-sent{border-bottom-right-radius:.125rem}.message-bubble-sent:after{content:\"\";display:block;background:rgb(var(--ax-sys-color-primary-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;right:-.7rem;border-top-right-radius:86%;corner-shape:scoop}.message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.message-content{font-size:.9375rem;line-height:1.5;white-space:pre-wrap}.message-footer{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;padding-inline-start:.25rem;margin-top:.1rem;gap:.25rem;font-size:.6875rem;opacity:.7;letter-spacing:.05rem;-webkit-user-select:none;user-select:none}.message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-variant-numeric:tabular-nums;font-size:.675rem}.message-footer-count i{font-size:.625rem;opacity:.9}.message-footer-count-value{font-weight:600}.message-footer-split{flex-shrink:0;align-self:center;width:1px;height:.65rem;background:rgb(var(--ax-sys-color-border-light-surface));opacity:.9;margin-inline:.2rem}.message-time{font-variant-numeric:tabular-nums;font-size:.675rem}.edited-indicator{display:inline-flex;align-items:center;gap:.25rem;font-size:.675rem;opacity:.75;padding-inline-start:.35rem;border-inline-start:1px solid rgb(var(--ax-sys-color-border-light-surface))}.status-icon{display:inline-flex;align-items:center}.status-icon i{font-size:.75rem}.status-read{color:rgb(var(--ax-sys-color-primary-200))}.status-failed{color:rgb(var(--ax-sys-color-danger-200))}.message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}.reaction-bubble{display:inline-flex;align-items:center;justify-content:center;gap:.15rem;min-height:1.375rem;padding:.1rem .35rem;margin:0;background:rgba(var(--ax-sys-color-on-surface),.06);color:rgb(var(--ax-sys-color-on-surface));border:1px solid rgba(var(--ax-sys-color-on-surface),.1);border-radius:.75rem;box-shadow:none;cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}.reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}.reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}.reaction-emoji{font-size:.8125rem;line-height:1;display:inline-block}.reaction-count{font-size:.6875rem;font-weight:500;font-variant-numeric:tabular-nums;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;line-height:1}.reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-primary-600));opacity:.95;font-weight:600}.message-own .reaction-bubble{background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2);color:rgb(var(--ax-sys-color-on-primary-surface))}.message-own .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.2);border-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}.message-own .reaction-bubble-active{background:rgba(var(--ax-sys-color-on-primary-surface),.28);border-color:rgba(var(--ax-sys-color-on-primary-surface),.5)}.message-own .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.34);border-color:rgba(var(--ax-sys-color-on-primary-surface),.6)}.message-own .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.8}.message-own .reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:1}.message-reactions-container{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:.2rem;margin-top:.25rem;justify-content:flex-start}// .message-own .message-reactions-container{// justify-content: flex-end;//}.add-reaction-button.add-reaction-outside{display:none;position:absolute;top:50%;inset-inline-end:-2.25rem;transform:translateY(-50%);align-items:center;justify-content:center;box-sizing:border-box;width:1.8rem;height:1.8rem;padding:0;margin:0;border-radius:50%;cursor:pointer;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));box-shadow:0 1px 2px #0000000f}.add-reaction-button{padding-inline-start:.05rem}.message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-2.25rem;inset-inline-end:auto}.message-item:hover .add-reaction-button.add-reaction-outside,.add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}.add-reaction-button.add-reaction-outside:hover,.add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgb(var(--ax-sys-color-primary-500))}.add-reaction-button.add-reaction-outside i{font-size:.9rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.8}.reaction-picker-popup{position:fixed;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:.65rem;z-index:100;min-width:auto;width:max-content;max-width:min(260px,92vw);box-shadow:0 4px 16px #0000001a;transform:translateY(-100%);margin-top:-.35rem;overflow:hidden}.reaction-picker-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.45rem .5rem .45rem .7rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));min-height:0}.picker-title{font-size:.8125rem;font-weight:600;letter-spacing:.02em;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.picker-close{display:flex;align-items:center;justify-content:center;width:1.6rem;height:1.6rem;padding:0;background:transparent;border:none;border-radius:.25rem;cursor:pointer;font-size:.95rem;color:rgba(var(--ax-sys-color-on-surface),.55);transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.picker-close:hover{background:rgba(var(--ax-sys-color-danger-500),.1);color:rgb(var(--ax-sys-color-danger-500))}.reaction-bubble:focus-visible,.add-reaction-button:focus-visible,.picker-close:focus-visible,.reaction-picker-emoji:focus-visible,.action-trigger:focus-visible,.scroll-to-bottom:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}.reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,1fr);gap:.2rem;padding:.45rem .5rem .5rem}.reaction-picker-emoji{width:2rem;height:2rem;padding:0;background:transparent;border:1px solid transparent;border-radius:.45rem;font-size:1.15rem;line-height:1;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-picker-emoji:hover{// transform: scale(1.15);background:rgb(var(--ax-sys-color-lighter-surface))}.reaction-picker-emoji-active{background:rgb(var(--ax-sys-color-surface))}.reaction-picker-emoji-active:hover{background:rgba(var(--ax-sys-color-primary-500),.25)}.message-actions{padding-bottom:1.5rem;opacity:0;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:10}.message-item:hover .message-actions{opacity:1}.action-trigger{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:var(--ax-sys-border-radius);font-size:.875rem;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.action-trigger:hover{background:rgb(var(--ax-sys-color-light-surface));// transform: scale(1.05)}.shortcut{font-size:.6875rem;opacity:.7}.scroll-to-bottom{position:absolute;bottom:1rem;right:1rem;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));border:none;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:999}.scroll-to-bottom:hover{// transform: scale(1.1)}.slide-in{animation:slideInFromBottom var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.slide-out{opacity:0;transform:translateY(100%);transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}\n"] }]
|
|
16684
16817
|
}], ctorParameters: () => [] });
|
|
16685
16818
|
|
|
16686
16819
|
/**
|
|
@@ -16707,12 +16840,17 @@ class AXConversationItemComponent {
|
|
|
16707
16840
|
const activeConv = this.conversationService.activeConversation();
|
|
16708
16841
|
return activeConv?.id === this.conversation().id;
|
|
16709
16842
|
}, ...(ngDevMode ? [{ debugName: "isActive" }] : []));
|
|
16843
|
+
/** True while this row's context menu is open */
|
|
16844
|
+
this.contextMenuOpen = signal(false, ...(ngDevMode ? [{ debugName: "contextMenuOpen" }] : []));
|
|
16710
16845
|
/** Item CSS classes - delegate to component logic */
|
|
16711
16846
|
this.itemClasses = computed(() => {
|
|
16712
16847
|
const classes = ['conversation-item'];
|
|
16713
16848
|
if (this.isActive()) {
|
|
16714
16849
|
classes.push('conversation-item-active');
|
|
16715
16850
|
}
|
|
16851
|
+
if (this.contextMenuOpen()) {
|
|
16852
|
+
classes.push('conversation-item-context-active');
|
|
16853
|
+
}
|
|
16716
16854
|
return classes.join(' ');
|
|
16717
16855
|
}, ...(ngDevMode ? [{ debugName: "itemClasses" }] : []));
|
|
16718
16856
|
/** Conversation status for avatar - delegate to utils */
|
|
@@ -16745,6 +16883,7 @@ class AXConversationItemComponent {
|
|
|
16745
16883
|
}
|
|
16746
16884
|
/** Handle context menu opening for conversations */
|
|
16747
16885
|
handleContextMenuOpening(event) {
|
|
16886
|
+
this.contextMenuOpen.set(true);
|
|
16748
16887
|
const conversation = this.liveConversation();
|
|
16749
16888
|
const actions = this.registry.conversationItemActions.getActionsForConversation(conversation);
|
|
16750
16889
|
// Convert conversation item actions to context menu items
|
|
@@ -16768,6 +16907,7 @@ class AXConversationItemComponent {
|
|
|
16768
16907
|
}
|
|
16769
16908
|
/** Handle context menu item click for conversations */
|
|
16770
16909
|
async handleContextMenuItemClick(event) {
|
|
16910
|
+
this.contextMenuOpen.set(false);
|
|
16771
16911
|
const action = event.item.data;
|
|
16772
16912
|
const conversation = this.liveConversation();
|
|
16773
16913
|
if (action && conversation && action.handler) {
|
|
@@ -16896,10 +17036,11 @@ class AXConversationItemComponent {
|
|
|
16896
17036
|
[openOn]="'click'"
|
|
16897
17037
|
[closeOn]="'click'"
|
|
16898
17038
|
(onOpening)="handleContextMenuOpening($event)"
|
|
17039
|
+
(onClose)="contextMenuOpen.set(false)"
|
|
16899
17040
|
(onItemClick)="handleContextMenuItemClick($event)"
|
|
16900
17041
|
>
|
|
16901
17042
|
</ax-context-menu>
|
|
16902
|
-
`, isInline: true, styles: [":host{display:block}.conversation-item{display:flex;align-items:center;gap:.75rem;padding:.375rem .75rem;margin:.375rem;border-radius:.5rem;cursor:pointer;transition:background .2s}.conversation-item:focus-visible,.conversation-item:hover{background:rgb(var(--ax-sys-color-light-surface));outline:none}.conversation-item-active{background:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.conversation-item-active:hover{background:rgb(var(--ax-sys-color-primary-lighter-surface))}.item-avatar{flex-shrink:0}.avatar-wrapper{position:relative}.conversation-item-avatar-icon{font-size:1.35rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.avatar-status{position:absolute;bottom:2px;right:2px;width:12px;height:12px;border-radius:50%}.avatar-status.status-online{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-success-500))}// .avatar-status.status-offline{// border: 2px solid rgb(var(--ax-sys-color-surface));// background: rgb(var(--ax-sys-color-neutral));//}.avatar-status.status-away{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-warning-500))}.item-content{display:flex;flex-direction:column;gap:.25rem;flex:1;min-width:0;line-height:1.1rem}.item-header{display:flex;align-items:center;justify-content:space-between;gap:.25rem}.item-title{display:flex;align-items:center;// gap: .25rem;font-weight:600;font-size:.875rem;flex:1;min-width:0}.item-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.item-time{font-variant-numeric:tabular-nums;flex-shrink:0;font-size:.75rem;opacity:.7}.item-description{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;opacity:.7;min-width:0}.typing-indicator{color:rgb(var(--ax-sys-color-primary-500));font-style:italic;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.last-message{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.no-message{// font-weight: 600}.item-badge{flex-shrink:0}.mute-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
17043
|
+
`, isInline: true, styles: [":host{display:block}.conversation-item{display:flex;align-items:center;gap:.75rem;padding:.375rem .75rem;margin:.375rem;border-radius:.5rem;cursor:pointer;transition:background .2s}.conversation-item:focus-visible,.conversation-item:hover{background:rgb(var(--ax-sys-color-light-surface));outline:none}.conversation-item-active{background:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.conversation-item-active:hover{background:rgb(var(--ax-sys-color-primary-lighter-surface))}.conversation-item-context-active{background:rgb(var(--ax-sys-color-light-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.35)}.conversation-item-active.conversation-item-context-active{background:rgb(var(--ax-sys-color-primary-lighter-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.45)}.item-avatar{flex-shrink:0}.avatar-wrapper{position:relative}.conversation-item-avatar-icon{font-size:1.35rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.avatar-status{position:absolute;bottom:2px;right:2px;width:12px;height:12px;border-radius:50%}.avatar-status.status-online{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-success-500))}// .avatar-status.status-offline{// border: 2px solid rgb(var(--ax-sys-color-surface));// background: rgb(var(--ax-sys-color-neutral));//}.avatar-status.status-away{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-warning-500))}.item-content{display:flex;flex-direction:column;gap:.25rem;flex:1;min-width:0;line-height:1.1rem}.item-header{display:flex;align-items:center;justify-content:space-between;gap:.25rem}.item-title{display:flex;align-items:center;// gap: .25rem;font-weight:600;font-size:.875rem;flex:1;min-width:0}.item-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.item-time{font-variant-numeric:tabular-nums;flex-shrink:0;font-size:.75rem;opacity:.7}.item-description{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;opacity:.7;min-width:0}.typing-indicator{color:rgb(var(--ax-sys-color-primary-500));font-style:italic;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.last-message{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.no-message{// font-weight: 600}.item-badge{flex-shrink:0}.mute-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
16903
17044
|
}
|
|
16904
17045
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationItemComponent, decorators: [{
|
|
16905
17046
|
type: Component,
|
|
@@ -17026,10 +17167,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
17026
17167
|
[openOn]="'click'"
|
|
17027
17168
|
[closeOn]="'click'"
|
|
17028
17169
|
(onOpening)="handleContextMenuOpening($event)"
|
|
17170
|
+
(onClose)="contextMenuOpen.set(false)"
|
|
17029
17171
|
(onItemClick)="handleContextMenuItemClick($event)"
|
|
17030
17172
|
>
|
|
17031
17173
|
</ax-context-menu>
|
|
17032
|
-
`, styles: [":host{display:block}.conversation-item{display:flex;align-items:center;gap:.75rem;padding:.375rem .75rem;margin:.375rem;border-radius:.5rem;cursor:pointer;transition:background .2s}.conversation-item:focus-visible,.conversation-item:hover{background:rgb(var(--ax-sys-color-light-surface));outline:none}.conversation-item-active{background:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.conversation-item-active:hover{background:rgb(var(--ax-sys-color-primary-lighter-surface))}.item-avatar{flex-shrink:0}.avatar-wrapper{position:relative}.conversation-item-avatar-icon{font-size:1.35rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.avatar-status{position:absolute;bottom:2px;right:2px;width:12px;height:12px;border-radius:50%}.avatar-status.status-online{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-success-500))}// .avatar-status.status-offline{// border: 2px solid rgb(var(--ax-sys-color-surface));// background: rgb(var(--ax-sys-color-neutral));//}.avatar-status.status-away{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-warning-500))}.item-content{display:flex;flex-direction:column;gap:.25rem;flex:1;min-width:0;line-height:1.1rem}.item-header{display:flex;align-items:center;justify-content:space-between;gap:.25rem}.item-title{display:flex;align-items:center;// gap: .25rem;font-weight:600;font-size:.875rem;flex:1;min-width:0}.item-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.item-time{font-variant-numeric:tabular-nums;flex-shrink:0;font-size:.75rem;opacity:.7}.item-description{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;opacity:.7;min-width:0}.typing-indicator{color:rgb(var(--ax-sys-color-primary-500));font-style:italic;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.last-message{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.no-message{// font-weight: 600}.item-badge{flex-shrink:0}.mute-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"] }]
|
|
17174
|
+
`, styles: [":host{display:block}.conversation-item{display:flex;align-items:center;gap:.75rem;padding:.375rem .75rem;margin:.375rem;border-radius:.5rem;cursor:pointer;transition:background .2s}.conversation-item:focus-visible,.conversation-item:hover{background:rgb(var(--ax-sys-color-light-surface));outline:none}.conversation-item-active{background:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.conversation-item-active:hover{background:rgb(var(--ax-sys-color-primary-lighter-surface))}.conversation-item-context-active{background:rgb(var(--ax-sys-color-light-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.35)}.conversation-item-active.conversation-item-context-active{background:rgb(var(--ax-sys-color-primary-lighter-surface));box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.45)}.item-avatar{flex-shrink:0}.avatar-wrapper{position:relative}.conversation-item-avatar-icon{font-size:1.35rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.avatar-status{position:absolute;bottom:2px;right:2px;width:12px;height:12px;border-radius:50%}.avatar-status.status-online{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-success-500))}// .avatar-status.status-offline{// border: 2px solid rgb(var(--ax-sys-color-surface));// background: rgb(var(--ax-sys-color-neutral));//}.avatar-status.status-away{border:2px solid rgb(var(--ax-sys-color-surface));background-color:rgb(var(--ax-sys-color-warning-500))}.item-content{display:flex;flex-direction:column;gap:.25rem;flex:1;min-width:0;line-height:1.1rem}.item-header{display:flex;align-items:center;justify-content:space-between;gap:.25rem}.item-title{display:flex;align-items:center;// gap: .25rem;font-weight:600;font-size:.875rem;flex:1;min-width:0}.item-title-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.item-time{font-variant-numeric:tabular-nums;flex-shrink:0;font-size:.75rem;opacity:.7}.item-description{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;opacity:.7;min-width:0}.typing-indicator{color:rgb(var(--ax-sys-color-primary-500));font-style:italic;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.last-message{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.no-message{// font-weight: 600}.item-badge{flex-shrink:0}.mute-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-warning-500))}.block-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-danger-500))}.pin-icon{font-size:.75rem;margin-left:.375rem;opacity:.6;color:rgb(var(--ax-sys-color-primary-500));flex-shrink:0}\n"] }]
|
|
17033
17175
|
}] });
|
|
17034
17176
|
|
|
17035
17177
|
class AXNewConversationDialogComponent extends AXBasePageComponent {
|
|
@@ -17474,7 +17616,9 @@ class AXSidebarService {
|
|
|
17474
17616
|
return `${c.id}:${time}`;
|
|
17475
17617
|
})
|
|
17476
17618
|
.join('|');
|
|
17477
|
-
|
|
17619
|
+
// Unread counts affect tab badges and list relevance — include so cache invalidates when only reads change
|
|
17620
|
+
const unreadHash = conversations.map((c) => `${c.id}:${c.unreadCount ?? 0}`).join('|');
|
|
17621
|
+
const cacheKey = `${conversations.length}-${query}-${tabId}-${pinnedIds}-${timestampsHash}-${unreadHash}`;
|
|
17478
17622
|
// Return cached result if available
|
|
17479
17623
|
if (this.filterCache.has(cacheKey)) {
|
|
17480
17624
|
const cached = this.filterCache.get(cacheKey);
|
|
@@ -17686,16 +17830,18 @@ class AXSidebarComponent {
|
|
|
17686
17830
|
<ax-tabs (onActiveTabChanged)="onTabChange($event)" [look]="'with-line'" [style.overflow]="'hidden'">
|
|
17687
17831
|
@for (tab of enabledTabs(); track tab.id) {
|
|
17688
17832
|
<ax-tab-item [text]="tab.label" [key]="tab.id">
|
|
17689
|
-
|
|
17690
|
-
|
|
17691
|
-
<ax-
|
|
17692
|
-
|
|
17693
|
-
|
|
17694
|
-
|
|
17695
|
-
|
|
17696
|
-
|
|
17697
|
-
|
|
17698
|
-
|
|
17833
|
+
@if (tab.icon) {
|
|
17834
|
+
<ax-prefix>
|
|
17835
|
+
<ax-icon>
|
|
17836
|
+
<i [class]="'tab-icon ' + tab.icon" aria-hidden="true"></i>
|
|
17837
|
+
</ax-icon>
|
|
17838
|
+
</ax-prefix>
|
|
17839
|
+
}
|
|
17840
|
+
@if (tab.badge && getBadgeValue(tab.id); as badgeText) {
|
|
17841
|
+
<ax-suffix>
|
|
17842
|
+
<ax-badge [text]="badgeText" [color]="'primary'" />
|
|
17843
|
+
</ax-suffix>
|
|
17844
|
+
}
|
|
17699
17845
|
</ax-tab-item>
|
|
17700
17846
|
}
|
|
17701
17847
|
</ax-tabs>
|
|
@@ -17760,12 +17906,13 @@ class AXSidebarComponent {
|
|
|
17760
17906
|
</ng-content>
|
|
17761
17907
|
</div>
|
|
17762
17908
|
</div>
|
|
17763
|
-
`, isInline: true, styles: [":host{display:block;width:100%;height:100%}.sidebar{display:flex;flex-direction:column;height:100%;//background: rgb(var(--ax-sys-color-lightest-surface));// border-inline-end: 1px solid rgb(var(--ax-sys-color-border-light-surface));position:relative}.sidebar-header{min-height:64px;display:flex;align-items:center;gap:.25rem;padding:.75rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.menu-button{flex-shrink:0}.sidebar-search{flex:1}.sidebar-list{flex:1;overflow-y:auto;position:relative;padding-bottom:4rem}.new-conversation-button-container{position:absolute;bottom:0;left:0;right:.25rem;padding:1rem .5rem;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.new-conversation-button-container-inner{display:flex;justify-content:center;align-items:center}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface))}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 2rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));gap:1rem}.empty-icon{font-size:4rem;line-height:1;opacity:.5;margin-bottom:.5rem}.empty-title{font-size:1.25rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface))}.empty-description{font-size:.875rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.7;max-width:300px;line-height:1.5}.empty-action{margin-top:.5rem}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}// ax-conversation-item:not(:last-child){// border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));//}.tab-icon{font-size:1rem}.conversation-skeleton{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.skeleton-avatar{flex-shrink:0;width:48px;height:48px;border-radius:50%}.skeleton-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:.5rem}.skeleton-header{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.skeleton-title{flex:1;height:1rem;border-radius:.25rem}.skeleton-time{font-variant-numeric:tabular-nums;width:3rem;height:.75rem;border-radius:.25rem}.skeleton-message{height:.75rem;width:80%;border-radius:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { 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: "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: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXConversationItemComponent, selector: "ax-conversation-item", inputs: ["avatarTemplate", "conversation"], outputs: ["clicked"] }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
17909
|
+
`, isInline: true, styles: [":host{display:block;width:100%;height:100%}.sidebar{display:flex;flex-direction:column;height:100%;//background: rgb(var(--ax-sys-color-lightest-surface));// border-inline-end: 1px solid rgb(var(--ax-sys-color-border-light-surface));position:relative}.sidebar-header{min-height:64px;display:flex;align-items:center;gap:.25rem;padding:.75rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.menu-button{flex-shrink:0}.sidebar-search{flex:1}.sidebar-list{flex:1;overflow-y:auto;position:relative;padding-bottom:4rem}.new-conversation-button-container{position:absolute;bottom:0;left:0;right:.25rem;padding:1rem .5rem;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.new-conversation-button-container-inner{display:flex;justify-content:center;align-items:center}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface))}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 2rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));gap:1rem}.empty-icon{font-size:4rem;line-height:1;opacity:.5;margin-bottom:.5rem}.empty-title{font-size:1.25rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface))}.empty-description{font-size:.875rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.7;max-width:300px;line-height:1.5}.empty-action{margin-top:.5rem}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}// ax-conversation-item:not(:last-child){// border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));//}.tab-icon{font-size:1rem}.conversation-skeleton{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.skeleton-avatar{flex-shrink:0;width:48px;height:48px;border-radius:50%}.skeleton-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:.5rem}.skeleton-header{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.skeleton-title{flex:1;height:1rem;border-radius:.25rem}.skeleton-time{font-variant-numeric:tabular-nums;width:3rem;height:.75rem;border-radius:.25rem}.skeleton-message{height:.75rem;width:80%;border-radius:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { 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: "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: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXConversationItemComponent, selector: "ax-conversation-item", inputs: ["avatarTemplate", "conversation"], outputs: ["clicked"] }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
17764
17910
|
}
|
|
17765
17911
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXSidebarComponent, decorators: [{
|
|
17766
17912
|
type: Component,
|
|
17767
17913
|
args: [{ selector: 'ax-conversation-sidebar', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
17768
17914
|
CommonModule,
|
|
17915
|
+
AXDecoratorModule,
|
|
17769
17916
|
AXTabsComponent,
|
|
17770
17917
|
AXTabItemComponent,
|
|
17771
17918
|
AXBadgeComponent,
|
|
@@ -17796,16 +17943,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
17796
17943
|
<ax-tabs (onActiveTabChanged)="onTabChange($event)" [look]="'with-line'" [style.overflow]="'hidden'">
|
|
17797
17944
|
@for (tab of enabledTabs(); track tab.id) {
|
|
17798
17945
|
<ax-tab-item [text]="tab.label" [key]="tab.id">
|
|
17799
|
-
|
|
17800
|
-
|
|
17801
|
-
<ax-
|
|
17802
|
-
|
|
17803
|
-
|
|
17804
|
-
|
|
17805
|
-
|
|
17806
|
-
|
|
17807
|
-
|
|
17808
|
-
|
|
17946
|
+
@if (tab.icon) {
|
|
17947
|
+
<ax-prefix>
|
|
17948
|
+
<ax-icon>
|
|
17949
|
+
<i [class]="'tab-icon ' + tab.icon" aria-hidden="true"></i>
|
|
17950
|
+
</ax-icon>
|
|
17951
|
+
</ax-prefix>
|
|
17952
|
+
}
|
|
17953
|
+
@if (tab.badge && getBadgeValue(tab.id); as badgeText) {
|
|
17954
|
+
<ax-suffix>
|
|
17955
|
+
<ax-badge [text]="badgeText" [color]="'primary'" />
|
|
17956
|
+
</ax-suffix>
|
|
17957
|
+
}
|
|
17809
17958
|
</ax-tab-item>
|
|
17810
17959
|
}
|
|
17811
17960
|
</ax-tabs>
|
|
@@ -18357,5 +18506,5 @@ function getErrorMessage(code, params) {
|
|
|
18357
18506
|
* Generated bundle index. Do not edit.
|
|
18358
18507
|
*/
|
|
18359
18508
|
|
|
18360
|
-
export { AXAudioInfoBarBannerComponent, AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, AXComposerActionRegistry, AXComposerComponent, AXComposerPopupComponent, AXComposerService, AXComposerTabRegistry, AXConversation2Module, AXConversationAiApiKey, AXConversationAiResponderService, AXConversationApi, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationService, AXConversationSharedStorage, AXConversationStoreService, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXFileUploadService, AXForwardMessageDialogComponent, AXImagePickerComponent, AXImageRendererComponent, AXInfiniteScrollDirective, AXInfoBarActionRegistry, AXInfoBarComponent, AXInfoBarSearchComponent, AXInfoBarService, AXLocationPickerComponent, AXLocationRendererComponent, AXMessageActionRegistry, AXMessageApi, AXMessageListComponent, AXMessageListService, AXMessageRendererRegistry, AXNewConversationDialogComponent, AXPickerFooterComponent, AXPickerHeaderComponent, AXRealtimeApi, AXRegistryService, AXSidebarComponent, AXSidebarService, AXStickerRendererComponent, AXStickerTabComponent, AXSystemRendererComponent, AXTextRendererComponent, AXUserApi, AXVideoInfoBarBannerComponent, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceInfoBarBannerComponent, AXVoiceRecorderComponent, AXVoiceRendererComponent, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_COPY_ACTION, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, AX_STICKER_API_KEY, CONNECTION_ERRORS, CONVERSATION_CONFIG, CONVERSATION_ERRORS, DEFAULT_COMPOSER_ACTIONS, DEFAULT_COMPOSER_TABS, DEFAULT_CONVERSATION_ITEM_ACTIONS, DEFAULT_CONVERSATION_TABS, DEFAULT_INFO_BAR_ACTIONS, DEFAULT_MESSAGE_ACTIONS, DEFAULT_MESSAGE_RENDERERS, ERROR_HANDLER_CONFIG, ERROR_MESSAGES, FILE_ERRORS, LOCATION_ERRORS, MESSAGE_ERRORS, PERMISSION_ERRORS, REGISTRY_CONFIG, URL_ERRORS, USER_ERRORS, axConversationIndexedDbStorage, conversationSharedStorage, formatErrorMessage, getDefaultConversationItemActions, getErrorMessage, mergeWithDefaults, provideConversation, sanitizeInput, validateConversationId, validateEmail, validateFile, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
|
|
18509
|
+
export { AXAudioInfoBarBannerComponent, AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, AXComposerActionRegistry, AXComposerComponent, AXComposerPopupComponent, AXComposerService, AXComposerTabRegistry, AXConversation2Module, AXConversationAiApiKey, AXConversationAiResponderService, AXConversationApi, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationService, AXConversationSharedStorage, AXConversationStoreService, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXFileUploadService, AXForwardMessageDialogComponent, AXImagePickerComponent, AXImageRendererComponent, AXInfiniteScrollDirective, AXInfoBarActionRegistry, AXInfoBarComponent, AXInfoBarSearchComponent, AXInfoBarService, AXLocationPickerComponent, AXLocationRendererComponent, AXMessageActionRegistry, AXMessageApi, AXMessageListComponent, AXMessageListNoActiveDefaultComponent, AXMessageListService, AXMessageRendererRegistry, AXNewConversationDialogComponent, AXPickerFooterComponent, AXPickerHeaderComponent, AXRealtimeApi, AXRegistryService, AXSidebarComponent, AXSidebarService, AXStickerRendererComponent, AXStickerTabComponent, AXSystemRendererComponent, AXTextRendererComponent, AXUserApi, AXVideoInfoBarBannerComponent, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceInfoBarBannerComponent, AXVoiceRecorderComponent, AXVoiceRendererComponent, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_COPY_ACTION, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_BOT, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, AX_STICKER_API_KEY, CONNECTION_ERRORS, CONVERSATION_CONFIG, CONVERSATION_ERRORS, DEFAULT_COMPOSER_ACTIONS, DEFAULT_COMPOSER_TABS, DEFAULT_CONVERSATION_ITEM_ACTIONS, DEFAULT_CONVERSATION_TABS, DEFAULT_INFO_BAR_ACTIONS, DEFAULT_MESSAGE_ACTIONS, DEFAULT_MESSAGE_RENDERERS, ERROR_HANDLER_CONFIG, ERROR_MESSAGES, FILE_ERRORS, LOCATION_ERRORS, MESSAGE_ERRORS, PERMISSION_ERRORS, REGISTRY_CONFIG, URL_ERRORS, USER_ERRORS, axConversationIndexedDbStorage, conversationSharedStorage, formatErrorMessage, getDefaultConversationItemActions, getErrorMessage, mergeWithDefaults, provideConversation, sanitizeInput, validateConversationId, validateEmail, validateFile, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
|
|
18361
18510
|
//# sourceMappingURL=acorex-components-conversation2.mjs.map
|