@siemens/element-ng 48.2.0 → 48.3.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/accordion/index.d.ts +5 -1
- package/application-header/index.d.ts +15 -2
- package/chat-messages/index.d.ts +654 -0
- package/chat-messages/package.json +3 -0
- package/dashboard/index.d.ts +1 -0
- package/fesm2022/siemens-element-ng-accordion.mjs +5 -1
- package/fesm2022/siemens-element-ng-accordion.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-application-header.mjs +62 -1
- package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-card.mjs +4 -4
- package/fesm2022/siemens-element-ng-card.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-chat-messages.mjs +863 -0
- package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-dashboard.mjs +8 -4
- package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-file-uploader.mjs +277 -118
- package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-filtered-search.mjs +3 -4
- package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-icon.mjs +3 -1
- package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-ip-input.mjs +92 -89
- package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-markdown-renderer.mjs +253 -0
- package/fesm2022/siemens-element-ng-markdown-renderer.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-phone-number.mjs +5 -4
- package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-popover.mjs +3 -4
- package/fesm2022/siemens-element-ng-popover.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-resize-observer.mjs +13 -0
- package/fesm2022/siemens-element-ng-resize-observer.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tree-view.mjs +41 -2
- package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
- package/file-uploader/index.d.ts +119 -15
- package/icon/index.d.ts +3 -1
- package/ip-input/index.d.ts +13 -0
- package/markdown-renderer/index.d.ts +36 -0
- package/markdown-renderer/package.json +3 -0
- package/package.json +11 -3
- package/resize-observer/index.d.ts +13 -0
- package/schematics/migrations/action-modal-migration/action-modal-migration.js +2 -2
- package/schematics/migrations/data/attribute-selectors.js +6 -0
- package/schematics/migrations/data/component-names.js +78 -0
- package/schematics/migrations/data/element-selectors.js +10 -0
- package/schematics/migrations/data/index.js +17 -0
- package/schematics/migrations/data/output-names.js +8 -0
- package/schematics/migrations/data/symbol-removals.js +58 -0
- package/schematics/migrations/element-migration/element-migration.js +101 -0
- package/schematics/migrations/element-migration/index.js +5 -0
- package/schematics/migrations/index.js +7 -2
- package/schematics/migrations/wizard-migration/index.js +88 -0
- package/schematics/scss-import-to-siemens-migration/index.js +3 -3
- package/schematics/ts-import-to-siemens-migration/index.js +2 -2
- package/schematics/utils/index.js +3 -3
- package/schematics/utils/project-utils.js +24 -35
- package/schematics/utils/template-utils.js +78 -2
- package/schematics/utils/ts-utils.js +5 -5
- package/template-i18n.json +9 -0
- package/translate/index.d.ts +9 -0
- package/tree-view/index.d.ts +40 -1
- package/schematics/migrations/to-legacy-migration/to-legacy-migration.js +0 -55
- package/schematics/migrations/to-legacy-migration/to-legacy-replacement.js +0 -35
|
@@ -0,0 +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-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/index.ts","../../../../projects/element-ng/chat-messages/siemens-element-ng-chat-messages.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { Directive } from '@angular/core';\n\n/**\n * Directive to mark content as chat message actions.\n * Apply this directive to e.g. buttons that should be slotted into the message actions area.\n *\n * @experimental\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@Directive({\n selector: '[siChatMessageAction]'\n})\nexport class SiChatMessageActionDirective {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { Component, input } from '@angular/core';\nimport { SiResponsiveContainerDirective } from '@siemens/element-ng/resize-observer';\n\n/**\n * Base chat message component that provides the layout structure for conversational interfaces.\n *\n * This component handles the core message layout including avatar positioning, loading states,\n * and action button placement. It serves as the foundation for more specialized message components\n * like {@link SiUserMessageComponent} and {@link SiAiMessageComponent}.\n *\n * @remarks\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 * - Responsive behavior that adapts to container size\n * - Attachment display slot\n *\n * This is a low-level component typically not used directly. Instead, use the higher-level\n * message components that wrap this component with specific styling and behavior.\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.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 - 2025\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 { 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 *\n * @remarks\n * This component is designed for use in:\n * - AI chat interfaces where model responses need to be displayed\n * - Chatbot implementations\n * - Conversational AI applications\n * - AI assistant interfaces\n *\n * The component automatically handles:\n * - Rendering markdown content with syntax highlighting\n * - Showing loading states with skeleton UI during generation\n * - Displaying primary and secondary actions on hover (desktop) or tap (mobile)\n * - Proper alignment and styling for AI messages\n * - Content sanitization for security\n *\n * @example\n * Basic usage with content only:\n * ```html\n * <si-ai-message [content]=\"'I can help you with that.'\" />\n * ```\n *\n * @example\n * With loading state and actions:\n * ```typescript\n * import { Component } from '@angular/core';\n * import { SiAiMessageComponent } from '@siemens/element-ng/chat-messages';\n *\n * @Component({\n * selector: 'app-chat',\n * imports: [SiAiMessageComponent],\n * template: `\n * <si-ai-message\n * [content]=\"message.text\"\n * [loading]=\"message.isGenerating\"\n * [actions]=\"messageActions\"\n * [secondaryActions]=\"menuActions\"\n * [actionParam]=\"message\"\n * />\n * `\n * })\n * export class ChatComponent {\n * messageActions = [\n * { icon: 'thumbs-up', label: 'Good response', action: (id) => this.ratePositive(id) },\n * { icon: 'thumbs-down', label: 'Bad response', action: (id) => this.rateNegative(id) },\n * { icon: 'copy', label: 'Copy', action: (id) => this.copyMessage(id) }\n * ];\n *\n * menuActions = [\n * { label: 'Regenerate', action: (id) => this.regenerate(id) },\n * { label: 'Report', action: (id) => this.reportMessage(id) }\n * ];\n * }\n * ```\n *\n * @see {@link SiChatMessageComponent} for the base message wrapper component\n * @see {@link SiUserMessageComponent} for the companion user message component\n * @see {@link getMarkdownRenderer} for markdown formatting support\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 host: {\n class: 'si-ai-message'\n }\n})\nexport class SiAiMessageComponent {\n protected readonly formattedContent = viewChild<ElementRef<HTMLDivElement>>('formattedContent');\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-circle btn-sm\"\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-circle btn-sm\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon icon=\"element-optionsVertical\" />\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 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { booleanAttribute, Component, inject, input, output, TemplateRef } from '@angular/core';\nimport { 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.\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 * @remarks\n * This component provides:\n * - Automatic file type detection with appropriate icons\n * - Optional preview modal for attachments\n * - Optional remove functionality for editable messages\n * - Flexible alignment (start/end) to match message alignment\n * - Support for various file types (images, videos, audio, documents, archives)\n *\n * The component is typically used within {@link SiUserMessageComponent} or {@link SiAiMessageComponent}\n * to display uploaded files, but can also be used standalone.\n *\n * @example\n * Basic usage with attachments:\n * ```html\n * <si-attachment-list [attachments]=\"files\" />\n * ```\n *\n * @example\n * With remove functionality and custom alignment:\n * ```typescript\n * import { Component } from '@angular/core';\n * import { SiAttachmentListComponent, Attachment } from '@siemens/element-ng/chat-messages';\n *\n * @Component({\n * selector: 'app-chat',\n * imports: [SiAttachmentListComponent],\n * template: `\n * <si-attachment-list\n * [attachments]=\"attachments\"\n * [alignment]=\"'end'\"\n * [removable]=\"true\"\n * (remove)=\"handleRemove($event)\"\n * />\n * `\n * })\n * export class ChatComponent {\n * attachments: Attachment[] = [\n * { id: '1', name: 'report.pdf' },\n * { id: '2', name: 'image.png', previewTemplate: this.imagePreview }\n * ];\n *\n * handleRemove(attachment: Attachment) {\n * this.attachments = this.attachments.filter(a => a !== attachment);\n * }\n * }\n * ```\n *\n * @see {@link SiUserMessageComponent} for user message display\n * @see {@link SiAiMessageComponent} for AI message display\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\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 'element-document';\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-circle btn-sm 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=\"element-delete\" />\n </button>\n }\n </div>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2025\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 SiFileUploadDirective,\n UploadFile,\n FileUploadError\n} from '@siemens/element-ng/file-uploader';\nimport { 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 { SiAttachmentListComponent, Attachment } from './si-attachment-list.component';\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@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\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 'element-send-filled'\n */\n readonly sendButtonIcon = input('element-send-filled');\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() ? 'element-stop-filled' : this.sendButtonIcon()\n );\n protected readonly buttonLabel = computed(() =>\n this.showInterruptButton() ? this.interruptButtonLabel() : this.sendButtonLabel()\n );\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.showInterruptButton()) {\n this.onSend();\n }\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 attachment: ChatInputAttachment = {\n name: uploadFile.fileName,\n size: uploadFile.file.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 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 class=\"input-wrapper border rounded-3 bg-body\" (click)=\"onContainerClick($event)\">\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-circle btn-sm\"\n [attr.aria-label]=\"attachFileLabel() | translate\"\n [disabled]=\"disabled()\"\n (click)=\"fileInput.click()\"\n >\n <si-icon icon=\"element-attachment\" />\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-circle btn-sm\"\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-circle btn-sm\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon icon=\"element-optionsVertical\" />\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-circle btn-sm\"\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 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { Directive } from '@angular/core';\n\n/**\n * Directive to mark content as chat input disclaimer.\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@Directive({\n selector: '[siChatInputDisclaimer]'\n})\nexport class SiChatInputDisclaimerDirective {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport { Component, effect, input, viewChild, ElementRef, computed, signal } from '@angular/core';\nimport { 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 user input in conversational interfaces.\n *\n * The user message component renders user-submitted content in 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 *\n * @remarks\n * This component is designed for use in:\n * - AI chat interfaces where user input needs to be displayed\n * - Peer-to-peer conversation interfaces\n * - Conversation histories or chat transcripts\n *\n * The component automatically handles:\n * - Rendering markdown content with syntax highlighting\n * - Displaying attachments above the message bubble\n * - Showing primary and secondary actions on hover (desktop) or tap (mobile)\n * - Proper alignment and styling for user messages\n *\n * @example\n * Basic usage with content only:\n * ```html\n * <si-user-message [content]=\"'Hello, how can I help you?'\" />\n * ```\n *\n * @example\n * With actions and attachments:\n * ```typescript\n * import { Component } from '@angular/core';\n * import { SiUserMessageComponent } from '@siemens/element-ng/chat-messages';\n *\n * @Component({\n * selector: 'app-chat',\n * imports: [SiUserMessageComponent],\n * template: `\n * <si-user-message\n * [content]=\"message.text\"\n * [actions]=\"messageActions\"\n * [secondaryActions]=\"menuActions\"\n * [attachments]=\"message.attachments\"\n * [actionParam]=\"message\"\n * />\n * `\n * })\n * export class ChatComponent {\n * messageActions = [\n * { icon: 'copy', label: 'Copy', action: (id) => this.copyMessage(id) },\n * { icon: 'edit', label: 'Edit', action: (id) => this.editMessage(id) }\n * ];\n *\n * menuActions = [\n * { label: 'Delete', action: (id) => this.deleteMessage(id) }\n * ];\n * }\n * ```\n *\n * @see {@link SiChatMessageComponent} for the base message wrapper component\n * @see {@link SiAttachmentListComponent} for attachment handling\n * @see {@link SiMarkdownRendererComponent} for markdown rendering\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\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-circle btn-sm\"\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-circle btn-sm\"\n [cdkMenuTriggerFor]=\"secondaryActionsMenu\"\n [attr.aria-label]=\"secondaryActionsLabel() | translate\"\n [attr.title]=\"secondaryActionsLabel() | translate\"\n >\n <si-icon icon=\"element-optionsVertical\" />\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 - 2025\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-ai-message.component';\nexport * from './si-attachment-list.component';\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';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { Injectable, input, booleanAttribute, output, signal, computed, inject, ElementRef, Component, viewChild, ChangeDetectorRef, DOCUMENT, NgModule, model } from '@angular/core';
|
|
3
3
|
import { SiCardComponent } from '@siemens/element-ng/card';
|
|
4
4
|
import { SiContentActionBarComponent } from '@siemens/element-ng/content-action-bar';
|
|
5
|
+
import { addIcons, elementZoom, elementPinch, elementRight2, SiIconComponent, elementSortUp, elementSortDown, SiStatusIconComponent } from '@siemens/element-ng/icon';
|
|
5
6
|
import { t, SiTranslatePipe } from '@siemens/element-translate-ng/translate';
|
|
6
7
|
import { BehaviorSubject, Subject } from 'rxjs';
|
|
7
8
|
import * as i1 from '@angular/cdk/portal';
|
|
@@ -10,7 +11,6 @@ import { ViewportScroller, NgClass } from '@angular/common';
|
|
|
10
11
|
import { ScrollbarHelper } from '@siemens/element-ng/common';
|
|
11
12
|
import { ResizeObserverService, BOOTSTRAP_BREAKPOINTS } from '@siemens/element-ng/resize-observer';
|
|
12
13
|
import { takeUntil } from 'rxjs/operators';
|
|
13
|
-
import { addIcons, elementRight2, SiIconComponent, elementSortUp, elementSortDown, SiStatusIconComponent } from '@siemens/element-ng/icon';
|
|
14
14
|
import { SiLinkDirective } from '@siemens/element-ng/link';
|
|
15
15
|
import * as i1$1 from '@angular/forms';
|
|
16
16
|
import { FormsModule } from '@angular/forms';
|
|
@@ -145,7 +145,7 @@ class SiDashboardCardComponent extends SiCardComponent {
|
|
|
145
145
|
{
|
|
146
146
|
type: 'action',
|
|
147
147
|
label: this.isExpanded() ? this.restoreText() : this.expandText(),
|
|
148
|
-
icon: this.isExpanded() ?
|
|
148
|
+
icon: this.isExpanded() ? this.icons.elementPinch : this.icons.elementZoom,
|
|
149
149
|
iconOnly: true,
|
|
150
150
|
action: () => this.expandCard(!this.isExpanded())
|
|
151
151
|
}
|
|
@@ -173,6 +173,10 @@ class SiDashboardCardComponent extends SiCardComponent {
|
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
});
|
|
176
|
+
icons = addIcons({
|
|
177
|
+
elementPinch,
|
|
178
|
+
elementZoom
|
|
179
|
+
});
|
|
176
180
|
expandRestoreIconTooltip = computed(() => {
|
|
177
181
|
return this.isExpanded() ? this.restoreText() : this.expandText();
|
|
178
182
|
});
|
|
@@ -180,7 +184,7 @@ class SiDashboardCardComponent extends SiCardComponent {
|
|
|
180
184
|
return {
|
|
181
185
|
type: 'action',
|
|
182
186
|
label: this.expandText(),
|
|
183
|
-
icon:
|
|
187
|
+
icon: this.icons.elementZoom,
|
|
184
188
|
iconOnly: true,
|
|
185
189
|
action: () => this.expandCard(true)
|
|
186
190
|
};
|
|
@@ -189,7 +193,7 @@ class SiDashboardCardComponent extends SiCardComponent {
|
|
|
189
193
|
return {
|
|
190
194
|
type: 'action',
|
|
191
195
|
label: this.restoreText(),
|
|
192
|
-
icon:
|
|
196
|
+
icon: this.icons.elementPinch,
|
|
193
197
|
iconOnly: true,
|
|
194
198
|
action: () => this.expandCard(false)
|
|
195
199
|
};
|