@acorex/components 22.0.0-next.35 → 22.0.0-next.37
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.
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { AXComponentCloseEvent, AXCommonModule, AXDataSource, AXClosableComponent } from '@acorex/cdk/common';
|
|
2
|
+
import * as i1 from '@acorex/components/decorators';
|
|
3
|
+
import { AXDecoratorModule, AXDecoratorGenericComponent } from '@acorex/components/decorators';
|
|
2
4
|
import { AXTabsComponent, AXTabItemComponent } from '@acorex/components/tabs';
|
|
3
5
|
import * as i2 from '@angular/common';
|
|
4
6
|
import { CommonModule, NgComponentOutlet, isPlatformBrowser, DOCUMENT, AsyncPipe } from '@angular/common';
|
|
5
7
|
import * as i0 from '@angular/core';
|
|
6
|
-
import { InjectionToken, inject, Injectable, signal, computed, Injector, runInInjectionContext, PLATFORM_ID, DestroyRef, viewChild, ViewContainerRef, input, output, effect, ViewEncapsulation, Component, ElementRef, HostListener, Directive, EventEmitter, afterNextRender, untracked, model, viewChildren, SecurityContext, NgModule } from '@angular/core';
|
|
8
|
+
import { InjectionToken, inject, Injectable, signal, computed, Injector, runInInjectionContext, PLATFORM_ID, DestroyRef, viewChild, ViewContainerRef, input, output, effect, ViewEncapsulation, Component, ElementRef, HostListener, Directive, EventEmitter, afterNextRender, untracked, NgZone, ChangeDetectorRef, model, viewChildren, SecurityContext, NgModule } from '@angular/core';
|
|
7
9
|
import { AXUploaderService, AXUploaderZoneDirective, AXUploaderBrowseDirective } from '@acorex/cdk/uploader';
|
|
8
10
|
import { AXDialogService } from '@acorex/components/dialog';
|
|
9
11
|
import { AXPopupService } from '@acorex/components/popup';
|
|
@@ -12,13 +14,11 @@ import * as i3 from '@acorex/core/translation';
|
|
|
12
14
|
import { translateSync, AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
|
|
13
15
|
import { Subject, BehaviorSubject, takeUntil, catchError, EMPTY, throttleTime, debounceTime, distinctUntilChanged, Observable, filter, firstValueFrom } from 'rxjs';
|
|
14
16
|
import { AXButtonComponent, AXButtonItemComponent, AXButtonItemListComponent } from '@acorex/components/button';
|
|
15
|
-
import * as i1$1 from '@acorex/components/decorators';
|
|
16
|
-
import { AXDecoratorModule, AXDecoratorGenericComponent } from '@acorex/components/decorators';
|
|
17
17
|
import { AXDropdownPanelComponent } from '@acorex/components/dropdown';
|
|
18
18
|
import { AXPopoverComponent } from '@acorex/components/popover';
|
|
19
19
|
import { AXTextAreaComponent } from '@acorex/components/text-area';
|
|
20
20
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
21
|
-
import * as i1 from '@angular/forms';
|
|
21
|
+
import * as i1$1 from '@angular/forms';
|
|
22
22
|
import { FormsModule } from '@angular/forms';
|
|
23
23
|
import { AXLoadingComponent } from '@acorex/components/loading';
|
|
24
24
|
import { AXResizableDirective } from '@acorex/cdk/resizable';
|
|
@@ -36,6 +36,7 @@ import { AXContextMenuComponent } from '@acorex/components/menu';
|
|
|
36
36
|
import { AXDateTimeModule } from '@acorex/core/date-time';
|
|
37
37
|
import * as i3$1 from '@acorex/core/format';
|
|
38
38
|
import { AXFormatModule } from '@acorex/core/format';
|
|
39
|
+
import { AXPlatform } from '@acorex/core/platform';
|
|
39
40
|
import * as i1$6 from '@acorex/components/skeleton';
|
|
40
41
|
import { AXSkeletonComponent, AXSkeletonModule } from '@acorex/components/skeleton';
|
|
41
42
|
import { AXBasePageComponent } from '@acorex/components/page';
|
|
@@ -60,35 +61,19 @@ import { DomSanitizer } from '@angular/platform-browser';
|
|
|
60
61
|
* Centralized configuration values to avoid magic numbers
|
|
61
62
|
*/
|
|
62
63
|
|
|
63
|
-
const AX_ALL_CONVERSATION_MEDIA_PICKERS = [
|
|
64
|
-
'image',
|
|
65
|
-
'video',
|
|
66
|
-
'audio',
|
|
67
|
-
'file',
|
|
68
|
-
'voice',
|
|
69
|
-
'location',
|
|
70
|
-
];
|
|
71
|
-
const AX_ALL_CONVERSATION_COMPOSER_TABS = ['emoji', 'sticker'];
|
|
72
|
-
function resolveConversationMediaPickers(features) {
|
|
73
|
-
return features?.mediaPickers ?? AX_ALL_CONVERSATION_MEDIA_PICKERS;
|
|
74
|
-
}
|
|
75
|
-
function resolveConversationComposerTabs(features) {
|
|
76
|
-
return features?.composerTabs ?? AX_ALL_CONVERSATION_COMPOSER_TABS;
|
|
77
|
-
}
|
|
78
|
-
function isMediaPickerEnabled(picker, features) {
|
|
79
|
-
return resolveConversationMediaPickers(features).includes(picker);
|
|
80
|
-
}
|
|
81
|
-
function isComposerTabEnabled(tab, features) {
|
|
82
|
-
return resolveConversationComposerTabs(features).includes(tab);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
64
|
/**
|
|
65
|
+
|
|
86
66
|
* Default Configuration Values
|
|
67
|
+
|
|
87
68
|
* Centralized defaults to avoid magic numbers throughout the codebase
|
|
69
|
+
|
|
88
70
|
*/
|
|
89
71
|
/**
|
|
72
|
+
|
|
90
73
|
* Default conversation configuration
|
|
74
|
+
|
|
91
75
|
* All values are explicitly defined here for easy maintenance and documentation
|
|
76
|
+
|
|
92
77
|
*/
|
|
93
78
|
const AX_DEFAULT_CONVERSATION_CONFIG = {
|
|
94
79
|
// Pagination
|
|
@@ -123,16 +108,20 @@ const AX_DEFAULT_CONVERSATION_CONFIG = {
|
|
|
123
108
|
// Message list
|
|
124
109
|
messageListBackground: '',
|
|
125
110
|
features: {
|
|
126
|
-
|
|
127
|
-
composerTabs: [...AX_ALL_CONVERSATION_COMPOSER_TABS],
|
|
111
|
+
composerTabs: [],
|
|
128
112
|
},
|
|
129
113
|
debugApiLogging: false,
|
|
130
114
|
};
|
|
131
115
|
/**
|
|
116
|
+
|
|
132
117
|
* Helper function to merge user config with defaults
|
|
118
|
+
|
|
133
119
|
* Properly handles array merging to avoid reference issues
|
|
120
|
+
|
|
134
121
|
* @param userConfig - User-provided configuration
|
|
122
|
+
|
|
135
123
|
* @returns Merged configuration with all required fields
|
|
124
|
+
|
|
136
125
|
*/
|
|
137
126
|
function mergeWithDefaults(userConfig) {
|
|
138
127
|
if (!userConfig) {
|
|
@@ -144,7 +133,6 @@ function mergeWithDefaults(userConfig) {
|
|
|
144
133
|
features: {
|
|
145
134
|
...AX_DEFAULT_CONVERSATION_CONFIG.features,
|
|
146
135
|
...userConfig.features,
|
|
147
|
-
mediaPickers: userConfig.features?.mediaPickers ?? AX_DEFAULT_CONVERSATION_CONFIG.features.mediaPickers,
|
|
148
136
|
composerTabs: userConfig.features?.composerTabs ?? AX_DEFAULT_CONVERSATION_CONFIG.features.composerTabs,
|
|
149
137
|
},
|
|
150
138
|
};
|
|
@@ -247,6 +235,13 @@ const AX_CONVERSATION_REGISTRY_CONFIG = new InjectionToken('AX_CONVERSATION_REGI
|
|
|
247
235
|
factory: () => ({}),
|
|
248
236
|
});
|
|
249
237
|
|
|
238
|
+
function resolveConversationComposerTabs(features) {
|
|
239
|
+
return features?.composerTabs ?? [];
|
|
240
|
+
}
|
|
241
|
+
function isComposerTabEnabled(tab, features) {
|
|
242
|
+
return resolveConversationComposerTabs(features).includes(tab);
|
|
243
|
+
}
|
|
244
|
+
|
|
250
245
|
/**
|
|
251
246
|
* API call logger for AXConversationService.
|
|
252
247
|
* Enabled via `debugApiLogging` in conversation config.
|
|
@@ -839,6 +834,19 @@ const AX_CONVERSATION_GENERIC_PRIVATE_TITLES = new Set(['', 'new chat', 'new con
|
|
|
839
834
|
function isGenericPrivateConversationTitle(title) {
|
|
840
835
|
return AX_CONVERSATION_GENERIC_PRIVATE_TITLES.has((title ?? '').trim().toLowerCase());
|
|
841
836
|
}
|
|
837
|
+
/**
|
|
838
|
+
* Find an existing private 1:1 conversation between the current user and a peer.
|
|
839
|
+
* Matches conversations with exactly those two participants.
|
|
840
|
+
*/
|
|
841
|
+
function findExistingPrivateConversation(conversations, currentUserId, peerUserId) {
|
|
842
|
+
return conversations.find((conversation) => {
|
|
843
|
+
if (conversation.type !== 'private') {
|
|
844
|
+
return false;
|
|
845
|
+
}
|
|
846
|
+
const participantIds = new Set(conversation.participants.map((participant) => participant.id));
|
|
847
|
+
return participantIds.size === 2 && participantIds.has(currentUserId) && participantIds.has(peerUserId);
|
|
848
|
+
});
|
|
849
|
+
}
|
|
842
850
|
/** Other participant in a private 1v1 chat (excludes the current viewer). */
|
|
843
851
|
function resolvePrivatePeerParticipant(conversation, currentUserId) {
|
|
844
852
|
if (conversation.type !== 'private') {
|
|
@@ -894,6 +902,11 @@ function resolveConversationForViewer(conversation, currentUserId) {
|
|
|
894
902
|
icon,
|
|
895
903
|
};
|
|
896
904
|
}
|
|
905
|
+
/** Whether message reactions are enabled for a conversation. Defaults to `true` when omitted. */
|
|
906
|
+
function isConversationReactionsEnabled(conversation) {
|
|
907
|
+
const value = conversation?.metadata?.reactionsEnabled;
|
|
908
|
+
return value !== false;
|
|
909
|
+
}
|
|
897
910
|
|
|
898
911
|
const AX_CONVERSATION_MEDIA_TYPES = new Set(['image', 'video', 'audio', 'file']);
|
|
899
912
|
const normalizers = {};
|
|
@@ -1366,6 +1379,9 @@ function withNormalizedPayload(message) {
|
|
|
1366
1379
|
return { ...message, timestamp, payload: normalizeMessagePayload(message.payload) };
|
|
1367
1380
|
}
|
|
1368
1381
|
class AXConversationState {
|
|
1382
|
+
bumpInboxRevision() {
|
|
1383
|
+
this._inboxRevision.update((revision) => revision + 1);
|
|
1384
|
+
}
|
|
1369
1385
|
constructor(config) {
|
|
1370
1386
|
this.config = config;
|
|
1371
1387
|
this._conversations = signal(new Map(), /* @ts-ignore */
|
|
@@ -1374,15 +1390,21 @@ class AXConversationState {
|
|
|
1374
1390
|
...(ngDevMode ? [{ debugName: "_messages" }] : /* istanbul ignore next */ []));
|
|
1375
1391
|
this._conversationMessages = signal(new Map(), /* @ts-ignore */
|
|
1376
1392
|
...(ngDevMode ? [{ debugName: "_conversationMessages" }] : /* istanbul ignore next */ []));
|
|
1393
|
+
/** Bumped on every inbox mutation so derived lists always recompute. */
|
|
1394
|
+
this._inboxRevision = signal(0, /* @ts-ignore */
|
|
1395
|
+
...(ngDevMode ? [{ debugName: "_inboxRevision" }] : /* istanbul ignore next */ []));
|
|
1377
1396
|
this.conversations = computed(() => {
|
|
1397
|
+
this._inboxRevision();
|
|
1378
1398
|
const convMap = this._conversations();
|
|
1379
1399
|
return Array.from(convMap.values());
|
|
1380
|
-
},
|
|
1400
|
+
}, /* @ts-ignore */
|
|
1401
|
+
...(ngDevMode ? [{ debugName: "conversations" }] : /* istanbul ignore next */ []));
|
|
1381
1402
|
}
|
|
1382
1403
|
setConversations(conversations) {
|
|
1383
1404
|
const convMap = new Map();
|
|
1384
1405
|
conversations.forEach((conv) => convMap.set(conv.id, conv));
|
|
1385
1406
|
this._conversations.set(convMap);
|
|
1407
|
+
this.bumpInboxRevision();
|
|
1386
1408
|
}
|
|
1387
1409
|
addConversations(conversations) {
|
|
1388
1410
|
this._conversations.update((existingConversations) => {
|
|
@@ -1398,6 +1420,7 @@ class AXConversationState {
|
|
|
1398
1420
|
}
|
|
1399
1421
|
return newConversations;
|
|
1400
1422
|
});
|
|
1423
|
+
this.bumpInboxRevision();
|
|
1401
1424
|
}
|
|
1402
1425
|
setConversation(conversation) {
|
|
1403
1426
|
this._conversations.update((conversations) => {
|
|
@@ -1405,6 +1428,7 @@ class AXConversationState {
|
|
|
1405
1428
|
newConversations.set(conversation.id, conversation);
|
|
1406
1429
|
return newConversations;
|
|
1407
1430
|
});
|
|
1431
|
+
this.bumpInboxRevision();
|
|
1408
1432
|
}
|
|
1409
1433
|
getConversation(conversationId) {
|
|
1410
1434
|
return this._conversations().get(conversationId);
|
|
@@ -1421,6 +1445,7 @@ class AXConversationState {
|
|
|
1421
1445
|
newConversations.delete(conversationId);
|
|
1422
1446
|
return newConversations;
|
|
1423
1447
|
});
|
|
1448
|
+
this.bumpInboxRevision();
|
|
1424
1449
|
const messageIds = this._conversationMessages().get(conversationId) || [];
|
|
1425
1450
|
this._messages.update((messages) => {
|
|
1426
1451
|
const newMessages = new Map(messages);
|
|
@@ -1938,56 +1963,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
1938
1963
|
}]
|
|
1939
1964
|
}], ctorParameters: () => [] });
|
|
1940
1965
|
|
|
1941
|
-
const
|
|
1942
|
-
async
|
|
1943
|
-
|
|
1944
|
-
|
|
1966
|
+
const AX_CONVERSATION_FILE_CATALOG_LOADERS = {
|
|
1967
|
+
[AX_CONVERSATION_IMAGE_CATALOG]: async () => {
|
|
1968
|
+
const mod = await Promise.resolve().then(function () { return conversationImage_fileType; });
|
|
1969
|
+
return mod.createConversationImageFileType();
|
|
1970
|
+
},
|
|
1971
|
+
[AX_CONVERSATION_VIDEO_CATALOG]: async () => {
|
|
1972
|
+
const mod = await Promise.resolve().then(function () { return conversationVideo_fileType; });
|
|
1973
|
+
return mod.createConversationVideoFileType();
|
|
1974
|
+
},
|
|
1975
|
+
[AX_CONVERSATION_AUDIO_CATALOG]: async () => {
|
|
1976
|
+
const mod = await Promise.resolve().then(function () { return conversationAudio_fileType; });
|
|
1977
|
+
return mod.createConversationAudioFileType();
|
|
1978
|
+
},
|
|
1979
|
+
[AX_CONVERSATION_FILE_CATALOG]: async () => {
|
|
1980
|
+
const mod = await Promise.resolve().then(function () { return conversationFile_fileType; });
|
|
1981
|
+
return mod.createConversationFileFileType();
|
|
1982
|
+
},
|
|
1983
|
+
[AX_CONVERSATION_VOICE_CATALOG]: async () => {
|
|
1984
|
+
const mod = await Promise.resolve().then(function () { return conversationVoice_fileType; });
|
|
1985
|
+
return mod.createConversationVoiceFileType();
|
|
1986
|
+
},
|
|
1987
|
+
};
|
|
1988
|
+
async function loadConversationFileTypes(catalogNames) {
|
|
1989
|
+
const uniqueCatalogs = [...new Set(catalogNames.filter(Boolean))];
|
|
1990
|
+
if (!uniqueCatalogs.length) {
|
|
1945
1991
|
return [];
|
|
1946
1992
|
}
|
|
1947
1993
|
const types = [];
|
|
1948
|
-
for (const
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
types.push(mod.createConversationImageFileType());
|
|
1953
|
-
break;
|
|
1954
|
-
}
|
|
1955
|
-
case 'video': {
|
|
1956
|
-
const mod = await Promise.resolve().then(function () { return conversationVideo_fileType; });
|
|
1957
|
-
types.push(mod.createConversationVideoFileType());
|
|
1958
|
-
break;
|
|
1959
|
-
}
|
|
1960
|
-
case 'audio': {
|
|
1961
|
-
const mod = await Promise.resolve().then(function () { return conversationAudio_fileType; });
|
|
1962
|
-
types.push(mod.createConversationAudioFileType());
|
|
1963
|
-
break;
|
|
1964
|
-
}
|
|
1965
|
-
case 'file': {
|
|
1966
|
-
const mod = await Promise.resolve().then(function () { return conversationFile_fileType; });
|
|
1967
|
-
types.push(mod.createConversationFileFileType());
|
|
1968
|
-
break;
|
|
1969
|
-
}
|
|
1970
|
-
case 'voice': {
|
|
1971
|
-
const mod = await Promise.resolve().then(function () { return conversationVoice_fileType; });
|
|
1972
|
-
types.push(mod.createConversationVoiceFileType());
|
|
1973
|
-
break;
|
|
1974
|
-
}
|
|
1994
|
+
for (const catalogName of uniqueCatalogs) {
|
|
1995
|
+
const loader = AX_CONVERSATION_FILE_CATALOG_LOADERS[catalogName];
|
|
1996
|
+
if (loader) {
|
|
1997
|
+
types.push(await loader());
|
|
1975
1998
|
}
|
|
1976
1999
|
}
|
|
1977
2000
|
return types;
|
|
1978
2001
|
}
|
|
1979
|
-
/**
|
|
2002
|
+
/** Built-in conversation catalogs (lazy-loaded on first registry resolve). */
|
|
2003
|
+
const AX_CONVERSATION_BUILTIN_FILE_CATALOGS = [
|
|
2004
|
+
AX_CONVERSATION_IMAGE_CATALOG,
|
|
2005
|
+
AX_CONVERSATION_VIDEO_CATALOG,
|
|
2006
|
+
AX_CONVERSATION_AUDIO_CATALOG,
|
|
2007
|
+
AX_CONVERSATION_FILE_CATALOG,
|
|
2008
|
+
AX_CONVERSATION_VOICE_CATALOG,
|
|
2009
|
+
];
|
|
2010
|
+
/**
|
|
2011
|
+
* Lazy-loads conversation file catalogs for the root file-type registry.
|
|
2012
|
+
* Must not inject {@link AXConversationComposerActionRegistry} — that registry
|
|
2013
|
+
* depends on {@link AXFileTypeRegistryService}, which would create a circular DI cycle.
|
|
2014
|
+
*/
|
|
1980
2015
|
class AXConversationComposerFileTypesProvider extends AXFileTypeInfoProvider {
|
|
1981
|
-
constructor() {
|
|
1982
|
-
super(...arguments);
|
|
1983
|
-
this.config = inject(AX_CONVERSATION_CONFIG, { optional: true });
|
|
1984
|
-
this.cache = null;
|
|
1985
|
-
}
|
|
1986
2016
|
async items() {
|
|
1987
|
-
|
|
1988
|
-
this.cache = await loadConversationFileTypes(this.config?.features);
|
|
1989
|
-
}
|
|
1990
|
-
return this.cache;
|
|
2017
|
+
return loadConversationFileTypes([...AX_CONVERSATION_BUILTIN_FILE_CATALOGS]);
|
|
1991
2018
|
}
|
|
1992
2019
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerFileTypesProvider, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1993
2020
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerFileTypesProvider }); }
|
|
@@ -1998,8 +2025,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
1998
2025
|
|
|
1999
2026
|
/** Ensures built-in conversation catalogs exist on the root file-type registry. */
|
|
2000
2027
|
const AX_CONVERSATION_FILE_TYPES_READY = new InjectionToken('AX_CONVERSATION_FILE_TYPES_READY');
|
|
2001
|
-
/** Registers validation rules and lazy conversation file-type catalogs for
|
|
2002
|
-
function provideConversationComposerFileTypes(
|
|
2028
|
+
/** Registers validation rules and lazy conversation file-type catalogs for composer actions. */
|
|
2029
|
+
function provideConversationComposerFileTypes() {
|
|
2003
2030
|
return [
|
|
2004
2031
|
provideFileValidationRules(),
|
|
2005
2032
|
provideFileTypeInfoProvider(AXConversationComposerFileTypesProvider),
|
|
@@ -2010,6 +2037,122 @@ function provideConversationComposerFileTypes(_features) {
|
|
|
2010
2037
|
];
|
|
2011
2038
|
}
|
|
2012
2039
|
|
|
2040
|
+
const AX_CONVERSATION_COMPOSER_EMOJI_TAB = {
|
|
2041
|
+
id: 'emoji',
|
|
2042
|
+
title: '@acorex:chat.tabs.emoji',
|
|
2043
|
+
icon: 'fa-light fa-face-smile',
|
|
2044
|
+
priority: 100,
|
|
2045
|
+
componentLoader: () => Promise.resolve().then(function () { return index$1; }).then((m) => m.AXConversationEmojiTabComponent),
|
|
2046
|
+
enabled: true,
|
|
2047
|
+
};
|
|
2048
|
+
const AX_CONVERSATION_COMPOSER_STICKER_TAB = {
|
|
2049
|
+
id: 'sticker',
|
|
2050
|
+
title: '@acorex:chat.tabs.stickers',
|
|
2051
|
+
icon: 'fa-light fa-note-sticky',
|
|
2052
|
+
priority: 90,
|
|
2053
|
+
componentLoader: () => Promise.resolve().then(function () { return index; }).then((m) => m.AXConversationStickerTabComponent),
|
|
2054
|
+
enabled: true,
|
|
2055
|
+
};
|
|
2056
|
+
/** Built-in composer popup tabs keyed by {@link AXConversationComposerTabFeature}. */
|
|
2057
|
+
const AX_CONVERSATION_BUILTIN_COMPOSER_TABS = {
|
|
2058
|
+
emoji: AX_CONVERSATION_COMPOSER_EMOJI_TAB,
|
|
2059
|
+
sticker: AX_CONVERSATION_COMPOSER_STICKER_TAB,
|
|
2060
|
+
};
|
|
2061
|
+
|
|
2062
|
+
/**
|
|
2063
|
+
* Composer Tab Registry
|
|
2064
|
+
* Register custom tabs for the composer popup (emoji, stickers, GIFs, etc.)
|
|
2065
|
+
*/
|
|
2066
|
+
/**
|
|
2067
|
+
* Composer Tab Registry Service
|
|
2068
|
+
*/
|
|
2069
|
+
class AXConversationComposerTabRegistry {
|
|
2070
|
+
constructor() {
|
|
2071
|
+
this._tabs = signal([], /* @ts-ignore */
|
|
2072
|
+
...(ngDevMode ? [{ debugName: "_tabs" }] : /* istanbul ignore next */ []));
|
|
2073
|
+
this.translation = inject(AXTranslationService);
|
|
2074
|
+
/** All registered tabs */
|
|
2075
|
+
this.tabs = this._tabs.asReadonly();
|
|
2076
|
+
/** Enabled tabs sorted by priority */
|
|
2077
|
+
this.enabledTabs = computed(() => [...this._tabs()].filter((tab) => tab.enabled !== false).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)), /* @ts-ignore */
|
|
2078
|
+
...(ngDevMode ? [{ debugName: "enabledTabs" }] : /* istanbul ignore next */ []));
|
|
2079
|
+
/** Whether the composer popup has any tabs to show. */
|
|
2080
|
+
this.hasEnabledTabs = computed(() => this.enabledTabs().length > 0, /* @ts-ignore */
|
|
2081
|
+
...(ngDevMode ? [{ debugName: "hasEnabledTabs" }] : /* istanbul ignore next */ []));
|
|
2082
|
+
const conversationConfig = inject(AX_CONVERSATION_CONFIG, { optional: true });
|
|
2083
|
+
for (const tabId of resolveConversationComposerTabs(conversationConfig?.features)) {
|
|
2084
|
+
const builtIn = AX_CONVERSATION_BUILTIN_COMPOSER_TABS[tabId];
|
|
2085
|
+
if (builtIn) {
|
|
2086
|
+
this.register(builtIn);
|
|
2087
|
+
}
|
|
2088
|
+
}
|
|
2089
|
+
inject(AX_CONVERSATION_DEFAULT_COMPOSER_TABS, { optional: true })?.forEach((tab) => this.register(tab));
|
|
2090
|
+
const registryConfig = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });
|
|
2091
|
+
registryConfig?.composerTabs?.forEach((tab) => this.register(tab));
|
|
2092
|
+
}
|
|
2093
|
+
/**
|
|
2094
|
+
* Register a composer tab
|
|
2095
|
+
*/
|
|
2096
|
+
register(tab) {
|
|
2097
|
+
// Validate tab
|
|
2098
|
+
if (!tab.id) {
|
|
2099
|
+
throw new Error('Composer tab must have an id');
|
|
2100
|
+
}
|
|
2101
|
+
if (!tab.title) {
|
|
2102
|
+
throw new Error('Composer tab must have a title');
|
|
2103
|
+
}
|
|
2104
|
+
if (!tab.component && !tab.componentLoader) {
|
|
2105
|
+
throw new Error('Composer tab must have a component or componentLoader');
|
|
2106
|
+
}
|
|
2107
|
+
// Check for duplicates
|
|
2108
|
+
const existing = this._tabs().find((t) => t.id === tab.id);
|
|
2109
|
+
if (existing) {
|
|
2110
|
+
console.warn(`Composer tab "${tab.id}" is already registered. Replacing...`);
|
|
2111
|
+
this.unregister(tab.id);
|
|
2112
|
+
}
|
|
2113
|
+
// Add to registry
|
|
2114
|
+
this._tabs.update((tabs) => [...tabs, tab]);
|
|
2115
|
+
}
|
|
2116
|
+
/**
|
|
2117
|
+
* Unregister a composer tab
|
|
2118
|
+
*/
|
|
2119
|
+
unregister(id) {
|
|
2120
|
+
this._tabs.update((tabs) => tabs.filter((t) => t.id !== id));
|
|
2121
|
+
}
|
|
2122
|
+
/**
|
|
2123
|
+
* Get tab by ID
|
|
2124
|
+
*/
|
|
2125
|
+
getTabById(id) {
|
|
2126
|
+
return this._tabs().find((t) => t.id === id);
|
|
2127
|
+
}
|
|
2128
|
+
getTabTitle(tab) {
|
|
2129
|
+
return this.translation.translateSync(tab.title);
|
|
2130
|
+
}
|
|
2131
|
+
/**
|
|
2132
|
+
* Enable/disable a tab
|
|
2133
|
+
*/
|
|
2134
|
+
setEnabled(id, enabled) {
|
|
2135
|
+
this._tabs.update((tabs) => tabs.map((tab) => (tab.id === id ? { ...tab, enabled } : tab)));
|
|
2136
|
+
}
|
|
2137
|
+
/**
|
|
2138
|
+
* Update tab badge
|
|
2139
|
+
*/
|
|
2140
|
+
setBadge(id, badge) {
|
|
2141
|
+
this._tabs.update((tabs) => tabs.map((tab) => (tab.id === id ? { ...tab, badge } : tab)));
|
|
2142
|
+
}
|
|
2143
|
+
/**
|
|
2144
|
+
* Clear all tabs
|
|
2145
|
+
*/
|
|
2146
|
+
clear() {
|
|
2147
|
+
this._tabs.set([]);
|
|
2148
|
+
}
|
|
2149
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerTabRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2150
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerTabRegistry }); }
|
|
2151
|
+
}
|
|
2152
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerTabRegistry, decorators: [{
|
|
2153
|
+
type: Injectable
|
|
2154
|
+
}], ctorParameters: () => [] });
|
|
2155
|
+
|
|
2013
2156
|
/**
|
|
2014
2157
|
* Composer Action Registry
|
|
2015
2158
|
* Register custom action buttons for the composer (attach, voice, location, etc.)
|
|
@@ -2027,7 +2170,7 @@ class AXConversationComposerActionRegistry {
|
|
|
2027
2170
|
...(ngDevMode ? [{ debugName: "_actions" }] : /* istanbul ignore next */ []));
|
|
2028
2171
|
this.translation = inject(AXTranslationService);
|
|
2029
2172
|
this.injector = inject(Injector);
|
|
2030
|
-
this.
|
|
2173
|
+
this.composerTabRegistry = inject(AXConversationComposerTabRegistry);
|
|
2031
2174
|
/** All registered actions */
|
|
2032
2175
|
this.actions = this._actions.asReadonly();
|
|
2033
2176
|
/** Left-side actions sorted by priority */
|
|
@@ -2085,11 +2228,16 @@ class AXConversationComposerActionRegistry {
|
|
|
2085
2228
|
// Add to registry
|
|
2086
2229
|
this._actions.update((actions) => [...actions, action]);
|
|
2087
2230
|
if (action.fileType) {
|
|
2231
|
+
this.fileTypeRegistry().invalidateCache();
|
|
2088
2232
|
void this.ensureFileTypeExists(action.fileType);
|
|
2089
2233
|
}
|
|
2090
2234
|
}
|
|
2235
|
+
/** Resolved lazily to avoid a DI cycle with {@link AXConversationComposerFileTypesProvider}. */
|
|
2236
|
+
fileTypeRegistry() {
|
|
2237
|
+
return this.injector.get(AXFileTypeRegistryService);
|
|
2238
|
+
}
|
|
2091
2239
|
async ensureFileTypeExists(fileType) {
|
|
2092
|
-
const match = await this.fileTypeRegistry.get(fileType);
|
|
2240
|
+
const match = await this.fileTypeRegistry().get(fileType);
|
|
2093
2241
|
if (!match) {
|
|
2094
2242
|
console.warn(`[AXConversationComposerActionRegistry] Unknown fileType "${fileType}". ` +
|
|
2095
2243
|
'Register its AXFileTypeInfoProvider in app providers before using this action.');
|
|
@@ -2106,7 +2254,13 @@ class AXConversationComposerActionRegistry {
|
|
|
2106
2254
|
*/
|
|
2107
2255
|
getVisibleActions(position, context) {
|
|
2108
2256
|
const actions = position === 'left' ? this.leftActions() : this.rightActions();
|
|
2109
|
-
|
|
2257
|
+
const hasComposerTabs = this.composerTabRegistry.hasEnabledTabs();
|
|
2258
|
+
return actions.filter((action) => {
|
|
2259
|
+
if (action.id === 'emoji' && !hasComposerTabs) {
|
|
2260
|
+
return false;
|
|
2261
|
+
}
|
|
2262
|
+
return runInInjectionContext(this.injector, () => action.visible(context));
|
|
2263
|
+
});
|
|
2110
2264
|
}
|
|
2111
2265
|
/**
|
|
2112
2266
|
* Get enabled actions for a position
|
|
@@ -2185,92 +2339,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
2185
2339
|
type: Injectable
|
|
2186
2340
|
}], ctorParameters: () => [] });
|
|
2187
2341
|
|
|
2188
|
-
/**
|
|
2189
|
-
* Composer Tab Registry
|
|
2190
|
-
* Register custom tabs for the composer popup (emoji, stickers, GIFs, etc.)
|
|
2191
|
-
*/
|
|
2192
|
-
/**
|
|
2193
|
-
* Composer Tab Registry Service
|
|
2194
|
-
*/
|
|
2195
|
-
class AXConversationComposerTabRegistry {
|
|
2196
|
-
constructor() {
|
|
2197
|
-
this._tabs = signal([], /* @ts-ignore */
|
|
2198
|
-
...(ngDevMode ? [{ debugName: "_tabs" }] : /* istanbul ignore next */ []));
|
|
2199
|
-
this.translation = inject(AXTranslationService);
|
|
2200
|
-
/** All registered tabs */
|
|
2201
|
-
this.tabs = this._tabs.asReadonly();
|
|
2202
|
-
/** Enabled tabs sorted by priority */
|
|
2203
|
-
this.enabledTabs = computed(() => [...this._tabs()].filter((tab) => tab.enabled !== false).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)), /* @ts-ignore */
|
|
2204
|
-
...(ngDevMode ? [{ debugName: "enabledTabs" }] : /* istanbul ignore next */ []));
|
|
2205
|
-
// Register default tabs from individual token
|
|
2206
|
-
inject(AX_CONVERSATION_DEFAULT_COMPOSER_TABS, { optional: true })?.forEach((tab) => this.register(tab));
|
|
2207
|
-
// Register tabs from AX_CONVERSATION_REGISTRY_CONFIG
|
|
2208
|
-
const config = inject(AX_CONVERSATION_REGISTRY_CONFIG, { optional: true });
|
|
2209
|
-
config?.composerTabs?.forEach((tab) => this.register(tab));
|
|
2210
|
-
}
|
|
2211
|
-
/**
|
|
2212
|
-
* Register a composer tab
|
|
2213
|
-
*/
|
|
2214
|
-
register(tab) {
|
|
2215
|
-
// Validate tab
|
|
2216
|
-
if (!tab.id) {
|
|
2217
|
-
throw new Error('Composer tab must have an id');
|
|
2218
|
-
}
|
|
2219
|
-
if (!tab.title) {
|
|
2220
|
-
throw new Error('Composer tab must have a title');
|
|
2221
|
-
}
|
|
2222
|
-
if (!tab.component && !tab.componentLoader) {
|
|
2223
|
-
throw new Error('Composer tab must have a component or componentLoader');
|
|
2224
|
-
}
|
|
2225
|
-
// Check for duplicates
|
|
2226
|
-
const existing = this._tabs().find((t) => t.id === tab.id);
|
|
2227
|
-
if (existing) {
|
|
2228
|
-
console.warn(`Composer tab "${tab.id}" is already registered. Replacing...`);
|
|
2229
|
-
this.unregister(tab.id);
|
|
2230
|
-
}
|
|
2231
|
-
// Add to registry
|
|
2232
|
-
this._tabs.update((tabs) => [...tabs, tab]);
|
|
2233
|
-
}
|
|
2234
|
-
/**
|
|
2235
|
-
* Unregister a composer tab
|
|
2236
|
-
*/
|
|
2237
|
-
unregister(id) {
|
|
2238
|
-
this._tabs.update((tabs) => tabs.filter((t) => t.id !== id));
|
|
2239
|
-
}
|
|
2240
|
-
/**
|
|
2241
|
-
* Get tab by ID
|
|
2242
|
-
*/
|
|
2243
|
-
getTabById(id) {
|
|
2244
|
-
return this._tabs().find((t) => t.id === id);
|
|
2245
|
-
}
|
|
2246
|
-
getTabTitle(tab) {
|
|
2247
|
-
return this.translation.translateSync(tab.title);
|
|
2248
|
-
}
|
|
2249
|
-
/**
|
|
2250
|
-
* Enable/disable a tab
|
|
2251
|
-
*/
|
|
2252
|
-
setEnabled(id, enabled) {
|
|
2253
|
-
this._tabs.update((tabs) => tabs.map((tab) => (tab.id === id ? { ...tab, enabled } : tab)));
|
|
2254
|
-
}
|
|
2255
|
-
/**
|
|
2256
|
-
* Update tab badge
|
|
2257
|
-
*/
|
|
2258
|
-
setBadge(id, badge) {
|
|
2259
|
-
this._tabs.update((tabs) => tabs.map((tab) => (tab.id === id ? { ...tab, badge } : tab)));
|
|
2260
|
-
}
|
|
2261
|
-
/**
|
|
2262
|
-
* Clear all tabs
|
|
2263
|
-
*/
|
|
2264
|
-
clear() {
|
|
2265
|
-
this._tabs.set([]);
|
|
2266
|
-
}
|
|
2267
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerTabRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2268
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerTabRegistry }); }
|
|
2269
|
-
}
|
|
2270
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerTabRegistry, decorators: [{
|
|
2271
|
-
type: Injectable
|
|
2272
|
-
}], ctorParameters: () => [] });
|
|
2273
|
-
|
|
2274
2342
|
/**
|
|
2275
2343
|
* Abstract Base Registry
|
|
2276
2344
|
* Base class for all registries with common functionality
|
|
@@ -3075,6 +3143,8 @@ class AXConversationService {
|
|
|
3075
3143
|
this.initPromise = null;
|
|
3076
3144
|
/** Generation counter — stale page-0 loads are ignored after conversation switches. */
|
|
3077
3145
|
this.messageLoadGeneration = 0;
|
|
3146
|
+
/** Bumps when a conversation is created while a list load is in flight. */
|
|
3147
|
+
this.conversationListLoadGeneration = 0;
|
|
3078
3148
|
/** Batched read-receipt queue keyed by conversation ID. */
|
|
3079
3149
|
this.readQueue = new Map();
|
|
3080
3150
|
/** Session cache for available reaction emojis. */
|
|
@@ -3222,14 +3292,20 @@ class AXConversationService {
|
|
|
3222
3292
|
async loadConversations() {
|
|
3223
3293
|
this._loading.set(true);
|
|
3224
3294
|
this._error.set(null);
|
|
3295
|
+
const loadGeneration = this.conversationListLoadGeneration;
|
|
3225
3296
|
try {
|
|
3226
3297
|
const pagination = {
|
|
3227
3298
|
page: 0,
|
|
3228
3299
|
pageSize: this.config.conversationPageSize,
|
|
3229
3300
|
};
|
|
3230
3301
|
const result = await this.callApi('loadConversations', 'conversationApi', 'getConversations', () => this.conversationApi.getConversations(pagination, undefined), pagination, undefined);
|
|
3231
|
-
|
|
3232
|
-
|
|
3302
|
+
if (loadGeneration !== this.conversationListLoadGeneration) {
|
|
3303
|
+
// A create (or newer reload) started while this request was in flight — merge, do not replace.
|
|
3304
|
+
this.state.addConversations(result.items);
|
|
3305
|
+
}
|
|
3306
|
+
else {
|
|
3307
|
+
this.state.setConversations(result.items);
|
|
3308
|
+
}
|
|
3233
3309
|
this._conversationsPagination.set({
|
|
3234
3310
|
page: 0,
|
|
3235
3311
|
hasMore: result.hasMore,
|
|
@@ -3827,7 +3903,22 @@ class AXConversationService {
|
|
|
3827
3903
|
* Updates conversation metadata including unread count, last message, etc.
|
|
3828
3904
|
*/
|
|
3829
3905
|
handleConversationUpdate(conversation) {
|
|
3830
|
-
this.
|
|
3906
|
+
this.syncConversationToInbox(conversation);
|
|
3907
|
+
}
|
|
3908
|
+
/**
|
|
3909
|
+
* Insert or refresh a conversation in the in-memory inbox.
|
|
3910
|
+
* @param promote When true, bumps activity so the chat sorts to the top (create / reopen).
|
|
3911
|
+
*/
|
|
3912
|
+
syncConversationToInbox(conversation, promote = false) {
|
|
3913
|
+
const now = new Date();
|
|
3914
|
+
const existing = this.state.getConversation(conversation.id);
|
|
3915
|
+
const base = existing ?? conversation;
|
|
3916
|
+
this.state.setConversation({
|
|
3917
|
+
...base,
|
|
3918
|
+
...conversation,
|
|
3919
|
+
lastMessageAt: promote ? now : (conversation.lastMessageAt ?? base.lastMessageAt ?? now),
|
|
3920
|
+
updatedAt: conversation.updatedAt ?? now,
|
|
3921
|
+
});
|
|
3831
3922
|
}
|
|
3832
3923
|
/**
|
|
3833
3924
|
* Update conversation's last message
|
|
@@ -3936,17 +4027,31 @@ class AXConversationService {
|
|
|
3936
4027
|
* @param participantIds - Array of participant user IDs
|
|
3937
4028
|
* @param type - Conversation type (private, group, channel)
|
|
3938
4029
|
* @param metadata - Optional metadata (title, avatar, etc.)
|
|
3939
|
-
* @
|
|
4030
|
+
* @param options - Optional flags (`forceCreate` recreates private chats even when one exists)
|
|
4031
|
+
* @returns Created or existing conversation
|
|
3940
4032
|
*/
|
|
3941
|
-
async createConversation(participantIds, type, metadata) {
|
|
4033
|
+
async createConversation(participantIds, type, metadata, options) {
|
|
3942
4034
|
try {
|
|
4035
|
+
await this.ensureInitialized();
|
|
3943
4036
|
const currentUser = this._currentUser();
|
|
3944
4037
|
const creatorId = currentUser?.id;
|
|
3945
4038
|
const isPrivate = type === 'private';
|
|
4039
|
+
const forceCreate = options?.forceCreate === true;
|
|
3946
4040
|
const scopedParticipantIds = [...participantIds];
|
|
3947
4041
|
if (creatorId && !scopedParticipantIds.includes(creatorId)) {
|
|
3948
4042
|
scopedParticipantIds.unshift(creatorId);
|
|
3949
4043
|
}
|
|
4044
|
+
if (isPrivate && !forceCreate && creatorId) {
|
|
4045
|
+
const peerUserId = scopedParticipantIds.find((id) => id !== creatorId);
|
|
4046
|
+
if (peerUserId) {
|
|
4047
|
+
const existing = findExistingPrivateConversation(this.state.conversations(), creatorId, peerUserId);
|
|
4048
|
+
if (existing) {
|
|
4049
|
+
this.syncConversationToInbox(existing, true);
|
|
4050
|
+
return resolveConversationForViewer(existing, creatorId);
|
|
4051
|
+
}
|
|
4052
|
+
}
|
|
4053
|
+
}
|
|
4054
|
+
this.conversationListLoadGeneration++;
|
|
3950
4055
|
const createData = {
|
|
3951
4056
|
type,
|
|
3952
4057
|
participantIds: scopedParticipantIds,
|
|
@@ -3956,9 +4061,10 @@ class AXConversationService {
|
|
|
3956
4061
|
avatar: isPrivate ? undefined : AXConversationService.normalizeOptionalString(metadata?.['avatar']),
|
|
3957
4062
|
icon: isPrivate ? undefined : AXConversationService.normalizeOptionalString(metadata?.['icon']),
|
|
3958
4063
|
metadata: isPrivate ? undefined : metadata,
|
|
4064
|
+
forceCreate,
|
|
3959
4065
|
};
|
|
3960
4066
|
const conversation = await this.callApi('createConversation', 'conversationApi', 'createConversation', () => this.conversationApi.createConversation(createData), createData);
|
|
3961
|
-
this.
|
|
4067
|
+
this.syncConversationToInbox(conversation, true);
|
|
3962
4068
|
return resolveConversationForViewer(conversation, creatorId);
|
|
3963
4069
|
}
|
|
3964
4070
|
catch (error) {
|
|
@@ -4506,6 +4612,9 @@ class AXConversationComposerPopupComponent {
|
|
|
4506
4612
|
/** Enabled tabs from registry */
|
|
4507
4613
|
this.enabledTabs = computed(() => this.registry.composerTabs.enabledTabs(), /* @ts-ignore */
|
|
4508
4614
|
...(ngDevMode ? [{ debugName: "enabledTabs" }] : /* istanbul ignore next */ []));
|
|
4615
|
+
/** Whether more than one tab is available */
|
|
4616
|
+
this.hasMultipleTabs = computed(() => this.enabledTabs().length > 1, /* @ts-ignore */
|
|
4617
|
+
...(ngDevMode ? [{ debugName: "hasMultipleTabs" }] : /* istanbul ignore next */ []));
|
|
4509
4618
|
// Load first tab by default
|
|
4510
4619
|
effect(() => {
|
|
4511
4620
|
if (!this.activeTabId() && this.enabledTabs().length > 0) {
|
|
@@ -4585,11 +4694,11 @@ class AXConversationComposerPopupComponent {
|
|
|
4585
4694
|
this.onClosed.emit(event);
|
|
4586
4695
|
}
|
|
4587
4696
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerPopupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4588
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationComposerPopupComponent, isStandalone: true, selector: "ax-conversation-composer-popup", inputs: { isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, onItemSelected: { classPropertyName: "onItemSelected", publicName: "onItemSelected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", itemSelected: "itemSelected", onClosed: "onClosed" }, viewQueries: [{ propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: "
|
|
4697
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationComposerPopupComponent, isStandalone: true, selector: "ax-conversation-composer-popup", inputs: { isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, onItemSelected: { classPropertyName: "onItemSelected", publicName: "onItemSelected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", itemSelected: "itemSelected", onClosed: "onClosed" }, viewQueries: [{ propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: "<div\n class=\"composer-popup\"\n [class.composer-popup--single-tab]=\"!hasMultipleTabs()\"\n>\n @if (hasMultipleTabs()) {\n <header class=\"composer-popup__header\">\n <ax-tabs look=\"default\" location=\"top\" [fitParent]=\"true\" (onActiveTabChanged)=\"onTabChange($event)\">\n @for (tab of enabledTabs(); track tab.id) {\n <ax-tab-item\n [text]=\"getTabTitle(tab.id)\"\n [key]=\"tab.id\"\n [active]=\"activeTabId() === tab.id\"\n [attr.aria-label]=\"getTabTitle(tab.id)\"\n [title]=\"getTabTitle(tab.id)\"\n >\n <ax-prefix>\n @if (tab.icon) {\n <i [class]=\"tab.icon\" aria-hidden=\"true\"></i>\n }\n </ax-prefix>\n </ax-tab-item>\n }\n </ax-tabs>\n </header>\n }\n\n <div class=\"composer-popup__content\">\n <ng-container #contentContainer></ng-container>\n </div>\n</div>\n", styles: ["@layer properties;@layer components{.composer-emoji-popover-panel{overflow:hidden;border-radius:.65rem;border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));width:min(22rem,92vw);box-shadow:0 4px 16px #0000001a}.composer-emoji-popover{display:block;width:100%}ax-conversation-composer-popup{display:block;height:100%;width:100%}ax-conversation-composer-popup .composer-popup{display:flex;width:100%;flex-direction:column;overflow:hidden;height:min(22rem,55vh);min-height:18rem}ax-conversation-composer-popup .composer-popup--single-tab .composer-popup__content{padding-top:calc(var(--spacing, .25rem) * 3)}ax-conversation-composer-popup .composer-popup__header{flex-shrink:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline:calc(var(--spacing, .25rem) * 2.5);padding-top:calc(var(--spacing, .25rem) * 2.5);padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-composer-popup .composer-popup__header ax-tabs{width:100%}ax-conversation-composer-popup .composer-popup__header ax-tab-item{min-height:calc(var(--spacing, .25rem) * 9);justify-content:center;padding-inline:calc(var(--spacing, .25rem) * 2)}ax-conversation-composer-popup .composer-popup__header ax-tab-item .ax-tab-item-text{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border-width:0}ax-conversation-composer-popup .composer-popup__header ax-tab-item ax-prefix{display:flex;align-items:center;justify-content:center}ax-conversation-composer-popup .composer-popup__header ax-tab-item ax-prefix i{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: 1;line-height:1}ax-conversation-composer-popup .composer-popup__content{min-height:calc(var(--spacing, .25rem) * 0);flex:1;overflow-x:hidden;overflow-y:auto;padding-inline:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 3);scrollbar-gutter:stable}ax-conversation-composer-popup .composer-popup__content>ng-component{display:flex;height:100%;min-height:calc(var(--spacing, .25rem) * 0);width:100%;flex-direction:column}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.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"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
4589
4698
|
}
|
|
4590
4699
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerPopupComponent, decorators: [{
|
|
4591
4700
|
type: Component,
|
|
4592
|
-
args: [{ selector: 'ax-conversation-composer-popup', encapsulation: ViewEncapsulation.None, imports: [CommonModule, AXTabsComponent, AXTabItemComponent], template: "
|
|
4701
|
+
args: [{ selector: 'ax-conversation-composer-popup', encapsulation: ViewEncapsulation.None, imports: [CommonModule, AXDecoratorModule, AXTabsComponent, AXTabItemComponent], template: "<div\n class=\"composer-popup\"\n [class.composer-popup--single-tab]=\"!hasMultipleTabs()\"\n>\n @if (hasMultipleTabs()) {\n <header class=\"composer-popup__header\">\n <ax-tabs look=\"default\" location=\"top\" [fitParent]=\"true\" (onActiveTabChanged)=\"onTabChange($event)\">\n @for (tab of enabledTabs(); track tab.id) {\n <ax-tab-item\n [text]=\"getTabTitle(tab.id)\"\n [key]=\"tab.id\"\n [active]=\"activeTabId() === tab.id\"\n [attr.aria-label]=\"getTabTitle(tab.id)\"\n [title]=\"getTabTitle(tab.id)\"\n >\n <ax-prefix>\n @if (tab.icon) {\n <i [class]=\"tab.icon\" aria-hidden=\"true\"></i>\n }\n </ax-prefix>\n </ax-tab-item>\n }\n </ax-tabs>\n </header>\n }\n\n <div class=\"composer-popup__content\">\n <ng-container #contentContainer></ng-container>\n </div>\n</div>\n", styles: ["@layer properties;@layer components{.composer-emoji-popover-panel{overflow:hidden;border-radius:.65rem;border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));width:min(22rem,92vw);box-shadow:0 4px 16px #0000001a}.composer-emoji-popover{display:block;width:100%}ax-conversation-composer-popup{display:block;height:100%;width:100%}ax-conversation-composer-popup .composer-popup{display:flex;width:100%;flex-direction:column;overflow:hidden;height:min(22rem,55vh);min-height:18rem}ax-conversation-composer-popup .composer-popup--single-tab .composer-popup__content{padding-top:calc(var(--spacing, .25rem) * 3)}ax-conversation-composer-popup .composer-popup__header{flex-shrink:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline:calc(var(--spacing, .25rem) * 2.5);padding-top:calc(var(--spacing, .25rem) * 2.5);padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-composer-popup .composer-popup__header ax-tabs{width:100%}ax-conversation-composer-popup .composer-popup__header ax-tab-item{min-height:calc(var(--spacing, .25rem) * 9);justify-content:center;padding-inline:calc(var(--spacing, .25rem) * 2)}ax-conversation-composer-popup .composer-popup__header ax-tab-item .ax-tab-item-text{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border-width:0}ax-conversation-composer-popup .composer-popup__header ax-tab-item ax-prefix{display:flex;align-items:center;justify-content:center}ax-conversation-composer-popup .composer-popup__header ax-tab-item ax-prefix i{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: 1;line-height:1}ax-conversation-composer-popup .composer-popup__content{min-height:calc(var(--spacing, .25rem) * 0);flex:1;overflow-x:hidden;overflow-y:auto;padding-inline:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 3);scrollbar-gutter:stable}ax-conversation-composer-popup .composer-popup__content>ng-component{display:flex;height:100%;min-height:calc(var(--spacing, .25rem) * 0);width:100%;flex-direction:column}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
4593
4702
|
}], ctorParameters: () => [], propDecorators: { contentContainer: [{ type: i0.ViewChild, args: ['contentContainer', { ...{
|
|
4594
4703
|
read: ViewContainerRef,
|
|
4595
4704
|
}, isSignal: true }] }], isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }], onItemSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "onItemSelected", required: false }] }], onClosed: [{ type: i0.Output, args: ["onClosed"] }] } });
|
|
@@ -4603,6 +4712,122 @@ function resolveComposerMaxFiles(action, config) {
|
|
|
4603
4712
|
return Math.max(1, action?.maxFiles ?? config.maxFilesPerMessage);
|
|
4604
4713
|
}
|
|
4605
4714
|
|
|
4715
|
+
/** Library default when no per-conversation or global background is set. */
|
|
4716
|
+
const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND = {
|
|
4717
|
+
light: 'rgb(var(--ax-sys-color-primary-lightest-surface))',
|
|
4718
|
+
dark: 'linear-gradient(165deg, rgba(var(--ax-sys-color-primary-900), 0.14) 0%, rgb(var(--ax-sys-color-darker-surface)) 72%)',
|
|
4719
|
+
};
|
|
4720
|
+
/** Predefined chat-area backgrounds for the info panel (light + dark variants). */
|
|
4721
|
+
const AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS = [
|
|
4722
|
+
{
|
|
4723
|
+
id: 'solid-default',
|
|
4724
|
+
value: AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND,
|
|
4725
|
+
},
|
|
4726
|
+
{
|
|
4727
|
+
id: 'solid-graphite',
|
|
4728
|
+
value: {
|
|
4729
|
+
light: 'rgb(var(--ax-sys-color-lighter-surface))',
|
|
4730
|
+
dark: 'rgb(var(--ax-sys-color-darker-surface))',
|
|
4731
|
+
},
|
|
4732
|
+
},
|
|
4733
|
+
{
|
|
4734
|
+
id: 'solid-olive',
|
|
4735
|
+
value: {
|
|
4736
|
+
light: 'rgba(132, 144, 88, 0.24)',
|
|
4737
|
+
dark: 'linear-gradient(165deg, rgba(163, 177, 110, 0.12) 0%, rgb(var(--ax-sys-color-darker-surface)) 70%)',
|
|
4738
|
+
},
|
|
4739
|
+
},
|
|
4740
|
+
{
|
|
4741
|
+
id: 'solid-sky',
|
|
4742
|
+
value: {
|
|
4743
|
+
light: 'rgba(56, 189, 248, 0.2)',
|
|
4744
|
+
dark: 'linear-gradient(165deg, rgba(14, 165, 233, 0.14) 0%, rgb(var(--ax-sys-color-darker-surface)) 72%)',
|
|
4745
|
+
},
|
|
4746
|
+
},
|
|
4747
|
+
{
|
|
4748
|
+
id: 'grad-aurora',
|
|
4749
|
+
value: {
|
|
4750
|
+
light: 'linear-gradient(140deg, #60a5fa 0%, #a78bfa 55%, #f472b6 100%)',
|
|
4751
|
+
dark: 'linear-gradient(140deg, rgba(30, 58, 138, 0.5) 0%, rgba(76, 29, 149, 0.38) 52%, rgb(var(--ax-sys-color-darker-surface)) 100%)',
|
|
4752
|
+
},
|
|
4753
|
+
},
|
|
4754
|
+
{
|
|
4755
|
+
id: 'grad-sunset',
|
|
4756
|
+
value: {
|
|
4757
|
+
light: 'linear-gradient(140deg, rgba(251, 113, 133, 0.34) 0%, rgba(251, 191, 36, 0.32) 100%)',
|
|
4758
|
+
dark: 'linear-gradient(140deg, rgba(159, 18, 57, 0.38) 0%, rgba(146, 64, 14, 0.32) 55%, rgb(var(--ax-sys-color-darker-surface)) 100%)',
|
|
4759
|
+
},
|
|
4760
|
+
},
|
|
4761
|
+
];
|
|
4762
|
+
const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID = 'solid-default';
|
|
4763
|
+
|
|
4764
|
+
/** Subtle chat-area wash when `messageListBackground` is not set (theme-aware). */
|
|
4765
|
+
const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND = AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND.light;
|
|
4766
|
+
function isMessageListThemeBackground(value) {
|
|
4767
|
+
return (typeof value === 'object' &&
|
|
4768
|
+
value !== null &&
|
|
4769
|
+
'light' in value &&
|
|
4770
|
+
'dark' in value &&
|
|
4771
|
+
typeof value.light === 'string' &&
|
|
4772
|
+
typeof value.dark === 'string');
|
|
4773
|
+
}
|
|
4774
|
+
/** Pick the raw CSS string for the active theme; `undefined` when unset. */
|
|
4775
|
+
function resolveMessageListBackgroundRaw(value, isDark) {
|
|
4776
|
+
if (value === undefined) {
|
|
4777
|
+
return undefined;
|
|
4778
|
+
}
|
|
4779
|
+
if (typeof value === 'string') {
|
|
4780
|
+
return value;
|
|
4781
|
+
}
|
|
4782
|
+
return isDark ? value.dark : value.light;
|
|
4783
|
+
}
|
|
4784
|
+
/** Turn bare `https://...` or `/path` into valid CSS `background` for images. */
|
|
4785
|
+
function normalizeMessageListBackgroundValue(raw) {
|
|
4786
|
+
const v = raw.trim();
|
|
4787
|
+
if (v === '') {
|
|
4788
|
+
return AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND;
|
|
4789
|
+
}
|
|
4790
|
+
const lower = v.toLowerCase();
|
|
4791
|
+
if (lower === 'transparent' || lower === 'none') {
|
|
4792
|
+
return v;
|
|
4793
|
+
}
|
|
4794
|
+
if (/^url\s*\(/i.test(v)) {
|
|
4795
|
+
return v;
|
|
4796
|
+
}
|
|
4797
|
+
if (/^https?:\/\//i.test(v)) {
|
|
4798
|
+
const escaped = v.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
4799
|
+
return `url("${escaped}") center / cover no-repeat`;
|
|
4800
|
+
}
|
|
4801
|
+
if (v.startsWith('/') && !/^(linear|radial|conic|rgb|hsl|var)\b/i.test(v)) {
|
|
4802
|
+
const escaped = v.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
4803
|
+
return `url("${escaped}") center / cover no-repeat`;
|
|
4804
|
+
}
|
|
4805
|
+
return v;
|
|
4806
|
+
}
|
|
4807
|
+
/** Resolve config/metadata background for the active theme, with library default fallback. */
|
|
4808
|
+
function resolveMessageListBackgroundStyle(value, isDark) {
|
|
4809
|
+
const raw = resolveMessageListBackgroundRaw(value, isDark) ??
|
|
4810
|
+
resolveMessageListBackgroundRaw(AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND, isDark);
|
|
4811
|
+
if (raw === undefined) {
|
|
4812
|
+
return AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND;
|
|
4813
|
+
}
|
|
4814
|
+
return normalizeMessageListBackgroundValue(raw);
|
|
4815
|
+
}
|
|
4816
|
+
/** Whether two stored backgrounds represent the same preset (supports legacy string values). */
|
|
4817
|
+
function isSameMessageListBackground(a, b, isDark) {
|
|
4818
|
+
if (a === undefined) {
|
|
4819
|
+
return false;
|
|
4820
|
+
}
|
|
4821
|
+
if (typeof a === 'string') {
|
|
4822
|
+
if (a === '') {
|
|
4823
|
+
return false;
|
|
4824
|
+
}
|
|
4825
|
+
const themeValue = isDark ? b.dark : b.light;
|
|
4826
|
+
return a === themeValue;
|
|
4827
|
+
}
|
|
4828
|
+
return a.light === b.light && a.dark === b.dark;
|
|
4829
|
+
}
|
|
4830
|
+
|
|
4606
4831
|
function isUserProfile(value) {
|
|
4607
4832
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4608
4833
|
}
|
|
@@ -5695,7 +5920,7 @@ class AXConversationComposerComponent {
|
|
|
5695
5920
|
}
|
|
5696
5921
|
}
|
|
5697
5922
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5698
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationComposerComponent, isStandalone: true, selector: "ax-conversation-composer", outputs: { messageSent: "messageSent", emojiClick: "emojiClick", attachClick: "attachClick", voiceClick: "voiceClick" }, viewQueries: [{ propertyName: "textAreaRef", first: true, predicate: ["inputElement"], descendants: true, read: AXTextAreaComponent, isSignal: true }, { propertyName: "emojiPopoverRef", first: true, predicate: ["emojiPopover"], descendants: true, isSignal: true }], ngImport: i0, template: " @if (activeConversation()) {\n <div class=\"composer\">\n <!-- Full-Width Component Mode -->\n @if (activeComponent()) {\n <div class=\"composer-component-fullwidth\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeComponent()!.component\"\n [componentLoader]=\"activeComponent()!.componentLoader\"\n [inputs]=\"getComponentInputs()\"\n />\n </div>\n } @else {\n <!-- Normal Composer Mode -->\n <!-- Edit/Reply Banner -->\n @if (editingMessage() || replyingToMessage()) {\n <div\n class=\"ax-conversation-composer-banner\"\n [class.ax-conversation-composer-banner--edit]=\"!!editingMessage()\"\n [class.ax-conversation-composer-banner--reply]=\"!!replyingToMessage()\"\n >\n <div class=\"ax-conversation-composer-banner__accent\" aria-hidden=\"true\"></div>\n @if (editingMessage()) {\n <div class=\"ax-conversation-composer-banner__content\">\n <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n ><i class=\"fa-light fa-pen-to-square\"></i\n ></span>\n <div class=\"ax-conversation-composer-banner__body\">\n <span class=\"ax-conversation-composer-banner__label\">{{\n '@acorex:chat.composer.editing-message' | translate | async\n }}</span>\n @if (getEditingPreview(); as preview) {\n <span class=\"ax-conversation-composer-banner__preview\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n {{ getComposerPreviewLabel(preview) }}\n </span>\n }\n </div>\n </div>\n } @else if (replyingToMessage()) {\n <div class=\"ax-conversation-composer-banner__content\">\n <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n ><i class=\"fa-light fa-reply\"></i\n ></span>\n <div\n class=\"ax-conversation-composer-banner__body ax-conversation-composer-banner__body--clickable\"\n (click)=\"onReplyPreviewClick()\"\n >\n <span class=\"ax-conversation-composer-banner__label\">\n {{ '@acorex:chat.composer.replying-to' | translate | async }} {{ getReplyingSenderName() }}\n </span>\n @if (getReplyingPreview(); as preview) {\n <span class=\"ax-conversation-composer-banner__preview\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n {{ getComposerPreviewLabel(preview) }}\n </span>\n }\n </div>\n </div>\n }\n <button\n type=\"button\"\n class=\"ax-conversation-composer-banner__close\"\n (click)=\"cancelEditReply()\"\n [attr.aria-label]=\"'@acorex:chat.actions.cancel' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n\n <!-- Input Area -->\n <div class=\"composer-input-container\">\n <!-- Left Actions -->\n <div class=\"composer-actions-left\">\n @for (action of leftInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n #leftActionButton\n (click)=\"onActionClick(action.id, $event)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (leftMenuActions().length > 0) {\n <ax-button color=\"primary\" look=\"outline\">\n <i class=\"fa-light fa-ellipsis\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of leftMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n\n <!-- Text Input -->\n <div class=\"composer-input-wrapper\">\n <ax-text-area\n #inputElement\n [(ngModel)]=\"draftText\"\n (onKeyDown)=\"onKeyDown($event)\"\n (onValueChanged)=\"onInput()\"\n [placeholder]=\"placeholder()\"\n (onKeyDown)=\"onEnter($event)\"\n [rows]=\"inputRows()\"\n ></ax-text-area>\n </div>\n\n <!-- Right Actions -->\n <div class=\"composer-actions-right\">\n @if (draftText().trim().length === 0 && !attachments().length) {\n <!-- Show action buttons when empty -->\n @for (action of rightInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n [class.action-voice]=\"action.id === 'voice-recording'\"\n (click)=\"onActionClick(action.id)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n [attr.axUploaderBrowseHandle]=\"action.id === 'attach' ? '' : null\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (rightMenuActions().length > 0) {\n <ax-button look=\"blank\">\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of rightMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n } @else {\n <!-- Show send/save button when has content -->\n <button\n type=\"button\"\n class=\"action-button action-send\"\n (click)=\"onSendClick()\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"\n editingMessage()\n ? ('@acorex:chat.actions.save' | translate | async)\n : ('@acorex:chat.actions.send' | translate | async)\n \"\n >\n <i\n [class]=\"editingMessage() ? 'send-icon fa-light fa-check' : 'send-icon fa-light fa-paper-plane'\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Attachments Preview -->\n @if (attachments().length > 0) {\n <div class=\"composer-attachments\">\n @for (attachment of attachments(); track $index) {\n <div class=\"attachment-item\">\n <span class=\"attachment-icon\"><i class=\"fa-light fa-paperclip\"></i></span>\n <span class=\"attachment-name\">{{ attachment.name }}</span>\n <button\n type=\"button\"\n class=\"attachment-remove\"\n (click)=\"removeAttachment($index)\"\n [attr.aria-label]=\"'@acorex:chat.actions.remove-attachment' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Typing Indicator -->\n @if (showTypingIndicator()) {\n <div class=\"typing-indicator-container\">\n <span class=\"typing-indicator\">{{ '@acorex:chat.status.someone-typing' | translate | async }}</span>\n </div>\n }\n }\n </div>\n }\n\n <!-- Popover for emoji/sticker picker -->\n @if (emojiPopoverTarget()) {\n <ax-popover\n #emojiPopover\n [target]=\"emojiPopoverTarget()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'top-start'\"\n (onClosed)=\"onEmojiPopoverClosed()\"\n >\n <div class=\"composer-emoji-popover\">\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"composerPopupLoader\"\n [inputs]=\"getEmojiPopupInputs()\"\n />\n </div>\n </ax-popover>\n }\n", styles: ["@layer properties;@layer components{ax-conversation-composer{display:block;width:100%}ax-conversation-composer .ax-conversation-composer-banner{display:flex;min-height:2.75rem;align-items:stretch;gap:calc(var(--spacing, .25rem) * 0);border-block-style:var(--tw-border-style);border-block-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-light-surface))}ax-conversation-composer .ax-conversation-composer-banner__accent{width:3px;flex-shrink:0;border-start-end-radius:var(--radius-sm, .25rem);border-end-end-radius:var(--radius-sm, .25rem);background-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__accent{background-color:rgba(var(--ax-sys-color-secondary-500))}ax-conversation-composer .ax-conversation-composer-banner__content{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;gap:calc(var(--spacing, .25rem) * 2.5);padding-inline:calc(var(--spacing, .25rem) * 2.5);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-composer .ax-conversation-composer-banner__icon{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);font-size:.8125rem;color:rgba(var(--ax-sys-color-primary-600));background:rgba(var(--ax-sys-color-primary-500),.1)}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__icon{color:rgba(var(--ax-sys-color-secondary-600));background:rgba(var(--ax-sys-color-secondary-500),.1)}ax-conversation-composer .ax-conversation-composer-banner__body{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-composer .ax-conversation-composer-banner__body--clickable{cursor:pointer;border-radius:var(--ax-sys-border-radius);transition:opacity .15s ease}@media(hover:hover){ax-conversation-composer .ax-conversation-composer-banner__body--clickable:hover{opacity:.85}}ax-conversation-composer .ax-conversation-composer-banner__label{font-size:.6875rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);color:rgba(var(--ax-sys-color-primary-600));text-transform:uppercase}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__label{color:rgba(var(--ax-sys-color-secondary-600))}ax-conversation-composer .ax-conversation-composer-banner__preview{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);overflow:hidden;font-size:.8125rem;--tw-leading: var(--leading-snug, 1.375);line-height:var(--leading-snug, 1.375);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:.88}ax-conversation-composer .ax-conversation-composer-banner__preview i{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-composer .ax-conversation-composer-banner__close{margin-inline-end:calc(var(--spacing, .25rem) * 1.5);display:flex;height:calc(var(--spacing, .25rem) * 9);width:calc(var(--spacing, .25rem) * 9);flex-shrink:0;cursor:pointer;touch-action:manipulation;align-items:center;justify-content:center;align-self:center;border-radius:var(--ax-sys-border-radius);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));color:rgba(var(--ax-sys-color-on-primary-lightest-surface),.55);transition:background-color .15s ease,color .15s ease}@media(hover:hover){ax-conversation-composer .ax-conversation-composer-banner__close:hover{color:rgba(var(--ax-sys-color-on-surface));background:rgba(var(--ax-sys-color-on-surface),.06)}}ax-conversation-composer .ax-conversation-composer-banner__close:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .emoji-icon{flex-shrink:0;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}ax-conversation-composer .composer-input-container{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 3)}ax-conversation-composer .composer-actions-left,ax-conversation-composer .composer-actions-right{display:flex;align-items:center}ax-conversation-composer .composer-input-wrapper{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-composer .composer-input-wrapper .ax-editor-container{padding:calc(var(--spacing, .25rem) * 0)}ax-conversation-composer .composer-input{max-height:120px;min-height:calc(var(--spacing, .25rem) * 10);width:100%;resize:none;border-radius:1.25rem;border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);font-size:.9375rem;--tw-leading: var(--leading-normal, 1.5);line-height:var(--leading-normal, 1.5);--tw-outline-style: none;outline-style:none;transition:border-color .2s}ax-conversation-composer .composer-input:focus{border-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .action-button{position:relative;display:flex;height:calc(var(--spacing, .25rem) * 10);width:calc(var(--spacing, .25rem) * 10);flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-2xl, 1.5rem);line-height:var(--tw-leading, var(--text-2xl--line-height, calc(2 / 1.5)));transition:all .2s}@media(hover:hover){ax-conversation-composer .action-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-composer .action-button:disabled{cursor:not-allowed;opacity:50%}ax-conversation-composer .action-send{background-color:rgba(var(--ax-sys-color-primary-surface));color:rgba(var(--ax-sys-color-on-primary-surface))}@media(hover:hover){ax-conversation-composer .action-send:hover:not(:disabled){background-color:rgba(var(--ax-sys-color-primary-600))}}ax-conversation-composer .send-icon{position:relative;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));inset-inline-start:-1px}ax-conversation-composer .action-voice{font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}ax-conversation-composer .composer-attachments{display:flex;flex-wrap:wrap;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-composer .attachment-item{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-light-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)))}ax-conversation-composer .attachment-icon{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ))}ax-conversation-composer .attachment-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}ax-conversation-composer .attachment-remove{display:flex;height:calc(var(--spacing, .25rem) * 5);width:calc(var(--spacing, .25rem) * 5);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));transition:background .2s}@media(hover:hover){ax-conversation-composer .attachment-remove:hover{background-color:rgba(var(--ax-sys-color-danger-lightest-surface));color:rgba(var(--ax-sys-color-danger-500))}}ax-conversation-composer .typing-indicator-container{padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 2);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-composer .composer-component-fullwidth{min-height:72px;width:100%;background-color:rgba(var(--ax-sys-color-lightest-surface))}ax-conversation-composer .action-badge{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 1);top:calc(var(--spacing, .25rem) * 1);display:flex;height:calc(var(--spacing, .25rem) * 4);min-width:calc(var(--spacing, .25rem) * 4);align-items:center;justify-content:center;border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-surface));padding-inline:calc(var(--spacing, .25rem) * 1);font-size:.625rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-primary-surface))}ax-conversation-composer .composer-emoji-popover{width:100%;max-width:var(--container-md, 28rem);max-height:31.25rem}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-outline-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-leading: initial;--tw-outline-style: solid}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXConversationRegistryComponentOutletComponent, selector: "ax-conversation-registry-component-outlet", inputs: ["component", "componentLoader", "inputs"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXCommonModule }, { 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: AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.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: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
5923
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationComposerComponent, isStandalone: true, selector: "ax-conversation-composer", outputs: { messageSent: "messageSent", emojiClick: "emojiClick", attachClick: "attachClick", voiceClick: "voiceClick" }, viewQueries: [{ propertyName: "textAreaRef", first: true, predicate: ["inputElement"], descendants: true, read: AXTextAreaComponent, isSignal: true }, { propertyName: "emojiPopoverRef", first: true, predicate: ["emojiPopover"], descendants: true, isSignal: true }], ngImport: i0, template: " @if (activeConversation()) {\n <div class=\"composer\">\n <!-- Full-Width Component Mode -->\n @if (activeComponent()) {\n <div class=\"composer-component-fullwidth\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeComponent()!.component\"\n [componentLoader]=\"activeComponent()!.componentLoader\"\n [inputs]=\"getComponentInputs()\"\n />\n </div>\n } @else {\n <!-- Normal Composer Mode -->\n <!-- Edit/Reply Banner -->\n @if (editingMessage() || replyingToMessage()) {\n <div\n class=\"ax-conversation-composer-banner\"\n [class.ax-conversation-composer-banner--edit]=\"!!editingMessage()\"\n [class.ax-conversation-composer-banner--reply]=\"!!replyingToMessage()\"\n >\n <div class=\"ax-conversation-composer-banner__accent\" aria-hidden=\"true\"></div>\n @if (editingMessage()) {\n <div class=\"ax-conversation-composer-banner__content\">\n <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n ><i class=\"fa-light fa-pen-to-square\"></i\n ></span>\n <div class=\"ax-conversation-composer-banner__body\">\n <span class=\"ax-conversation-composer-banner__label\">{{\n '@acorex:chat.composer.editing-message' | translate | async\n }}</span>\n @if (getEditingPreview(); as preview) {\n <span class=\"ax-conversation-composer-banner__preview\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n {{ getComposerPreviewLabel(preview) }}\n </span>\n }\n </div>\n </div>\n } @else if (replyingToMessage()) {\n <div class=\"ax-conversation-composer-banner__content\">\n <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n ><i class=\"fa-light fa-reply\"></i\n ></span>\n <div\n class=\"ax-conversation-composer-banner__body ax-conversation-composer-banner__body--clickable\"\n (click)=\"onReplyPreviewClick()\"\n >\n <span class=\"ax-conversation-composer-banner__label\">\n {{ '@acorex:chat.composer.replying-to' | translate | async }} {{ getReplyingSenderName() }}\n </span>\n @if (getReplyingPreview(); as preview) {\n <span class=\"ax-conversation-composer-banner__preview\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n {{ getComposerPreviewLabel(preview) }}\n </span>\n }\n </div>\n </div>\n }\n <button\n type=\"button\"\n class=\"ax-conversation-composer-banner__close\"\n (click)=\"cancelEditReply()\"\n [attr.aria-label]=\"'@acorex:chat.actions.cancel' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n\n <!-- Input Area -->\n <div class=\"composer-input-container\">\n <!-- Left Actions -->\n <div class=\"composer-actions-left\">\n @for (action of leftInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n #leftActionButton\n (click)=\"onActionClick(action.id, $event)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (leftMenuActions().length > 0) {\n <ax-button color=\"primary\" look=\"outline\">\n <i class=\"fa-light fa-ellipsis\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of leftMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n\n <!-- Text Input -->\n <div class=\"composer-input-wrapper\">\n <ax-text-area\n #inputElement\n [(ngModel)]=\"draftText\"\n (onKeyDown)=\"onKeyDown($event)\"\n (onValueChanged)=\"onInput()\"\n [placeholder]=\"placeholder()\"\n (onKeyDown)=\"onEnter($event)\"\n [rows]=\"inputRows()\"\n ></ax-text-area>\n </div>\n\n <!-- Right Actions -->\n <div class=\"composer-actions-right\">\n @if (draftText().trim().length === 0 && !attachments().length) {\n <!-- Show action buttons when empty -->\n @for (action of rightInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n [class.action-voice]=\"action.id === 'voice-recording'\"\n (click)=\"onActionClick(action.id)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n [attr.axUploaderBrowseHandle]=\"action.id === 'attach' ? '' : null\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (rightMenuActions().length > 0) {\n <ax-button look=\"blank\">\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of rightMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n } @else {\n <!-- Show send/save button when has content -->\n <button\n type=\"button\"\n class=\"action-button action-send\"\n (click)=\"onSendClick()\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"\n editingMessage()\n ? ('@acorex:chat.actions.save' | translate | async)\n : ('@acorex:chat.actions.send' | translate | async)\n \"\n >\n <i\n [class]=\"editingMessage() ? 'send-icon fa-light fa-check' : 'send-icon fa-light fa-paper-plane'\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Attachments Preview -->\n @if (attachments().length > 0) {\n <div class=\"composer-attachments\">\n @for (attachment of attachments(); track $index) {\n <div class=\"attachment-item\">\n <span class=\"attachment-icon\"><i class=\"fa-light fa-paperclip\"></i></span>\n <span class=\"attachment-name\">{{ attachment.name }}</span>\n <button\n type=\"button\"\n class=\"attachment-remove\"\n (click)=\"removeAttachment($index)\"\n [attr.aria-label]=\"'@acorex:chat.actions.remove-attachment' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Typing Indicator -->\n @if (showTypingIndicator()) {\n <div class=\"typing-indicator-container\">\n <span class=\"typing-indicator\">{{ '@acorex:chat.status.someone-typing' | translate | async }}</span>\n </div>\n }\n }\n </div>\n }\n\n <!-- Popover for emoji/sticker picker -->\n @if (emojiPopoverTarget()) {\n <ax-popover\n #emojiPopover\n [target]=\"emojiPopoverTarget()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'top-start'\"\n panelClass=\"composer-emoji-popover-panel\"\n (onClosed)=\"onEmojiPopoverClosed()\"\n >\n <div class=\"composer-emoji-popover\">\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"composerPopupLoader\"\n [inputs]=\"getEmojiPopupInputs()\"\n />\n </div>\n </ax-popover>\n }\n", styles: ["@layer properties;@layer components{ax-conversation-composer{display:block;width:100%}ax-conversation-composer .ax-conversation-composer-banner{display:flex;min-height:2.75rem;align-items:stretch;gap:calc(var(--spacing, .25rem) * 0);border-block-style:var(--tw-border-style);border-block-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-light-surface))}ax-conversation-composer .ax-conversation-composer-banner__accent{width:3px;flex-shrink:0;border-start-end-radius:var(--radius-sm, .25rem);border-end-end-radius:var(--radius-sm, .25rem);background-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__accent{background-color:rgba(var(--ax-sys-color-secondary-500))}ax-conversation-composer .ax-conversation-composer-banner__content{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;gap:calc(var(--spacing, .25rem) * 2.5);padding-inline:calc(var(--spacing, .25rem) * 2.5);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-composer .ax-conversation-composer-banner__icon{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);font-size:.8125rem;color:rgba(var(--ax-sys-color-primary-600));background:rgba(var(--ax-sys-color-primary-500),.1)}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__icon{color:rgba(var(--ax-sys-color-secondary-600));background:rgba(var(--ax-sys-color-secondary-500),.1)}ax-conversation-composer .ax-conversation-composer-banner__body{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-composer .ax-conversation-composer-banner__body--clickable{cursor:pointer;border-radius:var(--ax-sys-border-radius);transition:opacity .15s ease}@media(hover:hover){ax-conversation-composer .ax-conversation-composer-banner__body--clickable:hover{opacity:.85}}ax-conversation-composer .ax-conversation-composer-banner__label{font-size:.6875rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);color:rgba(var(--ax-sys-color-primary-600));text-transform:uppercase}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__label{color:rgba(var(--ax-sys-color-secondary-600))}ax-conversation-composer .ax-conversation-composer-banner__preview{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);overflow:hidden;font-size:.8125rem;--tw-leading: var(--leading-snug, 1.375);line-height:var(--leading-snug, 1.375);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:.88}ax-conversation-composer .ax-conversation-composer-banner__preview i{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-composer .ax-conversation-composer-banner__close{margin-inline-end:calc(var(--spacing, .25rem) * 1.5);display:flex;height:calc(var(--spacing, .25rem) * 9);width:calc(var(--spacing, .25rem) * 9);flex-shrink:0;cursor:pointer;touch-action:manipulation;align-items:center;justify-content:center;align-self:center;border-radius:var(--ax-sys-border-radius);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));color:rgba(var(--ax-sys-color-on-primary-lightest-surface),.55);transition:background-color .15s ease,color .15s ease}@media(hover:hover){ax-conversation-composer .ax-conversation-composer-banner__close:hover{color:rgba(var(--ax-sys-color-on-surface));background:rgba(var(--ax-sys-color-on-surface),.06)}}ax-conversation-composer .ax-conversation-composer-banner__close:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .emoji-icon{flex-shrink:0;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}ax-conversation-composer .composer-input-container{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 3)}ax-conversation-composer .composer-actions-left,ax-conversation-composer .composer-actions-right{display:flex;align-items:center}ax-conversation-composer .composer-input-wrapper{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-composer .composer-input-wrapper .ax-editor-container{padding:calc(var(--spacing, .25rem) * 0)}ax-conversation-composer .composer-input{max-height:120px;min-height:calc(var(--spacing, .25rem) * 10);width:100%;resize:none;border-radius:1.25rem;border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);font-size:.9375rem;--tw-leading: var(--leading-normal, 1.5);line-height:var(--leading-normal, 1.5);--tw-outline-style: none;outline-style:none;transition:border-color .2s}ax-conversation-composer .composer-input:focus{border-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .action-button{position:relative;display:flex;height:calc(var(--spacing, .25rem) * 10);width:calc(var(--spacing, .25rem) * 10);flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-2xl, 1.5rem);line-height:var(--tw-leading, var(--text-2xl--line-height, calc(2 / 1.5)));transition:all .2s}@media(hover:hover){ax-conversation-composer .action-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-composer .action-button:disabled{cursor:not-allowed;opacity:50%}ax-conversation-composer .action-send{background-color:rgba(var(--ax-sys-color-primary-surface));color:rgba(var(--ax-sys-color-on-primary-surface))}@media(hover:hover){ax-conversation-composer .action-send:hover:not(:disabled){background-color:rgba(var(--ax-sys-color-primary-600))}}ax-conversation-composer .send-icon{position:relative;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));inset-inline-start:-1px}ax-conversation-composer .action-voice{font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}ax-conversation-composer .composer-attachments{display:flex;flex-wrap:wrap;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-composer .attachment-item{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-light-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)))}ax-conversation-composer .attachment-icon{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ))}ax-conversation-composer .attachment-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}ax-conversation-composer .attachment-remove{display:flex;height:calc(var(--spacing, .25rem) * 5);width:calc(var(--spacing, .25rem) * 5);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));transition:background .2s}@media(hover:hover){ax-conversation-composer .attachment-remove:hover{background-color:rgba(var(--ax-sys-color-danger-lightest-surface));color:rgba(var(--ax-sys-color-danger-500))}}ax-conversation-composer .typing-indicator-container{padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 2);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-composer .composer-component-fullwidth{min-height:72px;width:100%;background-color:rgba(var(--ax-sys-color-lightest-surface))}ax-conversation-composer .action-badge{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 1);top:calc(var(--spacing, .25rem) * 1);display:flex;height:calc(var(--spacing, .25rem) * 4);min-width:calc(var(--spacing, .25rem) * 4);align-items:center;justify-content:center;border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-surface));padding-inline:calc(var(--spacing, .25rem) * 1);font-size:.625rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-primary-surface))}ax-conversation-composer .composer-emoji-popover{width:100%}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-outline-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-leading: initial;--tw-outline-style: solid}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXConversationRegistryComponentOutletComponent, selector: "ax-conversation-registry-component-outlet", inputs: ["component", "componentLoader", "inputs"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXCommonModule }, { 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: AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.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: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
5699
5924
|
}
|
|
5700
5925
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerComponent, decorators: [{
|
|
5701
5926
|
type: Component,
|
|
@@ -5712,7 +5937,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
5712
5937
|
AXPopoverComponent,
|
|
5713
5938
|
AXDropdownPanelComponent,
|
|
5714
5939
|
AXTranslationModule,
|
|
5715
|
-
], template: " @if (activeConversation()) {\n <div class=\"composer\">\n <!-- Full-Width Component Mode -->\n @if (activeComponent()) {\n <div class=\"composer-component-fullwidth\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeComponent()!.component\"\n [componentLoader]=\"activeComponent()!.componentLoader\"\n [inputs]=\"getComponentInputs()\"\n />\n </div>\n } @else {\n <!-- Normal Composer Mode -->\n <!-- Edit/Reply Banner -->\n @if (editingMessage() || replyingToMessage()) {\n <div\n class=\"ax-conversation-composer-banner\"\n [class.ax-conversation-composer-banner--edit]=\"!!editingMessage()\"\n [class.ax-conversation-composer-banner--reply]=\"!!replyingToMessage()\"\n >\n <div class=\"ax-conversation-composer-banner__accent\" aria-hidden=\"true\"></div>\n @if (editingMessage()) {\n <div class=\"ax-conversation-composer-banner__content\">\n <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n ><i class=\"fa-light fa-pen-to-square\"></i\n ></span>\n <div class=\"ax-conversation-composer-banner__body\">\n <span class=\"ax-conversation-composer-banner__label\">{{\n '@acorex:chat.composer.editing-message' | translate | async\n }}</span>\n @if (getEditingPreview(); as preview) {\n <span class=\"ax-conversation-composer-banner__preview\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n {{ getComposerPreviewLabel(preview) }}\n </span>\n }\n </div>\n </div>\n } @else if (replyingToMessage()) {\n <div class=\"ax-conversation-composer-banner__content\">\n <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n ><i class=\"fa-light fa-reply\"></i\n ></span>\n <div\n class=\"ax-conversation-composer-banner__body ax-conversation-composer-banner__body--clickable\"\n (click)=\"onReplyPreviewClick()\"\n >\n <span class=\"ax-conversation-composer-banner__label\">\n {{ '@acorex:chat.composer.replying-to' | translate | async }} {{ getReplyingSenderName() }}\n </span>\n @if (getReplyingPreview(); as preview) {\n <span class=\"ax-conversation-composer-banner__preview\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n {{ getComposerPreviewLabel(preview) }}\n </span>\n }\n </div>\n </div>\n }\n <button\n type=\"button\"\n class=\"ax-conversation-composer-banner__close\"\n (click)=\"cancelEditReply()\"\n [attr.aria-label]=\"'@acorex:chat.actions.cancel' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n\n <!-- Input Area -->\n <div class=\"composer-input-container\">\n <!-- Left Actions -->\n <div class=\"composer-actions-left\">\n @for (action of leftInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n #leftActionButton\n (click)=\"onActionClick(action.id, $event)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (leftMenuActions().length > 0) {\n <ax-button color=\"primary\" look=\"outline\">\n <i class=\"fa-light fa-ellipsis\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of leftMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n\n <!-- Text Input -->\n <div class=\"composer-input-wrapper\">\n <ax-text-area\n #inputElement\n [(ngModel)]=\"draftText\"\n (onKeyDown)=\"onKeyDown($event)\"\n (onValueChanged)=\"onInput()\"\n [placeholder]=\"placeholder()\"\n (onKeyDown)=\"onEnter($event)\"\n [rows]=\"inputRows()\"\n ></ax-text-area>\n </div>\n\n <!-- Right Actions -->\n <div class=\"composer-actions-right\">\n @if (draftText().trim().length === 0 && !attachments().length) {\n <!-- Show action buttons when empty -->\n @for (action of rightInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n [class.action-voice]=\"action.id === 'voice-recording'\"\n (click)=\"onActionClick(action.id)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n [attr.axUploaderBrowseHandle]=\"action.id === 'attach' ? '' : null\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (rightMenuActions().length > 0) {\n <ax-button look=\"blank\">\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of rightMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n } @else {\n <!-- Show send/save button when has content -->\n <button\n type=\"button\"\n class=\"action-button action-send\"\n (click)=\"onSendClick()\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"\n editingMessage()\n ? ('@acorex:chat.actions.save' | translate | async)\n : ('@acorex:chat.actions.send' | translate | async)\n \"\n >\n <i\n [class]=\"editingMessage() ? 'send-icon fa-light fa-check' : 'send-icon fa-light fa-paper-plane'\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Attachments Preview -->\n @if (attachments().length > 0) {\n <div class=\"composer-attachments\">\n @for (attachment of attachments(); track $index) {\n <div class=\"attachment-item\">\n <span class=\"attachment-icon\"><i class=\"fa-light fa-paperclip\"></i></span>\n <span class=\"attachment-name\">{{ attachment.name }}</span>\n <button\n type=\"button\"\n class=\"attachment-remove\"\n (click)=\"removeAttachment($index)\"\n [attr.aria-label]=\"'@acorex:chat.actions.remove-attachment' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Typing Indicator -->\n @if (showTypingIndicator()) {\n <div class=\"typing-indicator-container\">\n <span class=\"typing-indicator\">{{ '@acorex:chat.status.someone-typing' | translate | async }}</span>\n </div>\n }\n }\n </div>\n }\n\n <!-- Popover for emoji/sticker picker -->\n @if (emojiPopoverTarget()) {\n <ax-popover\n #emojiPopover\n [target]=\"emojiPopoverTarget()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'top-start'\"\n (onClosed)=\"onEmojiPopoverClosed()\"\n >\n <div class=\"composer-emoji-popover\">\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"composerPopupLoader\"\n [inputs]=\"getEmojiPopupInputs()\"\n />\n </div>\n </ax-popover>\n }\n", styles: ["@layer properties;@layer components{ax-conversation-composer{display:block;width:100%}ax-conversation-composer .ax-conversation-composer-banner{display:flex;min-height:2.75rem;align-items:stretch;gap:calc(var(--spacing, .25rem) * 0);border-block-style:var(--tw-border-style);border-block-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-light-surface))}ax-conversation-composer .ax-conversation-composer-banner__accent{width:3px;flex-shrink:0;border-start-end-radius:var(--radius-sm, .25rem);border-end-end-radius:var(--radius-sm, .25rem);background-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__accent{background-color:rgba(var(--ax-sys-color-secondary-500))}ax-conversation-composer .ax-conversation-composer-banner__content{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;gap:calc(var(--spacing, .25rem) * 2.5);padding-inline:calc(var(--spacing, .25rem) * 2.5);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-composer .ax-conversation-composer-banner__icon{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);font-size:.8125rem;color:rgba(var(--ax-sys-color-primary-600));background:rgba(var(--ax-sys-color-primary-500),.1)}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__icon{color:rgba(var(--ax-sys-color-secondary-600));background:rgba(var(--ax-sys-color-secondary-500),.1)}ax-conversation-composer .ax-conversation-composer-banner__body{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-composer .ax-conversation-composer-banner__body--clickable{cursor:pointer;border-radius:var(--ax-sys-border-radius);transition:opacity .15s ease}@media(hover:hover){ax-conversation-composer .ax-conversation-composer-banner__body--clickable:hover{opacity:.85}}ax-conversation-composer .ax-conversation-composer-banner__label{font-size:.6875rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);color:rgba(var(--ax-sys-color-primary-600));text-transform:uppercase}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__label{color:rgba(var(--ax-sys-color-secondary-600))}ax-conversation-composer .ax-conversation-composer-banner__preview{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);overflow:hidden;font-size:.8125rem;--tw-leading: var(--leading-snug, 1.375);line-height:var(--leading-snug, 1.375);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:.88}ax-conversation-composer .ax-conversation-composer-banner__preview i{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-composer .ax-conversation-composer-banner__close{margin-inline-end:calc(var(--spacing, .25rem) * 1.5);display:flex;height:calc(var(--spacing, .25rem) * 9);width:calc(var(--spacing, .25rem) * 9);flex-shrink:0;cursor:pointer;touch-action:manipulation;align-items:center;justify-content:center;align-self:center;border-radius:var(--ax-sys-border-radius);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));color:rgba(var(--ax-sys-color-on-primary-lightest-surface),.55);transition:background-color .15s ease,color .15s ease}@media(hover:hover){ax-conversation-composer .ax-conversation-composer-banner__close:hover{color:rgba(var(--ax-sys-color-on-surface));background:rgba(var(--ax-sys-color-on-surface),.06)}}ax-conversation-composer .ax-conversation-composer-banner__close:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .emoji-icon{flex-shrink:0;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}ax-conversation-composer .composer-input-container{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 3)}ax-conversation-composer .composer-actions-left,ax-conversation-composer .composer-actions-right{display:flex;align-items:center}ax-conversation-composer .composer-input-wrapper{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-composer .composer-input-wrapper .ax-editor-container{padding:calc(var(--spacing, .25rem) * 0)}ax-conversation-composer .composer-input{max-height:120px;min-height:calc(var(--spacing, .25rem) * 10);width:100%;resize:none;border-radius:1.25rem;border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);font-size:.9375rem;--tw-leading: var(--leading-normal, 1.5);line-height:var(--leading-normal, 1.5);--tw-outline-style: none;outline-style:none;transition:border-color .2s}ax-conversation-composer .composer-input:focus{border-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .action-button{position:relative;display:flex;height:calc(var(--spacing, .25rem) * 10);width:calc(var(--spacing, .25rem) * 10);flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-2xl, 1.5rem);line-height:var(--tw-leading, var(--text-2xl--line-height, calc(2 / 1.5)));transition:all .2s}@media(hover:hover){ax-conversation-composer .action-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-composer .action-button:disabled{cursor:not-allowed;opacity:50%}ax-conversation-composer .action-send{background-color:rgba(var(--ax-sys-color-primary-surface));color:rgba(var(--ax-sys-color-on-primary-surface))}@media(hover:hover){ax-conversation-composer .action-send:hover:not(:disabled){background-color:rgba(var(--ax-sys-color-primary-600))}}ax-conversation-composer .send-icon{position:relative;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));inset-inline-start:-1px}ax-conversation-composer .action-voice{font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}ax-conversation-composer .composer-attachments{display:flex;flex-wrap:wrap;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-composer .attachment-item{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-light-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)))}ax-conversation-composer .attachment-icon{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ))}ax-conversation-composer .attachment-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}ax-conversation-composer .attachment-remove{display:flex;height:calc(var(--spacing, .25rem) * 5);width:calc(var(--spacing, .25rem) * 5);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));transition:background .2s}@media(hover:hover){ax-conversation-composer .attachment-remove:hover{background-color:rgba(var(--ax-sys-color-danger-lightest-surface));color:rgba(var(--ax-sys-color-danger-500))}}ax-conversation-composer .typing-indicator-container{padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 2);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-composer .composer-component-fullwidth{min-height:72px;width:100%;background-color:rgba(var(--ax-sys-color-lightest-surface))}ax-conversation-composer .action-badge{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 1);top:calc(var(--spacing, .25rem) * 1);display:flex;height:calc(var(--spacing, .25rem) * 4);min-width:calc(var(--spacing, .25rem) * 4);align-items:center;justify-content:center;border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-surface));padding-inline:calc(var(--spacing, .25rem) * 1);font-size:.625rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-primary-surface))}ax-conversation-composer .composer-emoji-popover{width:100%;max-width:var(--container-md, 28rem);max-height:31.25rem}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-outline-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-leading: initial;--tw-outline-style: solid}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
5940
|
+
], template: " @if (activeConversation()) {\n <div class=\"composer\">\n <!-- Full-Width Component Mode -->\n @if (activeComponent()) {\n <div class=\"composer-component-fullwidth\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeComponent()!.component\"\n [componentLoader]=\"activeComponent()!.componentLoader\"\n [inputs]=\"getComponentInputs()\"\n />\n </div>\n } @else {\n <!-- Normal Composer Mode -->\n <!-- Edit/Reply Banner -->\n @if (editingMessage() || replyingToMessage()) {\n <div\n class=\"ax-conversation-composer-banner\"\n [class.ax-conversation-composer-banner--edit]=\"!!editingMessage()\"\n [class.ax-conversation-composer-banner--reply]=\"!!replyingToMessage()\"\n >\n <div class=\"ax-conversation-composer-banner__accent\" aria-hidden=\"true\"></div>\n @if (editingMessage()) {\n <div class=\"ax-conversation-composer-banner__content\">\n <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n ><i class=\"fa-light fa-pen-to-square\"></i\n ></span>\n <div class=\"ax-conversation-composer-banner__body\">\n <span class=\"ax-conversation-composer-banner__label\">{{\n '@acorex:chat.composer.editing-message' | translate | async\n }}</span>\n @if (getEditingPreview(); as preview) {\n <span class=\"ax-conversation-composer-banner__preview\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n {{ getComposerPreviewLabel(preview) }}\n </span>\n }\n </div>\n </div>\n } @else if (replyingToMessage()) {\n <div class=\"ax-conversation-composer-banner__content\">\n <span class=\"ax-conversation-composer-banner__icon\" aria-hidden=\"true\"\n ><i class=\"fa-light fa-reply\"></i\n ></span>\n <div\n class=\"ax-conversation-composer-banner__body ax-conversation-composer-banner__body--clickable\"\n (click)=\"onReplyPreviewClick()\"\n >\n <span class=\"ax-conversation-composer-banner__label\">\n {{ '@acorex:chat.composer.replying-to' | translate | async }} {{ getReplyingSenderName() }}\n </span>\n @if (getReplyingPreview(); as preview) {\n <span class=\"ax-conversation-composer-banner__preview\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i>\n }\n {{ getComposerPreviewLabel(preview) }}\n </span>\n }\n </div>\n </div>\n }\n <button\n type=\"button\"\n class=\"ax-conversation-composer-banner__close\"\n (click)=\"cancelEditReply()\"\n [attr.aria-label]=\"'@acorex:chat.actions.cancel' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n\n <!-- Input Area -->\n <div class=\"composer-input-container\">\n <!-- Left Actions -->\n <div class=\"composer-actions-left\">\n @for (action of leftInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n #leftActionButton\n (click)=\"onActionClick(action.id, $event)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (leftMenuActions().length > 0) {\n <ax-button color=\"primary\" look=\"outline\">\n <i class=\"fa-light fa-ellipsis\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of leftMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n\n <!-- Text Input -->\n <div class=\"composer-input-wrapper\">\n <ax-text-area\n #inputElement\n [(ngModel)]=\"draftText\"\n (onKeyDown)=\"onKeyDown($event)\"\n (onValueChanged)=\"onInput()\"\n [placeholder]=\"placeholder()\"\n (onKeyDown)=\"onEnter($event)\"\n [rows]=\"inputRows()\"\n ></ax-text-area>\n </div>\n\n <!-- Right Actions -->\n <div class=\"composer-actions-right\">\n @if (draftText().trim().length === 0 && !attachments().length) {\n <!-- Show action buttons when empty -->\n @for (action of rightInlineActions(); track action.id) {\n <button\n type=\"button\"\n class=\"action-button\"\n [class.action-voice]=\"action.id === 'voice-recording'\"\n (click)=\"onActionClick(action.id)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n [disabled]=\"!isActionEnabled(action)\"\n [class]=\"action.className\"\n [attr.axUploaderBrowseHandle]=\"action.id === 'attach' ? '' : null\"\n >\n <i [class]=\"action.icon\"></i>\n @if (action.badge) {\n <span class=\"action-badge\">{{ action.badge }}</span>\n }\n </button>\n }\n\n <!-- Menu Actions Dropdown -->\n @if (rightMenuActions().length > 0) {\n <ax-button look=\"blank\">\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of rightMenuActions(); track action.id) {\n <ax-button-item\n [text]=\"getActionLabel(action)\"\n (click)=\"onActionClick(action.id)\"\n [disabled]=\"!isActionEnabled(action)\"\n >\n <ax-prefix>\n <i [class]=\"action.icon\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n } @else {\n <!-- Show send/save button when has content -->\n <button\n type=\"button\"\n class=\"action-button action-send\"\n (click)=\"onSendClick()\"\n [disabled]=\"!canSend()\"\n [attr.aria-label]=\"\n editingMessage()\n ? ('@acorex:chat.actions.save' | translate | async)\n : ('@acorex:chat.actions.send' | translate | async)\n \"\n >\n <i\n [class]=\"editingMessage() ? 'send-icon fa-light fa-check' : 'send-icon fa-light fa-paper-plane'\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Attachments Preview -->\n @if (attachments().length > 0) {\n <div class=\"composer-attachments\">\n @for (attachment of attachments(); track $index) {\n <div class=\"attachment-item\">\n <span class=\"attachment-icon\"><i class=\"fa-light fa-paperclip\"></i></span>\n <span class=\"attachment-name\">{{ attachment.name }}</span>\n <button\n type=\"button\"\n class=\"attachment-remove\"\n (click)=\"removeAttachment($index)\"\n [attr.aria-label]=\"'@acorex:chat.actions.remove-attachment' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Typing Indicator -->\n @if (showTypingIndicator()) {\n <div class=\"typing-indicator-container\">\n <span class=\"typing-indicator\">{{ '@acorex:chat.status.someone-typing' | translate | async }}</span>\n </div>\n }\n }\n </div>\n }\n\n <!-- Popover for emoji/sticker picker -->\n @if (emojiPopoverTarget()) {\n <ax-popover\n #emojiPopover\n [target]=\"emojiPopoverTarget()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'top-start'\"\n panelClass=\"composer-emoji-popover-panel\"\n (onClosed)=\"onEmojiPopoverClosed()\"\n >\n <div class=\"composer-emoji-popover\">\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"composerPopupLoader\"\n [inputs]=\"getEmojiPopupInputs()\"\n />\n </div>\n </ax-popover>\n }\n", styles: ["@layer properties;@layer components{ax-conversation-composer{display:block;width:100%}ax-conversation-composer .ax-conversation-composer-banner{display:flex;min-height:2.75rem;align-items:stretch;gap:calc(var(--spacing, .25rem) * 0);border-block-style:var(--tw-border-style);border-block-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-light-surface))}ax-conversation-composer .ax-conversation-composer-banner__accent{width:3px;flex-shrink:0;border-start-end-radius:var(--radius-sm, .25rem);border-end-end-radius:var(--radius-sm, .25rem);background-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__accent{background-color:rgba(var(--ax-sys-color-secondary-500))}ax-conversation-composer .ax-conversation-composer-banner__content{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;gap:calc(var(--spacing, .25rem) * 2.5);padding-inline:calc(var(--spacing, .25rem) * 2.5);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-composer .ax-conversation-composer-banner__icon{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);font-size:.8125rem;color:rgba(var(--ax-sys-color-primary-600));background:rgba(var(--ax-sys-color-primary-500),.1)}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__icon{color:rgba(var(--ax-sys-color-secondary-600));background:rgba(var(--ax-sys-color-secondary-500),.1)}ax-conversation-composer .ax-conversation-composer-banner__body{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-composer .ax-conversation-composer-banner__body--clickable{cursor:pointer;border-radius:var(--ax-sys-border-radius);transition:opacity .15s ease}@media(hover:hover){ax-conversation-composer .ax-conversation-composer-banner__body--clickable:hover{opacity:.85}}ax-conversation-composer .ax-conversation-composer-banner__label{font-size:.6875rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);color:rgba(var(--ax-sys-color-primary-600));text-transform:uppercase}ax-conversation-composer .ax-conversation-composer-banner--reply .ax-conversation-composer-banner__label{color:rgba(var(--ax-sys-color-secondary-600))}ax-conversation-composer .ax-conversation-composer-banner__preview{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);overflow:hidden;font-size:.8125rem;--tw-leading: var(--leading-snug, 1.375);line-height:var(--leading-snug, 1.375);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:.88}ax-conversation-composer .ax-conversation-composer-banner__preview i{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-composer .ax-conversation-composer-banner__close{margin-inline-end:calc(var(--spacing, .25rem) * 1.5);display:flex;height:calc(var(--spacing, .25rem) * 9);width:calc(var(--spacing, .25rem) * 9);flex-shrink:0;cursor:pointer;touch-action:manipulation;align-items:center;justify-content:center;align-self:center;border-radius:var(--ax-sys-border-radius);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));color:rgba(var(--ax-sys-color-on-primary-lightest-surface),.55);transition:background-color .15s ease,color .15s ease}@media(hover:hover){ax-conversation-composer .ax-conversation-composer-banner__close:hover{color:rgba(var(--ax-sys-color-on-surface));background:rgba(var(--ax-sys-color-on-surface),.06)}}ax-conversation-composer .ax-conversation-composer-banner__close:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .emoji-icon{flex-shrink:0;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}ax-conversation-composer .composer-input-container{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 3)}ax-conversation-composer .composer-actions-left,ax-conversation-composer .composer-actions-right{display:flex;align-items:center}ax-conversation-composer .composer-input-wrapper{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-composer .composer-input-wrapper .ax-editor-container{padding:calc(var(--spacing, .25rem) * 0)}ax-conversation-composer .composer-input{max-height:120px;min-height:calc(var(--spacing, .25rem) * 10);width:100%;resize:none;border-radius:1.25rem;border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);font-size:.9375rem;--tw-leading: var(--leading-normal, 1.5);line-height:var(--leading-normal, 1.5);--tw-outline-style: none;outline-style:none;transition:border-color .2s}ax-conversation-composer .composer-input:focus{border-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-composer .action-button{position:relative;display:flex;height:calc(var(--spacing, .25rem) * 10);width:calc(var(--spacing, .25rem) * 10);flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-2xl, 1.5rem);line-height:var(--tw-leading, var(--text-2xl--line-height, calc(2 / 1.5)));transition:all .2s}@media(hover:hover){ax-conversation-composer .action-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-composer .action-button:disabled{cursor:not-allowed;opacity:50%}ax-conversation-composer .action-send{background-color:rgba(var(--ax-sys-color-primary-surface));color:rgba(var(--ax-sys-color-on-primary-surface))}@media(hover:hover){ax-conversation-composer .action-send:hover:not(:disabled){background-color:rgba(var(--ax-sys-color-primary-600))}}ax-conversation-composer .send-icon{position:relative;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));inset-inline-start:-1px}ax-conversation-composer .action-voice{font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}ax-conversation-composer .composer-attachments{display:flex;flex-wrap:wrap;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-composer .attachment-item{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-light-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)))}ax-conversation-composer .attachment-icon{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ))}ax-conversation-composer .attachment-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}ax-conversation-composer .attachment-remove{display:flex;height:calc(var(--spacing, .25rem) * 5);width:calc(var(--spacing, .25rem) * 5);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));transition:background .2s}@media(hover:hover){ax-conversation-composer .attachment-remove:hover{background-color:rgba(var(--ax-sys-color-danger-lightest-surface));color:rgba(var(--ax-sys-color-danger-500))}}ax-conversation-composer .typing-indicator-container{padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 2);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-composer .composer-component-fullwidth{min-height:72px;width:100%;background-color:rgba(var(--ax-sys-color-lightest-surface))}ax-conversation-composer .action-badge{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 1);top:calc(var(--spacing, .25rem) * 1);display:flex;height:calc(var(--spacing, .25rem) * 4);min-width:calc(var(--spacing, .25rem) * 4);align-items:center;justify-content:center;border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-surface));padding-inline:calc(var(--spacing, .25rem) * 1);font-size:.625rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-primary-surface))}ax-conversation-composer .composer-emoji-popover{width:100%}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-outline-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-leading: initial;--tw-outline-style: solid}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
5716
5941
|
}], ctorParameters: () => [], propDecorators: { textAreaRef: [{ type: i0.ViewChild, args: ['inputElement', { ...{ read: AXTextAreaComponent }, isSignal: true }] }], messageSent: [{ type: i0.Output, args: ["messageSent"] }], emojiClick: [{ type: i0.Output, args: ["emojiClick"] }], attachClick: [{ type: i0.Output, args: ["attachClick"] }], voiceClick: [{ type: i0.Output, args: ["voiceClick"] }], emojiPopoverRef: [{ type: i0.ViewChild, args: ['emojiPopover', { isSignal: true }] }] } });
|
|
5717
5942
|
|
|
5718
5943
|
/**
|
|
@@ -5972,7 +6197,7 @@ class AXConversationAvatarComponent {
|
|
|
5972
6197
|
...(ngDevMode ? [{ debugName: "resolvedStatus" }] : /* istanbul ignore next */ []));
|
|
5973
6198
|
}
|
|
5974
6199
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5975
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationAvatarComponent, isStandalone: true, selector: "ax-conversation-avatar", inputs: { kind: { classPropertyName: "kind", publicName: "kind", isSignal: true, isRequired: false, transformFunction: null }, userId: { classPropertyName: "userId", publicName: "userId", isSignal: true, isRequired: false, transformFunction: null }, conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showStatus: { classPropertyName: "showStatus", publicName: "showStatus", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, avatar: { classPropertyName: "avatar", publicName: "avatar", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--ax-conversation-avatar-size.px": "size()" } }, ngImport: i0, template: "<div class=\"ax-conversation-avatar\">\n @if (customComponent(); as component) {\n <ng-container *ngComponentOutlet=\"component; inputs: customInputs()\" />\n } @else {\n <ax-avatar [size]=\"size()\">\n @if (fallbackDisplay().avatar; as avatarSrc) {\n <ax-image [src]=\"avatarSrc\" [alt]=\"fallbackDisplay().name\"></ax-image>\n } @else if (fallbackDisplay().icon; as iconClass) {\n <ax-icon><i [class]=\"iconClass\" aria-hidden=\"true\"></i></ax-icon>\n } @else {\n <ax-label>{{ fallbackInitials() }}</ax-label>\n }\n </ax-avatar>\n }\n\n @if (showStatus() && resolvedStatus(); as presence) {\n <span\n class=\"ax-conversation-avatar-status\"\n [class.status-online]=\"presence === 'online'\"\n [class.status-offline]=\"presence === 'offline'\"\n [class.status-away]=\"presence === 'away'\"\n ></span>\n }\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-avatar{display:inline-flex}ax-conversation-avatar .ax-conversation-avatar{position:relative;display:inline-flex}ax-conversation-avatar .ax-conversation-avatar-status{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * .5);bottom:calc(var(--spacing, .25rem) * .5);height:calc(var(--spacing, .25rem) * 3);width:calc(var(--spacing, .25rem) * 3);border-radius:calc(infinity * 1px)}ax-conversation-avatar .ax-conversation-avatar-status.status-online{border-style:var(--tw-border-style);border-width:2px;border-color:rgba(var(--ax-sys-color-surface));background-color:rgba(var(--ax-sys-color-success-500))}ax-conversation-avatar .ax-conversation-avatar-status.status-away{border-style:var(--tw-border-style);border-width:2px;border-color:rgba(var(--ax-sys-color-surface));background-color:rgba(var(--ax-sys-color-warning-500))}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1
|
|
6200
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationAvatarComponent, isStandalone: true, selector: "ax-conversation-avatar", inputs: { kind: { classPropertyName: "kind", publicName: "kind", isSignal: true, isRequired: false, transformFunction: null }, userId: { classPropertyName: "userId", publicName: "userId", isSignal: true, isRequired: false, transformFunction: null }, conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showStatus: { classPropertyName: "showStatus", publicName: "showStatus", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, avatar: { classPropertyName: "avatar", publicName: "avatar", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--ax-conversation-avatar-size.px": "size()" } }, ngImport: i0, template: "<div class=\"ax-conversation-avatar\">\n @if (customComponent(); as component) {\n <ng-container *ngComponentOutlet=\"component; inputs: customInputs()\" />\n } @else {\n <ax-avatar [size]=\"size()\">\n @if (fallbackDisplay().avatar; as avatarSrc) {\n <ax-image [src]=\"avatarSrc\" [alt]=\"fallbackDisplay().name\"></ax-image>\n } @else if (fallbackDisplay().icon; as iconClass) {\n <ax-icon><i [class]=\"iconClass\" aria-hidden=\"true\"></i></ax-icon>\n } @else {\n <ax-label>{{ fallbackInitials() }}</ax-label>\n }\n </ax-avatar>\n }\n\n @if (showStatus() && resolvedStatus(); as presence) {\n <span\n class=\"ax-conversation-avatar-status\"\n [class.status-online]=\"presence === 'online'\"\n [class.status-offline]=\"presence === 'offline'\"\n [class.status-away]=\"presence === 'away'\"\n ></span>\n }\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-avatar{display:inline-flex}ax-conversation-avatar .ax-conversation-avatar{position:relative;display:inline-flex}ax-conversation-avatar .ax-conversation-avatar-status{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * .5);bottom:calc(var(--spacing, .25rem) * .5);height:calc(var(--spacing, .25rem) * 3);width:calc(var(--spacing, .25rem) * 3);border-radius:calc(infinity * 1px)}ax-conversation-avatar .ax-conversation-avatar-status.status-online{border-style:var(--tw-border-style);border-width:2px;border-color:rgba(var(--ax-sys-color-surface));background-color:rgba(var(--ax-sys-color-success-500))}ax-conversation-avatar .ax-conversation-avatar-status.status-away{border-style:var(--tw-border-style);border-width:2px;border-color:rgba(var(--ax-sys-color-surface));background-color:rgba(var(--ax-sys-color-warning-500))}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.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"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
5976
6201
|
}
|
|
5977
6202
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationAvatarComponent, decorators: [{
|
|
5978
6203
|
type: Component,
|
|
@@ -6426,7 +6651,7 @@ class AXConversationInfoBarComponent {
|
|
|
6426
6651
|
}
|
|
6427
6652
|
}
|
|
6428
6653
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationInfoBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6429
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationInfoBarComponent, isStandalone: true, selector: "ax-conversation-info-bar", outputs: { infoClick: "infoClick", avatarClick: "avatarClick", searchClick: "searchClick", searchQuery: "searchQuery", menuItemAction: "menuItemAction" }, ngImport: i0, template: " @if (activeConversation(); as conversation) {\n <div class=\"info-bar\">\n <!-- Left: Avatar and Info -->\n <ng-content select=\"ax-prefix\"></ng-content>\n <div\n class=\"info-left\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onInfoLeftClick()\"\n (keydown.enter)=\"onInfoLeftClick()\"\n (keydown.space)=\"$event.preventDefault(); onInfoLeftClick()\"\n >\n <div class=\"avatar-wrapper\">\n <ax-conversation-avatar\n kind=\"auto\"\n [conversation]=\"conversation\"\n [size]=\"48\"\n [showStatus]=\"conversation.type === 'private'\"\n />\n </div>\n\n <div class=\"info-details\">\n <p class=\"info-title\">{{ conversation.title }}</p>\n @if (conversation.type !== 'private') {\n <p class=\"info-subtitle\">{{ getSubtitle(conversation) }}</p>\n } @else {\n <div class=\"info-subtitle-with-status\">\n @if (getStatus(conversation) === 'online') {\n <span class=\"online-badge\">\u25CF</span>\n }\n <p class=\"info-subtitle\">{{ getSubtitle(conversation) }}</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Right: Actions or Full-Width Component -->\n @if (!activeComponent() || !isActiveComponentFullWidth()) {\n <div class=\"info-actions\">\n <!-- Inline action buttons from registry -->\n @for (action of inlineActions(); track action.id) {\n @if ((action.component || action.componentLoader) && action.fullWidthComponent === false) {\n <ax-conversation-registry-component-outlet\n [component]=\"action.component\"\n [componentLoader]=\"action.componentLoader\"\n [inputs]=\"getInlineComponentInputs()\"\n />\n } @else {\n <ax-button class=\"action-button\" (onClick)=\"onInlineActionClick(action.id)\" look=\"ghost\">\n <ax-icon [icon]=\"registry.infoBarActions.getActionIcon(action, activeConversation()!)\"></ax-icon>\n </ax-button>\n }\n }\n\n <ax-button look=\"blank\">\n <ax-icon><i class=\"fa-light fa-ellipsis\"></i></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (item of menuItems(); track item.id) {\n @if (item.divider) {\n <ax-divider></ax-divider>\n } @else {\n <ax-button-item\n [text]=\"item.label\"\n [disabled]=\"item.disabled\"\n [color]=\"item.destructive ? 'danger' : 'default'\"\n (onClick)=\"onMenuItemClick(item)\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"></ax-icon>\n </ax-prefix>\n }\n @if (item.shortcut) {\n <ax-suffix>\n <ax-label class=\"shortcut\">{{ item.shortcut }}</ax-label>\n </ax-suffix>\n }\n </ax-button-item>\n }\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n }\n\n @if (activeComponent() && isActiveComponentFullWidth()) {\n <!-- Full-width component mode (e.g., search) - takes entire info-bar -->\n <div class=\"info-component-fullwidth\" animate.enter=\"slide-in\" animate.leave=\"slide-out\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeComponent()!.component\"\n [componentLoader]=\"activeComponent()!.componentLoader\"\n [inputs]=\"getComponentInputs()\"\n />\n <ax-button class=\"action-button close-button\" (onClick)=\"onCloseComponent()\" [look]=\"'ghost'\">\n <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n\n @if (activeBanner()) {\n <div class=\"ax-conversation-info-banner\">\n <div class=\"ax-conversation-info-banner__content\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeBanner()!.component\"\n [componentLoader]=\"activeBanner()!.componentLoader\"\n [inputs]=\"getBannerInputs()\"\n />\n </div>\n <button\n type=\"button\"\n class=\"ax-conversation-info-banner__close\"\n (click)=\"onCloseBanner()\"\n [attr.aria-label]=\"'Close'\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n }\n", styles: ["@layer properties;@layer components{ax-conversation-info-bar{display:block;max-width:100%;@keyframes axInfoBarPulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes axInfoBarSlideIn{0%{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%))}to{opacity:1;transform:translate(0)}}}ax-conversation-info-bar .info-bar{position:relative;display:flex;min-height:calc(var(--spacing, .25rem) * 16);align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 3);overflow:hidden;padding:calc(var(--spacing, .25rem) * 2);--tw-leading: 1.1rem;line-height:1.1rem}ax-conversation-info-bar .ax-conversation-info-banner{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-block:calc(var(--spacing, .25rem) * 2);padding-inline-start:calc(var(--spacing, .25rem) * 3);padding-inline-end:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-bar .ax-conversation-info-banner__content{min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-info-bar .ax-conversation-info-banner__close{display:flex;height:calc(var(--spacing, .25rem) * 9);width:calc(var(--spacing, .25rem) * 9);flex-shrink:0;cursor:pointer;touch-action:manipulation;align-items:center;justify-content:center;border-radius:var(--ax-sys-border-radius);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));color:rgba(var(--ax-sys-color-on-primary-lightest-surface),.65);transition:background-color .15s ease,color .15s ease}@media(hover:hover){ax-conversation-info-bar .ax-conversation-info-banner__close:hover{color:rgba(var(--ax-sys-color-on-primary-lightest-surface));background:rgba(var(--ax-sys-color-primary-500),.12)}}ax-conversation-info-bar .ax-conversation-info-banner__close:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-600))}ax-conversation-info-bar .info-bar-empty{justify-content:center;opacity:60%}ax-conversation-info-bar .info-left{margin-inline:calc(var(--spacing, .25rem) * -1.5);margin-block:calc(var(--spacing, .25rem) * -1);display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-lg, .5rem);padding-inline:calc(var(--spacing, .25rem) * 1.5);padding-block:calc(var(--spacing, .25rem) * 1);transition:background-color .15s ease}ax-conversation-info-bar .info-left:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-info-bar .info-left:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-500))}ax-conversation-info-bar .avatar-wrapper{flex-shrink:0}ax-conversation-info-bar .info-details{min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-info-bar .info-title{margin:calc(var(--spacing, .25rem) * 0);overflow:hidden;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);text-overflow:ellipsis;white-space:nowrap}ax-conversation-info-bar .info-subtitle-with-status{margin-top:calc(var(--spacing, .25rem) * .5);margin-bottom:calc(var(--spacing, .25rem) * 0);display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-info-bar .online-badge{font-size:.625rem;--tw-leading: 1;line-height:1;color:rgba(var(--ax-sys-color-success-500));animation:axInfoBarPulse 2s cubic-bezier(.4,0,.6,1) infinite}ax-conversation-info-bar .info-subtitle{margin:calc(var(--spacing, .25rem) * 0);overflow:hidden;font-size:.85rem;--tw-tracking: .02rem;letter-spacing:.02rem;text-overflow:ellipsis;white-space:nowrap;opacity:70%}ax-conversation-info-bar .info-actions{display:flex;flex-shrink:0;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-bar .info-component-fullwidth{position:absolute;inset-inline:calc(var(--spacing, .25rem) * 0);inset-block:calc(var(--spacing, .25rem) * 0);z-index:10;display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2);background-color:rgba(var(--ax-sys-color-lightest-surface));padding:calc(var(--spacing, .25rem) * 4)}ax-conversation-info-bar .slide-in{animation:axInfoBarSlideIn var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}ax-conversation-info-bar .slide-out{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%));transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}ax-conversation-info-bar .info-component-fullwidth>*:first-child{min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-info-bar .action-button{display:flex;height:calc(var(--spacing, .25rem) * 9);width:calc(var(--spacing, .25rem) * 9);cursor:pointer;align-items:center;justify-content:center;border-radius:var(--radius-lg, .5rem);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));transition:background .2s}ax-conversation-info-bar .action-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}ax-conversation-info-bar .search-container{display:flex;width:100%;min-width:calc(var(--spacing, .25rem) * 48);align-items:center;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-bar .search-input{min-width:calc(var(--spacing, .25rem) * 0);flex:1}[dir=rtl] ax-conversation-info-bar{--ax-info-bar-slide-distance: -100%}}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-outline-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading: initial;--tw-border-style: solid;--tw-outline-style: solid;--tw-font-weight: initial;--tw-tracking: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: 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: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1$1.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: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "component", type: AXConversationRegistryComponentOutletComponent, selector: "ax-conversation-registry-component-outlet", inputs: ["component", "componentLoader", "inputs"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
6654
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationInfoBarComponent, isStandalone: true, selector: "ax-conversation-info-bar", outputs: { infoClick: "infoClick", avatarClick: "avatarClick", searchClick: "searchClick", searchQuery: "searchQuery", menuItemAction: "menuItemAction" }, ngImport: i0, template: " @if (activeConversation(); as conversation) {\n <div class=\"info-bar\">\n <!-- Left: Avatar and Info -->\n <ng-content select=\"ax-prefix\"></ng-content>\n <div\n class=\"info-left\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onInfoLeftClick()\"\n (keydown.enter)=\"onInfoLeftClick()\"\n (keydown.space)=\"$event.preventDefault(); onInfoLeftClick()\"\n >\n <div class=\"avatar-wrapper\">\n <ax-conversation-avatar\n kind=\"auto\"\n [conversation]=\"conversation\"\n [size]=\"48\"\n [showStatus]=\"conversation.type === 'private'\"\n />\n </div>\n\n <div class=\"info-details\">\n <p class=\"info-title\">{{ conversation.title }}</p>\n @if (conversation.type !== 'private') {\n <p class=\"info-subtitle\">{{ getSubtitle(conversation) }}</p>\n } @else {\n <div class=\"info-subtitle-with-status\">\n @if (getStatus(conversation) === 'online') {\n <span class=\"online-badge\">\u25CF</span>\n }\n <p class=\"info-subtitle\">{{ getSubtitle(conversation) }}</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Right: Actions or Full-Width Component -->\n @if (!activeComponent() || !isActiveComponentFullWidth()) {\n <div class=\"info-actions\">\n <!-- Inline action buttons from registry -->\n @for (action of inlineActions(); track action.id) {\n @if ((action.component || action.componentLoader) && action.fullWidthComponent === false) {\n <ax-conversation-registry-component-outlet\n [component]=\"action.component\"\n [componentLoader]=\"action.componentLoader\"\n [inputs]=\"getInlineComponentInputs()\"\n />\n } @else {\n <ax-button class=\"action-button\" (onClick)=\"onInlineActionClick(action.id)\" look=\"ghost\">\n <ax-icon [icon]=\"registry.infoBarActions.getActionIcon(action, activeConversation()!)\"></ax-icon>\n </ax-button>\n }\n }\n\n <ax-button look=\"blank\">\n <ax-icon><i class=\"fa-light fa-ellipsis\"></i></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (item of menuItems(); track item.id) {\n @if (item.divider) {\n <ax-divider></ax-divider>\n } @else {\n <ax-button-item\n [text]=\"item.label\"\n [disabled]=\"item.disabled\"\n [color]=\"item.destructive ? 'danger' : 'default'\"\n (onClick)=\"onMenuItemClick(item)\"\n >\n @if (item.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"item.icon\"></ax-icon>\n </ax-prefix>\n }\n @if (item.shortcut) {\n <ax-suffix>\n <ax-label class=\"shortcut\">{{ item.shortcut }}</ax-label>\n </ax-suffix>\n }\n </ax-button-item>\n }\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n }\n\n @if (activeComponent() && isActiveComponentFullWidth()) {\n <!-- Full-width component mode (e.g., search) - takes entire info-bar -->\n <div class=\"info-component-fullwidth\" animate.enter=\"slide-in\" animate.leave=\"slide-out\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeComponent()!.component\"\n [componentLoader]=\"activeComponent()!.componentLoader\"\n [inputs]=\"getComponentInputs()\"\n />\n <ax-button class=\"action-button close-button\" (onClick)=\"onCloseComponent()\" [look]=\"'ghost'\">\n <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n\n @if (activeBanner()) {\n <div class=\"ax-conversation-info-banner\">\n <div class=\"ax-conversation-info-banner__content\">\n <ax-conversation-registry-component-outlet\n [component]=\"activeBanner()!.component\"\n [componentLoader]=\"activeBanner()!.componentLoader\"\n [inputs]=\"getBannerInputs()\"\n />\n </div>\n <button\n type=\"button\"\n class=\"ax-conversation-info-banner__close\"\n (click)=\"onCloseBanner()\"\n [attr.aria-label]=\"'Close'\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n }\n", styles: ["@layer properties;@layer components{ax-conversation-info-bar{display:block;max-width:100%;@keyframes axInfoBarPulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes axInfoBarSlideIn{0%{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%))}to{opacity:1;transform:translate(0)}}}ax-conversation-info-bar .info-bar{position:relative;display:flex;min-height:calc(var(--spacing, .25rem) * 16);align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 3);overflow:hidden;padding:calc(var(--spacing, .25rem) * 2);--tw-leading: 1.1rem;line-height:1.1rem}ax-conversation-info-bar .ax-conversation-info-banner{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-block:calc(var(--spacing, .25rem) * 2);padding-inline-start:calc(var(--spacing, .25rem) * 3);padding-inline-end:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-bar .ax-conversation-info-banner__content{min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-info-bar .ax-conversation-info-banner__close{display:flex;height:calc(var(--spacing, .25rem) * 9);width:calc(var(--spacing, .25rem) * 9);flex-shrink:0;cursor:pointer;touch-action:manipulation;align-items:center;justify-content:center;border-radius:var(--ax-sys-border-radius);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));color:rgba(var(--ax-sys-color-on-primary-lightest-surface),.65);transition:background-color .15s ease,color .15s ease}@media(hover:hover){ax-conversation-info-bar .ax-conversation-info-banner__close:hover{color:rgba(var(--ax-sys-color-on-primary-lightest-surface));background:rgba(var(--ax-sys-color-primary-500),.12)}}ax-conversation-info-bar .ax-conversation-info-banner__close:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-600))}ax-conversation-info-bar .info-bar-empty{justify-content:center;opacity:60%}ax-conversation-info-bar .info-left{margin-inline:calc(var(--spacing, .25rem) * -1.5);margin-block:calc(var(--spacing, .25rem) * -1);display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-lg, .5rem);padding-inline:calc(var(--spacing, .25rem) * 1.5);padding-block:calc(var(--spacing, .25rem) * 1);transition:background-color .15s ease}ax-conversation-info-bar .info-left:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-info-bar .info-left:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-500))}ax-conversation-info-bar .avatar-wrapper{flex-shrink:0}ax-conversation-info-bar .info-details{min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-info-bar .info-title{margin:calc(var(--spacing, .25rem) * 0);overflow:hidden;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);text-overflow:ellipsis;white-space:nowrap}ax-conversation-info-bar .info-subtitle-with-status{margin-top:calc(var(--spacing, .25rem) * .5);margin-bottom:calc(var(--spacing, .25rem) * 0);display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-info-bar .online-badge{font-size:.625rem;--tw-leading: 1;line-height:1;color:rgba(var(--ax-sys-color-success-500));animation:axInfoBarPulse 2s cubic-bezier(.4,0,.6,1) infinite}ax-conversation-info-bar .info-subtitle{margin:calc(var(--spacing, .25rem) * 0);overflow:hidden;font-size:.85rem;--tw-tracking: .02rem;letter-spacing:.02rem;text-overflow:ellipsis;white-space:nowrap;opacity:70%}ax-conversation-info-bar .info-actions{display:flex;flex-shrink:0;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-bar .info-component-fullwidth{position:absolute;inset-inline:calc(var(--spacing, .25rem) * 0);inset-block:calc(var(--spacing, .25rem) * 0);z-index:10;display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2);background-color:rgba(var(--ax-sys-color-lightest-surface));padding:calc(var(--spacing, .25rem) * 4)}ax-conversation-info-bar .slide-in{animation:axInfoBarSlideIn var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}ax-conversation-info-bar .slide-out{opacity:0;transform:translate(var(--ax-info-bar-slide-distance, 100%));transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}ax-conversation-info-bar .info-component-fullwidth>*:first-child{min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-info-bar .action-button{display:flex;height:calc(var(--spacing, .25rem) * 9);width:calc(var(--spacing, .25rem) * 9);cursor:pointer;align-items:center;justify-content:center;border-radius:var(--radius-lg, .5rem);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));transition:background .2s}ax-conversation-info-bar .action-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}ax-conversation-info-bar .search-container{display:flex;width:100%;min-width:calc(var(--spacing, .25rem) * 48);align-items:center;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-bar .search-input{min-width:calc(var(--spacing, .25rem) * 0);flex:1}[dir=rtl] ax-conversation-info-bar{--ax-info-bar-slide-distance: -100%}}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-outline-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading: initial;--tw-border-style: solid;--tw-outline-style: solid;--tw-font-weight: initial;--tw-tracking: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: 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: i1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1.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: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "component", type: AXConversationRegistryComponentOutletComponent, selector: "ax-conversation-registry-component-outlet", inputs: ["component", "componentLoader", "inputs"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
6430
6655
|
}
|
|
6431
6656
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationInfoBarComponent, decorators: [{
|
|
6432
6657
|
type: Component,
|
|
@@ -6567,7 +6792,7 @@ class AXConversationForwardMessageDialogComponent {
|
|
|
6567
6792
|
}
|
|
6568
6793
|
}
|
|
6569
6794
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationForwardMessageDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6570
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationForwardMessageDialogComponent, isStandalone: true, selector: "ax-conversation-forward-message-dialog", inputs: { __popup__: { classPropertyName: "__popup__", publicName: "__popup__", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: AXClosableComponent, useExisting: AXConversationForwardMessageDialogComponent }], viewQueries: [{ propertyName: "forwardListEmptyTpl", first: true, predicate: ["forwardListEmpty"], descendants: true, isSignal: true }, { propertyName: "forwardList", first: true, predicate: ["forwardList"], descendants: true, isSignal: true }], ngImport: i0, template: " <div class=\"forward-message-dialog\">\n <ng-template #forwardListEmpty>\n <div class=\"forward-list-empty\">\n @if (forwardSearchQuery()) {\n {{ '@acorex:chat.dialog.forward-message.no-conversations-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.dialog.forward-message.no-conversations-available' | translate | async }}\n }\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <div class=\"forward-list-wrap\">\n <ax-list\n #forwardList\n class=\"forward-list\"\n [dataSource]=\"forwardListDataSource\"\n [multiple]=\"true\"\n [valueField]=\"'id'\"\n [textField]=\"'title'\"\n [checkbox]=\"false\"\n [itemHeight]=\"52\"\n [ngModel]=\"selectedConversationIds()\"\n (ngModelChange)=\"selectedConversationIds.set($event ?? [])\"\n [emptyTemplate]=\"forwardListEmptyTpl()\"\n [itemTemplate]=\"forwardItemTpl\"\n >\n <ax-header class=\"forward-list-header\">\n <div class=\"forward-list-header-inner\">\n <ax-search-box\n [value]=\"forwardSearchQuery()\"\n (valueChange)=\"onForwardSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.placeholders.search-conversations' | translate | async\"\n ></ax-search-box>\n </div>\n </ax-header>\n </ax-list>\n </div>\n </div>\n\n <ng-template #forwardItemTpl let-item>\n @if (conversationFromItem(item); as conversation) {\n <div class=\"forward-item-content\">\n <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isSelected(conversation.id)\" tabindex=\"0\" />\n <ax-conversation-avatar kind=\"auto\" [conversation]=\"conversation\" [size]=\"36\" />\n <span class=\"forward-title-text ax-truncated\">{{ conversation.title }}</span>\n </div>\n }\n </ng-template>\n\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n <ax-button\n [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n [look]=\"'solid'\"\n (onClick)=\"onCancel()\"\n ></ax-button>\n <ax-button\n [text]=\"'@acorex:chat.actions.forward' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canForward()\"\n (onClick)=\"onForward()\"\n ></ax-button>\n </ax-suffix>\n </ax-footer>\n </div>\n", styles: ["@layer properties;@layer components{ax-conversation-forward-message-dialog{display:block}ax-conversation-forward-message-dialog .forward-message-dialog{display:flex;width:100%;flex-direction:column;overflow:hidden}ax-conversation-forward-message-dialog .dialog-content{min-height:calc(var(--spacing, .25rem) * 0);flex:1;overflow:hidden}ax-conversation-forward-message-dialog .forward-list-wrap{overflow:hidden;height:min(50vh,24rem)}ax-conversation-forward-message-dialog .forward-list{display:block;height:100%}ax-conversation-forward-message-dialog .forward-list-header{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;display:block;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface))}ax-conversation-forward-message-dialog .forward-list-header-inner{padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-forward-message-dialog .forward-item-content{display:flex;height:100%;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-lg, .5rem);padding:calc(var(--spacing, .25rem) * 2);transition:background-color .2s ease}ax-conversation-forward-message-dialog .forward-title-text{min-width:calc(var(--spacing, .25rem) * 0);flex:1;overflow:hidden;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-forward-message-dialog .forward-list-empty{padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 5);text-align:center;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-forward-message-dialog .dialog-footer{flex-shrink:0}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "textTemplate", "disabledField", "multiple", "selectionMode", "isItemTruncated", "showItemTooltip", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readonlyChange", "onBlur", "onFocus", "onItemClick", "onItemSelected", "onScrolledIndexChanged"] }, { 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: 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: 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: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
6795
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationForwardMessageDialogComponent, isStandalone: true, selector: "ax-conversation-forward-message-dialog", inputs: { __popup__: { classPropertyName: "__popup__", publicName: "__popup__", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: AXClosableComponent, useExisting: AXConversationForwardMessageDialogComponent }], viewQueries: [{ propertyName: "forwardListEmptyTpl", first: true, predicate: ["forwardListEmpty"], descendants: true, isSignal: true }, { propertyName: "forwardList", first: true, predicate: ["forwardList"], descendants: true, isSignal: true }], ngImport: i0, template: " <div class=\"forward-message-dialog\">\n <ng-template #forwardListEmpty>\n <div class=\"forward-list-empty\">\n @if (forwardSearchQuery()) {\n {{ '@acorex:chat.dialog.forward-message.no-conversations-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.dialog.forward-message.no-conversations-available' | translate | async }}\n }\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <div class=\"forward-list-wrap\">\n <ax-list\n #forwardList\n class=\"forward-list\"\n [dataSource]=\"forwardListDataSource\"\n [multiple]=\"true\"\n [valueField]=\"'id'\"\n [textField]=\"'title'\"\n [checkbox]=\"false\"\n [itemHeight]=\"52\"\n [ngModel]=\"selectedConversationIds()\"\n (ngModelChange)=\"selectedConversationIds.set($event ?? [])\"\n [emptyTemplate]=\"forwardListEmptyTpl()\"\n [itemTemplate]=\"forwardItemTpl\"\n >\n <ax-header class=\"forward-list-header\">\n <div class=\"forward-list-header-inner\">\n <ax-search-box\n [value]=\"forwardSearchQuery()\"\n (valueChange)=\"onForwardSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.placeholders.search-conversations' | translate | async\"\n ></ax-search-box>\n </div>\n </ax-header>\n </ax-list>\n </div>\n </div>\n\n <ng-template #forwardItemTpl let-item>\n @if (conversationFromItem(item); as conversation) {\n <div class=\"forward-item-content\">\n <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isSelected(conversation.id)\" tabindex=\"0\" />\n <ax-conversation-avatar kind=\"auto\" [conversation]=\"conversation\" [size]=\"36\" />\n <span class=\"forward-title-text ax-truncated\">{{ conversation.title }}</span>\n </div>\n }\n </ng-template>\n\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n <ax-button\n [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n [look]=\"'solid'\"\n (onClick)=\"onCancel()\"\n ></ax-button>\n <ax-button\n [text]=\"'@acorex:chat.actions.forward' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canForward()\"\n (onClick)=\"onForward()\"\n ></ax-button>\n </ax-suffix>\n </ax-footer>\n </div>\n", styles: ["@layer properties;@layer components{ax-conversation-forward-message-dialog{display:block}ax-conversation-forward-message-dialog .forward-message-dialog{display:flex;width:100%;flex-direction:column;overflow:hidden}ax-conversation-forward-message-dialog .dialog-content{min-height:calc(var(--spacing, .25rem) * 0);flex:1;overflow:hidden}ax-conversation-forward-message-dialog .forward-list-wrap{overflow:hidden;height:min(50vh,24rem)}ax-conversation-forward-message-dialog .forward-list{display:block;height:100%}ax-conversation-forward-message-dialog .forward-list-header{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;display:block;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface))}ax-conversation-forward-message-dialog .forward-list-header-inner{padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-forward-message-dialog .forward-item-content{display:flex;height:100%;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-lg, .5rem);padding:calc(var(--spacing, .25rem) * 2);transition:background-color .2s ease}ax-conversation-forward-message-dialog .forward-title-text{min-width:calc(var(--spacing, .25rem) * 0);flex:1;overflow:hidden;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-forward-message-dialog .forward-list-empty{padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 5);text-align:center;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-forward-message-dialog .dialog-footer{flex-shrink:0}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "textTemplate", "disabledField", "multiple", "selectionMode", "isItemTruncated", "showItemTooltip", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readonlyChange", "onBlur", "onFocus", "onItemClick", "onItemSelected", "onScrolledIndexChanged"] }, { 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: 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: 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: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
6571
6796
|
}
|
|
6572
6797
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationForwardMessageDialogComponent, decorators: [{
|
|
6573
6798
|
type: Component,
|
|
@@ -6794,46 +7019,7 @@ function resolveReactionPickerPlacement(isOwnMessage, isRtl) {
|
|
|
6794
7019
|
return openTowardPhysicalStart ? 'end-top' : 'start-top';
|
|
6795
7020
|
}
|
|
6796
7021
|
|
|
6797
|
-
/** Subtle chat-area wash when `messageListBackground` is not set in config (indigo → violet → rose → amber). */
|
|
6798
|
-
const AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND =
|
|
6799
|
-
// 'linear-gradient(165deg, rgba(99, 102, 241, 0.14) 0%, rgba(139, 92, 246, 0.10) 34%, rgba(244, 114, 182, 0.11) 66%, rgba(251, 191, 36, 0.15) 100%)';
|
|
6800
|
-
'rgb(var(--ax-sys-color-primary-lightest-surface))';
|
|
6801
|
-
/** Turn bare `https://...` or `/path` into valid CSS `background` for images. */
|
|
6802
|
-
function normalizeMessageListBackgroundValue(raw) {
|
|
6803
|
-
const v = raw.trim();
|
|
6804
|
-
if (v === '') {
|
|
6805
|
-
return AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND;
|
|
6806
|
-
}
|
|
6807
|
-
const lower = v.toLowerCase();
|
|
6808
|
-
if (lower === 'transparent' || lower === 'none') {
|
|
6809
|
-
return v;
|
|
6810
|
-
}
|
|
6811
|
-
if (/^url\s*\(/i.test(v)) {
|
|
6812
|
-
return v;
|
|
6813
|
-
}
|
|
6814
|
-
if (/^https?:\/\//i.test(v)) {
|
|
6815
|
-
const escaped = v.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
6816
|
-
return `url("${escaped}") center / cover no-repeat`;
|
|
6817
|
-
}
|
|
6818
|
-
if (v.startsWith('/') && !/^(linear|radial|conic|rgb|hsl|var)\b/i.test(v)) {
|
|
6819
|
-
const escaped = v.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
6820
|
-
return `url("${escaped}") center / cover no-repeat`;
|
|
6821
|
-
}
|
|
6822
|
-
return v;
|
|
6823
|
-
}
|
|
6824
7022
|
class AXConversationMessageListComponent {
|
|
6825
|
-
/**
|
|
6826
|
-
* Background for the message list scroll area from config, or the built-in soft gradient when unset/empty.
|
|
6827
|
-
* Set `messageListBackground` to `transparent` or `none` for a flat look.
|
|
6828
|
-
*/
|
|
6829
|
-
messageListBackgroundStyle() {
|
|
6830
|
-
const conversationBackground = this.activeConversation()?.metadata?.['messageListBackground'];
|
|
6831
|
-
const raw = typeof conversationBackground === 'string' ? conversationBackground : this.config.messageListBackground;
|
|
6832
|
-
if (typeof raw !== 'string') {
|
|
6833
|
-
return AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND;
|
|
6834
|
-
}
|
|
6835
|
-
return normalizeMessageListBackgroundValue(raw);
|
|
6836
|
-
}
|
|
6837
7023
|
resolvedEmptyStateComponent() {
|
|
6838
7024
|
const fromMetadata = this.activeConversation()?.metadata?.['messageListEmptyComponent'];
|
|
6839
7025
|
if (typeof fromMetadata === 'function') {
|
|
@@ -6854,7 +7040,21 @@ class AXConversationMessageListComponent {
|
|
|
6854
7040
|
this.infoBarService = inject(AXConversationInfoBarService);
|
|
6855
7041
|
this.translation = inject(AXTranslationService);
|
|
6856
7042
|
this.document = inject(DOCUMENT);
|
|
7043
|
+
this.platform = inject(AXPlatform);
|
|
6857
7044
|
this.config = inject(AX_CONVERSATION_CONFIG);
|
|
7045
|
+
/**
|
|
7046
|
+
* Background for the message list scroll area from config, or the built-in soft wash when unset/empty.
|
|
7047
|
+
* Set `messageListBackground` to `transparent` or `none` for a flat look.
|
|
7048
|
+
* Supports `{ light, dark }` for theme-specific backgrounds.
|
|
7049
|
+
*/
|
|
7050
|
+
this.messageListBackgroundStyle = computed(() => {
|
|
7051
|
+
this.platform.themeMode();
|
|
7052
|
+
const isDark = this.platform.isDark();
|
|
7053
|
+
const conversationBackground = this.activeConversation()?.metadata?.['messageListBackground'];
|
|
7054
|
+
const source = conversationBackground ?? this.config.messageListBackground;
|
|
7055
|
+
return resolveMessageListBackgroundStyle(source, isDark);
|
|
7056
|
+
}, /* @ts-ignore */
|
|
7057
|
+
...(ngDevMode ? [{ debugName: "messageListBackgroundStyle" }] : /* istanbul ignore next */ []));
|
|
6858
7058
|
/** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */
|
|
6859
7059
|
this.noActiveFallbackComponent = AXConversationMessageListNoActiveDefaultComponent;
|
|
6860
7060
|
// Timeout cleanup to prevent memory leaks
|
|
@@ -6896,6 +7096,9 @@ class AXConversationMessageListComponent {
|
|
|
6896
7096
|
this.showScrollButton = this.messageListService.showScrollButton;
|
|
6897
7097
|
/** Active conversation */
|
|
6898
7098
|
this.activeConversation = this.conversationService.activeConversation;
|
|
7099
|
+
/** Whether the active conversation allows message reactions. */
|
|
7100
|
+
this.reactionsEnabled = computed(() => isConversationReactionsEnabled(this.activeConversation()), /* @ts-ignore */
|
|
7101
|
+
...(ngDevMode ? [{ debugName: "reactionsEnabled" }] : /* istanbul ignore next */ []));
|
|
6899
7102
|
/** Messages */
|
|
6900
7103
|
this.messages = this.conversationService.activeMessages;
|
|
6901
7104
|
/** Message action event */
|
|
@@ -6940,6 +7143,7 @@ class AXConversationMessageListComponent {
|
|
|
6940
7143
|
untracked(() => {
|
|
6941
7144
|
if (currentConversationId !== previousConversationId) {
|
|
6942
7145
|
this.contextMenuMessageId.set(null);
|
|
7146
|
+
this.closeReactionPicker();
|
|
6943
7147
|
this.observedReadMessageIds.clear();
|
|
6944
7148
|
this.composerService.onConversationChanged(previousConversationId, currentConversationId);
|
|
6945
7149
|
this.infoBarService.onConversationChanged();
|
|
@@ -7253,8 +7457,18 @@ class AXConversationMessageListComponent {
|
|
|
7253
7457
|
}
|
|
7254
7458
|
return `${reaction.userIds.slice(0, 3).join(', ')} and ${reaction.count - 3} more`;
|
|
7255
7459
|
}
|
|
7460
|
+
/** Whether reactions can be shown or added for a message in the active conversation. */
|
|
7461
|
+
messageSupportsReactions(message) {
|
|
7462
|
+
if (!this.reactionsEnabled()) {
|
|
7463
|
+
return false;
|
|
7464
|
+
}
|
|
7465
|
+
return this.registry.messageRenderers.getRenderer(message)?.capabilities.supportsReactions ?? false;
|
|
7466
|
+
}
|
|
7256
7467
|
/** Toggle reaction picker */
|
|
7257
7468
|
toggleReactionPicker(message, event) {
|
|
7469
|
+
if (!this.messageSupportsReactions(message)) {
|
|
7470
|
+
return;
|
|
7471
|
+
}
|
|
7258
7472
|
const button = event.currentTarget ?? event.target.closest('button');
|
|
7259
7473
|
if (!button) {
|
|
7260
7474
|
return;
|
|
@@ -7327,6 +7541,9 @@ class AXConversationMessageListComponent {
|
|
|
7327
7541
|
}
|
|
7328
7542
|
/** Handle reaction click */
|
|
7329
7543
|
onReactionClick(message, emoji) {
|
|
7544
|
+
if (!this.messageSupportsReactions(message)) {
|
|
7545
|
+
return;
|
|
7546
|
+
}
|
|
7330
7547
|
this.messageListService.reactToMessage(message.id, emoji);
|
|
7331
7548
|
}
|
|
7332
7549
|
/** Handle message action */
|
|
@@ -7567,7 +7784,7 @@ class AXConversationMessageListComponent {
|
|
|
7567
7784
|
return message.id;
|
|
7568
7785
|
}
|
|
7569
7786
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationMessageListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7570
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationMessageListComponent, isStandalone: true, selector: "ax-conversation-message-list", 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: "@if (activeConversation(); as conv) {\n @for (cid of [conv.id]; track cid) {\n <div\n class=\"message-list message-list--conversation-surface\"\n [class.message-list--drag]=\"messageListDragging()\"\n #messageList\n role=\"log\"\n [attr.aria-label]=\"'@acorex:chat.aria.message-list' | translate | async\"\n aria-live=\"polite\"\n [style.background]=\"messageListBackgroundStyle()\"\n axUploaderZone\n [disableBrowse]=\"true\"\n (dragEnter)=\"onMessageListDragEnter()\"\n (dragLeave)=\"onMessageListDragLeave()\"\n (fileChange)=\"onMessageListFilesDropped($event)\"\n >\n @if (loading()) {\n <div\n class=\"list-loading\"\n role=\"status\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-messages' | translate | async\"\n >\n <ax-loading></ax-loading>\n <ax-label>{{ '@acorex:chat.status.loading-messages' | translate | async }}</ax-label>\n </div>\n } @else if (messages().length === 0) {\n <div class=\"list-empty\" role=\"status\" [attr.aria-label]=\"'@acorex:chat.status.no-messages' | translate | async\">\n <ng-content select=\"ax-conversation-message-list-empty, [ax-conversation-message-list-empty]\">\n <ng-container\n *ngComponentOutlet=\"resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }\"\n ></ng-container>\n </ng-content>\n </div>\n } @else {\n <div\n class=\"messages-container\"\n (scroll)=\"onScroll($event)\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold\"\n [edge]=\"'top'\"\n [scrollDisabled]=\"loading() || loadingMore() || !hasMoreMessages()\"\n (scrollThreshold)=\"onScrollThreshold($event)\"\n #messagesContainer\n role=\"feed\"\n [attr.aria-label]=\"'@acorex:chat.aria.messages' | translate | async\"\n >\n @if (loadingMore()) {\n <div\n class=\"list-loading-more list-loading-more--prepend\"\n role=\"status\"\n animate.enter=\"load-more-enter\"\n animate.leave=\"load-more-leave\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-older-messages' | translate | async\"\n >\n <div class=\"load-more-indicator\" aria-hidden=\"true\">\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n </div>\n <ax-label class=\"load-more-label\">{{\n '@acorex:chat.status.loading-older-messages' | translate | async\n }}</ax-label>\n </div>\n }\n @for (group of messageGroups(); track trackMessageGroup($index, group)) {\n <!-- Date Separator -->\n <div class=\"date-separator\" role=\"separator\" [attr.aria-label]=\"getDateSeparatorAriaLabel(group.dateLabel)\">\n <ax-badge [text]=\"group.dateLabel\" class=\"date-text\"></ax-badge>\n </div>\n\n <!-- Messages in this date group -->\n @for (message of group.messages; track trackMessage($index, message)) {\n <div\n [class]=\"getMessageClasses(message)\"\n role=\"article\"\n [attr.aria-label]=\"getMessageAriaLabel(message)\"\n [id]=\"'message-' + message.id\"\n >\n <!-- Avatar (only for group conversations and received messages) -->\n @if (shouldShowAvatar(message)) {\n <div class=\"message-avatar\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"message.senderId\"\n [conversation]=\"activeConversation()\"\n [message]=\"message\"\n [size]=\"32\"\n />\n </div>\n }\n\n <div class=\"message-content-row\" [class.message-content-row-own]=\"isOwnMessage(message)\">\n <button\n type=\"button\"\n class=\"add-reaction-button add-reaction-outside\"\n [class.add-reaction-visible]=\"reactionPickerTarget() === message.id\"\n (click)=\"toggleReactionPicker(message, $event)\"\n [attr.aria-label]=\"'@acorex:chat.actions.add-reaction' | translate | async\"\n #reactionButton\n >\n <i class=\"fa-light fa-face-smile\"></i>\n </button>\n\n <div\n class=\"message-bubble-container\"\n [id]=\"'message-bubble-' + message.id\"\n [attr.data-message-id]=\"message.id\"\n >\n <div\n [class]=\"getBubbleClasses(message)\"\n [class.message-bubble-sent]=\"message.senderId === currentUser()?.id\"\n [class.message-bubble-received]=\"message.senderId !== currentUser()?.id\"\n >\n <!-- Sender name (only for group conversations and received messages) -->\n @if (shouldShowSenderName(message)) {\n <div class=\"message-sender\">{{ getSenderName(message) }}:</div>\n }\n\n <!-- Reply Preview -->\n @if (message.replyTo) {\n <div\n class=\"reply-preview\"\n (click)=\"scrollToMessage(message.replyTo.id)\"\n role=\"button\"\n [attr.aria-label]=\"'Reply to ' + getSenderName(message.replyTo)\"\n (keydown.enter)=\"scrollToMessage(message.replyTo.id)\"\n (keydown.space)=\"scrollToMessage(message.replyTo.id)\"\n >\n <div class=\"reply-preview-content\">\n <div class=\"reply-preview-sender\">{{ getSenderName(message.replyTo) }}</div>\n <div class=\"reply-preview-text\">\n @if (getMessagePreviewText(message.replyTo); as preview) {\n <span class=\"last-message\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i\n >{{ '@acorex:chat.' + preview.type | translate | async }}\n } @else {\n {{ preview.value }}\n }\n </span>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Forwarded Indicator -->\n @if (message.forwarded) {\n <div class=\"forwarded-preview\">\n <i class=\"fa-solid fa-share\"></i>\n <span class=\"forwarded-text\">{{ getForwardedText(message) }}</span>\n </div>\n }\n\n <ax-conversation-registry-component-outlet\n [component]=\"getRendererComponent(message)\"\n [componentLoader]=\"getRendererComponentLoader(message)\"\n [inputs]=\"getRendererInputs(message)\"\n />\n\n @if (message.reactions.length > 0) {\n <div class=\"message-reactions-container\">\n <div class=\"message-reactions-bubbles\">\n @for (reaction of getGroupedReactions(message); track reaction.emoji) {\n <button\n type=\"button\"\n class=\"reaction-bubble\"\n [class.reaction-bubble-active]=\"reaction.hasReacted\"\n (click)=\"onReactionClick(message, reaction.emoji)\"\n [attr.aria-label]=\"reaction.emoji + ' ' + reaction.count\"\n >\n <span class=\"reaction-emoji\">{{ reaction.emoji }}</span>\n @if (reaction.count > 1) {\n <span class=\"reaction-count\">{{ reaction.count }}</span>\n }\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Message Footer -->\n <div class=\"message-footer\">\n @let replyCount = getReplyCount(message);\n @let forwardCount = getForwardCount(message);\n @if (replyCount > 0) {\n <span class=\"message-footer-count\" [attr.aria-label]=\"replyCount + ' replies'\">\n <i class=\"fa-solid fa-message\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ replyCount }}</span>\n </span>\n }\n @if (forwardCount > 0) {\n <span class=\"message-footer-count\" [attr.aria-label]=\"forwardCount + ' forwards'\">\n <i class=\"fa-solid fa-share\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ forwardCount }}</span>\n </span>\n }\n @if (replyCount > 0 || forwardCount > 0) {\n <span class=\"message-footer-split\" aria-hidden=\"true\"></span>\n }\n <span class=\"message-time\">{{ message.timestamp | format: 'timeleft' | async }}</span>\n @if (message.editedAt) {\n <span class=\"edited-indicator\">\n <span>{{ '@acorex:chat.status.edited' | translate | async }}</span>\n </span>\n }\n @if (isOwnMessage(message)) {\n <span [class]=\"getStatusIconClasses(message)\">\n <ax-icon><i [class]=\"getStatusIcon(message)\"></i></ax-icon>\n </span>\n }\n </div>\n </div>\n </div>\n </div>\n\n <!-- Context Menu for Message Actions -->\n <ax-context-menu\n [target]=\"'#message-bubble-' + message.id\"\n [openOn]=\"'click'\"\n [closeOn]=\"'click'\"\n (onOpening)=\"handleMessageContextMenuOpening($event, message)\"\n (onClose)=\"contextMenuMessageId.set(null)\"\n (onItemClick)=\"handleMessageContextMenuItemClick($event, message)\"\n >\n </ax-context-menu>\n </div>\n }\n }\n </div>\n\n <!-- Scroll to Bottom Button -->\n @if (showScrollButton()) {\n <div\n class=\"scroll-to-bottom-wrapper\"\n animate.enter=\"scroll-to-bottom-enter\"\n animate.leave=\"scroll-to-bottom-leave\"\n >\n <ax-fab\n class=\"scroll-to-bottom\"\n (onClick)=\"scrollToBottom()\"\n [attr.aria-label]=\"'@acorex:chat.actions.scroll-to-bottom' | translate | async\"\n >\n <ax-icon><i class=\"fa-light fa-arrow-down\" aria-hidden=\"true\"></i></ax-icon>\n </ax-fab>\n </div>\n }\n }\n </div>\n }\n\n <!-- Reaction Picker Popover -->\n @if (reactionPickerTarget()) {\n <ax-popover\n #reactionPopover\n [target]=\"reactionPickerElement()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"reactionPickerPlacement()\"\n (onClose)=\"closeReactionPicker()\"\n >\n <div class=\"reaction-picker-popup\">\n <div class=\"reaction-picker-header\">\n <span class=\"picker-title\">{{ '@acorex:chat.actions.react' | translate | async }}</span>\n <button\n type=\"button\"\n class=\"picker-close\"\n (click)=\"closeReactionPicker()\"\n [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n <div\n class=\"reaction-picker-emojis\"\n role=\"listbox\"\n [attr.aria-label]=\"'@acorex:chat.actions.choose-reaction' | translate | async\"\n >\n @for (emoji of availableReactions(); track emoji) {\n <button\n type=\"button\"\n class=\"reaction-picker-emoji\"\n [class.reaction-picker-emoji-active]=\"hasUserReactedById(reactionPickerTarget()!, emoji)\"\n (click)=\"onReactionClickById(reactionPickerTarget()!, emoji); closeReactionPicker()\"\n [attr.aria-label]=\"emoji\"\n >\n {{ emoji }}\n </button>\n }\n </div>\n </div>\n </ax-popover>\n }\n} @else {\n <div\n class=\"message-list message-list--no-active\"\n role=\"region\"\n [attr.aria-label]=\"'@acorex:chat.status.no-conversation-selected' | translate | async\"\n >\n <div class=\"list-no-active\">\n <ng-content select=\"ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]\">\n <ng-container *ngComponentOutlet=\"noActiveFallbackComponent\"></ng-container>\n </ng-content>\n </div>\n </div>\n}\n", styles: ["@layer properties;@layer components{ax-conversation-message-list{position:relative;display:block;height:100%;container-type:inline-size;@keyframes axConversationSurfaceIn{0%{opacity:0}to{opacity:1}}@keyframes axConversationSurfaceInReduced{0%{opacity:.92}to{opacity:1}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes axChatLoadMoreDot{0%,70%,to{transform:translateY(0) scale(1);opacity:.4}35%{transform:translateY(-.28rem) scale(1.08);opacity:1}}@keyframes axChatLoadMoreEnterPrepend{0%{opacity:0;transform:translateY(-.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes axChatLoadMoreLeavePrepend{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-.35rem)}}@keyframes axScrollToBottomEnter{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes axScrollToBottomLeave{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}}ax-conversation-message-list .message-list{position:relative;display:flex;height:100%;min-height:calc(var(--spacing, .25rem) * 0);flex-direction:column;overflow:hidden}ax-conversation-message-list .message-list.ax-drop-zone>.ax-uploader-overlay-state{display:none!important}ax-conversation-message-list .message-list--drag{outline-style:var(--tw-outline-style);outline-width:2px;outline-color:rgba(var(--ax-sys-color-primary-surface));--tw-outline-style: dashed;outline-style:dashed;outline-offset:-2px}ax-conversation-message-list .message-list--conversation-surface{animation:axConversationSurfaceIn .36s cubic-bezier(.22,1,.36,1) both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .message-list--conversation-surface{animation:axConversationSurfaceInReduced .18s ease both}}ax-conversation-message-list .list-loading{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;align-items:center;justify-content:center;text-align:center}ax-conversation-message-list .list-empty{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 5);padding-inline:calc(var(--spacing, .25rem) * 8);padding-block:calc(var(--spacing, .25rem) * 12);text-align:center;animation:fadeInUp .5s ease-out}ax-conversation-message-list .message-list--no-active{height:100%}ax-conversation-message-list .list-no-active{display:flex;height:100%;min-height:calc(var(--spacing, .25rem) * 48);flex-direction:column;align-items:center;justify-content:center}ax-conversation-message-list .empty-icon{margin-bottom:calc(var(--spacing, .25rem) * 2);font-size:5.5rem;--tw-leading: 1;line-height:1;opacity:35%;filter:grayscale(.2)}ax-conversation-message-list .empty-title{margin:calc(var(--spacing, .25rem) * 0);font-size:1.625rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-tight, -.025em);letter-spacing:var(--tracking-tight, -.025em);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-message-list .empty-description{margin:calc(var(--spacing, .25rem) * 0);max-width:420px;font-size:1.0625rem;--tw-leading: var(--leading-relaxed, 1.625);line-height:var(--leading-relaxed, 1.625);color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-message-list .spinner{margin-bottom:calc(var(--spacing, .25rem) * 4);height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:3px;border-color:rgba(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));animation:spin .8s linear infinite}ax-conversation-message-list .list-loading-more{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 2);text-align:center;color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-message-list .load-more-indicator{display:flex;min-height:calc(var(--spacing, .25rem) * 5);align-items:center;justify-content:center;gap:.3rem}ax-conversation-message-list .load-more-dot{height:.4rem;width:.4rem;border-radius:calc(infinity * 1px);background-color:rgba(var(--ax-sys-color-primary-500));animation:axChatLoadMoreDot 1s ease-in-out infinite}ax-conversation-message-list .load-more-dot:nth-child(2){animation-delay:.14s}ax-conversation-message-list .load-more-dot:nth-child(3){animation-delay:.28s}ax-conversation-message-list .load-more-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);opacity:70%}ax-conversation-message-list .load-more-enter{animation:axChatLoadMoreEnterPrepend .32s cubic-bezier(.22,1,.36,1) both}ax-conversation-message-list .load-more-leave{animation:axChatLoadMoreLeavePrepend .22s ease both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .load-more-dot{animation:none;opacity:.65}ax-conversation-message-list .load-more-enter,ax-conversation-message-list .load-more-leave{animation:none}}ax-conversation-message-list .messages-container{position:relative;min-height:calc(var(--spacing, .25rem) * 0);width:100%;flex:1;overflow-x:hidden;overflow-y:auto}ax-conversation-message-list .date-separator{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:150;display:flex;align-items:center;justify-content:center;padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-message-list .date-text{display:flex;width:calc(var(--spacing, .25rem) * 28);align-items:center;justify-content:center;border-radius:var(--radius-2xl, 1rem);background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 1);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-conversation-message-list .unread-separator{margin-block:calc(var(--spacing, .25rem) * 6);display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 4)}ax-conversation-message-list .unread-separator-line{height:1px;flex:1;background-color:rgba(var(--ax-sys-color-primary-surface));opacity:30%}ax-conversation-message-list .unread-separator-text{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);white-space:nowrap;color:rgba(var(--ax-sys-color-primary-surface));text-transform:uppercase}ax-conversation-message-list .message-item{position:relative;display:flex;align-items:flex-end;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2);--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);transition:background-color .3s ease}ax-conversation-message-list .message-item-context-active{border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-500),.09);box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.22)}ax-conversation-message-list .message-own.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.12)}ax-conversation-message-list .message-highlight{border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-500),.1)}ax-conversation-message-list .message-item.message-own{flex-direction:row-reverse}ax-conversation-message-list .message-avatar{flex-shrink:0}ax-conversation-message-list .message-avatar-icon{display:flex;height:100%;width:100%;align-items:center;justify-content:center;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: 1;line-height:1}ax-conversation-message-list .message-content-row{position:relative;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:0 1 auto;flex-direction:row;align-items:flex-end;gap:calc(var(--spacing, .25rem) * 1);max-width:min(95%,50rem)}@container (min-width: 768px){ax-conversation-message-list .message-content-row{max-width:min(70%,50rem)}}ax-conversation-message-list .message-content-row-own{justify-content:flex-end}ax-conversation-message-list .message-item:not(.message-own) .message-content-row{justify-content:flex-start}ax-conversation-message-list .message-bubble-container{position:relative;display:flex;max-width:100%;min-width:calc(var(--spacing, .25rem) * 0);flex:1 1 auto;flex-direction:column}ax-conversation-message-list .message-own .message-bubble-container{align-items:flex-end}ax-conversation-message-list .message-sender{margin-bottom:.1rem;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}ax-conversation-message-list .message-bubble{position:relative;display:flex;max-width:100%;flex-direction:column;border-radius:var(--radius-2xl, 1rem);background-color:rgba(var(--ax-sys-color-lightest-surface));padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 2);padding-bottom:.1rem;overflow-wrap:break-word;transition:background-color .3s ease}ax-conversation-message-list .reply-preview{margin-bottom:.1rem;cursor:pointer;border-radius:var(--ax-sys-border-radius);border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1.5);background:rgba(var(--ax-sys-color-primary-500),.08);border-inline-start-color: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)}ax-conversation-message-list .reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}ax-conversation-message-list .message-own .reply-preview{border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.55)}ax-conversation-message-list .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)}ax-conversation-message-list .reply-preview-line{width:3px;flex-shrink:0;border-radius:1.5px;background:currentColor;opacity:.5}ax-conversation-message-list .reply-preview-content{min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-message-list .reply-preview-sender{margin-bottom:calc(var(--spacing, .25rem) * .5);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-600))}ax-conversation-message-list .reply-preview-text{overflow:hidden;font-size:.8125rem;text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-message-list .message-own .reply-preview-sender{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:95%}ax-conversation-message-list .message-own .reply-preview-text{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:.78}ax-conversation-message-list .last-message{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-conversation-message-list .forwarded-preview{margin-bottom:.1rem;display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:var(--ax-sys-border-radius);border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1.5);background:rgba(var(--ax-sys-color-primary-500),.08);border-inline-start-color: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)}ax-conversation-message-list .forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}ax-conversation-message-list .message-own .forwarded-preview{border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.55)}ax-conversation-message-list .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)}ax-conversation-message-list .forwarded-preview i{flex-shrink:0;font-size:.8125rem;color:rgba(var(--ax-sys-color-primary-600))}ax-conversation-message-list .forwarded-text{min-width:calc(var(--spacing, .25rem) * 0);overflow:hidden;font-size:.8125rem;text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-message-list .message-own .forwarded-preview i{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:95%}ax-conversation-message-list .message-own .forwarded-text{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:.78}ax-conversation-message-list .message-bubble-received{border-end-start-radius:.125rem}ax-conversation-message-list .message-bubble-received:before{content:\"\";display:block;position:absolute;bottom:calc(var(--spacing, .25rem) * 0);height:.8rem;width:.8rem;background-color:rgba(var(--ax-sys-color-lightest-surface));inset-inline-start:-.7rem;border-start-start-radius:86%;corner-shape:scoop}ax-conversation-message-list .message-bubble-sent{border-end-end-radius:.125rem}ax-conversation-message-list .message-bubble-sent:after{content:\"\";display:block;width:.8rem;height:.8rem;position:absolute;bottom:0;background:rgb(var(--ax-sys-color-primary-surface));inset-inline-end:-.7rem;border-start-end-radius:86%;corner-shape:scoop}ax-conversation-message-list .message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}ax-conversation-message-list .message-bubble.message-system{background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);max-width:100%}ax-conversation-message-list .message-bubble.message-system:before,ax-conversation-message-list .message-bubble.message-system:after{display:none}ax-conversation-message-list .message-item:has(.message-system){justify-content:center;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1)}ax-conversation-message-list .message-item:has(.message-system) .message-content-row{max-width:100%;justify-content:center}ax-conversation-message-list .message-item:has(.message-system) .message-bubble-container{align-items:center}ax-conversation-message-list .message-content{font-size:.9375rem;--tw-leading: var(--leading-normal, 1.5);line-height:var(--leading-normal, 1.5);white-space:pre-wrap}ax-conversation-message-list ax-conversation-registry-component-outlet{display:block;max-width:100%;min-width:calc(var(--spacing, .25rem) * 0)}ax-conversation-message-list .message-footer{margin-top:.1rem;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:calc(var(--spacing, .25rem) * 1);padding-inline-start:calc(var(--spacing, .25rem) * 1);font-size:.6875rem;--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);opacity:70%;-webkit-user-select:none;user-select:none}ax-conversation-message-list .message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-size:.675rem;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-message-list .message-footer-count i{font-size:.625rem;opacity:90%}ax-conversation-message-list .message-footer-count-value{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}ax-conversation-message-list .message-footer-split{margin-inline:.2rem;height:.65rem;width:1px;flex-shrink:0;align-self:center;background-color:rgba(var(--ax-sys-color-border-light-surface));opacity:90%}ax-conversation-message-list .message-time{font-size:.675rem;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-message-list .edited-indicator{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline-start:.35rem;font-size:.675rem;opacity:75%}ax-conversation-message-list .status-icon{display:inline-flex;align-items:center}ax-conversation-message-list .status-icon i{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)))}ax-conversation-message-list .status-read{color:rgba(var(--ax-sys-color-primary-200))}ax-conversation-message-list .status-failed{color:rgba(var(--ax-sys-color-danger-200))}ax-conversation-message-list .message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}ax-conversation-message-list .reaction-bubble{margin:calc(var(--spacing, .25rem) * 0);display:inline-flex;min-height:1.375rem;cursor:pointer;align-items:center;justify-content:center;gap:.15rem;border-radius:var(--radius-xl, .75rem);padding-inline:.35rem;padding-block:.1rem;color:rgba(var(--ax-sys-color-on-surface));--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background:rgba(var(--ax-sys-color-on-surface),.06);border:1px solid rgba(var(--ax-sys-color-on-surface),.1);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}ax-conversation-message-list .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}ax-conversation-message-list .reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}ax-conversation-message-list .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}ax-conversation-message-list .reaction-emoji{display:inline-block;font-size:.8125rem;--tw-leading: 1;line-height:1}ax-conversation-message-list .reaction-count{font-size:.6875rem;--tw-leading: 1;line-height:1;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);opacity:.65}ax-conversation-message-list .reaction-bubble-active .reaction-count{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-600));opacity:95%}ax-conversation-message-list .message-own .reaction-bubble{color:rgba(var(--ax-sys-color-on-primary-surface));background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2)}ax-conversation-message-list .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)}ax-conversation-message-list .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)}ax-conversation-message-list .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)}ax-conversation-message-list .message-own .reaction-count{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:80%}ax-conversation-message-list .message-own .reaction-bubble-active .reaction-count{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:100%}ax-conversation-message-list .message-reactions-container{margin-top:calc(var(--spacing, .25rem) * 1);display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:.2rem}ax-conversation-message-list .message-own .message-reactions-container{justify-content:flex-end}ax-conversation-message-list .message-own .message-footer .edited-indicator{border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}ax-conversation-message-list .message-own .message-footer .message-footer-split{background:rgba(var(--ax-sys-color-on-primary-surface),.35)}ax-conversation-message-list .add-reaction-button.add-reaction-outside{position:absolute;top:50%;margin:calc(var(--spacing, .25rem) * 0);box-sizing:border-box;display:none;height:1.8rem;width:1.8rem;--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-surface));padding:calc(var(--spacing, .25rem) * 0);inset-inline-end:-2.25rem;box-shadow:0 1px 2px #0000000f}ax-conversation-message-list .add-reaction-button{padding-inline-start:.05rem}ax-conversation-message-list .message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-2.25rem;inset-inline-end:auto}ax-conversation-message-list .message-item:hover .add-reaction-button.add-reaction-outside,ax-conversation-message-list .add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}ax-conversation-message-list .add-reaction-button.add-reaction-outside:hover,ax-conversation-message-list .add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-message-list .add-reaction-button.add-reaction-outside i{font-size:.9rem;color:rgba(var(--ax-sys-color-on-surface));opacity:80%}ax-conversation-message-list .reaction-picker-popup{width:max-content;min-width:calc(var(--spacing, .25rem) * 0);overflow:hidden;border-radius:.65rem;border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));max-width:min(260px,92vw);box-shadow:0 4px 16px #0000001a}ax-conversation-message-list .reaction-picker-header{display:flex;min-height:calc(var(--spacing, .25rem) * 0);align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-block:.45rem;padding-inline-start:.7rem;padding-inline-end:calc(var(--spacing, .25rem) * 2)}ax-conversation-message-list .picker-title{font-size:.8125rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-message-list .picker-close{display:flex;height:1.6rem;width:1.6rem;cursor:pointer;align-items:center;justify-content:center;border-radius:.25rem;--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);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)}ax-conversation-message-list .picker-close:hover{background-color:rgba(var(--ax-sys-color-danger-lightest-surface));color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-message-list .reaction-bubble:focus-visible,ax-conversation-message-list .add-reaction-button:focus-visible,ax-conversation-message-list .picker-close:focus-visible,ax-conversation-message-list .reaction-picker-emoji:focus-visible,ax-conversation-message-list .action-trigger:focus-visible,ax-conversation-message-list ax-fab.scroll-to-bottom ax-button:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-message-list .reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:.2rem;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:.45rem;padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-message-list .reaction-picker-emoji{height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;border-radius:.45rem;border-style:var(--tw-border-style);border-width:1px;border-color:transparent;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:1.15rem;--tw-leading: 1;line-height:1;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}ax-conversation-message-list .reaction-picker-emoji:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-message-list .reaction-picker-emoji-active{background-color:rgba(var(--ax-sys-color-surface))}ax-conversation-message-list .reaction-picker-emoji-active:hover{background:rgba(var(--ax-sys-color-primary-500),.25)}ax-conversation-message-list .message-actions{z-index:10;padding-bottom:calc(var(--spacing, .25rem) * 6);opacity:0%;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}ax-conversation-message-list .message-item:hover .message-actions{opacity:100%}ax-conversation-message-list .action-trigger{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;justify-content:center;border-radius:var(--ax-sys-border-radius);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-surface));font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}ax-conversation-message-list .action-trigger:hover{background-color:rgba(var(--ax-sys-color-light-surface))}ax-conversation-message-list .shortcut{font-size:.6875rem;opacity:70%}ax-conversation-message-list .scroll-to-bottom-wrapper{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 4);bottom:calc(var(--spacing, .25rem) * 4);z-index:999}ax-conversation-message-list ax-fab.scroll-to-bottom ax-button{display:flex;height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none}ax-conversation-message-list .scroll-to-bottom-enter{animation:axScrollToBottomEnter var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function) both}ax-conversation-message-list .scroll-to-bottom-leave{animation:axScrollToBottomLeave var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function) both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .scroll-to-bottom-enter,ax-conversation-message-list .scroll-to-bottom-leave{animation:none}}}@property --tw-outline-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@property --tw-translate-x{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: \"*\"; inherits: false; initial-value: 0;}@keyframes spin{to{transform:rotate(360deg)}}@keyframes fadeInUp{0%{transform:translate3d(0,100%,0);opacity:0}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-outline-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial;--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXFabComponent, selector: "ax-fab", inputs: ["label", "popupStyle", "popupPlacement", "size"], outputs: ["popupPlacementChange", "onClick", "onOpened", "onClosed"] }, { kind: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "closeOnRouteChange", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { 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: "component", type: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXConversationInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge", "scrollDisabled", "cooldownMs"], outputs: ["scrollThreshold"] }, { kind: "directive", type: AXUploaderZoneDirective, selector: "[axUploaderZone]", inputs: ["multiple", "accept", "fileType", "overlayTemplate", "disableBrowse", "disableDragDrop"], outputs: ["fileChange", "onChanged", "dragEnter", "dragLeave", "dragOver", "onFileUploadComplete", "onFilesUploadComplete"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "component", type: AXConversationRegistryComponentOutletComponent, selector: "ax-conversation-registry-component-outlet", inputs: ["component", "componentLoader", "inputs"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.AXFormatPipe, name: "format" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
7787
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationMessageListComponent, isStandalone: true, selector: "ax-conversation-message-list", 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: "@if (activeConversation(); as conv) {\n @for (cid of [conv.id]; track cid) {\n <div\n class=\"message-list message-list--conversation-surface\"\n [class.message-list--drag]=\"messageListDragging()\"\n #messageList\n role=\"log\"\n [attr.aria-label]=\"'@acorex:chat.aria.message-list' | translate | async\"\n aria-live=\"polite\"\n [style.background]=\"messageListBackgroundStyle()\"\n axUploaderZone\n [disableBrowse]=\"true\"\n (dragEnter)=\"onMessageListDragEnter()\"\n (dragLeave)=\"onMessageListDragLeave()\"\n (fileChange)=\"onMessageListFilesDropped($event)\"\n >\n @if (loading()) {\n <div\n class=\"list-loading\"\n role=\"status\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-messages' | translate | async\"\n >\n <ax-loading></ax-loading>\n <ax-label>{{ '@acorex:chat.status.loading-messages' | translate | async }}</ax-label>\n </div>\n } @else if (messages().length === 0) {\n <div class=\"list-empty\" role=\"status\" [attr.aria-label]=\"'@acorex:chat.status.no-messages' | translate | async\">\n <ng-content select=\"ax-conversation-message-list-empty, [ax-conversation-message-list-empty]\">\n <ng-container\n *ngComponentOutlet=\"resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }\"\n ></ng-container>\n </ng-content>\n </div>\n } @else {\n <div\n class=\"messages-container\"\n (scroll)=\"onScroll($event)\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold\"\n [edge]=\"'top'\"\n [scrollDisabled]=\"loading() || loadingMore() || !hasMoreMessages()\"\n (scrollThreshold)=\"onScrollThreshold($event)\"\n #messagesContainer\n role=\"feed\"\n [attr.aria-label]=\"'@acorex:chat.aria.messages' | translate | async\"\n >\n @if (loadingMore()) {\n <div\n class=\"list-loading-more list-loading-more--prepend\"\n role=\"status\"\n animate.enter=\"load-more-enter\"\n animate.leave=\"load-more-leave\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-older-messages' | translate | async\"\n >\n <div class=\"load-more-indicator\" aria-hidden=\"true\">\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n </div>\n <ax-label class=\"load-more-label\">{{\n '@acorex:chat.status.loading-older-messages' | translate | async\n }}</ax-label>\n </div>\n }\n @for (group of messageGroups(); track trackMessageGroup($index, group)) {\n <!-- Date Separator -->\n <div class=\"date-separator\" role=\"separator\" [attr.aria-label]=\"getDateSeparatorAriaLabel(group.dateLabel)\">\n <ax-badge [text]=\"group.dateLabel\" class=\"date-text\"></ax-badge>\n </div>\n\n <!-- Messages in this date group -->\n @for (message of group.messages; track trackMessage($index, message)) {\n <div\n [class]=\"getMessageClasses(message)\"\n role=\"article\"\n [attr.aria-label]=\"getMessageAriaLabel(message)\"\n [id]=\"'message-' + message.id\"\n >\n <!-- Avatar (only for group conversations and received messages) -->\n @if (shouldShowAvatar(message)) {\n <div class=\"message-avatar\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"message.senderId\"\n [conversation]=\"activeConversation()\"\n [message]=\"message\"\n [size]=\"32\"\n />\n </div>\n }\n\n <div class=\"message-content-row\" [class.message-content-row-own]=\"isOwnMessage(message)\">\n @if (messageSupportsReactions(message)) {\n <button\n type=\"button\"\n class=\"add-reaction-button add-reaction-outside\"\n [class.add-reaction-visible]=\"reactionPickerTarget() === message.id\"\n (click)=\"toggleReactionPicker(message, $event)\"\n [attr.aria-label]=\"'@acorex:chat.actions.add-reaction' | translate | async\"\n #reactionButton\n >\n <i class=\"fa-light fa-face-smile\"></i>\n </button>\n }\n\n <div\n class=\"message-bubble-container\"\n [id]=\"'message-bubble-' + message.id\"\n [attr.data-message-id]=\"message.id\"\n >\n <div\n [class]=\"getBubbleClasses(message)\"\n [class.message-bubble-sent]=\"message.senderId === currentUser()?.id\"\n [class.message-bubble-received]=\"message.senderId !== currentUser()?.id\"\n >\n <!-- Sender name (only for group conversations and received messages) -->\n @if (shouldShowSenderName(message)) {\n <div class=\"message-sender\">{{ getSenderName(message) }}:</div>\n }\n\n <!-- Reply Preview -->\n @if (message.replyTo) {\n <div\n class=\"reply-preview\"\n (click)=\"scrollToMessage(message.replyTo.id)\"\n role=\"button\"\n [attr.aria-label]=\"'Reply to ' + getSenderName(message.replyTo)\"\n (keydown.enter)=\"scrollToMessage(message.replyTo.id)\"\n (keydown.space)=\"scrollToMessage(message.replyTo.id)\"\n >\n <div class=\"reply-preview-content\">\n <div class=\"reply-preview-sender\">{{ getSenderName(message.replyTo) }}</div>\n <div class=\"reply-preview-text\">\n @if (getMessagePreviewText(message.replyTo); as preview) {\n <span class=\"last-message\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i\n >{{ '@acorex:chat.' + preview.type | translate | async }}\n } @else {\n {{ preview.value }}\n }\n </span>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Forwarded Indicator -->\n @if (message.forwarded) {\n <div class=\"forwarded-preview\">\n <i class=\"fa-solid fa-share\"></i>\n <span class=\"forwarded-text\">{{ getForwardedText(message) }}</span>\n </div>\n }\n\n <ax-conversation-registry-component-outlet\n [component]=\"getRendererComponent(message)\"\n [componentLoader]=\"getRendererComponentLoader(message)\"\n [inputs]=\"getRendererInputs(message)\"\n />\n\n @if (messageSupportsReactions(message) && message.reactions.length > 0) {\n <div class=\"message-reactions-container\">\n <div class=\"message-reactions-bubbles\">\n @for (reaction of getGroupedReactions(message); track reaction.emoji) {\n <button\n type=\"button\"\n class=\"reaction-bubble\"\n [class.reaction-bubble-active]=\"reaction.hasReacted\"\n (click)=\"onReactionClick(message, reaction.emoji)\"\n [attr.aria-label]=\"reaction.emoji + ' ' + reaction.count\"\n >\n <span class=\"reaction-emoji\">{{ reaction.emoji }}</span>\n @if (reaction.count > 1) {\n <span class=\"reaction-count\">{{ reaction.count }}</span>\n }\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Message Footer -->\n <div class=\"message-footer\">\n @let replyCount = getReplyCount(message);\n @let forwardCount = getForwardCount(message);\n @if (replyCount > 0) {\n <span class=\"message-footer-count\" [attr.aria-label]=\"replyCount + ' replies'\">\n <i class=\"fa-solid fa-message\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ replyCount }}</span>\n </span>\n }\n @if (forwardCount > 0) {\n <span class=\"message-footer-count\" [attr.aria-label]=\"forwardCount + ' forwards'\">\n <i class=\"fa-solid fa-share\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ forwardCount }}</span>\n </span>\n }\n @if (replyCount > 0 || forwardCount > 0) {\n <span class=\"message-footer-split\" aria-hidden=\"true\"></span>\n }\n <span class=\"message-time\">{{ message.timestamp | format: 'timeleft' | async }}</span>\n @if (message.editedAt) {\n <span class=\"edited-indicator\">\n <span>{{ '@acorex:chat.status.edited' | translate | async }}</span>\n </span>\n }\n @if (isOwnMessage(message)) {\n <span [class]=\"getStatusIconClasses(message)\">\n <ax-icon><i [class]=\"getStatusIcon(message)\"></i></ax-icon>\n </span>\n }\n </div>\n </div>\n </div>\n </div>\n\n <!-- Context Menu for Message Actions -->\n <ax-context-menu\n [target]=\"'#message-bubble-' + message.id\"\n [openOn]=\"'click'\"\n [closeOn]=\"'click'\"\n (onOpening)=\"handleMessageContextMenuOpening($event, message)\"\n (onClose)=\"contextMenuMessageId.set(null)\"\n (onItemClick)=\"handleMessageContextMenuItemClick($event, message)\"\n >\n </ax-context-menu>\n </div>\n }\n }\n </div>\n\n <!-- Scroll to Bottom Button -->\n @if (showScrollButton()) {\n <div\n class=\"scroll-to-bottom-wrapper\"\n animate.enter=\"scroll-to-bottom-enter\"\n animate.leave=\"scroll-to-bottom-leave\"\n >\n <ax-fab\n class=\"scroll-to-bottom\"\n (onClick)=\"scrollToBottom()\"\n [attr.aria-label]=\"'@acorex:chat.actions.scroll-to-bottom' | translate | async\"\n >\n <ax-icon><i class=\"fa-light fa-arrow-down\" aria-hidden=\"true\"></i></ax-icon>\n </ax-fab>\n </div>\n }\n }\n </div>\n }\n\n <!-- Reaction Picker Popover -->\n @if (reactionsEnabled() && reactionPickerTarget()) {\n <ax-popover\n #reactionPopover\n [target]=\"reactionPickerElement()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"reactionPickerPlacement()\"\n (onClose)=\"closeReactionPicker()\"\n >\n <div class=\"reaction-picker-popup\">\n <div class=\"reaction-picker-header\">\n <span class=\"picker-title\">{{ '@acorex:chat.actions.react' | translate | async }}</span>\n <button\n type=\"button\"\n class=\"picker-close\"\n (click)=\"closeReactionPicker()\"\n [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n <div\n class=\"reaction-picker-emojis\"\n role=\"listbox\"\n [attr.aria-label]=\"'@acorex:chat.actions.choose-reaction' | translate | async\"\n >\n @for (emoji of availableReactions(); track emoji) {\n <button\n type=\"button\"\n class=\"reaction-picker-emoji\"\n [class.reaction-picker-emoji-active]=\"hasUserReactedById(reactionPickerTarget()!, emoji)\"\n (click)=\"onReactionClickById(reactionPickerTarget()!, emoji); closeReactionPicker()\"\n [attr.aria-label]=\"emoji\"\n >\n {{ emoji }}\n </button>\n }\n </div>\n </div>\n </ax-popover>\n }\n} @else {\n <div\n class=\"message-list message-list--no-active\"\n role=\"region\"\n [attr.aria-label]=\"'@acorex:chat.status.no-conversation-selected' | translate | async\"\n >\n <div class=\"list-no-active\">\n <ng-content select=\"ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]\">\n <ng-container *ngComponentOutlet=\"noActiveFallbackComponent\"></ng-container>\n </ng-content>\n </div>\n </div>\n}\n", styles: ["@layer properties;@layer components{ax-conversation-message-list{position:relative;display:block;height:100%;container-type:inline-size;@keyframes axConversationSurfaceIn{0%{opacity:0}to{opacity:1}}@keyframes axConversationSurfaceInReduced{0%{opacity:.92}to{opacity:1}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes axChatLoadMoreDot{0%,70%,to{transform:translateY(0) scale(1);opacity:.4}35%{transform:translateY(-.28rem) scale(1.08);opacity:1}}@keyframes axChatLoadMoreEnterPrepend{0%{opacity:0;transform:translateY(-.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes axChatLoadMoreLeavePrepend{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-.35rem)}}@keyframes axScrollToBottomEnter{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes axScrollToBottomLeave{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}}ax-conversation-message-list .message-list{position:relative;display:flex;height:100%;min-height:calc(var(--spacing, .25rem) * 0);flex-direction:column;overflow:hidden}ax-conversation-message-list .message-list.ax-drop-zone>.ax-uploader-overlay-state{display:none!important}ax-conversation-message-list .message-list--drag{outline-style:var(--tw-outline-style);outline-width:2px;outline-color:rgba(var(--ax-sys-color-primary-surface));--tw-outline-style: dashed;outline-style:dashed;outline-offset:-2px}ax-conversation-message-list .message-list--conversation-surface{animation:axConversationSurfaceIn .36s cubic-bezier(.22,1,.36,1) both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .message-list--conversation-surface{animation:axConversationSurfaceInReduced .18s ease both}}ax-conversation-message-list .list-loading{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;align-items:center;justify-content:center;text-align:center}ax-conversation-message-list .list-empty{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 5);padding-inline:calc(var(--spacing, .25rem) * 8);padding-block:calc(var(--spacing, .25rem) * 12);text-align:center;animation:fadeInUp .5s ease-out}ax-conversation-message-list .message-list--no-active{height:100%}ax-conversation-message-list .list-no-active{display:flex;height:100%;min-height:calc(var(--spacing, .25rem) * 48);flex-direction:column;align-items:center;justify-content:center}ax-conversation-message-list .empty-icon{margin-bottom:calc(var(--spacing, .25rem) * 2);font-size:5.5rem;--tw-leading: 1;line-height:1;opacity:35%;filter:grayscale(.2)}ax-conversation-message-list .empty-title{margin:calc(var(--spacing, .25rem) * 0);font-size:1.625rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-tight, -.025em);letter-spacing:var(--tracking-tight, -.025em);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-message-list .empty-description{margin:calc(var(--spacing, .25rem) * 0);max-width:420px;font-size:1.0625rem;--tw-leading: var(--leading-relaxed, 1.625);line-height:var(--leading-relaxed, 1.625);color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-message-list .spinner{margin-bottom:calc(var(--spacing, .25rem) * 4);height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:3px;border-color:rgba(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));animation:spin .8s linear infinite}ax-conversation-message-list .list-loading-more{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 2);text-align:center;color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-message-list .load-more-indicator{display:flex;min-height:calc(var(--spacing, .25rem) * 5);align-items:center;justify-content:center;gap:.3rem}ax-conversation-message-list .load-more-dot{height:.4rem;width:.4rem;border-radius:calc(infinity * 1px);background-color:rgba(var(--ax-sys-color-primary-500));animation:axChatLoadMoreDot 1s ease-in-out infinite}ax-conversation-message-list .load-more-dot:nth-child(2){animation-delay:.14s}ax-conversation-message-list .load-more-dot:nth-child(3){animation-delay:.28s}ax-conversation-message-list .load-more-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);opacity:70%}ax-conversation-message-list .load-more-enter{animation:axChatLoadMoreEnterPrepend .32s cubic-bezier(.22,1,.36,1) both}ax-conversation-message-list .load-more-leave{animation:axChatLoadMoreLeavePrepend .22s ease both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .load-more-dot{animation:none;opacity:.65}ax-conversation-message-list .load-more-enter,ax-conversation-message-list .load-more-leave{animation:none}}ax-conversation-message-list .messages-container{position:relative;min-height:calc(var(--spacing, .25rem) * 0);width:100%;flex:1;overflow-x:hidden;overflow-y:auto}ax-conversation-message-list .date-separator{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:150;display:flex;align-items:center;justify-content:center;padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-message-list .date-text{display:flex;width:calc(var(--spacing, .25rem) * 28);align-items:center;justify-content:center;border-radius:var(--radius-2xl, 1rem);background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 1);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-conversation-message-list .unread-separator{margin-block:calc(var(--spacing, .25rem) * 6);display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 4)}ax-conversation-message-list .unread-separator-line{height:1px;flex:1;background-color:rgba(var(--ax-sys-color-primary-surface));opacity:30%}ax-conversation-message-list .unread-separator-text{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);white-space:nowrap;color:rgba(var(--ax-sys-color-primary-surface));text-transform:uppercase}ax-conversation-message-list .message-item{position:relative;display:flex;align-items:flex-end;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2);--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);transition:background-color .3s ease}ax-conversation-message-list .message-item-context-active{border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-500),.09);box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.22)}ax-conversation-message-list .message-own.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.12)}ax-conversation-message-list .message-highlight{border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-500),.1)}ax-conversation-message-list .message-item.message-own{flex-direction:row-reverse}ax-conversation-message-list .message-avatar{flex-shrink:0}ax-conversation-message-list .message-avatar-icon{display:flex;height:100%;width:100%;align-items:center;justify-content:center;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: 1;line-height:1}ax-conversation-message-list .message-content-row{position:relative;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:0 1 auto;flex-direction:row;align-items:flex-end;gap:calc(var(--spacing, .25rem) * 1);max-width:min(95%,50rem)}@container (min-width: 768px){ax-conversation-message-list .message-content-row{max-width:min(70%,50rem)}}ax-conversation-message-list .message-content-row-own{justify-content:flex-end}ax-conversation-message-list .message-item:not(.message-own) .message-content-row{justify-content:flex-start}ax-conversation-message-list .message-bubble-container{position:relative;display:flex;max-width:100%;min-width:calc(var(--spacing, .25rem) * 0);flex:1 1 auto;flex-direction:column}ax-conversation-message-list .message-own .message-bubble-container{align-items:flex-end}ax-conversation-message-list .message-sender{margin-bottom:.1rem;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}ax-conversation-message-list .message-bubble{position:relative;display:flex;max-width:100%;flex-direction:column;border-radius:var(--radius-2xl, 1rem);background-color:rgba(var(--ax-sys-color-lightest-surface));padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 2);padding-bottom:.1rem;overflow-wrap:break-word;transition:background-color .3s ease}ax-conversation-message-list .reply-preview{margin-bottom:.1rem;cursor:pointer;border-radius:var(--ax-sys-border-radius);border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1.5);background:rgba(var(--ax-sys-color-primary-500),.08);border-inline-start-color: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)}ax-conversation-message-list .reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}ax-conversation-message-list .message-own .reply-preview{border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.55)}ax-conversation-message-list .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)}ax-conversation-message-list .reply-preview-line{width:3px;flex-shrink:0;border-radius:1.5px;background:currentColor;opacity:.5}ax-conversation-message-list .reply-preview-content{min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-message-list .reply-preview-sender{margin-bottom:calc(var(--spacing, .25rem) * .5);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-600))}ax-conversation-message-list .reply-preview-text{overflow:hidden;font-size:.8125rem;text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-message-list .message-own .reply-preview-sender{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:95%}ax-conversation-message-list .message-own .reply-preview-text{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:.78}ax-conversation-message-list .last-message{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-conversation-message-list .forwarded-preview{margin-bottom:.1rem;display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:var(--ax-sys-border-radius);border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1.5);background:rgba(var(--ax-sys-color-primary-500),.08);border-inline-start-color: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)}ax-conversation-message-list .forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}ax-conversation-message-list .message-own .forwarded-preview{border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.55)}ax-conversation-message-list .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)}ax-conversation-message-list .forwarded-preview i{flex-shrink:0;font-size:.8125rem;color:rgba(var(--ax-sys-color-primary-600))}ax-conversation-message-list .forwarded-text{min-width:calc(var(--spacing, .25rem) * 0);overflow:hidden;font-size:.8125rem;text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-message-list .message-own .forwarded-preview i{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:95%}ax-conversation-message-list .message-own .forwarded-text{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:.78}ax-conversation-message-list .message-bubble-received{border-end-start-radius:.125rem}ax-conversation-message-list .message-bubble-received:before{content:\"\";display:block;position:absolute;bottom:calc(var(--spacing, .25rem) * 0);height:.8rem;width:.8rem;background-color:rgba(var(--ax-sys-color-lightest-surface));inset-inline-start:-.7rem;border-start-start-radius:86%;corner-shape:scoop}ax-conversation-message-list .message-bubble-sent{border-end-end-radius:.125rem}ax-conversation-message-list .message-bubble-sent:after{content:\"\";display:block;width:.8rem;height:.8rem;position:absolute;bottom:0;background:rgb(var(--ax-sys-color-primary-surface));inset-inline-end:-.7rem;border-start-end-radius:86%;corner-shape:scoop}ax-conversation-message-list .message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}ax-conversation-message-list .message-bubble.message-system{background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);max-width:100%}ax-conversation-message-list .message-bubble.message-system:before,ax-conversation-message-list .message-bubble.message-system:after{display:none}ax-conversation-message-list .message-item:has(.message-system){justify-content:center;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1)}ax-conversation-message-list .message-item:has(.message-system) .message-content-row{max-width:100%;justify-content:center}ax-conversation-message-list .message-item:has(.message-system) .message-bubble-container{align-items:center}ax-conversation-message-list .message-content{font-size:.9375rem;--tw-leading: var(--leading-normal, 1.5);line-height:var(--leading-normal, 1.5);white-space:pre-wrap}ax-conversation-message-list ax-conversation-registry-component-outlet{display:block;max-width:100%;min-width:calc(var(--spacing, .25rem) * 0)}ax-conversation-message-list .message-footer{margin-top:.1rem;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:calc(var(--spacing, .25rem) * 1);padding-inline-start:calc(var(--spacing, .25rem) * 1);font-size:.6875rem;--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);opacity:70%;-webkit-user-select:none;user-select:none}ax-conversation-message-list .message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-size:.675rem;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-message-list .message-footer-count i{font-size:.625rem;opacity:90%}ax-conversation-message-list .message-footer-count-value{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}ax-conversation-message-list .message-footer-split{margin-inline:.2rem;height:.65rem;width:1px;flex-shrink:0;align-self:center;background-color:rgba(var(--ax-sys-color-border-light-surface));opacity:90%}ax-conversation-message-list .message-time{font-size:.675rem;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-message-list .edited-indicator{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline-start:.35rem;font-size:.675rem;opacity:75%}ax-conversation-message-list .status-icon{display:inline-flex;align-items:center}ax-conversation-message-list .status-icon i{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)))}ax-conversation-message-list .status-read{color:rgba(var(--ax-sys-color-primary-200))}ax-conversation-message-list .status-failed{color:rgba(var(--ax-sys-color-danger-200))}ax-conversation-message-list .message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}ax-conversation-message-list .reaction-bubble{margin:calc(var(--spacing, .25rem) * 0);display:inline-flex;min-height:1.375rem;cursor:pointer;align-items:center;justify-content:center;gap:.15rem;border-radius:var(--radius-xl, .75rem);padding-inline:.35rem;padding-block:.1rem;color:rgba(var(--ax-sys-color-on-surface));--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background:rgba(var(--ax-sys-color-on-surface),.06);border:1px solid rgba(var(--ax-sys-color-on-surface),.1);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}ax-conversation-message-list .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}ax-conversation-message-list .reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}ax-conversation-message-list .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}ax-conversation-message-list .reaction-emoji{display:inline-block;font-size:.8125rem;--tw-leading: 1;line-height:1}ax-conversation-message-list .reaction-count{font-size:.6875rem;--tw-leading: 1;line-height:1;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);opacity:.65}ax-conversation-message-list .reaction-bubble-active .reaction-count{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-600));opacity:95%}ax-conversation-message-list .message-own .reaction-bubble{color:rgba(var(--ax-sys-color-on-primary-surface));background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2)}ax-conversation-message-list .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)}ax-conversation-message-list .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)}ax-conversation-message-list .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)}ax-conversation-message-list .message-own .reaction-count{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:80%}ax-conversation-message-list .message-own .reaction-bubble-active .reaction-count{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:100%}ax-conversation-message-list .message-reactions-container{margin-top:calc(var(--spacing, .25rem) * 1);display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:.2rem}ax-conversation-message-list .message-own .message-reactions-container{justify-content:flex-end}ax-conversation-message-list .message-own .message-footer .edited-indicator{border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}ax-conversation-message-list .message-own .message-footer .message-footer-split{background:rgba(var(--ax-sys-color-on-primary-surface),.35)}ax-conversation-message-list .add-reaction-button.add-reaction-outside{position:absolute;top:50%;margin:calc(var(--spacing, .25rem) * 0);box-sizing:border-box;display:none;height:1.8rem;width:1.8rem;--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-surface));padding:calc(var(--spacing, .25rem) * 0);inset-inline-end:-2.25rem;box-shadow:0 1px 2px #0000000f}ax-conversation-message-list .add-reaction-button{padding-inline-start:.05rem}ax-conversation-message-list .message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-2.25rem;inset-inline-end:auto}ax-conversation-message-list .message-item:hover .add-reaction-button.add-reaction-outside,ax-conversation-message-list .add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}ax-conversation-message-list .add-reaction-button.add-reaction-outside:hover,ax-conversation-message-list .add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-message-list .add-reaction-button.add-reaction-outside i{font-size:.9rem;color:rgba(var(--ax-sys-color-on-surface));opacity:80%}ax-conversation-message-list .reaction-bubble:focus-visible,ax-conversation-message-list .add-reaction-button:focus-visible,ax-conversation-message-list .action-trigger:focus-visible,ax-conversation-message-list ax-fab.scroll-to-bottom ax-button:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-message-list .message-actions{z-index:10;padding-bottom:calc(var(--spacing, .25rem) * 6);opacity:0%;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}ax-conversation-message-list .message-item:hover .message-actions{opacity:100%}ax-conversation-message-list .action-trigger{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;justify-content:center;border-radius:var(--ax-sys-border-radius);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-surface));font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}ax-conversation-message-list .action-trigger:hover{background-color:rgba(var(--ax-sys-color-light-surface))}ax-conversation-message-list .shortcut{font-size:.6875rem;opacity:70%}ax-conversation-message-list .scroll-to-bottom-wrapper{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 4);bottom:calc(var(--spacing, .25rem) * 4);z-index:999}ax-conversation-message-list ax-fab.scroll-to-bottom ax-button{display:flex;height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none}ax-conversation-message-list .scroll-to-bottom-enter{animation:axScrollToBottomEnter var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function) both}ax-conversation-message-list .scroll-to-bottom-leave{animation:axScrollToBottomLeave var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function) both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .scroll-to-bottom-enter,ax-conversation-message-list .scroll-to-bottom-leave{animation:none}}.reaction-picker-popup{width:max-content;min-width:calc(var(--spacing, .25rem) * 0);overflow:hidden;border-radius:.65rem;border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));max-width:min(260px,92vw);box-shadow:0 4px 16px #0000001a}.reaction-picker-header{display:flex;min-height:calc(var(--spacing, .25rem) * 0);align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-block:.45rem;padding-inline-start:.7rem;padding-inline-end:calc(var(--spacing, .25rem) * 2)}.picker-title{font-size:.8125rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);color:rgba(var(--ax-sys-color-on-surface));opacity:85%}.picker-close{display:flex;height:1.6rem;width:1.6rem;cursor:pointer;align-items:center;justify-content:center;border-radius:.25rem;--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);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-color:rgba(var(--ax-sys-color-danger-lightest-surface));color:rgba(var(--ax-sys-color-danger-500))}.picker-close:focus-visible,.reaction-picker-emoji:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-surface))}.reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:.2rem;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:.45rem;padding-bottom:calc(var(--spacing, .25rem) * 2)}.reaction-picker-emoji{height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;border-radius:.45rem;border-style:var(--tw-border-style);border-width:1px;border-color:transparent;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:1.15rem;--tw-leading: 1;line-height:1;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{background-color:rgba(var(--ax-sys-color-lighter-surface))}.reaction-picker-emoji-active{background-color:rgba(var(--ax-sys-color-surface))}.reaction-picker-emoji-active:hover{background:rgba(var(--ax-sys-color-primary-500),.25)}}@property --tw-outline-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@property --tw-translate-x{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: \"*\"; inherits: false; initial-value: 0;}@keyframes spin{to{transform:rotate(360deg)}}@keyframes fadeInUp{0%{transform:translate3d(0,100%,0);opacity:0}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-outline-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial;--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXFabComponent, selector: "ax-fab", inputs: ["label", "popupStyle", "popupPlacement", "size"], outputs: ["popupPlacementChange", "onClick", "onOpened", "onClosed"] }, { kind: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "closeOnRouteChange", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { 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: "component", type: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXConversationInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge", "scrollDisabled", "cooldownMs"], outputs: ["scrollThreshold"] }, { kind: "directive", type: AXUploaderZoneDirective, selector: "[axUploaderZone]", inputs: ["multiple", "accept", "fileType", "overlayTemplate", "disableBrowse", "disableDragDrop"], outputs: ["fileChange", "onChanged", "dragEnter", "dragLeave", "dragOver", "onFileUploadComplete", "onFilesUploadComplete"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "component", type: AXConversationRegistryComponentOutletComponent, selector: "ax-conversation-registry-component-outlet", inputs: ["component", "componentLoader", "inputs"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.AXFormatPipe, name: "format" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
7571
7788
|
}
|
|
7572
7789
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationMessageListComponent, decorators: [{
|
|
7573
7790
|
type: Component,
|
|
@@ -7587,7 +7804,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
7587
7804
|
AXUploaderZoneDirective,
|
|
7588
7805
|
AXConversationAvatarComponent,
|
|
7589
7806
|
AXConversationRegistryComponentOutletComponent,
|
|
7590
|
-
], template: "@if (activeConversation(); as conv) {\n @for (cid of [conv.id]; track cid) {\n <div\n class=\"message-list message-list--conversation-surface\"\n [class.message-list--drag]=\"messageListDragging()\"\n #messageList\n role=\"log\"\n [attr.aria-label]=\"'@acorex:chat.aria.message-list' | translate | async\"\n aria-live=\"polite\"\n [style.background]=\"messageListBackgroundStyle()\"\n axUploaderZone\n [disableBrowse]=\"true\"\n (dragEnter)=\"onMessageListDragEnter()\"\n (dragLeave)=\"onMessageListDragLeave()\"\n (fileChange)=\"onMessageListFilesDropped($event)\"\n >\n @if (loading()) {\n <div\n class=\"list-loading\"\n role=\"status\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-messages' | translate | async\"\n >\n <ax-loading></ax-loading>\n <ax-label>{{ '@acorex:chat.status.loading-messages' | translate | async }}</ax-label>\n </div>\n } @else if (messages().length === 0) {\n <div class=\"list-empty\" role=\"status\" [attr.aria-label]=\"'@acorex:chat.status.no-messages' | translate | async\">\n <ng-content select=\"ax-conversation-message-list-empty, [ax-conversation-message-list-empty]\">\n <ng-container\n *ngComponentOutlet=\"resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }\"\n ></ng-container>\n </ng-content>\n </div>\n } @else {\n <div\n class=\"messages-container\"\n (scroll)=\"onScroll($event)\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold\"\n [edge]=\"'top'\"\n [scrollDisabled]=\"loading() || loadingMore() || !hasMoreMessages()\"\n (scrollThreshold)=\"onScrollThreshold($event)\"\n #messagesContainer\n role=\"feed\"\n [attr.aria-label]=\"'@acorex:chat.aria.messages' | translate | async\"\n >\n @if (loadingMore()) {\n <div\n class=\"list-loading-more list-loading-more--prepend\"\n role=\"status\"\n animate.enter=\"load-more-enter\"\n animate.leave=\"load-more-leave\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-older-messages' | translate | async\"\n >\n <div class=\"load-more-indicator\" aria-hidden=\"true\">\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n </div>\n <ax-label class=\"load-more-label\">{{\n '@acorex:chat.status.loading-older-messages' | translate | async\n }}</ax-label>\n </div>\n }\n @for (group of messageGroups(); track trackMessageGroup($index, group)) {\n <!-- Date Separator -->\n <div class=\"date-separator\" role=\"separator\" [attr.aria-label]=\"getDateSeparatorAriaLabel(group.dateLabel)\">\n <ax-badge [text]=\"group.dateLabel\" class=\"date-text\"></ax-badge>\n </div>\n\n <!-- Messages in this date group -->\n @for (message of group.messages; track trackMessage($index, message)) {\n <div\n [class]=\"getMessageClasses(message)\"\n role=\"article\"\n [attr.aria-label]=\"getMessageAriaLabel(message)\"\n [id]=\"'message-' + message.id\"\n >\n <!-- Avatar (only for group conversations and received messages) -->\n @if (shouldShowAvatar(message)) {\n <div class=\"message-avatar\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"message.senderId\"\n [conversation]=\"activeConversation()\"\n [message]=\"message\"\n [size]=\"32\"\n />\n </div>\n }\n\n <div class=\"message-content-row\" [class.message-content-row-own]=\"isOwnMessage(message)\">\n <button\n type=\"button\"\n class=\"add-reaction-button add-reaction-outside\"\n [class.add-reaction-visible]=\"reactionPickerTarget() === message.id\"\n (click)=\"toggleReactionPicker(message, $event)\"\n [attr.aria-label]=\"'@acorex:chat.actions.add-reaction' | translate | async\"\n #reactionButton\n >\n <i class=\"fa-light fa-face-smile\"></i>\n </button>\n\n <div\n class=\"message-bubble-container\"\n [id]=\"'message-bubble-' + message.id\"\n [attr.data-message-id]=\"message.id\"\n >\n <div\n [class]=\"getBubbleClasses(message)\"\n [class.message-bubble-sent]=\"message.senderId === currentUser()?.id\"\n [class.message-bubble-received]=\"message.senderId !== currentUser()?.id\"\n >\n <!-- Sender name (only for group conversations and received messages) -->\n @if (shouldShowSenderName(message)) {\n <div class=\"message-sender\">{{ getSenderName(message) }}:</div>\n }\n\n <!-- Reply Preview -->\n @if (message.replyTo) {\n <div\n class=\"reply-preview\"\n (click)=\"scrollToMessage(message.replyTo.id)\"\n role=\"button\"\n [attr.aria-label]=\"'Reply to ' + getSenderName(message.replyTo)\"\n (keydown.enter)=\"scrollToMessage(message.replyTo.id)\"\n (keydown.space)=\"scrollToMessage(message.replyTo.id)\"\n >\n <div class=\"reply-preview-content\">\n <div class=\"reply-preview-sender\">{{ getSenderName(message.replyTo) }}</div>\n <div class=\"reply-preview-text\">\n @if (getMessagePreviewText(message.replyTo); as preview) {\n <span class=\"last-message\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i\n >{{ '@acorex:chat.' + preview.type | translate | async }}\n } @else {\n {{ preview.value }}\n }\n </span>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Forwarded Indicator -->\n @if (message.forwarded) {\n <div class=\"forwarded-preview\">\n <i class=\"fa-solid fa-share\"></i>\n <span class=\"forwarded-text\">{{ getForwardedText(message) }}</span>\n </div>\n }\n\n <ax-conversation-registry-component-outlet\n [component]=\"getRendererComponent(message)\"\n [componentLoader]=\"getRendererComponentLoader(message)\"\n [inputs]=\"getRendererInputs(message)\"\n />\n\n @if (message.reactions.length > 0) {\n <div class=\"message-reactions-container\">\n <div class=\"message-reactions-bubbles\">\n @for (reaction of getGroupedReactions(message); track reaction.emoji) {\n <button\n type=\"button\"\n class=\"reaction-bubble\"\n [class.reaction-bubble-active]=\"reaction.hasReacted\"\n (click)=\"onReactionClick(message, reaction.emoji)\"\n [attr.aria-label]=\"reaction.emoji + ' ' + reaction.count\"\n >\n <span class=\"reaction-emoji\">{{ reaction.emoji }}</span>\n @if (reaction.count > 1) {\n <span class=\"reaction-count\">{{ reaction.count }}</span>\n }\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Message Footer -->\n <div class=\"message-footer\">\n @let replyCount = getReplyCount(message);\n @let forwardCount = getForwardCount(message);\n @if (replyCount > 0) {\n <span class=\"message-footer-count\" [attr.aria-label]=\"replyCount + ' replies'\">\n <i class=\"fa-solid fa-message\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ replyCount }}</span>\n </span>\n }\n @if (forwardCount > 0) {\n <span class=\"message-footer-count\" [attr.aria-label]=\"forwardCount + ' forwards'\">\n <i class=\"fa-solid fa-share\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ forwardCount }}</span>\n </span>\n }\n @if (replyCount > 0 || forwardCount > 0) {\n <span class=\"message-footer-split\" aria-hidden=\"true\"></span>\n }\n <span class=\"message-time\">{{ message.timestamp | format: 'timeleft' | async }}</span>\n @if (message.editedAt) {\n <span class=\"edited-indicator\">\n <span>{{ '@acorex:chat.status.edited' | translate | async }}</span>\n </span>\n }\n @if (isOwnMessage(message)) {\n <span [class]=\"getStatusIconClasses(message)\">\n <ax-icon><i [class]=\"getStatusIcon(message)\"></i></ax-icon>\n </span>\n }\n </div>\n </div>\n </div>\n </div>\n\n <!-- Context Menu for Message Actions -->\n <ax-context-menu\n [target]=\"'#message-bubble-' + message.id\"\n [openOn]=\"'click'\"\n [closeOn]=\"'click'\"\n (onOpening)=\"handleMessageContextMenuOpening($event, message)\"\n (onClose)=\"contextMenuMessageId.set(null)\"\n (onItemClick)=\"handleMessageContextMenuItemClick($event, message)\"\n >\n </ax-context-menu>\n </div>\n }\n }\n </div>\n\n <!-- Scroll to Bottom Button -->\n @if (showScrollButton()) {\n <div\n class=\"scroll-to-bottom-wrapper\"\n animate.enter=\"scroll-to-bottom-enter\"\n animate.leave=\"scroll-to-bottom-leave\"\n >\n <ax-fab\n class=\"scroll-to-bottom\"\n (onClick)=\"scrollToBottom()\"\n [attr.aria-label]=\"'@acorex:chat.actions.scroll-to-bottom' | translate | async\"\n >\n <ax-icon><i class=\"fa-light fa-arrow-down\" aria-hidden=\"true\"></i></ax-icon>\n </ax-fab>\n </div>\n }\n }\n </div>\n }\n\n <!-- Reaction Picker Popover -->\n @if (reactionPickerTarget()) {\n <ax-popover\n #reactionPopover\n [target]=\"reactionPickerElement()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"reactionPickerPlacement()\"\n (onClose)=\"closeReactionPicker()\"\n >\n <div class=\"reaction-picker-popup\">\n <div class=\"reaction-picker-header\">\n <span class=\"picker-title\">{{ '@acorex:chat.actions.react' | translate | async }}</span>\n <button\n type=\"button\"\n class=\"picker-close\"\n (click)=\"closeReactionPicker()\"\n [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n <div\n class=\"reaction-picker-emojis\"\n role=\"listbox\"\n [attr.aria-label]=\"'@acorex:chat.actions.choose-reaction' | translate | async\"\n >\n @for (emoji of availableReactions(); track emoji) {\n <button\n type=\"button\"\n class=\"reaction-picker-emoji\"\n [class.reaction-picker-emoji-active]=\"hasUserReactedById(reactionPickerTarget()!, emoji)\"\n (click)=\"onReactionClickById(reactionPickerTarget()!, emoji); closeReactionPicker()\"\n [attr.aria-label]=\"emoji\"\n >\n {{ emoji }}\n </button>\n }\n </div>\n </div>\n </ax-popover>\n }\n} @else {\n <div\n class=\"message-list message-list--no-active\"\n role=\"region\"\n [attr.aria-label]=\"'@acorex:chat.status.no-conversation-selected' | translate | async\"\n >\n <div class=\"list-no-active\">\n <ng-content select=\"ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]\">\n <ng-container *ngComponentOutlet=\"noActiveFallbackComponent\"></ng-container>\n </ng-content>\n </div>\n </div>\n}\n", styles: ["@layer properties;@layer components{ax-conversation-message-list{position:relative;display:block;height:100%;container-type:inline-size;@keyframes axConversationSurfaceIn{0%{opacity:0}to{opacity:1}}@keyframes axConversationSurfaceInReduced{0%{opacity:.92}to{opacity:1}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes axChatLoadMoreDot{0%,70%,to{transform:translateY(0) scale(1);opacity:.4}35%{transform:translateY(-.28rem) scale(1.08);opacity:1}}@keyframes axChatLoadMoreEnterPrepend{0%{opacity:0;transform:translateY(-.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes axChatLoadMoreLeavePrepend{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-.35rem)}}@keyframes axScrollToBottomEnter{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes axScrollToBottomLeave{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}}ax-conversation-message-list .message-list{position:relative;display:flex;height:100%;min-height:calc(var(--spacing, .25rem) * 0);flex-direction:column;overflow:hidden}ax-conversation-message-list .message-list.ax-drop-zone>.ax-uploader-overlay-state{display:none!important}ax-conversation-message-list .message-list--drag{outline-style:var(--tw-outline-style);outline-width:2px;outline-color:rgba(var(--ax-sys-color-primary-surface));--tw-outline-style: dashed;outline-style:dashed;outline-offset:-2px}ax-conversation-message-list .message-list--conversation-surface{animation:axConversationSurfaceIn .36s cubic-bezier(.22,1,.36,1) both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .message-list--conversation-surface{animation:axConversationSurfaceInReduced .18s ease both}}ax-conversation-message-list .list-loading{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;align-items:center;justify-content:center;text-align:center}ax-conversation-message-list .list-empty{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 5);padding-inline:calc(var(--spacing, .25rem) * 8);padding-block:calc(var(--spacing, .25rem) * 12);text-align:center;animation:fadeInUp .5s ease-out}ax-conversation-message-list .message-list--no-active{height:100%}ax-conversation-message-list .list-no-active{display:flex;height:100%;min-height:calc(var(--spacing, .25rem) * 48);flex-direction:column;align-items:center;justify-content:center}ax-conversation-message-list .empty-icon{margin-bottom:calc(var(--spacing, .25rem) * 2);font-size:5.5rem;--tw-leading: 1;line-height:1;opacity:35%;filter:grayscale(.2)}ax-conversation-message-list .empty-title{margin:calc(var(--spacing, .25rem) * 0);font-size:1.625rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-tight, -.025em);letter-spacing:var(--tracking-tight, -.025em);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-message-list .empty-description{margin:calc(var(--spacing, .25rem) * 0);max-width:420px;font-size:1.0625rem;--tw-leading: var(--leading-relaxed, 1.625);line-height:var(--leading-relaxed, 1.625);color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-message-list .spinner{margin-bottom:calc(var(--spacing, .25rem) * 4);height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:3px;border-color:rgba(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));animation:spin .8s linear infinite}ax-conversation-message-list .list-loading-more{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 2);text-align:center;color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-message-list .load-more-indicator{display:flex;min-height:calc(var(--spacing, .25rem) * 5);align-items:center;justify-content:center;gap:.3rem}ax-conversation-message-list .load-more-dot{height:.4rem;width:.4rem;border-radius:calc(infinity * 1px);background-color:rgba(var(--ax-sys-color-primary-500));animation:axChatLoadMoreDot 1s ease-in-out infinite}ax-conversation-message-list .load-more-dot:nth-child(2){animation-delay:.14s}ax-conversation-message-list .load-more-dot:nth-child(3){animation-delay:.28s}ax-conversation-message-list .load-more-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);opacity:70%}ax-conversation-message-list .load-more-enter{animation:axChatLoadMoreEnterPrepend .32s cubic-bezier(.22,1,.36,1) both}ax-conversation-message-list .load-more-leave{animation:axChatLoadMoreLeavePrepend .22s ease both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .load-more-dot{animation:none;opacity:.65}ax-conversation-message-list .load-more-enter,ax-conversation-message-list .load-more-leave{animation:none}}ax-conversation-message-list .messages-container{position:relative;min-height:calc(var(--spacing, .25rem) * 0);width:100%;flex:1;overflow-x:hidden;overflow-y:auto}ax-conversation-message-list .date-separator{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:150;display:flex;align-items:center;justify-content:center;padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-message-list .date-text{display:flex;width:calc(var(--spacing, .25rem) * 28);align-items:center;justify-content:center;border-radius:var(--radius-2xl, 1rem);background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 1);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-conversation-message-list .unread-separator{margin-block:calc(var(--spacing, .25rem) * 6);display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 4)}ax-conversation-message-list .unread-separator-line{height:1px;flex:1;background-color:rgba(var(--ax-sys-color-primary-surface));opacity:30%}ax-conversation-message-list .unread-separator-text{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);white-space:nowrap;color:rgba(var(--ax-sys-color-primary-surface));text-transform:uppercase}ax-conversation-message-list .message-item{position:relative;display:flex;align-items:flex-end;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2);--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);transition:background-color .3s ease}ax-conversation-message-list .message-item-context-active{border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-500),.09);box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.22)}ax-conversation-message-list .message-own.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.12)}ax-conversation-message-list .message-highlight{border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-500),.1)}ax-conversation-message-list .message-item.message-own{flex-direction:row-reverse}ax-conversation-message-list .message-avatar{flex-shrink:0}ax-conversation-message-list .message-avatar-icon{display:flex;height:100%;width:100%;align-items:center;justify-content:center;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: 1;line-height:1}ax-conversation-message-list .message-content-row{position:relative;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:0 1 auto;flex-direction:row;align-items:flex-end;gap:calc(var(--spacing, .25rem) * 1);max-width:min(95%,50rem)}@container (min-width: 768px){ax-conversation-message-list .message-content-row{max-width:min(70%,50rem)}}ax-conversation-message-list .message-content-row-own{justify-content:flex-end}ax-conversation-message-list .message-item:not(.message-own) .message-content-row{justify-content:flex-start}ax-conversation-message-list .message-bubble-container{position:relative;display:flex;max-width:100%;min-width:calc(var(--spacing, .25rem) * 0);flex:1 1 auto;flex-direction:column}ax-conversation-message-list .message-own .message-bubble-container{align-items:flex-end}ax-conversation-message-list .message-sender{margin-bottom:.1rem;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}ax-conversation-message-list .message-bubble{position:relative;display:flex;max-width:100%;flex-direction:column;border-radius:var(--radius-2xl, 1rem);background-color:rgba(var(--ax-sys-color-lightest-surface));padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 2);padding-bottom:.1rem;overflow-wrap:break-word;transition:background-color .3s ease}ax-conversation-message-list .reply-preview{margin-bottom:.1rem;cursor:pointer;border-radius:var(--ax-sys-border-radius);border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1.5);background:rgba(var(--ax-sys-color-primary-500),.08);border-inline-start-color: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)}ax-conversation-message-list .reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}ax-conversation-message-list .message-own .reply-preview{border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.55)}ax-conversation-message-list .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)}ax-conversation-message-list .reply-preview-line{width:3px;flex-shrink:0;border-radius:1.5px;background:currentColor;opacity:.5}ax-conversation-message-list .reply-preview-content{min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-message-list .reply-preview-sender{margin-bottom:calc(var(--spacing, .25rem) * .5);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-600))}ax-conversation-message-list .reply-preview-text{overflow:hidden;font-size:.8125rem;text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-message-list .message-own .reply-preview-sender{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:95%}ax-conversation-message-list .message-own .reply-preview-text{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:.78}ax-conversation-message-list .last-message{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-conversation-message-list .forwarded-preview{margin-bottom:.1rem;display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:var(--ax-sys-border-radius);border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1.5);background:rgba(var(--ax-sys-color-primary-500),.08);border-inline-start-color: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)}ax-conversation-message-list .forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}ax-conversation-message-list .message-own .forwarded-preview{border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.55)}ax-conversation-message-list .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)}ax-conversation-message-list .forwarded-preview i{flex-shrink:0;font-size:.8125rem;color:rgba(var(--ax-sys-color-primary-600))}ax-conversation-message-list .forwarded-text{min-width:calc(var(--spacing, .25rem) * 0);overflow:hidden;font-size:.8125rem;text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-message-list .message-own .forwarded-preview i{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:95%}ax-conversation-message-list .message-own .forwarded-text{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:.78}ax-conversation-message-list .message-bubble-received{border-end-start-radius:.125rem}ax-conversation-message-list .message-bubble-received:before{content:\"\";display:block;position:absolute;bottom:calc(var(--spacing, .25rem) * 0);height:.8rem;width:.8rem;background-color:rgba(var(--ax-sys-color-lightest-surface));inset-inline-start:-.7rem;border-start-start-radius:86%;corner-shape:scoop}ax-conversation-message-list .message-bubble-sent{border-end-end-radius:.125rem}ax-conversation-message-list .message-bubble-sent:after{content:\"\";display:block;width:.8rem;height:.8rem;position:absolute;bottom:0;background:rgb(var(--ax-sys-color-primary-surface));inset-inline-end:-.7rem;border-start-end-radius:86%;corner-shape:scoop}ax-conversation-message-list .message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}ax-conversation-message-list .message-bubble.message-system{background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);max-width:100%}ax-conversation-message-list .message-bubble.message-system:before,ax-conversation-message-list .message-bubble.message-system:after{display:none}ax-conversation-message-list .message-item:has(.message-system){justify-content:center;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1)}ax-conversation-message-list .message-item:has(.message-system) .message-content-row{max-width:100%;justify-content:center}ax-conversation-message-list .message-item:has(.message-system) .message-bubble-container{align-items:center}ax-conversation-message-list .message-content{font-size:.9375rem;--tw-leading: var(--leading-normal, 1.5);line-height:var(--leading-normal, 1.5);white-space:pre-wrap}ax-conversation-message-list ax-conversation-registry-component-outlet{display:block;max-width:100%;min-width:calc(var(--spacing, .25rem) * 0)}ax-conversation-message-list .message-footer{margin-top:.1rem;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:calc(var(--spacing, .25rem) * 1);padding-inline-start:calc(var(--spacing, .25rem) * 1);font-size:.6875rem;--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);opacity:70%;-webkit-user-select:none;user-select:none}ax-conversation-message-list .message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-size:.675rem;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-message-list .message-footer-count i{font-size:.625rem;opacity:90%}ax-conversation-message-list .message-footer-count-value{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}ax-conversation-message-list .message-footer-split{margin-inline:.2rem;height:.65rem;width:1px;flex-shrink:0;align-self:center;background-color:rgba(var(--ax-sys-color-border-light-surface));opacity:90%}ax-conversation-message-list .message-time{font-size:.675rem;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-message-list .edited-indicator{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline-start:.35rem;font-size:.675rem;opacity:75%}ax-conversation-message-list .status-icon{display:inline-flex;align-items:center}ax-conversation-message-list .status-icon i{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)))}ax-conversation-message-list .status-read{color:rgba(var(--ax-sys-color-primary-200))}ax-conversation-message-list .status-failed{color:rgba(var(--ax-sys-color-danger-200))}ax-conversation-message-list .message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}ax-conversation-message-list .reaction-bubble{margin:calc(var(--spacing, .25rem) * 0);display:inline-flex;min-height:1.375rem;cursor:pointer;align-items:center;justify-content:center;gap:.15rem;border-radius:var(--radius-xl, .75rem);padding-inline:.35rem;padding-block:.1rem;color:rgba(var(--ax-sys-color-on-surface));--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background:rgba(var(--ax-sys-color-on-surface),.06);border:1px solid rgba(var(--ax-sys-color-on-surface),.1);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}ax-conversation-message-list .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}ax-conversation-message-list .reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}ax-conversation-message-list .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}ax-conversation-message-list .reaction-emoji{display:inline-block;font-size:.8125rem;--tw-leading: 1;line-height:1}ax-conversation-message-list .reaction-count{font-size:.6875rem;--tw-leading: 1;line-height:1;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);opacity:.65}ax-conversation-message-list .reaction-bubble-active .reaction-count{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-600));opacity:95%}ax-conversation-message-list .message-own .reaction-bubble{color:rgba(var(--ax-sys-color-on-primary-surface));background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2)}ax-conversation-message-list .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)}ax-conversation-message-list .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)}ax-conversation-message-list .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)}ax-conversation-message-list .message-own .reaction-count{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:80%}ax-conversation-message-list .message-own .reaction-bubble-active .reaction-count{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:100%}ax-conversation-message-list .message-reactions-container{margin-top:calc(var(--spacing, .25rem) * 1);display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:.2rem}ax-conversation-message-list .message-own .message-reactions-container{justify-content:flex-end}ax-conversation-message-list .message-own .message-footer .edited-indicator{border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}ax-conversation-message-list .message-own .message-footer .message-footer-split{background:rgba(var(--ax-sys-color-on-primary-surface),.35)}ax-conversation-message-list .add-reaction-button.add-reaction-outside{position:absolute;top:50%;margin:calc(var(--spacing, .25rem) * 0);box-sizing:border-box;display:none;height:1.8rem;width:1.8rem;--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-surface));padding:calc(var(--spacing, .25rem) * 0);inset-inline-end:-2.25rem;box-shadow:0 1px 2px #0000000f}ax-conversation-message-list .add-reaction-button{padding-inline-start:.05rem}ax-conversation-message-list .message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-2.25rem;inset-inline-end:auto}ax-conversation-message-list .message-item:hover .add-reaction-button.add-reaction-outside,ax-conversation-message-list .add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}ax-conversation-message-list .add-reaction-button.add-reaction-outside:hover,ax-conversation-message-list .add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-message-list .add-reaction-button.add-reaction-outside i{font-size:.9rem;color:rgba(var(--ax-sys-color-on-surface));opacity:80%}ax-conversation-message-list .reaction-picker-popup{width:max-content;min-width:calc(var(--spacing, .25rem) * 0);overflow:hidden;border-radius:.65rem;border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));max-width:min(260px,92vw);box-shadow:0 4px 16px #0000001a}ax-conversation-message-list .reaction-picker-header{display:flex;min-height:calc(var(--spacing, .25rem) * 0);align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-block:.45rem;padding-inline-start:.7rem;padding-inline-end:calc(var(--spacing, .25rem) * 2)}ax-conversation-message-list .picker-title{font-size:.8125rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-message-list .picker-close{display:flex;height:1.6rem;width:1.6rem;cursor:pointer;align-items:center;justify-content:center;border-radius:.25rem;--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);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)}ax-conversation-message-list .picker-close:hover{background-color:rgba(var(--ax-sys-color-danger-lightest-surface));color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-message-list .reaction-bubble:focus-visible,ax-conversation-message-list .add-reaction-button:focus-visible,ax-conversation-message-list .picker-close:focus-visible,ax-conversation-message-list .reaction-picker-emoji:focus-visible,ax-conversation-message-list .action-trigger:focus-visible,ax-conversation-message-list ax-fab.scroll-to-bottom ax-button:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-message-list .reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:.2rem;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:.45rem;padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-message-list .reaction-picker-emoji{height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;border-radius:.45rem;border-style:var(--tw-border-style);border-width:1px;border-color:transparent;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:1.15rem;--tw-leading: 1;line-height:1;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}ax-conversation-message-list .reaction-picker-emoji:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-message-list .reaction-picker-emoji-active{background-color:rgba(var(--ax-sys-color-surface))}ax-conversation-message-list .reaction-picker-emoji-active:hover{background:rgba(var(--ax-sys-color-primary-500),.25)}ax-conversation-message-list .message-actions{z-index:10;padding-bottom:calc(var(--spacing, .25rem) * 6);opacity:0%;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}ax-conversation-message-list .message-item:hover .message-actions{opacity:100%}ax-conversation-message-list .action-trigger{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;justify-content:center;border-radius:var(--ax-sys-border-radius);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-surface));font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}ax-conversation-message-list .action-trigger:hover{background-color:rgba(var(--ax-sys-color-light-surface))}ax-conversation-message-list .shortcut{font-size:.6875rem;opacity:70%}ax-conversation-message-list .scroll-to-bottom-wrapper{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 4);bottom:calc(var(--spacing, .25rem) * 4);z-index:999}ax-conversation-message-list ax-fab.scroll-to-bottom ax-button{display:flex;height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none}ax-conversation-message-list .scroll-to-bottom-enter{animation:axScrollToBottomEnter var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function) both}ax-conversation-message-list .scroll-to-bottom-leave{animation:axScrollToBottomLeave var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function) both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .scroll-to-bottom-enter,ax-conversation-message-list .scroll-to-bottom-leave{animation:none}}}@property --tw-outline-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@property --tw-translate-x{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: \"*\"; inherits: false; initial-value: 0;}@keyframes spin{to{transform:rotate(360deg)}}@keyframes fadeInUp{0%{transform:translate3d(0,100%,0);opacity:0}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-outline-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial;--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
7807
|
+
], template: "@if (activeConversation(); as conv) {\n @for (cid of [conv.id]; track cid) {\n <div\n class=\"message-list message-list--conversation-surface\"\n [class.message-list--drag]=\"messageListDragging()\"\n #messageList\n role=\"log\"\n [attr.aria-label]=\"'@acorex:chat.aria.message-list' | translate | async\"\n aria-live=\"polite\"\n [style.background]=\"messageListBackgroundStyle()\"\n axUploaderZone\n [disableBrowse]=\"true\"\n (dragEnter)=\"onMessageListDragEnter()\"\n (dragLeave)=\"onMessageListDragLeave()\"\n (fileChange)=\"onMessageListFilesDropped($event)\"\n >\n @if (loading()) {\n <div\n class=\"list-loading\"\n role=\"status\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-messages' | translate | async\"\n >\n <ax-loading></ax-loading>\n <ax-label>{{ '@acorex:chat.status.loading-messages' | translate | async }}</ax-label>\n </div>\n } @else if (messages().length === 0) {\n <div class=\"list-empty\" role=\"status\" [attr.aria-label]=\"'@acorex:chat.status.no-messages' | translate | async\">\n <ng-content select=\"ax-conversation-message-list-empty, [ax-conversation-message-list-empty]\">\n <ng-container\n *ngComponentOutlet=\"resolvedEmptyStateComponent(); inputs: { conversation: activeConversation()! }\"\n ></ng-container>\n </ng-content>\n </div>\n } @else {\n <div\n class=\"messages-container\"\n (scroll)=\"onScroll($event)\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold\"\n [edge]=\"'top'\"\n [scrollDisabled]=\"loading() || loadingMore() || !hasMoreMessages()\"\n (scrollThreshold)=\"onScrollThreshold($event)\"\n #messagesContainer\n role=\"feed\"\n [attr.aria-label]=\"'@acorex:chat.aria.messages' | translate | async\"\n >\n @if (loadingMore()) {\n <div\n class=\"list-loading-more list-loading-more--prepend\"\n role=\"status\"\n animate.enter=\"load-more-enter\"\n animate.leave=\"load-more-leave\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-older-messages' | translate | async\"\n >\n <div class=\"load-more-indicator\" aria-hidden=\"true\">\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n </div>\n <ax-label class=\"load-more-label\">{{\n '@acorex:chat.status.loading-older-messages' | translate | async\n }}</ax-label>\n </div>\n }\n @for (group of messageGroups(); track trackMessageGroup($index, group)) {\n <!-- Date Separator -->\n <div class=\"date-separator\" role=\"separator\" [attr.aria-label]=\"getDateSeparatorAriaLabel(group.dateLabel)\">\n <ax-badge [text]=\"group.dateLabel\" class=\"date-text\"></ax-badge>\n </div>\n\n <!-- Messages in this date group -->\n @for (message of group.messages; track trackMessage($index, message)) {\n <div\n [class]=\"getMessageClasses(message)\"\n role=\"article\"\n [attr.aria-label]=\"getMessageAriaLabel(message)\"\n [id]=\"'message-' + message.id\"\n >\n <!-- Avatar (only for group conversations and received messages) -->\n @if (shouldShowAvatar(message)) {\n <div class=\"message-avatar\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"message.senderId\"\n [conversation]=\"activeConversation()\"\n [message]=\"message\"\n [size]=\"32\"\n />\n </div>\n }\n\n <div class=\"message-content-row\" [class.message-content-row-own]=\"isOwnMessage(message)\">\n @if (messageSupportsReactions(message)) {\n <button\n type=\"button\"\n class=\"add-reaction-button add-reaction-outside\"\n [class.add-reaction-visible]=\"reactionPickerTarget() === message.id\"\n (click)=\"toggleReactionPicker(message, $event)\"\n [attr.aria-label]=\"'@acorex:chat.actions.add-reaction' | translate | async\"\n #reactionButton\n >\n <i class=\"fa-light fa-face-smile\"></i>\n </button>\n }\n\n <div\n class=\"message-bubble-container\"\n [id]=\"'message-bubble-' + message.id\"\n [attr.data-message-id]=\"message.id\"\n >\n <div\n [class]=\"getBubbleClasses(message)\"\n [class.message-bubble-sent]=\"message.senderId === currentUser()?.id\"\n [class.message-bubble-received]=\"message.senderId !== currentUser()?.id\"\n >\n <!-- Sender name (only for group conversations and received messages) -->\n @if (shouldShowSenderName(message)) {\n <div class=\"message-sender\">{{ getSenderName(message) }}:</div>\n }\n\n <!-- Reply Preview -->\n @if (message.replyTo) {\n <div\n class=\"reply-preview\"\n (click)=\"scrollToMessage(message.replyTo.id)\"\n role=\"button\"\n [attr.aria-label]=\"'Reply to ' + getSenderName(message.replyTo)\"\n (keydown.enter)=\"scrollToMessage(message.replyTo.id)\"\n (keydown.space)=\"scrollToMessage(message.replyTo.id)\"\n >\n <div class=\"reply-preview-content\">\n <div class=\"reply-preview-sender\">{{ getSenderName(message.replyTo) }}</div>\n <div class=\"reply-preview-text\">\n @if (getMessagePreviewText(message.replyTo); as preview) {\n <span class=\"last-message\">\n @if (preview.type !== 'text') {\n <i [class]=\"preview.icon\"></i\n >{{ '@acorex:chat.' + preview.type | translate | async }}\n } @else {\n {{ preview.value }}\n }\n </span>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Forwarded Indicator -->\n @if (message.forwarded) {\n <div class=\"forwarded-preview\">\n <i class=\"fa-solid fa-share\"></i>\n <span class=\"forwarded-text\">{{ getForwardedText(message) }}</span>\n </div>\n }\n\n <ax-conversation-registry-component-outlet\n [component]=\"getRendererComponent(message)\"\n [componentLoader]=\"getRendererComponentLoader(message)\"\n [inputs]=\"getRendererInputs(message)\"\n />\n\n @if (messageSupportsReactions(message) && message.reactions.length > 0) {\n <div class=\"message-reactions-container\">\n <div class=\"message-reactions-bubbles\">\n @for (reaction of getGroupedReactions(message); track reaction.emoji) {\n <button\n type=\"button\"\n class=\"reaction-bubble\"\n [class.reaction-bubble-active]=\"reaction.hasReacted\"\n (click)=\"onReactionClick(message, reaction.emoji)\"\n [attr.aria-label]=\"reaction.emoji + ' ' + reaction.count\"\n >\n <span class=\"reaction-emoji\">{{ reaction.emoji }}</span>\n @if (reaction.count > 1) {\n <span class=\"reaction-count\">{{ reaction.count }}</span>\n }\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Message Footer -->\n <div class=\"message-footer\">\n @let replyCount = getReplyCount(message);\n @let forwardCount = getForwardCount(message);\n @if (replyCount > 0) {\n <span class=\"message-footer-count\" [attr.aria-label]=\"replyCount + ' replies'\">\n <i class=\"fa-solid fa-message\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ replyCount }}</span>\n </span>\n }\n @if (forwardCount > 0) {\n <span class=\"message-footer-count\" [attr.aria-label]=\"forwardCount + ' forwards'\">\n <i class=\"fa-solid fa-share\" aria-hidden=\"true\"></i>\n <span class=\"message-footer-count-value\">{{ forwardCount }}</span>\n </span>\n }\n @if (replyCount > 0 || forwardCount > 0) {\n <span class=\"message-footer-split\" aria-hidden=\"true\"></span>\n }\n <span class=\"message-time\">{{ message.timestamp | format: 'timeleft' | async }}</span>\n @if (message.editedAt) {\n <span class=\"edited-indicator\">\n <span>{{ '@acorex:chat.status.edited' | translate | async }}</span>\n </span>\n }\n @if (isOwnMessage(message)) {\n <span [class]=\"getStatusIconClasses(message)\">\n <ax-icon><i [class]=\"getStatusIcon(message)\"></i></ax-icon>\n </span>\n }\n </div>\n </div>\n </div>\n </div>\n\n <!-- Context Menu for Message Actions -->\n <ax-context-menu\n [target]=\"'#message-bubble-' + message.id\"\n [openOn]=\"'click'\"\n [closeOn]=\"'click'\"\n (onOpening)=\"handleMessageContextMenuOpening($event, message)\"\n (onClose)=\"contextMenuMessageId.set(null)\"\n (onItemClick)=\"handleMessageContextMenuItemClick($event, message)\"\n >\n </ax-context-menu>\n </div>\n }\n }\n </div>\n\n <!-- Scroll to Bottom Button -->\n @if (showScrollButton()) {\n <div\n class=\"scroll-to-bottom-wrapper\"\n animate.enter=\"scroll-to-bottom-enter\"\n animate.leave=\"scroll-to-bottom-leave\"\n >\n <ax-fab\n class=\"scroll-to-bottom\"\n (onClick)=\"scrollToBottom()\"\n [attr.aria-label]=\"'@acorex:chat.actions.scroll-to-bottom' | translate | async\"\n >\n <ax-icon><i class=\"fa-light fa-arrow-down\" aria-hidden=\"true\"></i></ax-icon>\n </ax-fab>\n </div>\n }\n }\n </div>\n }\n\n <!-- Reaction Picker Popover -->\n @if (reactionsEnabled() && reactionPickerTarget()) {\n <ax-popover\n #reactionPopover\n [target]=\"reactionPickerElement()\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"reactionPickerPlacement()\"\n (onClose)=\"closeReactionPicker()\"\n >\n <div class=\"reaction-picker-popup\">\n <div class=\"reaction-picker-header\">\n <span class=\"picker-title\">{{ '@acorex:chat.actions.react' | translate | async }}</span>\n <button\n type=\"button\"\n class=\"picker-close\"\n (click)=\"closeReactionPicker()\"\n [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n <div\n class=\"reaction-picker-emojis\"\n role=\"listbox\"\n [attr.aria-label]=\"'@acorex:chat.actions.choose-reaction' | translate | async\"\n >\n @for (emoji of availableReactions(); track emoji) {\n <button\n type=\"button\"\n class=\"reaction-picker-emoji\"\n [class.reaction-picker-emoji-active]=\"hasUserReactedById(reactionPickerTarget()!, emoji)\"\n (click)=\"onReactionClickById(reactionPickerTarget()!, emoji); closeReactionPicker()\"\n [attr.aria-label]=\"emoji\"\n >\n {{ emoji }}\n </button>\n }\n </div>\n </div>\n </ax-popover>\n }\n} @else {\n <div\n class=\"message-list message-list--no-active\"\n role=\"region\"\n [attr.aria-label]=\"'@acorex:chat.status.no-conversation-selected' | translate | async\"\n >\n <div class=\"list-no-active\">\n <ng-content select=\"ax-conversation-message-list-no-active, [ax-conversation-message-list-no-active]\">\n <ng-container *ngComponentOutlet=\"noActiveFallbackComponent\"></ng-container>\n </ng-content>\n </div>\n </div>\n}\n", styles: ["@layer properties;@layer components{ax-conversation-message-list{position:relative;display:block;height:100%;container-type:inline-size;@keyframes axConversationSurfaceIn{0%{opacity:0}to{opacity:1}}@keyframes axConversationSurfaceInReduced{0%{opacity:.92}to{opacity:1}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes axChatLoadMoreDot{0%,70%,to{transform:translateY(0) scale(1);opacity:.4}35%{transform:translateY(-.28rem) scale(1.08);opacity:1}}@keyframes axChatLoadMoreEnterPrepend{0%{opacity:0;transform:translateY(-.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes axChatLoadMoreLeavePrepend{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-.35rem)}}@keyframes axScrollToBottomEnter{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes axScrollToBottomLeave{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}}ax-conversation-message-list .message-list{position:relative;display:flex;height:100%;min-height:calc(var(--spacing, .25rem) * 0);flex-direction:column;overflow:hidden}ax-conversation-message-list .message-list.ax-drop-zone>.ax-uploader-overlay-state{display:none!important}ax-conversation-message-list .message-list--drag{outline-style:var(--tw-outline-style);outline-width:2px;outline-color:rgba(var(--ax-sys-color-primary-surface));--tw-outline-style: dashed;outline-style:dashed;outline-offset:-2px}ax-conversation-message-list .message-list--conversation-surface{animation:axConversationSurfaceIn .36s cubic-bezier(.22,1,.36,1) both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .message-list--conversation-surface{animation:axConversationSurfaceInReduced .18s ease both}}ax-conversation-message-list .list-loading{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;align-items:center;justify-content:center;text-align:center}ax-conversation-message-list .list-empty{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 5);padding-inline:calc(var(--spacing, .25rem) * 8);padding-block:calc(var(--spacing, .25rem) * 12);text-align:center;animation:fadeInUp .5s ease-out}ax-conversation-message-list .message-list--no-active{height:100%}ax-conversation-message-list .list-no-active{display:flex;height:100%;min-height:calc(var(--spacing, .25rem) * 48);flex-direction:column;align-items:center;justify-content:center}ax-conversation-message-list .empty-icon{margin-bottom:calc(var(--spacing, .25rem) * 2);font-size:5.5rem;--tw-leading: 1;line-height:1;opacity:35%;filter:grayscale(.2)}ax-conversation-message-list .empty-title{margin:calc(var(--spacing, .25rem) * 0);font-size:1.625rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-tight, -.025em);letter-spacing:var(--tracking-tight, -.025em);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-message-list .empty-description{margin:calc(var(--spacing, .25rem) * 0);max-width:420px;font-size:1.0625rem;--tw-leading: var(--leading-relaxed, 1.625);line-height:var(--leading-relaxed, 1.625);color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-message-list .spinner{margin-bottom:calc(var(--spacing, .25rem) * 4);height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:3px;border-color:rgba(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));animation:spin .8s linear infinite}ax-conversation-message-list .list-loading-more{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 2);text-align:center;color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-message-list .load-more-indicator{display:flex;min-height:calc(var(--spacing, .25rem) * 5);align-items:center;justify-content:center;gap:.3rem}ax-conversation-message-list .load-more-dot{height:.4rem;width:.4rem;border-radius:calc(infinity * 1px);background-color:rgba(var(--ax-sys-color-primary-500));animation:axChatLoadMoreDot 1s ease-in-out infinite}ax-conversation-message-list .load-more-dot:nth-child(2){animation-delay:.14s}ax-conversation-message-list .load-more-dot:nth-child(3){animation-delay:.28s}ax-conversation-message-list .load-more-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);opacity:70%}ax-conversation-message-list .load-more-enter{animation:axChatLoadMoreEnterPrepend .32s cubic-bezier(.22,1,.36,1) both}ax-conversation-message-list .load-more-leave{animation:axChatLoadMoreLeavePrepend .22s ease both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .load-more-dot{animation:none;opacity:.65}ax-conversation-message-list .load-more-enter,ax-conversation-message-list .load-more-leave{animation:none}}ax-conversation-message-list .messages-container{position:relative;min-height:calc(var(--spacing, .25rem) * 0);width:100%;flex:1;overflow-x:hidden;overflow-y:auto}ax-conversation-message-list .date-separator{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:150;display:flex;align-items:center;justify-content:center;padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-message-list .date-text{display:flex;width:calc(var(--spacing, .25rem) * 28);align-items:center;justify-content:center;border-radius:var(--radius-2xl, 1rem);background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 1);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}ax-conversation-message-list .unread-separator{margin-block:calc(var(--spacing, .25rem) * 6);display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 4)}ax-conversation-message-list .unread-separator-line{height:1px;flex:1;background-color:rgba(var(--ax-sys-color-primary-surface));opacity:30%}ax-conversation-message-list .unread-separator-text{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);white-space:nowrap;color:rgba(var(--ax-sys-color-primary-surface));text-transform:uppercase}ax-conversation-message-list .message-item{position:relative;display:flex;align-items:flex-end;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2);--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);transition:background-color .3s ease}ax-conversation-message-list .message-item-context-active{border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-500),.09);box-shadow:inset 0 0 0 1px rgba(var(--ax-sys-color-primary-500),.22)}ax-conversation-message-list .message-own.message-item-context-active{background-color:rgba(var(--ax-sys-color-primary-500),.12)}ax-conversation-message-list .message-highlight{border-radius:var(--radius-lg, .5rem);background-color:rgba(var(--ax-sys-color-primary-500),.1)}ax-conversation-message-list .message-item.message-own{flex-direction:row-reverse}ax-conversation-message-list .message-avatar{flex-shrink:0}ax-conversation-message-list .message-avatar-icon{display:flex;height:100%;width:100%;align-items:center;justify-content:center;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: 1;line-height:1}ax-conversation-message-list .message-content-row{position:relative;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:0 1 auto;flex-direction:row;align-items:flex-end;gap:calc(var(--spacing, .25rem) * 1);max-width:min(95%,50rem)}@container (min-width: 768px){ax-conversation-message-list .message-content-row{max-width:min(70%,50rem)}}ax-conversation-message-list .message-content-row-own{justify-content:flex-end}ax-conversation-message-list .message-item:not(.message-own) .message-content-row{justify-content:flex-start}ax-conversation-message-list .message-bubble-container{position:relative;display:flex;max-width:100%;min-width:calc(var(--spacing, .25rem) * 0);flex:1 1 auto;flex-direction:column}ax-conversation-message-list .message-own .message-bubble-container{align-items:flex-end}ax-conversation-message-list .message-sender{margin-bottom:.1rem;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}ax-conversation-message-list .message-bubble{position:relative;display:flex;max-width:100%;flex-direction:column;border-radius:var(--radius-2xl, 1rem);background-color:rgba(var(--ax-sys-color-lightest-surface));padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 2);padding-bottom:.1rem;overflow-wrap:break-word;transition:background-color .3s ease}ax-conversation-message-list .reply-preview{margin-bottom:.1rem;cursor:pointer;border-radius:var(--ax-sys-border-radius);border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1.5);background:rgba(var(--ax-sys-color-primary-500),.08);border-inline-start-color: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)}ax-conversation-message-list .reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}ax-conversation-message-list .message-own .reply-preview{border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.55)}ax-conversation-message-list .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)}ax-conversation-message-list .reply-preview-line{width:3px;flex-shrink:0;border-radius:1.5px;background:currentColor;opacity:.5}ax-conversation-message-list .reply-preview-content{min-width:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-message-list .reply-preview-sender{margin-bottom:calc(var(--spacing, .25rem) * .5);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-600))}ax-conversation-message-list .reply-preview-text{overflow:hidden;font-size:.8125rem;text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-message-list .message-own .reply-preview-sender{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:95%}ax-conversation-message-list .message-own .reply-preview-text{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:.78}ax-conversation-message-list .last-message{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-conversation-message-list .forwarded-preview{margin-bottom:.1rem;display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:var(--ax-sys-border-radius);border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1.5);background:rgba(var(--ax-sys-color-primary-500),.08);border-inline-start-color: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)}ax-conversation-message-list .forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}ax-conversation-message-list .message-own .forwarded-preview{border-inline-start-style:var(--tw-border-style);border-inline-start-width:3px;background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.55)}ax-conversation-message-list .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)}ax-conversation-message-list .forwarded-preview i{flex-shrink:0;font-size:.8125rem;color:rgba(var(--ax-sys-color-primary-600))}ax-conversation-message-list .forwarded-text{min-width:calc(var(--spacing, .25rem) * 0);overflow:hidden;font-size:.8125rem;text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-message-list .message-own .forwarded-preview i{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:95%}ax-conversation-message-list .message-own .forwarded-text{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:.78}ax-conversation-message-list .message-bubble-received{border-end-start-radius:.125rem}ax-conversation-message-list .message-bubble-received:before{content:\"\";display:block;position:absolute;bottom:calc(var(--spacing, .25rem) * 0);height:.8rem;width:.8rem;background-color:rgba(var(--ax-sys-color-lightest-surface));inset-inline-start:-.7rem;border-start-start-radius:86%;corner-shape:scoop}ax-conversation-message-list .message-bubble-sent{border-end-end-radius:.125rem}ax-conversation-message-list .message-bubble-sent:after{content:\"\";display:block;width:.8rem;height:.8rem;position:absolute;bottom:0;background:rgb(var(--ax-sys-color-primary-surface));inset-inline-end:-.7rem;border-start-end-radius:86%;corner-shape:scoop}ax-conversation-message-list .message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}ax-conversation-message-list .message-bubble.message-system{background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);max-width:100%}ax-conversation-message-list .message-bubble.message-system:before,ax-conversation-message-list .message-bubble.message-system:after{display:none}ax-conversation-message-list .message-item:has(.message-system){justify-content:center;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 1)}ax-conversation-message-list .message-item:has(.message-system) .message-content-row{max-width:100%;justify-content:center}ax-conversation-message-list .message-item:has(.message-system) .message-bubble-container{align-items:center}ax-conversation-message-list .message-content{font-size:.9375rem;--tw-leading: var(--leading-normal, 1.5);line-height:var(--leading-normal, 1.5);white-space:pre-wrap}ax-conversation-message-list ax-conversation-registry-component-outlet{display:block;max-width:100%;min-width:calc(var(--spacing, .25rem) * 0)}ax-conversation-message-list .message-footer{margin-top:.1rem;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:calc(var(--spacing, .25rem) * 1);padding-inline-start:calc(var(--spacing, .25rem) * 1);font-size:.6875rem;--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);opacity:70%;-webkit-user-select:none;user-select:none}ax-conversation-message-list .message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-size:.675rem;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-message-list .message-footer-count i{font-size:.625rem;opacity:90%}ax-conversation-message-list .message-footer-count-value{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}ax-conversation-message-list .message-footer-split{margin-inline:.2rem;height:.65rem;width:1px;flex-shrink:0;align-self:center;background-color:rgba(var(--ax-sys-color-border-light-surface));opacity:90%}ax-conversation-message-list .message-time{font-size:.675rem;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-message-list .edited-indicator{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1);border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline-start:.35rem;font-size:.675rem;opacity:75%}ax-conversation-message-list .status-icon{display:inline-flex;align-items:center}ax-conversation-message-list .status-icon i{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)))}ax-conversation-message-list .status-read{color:rgba(var(--ax-sys-color-primary-200))}ax-conversation-message-list .status-failed{color:rgba(var(--ax-sys-color-danger-200))}ax-conversation-message-list .message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}ax-conversation-message-list .reaction-bubble{margin:calc(var(--spacing, .25rem) * 0);display:inline-flex;min-height:1.375rem;cursor:pointer;align-items:center;justify-content:center;gap:.15rem;border-radius:var(--radius-xl, .75rem);padding-inline:.35rem;padding-block:.1rem;color:rgba(var(--ax-sys-color-on-surface));--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background:rgba(var(--ax-sys-color-on-surface),.06);border:1px solid rgba(var(--ax-sys-color-on-surface),.1);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}ax-conversation-message-list .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}ax-conversation-message-list .reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}ax-conversation-message-list .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}ax-conversation-message-list .reaction-emoji{display:inline-block;font-size:.8125rem;--tw-leading: 1;line-height:1}ax-conversation-message-list .reaction-count{font-size:.6875rem;--tw-leading: 1;line-height:1;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);opacity:.65}ax-conversation-message-list .reaction-bubble-active .reaction-count{--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-600));opacity:95%}ax-conversation-message-list .message-own .reaction-bubble{color:rgba(var(--ax-sys-color-on-primary-surface));background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2)}ax-conversation-message-list .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)}ax-conversation-message-list .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)}ax-conversation-message-list .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)}ax-conversation-message-list .message-own .reaction-count{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:80%}ax-conversation-message-list .message-own .reaction-bubble-active .reaction-count{color:rgba(var(--ax-sys-color-on-primary-surface));opacity:100%}ax-conversation-message-list .message-reactions-container{margin-top:calc(var(--spacing, .25rem) * 1);display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:.2rem}ax-conversation-message-list .message-own .message-reactions-container{justify-content:flex-end}ax-conversation-message-list .message-own .message-footer .edited-indicator{border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}ax-conversation-message-list .message-own .message-footer .message-footer-split{background:rgba(var(--ax-sys-color-on-primary-surface),.35)}ax-conversation-message-list .add-reaction-button.add-reaction-outside{position:absolute;top:50%;margin:calc(var(--spacing, .25rem) * 0);box-sizing:border-box;display:none;height:1.8rem;width:1.8rem;--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-surface));padding:calc(var(--spacing, .25rem) * 0);inset-inline-end:-2.25rem;box-shadow:0 1px 2px #0000000f}ax-conversation-message-list .add-reaction-button{padding-inline-start:.05rem}ax-conversation-message-list .message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-2.25rem;inset-inline-end:auto}ax-conversation-message-list .message-item:hover .add-reaction-button.add-reaction-outside,ax-conversation-message-list .add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}ax-conversation-message-list .add-reaction-button.add-reaction-outside:hover,ax-conversation-message-list .add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-message-list .add-reaction-button.add-reaction-outside i{font-size:.9rem;color:rgba(var(--ax-sys-color-on-surface));opacity:80%}ax-conversation-message-list .reaction-bubble:focus-visible,ax-conversation-message-list .add-reaction-button:focus-visible,ax-conversation-message-list .action-trigger:focus-visible,ax-conversation-message-list ax-fab.scroll-to-bottom ax-button:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-surface))}ax-conversation-message-list .message-actions{z-index:10;padding-bottom:calc(var(--spacing, .25rem) * 6);opacity:0%;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}ax-conversation-message-list .message-item:hover .message-actions{opacity:100%}ax-conversation-message-list .action-trigger{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;justify-content:center;border-radius:var(--ax-sys-border-radius);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-surface));font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}ax-conversation-message-list .action-trigger:hover{background-color:rgba(var(--ax-sys-color-light-surface))}ax-conversation-message-list .shortcut{font-size:.6875rem;opacity:70%}ax-conversation-message-list .scroll-to-bottom-wrapper{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 4);bottom:calc(var(--spacing, .25rem) * 4);z-index:999}ax-conversation-message-list ax-fab.scroll-to-bottom ax-button{display:flex;height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none}ax-conversation-message-list .scroll-to-bottom-enter{animation:axScrollToBottomEnter var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function) both}ax-conversation-message-list .scroll-to-bottom-leave{animation:axScrollToBottomLeave var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function) both}@media(prefers-reduced-motion:reduce){ax-conversation-message-list .scroll-to-bottom-enter,ax-conversation-message-list .scroll-to-bottom-leave{animation:none}}.reaction-picker-popup{width:max-content;min-width:calc(var(--spacing, .25rem) * 0);overflow:hidden;border-radius:.65rem;border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));max-width:min(260px,92vw);box-shadow:0 4px 16px #0000001a}.reaction-picker-header{display:flex;min-height:calc(var(--spacing, .25rem) * 0);align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-block:.45rem;padding-inline-start:.7rem;padding-inline-end:calc(var(--spacing, .25rem) * 2)}.picker-title{font-size:.8125rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);color:rgba(var(--ax-sys-color-on-surface));opacity:85%}.picker-close{display:flex;height:1.6rem;width:1.6rem;cursor:pointer;align-items:center;justify-content:center;border-radius:.25rem;--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);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-color:rgba(var(--ax-sys-color-danger-lightest-surface));color:rgba(var(--ax-sys-color-danger-500))}.picker-close:focus-visible,.reaction-picker-emoji:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px;outline-offset:2px;outline-color:rgba(var(--ax-sys-color-primary-surface))}.reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:.2rem;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:.45rem;padding-bottom:calc(var(--spacing, .25rem) * 2)}.reaction-picker-emoji{height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;border-radius:.45rem;border-style:var(--tw-border-style);border-width:1px;border-color:transparent;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:1.15rem;--tw-leading: 1;line-height:1;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{background-color:rgba(var(--ax-sys-color-lighter-surface))}.reaction-picker-emoji-active{background-color:rgba(var(--ax-sys-color-surface))}.reaction-picker-emoji-active:hover{background:rgba(var(--ax-sys-color-primary-500),.25)}}@property --tw-outline-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@property --tw-translate-x{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: \"*\"; inherits: false; initial-value: 0;}@keyframes spin{to{transform:rotate(360deg)}}@keyframes fadeInUp{0%{transform:translate3d(0,100%,0);opacity:0}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-outline-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial;--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
7591
7808
|
}], ctorParameters: () => [], propDecorators: { reactionPopover: [{ type: i0.ViewChild, args: ['reactionPopover', { isSignal: true }] }], messageListRef: [{ type: i0.ViewChild, args: ['messageList', { isSignal: true }] }], messagesContainerRef: [{ type: i0.ViewChild, args: ['messagesContainer', { isSignal: true }] }], messageAction: [{ type: i0.Output, args: ["messageAction"] }] } });
|
|
7592
7809
|
|
|
7593
7810
|
/**
|
|
@@ -7734,7 +7951,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
7734
7951
|
class AXConversationSidebarService {
|
|
7735
7952
|
constructor() {
|
|
7736
7953
|
this.conversationService = inject(AXConversationService);
|
|
7737
|
-
this.config = inject(AX_CONVERSATION_CONFIG);
|
|
7738
7954
|
// Local UI state
|
|
7739
7955
|
this.searchQuery = signal('', /* @ts-ignore */
|
|
7740
7956
|
...(ngDevMode ? [{ debugName: "searchQuery" }] : /* istanbul ignore next */ []));
|
|
@@ -7749,55 +7965,12 @@ class AXConversationSidebarService {
|
|
|
7749
7965
|
...(ngDevMode ? [{ debugName: "hasMoreConversations" }] : /* istanbul ignore next */ []));
|
|
7750
7966
|
// Tabs
|
|
7751
7967
|
this.enabledTabs = this.registry.conversationTabs.enabledTabs;
|
|
7752
|
-
//
|
|
7753
|
-
this.filterCache = new Map();
|
|
7754
|
-
// Filtered conversations with memoization
|
|
7968
|
+
// Filtered conversations (recomputed on every inbox change — no memo cache)
|
|
7755
7969
|
this.filteredConversations = computed(() => {
|
|
7756
7970
|
const conversations = this.conversations();
|
|
7757
7971
|
const query = this.searchQuery();
|
|
7758
7972
|
const tabId = this.activeTabId();
|
|
7759
|
-
|
|
7760
|
-
const pinnedIds = conversations
|
|
7761
|
-
.filter((c) => c.pinned)
|
|
7762
|
-
.map((c) => c.id)
|
|
7763
|
-
.join(',');
|
|
7764
|
-
// Include last message timestamps in cache key to detect order changes
|
|
7765
|
-
const timestampsHash = conversations
|
|
7766
|
-
.map((c) => {
|
|
7767
|
-
const time = c.lastMessageAt instanceof Date
|
|
7768
|
-
? c.lastMessageAt.getTime()
|
|
7769
|
-
: c.lastMessage?.timestamp instanceof Date
|
|
7770
|
-
? c.lastMessage.timestamp.getTime()
|
|
7771
|
-
: 0;
|
|
7772
|
-
return `${c.id}:${time}`;
|
|
7773
|
-
})
|
|
7774
|
-
.join('|');
|
|
7775
|
-
// Unread counts and archive state affect tab badges and list membership
|
|
7776
|
-
const unreadHash = conversations.map((c) => `${c.id}:${c.unreadCount ?? 0}`).join('|');
|
|
7777
|
-
const archivedHash = conversations.map((c) => `${c.id}:${c.archived ? 1 : 0}`).join('|');
|
|
7778
|
-
const cacheKey = `${conversations.length}-${query}-${tabId}-${pinnedIds}-${timestampsHash}-${unreadHash}-${archivedHash}`;
|
|
7779
|
-
// Return cached result if available
|
|
7780
|
-
if (this.filterCache.has(cacheKey)) {
|
|
7781
|
-
const cached = this.filterCache.get(cacheKey);
|
|
7782
|
-
if (cached) {
|
|
7783
|
-
return cached;
|
|
7784
|
-
}
|
|
7785
|
-
}
|
|
7786
|
-
// Perform filtering and sorting
|
|
7787
|
-
const result = this.filterAndSort(conversations, query, tabId);
|
|
7788
|
-
// Cache the result
|
|
7789
|
-
this.filterCache.set(cacheKey, result);
|
|
7790
|
-
// Cleanup old cache entries if cache is too large (proper LRU cleanup)
|
|
7791
|
-
const maxCacheSize = this.config.filterCacheSize;
|
|
7792
|
-
if (this.filterCache.size > maxCacheSize) {
|
|
7793
|
-
// Delete oldest entries to maintain cache size
|
|
7794
|
-
const entriesToDelete = this.filterCache.size - maxCacheSize;
|
|
7795
|
-
const keys = Array.from(this.filterCache.keys());
|
|
7796
|
-
for (let i = 0; i < entriesToDelete; i++) {
|
|
7797
|
-
this.filterCache.delete(keys[i]);
|
|
7798
|
-
}
|
|
7799
|
-
}
|
|
7800
|
-
return result;
|
|
7973
|
+
return this.filterAndSort(conversations, query, tabId);
|
|
7801
7974
|
}, /* @ts-ignore */
|
|
7802
7975
|
...(ngDevMode ? [{ debugName: "filteredConversations" }] : /* istanbul ignore next */ []));
|
|
7803
7976
|
void this.conversationService.ensureInitialized();
|
|
@@ -7910,6 +8083,8 @@ class AXConversationSidebarComponent {
|
|
|
7910
8083
|
this.conversationService = inject(AXConversationService);
|
|
7911
8084
|
this.popupService = inject(AXPopupService);
|
|
7912
8085
|
this.translation = inject(AXTranslationService);
|
|
8086
|
+
this.ngZone = inject(NgZone);
|
|
8087
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
7913
8088
|
/** Conversation selected event */
|
|
7914
8089
|
this.conversationSelected = output();
|
|
7915
8090
|
/** Search debouncing */
|
|
@@ -7963,7 +8138,13 @@ class AXConversationSidebarComponent {
|
|
|
7963
8138
|
},
|
|
7964
8139
|
});
|
|
7965
8140
|
if (result?.data) {
|
|
7966
|
-
|
|
8141
|
+
const conversation = result.data;
|
|
8142
|
+
// Popup closes outside the normal component tree — run inside the zone so signal
|
|
8143
|
+
// updates propagate to the sidebar list immediately.
|
|
8144
|
+
this.ngZone.run(() => {
|
|
8145
|
+
this.selectConversation(conversation);
|
|
8146
|
+
this.cdr.markForCheck();
|
|
8147
|
+
});
|
|
7967
8148
|
}
|
|
7968
8149
|
}
|
|
7969
8150
|
/** Handle infinite scroll threshold - delegate to service */
|
|
@@ -7975,7 +8156,7 @@ class AXConversationSidebarComponent {
|
|
|
7975
8156
|
this.searchSubject.complete();
|
|
7976
8157
|
}
|
|
7977
8158
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationSidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7978
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationSidebarComponent, isStandalone: true, selector: "ax-conversation-sidebar", outputs: { conversationSelected: "conversationSelected" }, ngImport: i0, template: " <div class=\"sidebar\">\n <!-- Header with Menu and Search -->\n <div class=\"sidebar-header\">\n <!-- <ax-button [look]=\"'outline'\" [size]=\"'md'\" class=\"menu-button\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button> -->\n <div class=\"sidebar-search\">\n <ax-search-box\n [value]=\"sidebar.searchQuery()\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.placeholders.search-conversations' | translate | async\"\n ></ax-search-box>\n </div>\n </div>\n\n <!-- Tabs -->\n <ax-tabs (onActiveTabChanged)=\"onTabChange($event)\" [look]=\"'with-line'\" [style.overflow]=\"'hidden'\">\n @for (tab of enabledTabs(); track tab.id) {\n <ax-tab-item [text]=\"getTabLabel(tab.id)\" [key]=\"tab.id\">\n @if (tab.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"'tab-icon ' + tab.icon\" aria-hidden=\"true\"></i>\n </ax-icon>\n </ax-prefix>\n }\n @if (tab.badge && getBadgeValue(tab.id); as badgeText) {\n <ax-suffix>\n <ax-badge [text]=\"badgeText\" [color]=\"'primary'\" />\n </ax-suffix>\n }\n </ax-tab-item>\n }\n </ax-tabs>\n\n <!-- Conversation List -->\n <div\n class=\"sidebar-list\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold ?? 200\"\n [edge]=\"'bottom'\"\n [scrollDisabled]=\"loading() || loadingMore() || !hasMoreConversations()\"\n (scrollThreshold)=\"onScrollThreshold($event)\"\n >\n @if (loading()) {\n <!-- Skeleton Loading State -->\n @for (i of [1, 2, 3, 4]; track i) {\n <div class=\"conversation-skeleton\">\n <ax-skeleton class=\"skeleton-avatar\"></ax-skeleton>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-header\">\n <ax-skeleton class=\"skeleton-title\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-time\"></ax-skeleton>\n </div>\n <ax-skeleton class=\"skeleton-message\"></ax-skeleton>\n </div>\n </div>\n }\n } @else if (filteredConversations().length === 0) {\n <div class=\"list-empty\">\n <div class=\"empty-icon\"><i class=\"fa-light fa-comments\"></i></div>\n <h3 class=\"empty-title\">{{ '@acorex:chat.sidebar.empty-title' | translate | async }}</h3>\n <p class=\"empty-description\">\n @if (sidebar.searchQuery()) {\n {{ '@acorex:chat.sidebar.empty-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.sidebar.empty-default' | translate | async }}\n }\n </p>\n </div>\n } @else {\n @for (conversation of filteredConversations(); track conversation.id) {\n <ax-conversation-item [conversation]=\"conversation\" (clicked)=\"selectConversation($event)\" />\n }\n @if (loadingMore()) {\n <div\n class=\"list-loading-more list-loading-more--append\"\n role=\"status\"\n animate.enter=\"load-more-enter\"\n animate.leave=\"load-more-leave\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-more' | translate | async\"\n >\n <div class=\"load-more-indicator\" aria-hidden=\"true\">\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n </div>\n <ax-label class=\"load-more-label\">{{ '@acorex:chat.status.loading-more' | translate | async }}</ax-label>\n </div>\n }\n }\n </div>\n\n <div class=\"new-conversation-button-container\">\n <ng-content select=\"ax-suffix\">\n <div class=\"new-conversation-button-container-inner\">\n <ax-button\n class=\"new-conversation-btn\"\n [text]=\"'@acorex:chat.actions.new-conversation' | translate | async\"\n [look]=\"'solid'\"\n (onClick)=\"openNewConversationPopup()\"\n ></ax-button>\n </div>\n </ng-content>\n </div>\n </div>\n", styles: ["@layer properties;@layer components{ax-conversation-sidebar{display:block;height:100%;width:100%;@keyframes axChatLoadMoreDot{0%,70%,to{transform:translateY(0) scale(1);opacity:.4}35%{transform:translateY(-.28rem) scale(1.08);opacity:1}}@keyframes axChatLoadMoreEnterAppend{0%{opacity:0;transform:translateY(.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes axChatLoadMoreLeaveAppend{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(.35rem)}}}ax-conversation-sidebar .sidebar{position:relative;display:flex;height:100%;flex-direction:column}ax-conversation-sidebar .sidebar-header{display:flex;min-height:calc(var(--spacing, .25rem) * 16);align-items:center;gap:calc(var(--spacing, .25rem) * 1);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding:calc(var(--spacing, .25rem) * 3)}ax-conversation-sidebar .menu-button{flex-shrink:0}ax-conversation-sidebar .sidebar-search{flex:1}ax-conversation-sidebar .sidebar-list{position:relative;flex:1;overflow-y:auto;padding-bottom:calc(var(--spacing, .25rem) * 16)}ax-conversation-sidebar .new-conversation-button-container{position:absolute;inset-inline-start:calc(var(--spacing, .25rem) * 0);inset-inline-end:calc(var(--spacing, .25rem) * 1);bottom:calc(var(--spacing, .25rem) * 0);padding:calc(var(--spacing, .25rem) * 4);padding-inline:calc(var(--spacing, .25rem) * 2)}ax-conversation-sidebar .new-conversation-button-container-inner{display:flex;align-items:center;justify-content:center}ax-conversation-sidebar .list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:calc(var(--spacing, .25rem) * 8);text-align:center;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-sidebar .list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 4);padding-inline:calc(var(--spacing, .25rem) * 8);padding-block:calc(var(--spacing, .25rem) * 12);text-align:center;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-sidebar .empty-icon{margin-bottom:calc(var(--spacing, .25rem) * 2);font-size:4rem;--tw-leading: 1;line-height:1;opacity:50%}ax-conversation-sidebar .empty-title{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-sidebar .empty-description{margin:calc(var(--spacing, .25rem) * 0);max-width:300px;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: var(--leading-normal, 1.5);line-height:var(--leading-normal, 1.5);color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-sidebar .empty-action{margin-top:calc(var(--spacing, .25rem) * 2)}ax-conversation-sidebar .list-loading-more{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-top:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4);text-align:center;color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-sidebar .load-more-indicator{display:flex;min-height:calc(var(--spacing, .25rem) * 5);align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-sidebar .load-more-dot{height:.4rem;width:.4rem;border-radius:calc(infinity * 1px);background-color:rgba(var(--ax-sys-color-primary-500));animation:axChatLoadMoreDot 1s ease-in-out infinite}ax-conversation-sidebar .load-more-dot:nth-child(2){animation-delay:.14s}ax-conversation-sidebar .load-more-dot:nth-child(3){animation-delay:.28s}ax-conversation-sidebar .load-more-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);opacity:70%}ax-conversation-sidebar .load-more-enter{animation:axChatLoadMoreEnterAppend .32s cubic-bezier(.22,1,.36,1) both}ax-conversation-sidebar .load-more-leave{animation:axChatLoadMoreLeaveAppend .22s ease both}@media(prefers-reduced-motion:reduce){ax-conversation-sidebar .load-more-dot{animation:none;opacity:.65}ax-conversation-sidebar .load-more-enter,ax-conversation-sidebar .load-more-leave{animation:none}}ax-conversation-sidebar .tab-icon{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ))}ax-conversation-sidebar .conversation-skeleton{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3)}ax-conversation-sidebar .skeleton-avatar{height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);flex-shrink:0;border-radius:calc(infinity * 1px)}ax-conversation-sidebar .skeleton-content{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-sidebar .skeleton-header{display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-sidebar .skeleton-title{height:calc(var(--spacing, .25rem) * 4);flex:1;border-radius:.25rem}ax-conversation-sidebar .skeleton-time{height:calc(var(--spacing, .25rem) * 3);width:calc(var(--spacing, .25rem) * 12);border-radius:.25rem;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-sidebar .skeleton-message{height:calc(var(--spacing, .25rem) * 3);width:80%;border-radius:.25rem}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1$1.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: AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXConversationItemComponent, selector: "ax-conversation-item", inputs: ["conversation"], outputs: ["clicked"] }, { kind: "directive", type: AXConversationInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge", "scrollDisabled", "cooldownMs"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
8159
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationSidebarComponent, isStandalone: true, selector: "ax-conversation-sidebar", outputs: { conversationSelected: "conversationSelected" }, ngImport: i0, template: " <div class=\"sidebar\">\n <!-- Header with Menu and Search -->\n <div class=\"sidebar-header\">\n <!-- <ax-button [look]=\"'outline'\" [size]=\"'md'\" class=\"menu-button\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button> -->\n <div class=\"sidebar-search\">\n <ax-search-box\n [value]=\"sidebar.searchQuery()\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.placeholders.search-conversations' | translate | async\"\n ></ax-search-box>\n </div>\n </div>\n\n <!-- Tabs -->\n <ax-tabs (onActiveTabChanged)=\"onTabChange($event)\" [look]=\"'with-line'\" [style.overflow]=\"'hidden'\">\n @for (tab of enabledTabs(); track tab.id) {\n <ax-tab-item [text]=\"getTabLabel(tab.id)\" [key]=\"tab.id\">\n @if (tab.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"'tab-icon ' + tab.icon\" aria-hidden=\"true\"></i>\n </ax-icon>\n </ax-prefix>\n }\n @if (tab.badge && getBadgeValue(tab.id); as badgeText) {\n <ax-suffix>\n <ax-badge [text]=\"badgeText\" [color]=\"'primary'\" />\n </ax-suffix>\n }\n </ax-tab-item>\n }\n </ax-tabs>\n\n <!-- Conversation List -->\n <div\n class=\"sidebar-list\"\n axInfiniteScroll\n [threshold]=\"config.infiniteScrollThreshold ?? 200\"\n [edge]=\"'bottom'\"\n [scrollDisabled]=\"loading() || loadingMore() || !hasMoreConversations()\"\n (scrollThreshold)=\"onScrollThreshold($event)\"\n >\n @if (loading()) {\n <!-- Skeleton Loading State -->\n @for (i of [1, 2, 3, 4]; track i) {\n <div class=\"conversation-skeleton\">\n <ax-skeleton class=\"skeleton-avatar\"></ax-skeleton>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-header\">\n <ax-skeleton class=\"skeleton-title\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-time\"></ax-skeleton>\n </div>\n <ax-skeleton class=\"skeleton-message\"></ax-skeleton>\n </div>\n </div>\n }\n } @else if (filteredConversations().length === 0) {\n <div class=\"list-empty\">\n <div class=\"empty-icon\"><i class=\"fa-light fa-comments\"></i></div>\n <h3 class=\"empty-title\">{{ '@acorex:chat.sidebar.empty-title' | translate | async }}</h3>\n <p class=\"empty-description\">\n @if (sidebar.searchQuery()) {\n {{ '@acorex:chat.sidebar.empty-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.sidebar.empty-default' | translate | async }}\n }\n </p>\n </div>\n } @else {\n @for (conversation of filteredConversations(); track conversation.id) {\n <ax-conversation-item [conversation]=\"conversation\" (clicked)=\"selectConversation($event)\" />\n }\n @if (loadingMore()) {\n <div\n class=\"list-loading-more list-loading-more--append\"\n role=\"status\"\n animate.enter=\"load-more-enter\"\n animate.leave=\"load-more-leave\"\n [attr.aria-label]=\"'@acorex:chat.status.loading-more' | translate | async\"\n >\n <div class=\"load-more-indicator\" aria-hidden=\"true\">\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n <span class=\"load-more-dot\"></span>\n </div>\n <ax-label class=\"load-more-label\">{{ '@acorex:chat.status.loading-more' | translate | async }}</ax-label>\n </div>\n }\n }\n </div>\n\n <div class=\"new-conversation-button-container\">\n <ng-content select=\"ax-suffix\">\n <div class=\"new-conversation-button-container-inner\">\n <ax-button\n class=\"new-conversation-btn\"\n [text]=\"'@acorex:chat.actions.new-conversation' | translate | async\"\n [look]=\"'solid'\"\n (onClick)=\"openNewConversationPopup()\"\n ></ax-button>\n </div>\n </ng-content>\n </div>\n </div>\n", styles: ["@layer properties;@layer components{ax-conversation-sidebar{display:block;height:100%;width:100%;@keyframes axChatLoadMoreDot{0%,70%,to{transform:translateY(0) scale(1);opacity:.4}35%{transform:translateY(-.28rem) scale(1.08);opacity:1}}@keyframes axChatLoadMoreEnterAppend{0%{opacity:0;transform:translateY(.5rem)}to{opacity:1;transform:translateY(0)}}@keyframes axChatLoadMoreLeaveAppend{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(.35rem)}}}ax-conversation-sidebar .sidebar{position:relative;display:flex;height:100%;flex-direction:column}ax-conversation-sidebar .sidebar-header{display:flex;min-height:calc(var(--spacing, .25rem) * 16);align-items:center;gap:calc(var(--spacing, .25rem) * 1);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding:calc(var(--spacing, .25rem) * 3)}ax-conversation-sidebar .menu-button{flex-shrink:0}ax-conversation-sidebar .sidebar-search{flex:1}ax-conversation-sidebar .sidebar-list{position:relative;flex:1;overflow-y:auto;padding-bottom:calc(var(--spacing, .25rem) * 16)}ax-conversation-sidebar .new-conversation-button-container{position:absolute;inset-inline-start:calc(var(--spacing, .25rem) * 0);inset-inline-end:calc(var(--spacing, .25rem) * 1);bottom:calc(var(--spacing, .25rem) * 0);padding:calc(var(--spacing, .25rem) * 4);padding-inline:calc(var(--spacing, .25rem) * 2)}ax-conversation-sidebar .new-conversation-button-container-inner{display:flex;align-items:center;justify-content:center}ax-conversation-sidebar .list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:calc(var(--spacing, .25rem) * 8);text-align:center;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-sidebar .list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 4);padding-inline:calc(var(--spacing, .25rem) * 8);padding-block:calc(var(--spacing, .25rem) * 12);text-align:center;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-sidebar .empty-icon{margin-bottom:calc(var(--spacing, .25rem) * 2);font-size:4rem;--tw-leading: 1;line-height:1;opacity:50%}ax-conversation-sidebar .empty-title{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-sidebar .empty-description{margin:calc(var(--spacing, .25rem) * 0);max-width:300px;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: var(--leading-normal, 1.5);line-height:var(--leading-normal, 1.5);color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-sidebar .empty-action{margin-top:calc(var(--spacing, .25rem) * 2)}ax-conversation-sidebar .list-loading-more{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-top:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4);text-align:center;color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-sidebar .load-more-indicator{display:flex;min-height:calc(var(--spacing, .25rem) * 5);align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-sidebar .load-more-dot{height:.4rem;width:.4rem;border-radius:calc(infinity * 1px);background-color:rgba(var(--ax-sys-color-primary-500));animation:axChatLoadMoreDot 1s ease-in-out infinite}ax-conversation-sidebar .load-more-dot:nth-child(2){animation-delay:.14s}ax-conversation-sidebar .load-more-dot:nth-child(3){animation-delay:.28s}ax-conversation-sidebar .load-more-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-tracking: var(--tracking-wide, .025em);letter-spacing:var(--tracking-wide, .025em);opacity:70%}ax-conversation-sidebar .load-more-enter{animation:axChatLoadMoreEnterAppend .32s cubic-bezier(.22,1,.36,1) both}ax-conversation-sidebar .load-more-leave{animation:axChatLoadMoreLeaveAppend .22s ease both}@media(prefers-reduced-motion:reduce){ax-conversation-sidebar .load-more-dot{animation:none;opacity:.65}ax-conversation-sidebar .load-more-enter,ax-conversation-sidebar .load-more-leave{animation:none}}ax-conversation-sidebar .tab-icon{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ))}ax-conversation-sidebar .conversation-skeleton{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3)}ax-conversation-sidebar .skeleton-avatar{height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);flex-shrink:0;border-radius:calc(infinity * 1px)}ax-conversation-sidebar .skeleton-content{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-sidebar .skeleton-header{display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-sidebar .skeleton-title{height:calc(var(--spacing, .25rem) * 4);flex:1;border-radius:.25rem}ax-conversation-sidebar .skeleton-time{height:calc(var(--spacing, .25rem) * 3);width:calc(var(--spacing, .25rem) * 12);border-radius:.25rem;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-sidebar .skeleton-message{height:calc(var(--spacing, .25rem) * 3);width:80%;border-radius:.25rem}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1.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: AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXConversationItemComponent, selector: "ax-conversation-item", inputs: ["conversation"], outputs: ["clicked"] }, { kind: "directive", type: AXConversationInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge", "scrollDisabled", "cooldownMs"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
7979
8160
|
}
|
|
7980
8161
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationSidebarComponent, decorators: [{
|
|
7981
8162
|
type: Component,
|
|
@@ -8039,7 +8220,7 @@ class AXConversationAvatarPickerComponent {
|
|
|
8039
8220
|
this.avatarUrl.set('');
|
|
8040
8221
|
}
|
|
8041
8222
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationAvatarPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8042
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationAvatarPickerComponent, isStandalone: true, selector: "ax-conversation-avatar-picker", inputs: { showClearButton: { classPropertyName: "showClearButton", publicName: "showClearButton", isSignal: true, isRequired: false, transformFunction: null }, avatarUrl: { classPropertyName: "avatarUrl", publicName: "avatarUrl", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { avatarUrl: "avatarUrlChange", onFileSelected: "onFileSelected" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: " <div class=\"avatar-picker\">\n <!-- Preview -->\n <div class=\"avatar-preview\" (click)=\"triggerFileInput()\">\n @if (avatarUrl()) {\n <ax-image [src]=\"avatarUrl()\" [alt]=\"'@acorex:chat.avatar.preview' | translate | async\"></ax-image>\n <div class=\"preview-overlay\">\n <i class=\"fa-light fa-camera\"></i>\n </div>\n } @else {\n <div class=\"avatar-placeholder\">\n <i class=\"fa-light fa-camera\"></i>\n <span class=\"placeholder-text\">{{ '@acorex:chat.actions.choose-image' | translate | async }}</span>\n </div>\n }\n </div>\n\n <!-- Action Buttons -->\n <div class=\"avatar-actions\">\n <ax-button\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [text]=\"\n avatarUrl()\n ? ('@acorex:chat.actions.change-image' | translate | async)\n : ('@acorex:chat.actions.upload-image' | translate | async)\n \"\n (onClick)=\"triggerFileInput()\"\n >\n <ax-prefix>\n <ax-icon><i [class]=\"avatarUrl() ? 'fa-light fa-image' : 'fa-light fa-upload'\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n @if (showClearButton() && avatarUrl()) {\n <ax-button\n [look]=\"'outline'\"\n [color]=\"'danger'\"\n [text]=\"'@acorex:chat.actions.remove-image' | translate | async\"\n (onClick)=\"clearAvatar()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-trash-can\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n </div>\n\n <!-- Hidden File Input -->\n <input\n #fileInput\n type=\"file\"\n accept=\"image/*\"\n class=\"avatar-picker__file-input\"\n (change)=\"onFileInputChange($event)\"\n />\n </div>\n", styles: ["@layer properties;@layer components{ax-conversation-avatar-picker{display:block}ax-conversation-avatar-picker .avatar-picker{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 6);border-radius:var(--radius-xl, .75rem);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding:calc(var(--spacing, .25rem) * 4)}ax-conversation-avatar-picker .avatar-preview{position:relative;display:flex;height:100px;width:100px;flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;overflow:hidden;border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:3px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lighter-surface));transition:all .25s ease;box-shadow:0 2px 8px #00000014}ax-conversation-avatar-picker .avatar-preview:hover{border-color:rgba(var(--ax-sys-color-primary-500));box-shadow:0 4px 12px #0000001f}ax-conversation-avatar-picker .avatar-preview:hover .preview-overlay{opacity:100%}ax-conversation-avatar-picker .avatar-preview ax-image{height:100%;width:100%}ax-conversation-avatar-picker .preview-overlay{position:absolute;inset:calc(var(--spacing, .25rem) * 0);display:flex;align-items:center;justify-content:center;font-size:1.75rem;color:var(--color-white, #fff);opacity:0%;background:#000000a6;transition:opacity .25s ease}ax-conversation-avatar-picker .avatar-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5);padding:calc(var(--spacing, .25rem) * 2);text-align:center;font-size:2rem;color:rgba(var(--ax-sys-color-on-surface),.65)}ax-conversation-avatar-picker .placeholder-text{font-size:.625rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-widest, .1em);letter-spacing:var(--tracking-widest, .1em);text-transform:uppercase;opacity:80%}ax-conversation-avatar-picker .avatar-actions{display:flex;flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-avatar-picker .avatar-actions ax-button{width:100%}ax-conversation-avatar-picker .avatar-picker__file-input{display:none}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1
|
|
8223
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationAvatarPickerComponent, isStandalone: true, selector: "ax-conversation-avatar-picker", inputs: { showClearButton: { classPropertyName: "showClearButton", publicName: "showClearButton", isSignal: true, isRequired: false, transformFunction: null }, avatarUrl: { classPropertyName: "avatarUrl", publicName: "avatarUrl", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { avatarUrl: "avatarUrlChange", onFileSelected: "onFileSelected" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: " <div class=\"avatar-picker\">\n <!-- Preview -->\n <div class=\"avatar-preview\" (click)=\"triggerFileInput()\">\n @if (avatarUrl()) {\n <ax-image [src]=\"avatarUrl()\" [alt]=\"'@acorex:chat.avatar.preview' | translate | async\"></ax-image>\n <div class=\"preview-overlay\">\n <i class=\"fa-light fa-camera\"></i>\n </div>\n } @else {\n <div class=\"avatar-placeholder\">\n <i class=\"fa-light fa-camera\"></i>\n <span class=\"placeholder-text\">{{ '@acorex:chat.actions.choose-image' | translate | async }}</span>\n </div>\n }\n </div>\n\n <!-- Action Buttons -->\n <div class=\"avatar-actions\">\n <ax-button\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [text]=\"\n avatarUrl()\n ? ('@acorex:chat.actions.change-image' | translate | async)\n : ('@acorex:chat.actions.upload-image' | translate | async)\n \"\n (onClick)=\"triggerFileInput()\"\n >\n <ax-prefix>\n <ax-icon><i [class]=\"avatarUrl() ? 'fa-light fa-image' : 'fa-light fa-upload'\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n @if (showClearButton() && avatarUrl()) {\n <ax-button\n [look]=\"'outline'\"\n [color]=\"'danger'\"\n [text]=\"'@acorex:chat.actions.remove-image' | translate | async\"\n (onClick)=\"clearAvatar()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-trash-can\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n </div>\n\n <!-- Hidden File Input -->\n <input\n #fileInput\n type=\"file\"\n accept=\"image/*\"\n class=\"avatar-picker__file-input\"\n (change)=\"onFileInputChange($event)\"\n />\n </div>\n", styles: ["@layer properties;@layer components{ax-conversation-avatar-picker{display:block}ax-conversation-avatar-picker .avatar-picker{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 6);border-radius:var(--radius-xl, .75rem);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding:calc(var(--spacing, .25rem) * 4)}ax-conversation-avatar-picker .avatar-preview{position:relative;display:flex;height:100px;width:100px;flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;overflow:hidden;border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:3px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lighter-surface));transition:all .25s ease;box-shadow:0 2px 8px #00000014}ax-conversation-avatar-picker .avatar-preview:hover{border-color:rgba(var(--ax-sys-color-primary-500));box-shadow:0 4px 12px #0000001f}ax-conversation-avatar-picker .avatar-preview:hover .preview-overlay{opacity:100%}ax-conversation-avatar-picker .avatar-preview ax-image{height:100%;width:100%}ax-conversation-avatar-picker .preview-overlay{position:absolute;inset:calc(var(--spacing, .25rem) * 0);display:flex;align-items:center;justify-content:center;font-size:1.75rem;color:var(--color-white, #fff);opacity:0%;background:#000000a6;transition:opacity .25s ease}ax-conversation-avatar-picker .avatar-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5);padding:calc(var(--spacing, .25rem) * 2);text-align:center;font-size:2rem;color:rgba(var(--ax-sys-color-on-surface),.65)}ax-conversation-avatar-picker .placeholder-text{font-size:.625rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-widest, .1em);letter-spacing:var(--tracking-widest, .1em);text-transform:uppercase;opacity:80%}ax-conversation-avatar-picker .avatar-actions{display:flex;flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-avatar-picker .avatar-actions ax-button{width:100%}ax-conversation-avatar-picker .avatar-picker__file-input{display:none}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1.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: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
8043
8224
|
}
|
|
8044
8225
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationAvatarPickerComponent, decorators: [{
|
|
8045
8226
|
type: Component,
|
|
@@ -8134,6 +8315,8 @@ class AXConversationNewDialogComponent extends AXBasePageComponent {
|
|
|
8134
8315
|
...(ngDevMode ? [{ debugName: "_syncPopupTitleEffect" }] : /* istanbul ignore next */ []));
|
|
8135
8316
|
this.usersListEmptyTpl = viewChild.required('usersListEmpty', /* @ts-ignore */
|
|
8136
8317
|
...(ngDevMode ? [{ debugName: "usersListEmptyTpl" }] : /* istanbul ignore next */ []));
|
|
8318
|
+
this.usersListLoadingTpl = viewChild.required('usersListLoading', /* @ts-ignore */
|
|
8319
|
+
...(ngDevMode ? [{ debugName: "usersListLoadingTpl" }] : /* istanbul ignore next */ []));
|
|
8137
8320
|
this.usersList = viewChild('usersList', /* @ts-ignore */
|
|
8138
8321
|
...(ngDevMode ? [{ debugName: "usersList" }] : /* istanbul ignore next */ []));
|
|
8139
8322
|
this.usersListDataSource = new AXDataSource({
|
|
@@ -8249,7 +8432,7 @@ class AXConversationNewDialogComponent extends AXBasePageComponent {
|
|
|
8249
8432
|
}
|
|
8250
8433
|
}
|
|
8251
8434
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationNewDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8252
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationNewDialogComponent, isStandalone: true, selector: "ax-conversation-new-dialog", inputs: { __popup__: { classPropertyName: "__popup__", publicName: "__popup__", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: AXClosableComponent, useExisting: AXConversationNewDialogComponent }], viewQueries: [{ propertyName: "usersListEmptyTpl", first: true, predicate: ["usersListEmpty"], descendants: true, isSignal: true }, { propertyName: "usersList", first: true, predicate: ["usersList"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: " <div class=\"new-conversation-panel\">\n <div class=\"new-conversation-dialog-content\">\n @if (showUserPickerStep()) {\n <div class=\"form-field form-field--grow\">\n <div class=\"users-list-wrap\">\n <div class=\"users-list-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n (valueChange)=\"onSearchChange($event)\"\n [disabled]=\"creating()\"\n [placeholder]=\"'@acorex:chat.placeholders.search-users' | translate | async\"\n ></ax-search-box>\n </div>\n <ax-list\n #usersList\n class=\"users-list\"\n [dataSource]=\"usersListDataSource\"\n [multiple]=\"true\"\n [checkbox]=\"false\"\n [disabled]=\"creating()\"\n [valueField]=\"'id'\"\n [textField]=\"'name'\"\n [itemHeight]=\"60\"\n [ngModel]=\"selectedUserIds()\"\n (ngModelChange)=\"onSelectedUsersChange($event ?? [])\"\n [emptyTemplate]=\"usersListEmptyTpl()\"\n [itemTemplate]=\"userItemTpl\"\n ></ax-list>\n </div>\n </div>\n }\n\n @if (showGroupDetailsStep()) {\n <div class=\"group-details-step\">\n <div class=\"form-field\">\n <input\n class=\"title-input\"\n [ngModel]=\"groupTitle()\"\n (ngModelChange)=\"groupTitle.set($event ?? '')\"\n [disabled]=\"creating()\"\n [placeholder]=\"'@acorex:chat.placeholders.group-title-required' | translate | async\"\n />\n </div>\n <div class=\"form-field\">\n <ax-conversation-avatar-picker [(avatarUrl)]=\"groupAvatar\"></ax-conversation-avatar-picker>\n </div>\n </div>\n }\n </div>\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n @if (showGroupBackButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.back' | translate | async\"\n [look]=\"'solid'\"\n [disabled]=\"creating()\"\n (onClick)=\"onBackFromGroupDetails()\"\n ></ax-button>\n } @else {\n <ax-button\n [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n [look]=\"'solid'\"\n [disabled]=\"creating()\"\n (onClick)=\"onCancel()\"\n ></ax-button>\n }\n @if (showNextButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.next' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canGoNextToGroupDetails() || creating()\"\n (onClick)=\"onNextToGroupDetails()\"\n ></ax-button>\n }\n @if (showCreateButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.create' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canCreate() || creating()\"\n (onClick)=\"onCreateConversation()\"\n ></ax-button>\n }\n </ax-suffix>\n </ax-footer>\n </div>\n\n <ng-template #usersListEmpty>\n <div class=\"users-list-empty\">\n @if (searchQuery()) {\n {{ '@acorex:chat.dialog.new-conversation.no-users-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.dialog.new-conversation.no-users-available' | translate | async }}\n }\n </div>\n </ng-template>\n\n <ng-template #userItemTpl let-item>\n @if (userFromItem(item); as user) {\n <div class=\"user-item-content\">\n <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isUserSelected(user.id)\" tabindex=\"0\" />\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"user.id\"\n [size]=\"48\"\n [name]=\"user.name\"\n [avatar]=\"user.avatar\"\n [icon]=\"user.icon\"\n />\n <div class=\"user-item-text\">\n <span class=\"truncated user-name-text\">{{ user.name }}</span>\n @if (user.description) {\n <span class=\"user-description-text truncated\">{{ user.description }}</span>\n }\n </div>\n </div>\n }\n </ng-template>\n", styles: ["@layer properties;@layer components{ax-conversation-new-dialog{display:block}ax-conversation-new-dialog .new-conversation-panel{display:flex;width:100%;flex-direction:column;overflow:hidden}ax-conversation-new-dialog .new-conversation-dialog-content{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);overflow:hidden}ax-conversation-new-dialog .form-field--grow{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column}ax-conversation-new-dialog .group-details-step{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .form-field{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-new-dialog .field-label{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface),.6)}ax-conversation-new-dialog .title-input{height:calc(var(--spacing, .25rem) * 9);border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 2.5);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-new-dialog .title-input:focus{outline:2px solid rgba(var(--ax-sys-color-primary-500),.25);outline-offset:0}ax-conversation-new-dialog .users-list-wrap{display:flex;flex-direction:column;overflow:hidden;height:min(50vh,36rem)}ax-conversation-new-dialog .users-list-search{flex-shrink:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .users-list{display:block;min-height:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-new-dialog .user-item-content{display:flex;height:100%;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .user-item-text{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;justify-content:center;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-new-dialog .user-name-text{overflow:hidden;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-new-dialog .user-description-text{overflow:hidden;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-new-dialog .users-list-empty{padding:calc(var(--spacing, .25rem) * 4);text-align:center;font-size:.85rem;opacity:70%}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-border-style: solid;--tw-leading: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "textTemplate", "disabledField", "multiple", "selectionMode", "isItemTruncated", "showItemTooltip", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readonlyChange", "onBlur", "onFocus", "onItemClick", "onItemSelected", "onScrolledIndexChanged"] }, { 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: 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: AXConversationAvatarPickerComponent, selector: "ax-conversation-avatar-picker", inputs: ["showClearButton", "avatarUrl"], outputs: ["avatarUrlChange", "onFileSelected"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
8435
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationNewDialogComponent, isStandalone: true, selector: "ax-conversation-new-dialog", inputs: { __popup__: { classPropertyName: "__popup__", publicName: "__popup__", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: AXClosableComponent, useExisting: AXConversationNewDialogComponent }], viewQueries: [{ propertyName: "usersListEmptyTpl", first: true, predicate: ["usersListEmpty"], descendants: true, isSignal: true }, { propertyName: "usersListLoadingTpl", first: true, predicate: ["usersListLoading"], descendants: true, isSignal: true }, { propertyName: "usersList", first: true, predicate: ["usersList"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: " <div class=\"new-conversation-panel\">\n <div class=\"new-conversation-dialog-content\">\n @if (showUserPickerStep()) {\n <div class=\"form-field form-field--grow\">\n <div class=\"users-list-wrap\">\n <div class=\"users-list-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n (valueChange)=\"onSearchChange($event)\"\n [disabled]=\"creating()\"\n [placeholder]=\"'@acorex:chat.placeholders.search-users' | translate | async\"\n ></ax-search-box>\n </div>\n <ax-list\n #usersList\n class=\"users-list\"\n [dataSource]=\"usersListDataSource\"\n [multiple]=\"true\"\n [checkbox]=\"false\"\n [disabled]=\"creating()\"\n [valueField]=\"'id'\"\n [textField]=\"'name'\"\n [itemHeight]=\"60\"\n [ngModel]=\"selectedUserIds()\"\n (ngModelChange)=\"onSelectedUsersChange($event ?? [])\"\n [emptyTemplate]=\"usersListEmptyTpl()\"\n [loadingTemplate]=\"usersListLoadingTpl()\"\n [itemTemplate]=\"userItemTpl\"\n ></ax-list>\n </div>\n </div>\n }\n\n @if (showGroupDetailsStep()) {\n <div class=\"group-details-step\">\n <div class=\"form-field\">\n <input\n class=\"title-input\"\n [ngModel]=\"groupTitle()\"\n (ngModelChange)=\"groupTitle.set($event ?? '')\"\n [disabled]=\"creating()\"\n [placeholder]=\"'@acorex:chat.placeholders.group-title-required' | translate | async\"\n />\n </div>\n <div class=\"form-field\">\n <ax-conversation-avatar-picker [(avatarUrl)]=\"groupAvatar\"></ax-conversation-avatar-picker>\n </div>\n </div>\n }\n </div>\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n @if (showGroupBackButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.back' | translate | async\"\n [look]=\"'solid'\"\n [disabled]=\"creating()\"\n (onClick)=\"onBackFromGroupDetails()\"\n ></ax-button>\n } @else {\n <ax-button\n [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n [look]=\"'solid'\"\n [disabled]=\"creating()\"\n (onClick)=\"onCancel()\"\n ></ax-button>\n }\n @if (showNextButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.next' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canGoNextToGroupDetails() || creating()\"\n (onClick)=\"onNextToGroupDetails()\"\n ></ax-button>\n }\n @if (showCreateButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.create' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canCreate() || creating()\"\n (onClick)=\"onCreateConversation()\"\n ></ax-button>\n }\n </ax-suffix>\n </ax-footer>\n </div>\n\n <ng-template #usersListEmpty>\n <div class=\"users-list-empty\">\n @if (searchQuery()) {\n {{ '@acorex:chat.dialog.new-conversation.no-users-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.dialog.new-conversation.no-users-available' | translate | async }}\n }\n </div>\n </ng-template>\n\n <ng-template #usersListLoading>\n <div class=\"user-item-skeleton\">\n <ax-skeleton class=\"skeleton-checkbox\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-avatar\" [animated]=\"true\"></ax-skeleton>\n <div class=\"skeleton-text\">\n <ax-skeleton class=\"skeleton-name\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-description\" [animated]=\"true\"></ax-skeleton>\n </div>\n </div>\n </ng-template>\n\n <ng-template #userItemTpl let-item>\n @if (userFromItem(item); as user) {\n <div class=\"user-item-content\">\n <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isUserSelected(user.id)\" tabindex=\"0\" />\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"user.id\"\n [size]=\"48\"\n [name]=\"user.name\"\n [avatar]=\"user.avatar\"\n [icon]=\"user.icon\"\n />\n <div class=\"user-item-text\">\n <span class=\"truncated user-name-text\">{{ user.name }}</span>\n @if (user.description) {\n <span class=\"user-description-text truncated\">{{ user.description }}</span>\n }\n </div>\n </div>\n }\n </ng-template>\n", styles: ["@layer properties;@layer components{ax-conversation-new-dialog{display:block}ax-conversation-new-dialog .new-conversation-panel{display:flex;width:100%;flex-direction:column;overflow:hidden}ax-conversation-new-dialog .new-conversation-dialog-content{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);overflow:hidden}ax-conversation-new-dialog .form-field--grow{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column}ax-conversation-new-dialog .group-details-step{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .form-field{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-new-dialog .field-label{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface),.6)}ax-conversation-new-dialog .title-input{height:calc(var(--spacing, .25rem) * 9);border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 2.5);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-new-dialog .title-input:focus{outline:2px solid rgba(var(--ax-sys-color-primary-500),.25);outline-offset:0}ax-conversation-new-dialog .users-list-wrap{display:flex;flex-direction:column;overflow:hidden;height:min(50vh,36rem)}ax-conversation-new-dialog .users-list-search{flex-shrink:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .users-list{display:block;min-height:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-new-dialog .user-item-content{display:flex;height:100%;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .user-item-text{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;justify-content:center;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-new-dialog .user-name-text{overflow:hidden;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-new-dialog .user-description-text{overflow:hidden;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-new-dialog .users-list-empty{padding:calc(var(--spacing, .25rem) * 4);text-align:center;font-size:.85rem;opacity:70%}ax-conversation-new-dialog .user-item-skeleton{display:flex;height:60px;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 5);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .skeleton-checkbox{height:calc(var(--spacing, .25rem) * 4);width:calc(var(--spacing, .25rem) * 4);flex-shrink:0;border-radius:.25rem}ax-conversation-new-dialog .skeleton-avatar{height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);flex-shrink:0;border-radius:calc(infinity * 1px)}ax-conversation-new-dialog .skeleton-text{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .skeleton-name{height:calc(var(--spacing, .25rem) * 4);width:calc(3/5 * 100%);border-radius:.25rem}ax-conversation-new-dialog .skeleton-description{height:calc(var(--spacing, .25rem) * 3);width:40%;border-radius:.25rem}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-border-style: solid;--tw-leading: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "textTemplate", "disabledField", "multiple", "selectionMode", "isItemTruncated", "showItemTooltip", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readonlyChange", "onBlur", "onFocus", "onItemClick", "onItemSelected", "onScrolledIndexChanged"] }, { 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: 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: AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXConversationAvatarPickerComponent, selector: "ax-conversation-avatar-picker", inputs: ["showClearButton", "avatarUrl"], outputs: ["avatarUrlChange", "onFileSelected"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
8253
8436
|
}
|
|
8254
8437
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationNewDialogComponent, decorators: [{
|
|
8255
8438
|
type: Component,
|
|
@@ -8260,11 +8443,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
8260
8443
|
AXListComponent,
|
|
8261
8444
|
AXSearchBoxComponent,
|
|
8262
8445
|
AXDecoratorGenericComponent,
|
|
8446
|
+
AXSkeletonComponent,
|
|
8263
8447
|
AXConversationAvatarPickerComponent,
|
|
8264
8448
|
AXConversationAvatarComponent,
|
|
8265
8449
|
AXTranslationModule,
|
|
8266
|
-
], providers: [{ provide: AXClosableComponent, useExisting: AXConversationNewDialogComponent }], template: " <div class=\"new-conversation-panel\">\n <div class=\"new-conversation-dialog-content\">\n @if (showUserPickerStep()) {\n <div class=\"form-field form-field--grow\">\n <div class=\"users-list-wrap\">\n <div class=\"users-list-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n (valueChange)=\"onSearchChange($event)\"\n [disabled]=\"creating()\"\n [placeholder]=\"'@acorex:chat.placeholders.search-users' | translate | async\"\n ></ax-search-box>\n </div>\n <ax-list\n #usersList\n class=\"users-list\"\n [dataSource]=\"usersListDataSource\"\n [multiple]=\"true\"\n [checkbox]=\"false\"\n [disabled]=\"creating()\"\n [valueField]=\"'id'\"\n [textField]=\"'name'\"\n [itemHeight]=\"60\"\n [ngModel]=\"selectedUserIds()\"\n (ngModelChange)=\"onSelectedUsersChange($event ?? [])\"\n [emptyTemplate]=\"usersListEmptyTpl()\"\n [itemTemplate]=\"userItemTpl\"\n ></ax-list>\n </div>\n </div>\n }\n\n @if (showGroupDetailsStep()) {\n <div class=\"group-details-step\">\n <div class=\"form-field\">\n <input\n class=\"title-input\"\n [ngModel]=\"groupTitle()\"\n (ngModelChange)=\"groupTitle.set($event ?? '')\"\n [disabled]=\"creating()\"\n [placeholder]=\"'@acorex:chat.placeholders.group-title-required' | translate | async\"\n />\n </div>\n <div class=\"form-field\">\n <ax-conversation-avatar-picker [(avatarUrl)]=\"groupAvatar\"></ax-conversation-avatar-picker>\n </div>\n </div>\n }\n </div>\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n @if (showGroupBackButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.back' | translate | async\"\n [look]=\"'solid'\"\n [disabled]=\"creating()\"\n (onClick)=\"onBackFromGroupDetails()\"\n ></ax-button>\n } @else {\n <ax-button\n [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n [look]=\"'solid'\"\n [disabled]=\"creating()\"\n (onClick)=\"onCancel()\"\n ></ax-button>\n }\n @if (showNextButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.next' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canGoNextToGroupDetails() || creating()\"\n (onClick)=\"onNextToGroupDetails()\"\n ></ax-button>\n }\n @if (showCreateButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.create' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canCreate() || creating()\"\n (onClick)=\"onCreateConversation()\"\n ></ax-button>\n }\n </ax-suffix>\n </ax-footer>\n </div>\n\n <ng-template #usersListEmpty>\n <div class=\"users-list-empty\">\n @if (searchQuery()) {\n {{ '@acorex:chat.dialog.new-conversation.no-users-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.dialog.new-conversation.no-users-available' | translate | async }}\n }\n </div>\n </ng-template>\n\n <ng-template #userItemTpl let-item>\n @if (userFromItem(item); as user) {\n <div class=\"user-item-content\">\n <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isUserSelected(user.id)\" tabindex=\"0\" />\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"user.id\"\n [size]=\"48\"\n [name]=\"user.name\"\n [avatar]=\"user.avatar\"\n [icon]=\"user.icon\"\n />\n <div class=\"user-item-text\">\n <span class=\"truncated user-name-text\">{{ user.name }}</span>\n @if (user.description) {\n <span class=\"user-description-text truncated\">{{ user.description }}</span>\n }\n </div>\n </div>\n }\n </ng-template>\n", styles: ["@layer properties;@layer components{ax-conversation-new-dialog{display:block}ax-conversation-new-dialog .new-conversation-panel{display:flex;width:100%;flex-direction:column;overflow:hidden}ax-conversation-new-dialog .new-conversation-dialog-content{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);overflow:hidden}ax-conversation-new-dialog .form-field--grow{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column}ax-conversation-new-dialog .group-details-step{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .form-field{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-new-dialog .field-label{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface),.6)}ax-conversation-new-dialog .title-input{height:calc(var(--spacing, .25rem) * 9);border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 2.5);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-new-dialog .title-input:focus{outline:2px solid rgba(var(--ax-sys-color-primary-500),.25);outline-offset:0}ax-conversation-new-dialog .users-list-wrap{display:flex;flex-direction:column;overflow:hidden;height:min(50vh,36rem)}ax-conversation-new-dialog .users-list-search{flex-shrink:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .users-list{display:block;min-height:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-new-dialog .user-item-content{display:flex;height:100%;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .user-item-text{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;justify-content:center;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-new-dialog .user-name-text{overflow:hidden;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-new-dialog .user-description-text{overflow:hidden;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-new-dialog .users-list-empty{padding:calc(var(--spacing, .25rem) * 4);text-align:center;font-size:.85rem;opacity:70%}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-border-style: solid;--tw-leading: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
8267
|
-
}], ctorParameters: () => [], propDecorators: { __popup__: [{ type: i0.Input, args: [{ isSignal: true, alias: "__popup__", required: false }] }], usersListEmptyTpl: [{ type: i0.ViewChild, args: ['usersListEmpty', { isSignal: true }] }], usersList: [{ type: i0.ViewChild, args: ['usersList', { isSignal: true }] }] } });
|
|
8450
|
+
], providers: [{ provide: AXClosableComponent, useExisting: AXConversationNewDialogComponent }], template: " <div class=\"new-conversation-panel\">\n <div class=\"new-conversation-dialog-content\">\n @if (showUserPickerStep()) {\n <div class=\"form-field form-field--grow\">\n <div class=\"users-list-wrap\">\n <div class=\"users-list-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n (valueChange)=\"onSearchChange($event)\"\n [disabled]=\"creating()\"\n [placeholder]=\"'@acorex:chat.placeholders.search-users' | translate | async\"\n ></ax-search-box>\n </div>\n <ax-list\n #usersList\n class=\"users-list\"\n [dataSource]=\"usersListDataSource\"\n [multiple]=\"true\"\n [checkbox]=\"false\"\n [disabled]=\"creating()\"\n [valueField]=\"'id'\"\n [textField]=\"'name'\"\n [itemHeight]=\"60\"\n [ngModel]=\"selectedUserIds()\"\n (ngModelChange)=\"onSelectedUsersChange($event ?? [])\"\n [emptyTemplate]=\"usersListEmptyTpl()\"\n [loadingTemplate]=\"usersListLoadingTpl()\"\n [itemTemplate]=\"userItemTpl\"\n ></ax-list>\n </div>\n </div>\n }\n\n @if (showGroupDetailsStep()) {\n <div class=\"group-details-step\">\n <div class=\"form-field\">\n <input\n class=\"title-input\"\n [ngModel]=\"groupTitle()\"\n (ngModelChange)=\"groupTitle.set($event ?? '')\"\n [disabled]=\"creating()\"\n [placeholder]=\"'@acorex:chat.placeholders.group-title-required' | translate | async\"\n />\n </div>\n <div class=\"form-field\">\n <ax-conversation-avatar-picker [(avatarUrl)]=\"groupAvatar\"></ax-conversation-avatar-picker>\n </div>\n </div>\n }\n </div>\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n @if (showGroupBackButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.back' | translate | async\"\n [look]=\"'solid'\"\n [disabled]=\"creating()\"\n (onClick)=\"onBackFromGroupDetails()\"\n ></ax-button>\n } @else {\n <ax-button\n [text]=\"'@acorex:chat.actions.cancel' | translate | async\"\n [look]=\"'solid'\"\n [disabled]=\"creating()\"\n (onClick)=\"onCancel()\"\n ></ax-button>\n }\n @if (showNextButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.next' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canGoNextToGroupDetails() || creating()\"\n (onClick)=\"onNextToGroupDetails()\"\n ></ax-button>\n }\n @if (showCreateButton()) {\n <ax-button\n [text]=\"'@acorex:chat.actions.create' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!canCreate() || creating()\"\n (onClick)=\"onCreateConversation()\"\n ></ax-button>\n }\n </ax-suffix>\n </ax-footer>\n </div>\n\n <ng-template #usersListEmpty>\n <div class=\"users-list-empty\">\n @if (searchQuery()) {\n {{ '@acorex:chat.dialog.new-conversation.no-users-search' | translate | async }}\n } @else {\n {{ '@acorex:chat.dialog.new-conversation.no-users-available' | translate | async }}\n }\n </div>\n </ng-template>\n\n <ng-template #usersListLoading>\n <div class=\"user-item-skeleton\">\n <ax-skeleton class=\"skeleton-checkbox\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-avatar\" [animated]=\"true\"></ax-skeleton>\n <div class=\"skeleton-text\">\n <ax-skeleton class=\"skeleton-name\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-description\" [animated]=\"true\"></ax-skeleton>\n </div>\n </div>\n </ng-template>\n\n <ng-template #userItemTpl let-item>\n @if (userFromItem(item); as user) {\n <div class=\"user-item-content\">\n <input class=\"ax-checkbox\" type=\"checkbox\" [checked]=\"isUserSelected(user.id)\" tabindex=\"0\" />\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"user.id\"\n [size]=\"48\"\n [name]=\"user.name\"\n [avatar]=\"user.avatar\"\n [icon]=\"user.icon\"\n />\n <div class=\"user-item-text\">\n <span class=\"truncated user-name-text\">{{ user.name }}</span>\n @if (user.description) {\n <span class=\"user-description-text truncated\">{{ user.description }}</span>\n }\n </div>\n </div>\n }\n </ng-template>\n", styles: ["@layer properties;@layer components{ax-conversation-new-dialog{display:block}ax-conversation-new-dialog .new-conversation-panel{display:flex;width:100%;flex-direction:column;overflow:hidden}ax-conversation-new-dialog .new-conversation-dialog-content{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);overflow:hidden}ax-conversation-new-dialog .form-field--grow{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column}ax-conversation-new-dialog .group-details-step{display:flex;min-height:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .form-field{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-new-dialog .field-label{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface),.6)}ax-conversation-new-dialog .title-input{height:calc(var(--spacing, .25rem) * 9);border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 2.5);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-new-dialog .title-input:focus{outline:2px solid rgba(var(--ax-sys-color-primary-500),.25);outline-offset:0}ax-conversation-new-dialog .users-list-wrap{display:flex;flex-direction:column;overflow:hidden;height:min(50vh,36rem)}ax-conversation-new-dialog .users-list-search{flex-shrink:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .users-list{display:block;min-height:calc(var(--spacing, .25rem) * 0);flex:1}ax-conversation-new-dialog .user-item-content{display:flex;height:100%;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .user-item-text{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;justify-content:center;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-new-dialog .user-name-text{overflow:hidden;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-new-dialog .user-description-text{overflow:hidden;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface));opacity:70%}ax-conversation-new-dialog .users-list-empty{padding:calc(var(--spacing, .25rem) * 4);text-align:center;font-size:.85rem;opacity:70%}ax-conversation-new-dialog .user-item-skeleton{display:flex;height:60px;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 5);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .skeleton-checkbox{height:calc(var(--spacing, .25rem) * 4);width:calc(var(--spacing, .25rem) * 4);flex-shrink:0;border-radius:.25rem}ax-conversation-new-dialog .skeleton-avatar{height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);flex-shrink:0;border-radius:calc(infinity * 1px)}ax-conversation-new-dialog .skeleton-text{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-new-dialog .skeleton-name{height:calc(var(--spacing, .25rem) * 4);width:calc(3/5 * 100%);border-radius:.25rem}ax-conversation-new-dialog .skeleton-description{height:calc(var(--spacing, .25rem) * 3);width:40%;border-radius:.25rem}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-border-style: solid;--tw-leading: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
8451
|
+
}], ctorParameters: () => [], propDecorators: { __popup__: [{ type: i0.Input, args: [{ isSignal: true, alias: "__popup__", required: false }] }], usersListEmptyTpl: [{ type: i0.ViewChild, args: ['usersListEmpty', { isSignal: true }] }], usersListLoadingTpl: [{ type: i0.ViewChild, args: ['usersListLoading', { isSignal: true }] }], usersList: [{ type: i0.ViewChild, args: ['usersList', { isSignal: true }] }] } });
|
|
8268
8452
|
|
|
8269
8453
|
var newConversationDialog_component = /*#__PURE__*/Object.freeze({
|
|
8270
8454
|
__proto__: null,
|
|
@@ -8617,6 +8801,9 @@ function normalizeAllConversationMessageIndexes() {
|
|
|
8617
8801
|
}
|
|
8618
8802
|
}
|
|
8619
8803
|
|
|
8804
|
+
/** Bump when demo seed shape changes so IndexedDB is reset on next connect. */
|
|
8805
|
+
const AX_CONVERSATION_DEMO_SEED_VERSION = 2;
|
|
8806
|
+
|
|
8620
8807
|
/**
|
|
8621
8808
|
* Shared In-Memory Storage
|
|
8622
8809
|
* Internal storage shared between all IndexedDB API implementations
|
|
@@ -8687,12 +8874,15 @@ class AXConversationSharedStorage {
|
|
|
8687
8874
|
* Seed initial data if not already seeded
|
|
8688
8875
|
*/
|
|
8689
8876
|
async seedIfEmpty() {
|
|
8690
|
-
// First, try to load from IndexedDB
|
|
8691
8877
|
await this.loadFromIndexedDB();
|
|
8692
|
-
|
|
8878
|
+
const storedVersion = await axConversationIndexedDbStorage.getSetting('demoSeedVersion');
|
|
8879
|
+
const needsReseed = storedVersion !== AX_CONVERSATION_DEMO_SEED_VERSION;
|
|
8880
|
+
if (needsReseed && (this.isSeeded || this.participants.size > 0)) {
|
|
8881
|
+
console.log('🔄 Demo seed version changed — resetting IndexedDB demo data');
|
|
8882
|
+
await this.clearAllData();
|
|
8883
|
+
}
|
|
8884
|
+
if (this.isSeeded && !needsReseed) {
|
|
8693
8885
|
console.log('✅ Data already exists, skipping seed');
|
|
8694
|
-
const { ensurePaginationDemoData } = await Promise.resolve().then(function () { return paginationDemoData; });
|
|
8695
|
-
await ensurePaginationDemoData();
|
|
8696
8886
|
if (this.participants.size > 0) {
|
|
8697
8887
|
this.startPresenceSimulation();
|
|
8698
8888
|
}
|
|
@@ -8701,6 +8891,20 @@ class AXConversationSharedStorage {
|
|
|
8701
8891
|
const { seedSharedStorageInitialData } = await Promise.resolve().then(function () { return sharedStorage_seed; });
|
|
8702
8892
|
await seedSharedStorageInitialData(this);
|
|
8703
8893
|
}
|
|
8894
|
+
/** Wipe in-memory and persisted demo data (used when seed version changes). */
|
|
8895
|
+
async clearAllData() {
|
|
8896
|
+
this.participants.clear();
|
|
8897
|
+
this.conversations.clear();
|
|
8898
|
+
this.messages.clear();
|
|
8899
|
+
this.messagesByConversation.clear();
|
|
8900
|
+
this.isSeeded = false;
|
|
8901
|
+
this.isLoadedFromDB = false;
|
|
8902
|
+
await axConversationIndexedDbStorage.clear(AXConversationIndexedDbStores.PARTICIPANTS);
|
|
8903
|
+
await axConversationIndexedDbStorage.clear(AXConversationIndexedDbStores.CONVERSATIONS);
|
|
8904
|
+
await axConversationIndexedDbStorage.clear(AXConversationIndexedDbStores.MESSAGES);
|
|
8905
|
+
await axConversationIndexedDbStorage.putSetting('isSeeded', false);
|
|
8906
|
+
await axConversationIndexedDbStorage.putSetting('demoSeedVersion', null);
|
|
8907
|
+
}
|
|
8704
8908
|
/** @internal Used by demo seed module */
|
|
8705
8909
|
markSeeded() {
|
|
8706
8910
|
this.isSeeded = true;
|
|
@@ -8927,174 +9131,15 @@ var sharedStorage = /*#__PURE__*/Object.freeze({
|
|
|
8927
9131
|
axConversationSharedStorage: axConversationSharedStorage
|
|
8928
9132
|
});
|
|
8929
9133
|
|
|
8930
|
-
|
|
8931
|
-
|
|
8932
|
-
|
|
8933
|
-
|
|
8934
|
-
|
|
8935
|
-
const AX_CONVERSATION_MIN_CONVERSATIONS_FOR_PAGINATION = 200;
|
|
8936
|
-
const AX_CONVERSATION_MESSAGE_PAGINATION_COUNT = 500;
|
|
8937
|
-
const AX_CONVERSATION_MIN_USERS_FOR_PAGINATION = 50;
|
|
8938
|
-
const AX_PAGINATION_DB_BATCH_SIZE = 50;
|
|
8939
|
-
/**
|
|
8940
|
-
* Append demo users when the participant list is too small for the new-conversation picker (page size 10).
|
|
8941
|
-
*/
|
|
8942
|
-
async function ensureUsersPaginationDemoData() {
|
|
8943
|
-
const users = Array.from(axConversationSharedStorage.participants.values()).filter((user) => user.id !== axConversationSharedStorage.currentUserId);
|
|
8944
|
-
if (users.length >= AX_CONVERSATION_MIN_USERS_FOR_PAGINATION) {
|
|
8945
|
-
return;
|
|
8946
|
-
}
|
|
8947
|
-
const toCreate = AX_CONVERSATION_MIN_USERS_FOR_PAGINATION - users.length;
|
|
8948
|
-
const statuses = ['online', 'offline', 'away'];
|
|
8949
|
-
const titles = ['Developer', 'Designer', 'Manager', 'Analyst', 'Engineer', 'QA', 'DevOps', 'Support'];
|
|
8950
|
-
for (let i = 0; i < toCreate; i++) {
|
|
8951
|
-
const index = users.length + i + 1;
|
|
8952
|
-
const participant = {
|
|
8953
|
-
id: `user-pag-${index}`,
|
|
8954
|
-
name: `Demo User ${String(index).padStart(2, '0')}`,
|
|
8955
|
-
description: `${titles[i % titles.length]} · Pagination demo`,
|
|
8956
|
-
avatar: `https://i.pravatar.cc/150?img=${(index % 70) + 1}`,
|
|
8957
|
-
status: statuses[i % statuses.length],
|
|
8958
|
-
lastSeen: new Date(Date.now() - i * 300_000),
|
|
8959
|
-
profile: {
|
|
8960
|
-
bio: `Mock user #${index} for new-conversation list pagination`,
|
|
8961
|
-
email: `demo.user.${index}@example.com`,
|
|
8962
|
-
title: titles[i % titles.length],
|
|
8963
|
-
},
|
|
8964
|
-
metadata: { tags: ['demo', 'pagination'] },
|
|
8965
|
-
};
|
|
8966
|
-
axConversationSharedStorage.participants.set(participant.id, participant);
|
|
8967
|
-
await axConversationIndexedDbStorage.putParticipant(participant);
|
|
8968
|
-
}
|
|
8969
|
-
}
|
|
8970
|
-
/**
|
|
8971
|
-
* Create a pinned private chat with {@link AX_CONVERSATION_MESSAGE_PAGINATION_COUNT} text messages.
|
|
8972
|
-
*/
|
|
8973
|
-
async function ensureMessagePaginationConversation(currentUser, peer, now) {
|
|
8974
|
-
const existingCount = axConversationSharedStorage.messagesByConversation.get(AX_MESSAGE_PAGINATION_CONVERSATION_ID)?.length ?? 0;
|
|
8975
|
-
if (existingCount >= AX_CONVERSATION_MESSAGE_PAGINATION_COUNT) {
|
|
8976
|
-
return;
|
|
8977
|
-
}
|
|
8978
|
-
if (!axConversationSharedStorage.conversations.has(AX_MESSAGE_PAGINATION_CONVERSATION_ID)) {
|
|
8979
|
-
const conversation = {
|
|
8980
|
-
id: AX_MESSAGE_PAGINATION_CONVERSATION_ID,
|
|
8981
|
-
type: 'private',
|
|
8982
|
-
title: `Message Pagination (${AX_CONVERSATION_MESSAGE_PAGINATION_COUNT})`,
|
|
8983
|
-
participants: [currentUser, { ...peer, role: 'member' }],
|
|
8984
|
-
lastMessageAt: new Date(now),
|
|
8985
|
-
unreadCount: 0,
|
|
8986
|
-
pinned: true,
|
|
8987
|
-
status: { isTyping: false, typingUsers: [] },
|
|
8988
|
-
settings: { notifications: true, showPreview: true },
|
|
8989
|
-
archived: false,
|
|
8990
|
-
metadata: {
|
|
8991
|
-
profile: {
|
|
8992
|
-
description: 'Mock chat with 500 messages for testing message-list pagination',
|
|
8993
|
-
tags: ['demo', 'pagination', 'messages'],
|
|
8994
|
-
favorite: true,
|
|
8995
|
-
},
|
|
8996
|
-
},
|
|
8997
|
-
createdAt: new Date(now - AX_CONVERSATION_MESSAGE_PAGINATION_COUNT * 60_000),
|
|
8998
|
-
updatedAt: new Date(now),
|
|
8999
|
-
};
|
|
9000
|
-
axConversationSharedStorage.conversations.set(conversation.id, conversation);
|
|
9001
|
-
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
9002
|
-
}
|
|
9003
|
-
const toCreate = AX_CONVERSATION_MESSAGE_PAGINATION_COUNT - existingCount;
|
|
9004
|
-
const pendingDbWrites = [];
|
|
9005
|
-
let lastMessage;
|
|
9006
|
-
for (let i = 0; i < toCreate; i++) {
|
|
9007
|
-
const messageNumber = existingCount + i + 1;
|
|
9008
|
-
const isOwn = messageNumber % 2 === 0;
|
|
9009
|
-
const message = {
|
|
9010
|
-
id: `msg-pag-test-${messageNumber}`,
|
|
9011
|
-
conversationId: AX_MESSAGE_PAGINATION_CONVERSATION_ID,
|
|
9012
|
-
senderId: isOwn ? currentUser.id : peer.id,
|
|
9013
|
-
type: 'text',
|
|
9014
|
-
timestamp: new Date(now - (AX_CONVERSATION_MESSAGE_PAGINATION_COUNT - messageNumber) * 60_000),
|
|
9015
|
-
payload: {
|
|
9016
|
-
type: 'text',
|
|
9017
|
-
text: `Pagination test message #${messageNumber} of ${AX_CONVERSATION_MESSAGE_PAGINATION_COUNT} — scroll up to load older history.`,
|
|
9018
|
-
},
|
|
9019
|
-
status: 'read',
|
|
9020
|
-
reactions: [],
|
|
9021
|
-
metadata: {},
|
|
9022
|
-
};
|
|
9023
|
-
registerChatMessage(message);
|
|
9024
|
-
pendingDbWrites.push(axConversationIndexedDbStorage.putMessage(message));
|
|
9025
|
-
lastMessage = message;
|
|
9026
|
-
if (pendingDbWrites.length >= AX_PAGINATION_DB_BATCH_SIZE) {
|
|
9027
|
-
await Promise.all(pendingDbWrites);
|
|
9028
|
-
pendingDbWrites.length = 0;
|
|
9029
|
-
}
|
|
9030
|
-
}
|
|
9031
|
-
if (pendingDbWrites.length > 0) {
|
|
9032
|
-
await Promise.all(pendingDbWrites);
|
|
9033
|
-
}
|
|
9034
|
-
const conv = axConversationSharedStorage.conversations.get(AX_MESSAGE_PAGINATION_CONVERSATION_ID);
|
|
9035
|
-
if (conv && lastMessage) {
|
|
9036
|
-
conv.lastMessage = lastMessage;
|
|
9037
|
-
conv.lastMessageAt = lastMessage.timestamp;
|
|
9038
|
-
conv.updatedAt = lastMessage.timestamp;
|
|
9039
|
-
axConversationSharedStorage.conversations.set(conv.id, conv);
|
|
9040
|
-
await axConversationIndexedDbStorage.putConversation(conv);
|
|
9041
|
-
}
|
|
9042
|
-
}
|
|
9043
|
-
/**
|
|
9044
|
-
* Append demo chats/messages when the DB is too small for default page sizes (30 / 50).
|
|
9045
|
-
*/
|
|
9046
|
-
async function ensurePaginationDemoData() {
|
|
9047
|
-
await ensureUsersPaginationDemoData();
|
|
9048
|
-
const conversationCount = axConversationSharedStorage.conversations.size;
|
|
9049
|
-
const pagTestMessages = axConversationSharedStorage.messagesByConversation.get(AX_MESSAGE_PAGINATION_CONVERSATION_ID)?.length ?? 0;
|
|
9050
|
-
if (conversationCount >= AX_CONVERSATION_MIN_CONVERSATIONS_FOR_PAGINATION &&
|
|
9051
|
-
pagTestMessages >= AX_CONVERSATION_MESSAGE_PAGINATION_COUNT) {
|
|
9052
|
-
return;
|
|
9053
|
-
}
|
|
9054
|
-
const participants = Array.from(axConversationSharedStorage.participants.values());
|
|
9055
|
-
const currentUser = axConversationSharedStorage.participants.get(axConversationSharedStorage.currentUserId);
|
|
9056
|
-
if (!currentUser || participants.length < 2) {
|
|
9057
|
-
return;
|
|
9058
|
-
}
|
|
9059
|
-
const peer = axConversationSharedStorage.participants.get('user-2') ??
|
|
9060
|
-
participants.find((p) => p.id !== currentUser.id) ??
|
|
9061
|
-
participants[1];
|
|
9062
|
-
const now = Date.now();
|
|
9063
|
-
if (conversationCount < AX_CONVERSATION_MIN_CONVERSATIONS_FOR_PAGINATION) {
|
|
9064
|
-
const toCreate = AX_CONVERSATION_MIN_CONVERSATIONS_FOR_PAGINATION - conversationCount;
|
|
9065
|
-
for (let i = 0; i < toCreate; i++) {
|
|
9066
|
-
const chatPeer = participants[(i % (participants.length - 1)) + 1];
|
|
9067
|
-
const conversation = {
|
|
9068
|
-
id: `conv-pag-${i}`,
|
|
9069
|
-
type: 'private',
|
|
9070
|
-
title: `Demo Chat ${i + 1} — ${chatPeer.name}`,
|
|
9071
|
-
participants: [currentUser, { ...chatPeer, role: 'member' }],
|
|
9072
|
-
lastMessageAt: new Date(now - i * 60_000),
|
|
9073
|
-
unreadCount: 0,
|
|
9074
|
-
pinned: i === 0,
|
|
9075
|
-
status: { isTyping: false, typingUsers: [] },
|
|
9076
|
-
settings: { notifications: true, showPreview: true },
|
|
9077
|
-
archived: false,
|
|
9078
|
-
metadata: { profile: { tags: ['demo', 'pagination'] } },
|
|
9079
|
-
createdAt: new Date(now - i * 86_400_000),
|
|
9080
|
-
updatedAt: new Date(now - i * 60_000),
|
|
9081
|
-
};
|
|
9082
|
-
axConversationSharedStorage.conversations.set(conversation.id, conversation);
|
|
9083
|
-
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
9084
|
-
}
|
|
9085
|
-
}
|
|
9086
|
-
await ensureMessagePaginationConversation(currentUser, peer, now);
|
|
9087
|
-
}
|
|
9088
|
-
|
|
9089
|
-
var paginationDemoData = /*#__PURE__*/Object.freeze({
|
|
9090
|
-
__proto__: null,
|
|
9091
|
-
AX_MESSAGE_PAGINATION_CONVERSATION_ID: AX_MESSAGE_PAGINATION_CONVERSATION_ID,
|
|
9092
|
-
ensurePaginationDemoData: ensurePaginationDemoData
|
|
9093
|
-
});
|
|
9094
|
-
|
|
9134
|
+
const AX_CONVERSATION_DEMO_CONVERSATION_IDS = {
|
|
9135
|
+
private: 'conv-demo-private',
|
|
9136
|
+
group: 'conv-demo-group',
|
|
9137
|
+
channel: 'conv-demo-channel',
|
|
9138
|
+
};
|
|
9095
9139
|
async function seedSharedStorageInitialData(storage) {
|
|
9096
|
-
console.log('🌱 Seeding
|
|
9097
|
-
|
|
9140
|
+
console.log('🌱 Seeding demo data (3 conversations)...');
|
|
9141
|
+
const now = Date.now();
|
|
9142
|
+
const minutes = (n) => new Date(now - n * 60_000);
|
|
9098
9143
|
const participants = [
|
|
9099
9144
|
{
|
|
9100
9145
|
id: 'current-user',
|
|
@@ -9104,741 +9149,395 @@ async function seedSharedStorageInitialData(storage) {
|
|
|
9104
9149
|
status: 'online',
|
|
9105
9150
|
lastSeen: new Date(),
|
|
9106
9151
|
profile: {
|
|
9107
|
-
bio: '
|
|
9108
|
-
email: 'you@
|
|
9152
|
+
bio: 'Building chat experiences with ACoreX',
|
|
9153
|
+
email: 'you@acorex.io',
|
|
9109
9154
|
phone: '+1 (555) 123-4567',
|
|
9110
9155
|
location: 'San Francisco, CA',
|
|
9111
|
-
company: '
|
|
9156
|
+
company: 'ACoreX',
|
|
9112
9157
|
title: 'Senior Developer',
|
|
9113
9158
|
},
|
|
9114
9159
|
},
|
|
9115
9160
|
{
|
|
9116
|
-
id: 'user-
|
|
9161
|
+
id: 'user-alice',
|
|
9117
9162
|
name: 'Alice Johnson',
|
|
9118
9163
|
description: 'Lead Designer',
|
|
9119
9164
|
avatar: 'https://i.pravatar.cc/150?img=5',
|
|
9120
9165
|
status: 'online',
|
|
9121
9166
|
lastSeen: new Date(),
|
|
9122
9167
|
profile: {
|
|
9123
|
-
bio: 'Product designer
|
|
9124
|
-
email: 'alice.johnson@
|
|
9125
|
-
phone: '+1 (555) 234-5678',
|
|
9168
|
+
bio: 'Product designer focused on design systems',
|
|
9169
|
+
email: 'alice.johnson@acorex.io',
|
|
9126
9170
|
location: 'New York, NY',
|
|
9127
|
-
company: '
|
|
9171
|
+
company: 'ACoreX',
|
|
9128
9172
|
title: 'Lead Designer',
|
|
9129
9173
|
},
|
|
9130
9174
|
},
|
|
9131
9175
|
{
|
|
9132
|
-
id: 'user-
|
|
9176
|
+
id: 'user-bob',
|
|
9133
9177
|
name: 'Bob Smith',
|
|
9134
9178
|
description: 'Tech Lead',
|
|
9135
9179
|
avatar: 'https://i.pravatar.cc/150?img=12',
|
|
9136
9180
|
status: 'away',
|
|
9137
|
-
lastSeen:
|
|
9181
|
+
lastSeen: minutes(12),
|
|
9138
9182
|
profile: {
|
|
9139
|
-
bio: 'Full-stack
|
|
9140
|
-
email: 'bob.smith@
|
|
9141
|
-
phone: '+1 (555) 345-6789',
|
|
9183
|
+
bio: 'Full-stack engineer and architecture reviewer',
|
|
9184
|
+
email: 'bob.smith@acorex.io',
|
|
9142
9185
|
location: 'Austin, TX',
|
|
9143
|
-
company: '
|
|
9186
|
+
company: 'ACoreX',
|
|
9144
9187
|
title: 'Tech Lead',
|
|
9145
9188
|
},
|
|
9146
9189
|
},
|
|
9147
9190
|
{
|
|
9148
|
-
id: 'user-
|
|
9191
|
+
id: 'user-carol',
|
|
9149
9192
|
name: 'Carol Williams',
|
|
9150
|
-
description: '
|
|
9193
|
+
description: 'Product Manager',
|
|
9151
9194
|
avatar: 'https://i.pravatar.cc/150?img=20',
|
|
9152
|
-
status: 'offline',
|
|
9153
|
-
lastSeen: new Date(Date.now() - 3600000),
|
|
9154
|
-
profile: {
|
|
9155
|
-
bio: 'Marketing specialist focused on digital strategies',
|
|
9156
|
-
email: 'carol.williams@example.com',
|
|
9157
|
-
phone: '+1 (555) 456-7890',
|
|
9158
|
-
location: 'Los Angeles, CA',
|
|
9159
|
-
company: 'Marketing Pro',
|
|
9160
|
-
title: 'Marketing Manager',
|
|
9161
|
-
},
|
|
9162
|
-
},
|
|
9163
|
-
{
|
|
9164
|
-
id: 'user-5',
|
|
9165
|
-
name: 'David Brown',
|
|
9166
|
-
description: 'DevOps Lead',
|
|
9167
|
-
avatar: 'https://i.pravatar.cc/150?img=13',
|
|
9168
|
-
status: 'online',
|
|
9169
|
-
lastSeen: new Date(),
|
|
9170
|
-
profile: {
|
|
9171
|
-
bio: 'DevOps engineer passionate about automation',
|
|
9172
|
-
email: 'david.brown@example.com',
|
|
9173
|
-
phone: '+1 (555) 567-8901',
|
|
9174
|
-
location: 'Seattle, WA',
|
|
9175
|
-
company: 'Cloud Systems',
|
|
9176
|
-
title: 'DevOps Lead',
|
|
9177
|
-
},
|
|
9178
|
-
},
|
|
9179
|
-
{
|
|
9180
|
-
id: 'user-6',
|
|
9181
|
-
name: 'Emma Davis',
|
|
9182
|
-
description: 'UX Researcher',
|
|
9183
|
-
avatar: 'https://i.pravatar.cc/150?img=24',
|
|
9184
|
-
status: 'offline',
|
|
9185
|
-
lastSeen: new Date(Date.now() - 7200000),
|
|
9186
|
-
profile: {
|
|
9187
|
-
bio: 'UX researcher exploring human behavior',
|
|
9188
|
-
email: 'emma.davis@example.com',
|
|
9189
|
-
phone: '+1 (555) 678-9012',
|
|
9190
|
-
location: 'Boston, MA',
|
|
9191
|
-
company: 'Research Lab',
|
|
9192
|
-
title: 'UX Researcher',
|
|
9193
|
-
},
|
|
9194
|
-
},
|
|
9195
|
-
{
|
|
9196
|
-
id: 'user-7',
|
|
9197
|
-
name: 'Frank Miller',
|
|
9198
|
-
description: 'Data Scientist',
|
|
9199
|
-
avatar: 'https://i.pravatar.cc/150?img=33',
|
|
9200
9195
|
status: 'online',
|
|
9201
9196
|
lastSeen: new Date(),
|
|
9202
9197
|
profile: {
|
|
9203
|
-
bio: '
|
|
9204
|
-
email: '
|
|
9205
|
-
phone: '+1 (555) 789-0123',
|
|
9198
|
+
bio: 'Owns the conversation component roadmap',
|
|
9199
|
+
email: 'carol.williams@acorex.io',
|
|
9206
9200
|
location: 'Chicago, IL',
|
|
9207
|
-
company: '
|
|
9208
|
-
title: '
|
|
9209
|
-
},
|
|
9210
|
-
},
|
|
9211
|
-
{
|
|
9212
|
-
id: 'user-8',
|
|
9213
|
-
name: 'Grace Wilson',
|
|
9214
|
-
description: 'Mobile Developer',
|
|
9215
|
-
avatar: 'https://i.pravatar.cc/150?img=44',
|
|
9216
|
-
status: 'away',
|
|
9217
|
-
lastSeen: new Date(Date.now() - 600000),
|
|
9218
|
-
profile: {
|
|
9219
|
-
bio: 'Mobile app developer for iOS and Android',
|
|
9220
|
-
email: 'grace.wilson@example.com',
|
|
9221
|
-
phone: '+1 (555) 890-1234',
|
|
9222
|
-
location: 'Miami, FL',
|
|
9223
|
-
company: 'Mobile Solutions',
|
|
9224
|
-
title: 'Mobile Developer',
|
|
9225
|
-
},
|
|
9226
|
-
},
|
|
9227
|
-
{
|
|
9228
|
-
id: 'user-9',
|
|
9229
|
-
name: 'Henry Moore',
|
|
9230
|
-
description: 'Security Engineer',
|
|
9231
|
-
avatar: 'https://i.pravatar.cc/150?img=52',
|
|
9232
|
-
status: 'online',
|
|
9233
|
-
lastSeen: new Date(),
|
|
9234
|
-
profile: {
|
|
9235
|
-
bio: 'Security engineer protecting digital assets',
|
|
9236
|
-
email: 'henry.moore@example.com',
|
|
9237
|
-
phone: '+1 (555) 901-2345',
|
|
9238
|
-
location: 'Denver, CO',
|
|
9239
|
-
company: 'SecureNet',
|
|
9240
|
-
title: 'Security Engineer',
|
|
9201
|
+
company: 'ACoreX',
|
|
9202
|
+
title: 'Product Manager',
|
|
9241
9203
|
},
|
|
9242
9204
|
},
|
|
9243
9205
|
{
|
|
9244
|
-
id: 'user-
|
|
9245
|
-
name: '
|
|
9246
|
-
description: '
|
|
9247
|
-
avatar: 'https://i.pravatar.cc/150?img=
|
|
9248
|
-
status: 'offline',
|
|
9249
|
-
lastSeen: new Date(Date.now() - 10800000),
|
|
9250
|
-
profile: {
|
|
9251
|
-
bio: 'Content strategist crafting compelling narratives',
|
|
9252
|
-
email: 'ivy.taylor@example.com',
|
|
9253
|
-
phone: '+1 (555) 012-3456',
|
|
9254
|
-
location: 'Portland, OR',
|
|
9255
|
-
company: 'Content Agency',
|
|
9256
|
-
title: 'Content Strategist',
|
|
9257
|
-
},
|
|
9258
|
-
},
|
|
9259
|
-
{
|
|
9260
|
-
id: 'user-11',
|
|
9261
|
-
name: 'Jack Anderson',
|
|
9262
|
-
description: 'Backend Engineer',
|
|
9263
|
-
avatar: 'https://i.pravatar.cc/150?img=68',
|
|
9264
|
-
status: 'online',
|
|
9265
|
-
lastSeen: new Date(),
|
|
9266
|
-
profile: {
|
|
9267
|
-
bio: 'Backend engineer building scalable systems',
|
|
9268
|
-
email: 'jack.anderson@example.com',
|
|
9269
|
-
phone: '+1 (555) 123-4560',
|
|
9270
|
-
location: 'Phoenix, AZ',
|
|
9271
|
-
company: 'Backend Systems',
|
|
9272
|
-
title: 'Backend Engineer',
|
|
9273
|
-
},
|
|
9274
|
-
},
|
|
9275
|
-
{
|
|
9276
|
-
id: 'user-12',
|
|
9277
|
-
name: 'Kate Thomas',
|
|
9278
|
-
description: 'Project Manager',
|
|
9279
|
-
avatar: 'https://i.pravatar.cc/150?img=32',
|
|
9280
|
-
status: 'away',
|
|
9281
|
-
lastSeen: new Date(Date.now() - 900000),
|
|
9282
|
-
profile: {
|
|
9283
|
-
bio: 'Project manager keeping teams on track',
|
|
9284
|
-
email: 'kate.thomas@example.com',
|
|
9285
|
-
phone: '+1 (555) 234-5601',
|
|
9286
|
-
location: 'Atlanta, GA',
|
|
9287
|
-
company: 'Project Solutions',
|
|
9288
|
-
title: 'Project Manager',
|
|
9289
|
-
},
|
|
9290
|
-
},
|
|
9291
|
-
{
|
|
9292
|
-
id: 'user-13',
|
|
9293
|
-
name: 'Leo Jackson',
|
|
9294
|
-
description: 'ML Engineer',
|
|
9295
|
-
avatar: 'https://i.pravatar.cc/150?img=59',
|
|
9296
|
-
status: 'online',
|
|
9297
|
-
lastSeen: new Date(),
|
|
9298
|
-
profile: {
|
|
9299
|
-
bio: 'AI/ML engineer exploring artificial intelligence',
|
|
9300
|
-
email: 'leo.jackson@example.com',
|
|
9301
|
-
phone: '+1 (555) 345-6012',
|
|
9302
|
-
location: 'San Jose, CA',
|
|
9303
|
-
company: 'AI Labs',
|
|
9304
|
-
title: 'ML Engineer',
|
|
9305
|
-
},
|
|
9306
|
-
},
|
|
9307
|
-
{
|
|
9308
|
-
id: 'user-14',
|
|
9309
|
-
name: 'Mia White',
|
|
9310
|
-
description: 'Business Analyst',
|
|
9311
|
-
avatar: 'https://i.pravatar.cc/150?img=45',
|
|
9206
|
+
id: 'user-david',
|
|
9207
|
+
name: 'David Brown',
|
|
9208
|
+
description: 'DevOps Engineer',
|
|
9209
|
+
avatar: 'https://i.pravatar.cc/150?img=13',
|
|
9312
9210
|
status: 'offline',
|
|
9313
|
-
lastSeen:
|
|
9211
|
+
lastSeen: minutes(45),
|
|
9314
9212
|
profile: {
|
|
9315
|
-
bio: '
|
|
9316
|
-
email: '
|
|
9317
|
-
|
|
9318
|
-
|
|
9319
|
-
|
|
9320
|
-
title: 'Business Analyst',
|
|
9213
|
+
bio: 'Keeps staging and demo environments running',
|
|
9214
|
+
email: 'david.brown@acorex.io',
|
|
9215
|
+
location: 'Seattle, WA',
|
|
9216
|
+
company: 'ACoreX',
|
|
9217
|
+
title: 'DevOps Engineer',
|
|
9321
9218
|
},
|
|
9322
9219
|
},
|
|
9323
9220
|
{
|
|
9324
|
-
id: 'user-
|
|
9325
|
-
name: '
|
|
9221
|
+
id: 'user-emma',
|
|
9222
|
+
name: 'Emma Davis',
|
|
9326
9223
|
description: 'QA Engineer',
|
|
9327
|
-
avatar: 'https://i.pravatar.cc/150?img=
|
|
9328
|
-
status: 'online',
|
|
9329
|
-
lastSeen: new Date(),
|
|
9330
|
-
profile: {
|
|
9331
|
-
bio: 'QA engineer ensuring quality in every release',
|
|
9332
|
-
email: 'noah.harris@example.com',
|
|
9333
|
-
phone: '+1 (555) 567-0124',
|
|
9334
|
-
location: 'Nashville, TN',
|
|
9335
|
-
company: 'Quality Assurance',
|
|
9336
|
-
title: 'QA Engineer',
|
|
9337
|
-
},
|
|
9338
|
-
},
|
|
9339
|
-
/** Demo: no avatar image — only participant `icon` (Font Awesome) in the message list */
|
|
9340
|
-
{
|
|
9341
|
-
id: 'demo-icon-only-user',
|
|
9342
|
-
name: 'Icon Demo User',
|
|
9343
|
-
description: 'No profile photo — FA icon only',
|
|
9344
|
-
icon: 'fa-light fa-user',
|
|
9224
|
+
avatar: 'https://i.pravatar.cc/150?img=24',
|
|
9345
9225
|
status: 'online',
|
|
9346
9226
|
lastSeen: new Date(),
|
|
9347
9227
|
profile: {
|
|
9348
|
-
bio: '
|
|
9349
|
-
email: '
|
|
9350
|
-
|
|
9351
|
-
|
|
9352
|
-
|
|
9353
|
-
title: 'Demo',
|
|
9228
|
+
bio: 'Tests chat flows end to end',
|
|
9229
|
+
email: 'emma.davis@acorex.io',
|
|
9230
|
+
location: 'Boston, MA',
|
|
9231
|
+
company: 'ACoreX',
|
|
9232
|
+
title: 'QA Engineer',
|
|
9354
9233
|
},
|
|
9355
9234
|
},
|
|
9356
9235
|
];
|
|
9357
|
-
|
|
9358
|
-
for (const
|
|
9359
|
-
storage.participants.set(
|
|
9360
|
-
await axConversationIndexedDbStorage.putParticipant(
|
|
9236
|
+
const [me, alice, bob, carol, david, emma] = participants;
|
|
9237
|
+
for (const participant of participants) {
|
|
9238
|
+
storage.participants.set(participant.id, participant);
|
|
9239
|
+
await axConversationIndexedDbStorage.putParticipant(participant);
|
|
9361
9240
|
}
|
|
9362
|
-
// Create conversations: 2 private + 3 groups (includes icon-only avatar demo)
|
|
9363
|
-
const now = new Date();
|
|
9364
9241
|
const conversations = [
|
|
9365
|
-
// Private Chat 1: Alice Johnson
|
|
9366
9242
|
{
|
|
9367
|
-
id:
|
|
9243
|
+
id: AX_CONVERSATION_DEMO_CONVERSATION_IDS.private,
|
|
9368
9244
|
type: 'private',
|
|
9369
9245
|
title: 'Alice Johnson',
|
|
9370
|
-
participants: [
|
|
9371
|
-
lastMessageAt:
|
|
9372
|
-
unreadCount:
|
|
9246
|
+
participants: [me, { ...alice, role: 'member' }],
|
|
9247
|
+
lastMessageAt: minutes(2),
|
|
9248
|
+
unreadCount: 1,
|
|
9373
9249
|
status: { isTyping: false, typingUsers: [] },
|
|
9374
9250
|
settings: { notifications: true, showPreview: true },
|
|
9375
9251
|
archived: false,
|
|
9376
9252
|
metadata: {
|
|
9377
9253
|
profile: {
|
|
9378
|
-
description: '
|
|
9254
|
+
description: 'Direct messages with Alice about design handoff',
|
|
9379
9255
|
tags: ['work', 'design'],
|
|
9380
9256
|
favorite: true,
|
|
9381
9257
|
},
|
|
9382
9258
|
},
|
|
9383
|
-
createdAt:
|
|
9384
|
-
updatedAt:
|
|
9385
|
-
},
|
|
9386
|
-
// Private Chat 2: Bob Smith
|
|
9387
|
-
{
|
|
9388
|
-
id: 'conv-2',
|
|
9389
|
-
type: 'private',
|
|
9390
|
-
title: 'Bob Smith',
|
|
9391
|
-
participants: [participants[0], { ...participants[2], role: 'member' }],
|
|
9392
|
-
lastMessageAt: new Date(now.getTime() - 7200000),
|
|
9393
|
-
unreadCount: 0,
|
|
9394
|
-
status: { isTyping: false, typingUsers: [] },
|
|
9395
|
-
settings: { notifications: true, showPreview: true },
|
|
9396
|
-
archived: false,
|
|
9397
|
-
metadata: {
|
|
9398
|
-
profile: {
|
|
9399
|
-
description: 'Private conversation with Bob Smith',
|
|
9400
|
-
tags: ['development', 'tech'],
|
|
9401
|
-
favorite: false,
|
|
9402
|
-
},
|
|
9403
|
-
},
|
|
9404
|
-
createdAt: new Date(now.getTime() - 259200000),
|
|
9405
|
-
updatedAt: new Date(now.getTime() - 7200000),
|
|
9259
|
+
createdAt: minutes(60 * 24 * 14),
|
|
9260
|
+
updatedAt: minutes(2),
|
|
9406
9261
|
},
|
|
9407
|
-
// Group Chat 1: Project Team (3-5 members)
|
|
9408
9262
|
{
|
|
9409
|
-
id:
|
|
9263
|
+
id: AX_CONVERSATION_DEMO_CONVERSATION_IDS.group,
|
|
9410
9264
|
type: 'group',
|
|
9411
|
-
title: '
|
|
9265
|
+
title: 'ACoreX Platform Team',
|
|
9266
|
+
description: 'Sprint planning, releases, and blockers',
|
|
9412
9267
|
avatar: 'https://i.pravatar.cc/150?img=50',
|
|
9413
9268
|
participants: [
|
|
9414
|
-
{ ...
|
|
9415
|
-
{ ...
|
|
9416
|
-
{ ...
|
|
9417
|
-
{ ...
|
|
9269
|
+
{ ...me, role: 'admin' },
|
|
9270
|
+
{ ...alice, role: 'member' },
|
|
9271
|
+
{ ...bob, role: 'member' },
|
|
9272
|
+
{ ...carol, role: 'member' },
|
|
9273
|
+
{ ...david, role: 'member' },
|
|
9418
9274
|
],
|
|
9419
|
-
lastMessageAt:
|
|
9420
|
-
unreadCount:
|
|
9275
|
+
lastMessageAt: minutes(8),
|
|
9276
|
+
unreadCount: 2,
|
|
9421
9277
|
status: { isTyping: false, typingUsers: [] },
|
|
9422
9278
|
settings: { notifications: true, showPreview: true },
|
|
9423
9279
|
archived: false,
|
|
9424
9280
|
metadata: {
|
|
9425
9281
|
profile: {
|
|
9426
|
-
description: '
|
|
9427
|
-
tags: ['work', '
|
|
9282
|
+
description: 'Cross-functional team working on the conversation module',
|
|
9283
|
+
tags: ['work', 'sprint', 'team'],
|
|
9428
9284
|
favorite: true,
|
|
9429
9285
|
groupInfo: {
|
|
9430
9286
|
createdBy: 'current-user',
|
|
9431
|
-
purpose: '
|
|
9287
|
+
purpose: 'Coordinate platform delivery and demos',
|
|
9432
9288
|
},
|
|
9433
9289
|
},
|
|
9434
9290
|
},
|
|
9435
|
-
createdAt:
|
|
9436
|
-
updatedAt:
|
|
9291
|
+
createdAt: minutes(60 * 24 * 30),
|
|
9292
|
+
updatedAt: minutes(8),
|
|
9437
9293
|
},
|
|
9438
|
-
// Group Chat 2: Design Team (5-10 members)
|
|
9439
9294
|
{
|
|
9440
|
-
id:
|
|
9441
|
-
type: '
|
|
9442
|
-
title: '
|
|
9443
|
-
|
|
9295
|
+
id: AX_CONVERSATION_DEMO_CONVERSATION_IDS.channel,
|
|
9296
|
+
type: 'channel',
|
|
9297
|
+
title: 'Product Updates',
|
|
9298
|
+
description: 'Official announcements and release notes',
|
|
9299
|
+
icon: 'fa-light fa-hashtag',
|
|
9444
9300
|
participants: [
|
|
9445
|
-
{ ...
|
|
9446
|
-
{ ...
|
|
9447
|
-
{ ...
|
|
9448
|
-
{ ...
|
|
9449
|
-
{ ...
|
|
9450
|
-
{ ...
|
|
9451
|
-
{ ...participants[8], role: 'member' },
|
|
9452
|
-
{ ...participants[10], role: 'member' },
|
|
9301
|
+
{ ...me, role: 'member' },
|
|
9302
|
+
{ ...carol, role: 'admin' },
|
|
9303
|
+
{ ...emma, role: 'admin' },
|
|
9304
|
+
{ ...alice, role: 'member' },
|
|
9305
|
+
{ ...bob, role: 'member' },
|
|
9306
|
+
{ ...david, role: 'member' },
|
|
9453
9307
|
],
|
|
9454
|
-
lastMessageAt:
|
|
9308
|
+
lastMessageAt: minutes(25),
|
|
9455
9309
|
unreadCount: 0,
|
|
9456
9310
|
status: { isTyping: false, typingUsers: [] },
|
|
9457
9311
|
settings: { notifications: true, showPreview: true },
|
|
9458
9312
|
archived: false,
|
|
9459
9313
|
metadata: {
|
|
9460
9314
|
profile: {
|
|
9461
|
-
description: '
|
|
9462
|
-
tags: ['
|
|
9463
|
-
|
|
9464
|
-
|
|
9465
|
-
|
|
9466
|
-
|
|
9315
|
+
description: 'Broadcast channel for product and engineering updates',
|
|
9316
|
+
tags: ['announcements', 'releases'],
|
|
9317
|
+
channelInfo: {
|
|
9318
|
+
createdBy: 'user-carol',
|
|
9319
|
+
isPublic: true,
|
|
9320
|
+
subscriberCount: 128,
|
|
9467
9321
|
},
|
|
9468
9322
|
},
|
|
9469
9323
|
},
|
|
9470
|
-
createdAt:
|
|
9471
|
-
updatedAt:
|
|
9472
|
-
},
|
|
9473
|
-
// Group: icon-only demo (no conversation avatar image; optional `icon` for chrome that reads it)
|
|
9474
|
-
{
|
|
9475
|
-
id: 'conv-icon-demo',
|
|
9476
|
-
type: 'group',
|
|
9477
|
-
title: 'Icon-only avatars (demo)',
|
|
9478
|
-
icon: 'fa-light fa-users',
|
|
9479
|
-
participants: [
|
|
9480
|
-
{ ...participants[0], role: 'admin' },
|
|
9481
|
-
{ ...participants[15], role: 'member' },
|
|
9482
|
-
],
|
|
9483
|
-
lastMessageAt: new Date(now.getTime() - 120000),
|
|
9484
|
-
unreadCount: 1,
|
|
9485
|
-
status: { isTyping: false, typingUsers: [] },
|
|
9486
|
-
settings: { notifications: true, showPreview: true },
|
|
9487
|
-
archived: false,
|
|
9488
|
-
metadata: {
|
|
9489
|
-
profile: {
|
|
9490
|
-
description: 'Demo: sender has no avatar URL — Font Awesome icon from participant/conversation',
|
|
9491
|
-
tags: ['demo', 'icon'],
|
|
9492
|
-
},
|
|
9493
|
-
},
|
|
9494
|
-
createdAt: new Date(now.getTime() - 86400000),
|
|
9495
|
-
updatedAt: new Date(now.getTime() - 120000),
|
|
9324
|
+
createdAt: minutes(60 * 24 * 90),
|
|
9325
|
+
updatedAt: minutes(25),
|
|
9496
9326
|
},
|
|
9497
9327
|
];
|
|
9498
|
-
|
|
9499
|
-
|
|
9500
|
-
|
|
9501
|
-
|
|
9502
|
-
|
|
9503
|
-
|
|
9504
|
-
|
|
9505
|
-
|
|
9506
|
-
|
|
9507
|
-
|
|
9508
|
-
|
|
9509
|
-
|
|
9510
|
-
|
|
9511
|
-
|
|
9512
|
-
|
|
9513
|
-
|
|
9514
|
-
reactions: [],
|
|
9515
|
-
metadata: {},
|
|
9516
|
-
}, {
|
|
9517
|
-
id: 'msg-1-2',
|
|
9518
|
-
conversationId: 'conv-1',
|
|
9519
|
-
senderId: 'current-user',
|
|
9520
|
-
type: 'text',
|
|
9521
|
-
timestamp: new Date(now.getTime() - 270000),
|
|
9522
|
-
payload: { type: 'text', text: "I'm good! Working on the new project." },
|
|
9523
|
-
status: 'read',
|
|
9524
|
-
reactions: [{ emoji: '👍', userId: 'user-2', timestamp: new Date(now.getTime() - 265000) }],
|
|
9525
|
-
metadata: {},
|
|
9526
|
-
}, {
|
|
9527
|
-
id: 'msg-1-3',
|
|
9528
|
-
conversationId: 'conv-1',
|
|
9529
|
-
senderId: 'user-2',
|
|
9530
|
-
type: 'image',
|
|
9531
|
-
timestamp: new Date(now.getTime() - 240000),
|
|
9532
|
-
payload: {
|
|
9533
|
-
type: 'image',
|
|
9534
|
-
images: [
|
|
9535
|
-
{
|
|
9536
|
-
url: 'https://picsum.photos/400/300',
|
|
9537
|
-
thumbnailUrl: 'https://picsum.photos/200/150',
|
|
9538
|
-
width: 400,
|
|
9539
|
-
height: 300,
|
|
9540
|
-
mimeType: 'image/jpeg',
|
|
9541
|
-
},
|
|
9542
|
-
],
|
|
9543
|
-
caption: 'Check out this design!',
|
|
9544
|
-
},
|
|
9545
|
-
status: 'read',
|
|
9546
|
-
reactions: [{ emoji: '🔥', userId: 'current-user', timestamp: new Date(now.getTime() - 235000) }],
|
|
9547
|
-
metadata: {},
|
|
9548
|
-
}, {
|
|
9549
|
-
id: 'msg-1-4',
|
|
9550
|
-
conversationId: 'conv-1',
|
|
9551
|
-
senderId: 'current-user',
|
|
9552
|
-
type: 'voice',
|
|
9553
|
-
timestamp: new Date(now.getTime() - 180000),
|
|
9554
|
-
payload: {
|
|
9555
|
-
type: 'voice',
|
|
9556
|
-
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
|
|
9557
|
-
duration: 15,
|
|
9558
|
-
size: 245760,
|
|
9559
|
-
waveform: [0.2, 0.4, 0.6, 0.8, 0.5, 0.3, 0.7, 0.9, 0.4, 0.2],
|
|
9328
|
+
for (const conversation of conversations) {
|
|
9329
|
+
storage.conversations.set(conversation.id, conversation);
|
|
9330
|
+
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
9331
|
+
}
|
|
9332
|
+
const messages = [
|
|
9333
|
+
// Private — Alice
|
|
9334
|
+
{
|
|
9335
|
+
id: 'msg-private-1',
|
|
9336
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.private,
|
|
9337
|
+
senderId: 'user-alice',
|
|
9338
|
+
type: 'text',
|
|
9339
|
+
timestamp: minutes(18),
|
|
9340
|
+
payload: { type: 'text', text: 'Hi! I pushed the updated composer mockups to Figma.' },
|
|
9341
|
+
status: 'read',
|
|
9342
|
+
reactions: [],
|
|
9343
|
+
metadata: {},
|
|
9560
9344
|
},
|
|
9561
|
-
|
|
9562
|
-
|
|
9563
|
-
|
|
9564
|
-
|
|
9565
|
-
|
|
9566
|
-
|
|
9567
|
-
|
|
9568
|
-
|
|
9569
|
-
|
|
9570
|
-
|
|
9571
|
-
type: 'audio',
|
|
9572
|
-
audios: [
|
|
9573
|
-
{
|
|
9574
|
-
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3',
|
|
9575
|
-
title: 'Background Music',
|
|
9576
|
-
duration: 180,
|
|
9577
|
-
size: 3145728,
|
|
9578
|
-
mimeType: 'audio/mpeg',
|
|
9579
|
-
},
|
|
9580
|
-
],
|
|
9345
|
+
{
|
|
9346
|
+
id: 'msg-private-2',
|
|
9347
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.private,
|
|
9348
|
+
senderId: 'current-user',
|
|
9349
|
+
type: 'text',
|
|
9350
|
+
timestamp: minutes(15),
|
|
9351
|
+
payload: { type: 'text', text: 'Nice — I will wire them into the showcase after lunch.' },
|
|
9352
|
+
status: 'read',
|
|
9353
|
+
reactions: [{ emoji: '👍', userId: 'user-alice', timestamp: minutes(14) }],
|
|
9354
|
+
metadata: {},
|
|
9581
9355
|
},
|
|
9582
|
-
|
|
9583
|
-
|
|
9584
|
-
|
|
9585
|
-
|
|
9586
|
-
|
|
9587
|
-
|
|
9588
|
-
|
|
9589
|
-
|
|
9590
|
-
|
|
9591
|
-
|
|
9592
|
-
|
|
9593
|
-
|
|
9594
|
-
|
|
9595
|
-
|
|
9356
|
+
{
|
|
9357
|
+
id: 'msg-private-3',
|
|
9358
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.private,
|
|
9359
|
+
senderId: 'user-alice',
|
|
9360
|
+
type: 'image',
|
|
9361
|
+
timestamp: minutes(5),
|
|
9362
|
+
payload: {
|
|
9363
|
+
type: 'image',
|
|
9364
|
+
images: [
|
|
9365
|
+
{
|
|
9366
|
+
url: 'https://picsum.photos/seed/acorex-composer/640/400',
|
|
9367
|
+
thumbnailUrl: 'https://picsum.photos/seed/acorex-composer/320/200',
|
|
9368
|
+
width: 640,
|
|
9369
|
+
height: 400,
|
|
9370
|
+
mimeType: 'image/jpeg',
|
|
9371
|
+
},
|
|
9372
|
+
],
|
|
9373
|
+
caption: 'Sidebar + composer spacing tokens',
|
|
9374
|
+
},
|
|
9375
|
+
status: 'read',
|
|
9376
|
+
reactions: [],
|
|
9377
|
+
metadata: {},
|
|
9596
9378
|
},
|
|
9597
|
-
|
|
9598
|
-
|
|
9599
|
-
|
|
9600
|
-
|
|
9601
|
-
|
|
9602
|
-
|
|
9603
|
-
|
|
9604
|
-
|
|
9605
|
-
|
|
9606
|
-
|
|
9607
|
-
type: 'sticker',
|
|
9608
|
-
url: 'https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f44d.png',
|
|
9609
|
-
packId: 'pack-1',
|
|
9610
|
-
id: 'sticker-thumbs-up',
|
|
9611
|
-
animated: false,
|
|
9379
|
+
{
|
|
9380
|
+
id: 'msg-private-4',
|
|
9381
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.private,
|
|
9382
|
+
senderId: 'user-alice',
|
|
9383
|
+
type: 'text',
|
|
9384
|
+
timestamp: minutes(2),
|
|
9385
|
+
payload: { type: 'text', text: 'Let me know if the 8px grid works for the message list.' },
|
|
9386
|
+
status: 'delivered',
|
|
9387
|
+
reactions: [],
|
|
9388
|
+
metadata: {},
|
|
9612
9389
|
},
|
|
9613
|
-
|
|
9614
|
-
|
|
9615
|
-
|
|
9616
|
-
|
|
9617
|
-
|
|
9618
|
-
|
|
9619
|
-
|
|
9620
|
-
|
|
9621
|
-
|
|
9622
|
-
|
|
9623
|
-
|
|
9624
|
-
files: [
|
|
9625
|
-
{
|
|
9626
|
-
url: 'https://example.com/document.pdf',
|
|
9627
|
-
name: 'Project_Proposal.pdf',
|
|
9628
|
-
size: 2048576,
|
|
9629
|
-
mimeType: 'application/pdf',
|
|
9630
|
-
},
|
|
9631
|
-
],
|
|
9390
|
+
// Group — Platform Team
|
|
9391
|
+
{
|
|
9392
|
+
id: 'msg-group-1',
|
|
9393
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.group,
|
|
9394
|
+
senderId: 'user-carol',
|
|
9395
|
+
type: 'text',
|
|
9396
|
+
timestamp: minutes(22),
|
|
9397
|
+
payload: { type: 'text', text: 'Sprint goal: ship the conversation showcase with realistic demo data.' },
|
|
9398
|
+
status: 'read',
|
|
9399
|
+
reactions: [],
|
|
9400
|
+
metadata: {},
|
|
9632
9401
|
},
|
|
9633
|
-
|
|
9634
|
-
|
|
9635
|
-
|
|
9636
|
-
|
|
9637
|
-
|
|
9638
|
-
|
|
9639
|
-
|
|
9640
|
-
|
|
9641
|
-
|
|
9642
|
-
|
|
9643
|
-
timestamp: new Date(now.getTime() - 7200000),
|
|
9644
|
-
payload: { type: 'text', text: 'Did you see the latest updates?' },
|
|
9645
|
-
status: 'read',
|
|
9646
|
-
reactions: [],
|
|
9647
|
-
metadata: {},
|
|
9648
|
-
}, {
|
|
9649
|
-
id: 'msg-2-2',
|
|
9650
|
-
conversationId: 'conv-2',
|
|
9651
|
-
senderId: 'current-user',
|
|
9652
|
-
type: 'video',
|
|
9653
|
-
timestamp: new Date(now.getTime() - 7180000),
|
|
9654
|
-
payload: {
|
|
9655
|
-
type: 'video',
|
|
9656
|
-
videos: [
|
|
9657
|
-
{
|
|
9658
|
-
url: 'https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',
|
|
9659
|
-
thumbnailUrl: 'https://picsum.photos/640/360',
|
|
9660
|
-
duration: 60,
|
|
9661
|
-
size: 1048576,
|
|
9662
|
-
width: 1280,
|
|
9663
|
-
height: 720,
|
|
9664
|
-
mimeType: 'video/mp4',
|
|
9665
|
-
},
|
|
9666
|
-
],
|
|
9402
|
+
{
|
|
9403
|
+
id: 'msg-group-2',
|
|
9404
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.group,
|
|
9405
|
+
senderId: 'user-bob',
|
|
9406
|
+
type: 'text',
|
|
9407
|
+
timestamp: minutes(18),
|
|
9408
|
+
payload: { type: 'text', text: 'IndexedDB APIs are ready — we can trim the seed to three chats.' },
|
|
9409
|
+
status: 'read',
|
|
9410
|
+
reactions: [{ emoji: '✅', userId: 'user-carol', timestamp: minutes(17) }],
|
|
9411
|
+
metadata: {},
|
|
9667
9412
|
},
|
|
9668
|
-
|
|
9669
|
-
|
|
9670
|
-
|
|
9671
|
-
|
|
9672
|
-
|
|
9673
|
-
|
|
9674
|
-
|
|
9675
|
-
|
|
9676
|
-
|
|
9677
|
-
|
|
9678
|
-
timestamp: new Date(now.getTime() - 3700000),
|
|
9679
|
-
payload: { type: 'text', text: 'Team meeting at 3 PM today!' },
|
|
9680
|
-
status: 'read',
|
|
9681
|
-
reactions: [
|
|
9682
|
-
{ emoji: '👍', userId: 'current-user', timestamp: new Date(now.getTime() - 3695000) },
|
|
9683
|
-
{ emoji: '👍', userId: 'user-3', timestamp: new Date(now.getTime() - 3690000) },
|
|
9684
|
-
],
|
|
9685
|
-
metadata: {},
|
|
9686
|
-
}, {
|
|
9687
|
-
id: 'msg-3-2',
|
|
9688
|
-
conversationId: 'conv-3',
|
|
9689
|
-
senderId: 'user-5',
|
|
9690
|
-
type: 'image',
|
|
9691
|
-
timestamp: new Date(now.getTime() - 3650000),
|
|
9692
|
-
payload: {
|
|
9693
|
-
type: 'image',
|
|
9694
|
-
images: [
|
|
9695
|
-
{
|
|
9696
|
-
url: 'https://picsum.photos/800/600',
|
|
9697
|
-
thumbnailUrl: 'https://picsum.photos/200/150',
|
|
9698
|
-
width: 800,
|
|
9699
|
-
height: 600,
|
|
9700
|
-
mimeType: 'image/jpeg',
|
|
9701
|
-
},
|
|
9702
|
-
],
|
|
9703
|
-
caption: 'Sprint planning board',
|
|
9413
|
+
{
|
|
9414
|
+
id: 'msg-group-3',
|
|
9415
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.group,
|
|
9416
|
+
senderId: 'user-david',
|
|
9417
|
+
type: 'text',
|
|
9418
|
+
timestamp: minutes(12),
|
|
9419
|
+
payload: { type: 'text', text: 'Staging deploy finished. Ping me if the demo DB needs a reset.' },
|
|
9420
|
+
status: 'read',
|
|
9421
|
+
reactions: [],
|
|
9422
|
+
metadata: {},
|
|
9704
9423
|
},
|
|
9705
|
-
|
|
9706
|
-
|
|
9707
|
-
|
|
9708
|
-
|
|
9709
|
-
|
|
9710
|
-
|
|
9711
|
-
|
|
9712
|
-
|
|
9713
|
-
|
|
9714
|
-
|
|
9715
|
-
status: 'read',
|
|
9716
|
-
reactions: [{ emoji: '🎉', userId: 'user-2', timestamp: new Date(now.getTime() - 3595000) }],
|
|
9717
|
-
metadata: {},
|
|
9718
|
-
}, {
|
|
9719
|
-
id: 'msg-3-4',
|
|
9720
|
-
conversationId: 'conv-3',
|
|
9721
|
-
senderId: 'user-2',
|
|
9722
|
-
type: 'text',
|
|
9723
|
-
timestamp: new Date(now.getTime() - 3550000),
|
|
9724
|
-
payload: { type: 'text', text: 'Thanks! Looking forward to it.' },
|
|
9725
|
-
status: 'delivered',
|
|
9726
|
-
reactions: [],
|
|
9727
|
-
metadata: {},
|
|
9728
|
-
});
|
|
9729
|
-
// Conv-4 (Group: Design Team) - Design-related messages
|
|
9730
|
-
messages.push({
|
|
9731
|
-
id: 'msg-4-1',
|
|
9732
|
-
conversationId: 'conv-4',
|
|
9733
|
-
senderId: 'user-7',
|
|
9734
|
-
type: 'text',
|
|
9735
|
-
timestamp: new Date(now.getTime() - 10900000),
|
|
9736
|
-
payload: { type: 'text', text: 'New design mockups are ready for review' },
|
|
9737
|
-
status: 'read',
|
|
9738
|
-
reactions: [],
|
|
9739
|
-
metadata: {},
|
|
9740
|
-
}, {
|
|
9741
|
-
id: 'msg-4-2',
|
|
9742
|
-
conversationId: 'conv-4',
|
|
9743
|
-
senderId: 'user-8',
|
|
9744
|
-
type: 'file',
|
|
9745
|
-
timestamp: new Date(now.getTime() - 10850000),
|
|
9746
|
-
payload: {
|
|
9747
|
-
type: 'file',
|
|
9748
|
-
files: [
|
|
9749
|
-
{
|
|
9750
|
-
url: 'https://example.com/designs.zip',
|
|
9751
|
-
name: 'UI_Designs_v2.zip',
|
|
9752
|
-
size: 15728640,
|
|
9753
|
-
mimeType: 'application/zip',
|
|
9754
|
-
},
|
|
9755
|
-
],
|
|
9424
|
+
{
|
|
9425
|
+
id: 'msg-group-4',
|
|
9426
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.group,
|
|
9427
|
+
senderId: 'current-user',
|
|
9428
|
+
type: 'text',
|
|
9429
|
+
timestamp: minutes(10),
|
|
9430
|
+
payload: { type: 'text', text: 'On it — cleaning up empty chats and pagination mocks now.' },
|
|
9431
|
+
status: 'read',
|
|
9432
|
+
reactions: [],
|
|
9433
|
+
metadata: {},
|
|
9756
9434
|
},
|
|
9757
|
-
|
|
9758
|
-
|
|
9759
|
-
|
|
9760
|
-
|
|
9761
|
-
|
|
9762
|
-
|
|
9763
|
-
|
|
9764
|
-
|
|
9765
|
-
|
|
9766
|
-
|
|
9767
|
-
type: 'sticker',
|
|
9768
|
-
url: 'https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f389.png',
|
|
9769
|
-
packId: 'pack-1',
|
|
9770
|
-
id: 'sticker-party',
|
|
9771
|
-
animated: false,
|
|
9435
|
+
{
|
|
9436
|
+
id: 'msg-group-5',
|
|
9437
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.group,
|
|
9438
|
+
senderId: 'user-alice',
|
|
9439
|
+
type: 'text',
|
|
9440
|
+
timestamp: minutes(8),
|
|
9441
|
+
payload: { type: 'text', text: 'Design review is tomorrow at 10:00. Please check the group avatar.' },
|
|
9442
|
+
status: 'delivered',
|
|
9443
|
+
reactions: [{ emoji: '🎨', userId: 'current-user', timestamp: minutes(7) }],
|
|
9444
|
+
metadata: {},
|
|
9772
9445
|
},
|
|
9773
|
-
|
|
9774
|
-
|
|
9775
|
-
|
|
9776
|
-
|
|
9777
|
-
|
|
9778
|
-
messages.push({
|
|
9779
|
-
id: 'msg-icon-1',
|
|
9780
|
-
conversationId: 'conv-icon-demo',
|
|
9781
|
-
senderId: 'demo-icon-only-user',
|
|
9782
|
-
type: 'text',
|
|
9783
|
-
timestamp: new Date(now.getTime() - 300000),
|
|
9784
|
-
payload: {
|
|
9446
|
+
// Channel — Product Updates
|
|
9447
|
+
{
|
|
9448
|
+
id: 'msg-channel-1',
|
|
9449
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.channel,
|
|
9450
|
+
senderId: 'user-carol',
|
|
9785
9451
|
type: 'text',
|
|
9786
|
-
|
|
9452
|
+
timestamp: minutes(90),
|
|
9453
|
+
payload: {
|
|
9454
|
+
type: 'text',
|
|
9455
|
+
text: '📢 v2.4 is live: composer plugins, file validation, and improved sidebar sorting.',
|
|
9456
|
+
},
|
|
9457
|
+
status: 'read',
|
|
9458
|
+
reactions: [{ emoji: '🚀', userId: 'user-bob', timestamp: minutes(89) }],
|
|
9459
|
+
metadata: {},
|
|
9787
9460
|
},
|
|
9788
|
-
|
|
9789
|
-
|
|
9790
|
-
|
|
9791
|
-
|
|
9792
|
-
id: 'msg-icon-2',
|
|
9793
|
-
conversationId: 'conv-icon-demo',
|
|
9794
|
-
senderId: 'current-user',
|
|
9795
|
-
type: 'text',
|
|
9796
|
-
timestamp: new Date(now.getTime() - 240000),
|
|
9797
|
-
payload: {
|
|
9461
|
+
{
|
|
9462
|
+
id: 'msg-channel-2',
|
|
9463
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.channel,
|
|
9464
|
+
senderId: 'user-emma',
|
|
9798
9465
|
type: 'text',
|
|
9799
|
-
|
|
9466
|
+
timestamp: minutes(60),
|
|
9467
|
+
payload: {
|
|
9468
|
+
type: 'text',
|
|
9469
|
+
text: '✅ Regression suite passed on Chrome, Firefox, and Safari.',
|
|
9470
|
+
},
|
|
9471
|
+
status: 'read',
|
|
9472
|
+
reactions: [],
|
|
9473
|
+
metadata: {},
|
|
9474
|
+
},
|
|
9475
|
+
{
|
|
9476
|
+
id: 'msg-channel-3',
|
|
9477
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.channel,
|
|
9478
|
+
senderId: 'user-carol',
|
|
9479
|
+
type: 'file',
|
|
9480
|
+
timestamp: minutes(30),
|
|
9481
|
+
payload: {
|
|
9482
|
+
type: 'file',
|
|
9483
|
+
files: [
|
|
9484
|
+
{
|
|
9485
|
+
url: 'https://example.com/acorex-conversation-release-notes.pdf',
|
|
9486
|
+
name: 'ACoreX_Conversation_Release_Notes.pdf',
|
|
9487
|
+
size: 524_288,
|
|
9488
|
+
mimeType: 'application/pdf',
|
|
9489
|
+
},
|
|
9490
|
+
],
|
|
9491
|
+
},
|
|
9492
|
+
status: 'read',
|
|
9493
|
+
reactions: [],
|
|
9494
|
+
metadata: {},
|
|
9800
9495
|
},
|
|
9801
|
-
|
|
9802
|
-
|
|
9803
|
-
|
|
9804
|
-
|
|
9805
|
-
id: 'msg-icon-3',
|
|
9806
|
-
conversationId: 'conv-icon-demo',
|
|
9807
|
-
senderId: 'demo-icon-only-user',
|
|
9808
|
-
type: 'text',
|
|
9809
|
-
timestamp: new Date(now.getTime() - 120000),
|
|
9810
|
-
payload: {
|
|
9496
|
+
{
|
|
9497
|
+
id: 'msg-channel-4',
|
|
9498
|
+
conversationId: AX_CONVERSATION_DEMO_CONVERSATION_IDS.channel,
|
|
9499
|
+
senderId: 'user-carol',
|
|
9811
9500
|
type: 'text',
|
|
9812
|
-
|
|
9501
|
+
timestamp: minutes(25),
|
|
9502
|
+
payload: {
|
|
9503
|
+
type: 'text',
|
|
9504
|
+
text: 'Next up: voice messages in the composer and Storybook coverage for message renderers.',
|
|
9505
|
+
},
|
|
9506
|
+
status: 'read',
|
|
9507
|
+
reactions: [],
|
|
9508
|
+
metadata: {},
|
|
9813
9509
|
},
|
|
9814
|
-
|
|
9815
|
-
|
|
9816
|
-
|
|
9817
|
-
|
|
9818
|
-
|
|
9819
|
-
|
|
9820
|
-
|
|
9821
|
-
|
|
9822
|
-
|
|
9823
|
-
|
|
9824
|
-
|
|
9825
|
-
|
|
9826
|
-
|
|
9827
|
-
|
|
9828
|
-
|
|
9829
|
-
|
|
9830
|
-
|
|
9831
|
-
|
|
9832
|
-
|
|
9510
|
+
];
|
|
9511
|
+
for (const message of messages) {
|
|
9512
|
+
registerChatMessage(message);
|
|
9513
|
+
await axConversationIndexedDbStorage.putMessage(message);
|
|
9514
|
+
}
|
|
9515
|
+
const lastByConversation = new Map();
|
|
9516
|
+
for (const message of messages) {
|
|
9517
|
+
const current = lastByConversation.get(message.conversationId);
|
|
9518
|
+
if (!current || message.timestamp > current.timestamp) {
|
|
9519
|
+
lastByConversation.set(message.conversationId, message);
|
|
9520
|
+
}
|
|
9521
|
+
}
|
|
9522
|
+
for (const conversation of conversations) {
|
|
9523
|
+
const lastMessage = lastByConversation.get(conversation.id);
|
|
9524
|
+
if (lastMessage) {
|
|
9525
|
+
conversation.lastMessage = lastMessage;
|
|
9526
|
+
conversation.lastMessageAt = lastMessage.timestamp;
|
|
9527
|
+
conversation.updatedAt = lastMessage.timestamp;
|
|
9528
|
+
}
|
|
9529
|
+
storage.conversations.set(conversation.id, conversation);
|
|
9530
|
+
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
9833
9531
|
}
|
|
9834
9532
|
await axConversationIndexedDbStorage.putSetting('isSeeded', true);
|
|
9533
|
+
await axConversationIndexedDbStorage.putSetting('demoSeedVersion', AX_CONVERSATION_DEMO_SEED_VERSION);
|
|
9835
9534
|
storage.markSeeded();
|
|
9836
|
-
await ensurePaginationDemoData();
|
|
9837
9535
|
storage.startDemoSimulations();
|
|
9838
9536
|
}
|
|
9839
9537
|
|
|
9840
9538
|
var sharedStorage_seed = /*#__PURE__*/Object.freeze({
|
|
9841
9539
|
__proto__: null,
|
|
9540
|
+
AX_CONVERSATION_DEMO_CONVERSATION_IDS: AX_CONVERSATION_DEMO_CONVERSATION_IDS,
|
|
9842
9541
|
seedSharedStorageInitialData: seedSharedStorageInitialData
|
|
9843
9542
|
});
|
|
9844
9543
|
|
|
@@ -9923,23 +9622,36 @@ function paginateChatOldestFirst(sortedOldestFirst, pagination) {
|
|
|
9923
9622
|
};
|
|
9924
9623
|
}
|
|
9925
9624
|
|
|
9625
|
+
/**
|
|
9626
|
+
* Pagination demo data — disabled for the minimal 3-chat showcase seed.
|
|
9627
|
+
* Kept as a no-op so existing imports remain valid.
|
|
9628
|
+
*/
|
|
9629
|
+
/** @deprecated Pagination demo chat removed from default seed. */
|
|
9630
|
+
const AX_MESSAGE_PAGINATION_CONVERSATION_ID = 'conv-pag-msgs';
|
|
9631
|
+
/** No-op: showcase uses a fixed 3-conversation seed (private, group, channel). */
|
|
9632
|
+
async function ensurePaginationDemoData() {
|
|
9633
|
+
return;
|
|
9634
|
+
}
|
|
9635
|
+
|
|
9926
9636
|
/**
|
|
9927
9637
|
* IndexedDB User API Implementation
|
|
9928
9638
|
* Implements AXConversationUserApi using IndexedDB backend
|
|
9929
9639
|
*/
|
|
9930
9640
|
class AXConversationIndexedDbUserApi extends AXConversationUserApi {
|
|
9641
|
+
constructor() {
|
|
9642
|
+
super(...arguments);
|
|
9643
|
+
this.API_DELAY_MS = 2000;
|
|
9644
|
+
}
|
|
9931
9645
|
// =====================
|
|
9932
9646
|
// User Profile
|
|
9933
9647
|
// =====================
|
|
9934
9648
|
async getCurrentUser() {
|
|
9935
|
-
|
|
9936
|
-
|
|
9937
|
-
throw this.createError('USER_NOT_FOUND', 'Current user not found', 404);
|
|
9938
|
-
}
|
|
9939
|
-
return user;
|
|
9649
|
+
await this.delay(this.API_DELAY_MS);
|
|
9650
|
+
return this.getCurrentUserWithoutDelay();
|
|
9940
9651
|
}
|
|
9941
9652
|
async updateProfile(updates) {
|
|
9942
|
-
|
|
9653
|
+
await this.delay(this.API_DELAY_MS);
|
|
9654
|
+
const user = await this.getCurrentUserWithoutDelay();
|
|
9943
9655
|
const { profile: profileUpdates, custom, bio, phone, email, ...participantUpdates } = updates;
|
|
9944
9656
|
const legacyProfile = {};
|
|
9945
9657
|
if (bio !== undefined)
|
|
@@ -9962,6 +9674,7 @@ class AXConversationIndexedDbUserApi extends AXConversationUserApi {
|
|
|
9962
9674
|
};
|
|
9963
9675
|
}
|
|
9964
9676
|
async uploadAvatar(file) {
|
|
9677
|
+
await this.delay(this.API_DELAY_MS);
|
|
9965
9678
|
// Mock upload - return a data URL
|
|
9966
9679
|
return new Promise((resolve) => {
|
|
9967
9680
|
const reader = new FileReader();
|
|
@@ -9973,24 +9686,16 @@ class AXConversationIndexedDbUserApi extends AXConversationUserApi {
|
|
|
9973
9686
|
// User Discovery
|
|
9974
9687
|
// =====================
|
|
9975
9688
|
async getUsers(pagination = { page: 0, pageSize: 50 }, filters) {
|
|
9976
|
-
|
|
9977
|
-
|
|
9978
|
-
if (filters?.query) {
|
|
9979
|
-
const q = filters.query.toLowerCase();
|
|
9980
|
-
filtered = filtered.filter((u) => {
|
|
9981
|
-
const name = u.name.toLowerCase();
|
|
9982
|
-
const desc = (u.description ?? '').toLowerCase();
|
|
9983
|
-
return name.includes(q) || desc.includes(q);
|
|
9984
|
-
});
|
|
9985
|
-
}
|
|
9986
|
-
filtered.sort((a, b) => a.name.localeCompare(b.name));
|
|
9987
|
-
return paginateChatOldestFirst(filtered, pagination);
|
|
9689
|
+
await this.delay(this.API_DELAY_MS);
|
|
9690
|
+
return this.fetchUsers(pagination, filters);
|
|
9988
9691
|
}
|
|
9989
9692
|
async searchUsers(query) {
|
|
9990
|
-
|
|
9693
|
+
await this.delay(this.API_DELAY_MS);
|
|
9694
|
+
const result = await this.fetchUsers({ page: 0, pageSize: 1000 }, { query });
|
|
9991
9695
|
return result.items;
|
|
9992
9696
|
}
|
|
9993
9697
|
async getUserById(userId) {
|
|
9698
|
+
await this.delay(this.API_DELAY_MS);
|
|
9994
9699
|
const user = axConversationSharedStorage.participants.get(userId);
|
|
9995
9700
|
if (!user) {
|
|
9996
9701
|
throw this.createError('USER_NOT_FOUND', `User ${userId} not found`, 404);
|
|
@@ -9998,6 +9703,7 @@ class AXConversationIndexedDbUserApi extends AXConversationUserApi {
|
|
|
9998
9703
|
return user;
|
|
9999
9704
|
}
|
|
10000
9705
|
async getUsersByIds(userIds) {
|
|
9706
|
+
await this.delay(this.API_DELAY_MS);
|
|
10001
9707
|
return userIds
|
|
10002
9708
|
.map((id) => axConversationSharedStorage.participants.get(id))
|
|
10003
9709
|
.filter((u) => u !== undefined);
|
|
@@ -10006,6 +9712,7 @@ class AXConversationIndexedDbUserApi extends AXConversationUserApi {
|
|
|
10006
9712
|
// Presence Management
|
|
10007
9713
|
// =====================
|
|
10008
9714
|
async getUserPresence(userId) {
|
|
9715
|
+
await this.delay(this.API_DELAY_MS);
|
|
10009
9716
|
return {
|
|
10010
9717
|
userId,
|
|
10011
9718
|
status: 'online',
|
|
@@ -10013,33 +9720,29 @@ class AXConversationIndexedDbUserApi extends AXConversationUserApi {
|
|
|
10013
9720
|
};
|
|
10014
9721
|
}
|
|
10015
9722
|
async updatePresence(_status, _statusText) {
|
|
10016
|
-
|
|
10017
|
-
await Promise.resolve();
|
|
9723
|
+
await this.delay(this.API_DELAY_MS);
|
|
10018
9724
|
}
|
|
10019
9725
|
// =====================
|
|
10020
9726
|
// User Blocking & Reporting
|
|
10021
9727
|
// =====================
|
|
10022
9728
|
async blockUser(_userId, _reason) {
|
|
10023
|
-
|
|
10024
|
-
await Promise.resolve();
|
|
9729
|
+
await this.delay(this.API_DELAY_MS);
|
|
10025
9730
|
}
|
|
10026
9731
|
async unblockUser(_userId) {
|
|
10027
|
-
|
|
10028
|
-
await Promise.resolve();
|
|
9732
|
+
await this.delay(this.API_DELAY_MS);
|
|
10029
9733
|
}
|
|
10030
9734
|
async getBlockedUsers() {
|
|
10031
|
-
|
|
9735
|
+
await this.delay(this.API_DELAY_MS);
|
|
10032
9736
|
return [];
|
|
10033
9737
|
}
|
|
10034
9738
|
async reportUser(_userId, _reason) {
|
|
10035
|
-
|
|
10036
|
-
await Promise.resolve();
|
|
9739
|
+
await this.delay(this.API_DELAY_MS);
|
|
10037
9740
|
}
|
|
10038
9741
|
// =====================
|
|
10039
9742
|
// User Settings & Preferences
|
|
10040
9743
|
// =====================
|
|
10041
9744
|
async getUserSettings() {
|
|
10042
|
-
|
|
9745
|
+
await this.delay(this.API_DELAY_MS);
|
|
10043
9746
|
return {
|
|
10044
9747
|
theme: 'light',
|
|
10045
9748
|
language: 'en',
|
|
@@ -10047,8 +9750,34 @@ class AXConversationIndexedDbUserApi extends AXConversationUserApi {
|
|
|
10047
9750
|
};
|
|
10048
9751
|
}
|
|
10049
9752
|
async updateUserSettings(_settings) {
|
|
10050
|
-
|
|
10051
|
-
|
|
9753
|
+
await this.delay(this.API_DELAY_MS);
|
|
9754
|
+
}
|
|
9755
|
+
// =====================
|
|
9756
|
+
// Private Helpers
|
|
9757
|
+
// =====================
|
|
9758
|
+
getCurrentUserWithoutDelay() {
|
|
9759
|
+
const user = axConversationSharedStorage.participants.get(axConversationSharedStorage.currentUserId);
|
|
9760
|
+
if (!user) {
|
|
9761
|
+
throw this.createError('USER_NOT_FOUND', 'Current user not found', 404);
|
|
9762
|
+
}
|
|
9763
|
+
return Promise.resolve(user);
|
|
9764
|
+
}
|
|
9765
|
+
fetchUsers(pagination, filters) {
|
|
9766
|
+
const users = Array.from(axConversationSharedStorage.participants.values());
|
|
9767
|
+
let filtered = users.filter((u) => u.id !== axConversationSharedStorage.currentUserId);
|
|
9768
|
+
if (filters?.query) {
|
|
9769
|
+
const q = filters.query.toLowerCase();
|
|
9770
|
+
filtered = filtered.filter((u) => {
|
|
9771
|
+
const name = u.name.toLowerCase();
|
|
9772
|
+
const desc = (u.description ?? '').toLowerCase();
|
|
9773
|
+
return name.includes(q) || desc.includes(q);
|
|
9774
|
+
});
|
|
9775
|
+
}
|
|
9776
|
+
filtered.sort((a, b) => a.name.localeCompare(b.name));
|
|
9777
|
+
return Promise.resolve(paginateChatOldestFirst(filtered, pagination));
|
|
9778
|
+
}
|
|
9779
|
+
delay(ms) {
|
|
9780
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
10052
9781
|
}
|
|
10053
9782
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationIndexedDbUserApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
10054
9783
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationIndexedDbUserApi }); }
|
|
@@ -10071,6 +9800,15 @@ class AXConversationIndexedDbConversationApi extends AXConversationApi {
|
|
|
10071
9800
|
if (creatorId) {
|
|
10072
9801
|
participantIds.add(creatorId);
|
|
10073
9802
|
}
|
|
9803
|
+
if (data.type === 'private' && !data.forceCreate && creatorId) {
|
|
9804
|
+
const peerUserId = [...participantIds].find((id) => id !== creatorId);
|
|
9805
|
+
if (peerUserId) {
|
|
9806
|
+
const existing = findExistingPrivateConversation(Array.from(axConversationSharedStorage.conversations.values()), creatorId, peerUserId);
|
|
9807
|
+
if (existing) {
|
|
9808
|
+
return existing;
|
|
9809
|
+
}
|
|
9810
|
+
}
|
|
9811
|
+
}
|
|
10074
9812
|
const conversation = {
|
|
10075
9813
|
id: `conv-${Date.now()}`,
|
|
10076
9814
|
type: data.type,
|
|
@@ -11776,7 +11514,7 @@ class AXConversationPickerToolbarComponent {
|
|
|
11776
11514
|
...(ngDevMode ? [{ debugName: "addMoreLabel" }] : /* istanbul ignore next */ []));
|
|
11777
11515
|
}
|
|
11778
11516
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationPickerToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
11779
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.8", type: AXConversationPickerToolbarComponent, isStandalone: true, selector: "ax-conversation-picker-toolbar", inputs: { countLabel: { classPropertyName: "countLabel", publicName: "countLabel", isSignal: true, isRequired: true, transformFunction: null }, addMoreLabel: { classPropertyName: "addMoreLabel", publicName: "addMoreLabel", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<span class=\"ax-conversation-picker__count\">{{ countLabel() }}</span>\n<ax-button [text]=\"addMoreLabel()\" [look]=\"'ghost'\" axUploaderBrowseHandle>\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-plus\"></i></ax-icon>\n </ax-prefix>\n</ax-button>\n", styles: ["@layer properties;@layer components{ax-conversation-picker-toolbar{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;box-sizing:border-box;display:flex;flex-shrink:0;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));width:calc(100% + 1.5rem);margin-inline:-.75rem;padding:.375rem .75rem .5rem}ax-conversation-picker-toolbar .ax-conversation-picker__count{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface),.65)}@container picker (max-width: 480px){ax-conversation-picker-toolbar{width:calc(100% + 1rem);margin-inline:-.5rem;padding-inline:.5rem}}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1
|
|
11517
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.8", type: AXConversationPickerToolbarComponent, isStandalone: true, selector: "ax-conversation-picker-toolbar", inputs: { countLabel: { classPropertyName: "countLabel", publicName: "countLabel", isSignal: true, isRequired: true, transformFunction: null }, addMoreLabel: { classPropertyName: "addMoreLabel", publicName: "addMoreLabel", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<span class=\"ax-conversation-picker__count\">{{ countLabel() }}</span>\n<ax-button [text]=\"addMoreLabel()\" [look]=\"'ghost'\" axUploaderBrowseHandle>\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-plus\"></i></ax-icon>\n </ax-prefix>\n</ax-button>\n", styles: ["@layer properties;@layer components{ax-conversation-picker-toolbar{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;box-sizing:border-box;display:flex;flex-shrink:0;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));width:calc(100% + 1.5rem);margin-inline:-.75rem;padding:.375rem .75rem .5rem}ax-conversation-picker-toolbar .ax-conversation-picker__count{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface),.65)}@container picker (max-width: 480px){ax-conversation-picker-toolbar{width:calc(100% + 1rem);margin-inline:-.5rem;padding-inline:.5rem}}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1.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: "directive", type: AXUploaderBrowseDirective, selector: "[axUploaderBrowseHandle]" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
11780
11518
|
}
|
|
11781
11519
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationPickerToolbarComponent, decorators: [{
|
|
11782
11520
|
type: Component,
|
|
@@ -12035,23 +11773,6 @@ var audioPicker_component = /*#__PURE__*/Object.freeze({
|
|
|
12035
11773
|
AXConversationAudioPickerComponent: AXConversationAudioPickerComponent
|
|
12036
11774
|
});
|
|
12037
11775
|
|
|
12038
|
-
const AX_CONVERSATION_COMPOSER_EMOJI_TAB = {
|
|
12039
|
-
id: 'emoji',
|
|
12040
|
-
title: '@acorex:chat.tabs.emoji',
|
|
12041
|
-
icon: 'fa-light fa-face-smile',
|
|
12042
|
-
priority: 100,
|
|
12043
|
-
componentLoader: () => Promise.resolve().then(function () { return index$1; }).then((m) => m.AXConversationEmojiTabComponent),
|
|
12044
|
-
enabled: true,
|
|
12045
|
-
};
|
|
12046
|
-
const AX_CONVERSATION_COMPOSER_STICKER_TAB = {
|
|
12047
|
-
id: 'sticker',
|
|
12048
|
-
title: '@acorex:chat.tabs.stickers',
|
|
12049
|
-
icon: 'fa-light fa-note-sticky',
|
|
12050
|
-
priority: 90,
|
|
12051
|
-
componentLoader: () => Promise.resolve().then(function () { return index; }).then((m) => m.AXConversationStickerTabComponent),
|
|
12052
|
-
enabled: true,
|
|
12053
|
-
};
|
|
12054
|
-
|
|
12055
11776
|
/**
|
|
12056
11777
|
* Composer Tabs Plugins
|
|
12057
11778
|
*/
|
|
@@ -12127,11 +11848,11 @@ class AXConversationEmojiTabComponent {
|
|
|
12127
11848
|
this.itemSelected.emit(emoji);
|
|
12128
11849
|
}
|
|
12129
11850
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationEmojiTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
12130
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationEmojiTabComponent, isStandalone: true, selector: "ax-conversation-emoji-tab", outputs: { itemSelected: "itemSelected" }, ngImport: i0, template: "<div class=\"emoji-tab\">\n <!-- Search -->\n <div class=\"emoji-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search emoji...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"emoji-categories\">\n @for (category of categories(); track category.id) {\n <button\n type=\"button\"\n [class]=\"getCategoryClasses(category.id)\"\n (click)=\"selectCategory(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Emoji Grid -->\n <div class=\"emoji-grid\">\n @for (emoji of filteredEmojis(); track emoji.char) {\n <button\n type=\"button\"\n class=\"emoji-button\"\n (click)=\"selectEmoji(emoji.char)\"\n [attr.aria-label]=\"emoji.name\"\n [title]=\"emoji.name\"\n >\n {{ emoji.char }}\n </button>\n }\n </div>\n\n @if (filteredEmojis().length === 0) {\n <div class=\"emoji-empty\">\n <p>{{ '@acorex:chat.empty.no-emojis-found' | translate | async }}</p>\n </div>\n }\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-emoji-tab .emoji-tab{display:flex;height:100%;flex-direction:column}ax-conversation-emoji-tab .emoji-search{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;padding-
|
|
11851
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationEmojiTabComponent, isStandalone: true, selector: "ax-conversation-emoji-tab", outputs: { itemSelected: "itemSelected" }, ngImport: i0, template: "<div class=\"emoji-tab\">\n <!-- Search -->\n <div class=\"emoji-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search emoji...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"emoji-categories\">\n @for (category of categories(); track category.id) {\n <button\n type=\"button\"\n [class]=\"getCategoryClasses(category.id)\"\n (click)=\"selectCategory(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Emoji Grid -->\n <div class=\"emoji-grid\">\n @for (emoji of filteredEmojis(); track emoji.char) {\n <button\n type=\"button\"\n class=\"emoji-button\"\n (click)=\"selectEmoji(emoji.char)\"\n [attr.aria-label]=\"emoji.name\"\n [title]=\"emoji.name\"\n >\n {{ emoji.char }}\n </button>\n }\n </div>\n\n @if (filteredEmojis().length === 0) {\n <div class=\"emoji-empty\">\n <p>{{ '@acorex:chat.empty.no-emojis-found' | translate | async }}</p>\n </div>\n }\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-emoji-tab .emoji-tab{display:flex;height:100%;flex-direction:column}ax-conversation-emoji-tab .emoji-search{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;flex-shrink:0;background-color:rgba(var(--ax-sys-color-lightest-surface));padding-top:calc(var(--spacing, .25rem) * 1);padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-emoji-tab .emoji-categories{margin-bottom:calc(var(--spacing, .25rem) * 2);display:flex;flex-shrink:0;align-items:center;gap:calc(var(--spacing, .25rem) * 1);overflow-x:auto;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-bottom:calc(var(--spacing, .25rem) * 2);scrollbar-width:thin}ax-conversation-emoji-tab .category-button{display:flex;height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;align-items:center;justify-content:center;border-radius:var(--radius-md, .375rem);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 1);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));transition:all .15s;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}@media(hover:hover){ax-conversation-emoji-tab .category-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-emoji-tab .category-button-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface));color:rgba(var(--ax-sys-color-on-primary-lightest-surface))}ax-conversation-emoji-tab .emoji-grid{display:grid;min-height:calc(var(--spacing, .25rem) * 0);flex:1;gap:calc(var(--spacing, .25rem) * 1);overflow-y:auto;grid-template-columns:repeat(auto-fill,32px);scrollbar-width:thin}ax-conversation-emoji-tab .emoji-button{display:flex;height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;align-items:center;justify-content:center;border-radius:var(--radius-md, .375rem);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 1);font-size:var(--text-2xl, 1.5rem);line-height:var(--tw-leading, var(--text-2xl--line-height, calc(2 / 1.5)));transition:all .15s;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}@media(hover:hover){ax-conversation-emoji-tab .emoji-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-emoji-tab .emoji-empty{padding:calc(var(--spacing, .25rem) * 8);text-align:center;opacity:60%}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i1$4.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
12131
11852
|
}
|
|
12132
11853
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationEmojiTabComponent, decorators: [{
|
|
12133
11854
|
type: Component,
|
|
12134
|
-
args: [{ selector: 'ax-conversation-emoji-tab', encapsulation: ViewEncapsulation.None, imports: [CommonModule, FormsModule, AXSearchBoxModule, AXTranslationModule], template: "<div class=\"emoji-tab\">\n <!-- Search -->\n <div class=\"emoji-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search emoji...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"emoji-categories\">\n @for (category of categories(); track category.id) {\n <button\n type=\"button\"\n [class]=\"getCategoryClasses(category.id)\"\n (click)=\"selectCategory(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Emoji Grid -->\n <div class=\"emoji-grid\">\n @for (emoji of filteredEmojis(); track emoji.char) {\n <button\n type=\"button\"\n class=\"emoji-button\"\n (click)=\"selectEmoji(emoji.char)\"\n [attr.aria-label]=\"emoji.name\"\n [title]=\"emoji.name\"\n >\n {{ emoji.char }}\n </button>\n }\n </div>\n\n @if (filteredEmojis().length === 0) {\n <div class=\"emoji-empty\">\n <p>{{ '@acorex:chat.empty.no-emojis-found' | translate | async }}</p>\n </div>\n }\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-emoji-tab .emoji-tab{display:flex;height:100%;flex-direction:column}ax-conversation-emoji-tab .emoji-search{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;padding-
|
|
11855
|
+
args: [{ selector: 'ax-conversation-emoji-tab', encapsulation: ViewEncapsulation.None, imports: [CommonModule, FormsModule, AXSearchBoxModule, AXTranslationModule], template: "<div class=\"emoji-tab\">\n <!-- Search -->\n <div class=\"emoji-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search emoji...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"emoji-categories\">\n @for (category of categories(); track category.id) {\n <button\n type=\"button\"\n [class]=\"getCategoryClasses(category.id)\"\n (click)=\"selectCategory(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Emoji Grid -->\n <div class=\"emoji-grid\">\n @for (emoji of filteredEmojis(); track emoji.char) {\n <button\n type=\"button\"\n class=\"emoji-button\"\n (click)=\"selectEmoji(emoji.char)\"\n [attr.aria-label]=\"emoji.name\"\n [title]=\"emoji.name\"\n >\n {{ emoji.char }}\n </button>\n }\n </div>\n\n @if (filteredEmojis().length === 0) {\n <div class=\"emoji-empty\">\n <p>{{ '@acorex:chat.empty.no-emojis-found' | translate | async }}</p>\n </div>\n }\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-emoji-tab .emoji-tab{display:flex;height:100%;flex-direction:column}ax-conversation-emoji-tab .emoji-search{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;flex-shrink:0;background-color:rgba(var(--ax-sys-color-lightest-surface));padding-top:calc(var(--spacing, .25rem) * 1);padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-emoji-tab .emoji-categories{margin-bottom:calc(var(--spacing, .25rem) * 2);display:flex;flex-shrink:0;align-items:center;gap:calc(var(--spacing, .25rem) * 1);overflow-x:auto;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-bottom:calc(var(--spacing, .25rem) * 2);scrollbar-width:thin}ax-conversation-emoji-tab .category-button{display:flex;height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;align-items:center;justify-content:center;border-radius:var(--radius-md, .375rem);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 1);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));transition:all .15s;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}@media(hover:hover){ax-conversation-emoji-tab .category-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-emoji-tab .category-button-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface));color:rgba(var(--ax-sys-color-on-primary-lightest-surface))}ax-conversation-emoji-tab .emoji-grid{display:grid;min-height:calc(var(--spacing, .25rem) * 0);flex:1;gap:calc(var(--spacing, .25rem) * 1);overflow-y:auto;grid-template-columns:repeat(auto-fill,32px);scrollbar-width:thin}ax-conversation-emoji-tab .emoji-button{display:flex;height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;align-items:center;justify-content:center;border-radius:var(--radius-md, .375rem);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 1);font-size:var(--text-2xl, 1.5rem);line-height:var(--tw-leading, var(--text-2xl--line-height, calc(2 / 1.5)));transition:all .15s;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}@media(hover:hover){ax-conversation-emoji-tab .emoji-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-emoji-tab .emoji-empty{padding:calc(var(--spacing, .25rem) * 8);text-align:center;opacity:60%}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
12135
11856
|
}], ctorParameters: () => [], propDecorators: { itemSelected: [{ type: i0.Output, args: ["itemSelected"] }] } });
|
|
12136
11857
|
|
|
12137
11858
|
var index$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -13279,11 +13000,11 @@ class AXConversationStickerTabComponent {
|
|
|
13279
13000
|
this.itemSelected.emit(sticker);
|
|
13280
13001
|
}
|
|
13281
13002
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationStickerTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
13282
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationStickerTabComponent, isStandalone: true, selector: "ax-conversation-sticker-tab", outputs: { itemSelected: "itemSelected" }, ngImport: i0, template: "<div class=\"sticker-tab\">\n <!-- Search -->\n <div class=\"sticker-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search stickers...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"sticker-packs\">\n @for (category of stickerCategories; track category.id) {\n <button\n type=\"button\"\n [class]=\"getPackClasses(category.id)\"\n (click)=\"selectPack(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Loading State -->\n @if (loading()) {\n <div class=\"sticker-grid\">\n @for (i of skeletonItems; track i) {\n <div class=\"sticker-skeleton\">\n <ax-skeleton [animated]=\"true\" class=\"skeleton-item\"></ax-skeleton>\n </div>\n }\n </div>\n }\n\n <!-- Stickers Grid -->\n @if (!loading() && activeStickers().length > 0) {\n <div class=\"sticker-grid\">\n @for (sticker of activeStickers(); track sticker.id) {\n <button\n type=\"button\"\n class=\"sticker-button\"\n (click)=\"selectSticker(sticker)\"\n [attr.aria-label]=\"sticker.emoji\"\n >\n <img [src]=\"sticker.url\" [alt]=\"sticker.emoji || 'Sticker'\" class=\"sticker-image\" loading=\"lazy\" />\n </button>\n }\n </div>\n }\n\n <!-- Empty State -->\n @if (!loading() && activeStickers().length === 0) {\n <div class=\"sticker-empty\">\n <p>{{ '@acorex:chat.empty.no-stickers-available' | translate | async }}</p>\n </div>\n }\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-sticker-tab .sticker-tab{display:flex;height:100%;flex-direction:column}ax-conversation-sticker-tab .sticker-search{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;padding-
|
|
13003
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationStickerTabComponent, isStandalone: true, selector: "ax-conversation-sticker-tab", outputs: { itemSelected: "itemSelected" }, ngImport: i0, template: "<div class=\"sticker-tab\">\n <!-- Search -->\n <div class=\"sticker-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search stickers...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"sticker-packs\">\n @for (category of stickerCategories; track category.id) {\n <button\n type=\"button\"\n [class]=\"getPackClasses(category.id)\"\n (click)=\"selectPack(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Loading State -->\n @if (loading()) {\n <div class=\"sticker-grid\">\n @for (i of skeletonItems; track i) {\n <div class=\"sticker-skeleton\">\n <ax-skeleton [animated]=\"true\" class=\"skeleton-item\"></ax-skeleton>\n </div>\n }\n </div>\n }\n\n <!-- Stickers Grid -->\n @if (!loading() && activeStickers().length > 0) {\n <div class=\"sticker-grid\">\n @for (sticker of activeStickers(); track sticker.id) {\n <button\n type=\"button\"\n class=\"sticker-button\"\n (click)=\"selectSticker(sticker)\"\n [attr.aria-label]=\"sticker.emoji\"\n >\n <img [src]=\"sticker.url\" [alt]=\"sticker.emoji || 'Sticker'\" class=\"sticker-image\" loading=\"lazy\" />\n </button>\n }\n </div>\n }\n\n <!-- Empty State -->\n @if (!loading() && activeStickers().length === 0) {\n <div class=\"sticker-empty\">\n <p>{{ '@acorex:chat.empty.no-stickers-available' | translate | async }}</p>\n </div>\n }\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-sticker-tab .sticker-tab{display:flex;height:100%;flex-direction:column}ax-conversation-sticker-tab .sticker-search{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;flex-shrink:0;background-color:rgba(var(--ax-sys-color-lightest-surface));padding-top:calc(var(--spacing, .25rem) * 1);padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-sticker-tab .sticker-packs{margin-bottom:calc(var(--spacing, .25rem) * 2);display:flex;flex-shrink:0;gap:calc(var(--spacing, .25rem) * 1);overflow-x:auto;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-bottom:calc(var(--spacing, .25rem) * 2);scrollbar-width:thin}ax-conversation-sticker-tab .pack-button{height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);cursor:pointer;border-radius:var(--radius-md, .375rem);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 2);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));transition:all .15s;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}@media(hover:hover){ax-conversation-sticker-tab .pack-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-sticker-tab .pack-button-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}ax-conversation-sticker-tab .sticker-grid{display:grid;min-height:calc(var(--spacing, .25rem) * 0);flex:1;grid-template-columns:repeat(4,minmax(0,1fr));gap:calc(var(--spacing, .25rem) * 2);overflow-y:auto;scrollbar-width:thin}ax-conversation-sticker-tab .sticker-button{aspect-ratio:1 / 1;cursor:pointer;border-radius:var(--radius-md, .375rem);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 2);transition:all .15s}@media(hover:hover){ax-conversation-sticker-tab .sticker-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-sticker-tab .sticker-image{height:100%;width:100%;object-fit:contain}ax-conversation-sticker-tab .sticker-empty{padding:calc(var(--spacing, .25rem) * 8);text-align:center;opacity:60%}ax-conversation-sticker-tab .sticker-skeleton{aspect-ratio:1 / 1;height:calc(var(--spacing, .25rem) * 20);overflow:hidden;border-radius:var(--radius-md, .375rem)}ax-conversation-sticker-tab .skeleton-item{height:100%;width:100%;border-radius:var(--radius-md, .375rem)}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$6.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i1$4.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
13283
13004
|
}
|
|
13284
13005
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationStickerTabComponent, decorators: [{
|
|
13285
13006
|
type: Component,
|
|
13286
|
-
args: [{ selector: 'ax-conversation-sticker-tab', encapsulation: ViewEncapsulation.None, imports: [CommonModule, FormsModule, AXSkeletonModule, AXSearchBoxModule, AXTranslationModule], template: "<div class=\"sticker-tab\">\n <!-- Search -->\n <div class=\"sticker-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search stickers...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"sticker-packs\">\n @for (category of stickerCategories; track category.id) {\n <button\n type=\"button\"\n [class]=\"getPackClasses(category.id)\"\n (click)=\"selectPack(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Loading State -->\n @if (loading()) {\n <div class=\"sticker-grid\">\n @for (i of skeletonItems; track i) {\n <div class=\"sticker-skeleton\">\n <ax-skeleton [animated]=\"true\" class=\"skeleton-item\"></ax-skeleton>\n </div>\n }\n </div>\n }\n\n <!-- Stickers Grid -->\n @if (!loading() && activeStickers().length > 0) {\n <div class=\"sticker-grid\">\n @for (sticker of activeStickers(); track sticker.id) {\n <button\n type=\"button\"\n class=\"sticker-button\"\n (click)=\"selectSticker(sticker)\"\n [attr.aria-label]=\"sticker.emoji\"\n >\n <img [src]=\"sticker.url\" [alt]=\"sticker.emoji || 'Sticker'\" class=\"sticker-image\" loading=\"lazy\" />\n </button>\n }\n </div>\n }\n\n <!-- Empty State -->\n @if (!loading() && activeStickers().length === 0) {\n <div class=\"sticker-empty\">\n <p>{{ '@acorex:chat.empty.no-stickers-available' | translate | async }}</p>\n </div>\n }\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-sticker-tab .sticker-tab{display:flex;height:100%;flex-direction:column}ax-conversation-sticker-tab .sticker-search{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;padding-
|
|
13007
|
+
args: [{ selector: 'ax-conversation-sticker-tab', encapsulation: ViewEncapsulation.None, imports: [CommonModule, FormsModule, AXSkeletonModule, AXSearchBoxModule, AXTranslationModule], template: "<div class=\"sticker-tab\">\n <!-- Search -->\n <div class=\"sticker-search\">\n <ax-search-box\n [value]=\"searchQuery()\"\n [placeholder]=\"'Search stickers...'\"\n (onValueChanged)=\"onSearchChange($event)\"\n ></ax-search-box>\n </div>\n\n <!-- Categories -->\n <div class=\"sticker-packs\">\n @for (category of stickerCategories; track category.id) {\n <button\n type=\"button\"\n [class]=\"getPackClasses(category.id)\"\n (click)=\"selectPack(category.id)\"\n [attr.aria-label]=\"category.name\"\n [title]=\"category.name\"\n >\n {{ category.icon }}\n </button>\n }\n </div>\n\n <!-- Loading State -->\n @if (loading()) {\n <div class=\"sticker-grid\">\n @for (i of skeletonItems; track i) {\n <div class=\"sticker-skeleton\">\n <ax-skeleton [animated]=\"true\" class=\"skeleton-item\"></ax-skeleton>\n </div>\n }\n </div>\n }\n\n <!-- Stickers Grid -->\n @if (!loading() && activeStickers().length > 0) {\n <div class=\"sticker-grid\">\n @for (sticker of activeStickers(); track sticker.id) {\n <button\n type=\"button\"\n class=\"sticker-button\"\n (click)=\"selectSticker(sticker)\"\n [attr.aria-label]=\"sticker.emoji\"\n >\n <img [src]=\"sticker.url\" [alt]=\"sticker.emoji || 'Sticker'\" class=\"sticker-image\" loading=\"lazy\" />\n </button>\n }\n </div>\n }\n\n <!-- Empty State -->\n @if (!loading() && activeStickers().length === 0) {\n <div class=\"sticker-empty\">\n <p>{{ '@acorex:chat.empty.no-stickers-available' | translate | async }}</p>\n </div>\n }\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-sticker-tab .sticker-tab{display:flex;height:100%;flex-direction:column}ax-conversation-sticker-tab .sticker-search{position:sticky;top:calc(var(--spacing, .25rem) * 0);z-index:10;flex-shrink:0;background-color:rgba(var(--ax-sys-color-lightest-surface));padding-top:calc(var(--spacing, .25rem) * 1);padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-sticker-tab .sticker-packs{margin-bottom:calc(var(--spacing, .25rem) * 2);display:flex;flex-shrink:0;gap:calc(var(--spacing, .25rem) * 1);overflow-x:auto;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-bottom:calc(var(--spacing, .25rem) * 2);scrollbar-width:thin}ax-conversation-sticker-tab .pack-button{height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);cursor:pointer;border-radius:var(--radius-md, .375rem);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 2);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));transition:all .15s;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}@media(hover:hover){ax-conversation-sticker-tab .pack-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-sticker-tab .pack-button-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}ax-conversation-sticker-tab .sticker-grid{display:grid;min-height:calc(var(--spacing, .25rem) * 0);flex:1;grid-template-columns:repeat(4,minmax(0,1fr));gap:calc(var(--spacing, .25rem) * 2);overflow-y:auto;scrollbar-width:thin}ax-conversation-sticker-tab .sticker-button{aspect-ratio:1 / 1;cursor:pointer;border-radius:var(--radius-md, .375rem);--tw-border-style: none;border-style:none;background-color:transparent;padding:calc(var(--spacing, .25rem) * 2);transition:all .15s}@media(hover:hover){ax-conversation-sticker-tab .sticker-button:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}ax-conversation-sticker-tab .sticker-image{height:100%;width:100%;object-fit:contain}ax-conversation-sticker-tab .sticker-empty{padding:calc(var(--spacing, .25rem) * 8);text-align:center;opacity:60%}ax-conversation-sticker-tab .sticker-skeleton{aspect-ratio:1 / 1;height:calc(var(--spacing, .25rem) * 20);overflow:hidden;border-radius:var(--radius-md, .375rem)}ax-conversation-sticker-tab .skeleton-item{height:100%;width:100%;border-radius:var(--radius-md, .375rem)}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
13287
13008
|
}], ctorParameters: () => [], propDecorators: { itemSelected: [{ type: i0.Output, args: ["itemSelected"] }] } });
|
|
13288
13009
|
|
|
13289
13010
|
var index = /*#__PURE__*/Object.freeze({
|
|
@@ -14066,7 +13787,7 @@ class AXConversationVoiceRecorderComponent {
|
|
|
14066
13787
|
this.activeStream = undefined;
|
|
14067
13788
|
}
|
|
14068
13789
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationVoiceRecorderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
14069
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationVoiceRecorderComponent, isStandalone: true, selector: "ax-conversation-voice-recorder", inputs: { conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { recordingComplete: "recordingComplete", recordingCancelled: "recordingCancelled" }, ngImport: i0, template: "<div class=\"voice-recorder\">\n <!-- Header with Close Button -->\n <div class=\"recorder-header\">\n <h3 class=\"recorder-title\">{{ '@acorex:chat.voice-recorder.title' | translate | async }}</h3>\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"cancel()\"\n [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"recorder-content\">\n @if (isUploading()) {\n <div class=\"recorder-upload\">\n <ax-label>{{ getUploadingLabel() }}</ax-label>\n <ax-progress-bar [progress]=\"uploadProgress()\" [mode]=\"'determinate'\" [height]=\"6\" />\n </div>\n } @else if (!isRecording()) {\n <!-- Start Recording State -->\n <div class=\"recorder-idle\">\n <button class=\"record-button\" (click)=\"startRecording()\">\n <i class=\"fa-light fa-microphone\"></i>\n </button>\n <span class=\"recorder-hint\">{{ '@acorex:chat.voice-recorder.tap-to-start' | translate | async }}</span>\n </div>\n } @else {\n <!-- Recording State -->\n <div class=\"recorder-active\">\n <div class=\"recorder-info\">\n <div class=\"recording-indicator\">\n <span class=\"pulse-dot\"></span>\n <span class=\"recording-text\">{{ '@acorex:chat.voice-recorder.recording' | translate | async }}</span>\n </div>\n <div class=\"recording-time\">{{ formattedTime() }}</div>\n </div>\n\n <div class=\"recorder-actions\">\n <ax-button\n [text]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n [look]=\"'ghost'\"\n (onClick)=\"cancelRecording()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n\n <ax-button\n [text]=\"translation.translateSync('@acorex:chat.actions.send')\"\n [look]=\"'primary'\"\n (onClick)=\"stopRecording()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-paper-plane\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n }\n </div>\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-voice-recorder{display:block;width:100%;container-type:inline-size;@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}}ax-conversation-voice-recorder .voice-recorder{display:flex;width:100%;flex-direction:column;background-color:rgba(var(--ax-sys-color-lightest-surface))}ax-conversation-voice-recorder .recorder-header{display:flex;align-items:center;justify-content:space-between;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3)}ax-conversation-voice-recorder .recorder-title{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}ax-conversation-voice-recorder .close-button{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));opacity:70%;transition:all .2s}@media(hover:hover){ax-conversation-voice-recorder .close-button:hover{background-color:rgba(var(--ax-sys-color-light-surface));opacity:100%}}ax-conversation-voice-recorder .recorder-upload{margin-inline:auto;display:flex;width:100%;max-width:calc(var(--spacing, .25rem) * 80);flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding:calc(var(--spacing, .25rem) * 6)}ax-conversation-voice-recorder .recorder-content{display:flex;width:100%;align-items:center;padding:calc(var(--spacing, .25rem) * 4)}ax-conversation-voice-recorder .recorder-idle{display:flex;width:100%;align-items:center;gap:calc(var(--spacing, .25rem) * 4)}ax-conversation-voice-recorder .record-button{display:flex;height:calc(var(--spacing, .25rem) * 14);width:calc(var(--spacing, .25rem) * 14);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:rgba(var(--ax-sys-color-primary-surface));font-size:var(--text-2xl, 1.5rem);line-height:var(--tw-leading, var(--text-2xl--line-height, calc(2 / 1.5)));color:rgba(var(--ax-sys-color-on-primary-surface));transition:all .2s;box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.3)}@media(hover:hover){ax-conversation-voice-recorder .record-button:hover{background-color:rgba(var(--ax-sys-color-primary-600))}}ax-conversation-voice-recorder .recorder-hint{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));opacity:70%}ax-conversation-voice-recorder .recorder-active{display:flex;width:100%;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 4)}ax-conversation-voice-recorder .recorder-info{display:flex;flex:1;align-items:center;gap:calc(var(--spacing, .25rem) * 6)}ax-conversation-voice-recorder .recording-indicator{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-voice-recorder .pulse-dot{height:calc(var(--spacing, .25rem) * 3);width:calc(var(--spacing, .25rem) * 3);border-radius:calc(infinity * 1px);background-color:rgba(var(--ax-sys-color-danger-500));animation:pulse 1.5s ease-in-out infinite}ax-conversation-voice-recorder .recording-text{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-voice-recorder .recording-time{min-width:calc(var(--spacing, .25rem) * 20);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-voice-recorder .recorder-actions{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 3)}@container (max-width: 768px){ax-conversation-voice-recorder .voice-recorder{padding:calc(var(--spacing, .25rem) * 3)}ax-conversation-voice-recorder .record-button{height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}ax-conversation-voice-recorder .recorder-info{gap:calc(var(--spacing, .25rem) * 4)}ax-conversation-voice-recorder .recording-time{font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-voice-recorder .recorder-actions{gap:calc(var(--spacing, .25rem) * 2)}}@container (max-width: 480px){ax-conversation-voice-recorder .recorder-hint{font-size:.8125rem}ax-conversation-voice-recorder .recording-text{display:none}ax-conversation-voice-recorder .recording-time{min-width:60px;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{transform:scale3d(1.05,1.05,1.05)}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1$1.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: "ngmodule", type: AXLabelModule }, { kind: "component", type: i2$1.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXProgressBarModule }, { kind: "component", type: i1$3.AXProgressBarComponent, selector: "ax-progress-bar", inputs: ["color", "mode", "progress", "height"], outputs: ["ValueChange", "sizeChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
13790
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationVoiceRecorderComponent, isStandalone: true, selector: "ax-conversation-voice-recorder", inputs: { conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { recordingComplete: "recordingComplete", recordingCancelled: "recordingCancelled" }, ngImport: i0, template: "<div class=\"voice-recorder\">\n <!-- Header with Close Button -->\n <div class=\"recorder-header\">\n <h3 class=\"recorder-title\">{{ '@acorex:chat.voice-recorder.title' | translate | async }}</h3>\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"cancel()\"\n [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"recorder-content\">\n @if (isUploading()) {\n <div class=\"recorder-upload\">\n <ax-label>{{ getUploadingLabel() }}</ax-label>\n <ax-progress-bar [progress]=\"uploadProgress()\" [mode]=\"'determinate'\" [height]=\"6\" />\n </div>\n } @else if (!isRecording()) {\n <!-- Start Recording State -->\n <div class=\"recorder-idle\">\n <button class=\"record-button\" (click)=\"startRecording()\">\n <i class=\"fa-light fa-microphone\"></i>\n </button>\n <span class=\"recorder-hint\">{{ '@acorex:chat.voice-recorder.tap-to-start' | translate | async }}</span>\n </div>\n } @else {\n <!-- Recording State -->\n <div class=\"recorder-active\">\n <div class=\"recorder-info\">\n <div class=\"recording-indicator\">\n <span class=\"pulse-dot\"></span>\n <span class=\"recording-text\">{{ '@acorex:chat.voice-recorder.recording' | translate | async }}</span>\n </div>\n <div class=\"recording-time\">{{ formattedTime() }}</div>\n </div>\n\n <div class=\"recorder-actions\">\n <ax-button\n [text]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n [look]=\"'ghost'\"\n (onClick)=\"cancelRecording()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n\n <ax-button\n [text]=\"translation.translateSync('@acorex:chat.actions.send')\"\n [look]=\"'primary'\"\n (onClick)=\"stopRecording()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-paper-plane\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n }\n </div>\n</div>\n", styles: ["@layer properties;@layer components{ax-conversation-voice-recorder{display:block;width:100%;container-type:inline-size;@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}}ax-conversation-voice-recorder .voice-recorder{display:flex;width:100%;flex-direction:column;background-color:rgba(var(--ax-sys-color-lightest-surface))}ax-conversation-voice-recorder .recorder-header{display:flex;align-items:center;justify-content:space-between;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3)}ax-conversation-voice-recorder .recorder-title{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}ax-conversation-voice-recorder .close-button{display:flex;height:calc(var(--spacing, .25rem) * 7);width:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));opacity:70%;transition:all .2s}@media(hover:hover){ax-conversation-voice-recorder .close-button:hover{background-color:rgba(var(--ax-sys-color-light-surface));opacity:100%}}ax-conversation-voice-recorder .recorder-upload{margin-inline:auto;display:flex;width:100%;max-width:calc(var(--spacing, .25rem) * 80);flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding:calc(var(--spacing, .25rem) * 6)}ax-conversation-voice-recorder .recorder-content{display:flex;width:100%;align-items:center;padding:calc(var(--spacing, .25rem) * 4)}ax-conversation-voice-recorder .recorder-idle{display:flex;width:100%;align-items:center;gap:calc(var(--spacing, .25rem) * 4)}ax-conversation-voice-recorder .record-button{display:flex;height:calc(var(--spacing, .25rem) * 14);width:calc(var(--spacing, .25rem) * 14);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:rgba(var(--ax-sys-color-primary-surface));font-size:var(--text-2xl, 1.5rem);line-height:var(--tw-leading, var(--text-2xl--line-height, calc(2 / 1.5)));color:rgba(var(--ax-sys-color-on-primary-surface));transition:all .2s;box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.3)}@media(hover:hover){ax-conversation-voice-recorder .record-button:hover{background-color:rgba(var(--ax-sys-color-primary-600))}}ax-conversation-voice-recorder .recorder-hint{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));opacity:70%}ax-conversation-voice-recorder .recorder-active{display:flex;width:100%;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 4)}ax-conversation-voice-recorder .recorder-info{display:flex;flex:1;align-items:center;gap:calc(var(--spacing, .25rem) * 6)}ax-conversation-voice-recorder .recording-indicator{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-voice-recorder .pulse-dot{height:calc(var(--spacing, .25rem) * 3);width:calc(var(--spacing, .25rem) * 3);border-radius:calc(infinity * 1px);background-color:rgba(var(--ax-sys-color-danger-500));animation:pulse 1.5s ease-in-out infinite}ax-conversation-voice-recorder .recording-text{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-voice-recorder .recording-time{min-width:calc(var(--spacing, .25rem) * 20);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-voice-recorder .recorder-actions{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 3)}@container (max-width: 768px){ax-conversation-voice-recorder .voice-recorder{padding:calc(var(--spacing, .25rem) * 3)}ax-conversation-voice-recorder .record-button{height:calc(var(--spacing, .25rem) * 12);width:calc(var(--spacing, .25rem) * 12);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}ax-conversation-voice-recorder .recorder-info{gap:calc(var(--spacing, .25rem) * 4)}ax-conversation-voice-recorder .recording-time{font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}ax-conversation-voice-recorder .recorder-actions{gap:calc(var(--spacing, .25rem) * 2)}}@container (max-width: 480px){ax-conversation-voice-recorder .recorder-hint{font-size:.8125rem}ax-conversation-voice-recorder .recording-text{display:none}ax-conversation-voice-recorder .recording-time{min-width:60px;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{transform:scale3d(1.05,1.05,1.05)}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1.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: "ngmodule", type: AXLabelModule }, { kind: "component", type: i2$1.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXProgressBarModule }, { kind: "component", type: i1$3.AXProgressBarComponent, selector: "ax-progress-bar", inputs: ["color", "mode", "progress", "height"], outputs: ["ValueChange", "sizeChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
14070
13791
|
}
|
|
14071
13792
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationVoiceRecorderComponent, decorators: [{
|
|
14072
13793
|
type: Component,
|
|
@@ -14651,6 +14372,7 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
|
|
|
14651
14372
|
super(...arguments);
|
|
14652
14373
|
this.toastService = inject(AXToastService);
|
|
14653
14374
|
this.translation = inject(AXTranslationService);
|
|
14375
|
+
this.platform = inject(AXPlatform);
|
|
14654
14376
|
this.injectedConversationService = inject(AXConversationService, { optional: true });
|
|
14655
14377
|
this.onClosed = output();
|
|
14656
14378
|
this.activeTab = signal('profile', /* @ts-ignore */
|
|
@@ -14679,38 +14401,10 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
|
|
|
14679
14401
|
this.editTitle = '';
|
|
14680
14402
|
this.editAvatar = '';
|
|
14681
14403
|
this.groupDetailsSaveInFlight = false;
|
|
14682
|
-
this.backgroundPresets =
|
|
14683
|
-
|
|
14684
|
-
|
|
14685
|
-
|
|
14686
|
-
value: 'rgb(var(--ax-sys-color-primary-lightest-surface))',
|
|
14687
|
-
},
|
|
14688
|
-
{
|
|
14689
|
-
id: 'solid-graphite',
|
|
14690
|
-
label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.graphite'),
|
|
14691
|
-
value: 'rgb(var(--ax-sys-color-lighter-surface))',
|
|
14692
|
-
},
|
|
14693
|
-
{
|
|
14694
|
-
id: 'solid-olive',
|
|
14695
|
-
label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.olive'),
|
|
14696
|
-
value: 'rgba(132, 144, 88, 0.24)',
|
|
14697
|
-
},
|
|
14698
|
-
{
|
|
14699
|
-
id: 'solid-sky',
|
|
14700
|
-
label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.sky'),
|
|
14701
|
-
value: 'rgba(56, 189, 248, 0.2)',
|
|
14702
|
-
},
|
|
14703
|
-
{
|
|
14704
|
-
id: 'grad-aurora',
|
|
14705
|
-
label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.aurora'),
|
|
14706
|
-
value: 'linear-gradient(140deg, #60a5fa 0%, #a78bfa 55%, #f472b6 100%)',
|
|
14707
|
-
},
|
|
14708
|
-
{
|
|
14709
|
-
id: 'grad-sunset',
|
|
14710
|
-
label: this.translation.translateSync('@acorex:chat.info-panel.background.presets.sunset'),
|
|
14711
|
-
value: 'linear-gradient(140deg, rgba(251, 113, 133, 0.34) 0%, rgba(251, 191, 36, 0.32) 100%)',
|
|
14712
|
-
},
|
|
14713
|
-
];
|
|
14404
|
+
this.backgroundPresets = AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS.map((preset) => ({
|
|
14405
|
+
...preset,
|
|
14406
|
+
label: this.translateBackgroundPresetLabel(preset.id),
|
|
14407
|
+
}));
|
|
14714
14408
|
this.heroSubtitle = computed(() => {
|
|
14715
14409
|
const conversation = this.liveConversation();
|
|
14716
14410
|
if (!conversation)
|
|
@@ -15008,21 +14702,36 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
|
|
|
15008
14702
|
this.groupDetailsSaveInFlight = false;
|
|
15009
14703
|
}
|
|
15010
14704
|
}
|
|
15011
|
-
isBackgroundSelected(
|
|
14705
|
+
isBackgroundSelected(preset) {
|
|
14706
|
+
this.platform.themeMode();
|
|
15012
14707
|
const bg = this.conversation?.metadata?.['messageListBackground'];
|
|
15013
|
-
|
|
14708
|
+
if (bg === undefined ||
|
|
14709
|
+
bg === '' ||
|
|
14710
|
+
(isMessageListThemeBackground(bg) && !bg.light.trim() && !bg.dark.trim())) {
|
|
14711
|
+
return preset.id === AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID;
|
|
14712
|
+
}
|
|
14713
|
+
return isSameMessageListBackground(bg, preset.value, this.platform.isDark());
|
|
14714
|
+
}
|
|
14715
|
+
presetBackgroundPreview(preset) {
|
|
14716
|
+
this.platform.themeMode();
|
|
14717
|
+
const raw = resolveMessageListBackgroundRaw(preset, this.platform.isDark()) ?? '';
|
|
14718
|
+
return normalizeMessageListBackgroundValue(raw);
|
|
15014
14719
|
}
|
|
15015
14720
|
async applyMessageListBackground(value) {
|
|
14721
|
+
const isReset = value === '' || (isMessageListThemeBackground(value) && !value.light.trim() && !value.dark.trim());
|
|
15016
14722
|
try {
|
|
15017
|
-
const metadata = {
|
|
15018
|
-
|
|
15019
|
-
messageListBackground
|
|
15020
|
-
}
|
|
14723
|
+
const metadata = { ...(this.conversation.metadata ?? {}) };
|
|
14724
|
+
if (isReset) {
|
|
14725
|
+
delete metadata.messageListBackground;
|
|
14726
|
+
}
|
|
14727
|
+
else {
|
|
14728
|
+
metadata.messageListBackground = value;
|
|
14729
|
+
}
|
|
15021
14730
|
await this.conversationService.updateConversationMetadata(this.conversation.id, metadata);
|
|
15022
14731
|
this.conversation.metadata = metadata;
|
|
15023
|
-
this.toastService.success(
|
|
15024
|
-
? this.translation.translateSync('@acorex:chat.info-panel.toasts.background-
|
|
15025
|
-
: this.translation.translateSync('@acorex:chat.info-panel.toasts.background-
|
|
14732
|
+
this.toastService.success(isReset
|
|
14733
|
+
? this.translation.translateSync('@acorex:chat.info-panel.toasts.background-reset')
|
|
14734
|
+
: this.translation.translateSync('@acorex:chat.info-panel.toasts.background-updated'));
|
|
15026
14735
|
}
|
|
15027
14736
|
catch (error) {
|
|
15028
14737
|
console.error('Failed to update message list background:', error);
|
|
@@ -15034,6 +14743,17 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
|
|
|
15034
14743
|
params: { label },
|
|
15035
14744
|
});
|
|
15036
14745
|
}
|
|
14746
|
+
translateBackgroundPresetLabel(id) {
|
|
14747
|
+
const labelKeys = {
|
|
14748
|
+
'solid-default': '@acorex:chat.info-panel.background.presets.default',
|
|
14749
|
+
'solid-graphite': '@acorex:chat.info-panel.background.presets.graphite',
|
|
14750
|
+
'solid-olive': '@acorex:chat.info-panel.background.presets.olive',
|
|
14751
|
+
'solid-sky': '@acorex:chat.info-panel.background.presets.sky',
|
|
14752
|
+
'grad-aurora': '@acorex:chat.info-panel.background.presets.aurora',
|
|
14753
|
+
'grad-sunset': '@acorex:chat.info-panel.background.presets.sunset',
|
|
14754
|
+
};
|
|
14755
|
+
return this.translation.translateSync(labelKeys[id] ?? id);
|
|
14756
|
+
}
|
|
15037
14757
|
ngOnDestroy() {
|
|
15038
14758
|
if (this.groupTitleSaveTimer) {
|
|
15039
14759
|
clearTimeout(this.groupTitleSaveTimer);
|
|
@@ -15047,7 +14767,7 @@ class AXConversationInfoPanelComponent extends AXClosableComponent {
|
|
|
15047
14767
|
}
|
|
15048
14768
|
}
|
|
15049
14769
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationInfoPanelComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
15050
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationInfoPanelComponent, isStandalone: true, selector: "ax-conversation-info-panel", outputs: { onClosed: "onClosed" }, providers: [{ provide: AXClosableComponent, useExisting: AXConversationInfoPanelComponent }], usesInheritance: true, ngImport: i0, template: "@if (conversation) {\n <div class=\"tg-info-panel\">\n @if (panelView() === 'media' && selectedMediaCategory(); as category) {\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"mediaViewLoader\"\n [inputs]=\"getMediaViewInputs(category)\"\n />\n } @else {\n <div class=\"tg-info-panel__scroll\">\n <section class=\"tg-hero\">\n <ax-conversation-avatar kind=\"auto\" [conversation]=\"conversation\" [size]=\"96\" />\n <h2 class=\"tg-hero__title\">{{ conversation.title }}</h2>\n <p class=\"tg-hero__subtitle\">{{ heroSubtitle() }}</p>\n </section>\n\n <section class=\"tg-quick-actions\">\n @for (action of quickActions(); track action.id) {\n <button\n type=\"button\"\n class=\"tg-quick-action\"\n [class.tg-quick-action--danger]=\"action.danger\"\n [class.tg-quick-action--active]=\"action.id === 'mute' && isConversationMuted()\"\n (click)=\"onQuickAction(action.id)\"\n >\n <span class=\"tg-quick-action__icon\"><i [class]=\"action.icon\"></i></span>\n <span class=\"tg-quick-action__label\">{{ action.labelKey | translate | async }}</span>\n </button>\n }\n </section>\n\n <nav class=\"tg-tabs\" role=\"tablist\">\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'profile'\"\n [attr.aria-selected]=\"activeTab() === 'profile'\"\n (click)=\"setActiveTab('profile')\"\n >\n {{ '@acorex:chat.info-panel.tabs.profile' | translate | async }}\n </button>\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'manage'\"\n [attr.aria-selected]=\"activeTab() === 'manage'\"\n (click)=\"setActiveTab('manage')\"\n >\n {{ '@acorex:chat.info-panel.tabs.manage' | translate | async }}\n </button>\n </nav>\n\n @if (activeTab() === 'profile') {\n @if (profileFields().length > 0) {\n <section class=\"tg-section tg-details\">\n @for (field of profileFields(); track field.id) {\n <div class=\"tg-detail-row\">\n <span class=\"tg-detail-row__icon\"><i [class]=\"field.icon\"></i></span>\n <div class=\"tg-detail-row__content\">\n <span class=\"tg-detail-row__value\">{{ field.value }}</span>\n <span class=\"tg-detail-row__label\">{{ field.labelKey | translate | async }}</span>\n </div>\n </div>\n }\n </section>\n }\n\n @if (loadingMessages()) {\n <div class=\"tg-loading\">{{ '@acorex:chat.info-panel.media.loading' | translate | async }}</div>\n } @else if (mediaCategories().length > 0) {\n <section class=\"tg-section tg-media\">\n @for (category of mediaCategories(); track category.id) {\n <button type=\"button\" class=\"tg-media-row\" (click)=\"openMediaCategory(category)\">\n <span class=\"tg-media-row__icon\"><i [class]=\"category.icon\"></i></span>\n <span class=\"tg-media-row__label\">{{ getMediaRowLabel(category) }}</span>\n <i class=\"fa-light fa-chevron-right tg-media-row__chevron\"></i>\n </button>\n }\n </section>\n }\n\n @if (isGroupConversation()) {\n <section class=\"tg-section tg-members\">\n <div class=\"tg-section-header tg-section-header--row\">\n <span class=\"tg-section-header__title\">{{ membersSectionTitle() }}</span>\n <div class=\"tg-section-header__actions\">\n <button\n type=\"button\"\n class=\"tg-icon-btn\"\n (click)=\"toggleMemberSearch()\"\n [attr.aria-label]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n >\n <i class=\"fa-light fa-magnifying-glass\"></i>\n </button>\n </div>\n </div>\n @if (showMemberSearch()) {\n <div class=\"tg-members-search-wrap\">\n <ax-search-box\n class=\"tg-members-search\"\n [value]=\"memberSearchQuery()\"\n (valueChange)=\"onMemberSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n ></ax-search-box>\n </div>\n }\n @for (participant of filteredMembers(); track participant.id) {\n <div class=\"tg-member-row\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"participant.id\"\n [conversation]=\"conversation\"\n [size]=\"42\"\n />\n <div class=\"tg-member-row__content\">\n <span class=\"tg-member-row__name\">{{ participant.name }}</span>\n <span\n class=\"tg-member-row__meta\"\n [class.tg-member-row__meta--online]=\"participant.status === 'online'\"\n >\n {{ getMemberSubtitle(participant) }}\n </span>\n </div>\n @if (getMemberRoleLabel(participant); as roleLabel) {\n <span class=\"tg-member-row__badge\">{{ roleLabel | translate | async }}</span>\n }\n </div>\n }\n </section>\n }\n }\n\n @if (activeTab() === 'manage') {\n <section class=\"tg-section tg-manage\">\n @if (!isPrivateConversation()) {\n <div class=\"tg-manage-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.group-details.title' | translate | async\n }}</ax-label>\n <ax-text-box\n [value]=\"editTitle\"\n (valueChange)=\"onGroupTitleChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.enter-group-title' | translate | async\"\n ></ax-text-box>\n <div class=\"tg-manage-avatar\">\n <ax-conversation-avatar-picker\n [(avatarUrl)]=\"editAvatar\"\n (avatarUrlChange)=\"onGroupAvatarChange($event)\"\n ></ax-conversation-avatar-picker>\n </div>\n </div>\n }\n\n <div class=\"tg-setting-row\">\n <div class=\"tg-setting-row__info\">\n <span class=\"tg-setting-row__title\">{{\n '@acorex:chat.info-panel.settings.archived' | translate | async\n }}</span>\n <span class=\"tg-setting-row__desc\">{{\n '@acorex:chat.info-panel.settings.archived-description' | translate | async\n }}</span>\n </div>\n <ax-switch [(ngModel)]=\"archived\" (ngModelChange)=\"onArchivedChange($event)\"></ax-switch>\n </div>\n\n <div class=\"tg-manage-block tg-background-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.background.title' | translate | async\n }}</ax-label>\n <p class=\"tg-background-desc\">\n {{ '@acorex:chat.info-panel.background.description' | translate | async }}\n </p>\n <div class=\"tg-background-grid\">\n @for (preset of backgroundPresets; track preset.id) {\n <button\n type=\"button\"\n class=\"tg-background-swatch\"\n [class.tg-background-swatch--active]=\"isBackgroundSelected(preset.value)\"\n [style.background]=\"preset.value\"\n (click)=\"applyMessageListBackground(preset.value)\"\n [attr.aria-label]=\"getBackgroundAriaLabel(preset.label)\"\n >\n <span class=\"tg-background-swatch__label\">{{ preset.label }}</span>\n </button>\n }\n </div>\n <ax-button\n [text]=\"'@acorex:chat.info-panel.actions.reset-to-default' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"applyMessageListBackground('')\"\n ></ax-button>\n </div>\n </section>\n }\n </div>\n }\n </div>\n}\n", styles: ["@layer properties;@layer components{ax-conversation-info-panel{display:block;height:100%;width:100%}ax-conversation-info-panel .tg-info-panel{display:flex;flex-direction:column;max-height:min(85vh,40rem)}ax-conversation-info-panel .tg-info-panel__scroll{overflow-y:auto;overscroll-behavior:contain}ax-conversation-info-panel .tg-hero{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 6);padding-block:calc(var(--spacing, .25rem) * 5);padding-top:calc(var(--spacing, .25rem) * 5);padding-bottom:calc(var(--spacing, .25rem) * 4);text-align:center}ax-conversation-info-panel .tg-hero__title{margin-top:calc(var(--spacing, .25rem) * 1);margin-bottom:calc(var(--spacing, .25rem) * 0);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));--tw-leading: 1.35;line-height:1.35;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);overflow-wrap:break-word;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-hero__subtitle{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-info-panel .tg-quick-actions{display:flex;flex-wrap:nowrap;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5);padding-inline:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-info-panel .tg-quick-action{display:flex;max-width:5.5rem;min-width:calc(var(--spacing, .25rem) * 0);flex:1;cursor:pointer;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:var(--radius-xl, .75rem);--tw-border-style: none;border-style:none;background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 1.5);padding-block:calc(var(--spacing, .25rem) * 2.5);color:rgba(var(--ax-sys-color-primary-500));transition:background-color .15s ease}ax-conversation-info-panel .tg-quick-action:hover{background-color:rgba(var(--ax-sys-color-border-light-surface))}ax-conversation-info-panel .tg-quick-action--danger{color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-info-panel .tg-quick-action--active{color:rgba(var(--ax-sys-color-warning-500));background:rgba(var(--ax-sys-color-warning-500),.14)}ax-conversation-info-panel .tg-quick-action--active .tg-quick-action__label{color:rgba(var(--ax-sys-color-warning-500));opacity:100%}ax-conversation-info-panel .tg-quick-action__icon{font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-leading: 1;line-height:1}ax-conversation-info-panel .tg-quick-action__label{text-align:center;font-size:.6875rem;--tw-leading: 1.1;line-height:1.1;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-info-panel .tg-tabs{margin-inline:calc(var(--spacing, .25rem) * 3);display:flex;gap:calc(var(--spacing, .25rem) * 0);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface))}ax-conversation-info-panel .tg-tab{flex:1;cursor:pointer;border-bottom-style:var(--tw-border-style);border-bottom-width:2px;--tw-border-style: none;border-style:none;border-color:transparent;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 2.5);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface));opacity:55%;transition:opacity .15s ease,color .15s ease,border-color .15s ease}ax-conversation-info-panel .tg-tab:hover{opacity:80%}ax-conversation-info-panel .tg-tab--active{color:rgba(var(--ax-sys-color-primary-500));opacity:100%;border-bottom-color:rgb(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-section{padding-block:calc(var(--spacing, .25rem) * 1)}ax-conversation-info-panel .tg-detail-row,ax-conversation-info-panel .tg-member-row{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3.5);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2.5)}ax-conversation-info-panel .tg-media-row{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3.5);--tw-border-style: none;border-style:none;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2.5);text-align:start;transition:background-color .15s ease}ax-conversation-info-panel .tg-media-row:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-info-panel .tg-media-row__icon{width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;text-align:center;color:rgba(var(--ax-sys-color-on-surface));opacity:75%}ax-conversation-info-panel .tg-media-row__label{min-width:calc(var(--spacing, .25rem) * 0);flex:1;font-size:.9375rem;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-media-row__chevron{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:.45}ax-conversation-info-panel .tg-loading{padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4);text-align:center;font-size:.8125rem;color:rgba(var(--ax-sys-color-on-surface));opacity:60%}ax-conversation-info-panel .tg-detail-row__icon{width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;text-align:center;color:rgba(var(--ax-sys-color-primary-500));opacity:90%}ax-conversation-info-panel .tg-detail-row__content,ax-conversation-info-panel .tg-member-row__content{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-info-panel .tg-detail-row__value,ax-conversation-info-panel .tg-member-row__name{overflow:hidden;font-size:.9375rem;--tw-leading: 1.3;line-height:1.3;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-detail-row__label,ax-conversation-info-panel .tg-member-row__meta{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-leading: 1.2;line-height:1.2;color:rgba(var(--ax-sys-color-on-surface));opacity:60%}ax-conversation-info-panel .tg-member-row__meta--online{color:rgba(var(--ax-sys-color-primary-500));opacity:100%}ax-conversation-info-panel .tg-section-header{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-top:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-info-panel .tg-section-header--row{flex-direction:row;align-items:center;justify-content:space-between}ax-conversation-info-panel .tg-section-header__actions{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-conversation-info-panel .tg-icon-btn{display:inline-flex;height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;color:rgba(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-icon-btn:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-info-panel .tg-members-search-wrap{padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-section-header__title{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: .06em;letter-spacing:.06em;color:rgba(var(--ax-sys-color-on-surface));text-transform:uppercase;opacity:55%}ax-conversation-info-panel .tg-members-search{width:100%}ax-conversation-info-panel .tg-member-row__badge{flex-shrink:0;border-radius:calc(infinity * 1px);padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * .5);font-size:.6875rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-500));background:rgba(var(--ax-sys-color-primary-500),.14)}ax-conversation-info-panel .tg-manage{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-info-panel .tg-manage-block{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-manage-label{font-size:.8125rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-setting-row{display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-setting-row__info{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-info-panel .tg-setting-row__title{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-setting-row__desc{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-info-panel .tg-background-desc{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-info-panel .tg-background-grid{display:grid;gap:calc(var(--spacing, .25rem) * 2);grid-template-columns:repeat(3,minmax(0,1fr))}ax-conversation-info-panel .tg-background-swatch{position:relative;height:calc(var(--spacing, .25rem) * 11);cursor:pointer;overflow:hidden;border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:2px;border-color:transparent}ax-conversation-info-panel .tg-background-swatch--active{border-color:rgba(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-background-swatch__label{position:absolute;inset-inline-start:calc(var(--spacing, .25rem) * 1.5);bottom:calc(var(--spacing, .25rem) * .5);font-size:.65rem;--tw-font-weight: var(--font-weight-light, 300);font-weight:var(--font-weight-light, 300);--tw-tracking: .1rem;letter-spacing:.1rem;color:var(--color-white, #fff);mix-blend-mode:difference}ax-conversation-info-panel .tg-danger{padding-top:calc(var(--spacing, .25rem) * 1);padding-bottom:calc(var(--spacing, .25rem) * 3)}ax-conversation-info-panel .tg-danger-row{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3);--tw-border-style: none;border-style:none;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);text-align:start;font-size:.9375rem;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-info-panel .tg-danger-row:hover{background:rgba(var(--ax-sys-color-danger-500),.06)}}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading: initial;--tw-font-weight: initial;--tw-border-style: solid;--tw-tracking: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXSwitchModule }, { kind: "component", type: i2$2.AXSwitchComponent, selector: "ax-switch", inputs: ["disabled", "readonly", "color", "tabIndex", "value", "name", "isLoading"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "component", type: AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "component", type: AXConversationAvatarPickerComponent, selector: "ax-conversation-avatar-picker", inputs: ["showClearButton", "avatarUrl"], outputs: ["avatarUrlChange", "onFileSelected"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "component", type: AXConversationRegistryComponentOutletComponent, selector: "ax-conversation-registry-component-outlet", inputs: ["component", "componentLoader", "inputs"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
14770
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationInfoPanelComponent, isStandalone: true, selector: "ax-conversation-info-panel", outputs: { onClosed: "onClosed" }, providers: [{ provide: AXClosableComponent, useExisting: AXConversationInfoPanelComponent }], usesInheritance: true, ngImport: i0, template: "@if (conversation) {\n <div class=\"tg-info-panel\">\n @if (panelView() === 'media' && selectedMediaCategory(); as category) {\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"mediaViewLoader\"\n [inputs]=\"getMediaViewInputs(category)\"\n />\n } @else {\n <div class=\"tg-info-panel__scroll\">\n <section class=\"tg-hero\">\n <ax-conversation-avatar kind=\"auto\" [conversation]=\"conversation\" [size]=\"96\" />\n <h2 class=\"tg-hero__title\">{{ conversation.title }}</h2>\n <p class=\"tg-hero__subtitle\">{{ heroSubtitle() }}</p>\n </section>\n\n <section class=\"tg-quick-actions\">\n @for (action of quickActions(); track action.id) {\n <button\n type=\"button\"\n class=\"tg-quick-action\"\n [class.tg-quick-action--danger]=\"action.danger\"\n [class.tg-quick-action--active]=\"action.id === 'mute' && isConversationMuted()\"\n (click)=\"onQuickAction(action.id)\"\n >\n <span class=\"tg-quick-action__icon\"><i [class]=\"action.icon\"></i></span>\n <span class=\"tg-quick-action__label\">{{ action.labelKey | translate | async }}</span>\n </button>\n }\n </section>\n\n <nav class=\"tg-tabs\" role=\"tablist\">\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'profile'\"\n [attr.aria-selected]=\"activeTab() === 'profile'\"\n (click)=\"setActiveTab('profile')\"\n >\n {{ '@acorex:chat.info-panel.tabs.profile' | translate | async }}\n </button>\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'manage'\"\n [attr.aria-selected]=\"activeTab() === 'manage'\"\n (click)=\"setActiveTab('manage')\"\n >\n {{ '@acorex:chat.info-panel.tabs.manage' | translate | async }}\n </button>\n </nav>\n\n @if (activeTab() === 'profile') {\n @if (profileFields().length > 0) {\n <section class=\"tg-section tg-details\">\n @for (field of profileFields(); track field.id) {\n <div class=\"tg-detail-row\">\n <span class=\"tg-detail-row__icon\"><i [class]=\"field.icon\"></i></span>\n <div class=\"tg-detail-row__content\">\n <span class=\"tg-detail-row__value\">{{ field.value }}</span>\n <span class=\"tg-detail-row__label\">{{ field.labelKey | translate | async }}</span>\n </div>\n </div>\n }\n </section>\n }\n\n @if (loadingMessages()) {\n <div class=\"tg-loading\">{{ '@acorex:chat.info-panel.media.loading' | translate | async }}</div>\n } @else if (mediaCategories().length > 0) {\n <section class=\"tg-section tg-media\">\n @for (category of mediaCategories(); track category.id) {\n <button type=\"button\" class=\"tg-media-row\" (click)=\"openMediaCategory(category)\">\n <span class=\"tg-media-row__icon\"><i [class]=\"category.icon\"></i></span>\n <span class=\"tg-media-row__label\">{{ getMediaRowLabel(category) }}</span>\n <i class=\"fa-light fa-chevron-right tg-media-row__chevron\"></i>\n </button>\n }\n </section>\n }\n\n @if (isGroupConversation()) {\n <section class=\"tg-section tg-members\">\n <div class=\"tg-section-header tg-section-header--row\">\n <span class=\"tg-section-header__title\">{{ membersSectionTitle() }}</span>\n <div class=\"tg-section-header__actions\">\n <button\n type=\"button\"\n class=\"tg-icon-btn\"\n (click)=\"toggleMemberSearch()\"\n [attr.aria-label]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n >\n <i class=\"fa-light fa-magnifying-glass\"></i>\n </button>\n </div>\n </div>\n @if (showMemberSearch()) {\n <div class=\"tg-members-search-wrap\">\n <ax-search-box\n class=\"tg-members-search\"\n [value]=\"memberSearchQuery()\"\n (valueChange)=\"onMemberSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n ></ax-search-box>\n </div>\n }\n @for (participant of filteredMembers(); track participant.id) {\n <div class=\"tg-member-row\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"participant.id\"\n [conversation]=\"conversation\"\n [size]=\"42\"\n />\n <div class=\"tg-member-row__content\">\n <span class=\"tg-member-row__name\">{{ participant.name }}</span>\n <span\n class=\"tg-member-row__meta\"\n [class.tg-member-row__meta--online]=\"participant.status === 'online'\"\n >\n {{ getMemberSubtitle(participant) }}\n </span>\n </div>\n @if (getMemberRoleLabel(participant); as roleLabel) {\n <span class=\"tg-member-row__badge\">{{ roleLabel | translate | async }}</span>\n }\n </div>\n }\n </section>\n }\n }\n\n @if (activeTab() === 'manage') {\n <section class=\"tg-section tg-manage\">\n @if (!isPrivateConversation()) {\n <div class=\"tg-manage-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.group-details.title' | translate | async\n }}</ax-label>\n <ax-text-box\n [value]=\"editTitle\"\n (valueChange)=\"onGroupTitleChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.enter-group-title' | translate | async\"\n ></ax-text-box>\n <div class=\"tg-manage-avatar\">\n <ax-conversation-avatar-picker\n [(avatarUrl)]=\"editAvatar\"\n (avatarUrlChange)=\"onGroupAvatarChange($event)\"\n ></ax-conversation-avatar-picker>\n </div>\n </div>\n }\n\n <div class=\"tg-setting-row\">\n <div class=\"tg-setting-row__info\">\n <span class=\"tg-setting-row__title\">{{\n '@acorex:chat.info-panel.settings.archived' | translate | async\n }}</span>\n <span class=\"tg-setting-row__desc\">{{\n '@acorex:chat.info-panel.settings.archived-description' | translate | async\n }}</span>\n </div>\n <ax-switch [(ngModel)]=\"archived\" (ngModelChange)=\"onArchivedChange($event)\"></ax-switch>\n </div>\n\n <div class=\"tg-manage-block tg-background-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.background.title' | translate | async\n }}</ax-label>\n <p class=\"tg-background-desc\">\n {{ '@acorex:chat.info-panel.background.description' | translate | async }}\n </p>\n <div class=\"tg-background-grid\">\n @for (preset of backgroundPresets; track preset.id) {\n <button\n type=\"button\"\n class=\"tg-background-swatch\"\n [class.tg-background-swatch--active]=\"isBackgroundSelected(preset)\"\n [style.background]=\"presetBackgroundPreview(preset.value)\"\n (click)=\"applyMessageListBackground(preset.value)\"\n [attr.aria-label]=\"getBackgroundAriaLabel(preset.label)\"\n >\n <span class=\"tg-background-swatch__label\">{{ preset.label }}</span>\n </button>\n }\n </div>\n <ax-button\n [text]=\"'@acorex:chat.info-panel.actions.reset-to-default' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"applyMessageListBackground('')\"\n ></ax-button>\n </div>\n </section>\n }\n </div>\n }\n </div>\n}\n", styles: ["@layer properties;@layer components{ax-conversation-info-panel{display:block;height:100%;width:100%}ax-conversation-info-panel .tg-info-panel{display:flex;flex-direction:column;max-height:min(85vh,40rem)}ax-conversation-info-panel .tg-info-panel__scroll{overflow-y:auto;overscroll-behavior:contain}ax-conversation-info-panel .tg-hero{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 6);padding-block:calc(var(--spacing, .25rem) * 5);padding-top:calc(var(--spacing, .25rem) * 5);padding-bottom:calc(var(--spacing, .25rem) * 4);text-align:center}ax-conversation-info-panel .tg-hero__title{margin-top:calc(var(--spacing, .25rem) * 1);margin-bottom:calc(var(--spacing, .25rem) * 0);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));--tw-leading: 1.35;line-height:1.35;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);overflow-wrap:break-word;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-hero__subtitle{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-info-panel .tg-quick-actions{display:flex;flex-wrap:nowrap;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5);padding-inline:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-info-panel .tg-quick-action{display:flex;max-width:5.5rem;min-width:calc(var(--spacing, .25rem) * 0);flex:1;cursor:pointer;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:var(--radius-xl, .75rem);--tw-border-style: none;border-style:none;background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 1.5);padding-block:calc(var(--spacing, .25rem) * 2.5);color:rgba(var(--ax-sys-color-primary-500));transition:background-color .15s ease}ax-conversation-info-panel .tg-quick-action:hover{background-color:rgba(var(--ax-sys-color-border-light-surface))}ax-conversation-info-panel .tg-quick-action--danger{color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-info-panel .tg-quick-action--active{color:rgba(var(--ax-sys-color-warning-500));background:rgba(var(--ax-sys-color-warning-500),.14)}ax-conversation-info-panel .tg-quick-action--active .tg-quick-action__label{color:rgba(var(--ax-sys-color-warning-500));opacity:100%}ax-conversation-info-panel .tg-quick-action__icon{font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-leading: 1;line-height:1}ax-conversation-info-panel .tg-quick-action__label{text-align:center;font-size:.6875rem;--tw-leading: 1.1;line-height:1.1;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-info-panel .tg-tabs{margin-inline:calc(var(--spacing, .25rem) * 3);display:flex;gap:calc(var(--spacing, .25rem) * 0);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface))}ax-conversation-info-panel .tg-tab{flex:1;cursor:pointer;border-bottom-style:var(--tw-border-style);border-bottom-width:2px;--tw-border-style: none;border-style:none;border-color:transparent;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 2.5);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface));opacity:55%;transition:opacity .15s ease,color .15s ease,border-color .15s ease}ax-conversation-info-panel .tg-tab:hover{opacity:80%}ax-conversation-info-panel .tg-tab--active{color:rgba(var(--ax-sys-color-primary-500));opacity:100%;border-bottom-color:rgb(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-section{padding-block:calc(var(--spacing, .25rem) * 1)}ax-conversation-info-panel .tg-detail-row,ax-conversation-info-panel .tg-member-row{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3.5);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2.5)}ax-conversation-info-panel .tg-media-row{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3.5);--tw-border-style: none;border-style:none;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2.5);text-align:start;transition:background-color .15s ease}ax-conversation-info-panel .tg-media-row:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-info-panel .tg-media-row__icon{width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;text-align:center;color:rgba(var(--ax-sys-color-on-surface));opacity:75%}ax-conversation-info-panel .tg-media-row__label{min-width:calc(var(--spacing, .25rem) * 0);flex:1;font-size:.9375rem;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-media-row__chevron{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:.45}ax-conversation-info-panel .tg-loading{padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4);text-align:center;font-size:.8125rem;color:rgba(var(--ax-sys-color-on-surface));opacity:60%}ax-conversation-info-panel .tg-detail-row__icon{width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;text-align:center;color:rgba(var(--ax-sys-color-primary-500));opacity:90%}ax-conversation-info-panel .tg-detail-row__content,ax-conversation-info-panel .tg-member-row__content{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-info-panel .tg-detail-row__value,ax-conversation-info-panel .tg-member-row__name{overflow:hidden;font-size:.9375rem;--tw-leading: 1.3;line-height:1.3;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-detail-row__label,ax-conversation-info-panel .tg-member-row__meta{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-leading: 1.2;line-height:1.2;color:rgba(var(--ax-sys-color-on-surface));opacity:60%}ax-conversation-info-panel .tg-member-row__meta--online{color:rgba(var(--ax-sys-color-primary-500));opacity:100%}ax-conversation-info-panel .tg-section-header{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-top:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-info-panel .tg-section-header--row{flex-direction:row;align-items:center;justify-content:space-between}ax-conversation-info-panel .tg-section-header__actions{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-conversation-info-panel .tg-icon-btn{display:inline-flex;height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;color:rgba(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-icon-btn:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-info-panel .tg-members-search-wrap{padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-section-header__title{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: .06em;letter-spacing:.06em;color:rgba(var(--ax-sys-color-on-surface));text-transform:uppercase;opacity:55%}ax-conversation-info-panel .tg-members-search{width:100%}ax-conversation-info-panel .tg-member-row__badge{flex-shrink:0;border-radius:calc(infinity * 1px);padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * .5);font-size:.6875rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-500));background:rgba(var(--ax-sys-color-primary-500),.14)}ax-conversation-info-panel .tg-manage{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-info-panel .tg-manage-block{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-manage-label{font-size:.8125rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-setting-row{display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-setting-row__info{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-info-panel .tg-setting-row__title{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-setting-row__desc{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-info-panel .tg-background-desc{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-info-panel .tg-background-grid{display:grid;gap:calc(var(--spacing, .25rem) * 2);grid-template-columns:repeat(3,minmax(0,1fr))}ax-conversation-info-panel .tg-background-swatch{position:relative;height:calc(var(--spacing, .25rem) * 11);cursor:pointer;overflow:hidden;border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:2px;border-color:transparent}ax-conversation-info-panel .tg-background-swatch--active{border-color:rgba(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-background-swatch__label{position:absolute;inset-inline-start:calc(var(--spacing, .25rem) * 1.5);bottom:calc(var(--spacing, .25rem) * .5);font-size:.65rem;--tw-font-weight: var(--font-weight-light, 300);font-weight:var(--font-weight-light, 300);--tw-tracking: .1rem;letter-spacing:.1rem;color:var(--color-white, #fff);mix-blend-mode:difference}ax-conversation-info-panel .tg-danger{padding-top:calc(var(--spacing, .25rem) * 1);padding-bottom:calc(var(--spacing, .25rem) * 3)}ax-conversation-info-panel .tg-danger-row{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3);--tw-border-style: none;border-style:none;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);text-align:start;font-size:.9375rem;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-info-panel .tg-danger-row:hover{background:rgba(var(--ax-sys-color-danger-500),.06)}}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading: initial;--tw-font-weight: initial;--tw-border-style: solid;--tw-tracking: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXSwitchModule }, { kind: "component", type: i2$2.AXSwitchComponent, selector: "ax-switch", inputs: ["disabled", "readonly", "color", "tabIndex", "value", "name", "isLoading"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "component", type: AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "component", type: AXConversationAvatarPickerComponent, selector: "ax-conversation-avatar-picker", inputs: ["showClearButton", "avatarUrl"], outputs: ["avatarUrlChange", "onFileSelected"] }, { kind: "component", type: AXConversationAvatarComponent, selector: "ax-conversation-avatar", inputs: ["kind", "userId", "conversation", "message", "size", "showStatus", "name", "avatar", "icon"] }, { kind: "component", type: AXConversationRegistryComponentOutletComponent, selector: "ax-conversation-registry-component-outlet", inputs: ["component", "componentLoader", "inputs"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
15051
14771
|
}
|
|
15052
14772
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationInfoPanelComponent, decorators: [{
|
|
15053
14773
|
type: Component,
|
|
@@ -15064,7 +14784,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
15064
14784
|
AXConversationAvatarComponent,
|
|
15065
14785
|
AXConversationRegistryComponentOutletComponent,
|
|
15066
14786
|
AXTranslationModule,
|
|
15067
|
-
], providers: [{ provide: AXClosableComponent, useExisting: AXConversationInfoPanelComponent }], template: "@if (conversation) {\n <div class=\"tg-info-panel\">\n @if (panelView() === 'media' && selectedMediaCategory(); as category) {\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"mediaViewLoader\"\n [inputs]=\"getMediaViewInputs(category)\"\n />\n } @else {\n <div class=\"tg-info-panel__scroll\">\n <section class=\"tg-hero\">\n <ax-conversation-avatar kind=\"auto\" [conversation]=\"conversation\" [size]=\"96\" />\n <h2 class=\"tg-hero__title\">{{ conversation.title }}</h2>\n <p class=\"tg-hero__subtitle\">{{ heroSubtitle() }}</p>\n </section>\n\n <section class=\"tg-quick-actions\">\n @for (action of quickActions(); track action.id) {\n <button\n type=\"button\"\n class=\"tg-quick-action\"\n [class.tg-quick-action--danger]=\"action.danger\"\n [class.tg-quick-action--active]=\"action.id === 'mute' && isConversationMuted()\"\n (click)=\"onQuickAction(action.id)\"\n >\n <span class=\"tg-quick-action__icon\"><i [class]=\"action.icon\"></i></span>\n <span class=\"tg-quick-action__label\">{{ action.labelKey | translate | async }}</span>\n </button>\n }\n </section>\n\n <nav class=\"tg-tabs\" role=\"tablist\">\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'profile'\"\n [attr.aria-selected]=\"activeTab() === 'profile'\"\n (click)=\"setActiveTab('profile')\"\n >\n {{ '@acorex:chat.info-panel.tabs.profile' | translate | async }}\n </button>\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'manage'\"\n [attr.aria-selected]=\"activeTab() === 'manage'\"\n (click)=\"setActiveTab('manage')\"\n >\n {{ '@acorex:chat.info-panel.tabs.manage' | translate | async }}\n </button>\n </nav>\n\n @if (activeTab() === 'profile') {\n @if (profileFields().length > 0) {\n <section class=\"tg-section tg-details\">\n @for (field of profileFields(); track field.id) {\n <div class=\"tg-detail-row\">\n <span class=\"tg-detail-row__icon\"><i [class]=\"field.icon\"></i></span>\n <div class=\"tg-detail-row__content\">\n <span class=\"tg-detail-row__value\">{{ field.value }}</span>\n <span class=\"tg-detail-row__label\">{{ field.labelKey | translate | async }}</span>\n </div>\n </div>\n }\n </section>\n }\n\n @if (loadingMessages()) {\n <div class=\"tg-loading\">{{ '@acorex:chat.info-panel.media.loading' | translate | async }}</div>\n } @else if (mediaCategories().length > 0) {\n <section class=\"tg-section tg-media\">\n @for (category of mediaCategories(); track category.id) {\n <button type=\"button\" class=\"tg-media-row\" (click)=\"openMediaCategory(category)\">\n <span class=\"tg-media-row__icon\"><i [class]=\"category.icon\"></i></span>\n <span class=\"tg-media-row__label\">{{ getMediaRowLabel(category) }}</span>\n <i class=\"fa-light fa-chevron-right tg-media-row__chevron\"></i>\n </button>\n }\n </section>\n }\n\n @if (isGroupConversation()) {\n <section class=\"tg-section tg-members\">\n <div class=\"tg-section-header tg-section-header--row\">\n <span class=\"tg-section-header__title\">{{ membersSectionTitle() }}</span>\n <div class=\"tg-section-header__actions\">\n <button\n type=\"button\"\n class=\"tg-icon-btn\"\n (click)=\"toggleMemberSearch()\"\n [attr.aria-label]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n >\n <i class=\"fa-light fa-magnifying-glass\"></i>\n </button>\n </div>\n </div>\n @if (showMemberSearch()) {\n <div class=\"tg-members-search-wrap\">\n <ax-search-box\n class=\"tg-members-search\"\n [value]=\"memberSearchQuery()\"\n (valueChange)=\"onMemberSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n ></ax-search-box>\n </div>\n }\n @for (participant of filteredMembers(); track participant.id) {\n <div class=\"tg-member-row\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"participant.id\"\n [conversation]=\"conversation\"\n [size]=\"42\"\n />\n <div class=\"tg-member-row__content\">\n <span class=\"tg-member-row__name\">{{ participant.name }}</span>\n <span\n class=\"tg-member-row__meta\"\n [class.tg-member-row__meta--online]=\"participant.status === 'online'\"\n >\n {{ getMemberSubtitle(participant) }}\n </span>\n </div>\n @if (getMemberRoleLabel(participant); as roleLabel) {\n <span class=\"tg-member-row__badge\">{{ roleLabel | translate | async }}</span>\n }\n </div>\n }\n </section>\n }\n }\n\n @if (activeTab() === 'manage') {\n <section class=\"tg-section tg-manage\">\n @if (!isPrivateConversation()) {\n <div class=\"tg-manage-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.group-details.title' | translate | async\n }}</ax-label>\n <ax-text-box\n [value]=\"editTitle\"\n (valueChange)=\"onGroupTitleChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.enter-group-title' | translate | async\"\n ></ax-text-box>\n <div class=\"tg-manage-avatar\">\n <ax-conversation-avatar-picker\n [(avatarUrl)]=\"editAvatar\"\n (avatarUrlChange)=\"onGroupAvatarChange($event)\"\n ></ax-conversation-avatar-picker>\n </div>\n </div>\n }\n\n <div class=\"tg-setting-row\">\n <div class=\"tg-setting-row__info\">\n <span class=\"tg-setting-row__title\">{{\n '@acorex:chat.info-panel.settings.archived' | translate | async\n }}</span>\n <span class=\"tg-setting-row__desc\">{{\n '@acorex:chat.info-panel.settings.archived-description' | translate | async\n }}</span>\n </div>\n <ax-switch [(ngModel)]=\"archived\" (ngModelChange)=\"onArchivedChange($event)\"></ax-switch>\n </div>\n\n <div class=\"tg-manage-block tg-background-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.background.title' | translate | async\n }}</ax-label>\n <p class=\"tg-background-desc\">\n {{ '@acorex:chat.info-panel.background.description' | translate | async }}\n </p>\n <div class=\"tg-background-grid\">\n @for (preset of backgroundPresets; track preset.id) {\n <button\n type=\"button\"\n class=\"tg-background-swatch\"\n [class.tg-background-swatch--active]=\"isBackgroundSelected(preset.value)\"\n [style.background]=\"preset.value\"\n (click)=\"applyMessageListBackground(preset.value)\"\n [attr.aria-label]=\"getBackgroundAriaLabel(preset.label)\"\n >\n <span class=\"tg-background-swatch__label\">{{ preset.label }}</span>\n </button>\n }\n </div>\n <ax-button\n [text]=\"'@acorex:chat.info-panel.actions.reset-to-default' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"applyMessageListBackground('')\"\n ></ax-button>\n </div>\n </section>\n }\n </div>\n }\n </div>\n}\n", styles: ["@layer properties;@layer components{ax-conversation-info-panel{display:block;height:100%;width:100%}ax-conversation-info-panel .tg-info-panel{display:flex;flex-direction:column;max-height:min(85vh,40rem)}ax-conversation-info-panel .tg-info-panel__scroll{overflow-y:auto;overscroll-behavior:contain}ax-conversation-info-panel .tg-hero{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 6);padding-block:calc(var(--spacing, .25rem) * 5);padding-top:calc(var(--spacing, .25rem) * 5);padding-bottom:calc(var(--spacing, .25rem) * 4);text-align:center}ax-conversation-info-panel .tg-hero__title{margin-top:calc(var(--spacing, .25rem) * 1);margin-bottom:calc(var(--spacing, .25rem) * 0);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));--tw-leading: 1.35;line-height:1.35;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);overflow-wrap:break-word;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-hero__subtitle{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-info-panel .tg-quick-actions{display:flex;flex-wrap:nowrap;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5);padding-inline:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-info-panel .tg-quick-action{display:flex;max-width:5.5rem;min-width:calc(var(--spacing, .25rem) * 0);flex:1;cursor:pointer;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:var(--radius-xl, .75rem);--tw-border-style: none;border-style:none;background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 1.5);padding-block:calc(var(--spacing, .25rem) * 2.5);color:rgba(var(--ax-sys-color-primary-500));transition:background-color .15s ease}ax-conversation-info-panel .tg-quick-action:hover{background-color:rgba(var(--ax-sys-color-border-light-surface))}ax-conversation-info-panel .tg-quick-action--danger{color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-info-panel .tg-quick-action--active{color:rgba(var(--ax-sys-color-warning-500));background:rgba(var(--ax-sys-color-warning-500),.14)}ax-conversation-info-panel .tg-quick-action--active .tg-quick-action__label{color:rgba(var(--ax-sys-color-warning-500));opacity:100%}ax-conversation-info-panel .tg-quick-action__icon{font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-leading: 1;line-height:1}ax-conversation-info-panel .tg-quick-action__label{text-align:center;font-size:.6875rem;--tw-leading: 1.1;line-height:1.1;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-info-panel .tg-tabs{margin-inline:calc(var(--spacing, .25rem) * 3);display:flex;gap:calc(var(--spacing, .25rem) * 0);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface))}ax-conversation-info-panel .tg-tab{flex:1;cursor:pointer;border-bottom-style:var(--tw-border-style);border-bottom-width:2px;--tw-border-style: none;border-style:none;border-color:transparent;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 2.5);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface));opacity:55%;transition:opacity .15s ease,color .15s ease,border-color .15s ease}ax-conversation-info-panel .tg-tab:hover{opacity:80%}ax-conversation-info-panel .tg-tab--active{color:rgba(var(--ax-sys-color-primary-500));opacity:100%;border-bottom-color:rgb(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-section{padding-block:calc(var(--spacing, .25rem) * 1)}ax-conversation-info-panel .tg-detail-row,ax-conversation-info-panel .tg-member-row{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3.5);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2.5)}ax-conversation-info-panel .tg-media-row{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3.5);--tw-border-style: none;border-style:none;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2.5);text-align:start;transition:background-color .15s ease}ax-conversation-info-panel .tg-media-row:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-info-panel .tg-media-row__icon{width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;text-align:center;color:rgba(var(--ax-sys-color-on-surface));opacity:75%}ax-conversation-info-panel .tg-media-row__label{min-width:calc(var(--spacing, .25rem) * 0);flex:1;font-size:.9375rem;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-media-row__chevron{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:.45}ax-conversation-info-panel .tg-loading{padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4);text-align:center;font-size:.8125rem;color:rgba(var(--ax-sys-color-on-surface));opacity:60%}ax-conversation-info-panel .tg-detail-row__icon{width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;text-align:center;color:rgba(var(--ax-sys-color-primary-500));opacity:90%}ax-conversation-info-panel .tg-detail-row__content,ax-conversation-info-panel .tg-member-row__content{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-info-panel .tg-detail-row__value,ax-conversation-info-panel .tg-member-row__name{overflow:hidden;font-size:.9375rem;--tw-leading: 1.3;line-height:1.3;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-detail-row__label,ax-conversation-info-panel .tg-member-row__meta{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-leading: 1.2;line-height:1.2;color:rgba(var(--ax-sys-color-on-surface));opacity:60%}ax-conversation-info-panel .tg-member-row__meta--online{color:rgba(var(--ax-sys-color-primary-500));opacity:100%}ax-conversation-info-panel .tg-section-header{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-top:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-info-panel .tg-section-header--row{flex-direction:row;align-items:center;justify-content:space-between}ax-conversation-info-panel .tg-section-header__actions{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-conversation-info-panel .tg-icon-btn{display:inline-flex;height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;color:rgba(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-icon-btn:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-info-panel .tg-members-search-wrap{padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-section-header__title{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: .06em;letter-spacing:.06em;color:rgba(var(--ax-sys-color-on-surface));text-transform:uppercase;opacity:55%}ax-conversation-info-panel .tg-members-search{width:100%}ax-conversation-info-panel .tg-member-row__badge{flex-shrink:0;border-radius:calc(infinity * 1px);padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * .5);font-size:.6875rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-500));background:rgba(var(--ax-sys-color-primary-500),.14)}ax-conversation-info-panel .tg-manage{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-info-panel .tg-manage-block{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-manage-label{font-size:.8125rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-setting-row{display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-setting-row__info{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-info-panel .tg-setting-row__title{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-setting-row__desc{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-info-panel .tg-background-desc{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-info-panel .tg-background-grid{display:grid;gap:calc(var(--spacing, .25rem) * 2);grid-template-columns:repeat(3,minmax(0,1fr))}ax-conversation-info-panel .tg-background-swatch{position:relative;height:calc(var(--spacing, .25rem) * 11);cursor:pointer;overflow:hidden;border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:2px;border-color:transparent}ax-conversation-info-panel .tg-background-swatch--active{border-color:rgba(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-background-swatch__label{position:absolute;inset-inline-start:calc(var(--spacing, .25rem) * 1.5);bottom:calc(var(--spacing, .25rem) * .5);font-size:.65rem;--tw-font-weight: var(--font-weight-light, 300);font-weight:var(--font-weight-light, 300);--tw-tracking: .1rem;letter-spacing:.1rem;color:var(--color-white, #fff);mix-blend-mode:difference}ax-conversation-info-panel .tg-danger{padding-top:calc(var(--spacing, .25rem) * 1);padding-bottom:calc(var(--spacing, .25rem) * 3)}ax-conversation-info-panel .tg-danger-row{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3);--tw-border-style: none;border-style:none;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);text-align:start;font-size:.9375rem;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-info-panel .tg-danger-row:hover{background:rgba(var(--ax-sys-color-danger-500),.06)}}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading: initial;--tw-font-weight: initial;--tw-border-style: solid;--tw-tracking: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
14787
|
+
], providers: [{ provide: AXClosableComponent, useExisting: AXConversationInfoPanelComponent }], template: "@if (conversation) {\n <div class=\"tg-info-panel\">\n @if (panelView() === 'media' && selectedMediaCategory(); as category) {\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"mediaViewLoader\"\n [inputs]=\"getMediaViewInputs(category)\"\n />\n } @else {\n <div class=\"tg-info-panel__scroll\">\n <section class=\"tg-hero\">\n <ax-conversation-avatar kind=\"auto\" [conversation]=\"conversation\" [size]=\"96\" />\n <h2 class=\"tg-hero__title\">{{ conversation.title }}</h2>\n <p class=\"tg-hero__subtitle\">{{ heroSubtitle() }}</p>\n </section>\n\n <section class=\"tg-quick-actions\">\n @for (action of quickActions(); track action.id) {\n <button\n type=\"button\"\n class=\"tg-quick-action\"\n [class.tg-quick-action--danger]=\"action.danger\"\n [class.tg-quick-action--active]=\"action.id === 'mute' && isConversationMuted()\"\n (click)=\"onQuickAction(action.id)\"\n >\n <span class=\"tg-quick-action__icon\"><i [class]=\"action.icon\"></i></span>\n <span class=\"tg-quick-action__label\">{{ action.labelKey | translate | async }}</span>\n </button>\n }\n </section>\n\n <nav class=\"tg-tabs\" role=\"tablist\">\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'profile'\"\n [attr.aria-selected]=\"activeTab() === 'profile'\"\n (click)=\"setActiveTab('profile')\"\n >\n {{ '@acorex:chat.info-panel.tabs.profile' | translate | async }}\n </button>\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'manage'\"\n [attr.aria-selected]=\"activeTab() === 'manage'\"\n (click)=\"setActiveTab('manage')\"\n >\n {{ '@acorex:chat.info-panel.tabs.manage' | translate | async }}\n </button>\n </nav>\n\n @if (activeTab() === 'profile') {\n @if (profileFields().length > 0) {\n <section class=\"tg-section tg-details\">\n @for (field of profileFields(); track field.id) {\n <div class=\"tg-detail-row\">\n <span class=\"tg-detail-row__icon\"><i [class]=\"field.icon\"></i></span>\n <div class=\"tg-detail-row__content\">\n <span class=\"tg-detail-row__value\">{{ field.value }}</span>\n <span class=\"tg-detail-row__label\">{{ field.labelKey | translate | async }}</span>\n </div>\n </div>\n }\n </section>\n }\n\n @if (loadingMessages()) {\n <div class=\"tg-loading\">{{ '@acorex:chat.info-panel.media.loading' | translate | async }}</div>\n } @else if (mediaCategories().length > 0) {\n <section class=\"tg-section tg-media\">\n @for (category of mediaCategories(); track category.id) {\n <button type=\"button\" class=\"tg-media-row\" (click)=\"openMediaCategory(category)\">\n <span class=\"tg-media-row__icon\"><i [class]=\"category.icon\"></i></span>\n <span class=\"tg-media-row__label\">{{ getMediaRowLabel(category) }}</span>\n <i class=\"fa-light fa-chevron-right tg-media-row__chevron\"></i>\n </button>\n }\n </section>\n }\n\n @if (isGroupConversation()) {\n <section class=\"tg-section tg-members\">\n <div class=\"tg-section-header tg-section-header--row\">\n <span class=\"tg-section-header__title\">{{ membersSectionTitle() }}</span>\n <div class=\"tg-section-header__actions\">\n <button\n type=\"button\"\n class=\"tg-icon-btn\"\n (click)=\"toggleMemberSearch()\"\n [attr.aria-label]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n >\n <i class=\"fa-light fa-magnifying-glass\"></i>\n </button>\n </div>\n </div>\n @if (showMemberSearch()) {\n <div class=\"tg-members-search-wrap\">\n <ax-search-box\n class=\"tg-members-search\"\n [value]=\"memberSearchQuery()\"\n (valueChange)=\"onMemberSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n ></ax-search-box>\n </div>\n }\n @for (participant of filteredMembers(); track participant.id) {\n <div class=\"tg-member-row\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"participant.id\"\n [conversation]=\"conversation\"\n [size]=\"42\"\n />\n <div class=\"tg-member-row__content\">\n <span class=\"tg-member-row__name\">{{ participant.name }}</span>\n <span\n class=\"tg-member-row__meta\"\n [class.tg-member-row__meta--online]=\"participant.status === 'online'\"\n >\n {{ getMemberSubtitle(participant) }}\n </span>\n </div>\n @if (getMemberRoleLabel(participant); as roleLabel) {\n <span class=\"tg-member-row__badge\">{{ roleLabel | translate | async }}</span>\n }\n </div>\n }\n </section>\n }\n }\n\n @if (activeTab() === 'manage') {\n <section class=\"tg-section tg-manage\">\n @if (!isPrivateConversation()) {\n <div class=\"tg-manage-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.group-details.title' | translate | async\n }}</ax-label>\n <ax-text-box\n [value]=\"editTitle\"\n (valueChange)=\"onGroupTitleChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.enter-group-title' | translate | async\"\n ></ax-text-box>\n <div class=\"tg-manage-avatar\">\n <ax-conversation-avatar-picker\n [(avatarUrl)]=\"editAvatar\"\n (avatarUrlChange)=\"onGroupAvatarChange($event)\"\n ></ax-conversation-avatar-picker>\n </div>\n </div>\n }\n\n <div class=\"tg-setting-row\">\n <div class=\"tg-setting-row__info\">\n <span class=\"tg-setting-row__title\">{{\n '@acorex:chat.info-panel.settings.archived' | translate | async\n }}</span>\n <span class=\"tg-setting-row__desc\">{{\n '@acorex:chat.info-panel.settings.archived-description' | translate | async\n }}</span>\n </div>\n <ax-switch [(ngModel)]=\"archived\" (ngModelChange)=\"onArchivedChange($event)\"></ax-switch>\n </div>\n\n <div class=\"tg-manage-block tg-background-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.background.title' | translate | async\n }}</ax-label>\n <p class=\"tg-background-desc\">\n {{ '@acorex:chat.info-panel.background.description' | translate | async }}\n </p>\n <div class=\"tg-background-grid\">\n @for (preset of backgroundPresets; track preset.id) {\n <button\n type=\"button\"\n class=\"tg-background-swatch\"\n [class.tg-background-swatch--active]=\"isBackgroundSelected(preset)\"\n [style.background]=\"presetBackgroundPreview(preset.value)\"\n (click)=\"applyMessageListBackground(preset.value)\"\n [attr.aria-label]=\"getBackgroundAriaLabel(preset.label)\"\n >\n <span class=\"tg-background-swatch__label\">{{ preset.label }}</span>\n </button>\n }\n </div>\n <ax-button\n [text]=\"'@acorex:chat.info-panel.actions.reset-to-default' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"applyMessageListBackground('')\"\n ></ax-button>\n </div>\n </section>\n }\n </div>\n }\n </div>\n}\n", styles: ["@layer properties;@layer components{ax-conversation-info-panel{display:block;height:100%;width:100%}ax-conversation-info-panel .tg-info-panel{display:flex;flex-direction:column;max-height:min(85vh,40rem)}ax-conversation-info-panel .tg-info-panel__scroll{overflow-y:auto;overscroll-behavior:contain}ax-conversation-info-panel .tg-hero{display:flex;flex-direction:column;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 6);padding-block:calc(var(--spacing, .25rem) * 5);padding-top:calc(var(--spacing, .25rem) * 5);padding-bottom:calc(var(--spacing, .25rem) * 4);text-align:center}ax-conversation-info-panel .tg-hero__title{margin-top:calc(var(--spacing, .25rem) * 1);margin-bottom:calc(var(--spacing, .25rem) * 0);font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));--tw-leading: 1.35;line-height:1.35;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);overflow-wrap:break-word;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-hero__subtitle{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-info-panel .tg-quick-actions{display:flex;flex-wrap:nowrap;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5);padding-inline:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-info-panel .tg-quick-action{display:flex;max-width:5.5rem;min-width:calc(var(--spacing, .25rem) * 0);flex:1;cursor:pointer;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:var(--radius-xl, .75rem);--tw-border-style: none;border-style:none;background-color:rgba(var(--ax-sys-color-lighter-surface));padding-inline:calc(var(--spacing, .25rem) * 1.5);padding-block:calc(var(--spacing, .25rem) * 2.5);color:rgba(var(--ax-sys-color-primary-500));transition:background-color .15s ease}ax-conversation-info-panel .tg-quick-action:hover{background-color:rgba(var(--ax-sys-color-border-light-surface))}ax-conversation-info-panel .tg-quick-action--danger{color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-info-panel .tg-quick-action--active{color:rgba(var(--ax-sys-color-warning-500));background:rgba(var(--ax-sys-color-warning-500),.14)}ax-conversation-info-panel .tg-quick-action--active .tg-quick-action__label{color:rgba(var(--ax-sys-color-warning-500));opacity:100%}ax-conversation-info-panel .tg-quick-action__icon{font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-leading: 1;line-height:1}ax-conversation-info-panel .tg-quick-action__label{text-align:center;font-size:.6875rem;--tw-leading: 1.1;line-height:1.1;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));opacity:85%}ax-conversation-info-panel .tg-tabs{margin-inline:calc(var(--spacing, .25rem) * 3);display:flex;gap:calc(var(--spacing, .25rem) * 0);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface))}ax-conversation-info-panel .tg-tab{flex:1;cursor:pointer;border-bottom-style:var(--tw-border-style);border-bottom-width:2px;--tw-border-style: none;border-style:none;border-color:transparent;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 2.5);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface));opacity:55%;transition:opacity .15s ease,color .15s ease,border-color .15s ease}ax-conversation-info-panel .tg-tab:hover{opacity:80%}ax-conversation-info-panel .tg-tab--active{color:rgba(var(--ax-sys-color-primary-500));opacity:100%;border-bottom-color:rgb(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-section{padding-block:calc(var(--spacing, .25rem) * 1)}ax-conversation-info-panel .tg-detail-row,ax-conversation-info-panel .tg-member-row{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;gap:calc(var(--spacing, .25rem) * 3.5);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2.5)}ax-conversation-info-panel .tg-media-row{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3.5);--tw-border-style: none;border-style:none;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2.5);text-align:start;transition:background-color .15s ease}ax-conversation-info-panel .tg-media-row:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-info-panel .tg-media-row__icon{width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;text-align:center;color:rgba(var(--ax-sys-color-on-surface));opacity:75%}ax-conversation-info-panel .tg-media-row__label{min-width:calc(var(--spacing, .25rem) * 0);flex:1;font-size:.9375rem;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-media-row__chevron{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:.45}ax-conversation-info-panel .tg-loading{padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4);text-align:center;font-size:.8125rem;color:rgba(var(--ax-sys-color-on-surface));opacity:60%}ax-conversation-info-panel .tg-detail-row__icon{width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;text-align:center;color:rgba(var(--ax-sys-color-primary-500));opacity:90%}ax-conversation-info-panel .tg-detail-row__content,ax-conversation-info-panel .tg-member-row__content{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-info-panel .tg-detail-row__value,ax-conversation-info-panel .tg-member-row__name{overflow:hidden;font-size:.9375rem;--tw-leading: 1.3;line-height:1.3;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-detail-row__label,ax-conversation-info-panel .tg-member-row__meta{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-leading: 1.2;line-height:1.2;color:rgba(var(--ax-sys-color-on-surface));opacity:60%}ax-conversation-info-panel .tg-member-row__meta--online{color:rgba(var(--ax-sys-color-primary-500));opacity:100%}ax-conversation-info-panel .tg-section-header{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-top:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 1.5)}ax-conversation-info-panel .tg-section-header--row{flex-direction:row;align-items:center;justify-content:space-between}ax-conversation-info-panel .tg-section-header__actions{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-conversation-info-panel .tg-icon-btn{display:inline-flex;height:calc(var(--spacing, .25rem) * 8);width:calc(var(--spacing, .25rem) * 8);cursor:pointer;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);--tw-border-style: none;border-style:none;background-color:transparent;color:rgba(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-icon-btn:hover{background-color:rgba(var(--ax-sys-color-lighter-surface))}ax-conversation-info-panel .tg-members-search-wrap{padding-inline:calc(var(--spacing, .25rem) * 4);padding-bottom:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-section-header__title{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: .06em;letter-spacing:.06em;color:rgba(var(--ax-sys-color-on-surface));text-transform:uppercase;opacity:55%}ax-conversation-info-panel .tg-members-search{width:100%}ax-conversation-info-panel .tg-member-row__badge{flex-shrink:0;border-radius:calc(infinity * 1px);padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * .5);font-size:.6875rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-primary-500));background:rgba(var(--ax-sys-color-primary-500),.14)}ax-conversation-info-panel .tg-manage{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);padding-bottom:calc(var(--spacing, .25rem) * 4)}ax-conversation-info-panel .tg-manage-block{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-manage-label{font-size:.8125rem;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-setting-row{display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 2)}ax-conversation-info-panel .tg-setting-row__info{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-info-panel .tg-setting-row__title{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-info-panel .tg-setting-row__desc{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgba(var(--ax-sys-color-on-surface));opacity:.65}ax-conversation-info-panel .tg-background-desc{margin:calc(var(--spacing, .25rem) * 0);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));opacity:70%}ax-conversation-info-panel .tg-background-grid{display:grid;gap:calc(var(--spacing, .25rem) * 2);grid-template-columns:repeat(3,minmax(0,1fr))}ax-conversation-info-panel .tg-background-swatch{position:relative;height:calc(var(--spacing, .25rem) * 11);cursor:pointer;overflow:hidden;border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:2px;border-color:transparent}ax-conversation-info-panel .tg-background-swatch--active{border-color:rgba(var(--ax-sys-color-primary-500))}ax-conversation-info-panel .tg-background-swatch__label{position:absolute;inset-inline-start:calc(var(--spacing, .25rem) * 1.5);bottom:calc(var(--spacing, .25rem) * .5);font-size:.65rem;--tw-font-weight: var(--font-weight-light, 300);font-weight:var(--font-weight-light, 300);--tw-tracking: .1rem;letter-spacing:.1rem;color:var(--color-white, #fff);mix-blend-mode:difference}ax-conversation-info-panel .tg-danger{padding-top:calc(var(--spacing, .25rem) * 1);padding-bottom:calc(var(--spacing, .25rem) * 3)}ax-conversation-info-panel .tg-danger-row{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3);--tw-border-style: none;border-style:none;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);text-align:start;font-size:.9375rem;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-danger-500))}ax-conversation-info-panel .tg-danger-row:hover{background:rgba(var(--ax-sys-color-danger-500),.06)}}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-tracking{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading: initial;--tw-font-weight: initial;--tw-border-style: solid;--tw-tracking: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
|
|
15068
14788
|
}], propDecorators: { onClosed: [{ type: i0.Output, args: ["onClosed"] }] } });
|
|
15069
14789
|
|
|
15070
14790
|
var conversationInfoPanel_component = /*#__PURE__*/Object.freeze({
|
|
@@ -17232,7 +16952,7 @@ function createProviders(options, includeServices) {
|
|
|
17232
16952
|
const mergedConfig = mergeWithDefaults(config);
|
|
17233
16953
|
providers.push({ provide: AX_CONVERSATION_CONFIG, useValue: mergedConfig });
|
|
17234
16954
|
// Built-in conversation file-type plugins (image, video, audio, file, voice) + validation rules
|
|
17235
|
-
providers.push(...provideConversationComposerFileTypes(
|
|
16955
|
+
providers.push(...provideConversationComposerFileTypes());
|
|
17236
16956
|
if (realtimeApi) {
|
|
17237
16957
|
providers.push({ provide: AXConversationRealtimeApi, useClass: realtimeApi });
|
|
17238
16958
|
}
|
|
@@ -17610,5 +17330,5 @@ function getErrorMessage(code, params) {
|
|
|
17610
17330
|
* Generated bundle index. Do not edit.
|
|
17611
17331
|
*/
|
|
17612
17332
|
|
|
17613
|
-
export { AXConversationAiResponderService, AXConversationApi, AXConversationApiLoggerService, AXConversationAudioAttachmentComponent, AXConversationAudioFileTypeProvider, AXConversationAudioPickerComponent, AXConversationAudioRendererComponent, AXConversationBaseRegistry, AXConversationComposerActionRegistry, AXConversationComposerComponent, AXConversationComposerFileTypesProvider, AXConversationComposerPopupComponent, AXConversationComposerService, AXConversationComposerTabRegistry, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationEmojiTabComponent, AXConversationErrorHandlerService, AXConversationFallbackRendererComponent, AXConversationFileAttachmentComponent, AXConversationFileFileTypeProvider, AXConversationFilePickerComponent, AXConversationFileRendererComponent, AXConversationForwardMessageDialogComponent, AXConversationImageAttachmentComponent, AXConversationImageFileTypeProvider, AXConversationImagePickerComponent, AXConversationImageRendererComponent, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfiniteScrollDirective, AXConversationInfoBarActionRegistry, AXConversationInfoBarComponent, AXConversationInfoBarSearchComponent, AXConversationInfoBarService, AXConversationInfoMediaViewComponent, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationLocationPickerComponent, AXConversationLocationRendererComponent, AXConversationMediaPlaybackInfoBarBannerComponent, AXConversationMessageActionRegistry, AXConversationMessageApi, AXConversationMessageListComponent, AXConversationMessageListNoActiveDefaultComponent, AXConversationMessageListService, AXConversationMessageRendererCopyHostComponent, AXConversationMessageRendererRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationModule, AXConversationNewDialogComponent, AXConversationPickerCaptionComponent, AXConversationPickerEmptyComponent, AXConversationPickerFooterComponent, AXConversationPickerHeaderComponent, AXConversationPickerShellComponent, AXConversationPickerToolbarComponent, AXConversationRealtimeApi, AXConversationRegistryService, AXConversationService, AXConversationSharedStorage, AXConversationSidebarComponent, AXConversationSidebarService, AXConversationStickerRendererComponent, AXConversationStickerTabComponent, AXConversationSystemRendererComponent, AXConversationTabRegistry, AXConversationTextRendererComponent, AXConversationUserApi, AXConversationVideoAttachmentComponent, AXConversationVideoFileTypeProvider, AXConversationVideoPickerComponent, AXConversationVideoRendererComponent, AXConversationVoiceFileTypeProvider, AXConversationVoiceRecorderComponent, AXConversationVoiceRendererComponent,
|
|
17333
|
+
export { AXConversationAiResponderService, AXConversationApi, AXConversationApiLoggerService, AXConversationAudioAttachmentComponent, AXConversationAudioFileTypeProvider, AXConversationAudioPickerComponent, AXConversationAudioRendererComponent, AXConversationBaseRegistry, AXConversationComposerActionRegistry, AXConversationComposerComponent, AXConversationComposerFileTypesProvider, AXConversationComposerPopupComponent, AXConversationComposerService, AXConversationComposerTabRegistry, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationEmojiTabComponent, AXConversationErrorHandlerService, AXConversationFallbackRendererComponent, AXConversationFileAttachmentComponent, AXConversationFileFileTypeProvider, AXConversationFilePickerComponent, AXConversationFileRendererComponent, AXConversationForwardMessageDialogComponent, AXConversationImageAttachmentComponent, AXConversationImageFileTypeProvider, AXConversationImagePickerComponent, AXConversationImageRendererComponent, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfiniteScrollDirective, AXConversationInfoBarActionRegistry, AXConversationInfoBarComponent, AXConversationInfoBarSearchComponent, AXConversationInfoBarService, AXConversationInfoMediaViewComponent, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationLocationPickerComponent, AXConversationLocationRendererComponent, AXConversationMediaPlaybackInfoBarBannerComponent, AXConversationMessageActionRegistry, AXConversationMessageApi, AXConversationMessageListComponent, AXConversationMessageListNoActiveDefaultComponent, AXConversationMessageListService, AXConversationMessageRendererCopyHostComponent, AXConversationMessageRendererRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationModule, AXConversationNewDialogComponent, AXConversationPickerCaptionComponent, AXConversationPickerEmptyComponent, AXConversationPickerFooterComponent, AXConversationPickerHeaderComponent, AXConversationPickerShellComponent, AXConversationPickerToolbarComponent, AXConversationRealtimeApi, AXConversationRegistryService, AXConversationService, AXConversationSharedStorage, AXConversationSidebarComponent, AXConversationSidebarService, AXConversationStickerRendererComponent, AXConversationStickerTabComponent, AXConversationSystemRendererComponent, AXConversationTabRegistry, AXConversationTextRendererComponent, AXConversationUserApi, AXConversationVideoAttachmentComponent, AXConversationVideoFileTypeProvider, AXConversationVideoPickerComponent, AXConversationVideoRendererComponent, AXConversationVoiceFileTypeProvider, AXConversationVoiceRecorderComponent, AXConversationVoiceRendererComponent, AX_CONVERSATION_AI_API_KEY, AX_CONVERSATION_AUDIO_CATALOG, AX_CONVERSATION_AUDIO_PRESENTATION, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_BUILTIN_COMPOSER_TABS, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_CONFIG, AX_CONVERSATION_CONNECTION_ERRORS, AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, AX_CONVERSATION_CURSOR_PREFIX, AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS, AX_CONVERSATION_DEFAULT_COMPOSER_TABS, AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS, AX_CONVERSATION_DEFAULT_CONVERSATION_TABS, AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS, AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND, AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS, AX_CONVERSATION_DEMO_CONVERSATION_IDS, AX_CONVERSATION_ERRORS, AX_CONVERSATION_ERROR_HANDLER_CONFIG, AX_CONVERSATION_ERROR_MESSAGES, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_CATALOG, AX_CONVERSATION_FILE_ERRORS, AX_CONVERSATION_FILE_PRESENTATION, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_FILE_TYPES_READY, AX_CONVERSATION_IMAGE_CATALOG, AX_CONVERSATION_IMAGE_PRESENTATION, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_ERRORS, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_CURSOR_PREFIX, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_ERRORS, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE, AX_CONVERSATION_REGISTRY_CONFIG, AX_CONVERSATION_STICKER_API_KEY, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_BOT, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_URL_ERRORS, AX_CONVERSATION_USER_AVATAR_COMPONENT, AX_CONVERSATION_USER_ERRORS, AX_CONVERSATION_VIDEO_CATALOG, AX_CONVERSATION_VIDEO_PRESENTATION, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_CATALOG, AX_CONVERSATION_VOICE_PRESENTATION, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, AX_MESSAGE_PAGINATION_CONVERSATION_ID, abortPickerUploads, applyAudioLocalPreview, applyConversationFilters, applyFileLocalPreview, applyLocalPreview, applyVideoLocalPreview, applyVoiceLocalPreview, audioItemFromUpload, axConversationIndexedDbStorage, axConversationSharedStorage, bindMediaRendererContentState, buildMediaGalleryTiles, canShowRendererContentError, cleanupPickerUploads, conversationAudioUtilities, conversationFileUtilities, conversationImageUtilities, conversationVideoUtilities, conversationVoiceUtilities, copyWithFileTypeFallback, createConversationAudioFileType, createConversationFileFileType, createConversationImageFileType, createConversationVideoFileType, createConversationVoiceFileType, createLocalPreviewUrl, createObjectUrl, createPickerDragHandlers, createResolvedMediaUrlSignal, deleteUploadedPickerMedia, dismissComposerPickerHost, encodeConversationCursor, encodeMessageCursor, ensurePaginationDemoData, fetchConversationMediaMessages, fetchConversationMediaPage, fileItemFromUpload, filterMessagesByMediaCategory, filterSupplementalInfoPanelMessages, findExistingPrivateConversation, formatDuration, formatErrorMessage, formatFileByteSize, formatFileSize, formatMediaDuration, formatPickerValidationMessage, getConversationLastActivity, getConversationMediaCategories, getConversationMessagesNewestFirst, getConversationProfileFields, getErrorMessage, getMessageAudioItems, getMessageVideoItems, getPickerCancelUploadLabel, getPrivatePeerParticipant, getSortedConversationsForInbox, inferFileExtensionHintFromMessage, isAttachmentListCategory, isComposerTabEnabled, isConversationReactionsEnabled, isGenericPrivateConversationTitle, isGridMediaCategory, isMessageDeliveryPending, isMessageListThemeBackground, isNonPersistableMediaUrl, isPickerItemReadyToSend, isSameMessageListBackground, isUploadAborted, limitFilesToCapacity, mediaCopyText, mergeAudioUploadResult, mergeFileUploadResult, mergeInfoPanelMessages, mergeUploadResult, mergeVideoUploadResult, mergeVoiceUploadResult, mergeWithDefaults, messageContainsLink, normalizeAllConversationMessageIndexes, normalizeAudioPayload, normalizeFilePayload, normalizeImagePayload, normalizeMessageListBackgroundValue, normalizeMessagePayload, normalizeMessagePayloadAsync, normalizeVideoPayload, notifyMaxFilesCapacityExceeded, notifyPickerValidationErrors, openWithFileType, paginateChatNewestFirst, paginateChatOldestFirst, parseChatCursor, pickDisplayMediaUrl, pickerItemToMediaReference, pickerItemToUploadResult, provideConversation, provideConversationComposerFileTypes, provideConversationFileCatalog, registerChatMessage, reportMediaLoadError, resolveComposerMaxFiles, resolveConversationAvatarDisplay, resolveConversationComposerTabs, resolveConversationForViewer, resolveConversationMessageFileType, resolveConversationTitleForViewer, resolveGalleryImageUrl, resolveImageDisplayUrl, resolveMessageListBackgroundRaw, resolveMessageListBackgroundStyle, resolveParticipantProfile, resolvePersistableMediaUrl, resolvePersistedThumbnailUrl, resolvePrivatePeerParticipant, resolvePrivatePeerUserId, resolveUserAvatarDisplay, resolveVideoThumbnailUrl, revokeObjectUrl, revokePickerBlobPreviews, sanitizeInput, seedPickerInitialFiles, seedSharedStorageInitialData, shouldUseUserAvatarForConversation, sortConversationMessageIds, syncPlaybackInfoBarBanner, toUploaderReference as toMediaItemUploaderReference, toUploaderReference$1 as toUploaderReference, unregisterChatMessage, uploadPickerFile, validateConversationId, validateEmail, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds, videoItemFromUpload };
|
|
17614
17334
|
//# sourceMappingURL=acorex-components-conversation.mjs.map
|