@siemens/element-ng 49.0.0 → 49.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/siemens-element-ng-accordion.mjs +2 -2
- package/fesm2022/siemens-element-ng-accordion.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-application-header.mjs +2 -2
- package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-chat-messages.mjs +5 -5
- package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-dashboard.mjs +15 -19
- package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-datatable.mjs +2 -1
- package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-datepicker.mjs +1 -1
- package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-file-uploader.mjs +0 -1
- package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-filtered-search.mjs +9 -12
- package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-formly.mjs +1 -1
- package/fesm2022/siemens-element-ng-formly.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-landing-page.mjs +19 -5
- package/fesm2022/siemens-element-ng-landing-page.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-navbar-vertical.mjs +2 -2
- package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-side-panel.mjs +2 -2
- package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tabs.mjs +67 -5
- package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-typeahead.mjs +69 -19
- package/fesm2022/siemens-element-ng-typeahead.mjs.map +1 -1
- package/package.json +4 -4
- package/schematics/utils/ts-compiler-host.js +3 -0
- package/template-i18n.json +2 -0
- package/types/siemens-element-ng-dashboard.d.ts +13 -14
- package/types/siemens-element-ng-datatable.d.ts +1 -0
- package/types/siemens-element-ng-file-uploader.d.ts +1 -1
- package/types/siemens-element-ng-landing-page.d.ts +6 -0
- package/types/siemens-element-ng-tabs.d.ts +51 -2
- package/types/siemens-element-ng-translate.d.ts +2 -0
- package/types/siemens-element-ng-typeahead.d.ts +29 -2
|
@@ -206,7 +206,7 @@ class SiAiMessageComponent {
|
|
|
206
206
|
*/
|
|
207
207
|
secondaryActionsLabel = input(t(() => $localize `:@@SI_AI_MESSAGE.SECONDARY_ACTIONS:More actions`), ...(ngDevMode ? [{ debugName: "secondaryActionsLabel" }] : []));
|
|
208
208
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiAiMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
209
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiAiMessageComponent, isStandalone: true, selector: "si-ai-message", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, contentFormatter: { classPropertyName: "contentFormatter", publicName: "contentFormatter", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, secondaryActions: { classPropertyName: "secondaryActions", publicName: "secondaryActions", isSignal: true, isRequired: false, transformFunction: null }, actionParam: { classPropertyName: "actionParam", publicName: "actionParam", isSignal: true, isRequired: false, transformFunction: null }, secondaryActionsLabel: { classPropertyName: "secondaryActionsLabel", publicName: "secondaryActionsLabel", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "formattedContent", first: true, predicate: ["formattedContent"], descendants: true, isSignal: true }], ngImport: i0, template: "<si-chat-message alignment=\"start\" actionsPosition=\"bottom\" [loading]=\"loading()\">\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n\n @if (
|
|
209
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiAiMessageComponent, isStandalone: true, selector: "si-ai-message", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, contentFormatter: { classPropertyName: "contentFormatter", publicName: "contentFormatter", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, secondaryActions: { classPropertyName: "secondaryActions", publicName: "secondaryActions", isSignal: true, isRequired: false, transformFunction: null }, actionParam: { classPropertyName: "actionParam", publicName: "actionParam", isSignal: true, isRequired: false, transformFunction: null }, secondaryActionsLabel: { classPropertyName: "secondaryActionsLabel", publicName: "secondaryActionsLabel", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "formattedContent", first: true, predicate: ["formattedContent"], descendants: true, isSignal: true }], ngImport: i0, template: "<si-chat-message alignment=\"start\" actionsPosition=\"bottom\" [loading]=\"loading()\">\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n\n @if (actions().length > 0 || secondaryActions().length > 0) {\n <div class=\"d-flex gap-4 ai-message-actions\" siChatMessageAction>\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label | translate\"\n (click)=\"action.action(actionParam(), action)\"\n >\n <si-icon [icon]=\"action.icon\" />\n </button>\n }\n\n @if (secondaryActions().length > 0) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon [icon]=\"icons.elementOptionsVertical\" />\n </button>\n\n <ng-template #secondaryActionsMenu>\n <si-menu-factory [items]=\"secondaryActions()\" [actionParam]=\"actionParam()\" />\n </ng-template>\n }\n </div>\n }\n</si-chat-message>\n", styles: [":host{display:block}si-chat-message{--chat-message-bubble-bg: transparent;--chat-message-bubble-padding: 0;margin-block-end:-4px}.ai-message-actions{margin-block-start:8px}:host ::ng-deep si-loading-spinner{--loading-spinner-size: 1.5em}\n"], dependencies: [{ kind: "directive", type: CdkMenuTrigger, selector: "[cdkMenuTriggerFor]", inputs: ["cdkMenuTriggerFor", "cdkMenuPosition", "cdkMenuTriggerData", "cdkMenuTriggerTransformOriginOn"], outputs: ["cdkMenuOpened", "cdkMenuClosed"], exportAs: ["cdkMenuTriggerFor"] }, { kind: "component", type: SiChatMessageComponent, selector: "si-chat-message", inputs: ["loading", "alignment", "actionsPosition"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "component", type: SiMenuFactoryComponent, selector: "si-menu-factory", inputs: ["items", "actionParam"] }, { kind: "directive", type: SiChatMessageActionDirective, selector: "[siChatMessageAction]" }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
210
210
|
}
|
|
211
211
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiAiMessageComponent, decorators: [{
|
|
212
212
|
type: Component,
|
|
@@ -217,7 +217,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
|
|
|
217
217
|
SiMenuFactoryComponent,
|
|
218
218
|
SiChatMessageActionDirective,
|
|
219
219
|
SiTranslatePipe
|
|
220
|
-
], template: "<si-chat-message alignment=\"start\" actionsPosition=\"bottom\" [loading]=\"loading()\">\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n\n @if (
|
|
220
|
+
], template: "<si-chat-message alignment=\"start\" actionsPosition=\"bottom\" [loading]=\"loading()\">\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n\n @if (actions().length > 0 || secondaryActions().length > 0) {\n <div class=\"d-flex gap-4 ai-message-actions\" siChatMessageAction>\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label | translate\"\n (click)=\"action.action(actionParam(), action)\"\n >\n <si-icon [icon]=\"action.icon\" />\n </button>\n }\n\n @if (secondaryActions().length > 0) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon [icon]=\"icons.elementOptionsVertical\" />\n </button>\n\n <ng-template #secondaryActionsMenu>\n <si-menu-factory [items]=\"secondaryActions()\" [actionParam]=\"actionParam()\" />\n </ng-template>\n }\n </div>\n }\n</si-chat-message>\n", styles: [":host{display:block}si-chat-message{--chat-message-bubble-bg: transparent;--chat-message-bubble-padding: 0;margin-block-end:-4px}.ai-message-actions{margin-block-start:8px}:host ::ng-deep si-loading-spinner{--loading-spinner-size: 1.5em}\n"] }]
|
|
221
221
|
}], ctorParameters: () => [], propDecorators: { formattedContent: [{ type: i0.ViewChild, args: ['formattedContent', { isSignal: true }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], contentFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentFormatter", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: false }] }], secondaryActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondaryActions", required: false }] }], actionParam: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionParam", required: false }] }], secondaryActionsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondaryActionsLabel", required: false }] }] } });
|
|
222
222
|
|
|
223
223
|
/**
|
|
@@ -1005,7 +1005,7 @@ class SiUserMessageComponent {
|
|
|
1005
1005
|
});
|
|
1006
1006
|
}
|
|
1007
1007
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiUserMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1008
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiUserMessageComponent, isStandalone: true, selector: "si-user-message", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, contentFormatter: { classPropertyName: "contentFormatter", publicName: "contentFormatter", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, secondaryActions: { classPropertyName: "secondaryActions", publicName: "secondaryActions", isSignal: true, isRequired: false, transformFunction: null }, attachments: { classPropertyName: "attachments", publicName: "attachments", isSignal: true, isRequired: false, transformFunction: null }, actionParam: { classPropertyName: "actionParam", publicName: "actionParam", isSignal: true, isRequired: false, transformFunction: null }, secondaryActionsLabel: { classPropertyName: "secondaryActionsLabel", publicName: "secondaryActionsLabel", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "formattedContent", first: true, predicate: ["formattedContent"], descendants: true, isSignal: true }], ngImport: i0, template: "<si-chat-message alignment=\"end\" actionsPosition=\"bottom\" [loading]=\"false\">\n @if (hasAttachments()) {\n <si-attachment-list alignment=\"end\" [attachments]=\"attachments()\" [removable]=\"false\" />\n }\n\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n @if (
|
|
1008
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiUserMessageComponent, isStandalone: true, selector: "si-user-message", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, contentFormatter: { classPropertyName: "contentFormatter", publicName: "contentFormatter", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, secondaryActions: { classPropertyName: "secondaryActions", publicName: "secondaryActions", isSignal: true, isRequired: false, transformFunction: null }, attachments: { classPropertyName: "attachments", publicName: "attachments", isSignal: true, isRequired: false, transformFunction: null }, actionParam: { classPropertyName: "actionParam", publicName: "actionParam", isSignal: true, isRequired: false, transformFunction: null }, secondaryActionsLabel: { classPropertyName: "secondaryActionsLabel", publicName: "secondaryActionsLabel", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "formattedContent", first: true, predicate: ["formattedContent"], descendants: true, isSignal: true }], ngImport: i0, template: "<si-chat-message alignment=\"end\" actionsPosition=\"bottom\" [loading]=\"false\">\n @if (hasAttachments()) {\n <si-attachment-list alignment=\"end\" [attachments]=\"attachments()\" [removable]=\"false\" />\n }\n\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n @if (actions().length > 0 || secondaryActions().length > 0) {\n <div class=\"d-flex gap-4 user-message-actions\" siChatMessageAction>\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label | translate\"\n (click)=\"action.action(actionParam(), action)\"\n >\n <si-icon [icon]=\"action.icon\" />\n </button>\n }\n\n @if (secondaryActions().length > 0) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon [icon]=\"icons.elementOptionsVertical\" />\n </button>\n\n <ng-template #secondaryActionsMenu>\n <si-menu-factory [items]=\"secondaryActions()\" [actionParam]=\"actionParam()\" />\n </ng-template>\n }\n </div>\n }\n</si-chat-message>\n", styles: [":host{display:block}:host:not(:has([siChatMessageAction])) si-chat-message{padding-block-end:36px!important}.user-message-actions{opacity:0;transition:opacity .2s ease}si-chat-message{--chat-message-bubble-bg: var(--element-base-input-experimental);max-inline-size:600px;margin-inline-start:auto}:host:hover .user-message-actions,.user-message-actions:hover,.user-message-actions:has(::ng-deep [aria-expanded=true]),:host-context(.si-container-xs,.si-container-sm) .user-message-actions:active{opacity:1}\n"], dependencies: [{ kind: "directive", type: CdkMenuTrigger, selector: "[cdkMenuTriggerFor]", inputs: ["cdkMenuTriggerFor", "cdkMenuPosition", "cdkMenuTriggerData", "cdkMenuTriggerTransformOriginOn"], outputs: ["cdkMenuOpened", "cdkMenuClosed"], exportAs: ["cdkMenuTriggerFor"] }, { kind: "component", type: SiAttachmentListComponent, selector: "si-attachment-list", inputs: ["attachments", "alignment", "removable", "removeLabel"], outputs: ["remove"] }, { kind: "component", type: SiChatMessageComponent, selector: "si-chat-message", inputs: ["loading", "alignment", "actionsPosition"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "component", type: SiMenuFactoryComponent, selector: "si-menu-factory", inputs: ["items", "actionParam"] }, { kind: "directive", type: SiChatMessageActionDirective, selector: "[siChatMessageAction]" }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
1009
1009
|
}
|
|
1010
1010
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiUserMessageComponent, decorators: [{
|
|
1011
1011
|
type: Component,
|
|
@@ -1017,7 +1017,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
|
|
|
1017
1017
|
SiMenuFactoryComponent,
|
|
1018
1018
|
SiChatMessageActionDirective,
|
|
1019
1019
|
SiTranslatePipe
|
|
1020
|
-
], template: "<si-chat-message alignment=\"end\" actionsPosition=\"bottom\" [loading]=\"false\">\n @if (hasAttachments()) {\n <si-attachment-list alignment=\"end\" [attachments]=\"attachments()\" [removable]=\"false\" />\n }\n\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n @if (
|
|
1020
|
+
], template: "<si-chat-message alignment=\"end\" actionsPosition=\"bottom\" [loading]=\"false\">\n @if (hasAttachments()) {\n <si-attachment-list alignment=\"end\" [attachments]=\"attachments()\" [removable]=\"false\" />\n }\n\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n @if (actions().length > 0 || secondaryActions().length > 0) {\n <div class=\"d-flex gap-4 user-message-actions\" siChatMessageAction>\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label | translate\"\n (click)=\"action.action(actionParam(), action)\"\n >\n <si-icon [icon]=\"action.icon\" />\n </button>\n }\n\n @if (secondaryActions().length > 0) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon [icon]=\"icons.elementOptionsVertical\" />\n </button>\n\n <ng-template #secondaryActionsMenu>\n <si-menu-factory [items]=\"secondaryActions()\" [actionParam]=\"actionParam()\" />\n </ng-template>\n }\n </div>\n }\n</si-chat-message>\n", styles: [":host{display:block}:host:not(:has([siChatMessageAction])) si-chat-message{padding-block-end:36px!important}.user-message-actions{opacity:0;transition:opacity .2s ease}si-chat-message{--chat-message-bubble-bg: var(--element-base-input-experimental);max-inline-size:600px;margin-inline-start:auto}:host:hover .user-message-actions,.user-message-actions:hover,.user-message-actions:has(::ng-deep [aria-expanded=true]),:host-context(.si-container-xs,.si-container-sm) .user-message-actions:active{opacity:1}\n"] }]
|
|
1021
1021
|
}], ctorParameters: () => [], propDecorators: { formattedContent: [{ type: i0.ViewChild, args: ['formattedContent', { isSignal: true }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], contentFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentFormatter", required: false }] }], actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: false }] }], secondaryActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondaryActions", required: false }] }], attachments: [{ type: i0.Input, args: [{ isSignal: true, alias: "attachments", required: false }] }], actionParam: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionParam", required: false }] }], secondaryActionsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondaryActionsLabel", required: false }] }] } });
|
|
1022
1022
|
|
|
1023
1023
|
/**
|
|
@@ -1073,7 +1073,7 @@ class SiAiWelcomeScreenComponent {
|
|
|
1073
1073
|
}
|
|
1074
1074
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiAiWelcomeScreenComponent, decorators: [{
|
|
1075
1075
|
type: Component,
|
|
1076
|
-
args: [{ selector: 'si-ai-welcome-screen', imports: [SiActionCardComponent, SiSummaryChipComponent
|
|
1076
|
+
args: [{ selector: 'si-ai-welcome-screen', imports: [SiActionCardComponent, SiSummaryChipComponent], host: {
|
|
1077
1077
|
class: 'd-block'
|
|
1078
1078
|
}, template: "<div class=\"d-flex flex-column gap-10 align-items-center w-100\">\n <!-- Welcome Header -->\n <div class=\"welcome-header d-flex flex-column gap-4 w-100 pt-10 pb-8\">\n <ng-content />\n </div>\n\n <!-- Prompt Categories and Suggestions -->\n <div class=\"prompt-suggestions d-flex flex-column gap-6 align-items-center w-100\">\n @if (categories().length > 0) {\n <div class=\"d-flex gap-4 align-items-center w-100\">\n @for (category of categories(); track $index) {\n <si-summary-chip\n class=\"user-select-none\"\n [label]=\"category.label\"\n [selected]=\"selectedCategory() === category.label\"\n (selectedChange)=\"onCategoryClick(category.label)\"\n />\n }\n </div>\n }\n\n @if (promptSuggestions().length > 0) {\n <div class=\"d-flex flex-column gap-4 w-100\">\n @for (suggestion of promptSuggestions(); track $index) {\n <button si-action-card type=\"button\" class=\"w-100\" (click)=\"onPromptClick(suggestion)\">\n <div body class=\"card-body card-text\">\n {{ suggestion.text }}\n </div>\n </button>\n }\n </div>\n }\n </div>\n</div>\n", styles: [".welcome-header{max-inline-size:720px;overflow-x:visible;position:relative}.welcome-header:before{position:absolute;content:\"\";inset-inline-start:-104px;inset-block-start:50%;transform:translateY(-50%);inline-size:168px;block-size:168px;background-image:var(--element-brand-ai-key-visual);background-size:contain;background-repeat:no-repeat;background-position:center}:host{container-type:inline-size}@container (max-width: 767.98px){:host .welcome-header:before{display:none}}.prompt-suggestions{max-inline-size:720px}.prompt-suggestions>div:first-child{flex-wrap:wrap}:host{inline-size:100%}::ng-deep button[si-action-card]{background-color:var(--element-base-input-experimental)}\n"] }]
|
|
1079
1079
|
}], propDecorators: { categories: [{ type: i0.Input, args: [{ isSignal: true, alias: "categories", required: false }] }], selectedCategory: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedCategory", required: false }] }, { type: i0.Output, args: ["selectedCategoryChange"] }], promptSuggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "promptSuggestions", required: false }] }], promptSelected: [{ type: i0.Output, args: ["promptSelected"] }] } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"siemens-element-ng-chat-messages.mjs","sources":["../../../../projects/element-ng/chat-messages/si-chat-message-action.directive.ts","../../../../projects/element-ng/chat-messages/si-chat-message.component.ts","../../../../projects/element-ng/chat-messages/si-chat-message.component.html","../../../../projects/element-ng/chat-messages/si-ai-message.component.ts","../../../../projects/element-ng/chat-messages/si-ai-message.component.html","../../../../projects/element-ng/chat-messages/si-attachment-list.component.ts","../../../../projects/element-ng/chat-messages/si-attachment-list.component.html","../../../../projects/element-ng/chat-messages/si-chat-container.component.ts","../../../../projects/element-ng/chat-messages/si-chat-container.component.html","../../../../projects/element-ng/chat-messages/si-chat-container-input.directive.ts","../../../../projects/element-ng/chat-messages/si-chat-input.component.ts","../../../../projects/element-ng/chat-messages/si-chat-input.component.html","../../../../projects/element-ng/chat-messages/si-chat-input-disclaimer.directive.ts","../../../../projects/element-ng/chat-messages/si-user-message.component.ts","../../../../projects/element-ng/chat-messages/si-user-message.component.html","../../../../projects/element-ng/chat-messages/si-ai-welcome-screen.component.ts","../../../../projects/element-ng/chat-messages/si-ai-welcome-screen.component.html","../../../../projects/element-ng/chat-messages/index.ts","../../../../projects/element-ng/chat-messages/siemens-element-ng-chat-messages.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Directive } from '@angular/core';\n\n/**\n * Directive to mark content as chat message actions into {@link SiChatMessageComponent}.\n * Apply this directive to e.g. buttons that should be slotted into the message actions area.\n *\n * @example\n * ```html\n * <si-chat-message>\n * Message content\n * <button siChatMessageAction>Like</button>\n * <button siChatMessageAction>Share</button>\n * </si-chat-message>\n * ```\n *\n * @see {@link SiChatMessageComponent} for the chat message wrapper component\n *\n * @experimental\n */\n@Directive({\n selector: '[siChatMessageAction]'\n})\nexport class SiChatMessageActionDirective {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Component, input } from '@angular/core';\nimport { SiResponsiveContainerDirective } from '@siemens/element-ng/resize-observer';\n\n/**\n * Base declarative chat message component that provides the layout structure for chat messages.\n *\n * This component handles the core message layout including avatar positioning, loading states,\n * and action button as well as attachment list placement. It serves as the foundation for more specialized message components\n * like {@link SiUserMessageComponent} and {@link SiAiMessageComponent}.\n * Can be used within {@link SiChatContainerComponent}.\n *\n * The component provides:\n * - Flexible alignment (start/end) for different message types\n * - Avatar/icon slot for message attribution\n * - Loading state with skeleton UI\n * - Action buttons positioned on the side or bottom\n * - Attachment list display slot\n * - Responsive behavior that adapts to container size\n *\n * This is a low-level component designed for slotting in custom content, it provides slots via content projection:\n * - Default content: Main message content area (consider using {@link SiMarkdownRendererComponent} for markdown support)\n * - `si-avatar/si-icon/img` selector: Avatar or icon representing the message sender\n * - `si-chat-message-action` selector: Action buttons related to the message\n * - `si-attachment-list` selector: Attachment list component for displaying file attachments\n *\n * @see {@link SiUserMessageComponent} for user message display\n * @see {@link SiAiMessageComponent} for AI message display\n * @see {@link SiAttachmentListComponent} for attachment list to slot in\n * @see {@link SiChatMessageActionDirective} for action buttons to slot in\n * @see {@link SiMarkdownRendererComponent} for markdown content rendering\n * @see {@link SiChatContainerComponent} for the chat container to use this within\n *\n * @experimental\n */\n@Component({\n selector: 'si-chat-message',\n templateUrl: './si-chat-message.component.html',\n styleUrl: './si-chat-message.component.scss',\n host: {\n class: 'd-block'\n },\n hostDirectives: [SiResponsiveContainerDirective]\n})\nexport class SiChatMessageComponent {\n /**\n * Whether the message is currently loading\n * @defaultValue false\n */\n readonly loading = input(false);\n\n /**\n * Alignment of the message\n * @defaultValue 'start'\n */\n readonly alignment = input<'start' | 'end'>('start');\n\n /**\n * Where to display action buttons (if any)\n * @defaultValue 'side'\n */\n readonly actionsPosition = input<'side' | 'bottom'>('side');\n}\n","<!--- Flex-row if alignment start, flex-row-reverse if alignment end, flex-column if mobile -->\n<div class=\"d-flex si-body-2 chat-message-container\" [class.start]=\"alignment() === 'start'\">\n <div class=\"avatar-wrapper flex-shrink-0\" [class.end]=\"alignment() === 'end'\">\n <ng-content select=\"si-icon,si-avatar,img\" />\n </div>\n\n <div class=\"d-flex flex-column flex-grow-1 w-100\">\n <div class=\"attachment-slot\" [class.align-self-end]=\"alignment() === 'end'\">\n <ng-content select=\"si-attachment-list,si-badge\" />\n </div>\n\n @if (loading()) {\n <div\n class=\"message-wrapper rounded-3 w-75 text-break loading-message-bubble mb-2\"\n [class.align-self-end]=\"alignment() === 'end'\"\n >\n <div class=\"d-flex flex-column w-100 gap-2\">\n <div class=\"si-skeleton skeleton-line skeleton-line-full\"></div>\n <div class=\"si-skeleton skeleton-line skeleton-line-half\"></div>\n </div>\n </div>\n } @else {\n <!-- Flex-column if actions bottom, flex-row/flex-row-reverse if actions start -->\n <div\n class=\"message-wrapper mw-0 d-flex mb-2\"\n [class.start]=\"alignment() === 'start'\"\n [class.end]=\"alignment() === 'end'\"\n [class.flex-column]=\"actionsPosition() === 'bottom'\"\n [class.flex-row]=\"actionsPosition() === 'side' && alignment() === 'start'\"\n [class.flex-row-reverse]=\"actionsPosition() === 'side' && alignment() === 'end'\"\n [class.align-items-start]=\"actionsPosition() === 'side'\"\n [class.align-items-end]=\"actionsPosition() === 'bottom' && alignment() === 'end'\"\n [class.justify-content-end]=\"alignment() === 'end' && actionsPosition() === 'bottom'\"\n [class.justify-content-start]=\"alignment() === 'start' && actionsPosition() === 'bottom'\"\n >\n <div\n class=\"rounded-3 text-break message-bubble\"\n [class.end]=\"alignment() === 'end' && actionsPosition() === 'bottom'\"\n >\n <ng-content />\n </div>\n\n <div\n class=\"actions-wrapper d-flex gap-4\"\n [class.ms-3]=\"actionsPosition() === 'side' && alignment() === 'start'\"\n [class.me-3]=\"actionsPosition() === 'side' && alignment() === 'end'\"\n [class.mt-2]=\"actionsPosition() === 'bottom'\"\n [class.actions-horizontal]=\"actionsPosition() !== 'bottom'\"\n [class.align-self-start]=\"actionsPosition() === 'side'\"\n >\n <ng-content select=\"[siChatMessageAction]\" />\n </div>\n </div>\n }\n </div>\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport {\n booleanAttribute,\n Component,\n effect,\n input,\n viewChild,\n ElementRef,\n signal\n} from '@angular/core';\nimport { elementOptionsVertical } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { MenuItem, SiMenuFactoryComponent } from '@siemens/element-ng/menu';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { MessageAction } from './message-action.model';\nimport { SiChatMessageActionDirective } from './si-chat-message-action.directive';\nimport { SiChatMessageComponent } from './si-chat-message.component';\n\n/**\n * AI message component for displaying AI-generated responses in conversational interfaces.\n *\n * The AI message component renders AI-generated content in chat interfaces,\n * supporting text formatting, markdown, loading states, and contextual actions.\n * It appears as text (no bubble) aligned to the left side without any avatar/icon slot.\n * Can be used within {@link SiChatContainerComponent}.\n *\n * The component automatically handles:\n * - Styling for AI messages distinct from user or generic chat messages\n * - Option to render markdown content, provide via `contentFormatter` input with a markdown renderer function (e.g., from {@link getMarkdownRenderer})\n * - Showing loading states with skeleton UI during generation\n * - Displaying primary and secondary actions\n *\n * @see {@link SiChatMessageComponent} for the base message wrapper component\n * @see {@link SiUserMessageComponent} for the user message component\n * @see {@link getMarkdownRenderer} for markdown formatting support\n * @see {@link SiChatContainerComponent} for the chat container to use this within\n *\n * @experimental\n */\n@Component({\n selector: 'si-ai-message',\n imports: [\n CdkMenuTrigger,\n SiChatMessageComponent,\n SiIconComponent,\n SiMenuFactoryComponent,\n SiChatMessageActionDirective,\n SiTranslatePipe\n ],\n templateUrl: './si-ai-message.component.html',\n styleUrl: './si-ai-message.component.scss'\n})\nexport class SiAiMessageComponent {\n protected readonly formattedContent = viewChild<ElementRef<HTMLDivElement>>('formattedContent');\n protected readonly icons = addIcons({ elementOptionsVertical });\n\n /**\n * The AI-generated message content\n * @defaultValue ''\n */\n readonly content = input<string>('');\n\n /**\n * Optional formatter function to transform content before display.\n * - Returns string: Content will be sanitized using Angular's DomSanitizer\n * - Returns Node: DOM node will be inserted directly without sanitization\n *\n * **Note:** If using a markdown renderer, make sure to apply the `markdown-content` class\n * to the root element to ensure proper styling using the Element theme (e.g., `div.className = 'markdown-content'`).\n * The function returned by {@link getMarkdownRenderer} does this automatically.\n *\n * **Warning:** When returning a Node, ensure the content is safe to prevent XSS attacks\n * @defaultValue undefined\n */\n readonly contentFormatter = input<((text: string) => string | Node) | undefined>(undefined);\n\n protected readonly textContent = signal<string | undefined>(undefined);\n\n constructor() {\n effect(() => {\n const formatter = this.contentFormatter();\n const contentValue = this.content();\n const container = this.formattedContent()?.nativeElement;\n\n if (container && contentValue) {\n if (formatter) {\n const formatted = formatter(contentValue);\n\n if (typeof formatted === 'string') {\n this.textContent.set(formatted);\n } else if (formatted instanceof Node) {\n this.textContent.set(undefined);\n container.innerHTML = '';\n container.appendChild(formatted);\n }\n } else {\n this.textContent.set(contentValue);\n }\n }\n });\n }\n\n /**\n * Whether the message is currently being generated (shows skeleton)\n * @defaultValue false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Primary actions available for this message (thumbs up/down, copy, retry, etc.)\n * All actions displayed inline\n * @defaultValue []\n */\n readonly actions = input<MessageAction[]>([]);\n\n /**\n * Secondary actions available in dropdown menu, first use primary actions and only add secondary actions additionally\n * @defaultValue []\n */\n readonly secondaryActions = input<MenuItem[]>([]);\n\n /** Parameter to pass to action handlers */\n readonly actionParam = input();\n\n /**\n * More actions button aria label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_AI_MESSAGE.SECONDARY_ACTIONS:More actions`)\n * ```\n */\n readonly secondaryActionsLabel = input(\n t(() => $localize`:@@SI_AI_MESSAGE.SECONDARY_ACTIONS:More actions`)\n );\n}\n","<si-chat-message alignment=\"start\" actionsPosition=\"bottom\" [loading]=\"loading()\">\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n\n @if ((actions()?.length ?? 0 > 0) || (secondaryActions()?.length ?? 0 > 0)) {\n <div class=\"d-flex gap-4 ai-message-actions\" siChatMessageAction>\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label | translate\"\n (click)=\"action.action(actionParam(), action)\"\n >\n <si-icon [icon]=\"action.icon\" />\n </button>\n }\n\n @if (secondaryActions()?.length ?? 0 > 0) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon [icon]=\"icons.elementOptionsVertical\" />\n </button>\n\n <ng-template #secondaryActionsMenu>\n <si-menu-factory [items]=\"secondaryActions()\" [actionParam]=\"actionParam()\" />\n </ng-template>\n }\n </div>\n }\n</si-chat-message>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { booleanAttribute, Component, inject, input, output, TemplateRef } from '@angular/core';\nimport { elementDelete, elementDocument } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiModalService } from '@siemens/element-ng/modal';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\n/**\n * Attachment item interface for file attachments in chat messages, used by {@link SiAttachmentListComponent} and inside {@link SiUserMessageComponent} as well as {@link SiChatInputComponent}.\n *\n * @see {@link SiAttachmentListComponent} for the attachment list component\n * @see {@link SiUserMessageComponent} for the user message\n * @see {@link SiChatInputComponent} for the chat input component\n *\n * @experimental\n */\nexport interface Attachment {\n /** File name */\n name: string;\n /** Optionally show a preview of the attachment by providing a template that is shown in a modal when clicked (optional) */\n previewTemplate?: TemplateRef<any> | (() => TemplateRef<any>);\n}\n\n/**\n * Attachment list component for displaying file attachments in chat messages.\n *\n * This component renders a list of file attachments with icons, names, and optional\n * preview and remove functionality. It's designed to work with chat message components\n * to show files that have been uploaded or shared in conversations.\n *\n * This component provides:\n * - A list of pills showing each attachment's name and an icon\n * - Optional preview modal for attachments\n * - Optional remove functionality for editable messages\n *\n * The component is included within {@link SiUserMessageComponent}, {@link SiAiMessageComponent} and {@link SiChatInputComponent} but can also be used inside custom chat messages with {@link SiChatMessageComponent}\n *\n * @see {@link SiUserMessageComponent} for user message display\n * @see {@link SiAiMessageComponent} for AI message display\n * @see {@link SiChatMessageComponent} for custom chat message display\n * @see {@link SiChatInputComponent} for chat input with attachment support\n * @see {@link Attachment} for attachment data structure\n *\n * @experimental\n */\n@Component({\n selector: 'si-attachment-list',\n imports: [SiIconComponent, SiTranslatePipe],\n templateUrl: './si-attachment-list.component.html',\n styleUrl: './si-attachment-list.component.scss'\n})\nexport class SiAttachmentListComponent {\n protected modalService = inject(SiModalService);\n protected readonly icons = addIcons({ elementDelete, elementDocument });\n\n /**\n * List of attachments to display\n * @defaultValue []\n */\n readonly attachments = input<Attachment[]>([]);\n\n /**\n * Whether to align attachments to the end (right) or start (left)\n * @defaultValue 'start'\n */\n readonly alignment = input<'start' | 'end'>('start');\n\n /**\n * Whether to show remove buttons on attachments\n * @defaultValue false\n */\n readonly removable = input(false, { transform: booleanAttribute });\n\n /**\n * Label for remove attachment button\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_ATTACHMENT_LIST.REMOVE_ATTACHMENT:Remove attachment`)\n * ```\n */\n readonly removeLabel = input(\n t(() => $localize`:@@SI_ATTACHMENT_LIST.REMOVE_ATTACHMENT:Remove attachment`)\n );\n\n /**\n * Emitted when an attachment should be removed\n */\n readonly remove = output<Attachment>();\n\n private getPreviewTemplate(attachment: Attachment): any | undefined {\n if (attachment.previewTemplate) {\n return typeof attachment.previewTemplate === 'function'\n ? attachment.previewTemplate()\n : attachment.previewTemplate;\n }\n return undefined;\n }\n\n protected openPreview(event: Event, attachment: Attachment): void {\n const template = this.getPreviewTemplate(attachment);\n if (template) {\n event.preventDefault();\n this.modalService.show(template, {\n inputValues: { 'attachment': attachment }\n });\n }\n }\n\n protected getFileIcon(name: string): string {\n // TODO: Accept map and default it in file upload directive.\n return this.icons.elementDocument;\n }\n}\n","<div class=\"d-flex flex-wrap gap-4\" [class.justify-content-end]=\"alignment() === 'end'\">\n @for (attachment of attachments(); track $index) {\n <div class=\"attachment-item d-flex align-items-stretch\" role=\"group\">\n @if (attachment.previewTemplate) {\n <button\n type=\"button\"\n class=\"attachment-main focus-inside d-flex align-items-center flex-grow-1 min-width-0\"\n [attr.title]=\"attachment.name\"\n [attr.aria-label]=\"attachment.name\"\n (click)=\"openPreview($event, attachment)\"\n (keydown.enter)=\"openPreview($event, attachment)\"\n (keydown.space)=\"openPreview($event, attachment)\"\n >\n <si-icon\n class=\"attachment-icon icon flex-shrink-0 mx-1\"\n [icon]=\"getFileIcon(attachment.name)\"\n />\n <div class=\"attachment-info flex-grow-1 min-width-0\">\n <span\n class=\"attachment-name me-4 text-truncate si-body-2 d-block\"\n [title]=\"attachment.name\"\n >\n {{ attachment.name }}\n </span>\n </div>\n </button>\n } @else {\n <div class=\"attachment-main--static d-flex align-items-center flex-grow-1 min-width-0\">\n <si-icon\n class=\"attachment-icon icon flex-shrink-0 mx-1\"\n [icon]=\"getFileIcon(attachment.name)\"\n />\n <div class=\"attachment-info flex-grow-1 min-width-0\">\n <span\n class=\"attachment-name me-4 text-truncate si-body-2 d-block\"\n [title]=\"attachment.name\"\n >\n {{ attachment.name }}\n </span>\n </div>\n </div>\n }\n\n @if (removable()) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon expand-button flex-shrink-0 ms-auto align-self-center focus-inside\"\n [attr.aria-label]=\"(removeLabel() | translate) + ' ' + attachment.name\"\n (click)=\"remove.emit(attachment); $event.stopPropagation()\"\n >\n <si-icon class=\"icon\" [icon]=\"icons.elementDelete\" />\n </button>\n }\n </div>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n AfterContentInit,\n Component,\n effect,\n ElementRef,\n input,\n OnDestroy,\n PLATFORM_ID,\n viewChild,\n inject\n} from '@angular/core';\n\n/**\n * A declarative container component for displaying a chat interface with automatic scroll-to-bottom behavior.\n *\n * This component provides the layout and styling for a chat interface, managing scrolling behavior\n * to keep the newest messages visible while respecting user scrolling actions. It automatically\n * scrolls to the bottom when new content is added, unless the user has scrolled up to view older messages.\n *\n * Use via content projection:\n * - Default content: Chat messages displayed in the scrollable messages container or a welcome screen (empty state).\n * - `si-inline-notification` selector: Notification component displayed above the input area\n * - `si-chat-input` or `[siChatContainerInput]` selector: Input controls for composing messages\n *\n * @see {@link SiChatInputComponent} for the chat input wrapper component\n * @see {@link SiChatContainerInputDirective} for other input controls to slot in\n * @see {@link SiAiMessageComponent} for AI messages to slot in\n * @see {@link SiUserMessageComponent} for user messages (in AI chats) to slot in\n * @see {@link SiChatMessageComponent} for the chat message wrapper component to slot in other messages\n *\n * @experimental\n */\n@Component({\n selector: 'si-chat-container',\n templateUrl: './si-chat-container.component.html',\n styleUrl: './si-chat-container.component.scss',\n host: {\n class: 'd-flex si-layout-inner flex-grow-1 flex-column h-100 w-100',\n '[class]': 'colorVariant()'\n }\n})\nexport class SiChatContainerComponent implements AfterContentInit, OnDestroy {\n private readonly messagesContainer = viewChild<ElementRef<HTMLDivElement>>('messagesContainer');\n private readonly platformId = inject(PLATFORM_ID);\n\n private isUserAtBottom = true;\n private scrollTimeout: ReturnType<typeof setTimeout> | undefined;\n private lastScrollTime = 0;\n private pendingScroll = false;\n private scrollDebounceMs = 7; // ~144fps\n private resizeObserver: ResizeObserver | undefined;\n private contentObserver: MutationObserver | undefined;\n\n /**\n * The color variant to apply to the container.\n * @defaultValue 'base-0'\n */\n readonly colorVariant = input<string>('base-0');\n\n /**\n * Disables automatic scrolling to the bottom when new content is added.\n * @defaultValue false\n */\n readonly noAutoScroll = input(false, {\n transform: (value: boolean | string) => value === '' || value === true\n });\n\n constructor() {\n effect(() => {\n if (this.messagesContainer()) {\n this.setupResizeObserver();\n this.setupContentObserver();\n }\n });\n }\n\n ngAfterContentInit(): void {\n this.scrollToBottomDuringStreaming();\n }\n\n ngOnDestroy(): void {\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout);\n }\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.contentObserver) {\n this.contentObserver.disconnect();\n }\n }\n\n private scrollToBottomDuringStreaming(): void {\n if (this.noAutoScroll() || !this.isUserAtBottom) {\n return;\n }\n\n const container = this.messagesContainer();\n if (!container) {\n return;\n }\n\n const element = container.nativeElement;\n element.scrollTop = element.scrollHeight;\n }\n\n private debouncedScrollToBottom(): void {\n const now = Date.now();\n const timeSinceLastScroll = now - this.lastScrollTime;\n\n if (timeSinceLastScroll >= this.scrollDebounceMs) {\n this.lastScrollTime = now;\n this.scrollToBottomDuringStreaming();\n this.pendingScroll = false;\n } else {\n this.pendingScroll = true;\n }\n\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout);\n }\n\n this.scrollTimeout = setTimeout(() => {\n if (this.pendingScroll) {\n this.lastScrollTime = Date.now();\n this.scrollToBottomDuringStreaming();\n this.pendingScroll = false;\n }\n }, this.scrollDebounceMs);\n }\n\n private setupResizeObserver(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const container = this.messagesContainer();\n if (!container || this.resizeObserver) {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.debouncedScrollToBottom();\n });\n\n this.resizeObserver.observe(container.nativeElement);\n }\n\n private setupContentObserver(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const container = this.messagesContainer();\n if (!container || this.contentObserver) {\n return;\n }\n\n this.contentObserver = new MutationObserver(() => {\n this.debouncedScrollToBottom();\n });\n\n this.contentObserver.observe(container.nativeElement, {\n childList: true,\n subtree: true,\n characterData: true\n });\n }\n\n private checkIfUserAtBottom(): void {\n const container = this.messagesContainer();\n if (!container) {\n return;\n }\n\n const element = container.nativeElement;\n const threshold = 100;\n this.isUserAtBottom =\n element.scrollHeight - element.scrollTop - element.clientHeight < threshold;\n }\n\n protected onScroll(): void {\n this.checkIfUserAtBottom();\n }\n\n /**\n * Scrolls to the bottom of the messages container immediately.\n * This method forces a scroll even if the user has scrolled up.\n */\n public scrollToBottom(): void {\n this.isUserAtBottom = true;\n this.scrollToBottomDuringStreaming();\n }\n\n /**\n * Scrolls to the top of the messages container immediately.\n */\n public scrollToTop(): void {\n const container = this.messagesContainer();\n if (!container) {\n return;\n }\n\n const element = container.nativeElement;\n element.scrollTop = 0;\n this.isUserAtBottom = false;\n }\n\n /**\n * Focuses the messages container element.\n */\n public focus(): void {\n const container = this.messagesContainer();\n container?.nativeElement.focus();\n }\n}\n","<div class=\"chat-container d-flex flex-column flex-grow-1 px-6 px-md-9 py-6 w-100\">\n <div\n #messagesContainer\n class=\"messages-container d-flex flex-column flex-grow-1 w-100 align-self-center\"\n tabindex=\"0\"\n (scroll)=\"onScroll()\"\n >\n <ng-content />\n </div>\n\n <div class=\"chat-input-area py-3 pt-0 mt-6 d-flex flex-column align-items-center\">\n <ng-content select=\"si-inline-notification\" />\n <ng-content select=\"si-chat-input,[siChatContainerInput]\" />\n </div>\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Directive } from '@angular/core';\n\n/**\n * A directive to mark elements as input controls within a {@link SiChatContainerComponent}.\n *\n * This directive is used to identify and style input elements that belong to\n * the chat container component, typically applied to form inputs or textareas\n * used for composing chat messages.\n *\n * @example\n * ```html\n * <si-chat-container>\n * <si-chat-message>Hello!</si-chat-message>\n * <si-chat-message>How are you?</si-chat-message>\n *\n * <input siChatContainerInput type=\"text\" placeholder=\"Type a message...\" />\n * </si-chat-container>\n * ```\n *\n * @see {@link SiChatContainerComponent} for the chat container wrapper component\n *\n * @experimental\n */\n@Directive({\n selector: '[siChatContainerInput]'\n})\nexport class SiChatContainerInputDirective {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport {\n AfterViewInit,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n output,\n viewChild\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n elementAttachment,\n elementOptionsVertical,\n elementSendFilled,\n elementStopFilled\n} from '@siemens/element-icons';\nimport {\n SiFileUploadDirective,\n UploadFile,\n FileUploadError\n} from '@siemens/element-ng/file-uploader';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { MenuItem, SiMenuFactoryComponent } from '@siemens/element-ng/menu';\nimport { SiTranslatePipe, TranslatableString, t } from '@siemens/element-translate-ng/translate';\n\nimport { MessageAction } from './message-action.model';\nimport { Attachment, SiAttachmentListComponent } from './si-attachment-list.component';\n\n/**\n * Attachment item interface for file attachments in chat messages, extension of {@link Attachment} for {@link SiAttachmentListComponent} to use within {@link SiChatInputComponent}.\n * Adds the action file information.\n * Can be used within {@link SiChatContainerComponent}.\n *\n * @see {@link Attachment} for base attachment interface\n * @see {@link SiAttachmentListComponent} for the attachment list component\n * @see {@link SiChatInputComponent} for the chat input component\n * @see {@link SiChatContainerComponent} for the chat container component\n *\n * @experimental\n */\nexport interface ChatInputAttachment extends Attachment {\n /** File object */\n file: File;\n /** File size in bytes */\n size: number;\n /** MIME type */\n type: string;\n}\n\n/**\n * Chat input component for composing and sending messages in conversational interfaces.\n *\n * The chat input component provides a text area for users to compose messages,\n * supporting text, attachments, and contextual actions. It appears as a textarea\n * with buttons for adding attachments and sending messages, as well as an optional disclaimer.\n *\n * The component automatically handles:\n * - Styling for chat input and actions.\n * - Dynamic resizing of the textarea based on content.\n * - Uploading of and displaying of attachments above the input area.\n * - Displaying primary and secondary actions.\n *\n * Additionally to the inputs and outputs documented here, the component supports content projection via the following slots:\n * - Default content: Custom action buttons to display inline, prefer using the `actions` input for buttons, can be used in addition.\n * - `siChatInputDisclaimer` selector: Custom disclaimer content to display below the input area, prefer using the `disclaimer` input for simple text disclaimers.\n *\n * @see {@link SiAttachmentListComponent} for the base attachment component\n * @see {@link SiChatInputDisclaimerDirective} to slot in custom disclaimer content\n *\n * @experimental\n */\n@Component({\n selector: 'si-chat-input',\n imports: [\n CdkMenuTrigger,\n FormsModule,\n SiIconComponent,\n SiTranslatePipe,\n SiAttachmentListComponent,\n SiMenuFactoryComponent,\n SiFileUploadDirective\n ],\n templateUrl: './si-chat-input.component.html',\n styleUrl: './si-chat-input.component.scss'\n})\nexport class SiChatInputComponent implements AfterViewInit {\n private static idCounter = 0;\n private readonly textInput = viewChild<ElementRef<HTMLTextAreaElement>>('textInput');\n private readonly projectedContent = viewChild<ElementRef>('projected');\n private readonly fileUploadDirective = viewChild(SiFileUploadDirective);\n protected readonly icons = addIcons({\n elementAttachment,\n elementOptionsVertical,\n elementSendFilled,\n elementStopFilled\n });\n\n /**\n * Current input value\n * @defaultValue ''\n */\n readonly value = model<string>('');\n\n /**\n * Placeholder text for the input\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.PLACEHOLDER:Enter a message…`)\n * ```\n */\n readonly placeholder = input<TranslatableString>(\n t(() => $localize`:@@SI_CHAT_INPUT.PLACEHOLDER:Enter a message…`)\n );\n\n /**\n * Whether the input is disabled\n * @defaultValue false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Whether a message is currently being sent, also prevent the sending of new ones while still allowing the user to type\n * @defaultValue false\n */\n readonly sending = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the input supports interrupting ongoing operations. When active,\n * the send button transforms into an interrupt button (with element-stop-filled icon).\n * If sending is true, the interrupt button will be disabled.\n * @defaultValue false\n */\n readonly interruptible = input(false, { transform: booleanAttribute });\n\n /**\n * Maximum number of characters allowed\n */\n readonly maxLength = input<number>();\n\n /**\n * A disclaimer to display.\n *\n * If not provided, the component will look for projected content with the `siChatInputDisclaimer` directive.\n * If both are empty, no disclaimer section will be shown (handled via CSS :empty).\n */\n readonly disclaimer = input<TranslatableString>();\n\n /**\n * Primary actions available in the input (attach files, etc.)\n * All actions displayed inline\n * @defaultValue []\n */\n readonly actions = input<MessageAction[]>([]);\n\n /**\n * Secondary actions available in dropdown menu\n * @defaultValue []\n */\n readonly secondaryActions = input<MenuItem[]>([]);\n\n /**\n * Whether file attachments are supported\n * @defaultValue false\n */\n readonly allowAttachments = input(false);\n\n /**\n * Accepted file types for attachments (as accept string)\n * @defaultValue undefined\n */\n readonly accept = input<string>();\n\n /**\n * Maximum file size in bytes\n * @defaultValue 10485760 (10MB)\n */\n readonly maxFileSize = input(10485760);\n\n /**\n * Current attachments\n * @defaultValue []\n */\n readonly attachments = model<ChatInputAttachment[]>([]);\n\n /**\n * The label for the input, used for accessibility\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.LABEL:Chat message input`)\n * ```\n */\n readonly label = input<string>(t(() => $localize`:@@SI_CHAT_INPUT.LABEL:Chat message input`));\n\n /** Parameter to pass to action handlers */\n readonly actionParam = input<any>();\n\n /**\n * Send button label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.SEND:Send`)\n * ```\n */\n readonly sendButtonLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_CHAT_INPUT.SEND:Send`)\n );\n\n /**\n * Send button icon\n *\n * @defaultValue this.icons.elementSendFilled\n */\n readonly sendButtonIcon = input(this.icons.elementSendFilled);\n\n /**\n * Interrupt button label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.INTERRUPT:Interrupt`)\n * ```\n */\n readonly interruptButtonLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_CHAT_INPUT.INTERRUPT:Interrupt`)\n );\n\n /**\n * Auto-focus the input on component initialization\n * @defaultValue false\n */\n readonly autoFocus = input(false, { transform: booleanAttribute });\n\n /**\n * Attach file button aria label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.ATTACH_FILE:Attach file`)\n * ```\n */\n readonly attachFileLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_CHAT_INPUT.ATTACH_FILE:Attach file`)\n );\n\n /**\n * Remove attachment aria label prefix\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_ATTACHMENT_LIST.REMOVE_ATTACHMENT:Remove attachment`)\n * ```\n */\n readonly removeAttachmentLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_ATTACHMENT_LIST.REMOVE_ATTACHMENT:Remove attachment`)\n );\n\n /**\n * More actions button aria label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.SECONDARY_ACTIONS:More actions`)\n * ```\n */\n readonly secondaryActionsLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_CHAT_INPUT.SECONDARY_ACTIONS:More actions`)\n );\n\n /**\n * Emitted when the user wants to send a message\n */\n readonly send = output<{\n content: string;\n attachments: ChatInputAttachment[];\n }>();\n\n /**\n * Emitted when the user wants to interrupt the current operation\n */\n readonly interrupt = output<void>();\n\n /**\n * Emitted when file upload errors occur\n */\n readonly fileError = output<FileUploadError>();\n\n protected readonly id = `__si-chat-input-${SiChatInputComponent.idCounter++}`;\n protected readonly hasContent = computed(() => this.value().trim().length > 0);\n protected readonly hasAttachments = computed(() => this.attachments().length > 0);\n protected readonly hasActions = computed(() => this.actions().length > 0);\n protected readonly hasSecondaryActions = computed(() => this.secondaryActions().length > 0);\n protected readonly canSend = computed(\n () => (this.hasContent() || this.hasAttachments()) && !this.disabled() && !this.sending()\n );\n\n protected readonly showInterruptButton = computed(() => this.interruptible());\n protected readonly buttonDisabled = computed(() => {\n if (this.showInterruptButton()) {\n return this.disabled() || this.sending();\n }\n return !this.canSend();\n });\n protected readonly buttonIcon = computed(() =>\n this.showInterruptButton() ? this.icons.elementStopFilled : this.sendButtonIcon()\n );\n protected readonly buttonLabel = computed(() =>\n this.showInterruptButton() ? this.interruptButtonLabel() : this.sendButtonLabel()\n );\n\n protected dragOver = false;\n\n protected get attachmentList(): Attachment[] {\n return this.attachments() as Attachment[];\n }\n\n protected onInputChange(value: string): void {\n this.value.set(value);\n }\n\n protected onSend(): void {\n if (this.canSend()) {\n this.send.emit({\n content: this.value(),\n attachments: this.attachments()\n });\n\n this.value.set('');\n this.attachments.set([]);\n }\n }\n\n protected onButtonClick(): void {\n if (this.showInterruptButton()) {\n this.interrupt.emit();\n } else {\n this.onSend();\n }\n }\n\n protected onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (!this.canSend()) {\n return;\n }\n if (this.showInterruptButton()) {\n this.interrupt.emit();\n }\n this.onSend();\n }\n }\n\n protected onFilesAdded(uploadFiles: UploadFile[]): void {\n const validFiles = uploadFiles.filter(uploadFile => uploadFile.status === 'added');\n\n validFiles.forEach(uploadFile => {\n const size = parseInt(uploadFile.size, 10);\n const attachment: ChatInputAttachment = {\n name: uploadFile.fileName,\n size: isNaN(size) ? uploadFile.file.size : size,\n type: uploadFile.file.type,\n file: uploadFile.file\n };\n\n this.attachments.update(current => [...current, attachment]);\n });\n }\n\n protected onFileError(error: FileUploadError): void {\n this.fileError.emit(error);\n }\n\n protected removeAttachment(attachment: Attachment): void {\n this.attachments.update(current => {\n return current.filter(a => a !== attachment);\n });\n }\n\n protected onContainerClick(event: Event): void {\n const target = event.target as HTMLElement;\n\n // Don't focus if clicking on interactive elements\n if (\n target.tagName === 'BUTTON' ||\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.closest('button') ||\n target.closest('[siChatMessageAction]') ||\n (target.closest('si-attachment-list') && target.closest('.attachment-item')) ||\n this.projectedContent()?.nativeElement?.contains(target)\n ) {\n return;\n }\n\n this.focus();\n }\n\n ngAfterViewInit(): void {\n const textarea = this.textInput();\n if (textarea?.nativeElement) {\n this.setTextareaHeight(textarea.nativeElement);\n\n if (this.autoFocus()) {\n // Use setTimeout to ensure the element is fully rendered\n setTimeout(() => {\n textarea.nativeElement.focus();\n }, 0);\n }\n }\n }\n\n protected adjustTextareaHeight(event: Event): void {\n const textarea = event.target as HTMLTextAreaElement;\n this.setTextareaHeight(textarea);\n }\n\n /**\n * Focus the textarea input\n */\n focus(): void {\n const textarea = this.textInput();\n if (textarea?.nativeElement) {\n textarea.nativeElement.focus();\n }\n }\n\n protected dropHandler(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragOver = false;\n\n if (!this.allowAttachments() || this.disabled()) {\n return;\n }\n\n const directive = this.fileUploadDirective();\n if (directive && event.dataTransfer?.files) {\n directive.handleFiles(event.dataTransfer.files);\n }\n }\n\n protected dragOverHandler(event: DragEvent): void {\n if (!this.allowAttachments() || this.disabled()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.dragOver = true;\n }\n\n private setTextareaHeight(textarea: HTMLTextAreaElement): void {\n textarea.style.blockSize = 'auto';\n\n const computedStyle = window.getComputedStyle(textarea);\n const lineHeight =\n parseInt(computedStyle.lineHeight, 10) || parseInt(computedStyle.fontSize, 10) * 1.2;\n const paddingTop = parseInt(computedStyle.paddingBlockStart, 10) || 0;\n const paddingBottom = parseInt(computedStyle.paddingBlockEnd, 10) || 0;\n const minHeight = lineHeight + paddingTop + paddingBottom;\n\n const viewportHeight = window.innerHeight;\n const maxViewportHeight = viewportHeight * 0.3;\n const maxLinesHeight = lineHeight * 8;\n const maxHeight = Math.min(maxViewportHeight, maxLinesHeight) + paddingTop + paddingBottom;\n\n const scrollHeight = textarea.scrollHeight;\n const finalHeight = Math.max(Math.min(scrollHeight, maxHeight), minHeight);\n textarea.style.height = finalHeight + 'px';\n }\n}\n","<div\n class=\"input-wrapper border rounded-3 bg-body\"\n [class.drag-over]=\"dragOver\"\n (click)=\"onContainerClick($event)\"\n (drop)=\"dropHandler($event)\"\n (dragover)=\"dragOverHandler($event)\"\n (dragleave)=\"dragOver = false\"\n>\n @if (hasAttachments()) {\n <div class=\"p-4 pb-0\">\n <si-attachment-list\n [attachments]=\"attachmentList\"\n [removeLabel]=\"removeAttachmentLabel()\"\n [removable]=\"true\"\n (remove)=\"removeAttachment($event)\"\n />\n </div>\n }\n\n <div class=\"p-4 pe-2 pb-0 si-body-2\">\n <label class=\"form-label d-none\" [for]=\"id\">{{ label() | translate }}</label>\n <textarea\n #textInput\n class=\"chat-textarea w-100 border-0 p-2\"\n rows=\"1\"\n [id]=\"id\"\n [placeholder]=\"placeholder() | translate\"\n [disabled]=\"disabled()\"\n [maxlength]=\"maxLength() || null\"\n [(ngModel)]=\"value\"\n (keydown)=\"onKeyDown($event)\"\n (input)=\"adjustTextareaHeight($event)\"\n ></textarea>\n </div>\n\n <div class=\"d-flex align-items-center justify-content-between px-4 ps-5 pb-2\">\n <div class=\"d-flex align-items-center gap-4\">\n @if (allowAttachments()) {\n <input\n #fileInput\n type=\"file\"\n class=\"d-none\"\n siFileUpload\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n [multiple]=\"true\"\n (validFiles)=\"onFilesAdded($event)\"\n (fileError)=\"onFileError($event)\"\n />\n\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [attr.aria-label]=\"attachFileLabel() | translate\"\n [disabled]=\"disabled()\"\n (click)=\"fileInput.click()\"\n >\n <si-icon [icon]=\"icons.elementAttachment\" />\n </button>\n }\n\n @if (hasActions() || hasSecondaryActions()) {\n <div class=\"d-flex gap-4 ai-message-actions\" siChatMessageAction>\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label | translate\"\n (click)=\"action.action(actionParam(), action)\"\n >\n <si-icon [icon]=\"action.icon\" />\n </button>\n }\n\n @if (secondaryActions().length > 0) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon [icon]=\"icons.elementOptionsVertical\" />\n </button>\n\n <ng-template #secondaryActionsMenu>\n <si-menu-factory [items]=\"secondaryActions()\" [actionParam]=\"actionParam()\" />\n </ng-template>\n }\n </div>\n }\n <div #projected class=\"d-flex flex-wrap align-items-start gap-4\">\n <ng-content />\n </div>\n </div>\n\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"buttonDisabled()\"\n [attr.aria-label]=\"buttonLabel() | translate\"\n (click)=\"onButtonClick()\"\n >\n <si-icon class=\"text-primary\" [icon]=\"buttonIcon()\" />\n </button>\n </div>\n</div>\n\n<div class=\"disclaimer-wrapper text-center mt-4 px-3\">\n @if (disclaimer()) {\n <span class=\"si-caption text-secondary d-block\">{{ disclaimer() | translate }}</span>\n }\n <ng-content select=\"[siChatInputDisclaimer]\" />\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Directive } from '@angular/core';\n\n/**\n * Directive to mark content as chat input disclaimer into {@link SiChatInputComponent}.\n * Apply this directive to content that should be slotted into the disclaimer area.\n *\n * @example\n * ```html\n * <si-chat-input>\n * <div siChatInputDisclaimer>\n * Custom disclaimer content\n * </div>\n * </si-chat-input>\n * ```\n *\n * @see {@link SiChatInputComponent} for the chat input wrapper component\n *\n * @experimental\n */\n@Directive({\n selector: '[siChatInputDisclaimer]'\n})\nexport class SiChatInputDisclaimerDirective {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport { Component, effect, input, viewChild, ElementRef, computed, signal } from '@angular/core';\nimport { elementOptionsVertical } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { MenuItem, SiMenuFactoryComponent } from '@siemens/element-ng/menu';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { MessageAction } from './message-action.model';\nimport { Attachment, SiAttachmentListComponent } from './si-attachment-list.component';\nimport { SiChatMessageActionDirective } from './si-chat-message-action.directive';\nimport { SiChatMessageComponent } from './si-chat-message.component';\n\n/**\n * User message component for displaying the user's messages in conversational interfaces.\n *\n * The user message component renders user-submitted content in (AI) chat interfaces,\n * supporting text, attachments, and contextual actions. It appears as a text bubble\n * aligned to the right side and supports markdown formatting for rich content.\n * Can be used within {@link SiChatContainerComponent}.\n *\n * The component automatically handles:\n * - Styling for user messages distinct from AI or generic chat messages\n * - Option to render markdown content, provide via `contentFormatter` input with a markdown renderer function (e.g., from {@link getMarkdownRenderer})\n * - Displaying attachments above the message bubble\n * - Displaying primary and secondary actions\n *\n * @see {@link SiChatMessageComponent} for the base message wrapper component\n * @see {@link SiAiMessageComponent} for the AI message component\n * @see {@link SiAttachmentListComponent} for the base attachment component\n * @see {@link getMarkdownRenderer} for markdown formatting support\n * @see {@link SiChatContainerComponent} for the chat container to use this within\n *\n * @experimental\n */\n@Component({\n selector: 'si-user-message',\n imports: [\n CdkMenuTrigger,\n SiAttachmentListComponent,\n SiChatMessageComponent,\n SiIconComponent,\n SiMenuFactoryComponent,\n SiChatMessageActionDirective,\n SiTranslatePipe\n ],\n templateUrl: './si-user-message.component.html',\n styleUrl: './si-user-message.component.scss'\n})\nexport class SiUserMessageComponent {\n protected readonly formattedContent = viewChild<ElementRef<HTMLDivElement>>('formattedContent');\n protected readonly icons = addIcons({ elementOptionsVertical });\n\n /**\n * The user message content\n * @defaultValue ''\n */\n readonly content = input<string>('');\n\n /**\n * Optional formatter function to transform content before display.\n * - Returns string: Content will be inserted as text with built-in sanitization\n * - Returns Node: DOM node will be inserted directly without sanitization\n *\n * **Note:** When returning a Node with formatted content, apply the `markdown-content` class\n * to the root element to ensure proper styling (e.g., `div.className = 'markdown-content'`).\n * The function returned by {@link getMarkdownRenderer} does this automatically.\n *\n * **Warning:** When returning a Node, ensure the content is safe to prevent XSS attacks\n * @defaultValue undefined\n */\n readonly contentFormatter = input<((text: string) => string | Node) | undefined>(undefined);\n\n /**\n * Primary message actions (edit, delete, copy, etc.).\n * All actions displayed inline\n * @defaultValue []\n */\n readonly actions = input<MessageAction[]>([]);\n\n /**\n * Secondary actions available in dropdown menu, first use primary actions and only add secondary actions additionally\n * @defaultValue []\n */\n readonly secondaryActions = input<MenuItem[]>([]);\n\n /**\n * List of attachments included with this message\n * @defaultValue []\n */\n readonly attachments = input<Attachment[]>([]);\n\n /** Parameter to pass to action handlers */\n readonly actionParam = input<any>();\n\n /**\n * More actions button aria label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_USER_MESSAGE.SECONDARY_ACTIONS:More actions`)\n * ```\n */\n readonly secondaryActionsLabel = input(\n t(() => $localize`:@@SI_USER_MESSAGE.SECONDARY_ACTIONS:More actions`)\n );\n\n protected readonly hasAttachments = computed(() => this.attachments()?.length > 0);\n\n protected readonly textContent = signal<string | undefined>(undefined);\n\n constructor() {\n effect(() => {\n const formatter = this.contentFormatter();\n const contentValue = this.content();\n const container = this.formattedContent()?.nativeElement;\n\n if (container && contentValue) {\n if (formatter) {\n const formatted = formatter(contentValue);\n\n if (typeof formatted === 'string') {\n this.textContent.set(formatted);\n } else if (formatted instanceof Node) {\n this.textContent.set(undefined);\n container.innerHTML = '';\n container.appendChild(formatted);\n }\n } else {\n this.textContent.set(contentValue);\n }\n }\n });\n }\n}\n","<si-chat-message alignment=\"end\" actionsPosition=\"bottom\" [loading]=\"false\">\n @if (hasAttachments()) {\n <si-attachment-list alignment=\"end\" [attachments]=\"attachments()\" [removable]=\"false\" />\n }\n\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n @if ((actions()?.length ?? 0 > 0) || (secondaryActions()?.length ?? 0 > 0)) {\n <div class=\"d-flex gap-4 user-message-actions\" siChatMessageAction>\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label | translate\"\n (click)=\"action.action(actionParam(), action)\"\n >\n <si-icon [icon]=\"action.icon\" />\n </button>\n }\n\n @if (secondaryActions()?.length ?? 0 > 0) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon [icon]=\"icons.elementOptionsVertical\" />\n </button>\n\n <ng-template #secondaryActionsMenu>\n <si-menu-factory [items]=\"secondaryActions()\" [actionParam]=\"actionParam()\" />\n </ng-template>\n }\n </div>\n }\n</si-chat-message>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Component, input, model, output } from '@angular/core';\nimport { SiActionCardComponent } from '@siemens/element-ng/card';\nimport { SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiSummaryChipComponent } from '@siemens/element-ng/summary-chip';\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\nexport interface PromptCategory {\n label: TranslatableString;\n}\n\nexport interface PromptSuggestion {\n text: TranslatableString;\n}\n\n/**\n * AI welcome screen component for displaying initial state in AI chat interfaces.\n *\n * The AI welcome screen component provides an engaging initial state for AI chat interfaces,\n * featuring a welcome message, optional prompt categories for filtering, and suggested prompts\n * that users can click to start conversations.\n *\n * The component includes:\n * - Welcome header with AI branding and customizable greeting\n * - Optional category pills for filtering prompt suggestions\n * - Clickable prompt suggestion cards\n * - Optional refresh button to regenerate suggestions\n *\n * @see {@link SiAiChatContainerComponent} for the AI chat container which uses this component\n * @see {@link SiChatContainerComponent} for the base chat container\n *\n * @experimental\n */\n@Component({\n selector: 'si-ai-welcome-screen',\n imports: [SiActionCardComponent, SiSummaryChipComponent, SiIconComponent],\n templateUrl: './si-ai-welcome-screen.component.html',\n styleUrl: './si-ai-welcome-screen.component.scss',\n host: {\n class: 'd-block'\n }\n})\nexport class SiAiWelcomeScreenComponent {\n /**\n * The list of prompt categories\n * @defaultValue []\n */\n readonly categories = input<PromptCategory[]>([]);\n\n /**\n * The currently selected category ID\n * @defaultValue undefined\n */\n readonly selectedCategory = model<string | undefined>(undefined);\n\n /**\n * The list of prompt suggestions as an array, update this when the selected category changes.\n * @defaultValue []\n */\n readonly promptSuggestions = input<PromptSuggestion[]>([]);\n\n /**\n * Emitted when a prompt suggestion is clicked\n */\n readonly promptSelected = output<PromptSuggestion>();\n\n protected onCategoryClick(categoryLabel: string): void {\n this.selectedCategory.set(\n this.selectedCategory() === categoryLabel ? undefined : categoryLabel\n );\n }\n\n protected onPromptClick(suggestion: PromptSuggestion): void {\n this.promptSelected.emit(suggestion);\n }\n}\n","<div class=\"d-flex flex-column gap-10 align-items-center w-100\">\n <!-- Welcome Header -->\n <div class=\"welcome-header d-flex flex-column gap-4 w-100 pt-10 pb-8\">\n <ng-content />\n </div>\n\n <!-- Prompt Categories and Suggestions -->\n <div class=\"prompt-suggestions d-flex flex-column gap-6 align-items-center w-100\">\n @if (categories().length > 0) {\n <div class=\"d-flex gap-4 align-items-center w-100\">\n @for (category of categories(); track $index) {\n <si-summary-chip\n class=\"user-select-none\"\n [label]=\"category.label\"\n [selected]=\"selectedCategory() === category.label\"\n (selectedChange)=\"onCategoryClick(category.label)\"\n />\n }\n </div>\n }\n\n @if (promptSuggestions().length > 0) {\n <div class=\"d-flex flex-column gap-4 w-100\">\n @for (suggestion of promptSuggestions(); track $index) {\n <button si-action-card type=\"button\" class=\"w-100\" (click)=\"onPromptClick(suggestion)\">\n <div body class=\"card-body card-text\">\n {{ suggestion.text }}\n </div>\n </button>\n }\n </div>\n }\n </div>\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-ai-message.component';\nexport * from './si-attachment-list.component';\nexport * from './si-chat-container.component';\nexport * from './si-chat-container-input.directive';\nexport * from './si-chat-input.component';\nexport * from './si-chat-input-disclaimer.directive';\nexport * from './si-chat-message-action.directive';\nexport * from './si-chat-message.component';\nexport * from './si-user-message.component';\nexport * from './message-action.model';\nexport * from './si-ai-welcome-screen.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"siemens-element-ng-chat-messages.mjs","sources":["../../../../projects/element-ng/chat-messages/si-chat-message-action.directive.ts","../../../../projects/element-ng/chat-messages/si-chat-message.component.ts","../../../../projects/element-ng/chat-messages/si-chat-message.component.html","../../../../projects/element-ng/chat-messages/si-ai-message.component.ts","../../../../projects/element-ng/chat-messages/si-ai-message.component.html","../../../../projects/element-ng/chat-messages/si-attachment-list.component.ts","../../../../projects/element-ng/chat-messages/si-attachment-list.component.html","../../../../projects/element-ng/chat-messages/si-chat-container.component.ts","../../../../projects/element-ng/chat-messages/si-chat-container.component.html","../../../../projects/element-ng/chat-messages/si-chat-container-input.directive.ts","../../../../projects/element-ng/chat-messages/si-chat-input.component.ts","../../../../projects/element-ng/chat-messages/si-chat-input.component.html","../../../../projects/element-ng/chat-messages/si-chat-input-disclaimer.directive.ts","../../../../projects/element-ng/chat-messages/si-user-message.component.ts","../../../../projects/element-ng/chat-messages/si-user-message.component.html","../../../../projects/element-ng/chat-messages/si-ai-welcome-screen.component.ts","../../../../projects/element-ng/chat-messages/si-ai-welcome-screen.component.html","../../../../projects/element-ng/chat-messages/index.ts","../../../../projects/element-ng/chat-messages/siemens-element-ng-chat-messages.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Directive } from '@angular/core';\n\n/**\n * Directive to mark content as chat message actions into {@link SiChatMessageComponent}.\n * Apply this directive to e.g. buttons that should be slotted into the message actions area.\n *\n * @example\n * ```html\n * <si-chat-message>\n * Message content\n * <button siChatMessageAction>Like</button>\n * <button siChatMessageAction>Share</button>\n * </si-chat-message>\n * ```\n *\n * @see {@link SiChatMessageComponent} for the chat message wrapper component\n *\n * @experimental\n */\n@Directive({\n selector: '[siChatMessageAction]'\n})\nexport class SiChatMessageActionDirective {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Component, input } from '@angular/core';\nimport { SiResponsiveContainerDirective } from '@siemens/element-ng/resize-observer';\n\n/**\n * Base declarative chat message component that provides the layout structure for chat messages.\n *\n * This component handles the core message layout including avatar positioning, loading states,\n * and action button as well as attachment list placement. It serves as the foundation for more specialized message components\n * like {@link SiUserMessageComponent} and {@link SiAiMessageComponent}.\n * Can be used within {@link SiChatContainerComponent}.\n *\n * The component provides:\n * - Flexible alignment (start/end) for different message types\n * - Avatar/icon slot for message attribution\n * - Loading state with skeleton UI\n * - Action buttons positioned on the side or bottom\n * - Attachment list display slot\n * - Responsive behavior that adapts to container size\n *\n * This is a low-level component designed for slotting in custom content, it provides slots via content projection:\n * - Default content: Main message content area (consider using {@link SiMarkdownRendererComponent} for markdown support)\n * - `si-avatar/si-icon/img` selector: Avatar or icon representing the message sender\n * - `si-chat-message-action` selector: Action buttons related to the message\n * - `si-attachment-list` selector: Attachment list component for displaying file attachments\n *\n * @see {@link SiUserMessageComponent} for user message display\n * @see {@link SiAiMessageComponent} for AI message display\n * @see {@link SiAttachmentListComponent} for attachment list to slot in\n * @see {@link SiChatMessageActionDirective} for action buttons to slot in\n * @see {@link SiMarkdownRendererComponent} for markdown content rendering\n * @see {@link SiChatContainerComponent} for the chat container to use this within\n *\n * @experimental\n */\n@Component({\n selector: 'si-chat-message',\n templateUrl: './si-chat-message.component.html',\n styleUrl: './si-chat-message.component.scss',\n host: {\n class: 'd-block'\n },\n hostDirectives: [SiResponsiveContainerDirective]\n})\nexport class SiChatMessageComponent {\n /**\n * Whether the message is currently loading\n * @defaultValue false\n */\n readonly loading = input(false);\n\n /**\n * Alignment of the message\n * @defaultValue 'start'\n */\n readonly alignment = input<'start' | 'end'>('start');\n\n /**\n * Where to display action buttons (if any)\n * @defaultValue 'side'\n */\n readonly actionsPosition = input<'side' | 'bottom'>('side');\n}\n","<!--- Flex-row if alignment start, flex-row-reverse if alignment end, flex-column if mobile -->\n<div class=\"d-flex si-body-2 chat-message-container\" [class.start]=\"alignment() === 'start'\">\n <div class=\"avatar-wrapper flex-shrink-0\" [class.end]=\"alignment() === 'end'\">\n <ng-content select=\"si-icon,si-avatar,img\" />\n </div>\n\n <div class=\"d-flex flex-column flex-grow-1 w-100\">\n <div class=\"attachment-slot\" [class.align-self-end]=\"alignment() === 'end'\">\n <ng-content select=\"si-attachment-list,si-badge\" />\n </div>\n\n @if (loading()) {\n <div\n class=\"message-wrapper rounded-3 w-75 text-break loading-message-bubble mb-2\"\n [class.align-self-end]=\"alignment() === 'end'\"\n >\n <div class=\"d-flex flex-column w-100 gap-2\">\n <div class=\"si-skeleton skeleton-line skeleton-line-full\"></div>\n <div class=\"si-skeleton skeleton-line skeleton-line-half\"></div>\n </div>\n </div>\n } @else {\n <!-- Flex-column if actions bottom, flex-row/flex-row-reverse if actions start -->\n <div\n class=\"message-wrapper mw-0 d-flex mb-2\"\n [class.start]=\"alignment() === 'start'\"\n [class.end]=\"alignment() === 'end'\"\n [class.flex-column]=\"actionsPosition() === 'bottom'\"\n [class.flex-row]=\"actionsPosition() === 'side' && alignment() === 'start'\"\n [class.flex-row-reverse]=\"actionsPosition() === 'side' && alignment() === 'end'\"\n [class.align-items-start]=\"actionsPosition() === 'side'\"\n [class.align-items-end]=\"actionsPosition() === 'bottom' && alignment() === 'end'\"\n [class.justify-content-end]=\"alignment() === 'end' && actionsPosition() === 'bottom'\"\n [class.justify-content-start]=\"alignment() === 'start' && actionsPosition() === 'bottom'\"\n >\n <div\n class=\"rounded-3 text-break message-bubble\"\n [class.end]=\"alignment() === 'end' && actionsPosition() === 'bottom'\"\n >\n <ng-content />\n </div>\n\n <div\n class=\"actions-wrapper d-flex gap-4\"\n [class.ms-3]=\"actionsPosition() === 'side' && alignment() === 'start'\"\n [class.me-3]=\"actionsPosition() === 'side' && alignment() === 'end'\"\n [class.mt-2]=\"actionsPosition() === 'bottom'\"\n [class.actions-horizontal]=\"actionsPosition() !== 'bottom'\"\n [class.align-self-start]=\"actionsPosition() === 'side'\"\n >\n <ng-content select=\"[siChatMessageAction]\" />\n </div>\n </div>\n }\n </div>\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport {\n booleanAttribute,\n Component,\n effect,\n input,\n viewChild,\n ElementRef,\n signal\n} from '@angular/core';\nimport { elementOptionsVertical } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { MenuItem, SiMenuFactoryComponent } from '@siemens/element-ng/menu';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { MessageAction } from './message-action.model';\nimport { SiChatMessageActionDirective } from './si-chat-message-action.directive';\nimport { SiChatMessageComponent } from './si-chat-message.component';\n\n/**\n * AI message component for displaying AI-generated responses in conversational interfaces.\n *\n * The AI message component renders AI-generated content in chat interfaces,\n * supporting text formatting, markdown, loading states, and contextual actions.\n * It appears as text (no bubble) aligned to the left side without any avatar/icon slot.\n * Can be used within {@link SiChatContainerComponent}.\n *\n * The component automatically handles:\n * - Styling for AI messages distinct from user or generic chat messages\n * - Option to render markdown content, provide via `contentFormatter` input with a markdown renderer function (e.g., from {@link getMarkdownRenderer})\n * - Showing loading states with skeleton UI during generation\n * - Displaying primary and secondary actions\n *\n * @see {@link SiChatMessageComponent} for the base message wrapper component\n * @see {@link SiUserMessageComponent} for the user message component\n * @see {@link getMarkdownRenderer} for markdown formatting support\n * @see {@link SiChatContainerComponent} for the chat container to use this within\n *\n * @experimental\n */\n@Component({\n selector: 'si-ai-message',\n imports: [\n CdkMenuTrigger,\n SiChatMessageComponent,\n SiIconComponent,\n SiMenuFactoryComponent,\n SiChatMessageActionDirective,\n SiTranslatePipe\n ],\n templateUrl: './si-ai-message.component.html',\n styleUrl: './si-ai-message.component.scss'\n})\nexport class SiAiMessageComponent {\n protected readonly formattedContent = viewChild<ElementRef<HTMLDivElement>>('formattedContent');\n protected readonly icons = addIcons({ elementOptionsVertical });\n\n /**\n * The AI-generated message content\n * @defaultValue ''\n */\n readonly content = input<string>('');\n\n /**\n * Optional formatter function to transform content before display.\n * - Returns string: Content will be sanitized using Angular's DomSanitizer\n * - Returns Node: DOM node will be inserted directly without sanitization\n *\n * **Note:** If using a markdown renderer, make sure to apply the `markdown-content` class\n * to the root element to ensure proper styling using the Element theme (e.g., `div.className = 'markdown-content'`).\n * The function returned by {@link getMarkdownRenderer} does this automatically.\n *\n * **Warning:** When returning a Node, ensure the content is safe to prevent XSS attacks\n * @defaultValue undefined\n */\n readonly contentFormatter = input<((text: string) => string | Node) | undefined>(undefined);\n\n protected readonly textContent = signal<string | undefined>(undefined);\n\n constructor() {\n effect(() => {\n const formatter = this.contentFormatter();\n const contentValue = this.content();\n const container = this.formattedContent()?.nativeElement;\n\n if (container && contentValue) {\n if (formatter) {\n const formatted = formatter(contentValue);\n\n if (typeof formatted === 'string') {\n this.textContent.set(formatted);\n } else if (formatted instanceof Node) {\n this.textContent.set(undefined);\n container.innerHTML = '';\n container.appendChild(formatted);\n }\n } else {\n this.textContent.set(contentValue);\n }\n }\n });\n }\n\n /**\n * Whether the message is currently being generated (shows skeleton)\n * @defaultValue false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Primary actions available for this message (thumbs up/down, copy, retry, etc.)\n * All actions displayed inline\n * @defaultValue []\n */\n readonly actions = input<MessageAction[]>([]);\n\n /**\n * Secondary actions available in dropdown menu, first use primary actions and only add secondary actions additionally\n * @defaultValue []\n */\n readonly secondaryActions = input<MenuItem[]>([]);\n\n /** Parameter to pass to action handlers */\n readonly actionParam = input();\n\n /**\n * More actions button aria label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_AI_MESSAGE.SECONDARY_ACTIONS:More actions`)\n * ```\n */\n readonly secondaryActionsLabel = input(\n t(() => $localize`:@@SI_AI_MESSAGE.SECONDARY_ACTIONS:More actions`)\n );\n}\n","<si-chat-message alignment=\"start\" actionsPosition=\"bottom\" [loading]=\"loading()\">\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n\n @if (actions().length > 0 || secondaryActions().length > 0) {\n <div class=\"d-flex gap-4 ai-message-actions\" siChatMessageAction>\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label | translate\"\n (click)=\"action.action(actionParam(), action)\"\n >\n <si-icon [icon]=\"action.icon\" />\n </button>\n }\n\n @if (secondaryActions().length > 0) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon [icon]=\"icons.elementOptionsVertical\" />\n </button>\n\n <ng-template #secondaryActionsMenu>\n <si-menu-factory [items]=\"secondaryActions()\" [actionParam]=\"actionParam()\" />\n </ng-template>\n }\n </div>\n }\n</si-chat-message>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { booleanAttribute, Component, inject, input, output, TemplateRef } from '@angular/core';\nimport { elementDelete, elementDocument } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiModalService } from '@siemens/element-ng/modal';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\n/**\n * Attachment item interface for file attachments in chat messages, used by {@link SiAttachmentListComponent} and inside {@link SiUserMessageComponent} as well as {@link SiChatInputComponent}.\n *\n * @see {@link SiAttachmentListComponent} for the attachment list component\n * @see {@link SiUserMessageComponent} for the user message\n * @see {@link SiChatInputComponent} for the chat input component\n *\n * @experimental\n */\nexport interface Attachment {\n /** File name */\n name: string;\n /** Optionally show a preview of the attachment by providing a template that is shown in a modal when clicked (optional) */\n previewTemplate?: TemplateRef<any> | (() => TemplateRef<any>);\n}\n\n/**\n * Attachment list component for displaying file attachments in chat messages.\n *\n * This component renders a list of file attachments with icons, names, and optional\n * preview and remove functionality. It's designed to work with chat message components\n * to show files that have been uploaded or shared in conversations.\n *\n * This component provides:\n * - A list of pills showing each attachment's name and an icon\n * - Optional preview modal for attachments\n * - Optional remove functionality for editable messages\n *\n * The component is included within {@link SiUserMessageComponent}, {@link SiAiMessageComponent} and {@link SiChatInputComponent} but can also be used inside custom chat messages with {@link SiChatMessageComponent}\n *\n * @see {@link SiUserMessageComponent} for user message display\n * @see {@link SiAiMessageComponent} for AI message display\n * @see {@link SiChatMessageComponent} for custom chat message display\n * @see {@link SiChatInputComponent} for chat input with attachment support\n * @see {@link Attachment} for attachment data structure\n *\n * @experimental\n */\n@Component({\n selector: 'si-attachment-list',\n imports: [SiIconComponent, SiTranslatePipe],\n templateUrl: './si-attachment-list.component.html',\n styleUrl: './si-attachment-list.component.scss'\n})\nexport class SiAttachmentListComponent {\n protected modalService = inject(SiModalService);\n protected readonly icons = addIcons({ elementDelete, elementDocument });\n\n /**\n * List of attachments to display\n * @defaultValue []\n */\n readonly attachments = input<Attachment[]>([]);\n\n /**\n * Whether to align attachments to the end (right) or start (left)\n * @defaultValue 'start'\n */\n readonly alignment = input<'start' | 'end'>('start');\n\n /**\n * Whether to show remove buttons on attachments\n * @defaultValue false\n */\n readonly removable = input(false, { transform: booleanAttribute });\n\n /**\n * Label for remove attachment button\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_ATTACHMENT_LIST.REMOVE_ATTACHMENT:Remove attachment`)\n * ```\n */\n readonly removeLabel = input(\n t(() => $localize`:@@SI_ATTACHMENT_LIST.REMOVE_ATTACHMENT:Remove attachment`)\n );\n\n /**\n * Emitted when an attachment should be removed\n */\n readonly remove = output<Attachment>();\n\n private getPreviewTemplate(attachment: Attachment): any | undefined {\n if (attachment.previewTemplate) {\n return typeof attachment.previewTemplate === 'function'\n ? attachment.previewTemplate()\n : attachment.previewTemplate;\n }\n return undefined;\n }\n\n protected openPreview(event: Event, attachment: Attachment): void {\n const template = this.getPreviewTemplate(attachment);\n if (template) {\n event.preventDefault();\n this.modalService.show(template, {\n inputValues: { 'attachment': attachment }\n });\n }\n }\n\n protected getFileIcon(name: string): string {\n // TODO: Accept map and default it in file upload directive.\n return this.icons.elementDocument;\n }\n}\n","<div class=\"d-flex flex-wrap gap-4\" [class.justify-content-end]=\"alignment() === 'end'\">\n @for (attachment of attachments(); track $index) {\n <div class=\"attachment-item d-flex align-items-stretch\" role=\"group\">\n @if (attachment.previewTemplate) {\n <button\n type=\"button\"\n class=\"attachment-main focus-inside d-flex align-items-center flex-grow-1 min-width-0\"\n [attr.title]=\"attachment.name\"\n [attr.aria-label]=\"attachment.name\"\n (click)=\"openPreview($event, attachment)\"\n (keydown.enter)=\"openPreview($event, attachment)\"\n (keydown.space)=\"openPreview($event, attachment)\"\n >\n <si-icon\n class=\"attachment-icon icon flex-shrink-0 mx-1\"\n [icon]=\"getFileIcon(attachment.name)\"\n />\n <div class=\"attachment-info flex-grow-1 min-width-0\">\n <span\n class=\"attachment-name me-4 text-truncate si-body-2 d-block\"\n [title]=\"attachment.name\"\n >\n {{ attachment.name }}\n </span>\n </div>\n </button>\n } @else {\n <div class=\"attachment-main--static d-flex align-items-center flex-grow-1 min-width-0\">\n <si-icon\n class=\"attachment-icon icon flex-shrink-0 mx-1\"\n [icon]=\"getFileIcon(attachment.name)\"\n />\n <div class=\"attachment-info flex-grow-1 min-width-0\">\n <span\n class=\"attachment-name me-4 text-truncate si-body-2 d-block\"\n [title]=\"attachment.name\"\n >\n {{ attachment.name }}\n </span>\n </div>\n </div>\n }\n\n @if (removable()) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon expand-button flex-shrink-0 ms-auto align-self-center focus-inside\"\n [attr.aria-label]=\"(removeLabel() | translate) + ' ' + attachment.name\"\n (click)=\"remove.emit(attachment); $event.stopPropagation()\"\n >\n <si-icon class=\"icon\" [icon]=\"icons.elementDelete\" />\n </button>\n }\n </div>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n AfterContentInit,\n Component,\n effect,\n ElementRef,\n input,\n OnDestroy,\n PLATFORM_ID,\n viewChild,\n inject\n} from '@angular/core';\n\n/**\n * A declarative container component for displaying a chat interface with automatic scroll-to-bottom behavior.\n *\n * This component provides the layout and styling for a chat interface, managing scrolling behavior\n * to keep the newest messages visible while respecting user scrolling actions. It automatically\n * scrolls to the bottom when new content is added, unless the user has scrolled up to view older messages.\n *\n * Use via content projection:\n * - Default content: Chat messages displayed in the scrollable messages container or a welcome screen (empty state).\n * - `si-inline-notification` selector: Notification component displayed above the input area\n * - `si-chat-input` or `[siChatContainerInput]` selector: Input controls for composing messages\n *\n * @see {@link SiChatInputComponent} for the chat input wrapper component\n * @see {@link SiChatContainerInputDirective} for other input controls to slot in\n * @see {@link SiAiMessageComponent} for AI messages to slot in\n * @see {@link SiUserMessageComponent} for user messages (in AI chats) to slot in\n * @see {@link SiChatMessageComponent} for the chat message wrapper component to slot in other messages\n *\n * @experimental\n */\n@Component({\n selector: 'si-chat-container',\n templateUrl: './si-chat-container.component.html',\n styleUrl: './si-chat-container.component.scss',\n host: {\n class: 'd-flex si-layout-inner flex-grow-1 flex-column h-100 w-100',\n '[class]': 'colorVariant()'\n }\n})\nexport class SiChatContainerComponent implements AfterContentInit, OnDestroy {\n private readonly messagesContainer = viewChild<ElementRef<HTMLDivElement>>('messagesContainer');\n private readonly platformId = inject(PLATFORM_ID);\n\n private isUserAtBottom = true;\n private scrollTimeout: ReturnType<typeof setTimeout> | undefined;\n private lastScrollTime = 0;\n private pendingScroll = false;\n private scrollDebounceMs = 7; // ~144fps\n private resizeObserver: ResizeObserver | undefined;\n private contentObserver: MutationObserver | undefined;\n\n /**\n * The color variant to apply to the container.\n * @defaultValue 'base-0'\n */\n readonly colorVariant = input<string>('base-0');\n\n /**\n * Disables automatic scrolling to the bottom when new content is added.\n * @defaultValue false\n */\n readonly noAutoScroll = input(false, {\n transform: (value: boolean | string) => value === '' || value === true\n });\n\n constructor() {\n effect(() => {\n if (this.messagesContainer()) {\n this.setupResizeObserver();\n this.setupContentObserver();\n }\n });\n }\n\n ngAfterContentInit(): void {\n this.scrollToBottomDuringStreaming();\n }\n\n ngOnDestroy(): void {\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout);\n }\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.contentObserver) {\n this.contentObserver.disconnect();\n }\n }\n\n private scrollToBottomDuringStreaming(): void {\n if (this.noAutoScroll() || !this.isUserAtBottom) {\n return;\n }\n\n const container = this.messagesContainer();\n if (!container) {\n return;\n }\n\n const element = container.nativeElement;\n element.scrollTop = element.scrollHeight;\n }\n\n private debouncedScrollToBottom(): void {\n const now = Date.now();\n const timeSinceLastScroll = now - this.lastScrollTime;\n\n if (timeSinceLastScroll >= this.scrollDebounceMs) {\n this.lastScrollTime = now;\n this.scrollToBottomDuringStreaming();\n this.pendingScroll = false;\n } else {\n this.pendingScroll = true;\n }\n\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout);\n }\n\n this.scrollTimeout = setTimeout(() => {\n if (this.pendingScroll) {\n this.lastScrollTime = Date.now();\n this.scrollToBottomDuringStreaming();\n this.pendingScroll = false;\n }\n }, this.scrollDebounceMs);\n }\n\n private setupResizeObserver(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const container = this.messagesContainer();\n if (!container || this.resizeObserver) {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.debouncedScrollToBottom();\n });\n\n this.resizeObserver.observe(container.nativeElement);\n }\n\n private setupContentObserver(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const container = this.messagesContainer();\n if (!container || this.contentObserver) {\n return;\n }\n\n this.contentObserver = new MutationObserver(() => {\n this.debouncedScrollToBottom();\n });\n\n this.contentObserver.observe(container.nativeElement, {\n childList: true,\n subtree: true,\n characterData: true\n });\n }\n\n private checkIfUserAtBottom(): void {\n const container = this.messagesContainer();\n if (!container) {\n return;\n }\n\n const element = container.nativeElement;\n const threshold = 100;\n this.isUserAtBottom =\n element.scrollHeight - element.scrollTop - element.clientHeight < threshold;\n }\n\n protected onScroll(): void {\n this.checkIfUserAtBottom();\n }\n\n /**\n * Scrolls to the bottom of the messages container immediately.\n * This method forces a scroll even if the user has scrolled up.\n */\n public scrollToBottom(): void {\n this.isUserAtBottom = true;\n this.scrollToBottomDuringStreaming();\n }\n\n /**\n * Scrolls to the top of the messages container immediately.\n */\n public scrollToTop(): void {\n const container = this.messagesContainer();\n if (!container) {\n return;\n }\n\n const element = container.nativeElement;\n element.scrollTop = 0;\n this.isUserAtBottom = false;\n }\n\n /**\n * Focuses the messages container element.\n */\n public focus(): void {\n const container = this.messagesContainer();\n container?.nativeElement.focus();\n }\n}\n","<div class=\"chat-container d-flex flex-column flex-grow-1 px-6 px-md-9 py-6 w-100\">\n <div\n #messagesContainer\n class=\"messages-container d-flex flex-column flex-grow-1 w-100 align-self-center\"\n tabindex=\"0\"\n (scroll)=\"onScroll()\"\n >\n <ng-content />\n </div>\n\n <div class=\"chat-input-area py-3 pt-0 mt-6 d-flex flex-column align-items-center\">\n <ng-content select=\"si-inline-notification\" />\n <ng-content select=\"si-chat-input,[siChatContainerInput]\" />\n </div>\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Directive } from '@angular/core';\n\n/**\n * A directive to mark elements as input controls within a {@link SiChatContainerComponent}.\n *\n * This directive is used to identify and style input elements that belong to\n * the chat container component, typically applied to form inputs or textareas\n * used for composing chat messages.\n *\n * @example\n * ```html\n * <si-chat-container>\n * <si-chat-message>Hello!</si-chat-message>\n * <si-chat-message>How are you?</si-chat-message>\n *\n * <input siChatContainerInput type=\"text\" placeholder=\"Type a message...\" />\n * </si-chat-container>\n * ```\n *\n * @see {@link SiChatContainerComponent} for the chat container wrapper component\n *\n * @experimental\n */\n@Directive({\n selector: '[siChatContainerInput]'\n})\nexport class SiChatContainerInputDirective {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport {\n AfterViewInit,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n output,\n viewChild\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n elementAttachment,\n elementOptionsVertical,\n elementSendFilled,\n elementStopFilled\n} from '@siemens/element-icons';\nimport {\n SiFileUploadDirective,\n UploadFile,\n FileUploadError\n} from '@siemens/element-ng/file-uploader';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { MenuItem, SiMenuFactoryComponent } from '@siemens/element-ng/menu';\nimport { SiTranslatePipe, TranslatableString, t } from '@siemens/element-translate-ng/translate';\n\nimport { MessageAction } from './message-action.model';\nimport { Attachment, SiAttachmentListComponent } from './si-attachment-list.component';\n\n/**\n * Attachment item interface for file attachments in chat messages, extension of {@link Attachment} for {@link SiAttachmentListComponent} to use within {@link SiChatInputComponent}.\n * Adds the action file information.\n * Can be used within {@link SiChatContainerComponent}.\n *\n * @see {@link Attachment} for base attachment interface\n * @see {@link SiAttachmentListComponent} for the attachment list component\n * @see {@link SiChatInputComponent} for the chat input component\n * @see {@link SiChatContainerComponent} for the chat container component\n *\n * @experimental\n */\nexport interface ChatInputAttachment extends Attachment {\n /** File object */\n file: File;\n /** File size in bytes */\n size: number;\n /** MIME type */\n type: string;\n}\n\n/**\n * Chat input component for composing and sending messages in conversational interfaces.\n *\n * The chat input component provides a text area for users to compose messages,\n * supporting text, attachments, and contextual actions. It appears as a textarea\n * with buttons for adding attachments and sending messages, as well as an optional disclaimer.\n *\n * The component automatically handles:\n * - Styling for chat input and actions.\n * - Dynamic resizing of the textarea based on content.\n * - Uploading of and displaying of attachments above the input area.\n * - Displaying primary and secondary actions.\n *\n * Additionally to the inputs and outputs documented here, the component supports content projection via the following slots:\n * - Default content: Custom action buttons to display inline, prefer using the `actions` input for buttons, can be used in addition.\n * - `siChatInputDisclaimer` selector: Custom disclaimer content to display below the input area, prefer using the `disclaimer` input for simple text disclaimers.\n *\n * @see {@link SiAttachmentListComponent} for the base attachment component\n * @see {@link SiChatInputDisclaimerDirective} to slot in custom disclaimer content\n *\n * @experimental\n */\n@Component({\n selector: 'si-chat-input',\n imports: [\n CdkMenuTrigger,\n FormsModule,\n SiIconComponent,\n SiTranslatePipe,\n SiAttachmentListComponent,\n SiMenuFactoryComponent,\n SiFileUploadDirective\n ],\n templateUrl: './si-chat-input.component.html',\n styleUrl: './si-chat-input.component.scss'\n})\nexport class SiChatInputComponent implements AfterViewInit {\n private static idCounter = 0;\n private readonly textInput = viewChild<ElementRef<HTMLTextAreaElement>>('textInput');\n private readonly projectedContent = viewChild<ElementRef>('projected');\n private readonly fileUploadDirective = viewChild(SiFileUploadDirective);\n protected readonly icons = addIcons({\n elementAttachment,\n elementOptionsVertical,\n elementSendFilled,\n elementStopFilled\n });\n\n /**\n * Current input value\n * @defaultValue ''\n */\n readonly value = model<string>('');\n\n /**\n * Placeholder text for the input\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.PLACEHOLDER:Enter a message…`)\n * ```\n */\n readonly placeholder = input<TranslatableString>(\n t(() => $localize`:@@SI_CHAT_INPUT.PLACEHOLDER:Enter a message…`)\n );\n\n /**\n * Whether the input is disabled\n * @defaultValue false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Whether a message is currently being sent, also prevent the sending of new ones while still allowing the user to type\n * @defaultValue false\n */\n readonly sending = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the input supports interrupting ongoing operations. When active,\n * the send button transforms into an interrupt button (with element-stop-filled icon).\n * If sending is true, the interrupt button will be disabled.\n * @defaultValue false\n */\n readonly interruptible = input(false, { transform: booleanAttribute });\n\n /**\n * Maximum number of characters allowed\n */\n readonly maxLength = input<number>();\n\n /**\n * A disclaimer to display.\n *\n * If not provided, the component will look for projected content with the `siChatInputDisclaimer` directive.\n * If both are empty, no disclaimer section will be shown (handled via CSS :empty).\n */\n readonly disclaimer = input<TranslatableString>();\n\n /**\n * Primary actions available in the input (attach files, etc.)\n * All actions displayed inline\n * @defaultValue []\n */\n readonly actions = input<MessageAction[]>([]);\n\n /**\n * Secondary actions available in dropdown menu\n * @defaultValue []\n */\n readonly secondaryActions = input<MenuItem[]>([]);\n\n /**\n * Whether file attachments are supported\n * @defaultValue false\n */\n readonly allowAttachments = input(false);\n\n /**\n * Accepted file types for attachments (as accept string)\n * @defaultValue undefined\n */\n readonly accept = input<string>();\n\n /**\n * Maximum file size in bytes\n * @defaultValue 10485760 (10MB)\n */\n readonly maxFileSize = input(10485760);\n\n /**\n * Current attachments\n * @defaultValue []\n */\n readonly attachments = model<ChatInputAttachment[]>([]);\n\n /**\n * The label for the input, used for accessibility\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.LABEL:Chat message input`)\n * ```\n */\n readonly label = input<string>(t(() => $localize`:@@SI_CHAT_INPUT.LABEL:Chat message input`));\n\n /** Parameter to pass to action handlers */\n readonly actionParam = input<any>();\n\n /**\n * Send button label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.SEND:Send`)\n * ```\n */\n readonly sendButtonLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_CHAT_INPUT.SEND:Send`)\n );\n\n /**\n * Send button icon\n *\n * @defaultValue this.icons.elementSendFilled\n */\n readonly sendButtonIcon = input(this.icons.elementSendFilled);\n\n /**\n * Interrupt button label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.INTERRUPT:Interrupt`)\n * ```\n */\n readonly interruptButtonLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_CHAT_INPUT.INTERRUPT:Interrupt`)\n );\n\n /**\n * Auto-focus the input on component initialization\n * @defaultValue false\n */\n readonly autoFocus = input(false, { transform: booleanAttribute });\n\n /**\n * Attach file button aria label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.ATTACH_FILE:Attach file`)\n * ```\n */\n readonly attachFileLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_CHAT_INPUT.ATTACH_FILE:Attach file`)\n );\n\n /**\n * Remove attachment aria label prefix\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_ATTACHMENT_LIST.REMOVE_ATTACHMENT:Remove attachment`)\n * ```\n */\n readonly removeAttachmentLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_ATTACHMENT_LIST.REMOVE_ATTACHMENT:Remove attachment`)\n );\n\n /**\n * More actions button aria label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_CHAT_INPUT.SECONDARY_ACTIONS:More actions`)\n * ```\n */\n readonly secondaryActionsLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_CHAT_INPUT.SECONDARY_ACTIONS:More actions`)\n );\n\n /**\n * Emitted when the user wants to send a message\n */\n readonly send = output<{\n content: string;\n attachments: ChatInputAttachment[];\n }>();\n\n /**\n * Emitted when the user wants to interrupt the current operation\n */\n readonly interrupt = output<void>();\n\n /**\n * Emitted when file upload errors occur\n */\n readonly fileError = output<FileUploadError>();\n\n protected readonly id = `__si-chat-input-${SiChatInputComponent.idCounter++}`;\n protected readonly hasContent = computed(() => this.value().trim().length > 0);\n protected readonly hasAttachments = computed(() => this.attachments().length > 0);\n protected readonly hasActions = computed(() => this.actions().length > 0);\n protected readonly hasSecondaryActions = computed(() => this.secondaryActions().length > 0);\n protected readonly canSend = computed(\n () => (this.hasContent() || this.hasAttachments()) && !this.disabled() && !this.sending()\n );\n\n protected readonly showInterruptButton = computed(() => this.interruptible());\n protected readonly buttonDisabled = computed(() => {\n if (this.showInterruptButton()) {\n return this.disabled() || this.sending();\n }\n return !this.canSend();\n });\n protected readonly buttonIcon = computed(() =>\n this.showInterruptButton() ? this.icons.elementStopFilled : this.sendButtonIcon()\n );\n protected readonly buttonLabel = computed(() =>\n this.showInterruptButton() ? this.interruptButtonLabel() : this.sendButtonLabel()\n );\n\n protected dragOver = false;\n\n protected get attachmentList(): Attachment[] {\n return this.attachments() as Attachment[];\n }\n\n protected onInputChange(value: string): void {\n this.value.set(value);\n }\n\n protected onSend(): void {\n if (this.canSend()) {\n this.send.emit({\n content: this.value(),\n attachments: this.attachments()\n });\n\n this.value.set('');\n this.attachments.set([]);\n }\n }\n\n protected onButtonClick(): void {\n if (this.showInterruptButton()) {\n this.interrupt.emit();\n } else {\n this.onSend();\n }\n }\n\n protected onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (!this.canSend()) {\n return;\n }\n if (this.showInterruptButton()) {\n this.interrupt.emit();\n }\n this.onSend();\n }\n }\n\n protected onFilesAdded(uploadFiles: UploadFile[]): void {\n const validFiles = uploadFiles.filter(uploadFile => uploadFile.status === 'added');\n\n validFiles.forEach(uploadFile => {\n const size = parseInt(uploadFile.size, 10);\n const attachment: ChatInputAttachment = {\n name: uploadFile.fileName,\n size: isNaN(size) ? uploadFile.file.size : size,\n type: uploadFile.file.type,\n file: uploadFile.file\n };\n\n this.attachments.update(current => [...current, attachment]);\n });\n }\n\n protected onFileError(error: FileUploadError): void {\n this.fileError.emit(error);\n }\n\n protected removeAttachment(attachment: Attachment): void {\n this.attachments.update(current => {\n return current.filter(a => a !== attachment);\n });\n }\n\n protected onContainerClick(event: Event): void {\n const target = event.target as HTMLElement;\n\n // Don't focus if clicking on interactive elements\n if (\n target.tagName === 'BUTTON' ||\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.closest('button') ||\n target.closest('[siChatMessageAction]') ||\n (target.closest('si-attachment-list') && target.closest('.attachment-item')) ||\n this.projectedContent()?.nativeElement?.contains(target)\n ) {\n return;\n }\n\n this.focus();\n }\n\n ngAfterViewInit(): void {\n const textarea = this.textInput();\n if (textarea?.nativeElement) {\n this.setTextareaHeight(textarea.nativeElement);\n\n if (this.autoFocus()) {\n // Use setTimeout to ensure the element is fully rendered\n setTimeout(() => {\n textarea.nativeElement.focus();\n }, 0);\n }\n }\n }\n\n protected adjustTextareaHeight(event: Event): void {\n const textarea = event.target as HTMLTextAreaElement;\n this.setTextareaHeight(textarea);\n }\n\n /**\n * Focus the textarea input\n */\n focus(): void {\n const textarea = this.textInput();\n if (textarea?.nativeElement) {\n textarea.nativeElement.focus();\n }\n }\n\n protected dropHandler(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragOver = false;\n\n if (!this.allowAttachments() || this.disabled()) {\n return;\n }\n\n const directive = this.fileUploadDirective();\n if (directive && event.dataTransfer?.files) {\n directive.handleFiles(event.dataTransfer.files);\n }\n }\n\n protected dragOverHandler(event: DragEvent): void {\n if (!this.allowAttachments() || this.disabled()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.dragOver = true;\n }\n\n private setTextareaHeight(textarea: HTMLTextAreaElement): void {\n textarea.style.blockSize = 'auto';\n\n const computedStyle = window.getComputedStyle(textarea);\n const lineHeight =\n parseInt(computedStyle.lineHeight, 10) || parseInt(computedStyle.fontSize, 10) * 1.2;\n const paddingTop = parseInt(computedStyle.paddingBlockStart, 10) || 0;\n const paddingBottom = parseInt(computedStyle.paddingBlockEnd, 10) || 0;\n const minHeight = lineHeight + paddingTop + paddingBottom;\n\n const viewportHeight = window.innerHeight;\n const maxViewportHeight = viewportHeight * 0.3;\n const maxLinesHeight = lineHeight * 8;\n const maxHeight = Math.min(maxViewportHeight, maxLinesHeight) + paddingTop + paddingBottom;\n\n const scrollHeight = textarea.scrollHeight;\n const finalHeight = Math.max(Math.min(scrollHeight, maxHeight), minHeight);\n textarea.style.height = finalHeight + 'px';\n }\n}\n","<div\n class=\"input-wrapper border rounded-3 bg-body\"\n [class.drag-over]=\"dragOver\"\n (click)=\"onContainerClick($event)\"\n (drop)=\"dropHandler($event)\"\n (dragover)=\"dragOverHandler($event)\"\n (dragleave)=\"dragOver = false\"\n>\n @if (hasAttachments()) {\n <div class=\"p-4 pb-0\">\n <si-attachment-list\n [attachments]=\"attachmentList\"\n [removeLabel]=\"removeAttachmentLabel()\"\n [removable]=\"true\"\n (remove)=\"removeAttachment($event)\"\n />\n </div>\n }\n\n <div class=\"p-4 pe-2 pb-0 si-body-2\">\n <label class=\"form-label d-none\" [for]=\"id\">{{ label() | translate }}</label>\n <textarea\n #textInput\n class=\"chat-textarea w-100 border-0 p-2\"\n rows=\"1\"\n [id]=\"id\"\n [placeholder]=\"placeholder() | translate\"\n [disabled]=\"disabled()\"\n [maxlength]=\"maxLength() || null\"\n [(ngModel)]=\"value\"\n (keydown)=\"onKeyDown($event)\"\n (input)=\"adjustTextareaHeight($event)\"\n ></textarea>\n </div>\n\n <div class=\"d-flex align-items-center justify-content-between px-4 ps-5 pb-2\">\n <div class=\"d-flex align-items-center gap-4\">\n @if (allowAttachments()) {\n <input\n #fileInput\n type=\"file\"\n class=\"d-none\"\n siFileUpload\n [accept]=\"accept()\"\n [maxFileSize]=\"maxFileSize()\"\n [multiple]=\"true\"\n (validFiles)=\"onFilesAdded($event)\"\n (fileError)=\"onFileError($event)\"\n />\n\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [attr.aria-label]=\"attachFileLabel() | translate\"\n [disabled]=\"disabled()\"\n (click)=\"fileInput.click()\"\n >\n <si-icon [icon]=\"icons.elementAttachment\" />\n </button>\n }\n\n @if (hasActions() || hasSecondaryActions()) {\n <div class=\"d-flex gap-4 ai-message-actions\" siChatMessageAction>\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label | translate\"\n (click)=\"action.action(actionParam(), action)\"\n >\n <si-icon [icon]=\"action.icon\" />\n </button>\n }\n\n @if (secondaryActions().length > 0) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon [icon]=\"icons.elementOptionsVertical\" />\n </button>\n\n <ng-template #secondaryActionsMenu>\n <si-menu-factory [items]=\"secondaryActions()\" [actionParam]=\"actionParam()\" />\n </ng-template>\n }\n </div>\n }\n <div #projected class=\"d-flex flex-wrap align-items-start gap-4\">\n <ng-content />\n </div>\n </div>\n\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"buttonDisabled()\"\n [attr.aria-label]=\"buttonLabel() | translate\"\n (click)=\"onButtonClick()\"\n >\n <si-icon class=\"text-primary\" [icon]=\"buttonIcon()\" />\n </button>\n </div>\n</div>\n\n<div class=\"disclaimer-wrapper text-center mt-4 px-3\">\n @if (disclaimer()) {\n <span class=\"si-caption text-secondary d-block\">{{ disclaimer() | translate }}</span>\n }\n <ng-content select=\"[siChatInputDisclaimer]\" />\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Directive } from '@angular/core';\n\n/**\n * Directive to mark content as chat input disclaimer into {@link SiChatInputComponent}.\n * Apply this directive to content that should be slotted into the disclaimer area.\n *\n * @example\n * ```html\n * <si-chat-input>\n * <div siChatInputDisclaimer>\n * Custom disclaimer content\n * </div>\n * </si-chat-input>\n * ```\n *\n * @see {@link SiChatInputComponent} for the chat input wrapper component\n *\n * @experimental\n */\n@Directive({\n selector: '[siChatInputDisclaimer]'\n})\nexport class SiChatInputDisclaimerDirective {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport { Component, effect, input, viewChild, ElementRef, computed, signal } from '@angular/core';\nimport { elementOptionsVertical } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { MenuItem, SiMenuFactoryComponent } from '@siemens/element-ng/menu';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\nimport { MessageAction } from './message-action.model';\nimport { Attachment, SiAttachmentListComponent } from './si-attachment-list.component';\nimport { SiChatMessageActionDirective } from './si-chat-message-action.directive';\nimport { SiChatMessageComponent } from './si-chat-message.component';\n\n/**\n * User message component for displaying the user's messages in conversational interfaces.\n *\n * The user message component renders user-submitted content in (AI) chat interfaces,\n * supporting text, attachments, and contextual actions. It appears as a text bubble\n * aligned to the right side and supports markdown formatting for rich content.\n * Can be used within {@link SiChatContainerComponent}.\n *\n * The component automatically handles:\n * - Styling for user messages distinct from AI or generic chat messages\n * - Option to render markdown content, provide via `contentFormatter` input with a markdown renderer function (e.g., from {@link getMarkdownRenderer})\n * - Displaying attachments above the message bubble\n * - Displaying primary and secondary actions\n *\n * @see {@link SiChatMessageComponent} for the base message wrapper component\n * @see {@link SiAiMessageComponent} for the AI message component\n * @see {@link SiAttachmentListComponent} for the base attachment component\n * @see {@link getMarkdownRenderer} for markdown formatting support\n * @see {@link SiChatContainerComponent} for the chat container to use this within\n *\n * @experimental\n */\n@Component({\n selector: 'si-user-message',\n imports: [\n CdkMenuTrigger,\n SiAttachmentListComponent,\n SiChatMessageComponent,\n SiIconComponent,\n SiMenuFactoryComponent,\n SiChatMessageActionDirective,\n SiTranslatePipe\n ],\n templateUrl: './si-user-message.component.html',\n styleUrl: './si-user-message.component.scss'\n})\nexport class SiUserMessageComponent {\n protected readonly formattedContent = viewChild<ElementRef<HTMLDivElement>>('formattedContent');\n protected readonly icons = addIcons({ elementOptionsVertical });\n\n /**\n * The user message content\n * @defaultValue ''\n */\n readonly content = input<string>('');\n\n /**\n * Optional formatter function to transform content before display.\n * - Returns string: Content will be inserted as text with built-in sanitization\n * - Returns Node: DOM node will be inserted directly without sanitization\n *\n * **Note:** When returning a Node with formatted content, apply the `markdown-content` class\n * to the root element to ensure proper styling (e.g., `div.className = 'markdown-content'`).\n * The function returned by {@link getMarkdownRenderer} does this automatically.\n *\n * **Warning:** When returning a Node, ensure the content is safe to prevent XSS attacks\n * @defaultValue undefined\n */\n readonly contentFormatter = input<((text: string) => string | Node) | undefined>(undefined);\n\n /**\n * Primary message actions (edit, delete, copy, etc.).\n * All actions displayed inline\n * @defaultValue []\n */\n readonly actions = input<MessageAction[]>([]);\n\n /**\n * Secondary actions available in dropdown menu, first use primary actions and only add secondary actions additionally\n * @defaultValue []\n */\n readonly secondaryActions = input<MenuItem[]>([]);\n\n /**\n * List of attachments included with this message\n * @defaultValue []\n */\n readonly attachments = input<Attachment[]>([]);\n\n /** Parameter to pass to action handlers */\n readonly actionParam = input<any>();\n\n /**\n * More actions button aria label\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_USER_MESSAGE.SECONDARY_ACTIONS:More actions`)\n * ```\n */\n readonly secondaryActionsLabel = input(\n t(() => $localize`:@@SI_USER_MESSAGE.SECONDARY_ACTIONS:More actions`)\n );\n\n protected readonly hasAttachments = computed(() => this.attachments()?.length > 0);\n\n protected readonly textContent = signal<string | undefined>(undefined);\n\n constructor() {\n effect(() => {\n const formatter = this.contentFormatter();\n const contentValue = this.content();\n const container = this.formattedContent()?.nativeElement;\n\n if (container && contentValue) {\n if (formatter) {\n const formatted = formatter(contentValue);\n\n if (typeof formatted === 'string') {\n this.textContent.set(formatted);\n } else if (formatted instanceof Node) {\n this.textContent.set(undefined);\n container.innerHTML = '';\n container.appendChild(formatted);\n }\n } else {\n this.textContent.set(contentValue);\n }\n }\n });\n }\n}\n","<si-chat-message alignment=\"end\" actionsPosition=\"bottom\" [loading]=\"false\">\n @if (hasAttachments()) {\n <si-attachment-list alignment=\"end\" [attachments]=\"attachments()\" [removable]=\"false\" />\n }\n\n @if (content()) {\n @let content = textContent();\n @if (content) {\n <span class=\"text-pre-wrap\">{{ content }}</span>\n } @else {\n <div #formattedContent> </div>\n }\n }\n @if (actions().length > 0 || secondaryActions().length > 0) {\n <div class=\"d-flex gap-4 user-message-actions\" siChatMessageAction>\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [disabled]=\"action.disabled\"\n [attr.aria-label]=\"action.label | translate\"\n (click)=\"action.action(actionParam(), action)\"\n >\n <si-icon [icon]=\"action.icon\" />\n </button>\n }\n\n @if (secondaryActions().length > 0) {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-icon\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon [icon]=\"icons.elementOptionsVertical\" />\n </button>\n\n <ng-template #secondaryActionsMenu>\n <si-menu-factory [items]=\"secondaryActions()\" [actionParam]=\"actionParam()\" />\n </ng-template>\n }\n </div>\n }\n</si-chat-message>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Component, input, model, output } from '@angular/core';\nimport { SiActionCardComponent } from '@siemens/element-ng/card';\nimport { SiSummaryChipComponent } from '@siemens/element-ng/summary-chip';\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\nexport interface PromptCategory {\n label: TranslatableString;\n}\n\nexport interface PromptSuggestion {\n text: TranslatableString;\n}\n\n/**\n * AI welcome screen component for displaying initial state in AI chat interfaces.\n *\n * The AI welcome screen component provides an engaging initial state for AI chat interfaces,\n * featuring a welcome message, optional prompt categories for filtering, and suggested prompts\n * that users can click to start conversations.\n *\n * The component includes:\n * - Welcome header with AI branding and customizable greeting\n * - Optional category pills for filtering prompt suggestions\n * - Clickable prompt suggestion cards\n * - Optional refresh button to regenerate suggestions\n *\n * @see {@link SiAiChatContainerComponent} for the AI chat container which uses this component\n * @see {@link SiChatContainerComponent} for the base chat container\n *\n * @experimental\n */\n@Component({\n selector: 'si-ai-welcome-screen',\n imports: [SiActionCardComponent, SiSummaryChipComponent],\n templateUrl: './si-ai-welcome-screen.component.html',\n styleUrl: './si-ai-welcome-screen.component.scss',\n host: {\n class: 'd-block'\n }\n})\nexport class SiAiWelcomeScreenComponent {\n /**\n * The list of prompt categories\n * @defaultValue []\n */\n readonly categories = input<PromptCategory[]>([]);\n\n /**\n * The currently selected category ID\n * @defaultValue undefined\n */\n readonly selectedCategory = model<string | undefined>(undefined);\n\n /**\n * The list of prompt suggestions as an array, update this when the selected category changes.\n * @defaultValue []\n */\n readonly promptSuggestions = input<PromptSuggestion[]>([]);\n\n /**\n * Emitted when a prompt suggestion is clicked\n */\n readonly promptSelected = output<PromptSuggestion>();\n\n protected onCategoryClick(categoryLabel: string): void {\n this.selectedCategory.set(\n this.selectedCategory() === categoryLabel ? undefined : categoryLabel\n );\n }\n\n protected onPromptClick(suggestion: PromptSuggestion): void {\n this.promptSelected.emit(suggestion);\n }\n}\n","<div class=\"d-flex flex-column gap-10 align-items-center w-100\">\n <!-- Welcome Header -->\n <div class=\"welcome-header d-flex flex-column gap-4 w-100 pt-10 pb-8\">\n <ng-content />\n </div>\n\n <!-- Prompt Categories and Suggestions -->\n <div class=\"prompt-suggestions d-flex flex-column gap-6 align-items-center w-100\">\n @if (categories().length > 0) {\n <div class=\"d-flex gap-4 align-items-center w-100\">\n @for (category of categories(); track $index) {\n <si-summary-chip\n class=\"user-select-none\"\n [label]=\"category.label\"\n [selected]=\"selectedCategory() === category.label\"\n (selectedChange)=\"onCategoryClick(category.label)\"\n />\n }\n </div>\n }\n\n @if (promptSuggestions().length > 0) {\n <div class=\"d-flex flex-column gap-4 w-100\">\n @for (suggestion of promptSuggestions(); track $index) {\n <button si-action-card type=\"button\" class=\"w-100\" (click)=\"onPromptClick(suggestion)\">\n <div body class=\"card-body card-text\">\n {{ suggestion.text }}\n </div>\n </button>\n }\n </div>\n }\n </div>\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-ai-message.component';\nexport * from './si-attachment-list.component';\nexport * from './si-chat-container.component';\nexport * from './si-chat-container-input.directive';\nexport * from './si-chat-input.component';\nexport * from './si-chat-input-disclaimer.directive';\nexport * from './si-chat-message-action.directive';\nexport * from './si-chat-message.component';\nexport * from './si-user-message.component';\nexport * from './message-action.model';\nexport * from './si-ai-welcome-screen.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
|