@progress/kendo-angular-conversational-ui 22.1.0-develop.9 → 23.0.0-develop.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/ai-prompt/aiprompt.component.d.ts +3 -3
  2. package/ai-prompt/localization/custom-messages.component.d.ts +1 -1
  3. package/ai-prompt/models/command-execute-event.d.ts +1 -1
  4. package/ai-prompt/models/command.interface.d.ts +2 -2
  5. package/ai-prompt/models/output-rating-change-event.d.ts +1 -1
  6. package/ai-prompt/models/prompt-request-event.d.ts +1 -1
  7. package/chat/api/action.interface.d.ts +3 -3
  8. package/chat/api/attachment.interface.d.ts +1 -1
  9. package/chat/api/chat-file-interface.d.ts +9 -9
  10. package/chat/api/chat-suggestion.interface.d.ts +5 -5
  11. package/chat/api/file-action.d.ts +8 -8
  12. package/chat/api/message-action.d.ts +8 -8
  13. package/chat/api/message-box.d.ts +28 -0
  14. package/chat/api/message-settings.interface.d.ts +9 -9
  15. package/chat/api/message-status.interface.d.ts +19 -0
  16. package/chat/api/message.interface.d.ts +7 -2
  17. package/chat/api/post-message-event.d.ts +10 -1
  18. package/chat/api/send-button-settings.d.ts +11 -2
  19. package/chat/api/user.interface.d.ts +2 -2
  20. package/chat/cards/hero-card.component.d.ts +5 -5
  21. package/chat/chat.component.d.ts +45 -14
  22. package/chat/common/chat.service.d.ts +14 -8
  23. package/chat/common/models/model-fields.d.ts +7 -1
  24. package/chat/common/scroll-anchor.directive.d.ts +10 -2
  25. package/chat/common/utils.d.ts +4 -2
  26. package/chat/l10n/custom-messages.component.d.ts +1 -1
  27. package/chat/l10n/messages.d.ts +15 -3
  28. package/chat/message-box.component.d.ts +16 -16
  29. package/chat/message.component.d.ts +7 -0
  30. package/chat/suggested-actions.component.d.ts +8 -1
  31. package/chat/templates/attachment-template.directive.d.ts +1 -1
  32. package/chat/templates/author-message-content-template.directive.d.ts +1 -1
  33. package/chat/templates/author-message-template.directive.d.ts +1 -1
  34. package/chat/templates/message-box.directive.d.ts +1 -1
  35. package/chat/templates/message-content-template.directive.d.ts +1 -1
  36. package/chat/templates/message-template.directive.d.ts +1 -1
  37. package/chat/templates/no-data-template.directive.d.ts +1 -1
  38. package/chat/templates/receiver-message-content-template.directive.d.ts +1 -1
  39. package/chat/templates/receiver-message-template.directive.d.ts +1 -1
  40. package/chat/templates/timestamp-template.directive.d.ts +1 -1
  41. package/chat/templates/user-status-template.directive.d.ts +1 -1
  42. package/conversational-ui.module.d.ts +10 -1
  43. package/directives.d.ts +28 -1
  44. package/fesm2022/progress-kendo-angular-conversational-ui.mjs +3938 -1389
  45. package/index.d.ts +11 -1
  46. package/inline-ai-prompt/localization/custom-messages.component.d.ts +1 -1
  47. package/inline-ai-prompt/models/command.interface.d.ts +2 -2
  48. package/package-metadata.mjs +2 -2
  49. package/package.json +14 -14
  50. package/promptbox/affixes/promptbox-end-affix.component.d.ts +26 -0
  51. package/promptbox/affixes/promptbox-start-affix.component.d.ts +26 -0
  52. package/promptbox/affixes/promptbox-top-affix.component.d.ts +26 -0
  53. package/promptbox/common/header-template.directive.d.ts +17 -0
  54. package/promptbox/common/models/action-button.d.ts +62 -0
  55. package/promptbox/common/models/fileselect-button.d.ts +62 -0
  56. package/{chat/common/models/message-box-options.d.ts → promptbox/common/models/index.d.ts} +3 -5
  57. package/promptbox/common/models/promptbox-mode.d.ts +12 -0
  58. package/promptbox/common/utils.d.ts +18 -0
  59. package/promptbox/localization/custom-messages.component.d.ts +26 -0
  60. package/promptbox/localization/localized-messages.directive.d.ts +16 -0
  61. package/promptbox/localization/messages.d.ts +37 -0
  62. package/promptbox/promptbox.component.d.ts +383 -0
  63. package/promptbox/tools/action-button.component.d.ts +63 -0
  64. package/promptbox/tools/base-tool.d.ts +62 -0
  65. package/promptbox/tools/fileselect-button.component.d.ts +63 -0
  66. package/promptbox/tools/promptbox-file.component.d.ts +30 -0
  67. package/promptbox/tools/speech-to-text-button.component.d.ts +87 -0
@@ -5,8 +5,8 @@
5
5
  import { AfterViewInit, ElementRef, EventEmitter, OnDestroy, NgZone, Renderer2, SimpleChanges, OnInit, ViewContainerRef } from '@angular/core';
6
6
  import { AttachmentTemplateDirective } from './templates/attachment-template.directive';
7
7
  import { LocalizationService } from '@progress/kendo-angular-l10n';
8
- import { ExecuteActionEvent, FileAction, Message, SendMessageEvent, FileActionEvent, FileDownloadEvent, SendButtonSettings, FilesLayoutMode, MessageSettings } from './api';
9
- import { MessageBoxType } from './common/models/message-box-options';
8
+ import { ExecuteActionEvent, FileAction, Message, ResendMessageEvent, SendMessageEvent, FileActionEvent, FileDownloadEvent, SendButtonSettings, FilesLayoutMode, MessageSettings } from './api';
9
+ import { MessageBoxSettings, MessageBoxType } from './api/message-box';
10
10
  import { ChatMessageBoxTemplateDirective } from './templates/message-box.directive';
11
11
  import { MessageBoxComponent } from './message-box.component';
12
12
  import { MessageWidthMode } from './api/message-width-mode';
@@ -15,7 +15,9 @@ import { ChatHeaderTemplateDirective } from './templates/header-template.directi
15
15
  import { SpeechToTextButtonSettings } from '@progress/kendo-angular-buttons';
16
16
  import { MessageAction, MessageActionEvent } from './api/message-action';
17
17
  import { ChatSuggestion } from './api/chat-suggestion.interface';
18
- import { SelectEvent, FileSelectSettings } from '@progress/kendo-angular-upload';
18
+ import { SVGIcon } from '@progress/kendo-svg-icons';
19
+ import { SelectEvent } from '@progress/kendo-angular-upload';
20
+ import { FileSelectButtonSettings } from '../promptbox/common/models';
19
21
  import { ChatFile } from './api/chat-file-interface';
20
22
  import { ConversationalUIModelFields } from './common/models/model-fields';
21
23
  import { ChatTimestampTemplateDirective } from './templates/timestamp-template.directive';
@@ -28,7 +30,7 @@ import { QuickActionsLayoutMode, SuggestionsLayoutMode } from './api/suggestions
28
30
  import { TimestampVisibilityMode } from './api/timestamp-visibility';
29
31
  import * as i0 from "@angular/core";
30
32
  /**
31
- * Represents the [Kendo UI Chat component for Angular](slug:overview_convui).
33
+ * Represents the [Kendo UI Chat component for Angular](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat).
32
34
  *
33
35
  * Provides a conversational UI for chat-based applications.
34
36
  * Supports message templates, attachments, localization, and user actions.
@@ -55,7 +57,7 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
55
57
  /**
56
58
  * Sets the Chat messages.
57
59
  * Accepts an array of `Message` objects, but can also accept custom data types.
58
- * For more information, check [Data Binding](slug:databinding_chat) section in the documentation.
60
+ * For more information, check [Data Binding](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/data-binding) section in the documentation.
59
61
  */
60
62
  messages: any[];
61
63
  /**
@@ -64,7 +66,7 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
64
66
  authorId: string | number;
65
67
  /**
66
68
  * Determines the type of input used in the message box.
67
- * ([see example](slug:message_chat)).
69
+ * ([see example](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/message)).
68
70
  * @default 'textarea'
69
71
  *
70
72
  * @hidden
@@ -123,13 +125,17 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
123
125
  *
124
126
  * @default true
125
127
  */
126
- enableSpeechToText: boolean | SpeechToTextButtonSettings;
128
+ speechToTextButton: boolean | SpeechToTextButtonSettings;
127
129
  /**
128
- * Sets the File Select settings.
130
+ * Sets the File Select Button settings.
129
131
  *
130
132
  * @default true
131
133
  */
132
- enableFileSelect: boolean | FileSelectSettings;
134
+ fileSelectButton: boolean | FileSelectButtonSettings;
135
+ /**
136
+ * Sets the message box settings.
137
+ */
138
+ messageBoxSettings: MessageBoxSettings;
133
139
  /**
134
140
  * Sets the actions of the message toolbar.
135
141
  * These actions display in the message toolbar and let you perform specific operations on the message.
@@ -208,7 +214,7 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
208
214
  * Sets the send button settings for the Chat component.
209
215
  * Allows customization of the send button appearance, icons and disabled state.
210
216
  *
211
- * @default { fillMode: 'solid', rounded: 'full', size: 'medium', themeColor: 'primary', icon: 'paper-plane', svgIcon: paperPlaneIcon}
217
+ * @default { rounded: 'full', size: 'small', icon: 'arrow-up-outline', svgIcon: arrowUpOutlineIcon }
212
218
  */
213
219
  sendButtonSettings: SendButtonSettings;
214
220
  /**
@@ -217,12 +223,29 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
217
223
  */
218
224
  set modelFields(value: ConversationalUIModelFields);
219
225
  get modelFields(): ConversationalUIModelFields;
226
+ /**
227
+ * Controls whether a scroll to bottom button is rendered at the bottom of the Chat. Displayed only when the user has scrolled the component upward.
228
+ *
229
+ * @default true
230
+ */
231
+ scrollToBottomButton: boolean;
232
+ /**
233
+ * Sets the loading state of the Chat component.
234
+ * When set to `true`, a loading button is displayed instead of the send button.
235
+ *
236
+ * @default false
237
+ */
238
+ loading: boolean;
220
239
  /**
221
240
  * Fires when the user sends a message by clicking the **Send** button or pressing **Enter**.
222
241
  *
223
242
  * The message is not automatically added to the `messages` array.
224
243
  */
225
244
  sendMessage: EventEmitter<SendMessageEvent>;
245
+ /**
246
+ * Fires when the user clicks the resend button on a failed message.
247
+ */
248
+ resendMessage: EventEmitter<ResendMessageEvent>;
226
249
  /**
227
250
  * Fires when the user clicks a quick action button in the message toolbar.
228
251
  */
@@ -241,7 +264,7 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
241
264
  download: EventEmitter<FileDownloadEvent>;
242
265
  /**
243
266
  * Fires when the user clicks a quick action button.
244
- * The Chat internally handles [known actions](slug:api_conversational-ui_actiontype) such as `reply`, `openUrl`, and `call`.
267
+ * The Chat internally handles [known actions](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/api/actiontype) such as `reply`, `openUrl`, and `call`.
245
268
  *
246
269
  * The event is preventable. Calling [`preventDefault`](https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault) suppresses the built-in action.
247
270
  */
@@ -294,6 +317,10 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
294
317
  * Returns processed messages when model fields are used, otherwise returns original messages.
295
318
  */
296
319
  get processedMessages(): Message[];
320
+ /**
321
+ * @hidden
322
+ */
323
+ isOwnMessage(message: Message): boolean;
297
324
  /**
298
325
  * Gets the actions available in the message context menu.
299
326
  *
@@ -311,15 +338,19 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
311
338
  /**
312
339
  * @hidden
313
340
  */
314
- pinIcon: import("@progress/kendo-svg-icons").SVGIcon;
341
+ pinIcon: SVGIcon;
315
342
  /**
316
343
  * @hidden
317
344
  */
318
- deleteIcon: import("@progress/kendo-svg-icons").SVGIcon;
345
+ deleteIcon: SVGIcon;
319
346
  /**
320
347
  * @hidden
321
348
  */
322
349
  pinnedMessage: Message;
350
+ /**
351
+ * @hidden
352
+ */
353
+ scrollToBottomIcon: SVGIcon;
323
354
  private direction;
324
355
  private subs;
325
356
  private _modelFields;
@@ -375,5 +406,5 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
375
406
  private updateChatServiceProperties;
376
407
  private mergeWithDefaultActions;
377
408
  static ɵfac: i0.ɵɵFactoryDeclaration<ChatComponent, never>;
378
- static ɵcmp: i0.ɵɵComponentDeclaration<ChatComponent, "kendo-chat", never, { "messages": { "alias": "messages"; "required": false; }; "authorId": { "alias": "authorId"; "required": false; }; "messageBoxType": { "alias": "messageBoxType"; "required": false; }; "height": { "alias": "height"; "required": false; }; "width": { "alias": "width"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "messageWidthMode": { "alias": "messageWidthMode"; "required": false; }; "timestampVisibility": { "alias": "timestampVisibility"; "required": false; }; "showUsername": { "alias": "showUsername"; "required": false; }; "showAvatar": { "alias": "showAvatar"; "required": false; }; "allowMessageCollapse": { "alias": "allowMessageCollapse"; "required": false; }; "enableSpeechToText": { "alias": "enableSpeechToText"; "required": false; }; "enableFileSelect": { "alias": "enableFileSelect"; "required": false; }; "messageToolbarActions": { "alias": "messageToolbarActions"; "required": false; }; "inputValue": { "alias": "inputValue"; "required": false; }; "authorMessageSettings": { "alias": "authorMessageSettings"; "required": false; }; "receiverMessageSettings": { "alias": "receiverMessageSettings"; "required": false; }; "messageContextMenuActions": { "alias": "messageContextMenuActions"; "required": false; }; "fileActions": { "alias": "fileActions"; "required": false; }; "messageFilesLayout": { "alias": "messageFilesLayout"; "required": false; }; "suggestionsLayout": { "alias": "suggestionsLayout"; "required": false; }; "quickActionsLayout": { "alias": "quickActionsLayout"; "required": false; }; "suggestions": { "alias": "suggestions"; "required": false; }; "sendButtonSettings": { "alias": "sendButtonSettings"; "required": false; }; "modelFields": { "alias": "modelFields"; "required": false; }; }, { "sendMessage": "sendMessage"; "toolbarActionClick": "toolbarActionClick"; "contextMenuActionClick": "contextMenuActionClick"; "fileActionClick": "fileActionClick"; "download": "download"; "executeAction": "executeAction"; "suggestionExecute": "suggestionExecute"; "fileSelect": "fileSelect"; "fileRemove": "fileRemove"; "unpin": "unpin"; "inputValueChange": "inputValueChange"; }, ["attachmentTemplate", "chatHeaderTemplate", "chatNoDataTemplate", "authorMessageContentTemplate", "receiverMessageContentTemplate", "messageContentTemplate", "authorMessageTemplate", "receiverMessageTemplate", "messageTemplate", "timestampTemplate", "suggestionTemplate", "statusTemplate", "messageBoxTemplate", "userStatusTemplate"], never, true, never>;
409
+ static ɵcmp: i0.ɵɵComponentDeclaration<ChatComponent, "kendo-chat", never, { "messages": { "alias": "messages"; "required": false; }; "authorId": { "alias": "authorId"; "required": false; }; "messageBoxType": { "alias": "messageBoxType"; "required": false; }; "height": { "alias": "height"; "required": false; }; "width": { "alias": "width"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "messageWidthMode": { "alias": "messageWidthMode"; "required": false; }; "timestampVisibility": { "alias": "timestampVisibility"; "required": false; }; "showUsername": { "alias": "showUsername"; "required": false; }; "showAvatar": { "alias": "showAvatar"; "required": false; }; "allowMessageCollapse": { "alias": "allowMessageCollapse"; "required": false; }; "speechToTextButton": { "alias": "speechToTextButton"; "required": false; }; "fileSelectButton": { "alias": "fileSelectButton"; "required": false; }; "messageBoxSettings": { "alias": "messageBoxSettings"; "required": false; }; "messageToolbarActions": { "alias": "messageToolbarActions"; "required": false; }; "inputValue": { "alias": "inputValue"; "required": false; }; "authorMessageSettings": { "alias": "authorMessageSettings"; "required": false; }; "receiverMessageSettings": { "alias": "receiverMessageSettings"; "required": false; }; "messageContextMenuActions": { "alias": "messageContextMenuActions"; "required": false; }; "fileActions": { "alias": "fileActions"; "required": false; }; "messageFilesLayout": { "alias": "messageFilesLayout"; "required": false; }; "suggestionsLayout": { "alias": "suggestionsLayout"; "required": false; }; "quickActionsLayout": { "alias": "quickActionsLayout"; "required": false; }; "suggestions": { "alias": "suggestions"; "required": false; }; "sendButtonSettings": { "alias": "sendButtonSettings"; "required": false; }; "modelFields": { "alias": "modelFields"; "required": false; }; "scrollToBottomButton": { "alias": "scrollToBottomButton"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; }, { "sendMessage": "sendMessage"; "resendMessage": "resendMessage"; "toolbarActionClick": "toolbarActionClick"; "contextMenuActionClick": "contextMenuActionClick"; "fileActionClick": "fileActionClick"; "download": "download"; "executeAction": "executeAction"; "suggestionExecute": "suggestionExecute"; "fileSelect": "fileSelect"; "fileRemove": "fileRemove"; "unpin": "unpin"; "inputValueChange": "inputValueChange"; }, ["attachmentTemplate", "chatHeaderTemplate", "chatNoDataTemplate", "authorMessageContentTemplate", "receiverMessageContentTemplate", "messageContentTemplate", "authorMessageTemplate", "receiverMessageTemplate", "messageTemplate", "timestampTemplate", "suggestionTemplate", "statusTemplate", "messageBoxTemplate", "userStatusTemplate"], never, true, never>;
379
410
  }
@@ -5,8 +5,9 @@
5
5
  import { ViewContainerRef, ElementRef } from '@angular/core';
6
6
  import { SpeechToTextButtonSettings } from '@progress/kendo-angular-buttons';
7
7
  import { MessageWidthMode } from '../api/message-width-mode';
8
- import { FileAction, FileActionEvent, FileDownloadEvent, FilesLayoutMode, Message, MessageAction, MessageActionEvent, MessageSettings, QuickActionsLayoutMode, SendButtonSettings, SuggestionsLayoutMode } from '../api';
9
- import { FileSelectSettings } from '@progress/kendo-angular-upload';
8
+ import { FileAction, FileActionEvent, FileDownloadEvent, FilesLayoutMode, Message, MessageAction, MessageActionEvent, MessageSettings, QuickActionsLayoutMode, ResendMessageEvent, SendButtonSettings, SuggestionsLayoutMode } from '../api';
9
+ import { FileSelectButtonSettings } from '../../promptbox/common/models';
10
+ import { MessageBoxSettings } from '../api/message-box';
10
11
  import { ContextMenuComponent } from '@progress/kendo-angular-menu';
11
12
  import { TimestampVisibilityMode } from '../api/timestamp-visibility';
12
13
  import * as i0 from "@angular/core";
@@ -34,9 +35,10 @@ export declare class ChatService {
34
35
  timestampVisibility: TimestampVisibilityMode;
35
36
  showUsername: boolean;
36
37
  showAvatar: boolean;
37
- private _enableSpeechToText;
38
- private _enableFileSelect;
38
+ private _speechToTextButton;
39
+ private _fileSelectButton;
39
40
  private _sendButtonSettings;
41
+ private _messageBoxSettings;
40
42
  private _suggestionsLayout;
41
43
  private _quickActionsLayout;
42
44
  _authorMessageSettings: MessageSettings;
@@ -47,6 +49,7 @@ export declare class ChatService {
47
49
  contextMenuAction$: import("rxjs").Observable<MessageActionEvent>;
48
50
  fileAction$: import("rxjs").Observable<FileActionEvent>;
49
51
  fileDownload$: import("rxjs").Observable<FileDownloadEvent>;
52
+ resendMessage$: import("rxjs").Observable<ResendMessageEvent>;
50
53
  replyReferenceClick$: import("rxjs").Observable<string | number>;
51
54
  inputValueChange$: import("rxjs").Observable<string>;
52
55
  contextMenuVisibilityChange$: import("rxjs").Observable<boolean>;
@@ -59,12 +62,14 @@ export declare class ChatService {
59
62
  get authorMessageSettings(): MessageSettings;
60
63
  set receiverMessageSettings(settings: MessageSettings);
61
64
  get receiverMessageSettings(): MessageSettings;
62
- set enableSpeechToText(settings: boolean | SpeechToTextButtonSettings);
63
- get enableSpeechToText(): SpeechToTextButtonSettings;
64
- set enableFileSelect(settings: boolean | FileSelectSettings);
65
- get enableFileSelect(): FileSelectSettings;
65
+ set speechToTextButton(settings: boolean | SpeechToTextButtonSettings);
66
+ get speechToTextButton(): SpeechToTextButtonSettings;
67
+ set fileSelectButton(settings: boolean | FileSelectButtonSettings);
68
+ get fileSelectButton(): FileSelectButtonSettings;
66
69
  set sendButtonSettings(settings: boolean | SendButtonSettings);
67
70
  get sendButtonSettings(): SendButtonSettings;
71
+ set messageBoxSettings(settings: MessageBoxSettings);
72
+ get messageBoxSettings(): MessageBoxSettings;
68
73
  set suggestionsLayout(layoutMode: SuggestionsLayoutMode);
69
74
  get suggestionsLayout(): SuggestionsLayoutMode;
70
75
  set quickActionsLayout(layoutMode: QuickActionsLayoutMode);
@@ -78,6 +83,7 @@ export declare class ChatService {
78
83
  unregisterMessageElement(messageId: string | number): void;
79
84
  scrollToMessage(messageId: string | number): void;
80
85
  focusActiveMessageElement(): void;
86
+ isOwnMessage(message: Message): boolean;
81
87
  private updateComponentSettings;
82
88
  static ɵfac: i0.ɵɵFactoryDeclaration<ChatService, never>;
83
89
  static ɵprov: i0.ɵɵInjectableDeclaration<ChatService>;
@@ -49,7 +49,7 @@ export interface ConversationalUIModelFields {
49
49
  */
50
50
  timestampField?: string;
51
51
  /**
52
- * Field name for message status.
52
+ * Field name for message status. Use this when status is a string or an object.
53
53
  *
54
54
  * @default "status"
55
55
  */
@@ -102,4 +102,10 @@ export interface ConversationalUIModelFields {
102
102
  * @default "typing"
103
103
  */
104
104
  typingField?: string;
105
+ /**
106
+ * Field name for the failed status.
107
+ *
108
+ * @default "failed"
109
+ */
110
+ failedField?: string;
105
111
  }
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { AfterViewInit, ElementRef, EventEmitter, NgZone, OnDestroy, OnInit, Renderer2 } from '@angular/core';
5
+ import { AfterViewInit, ChangeDetectorRef, ElementRef, EventEmitter, NgZone, OnDestroy, OnInit, Renderer2 } from '@angular/core';
6
6
  import * as i0 from "@angular/core";
7
7
  /**
8
8
  * @hidden
@@ -11,17 +11,25 @@ export declare class ScrollAnchorDirective implements AfterViewInit, OnInit, OnD
11
11
  private element;
12
12
  private zone;
13
13
  private renderer;
14
+ private cdr;
14
15
  autoScroll: boolean;
15
16
  autoScrollChange: EventEmitter<boolean>;
16
17
  overflowAnchor: string;
18
+ showScrollToBottomButton: boolean;
19
+ showMessageBoxSeparator: boolean;
17
20
  private scrolling;
18
21
  private unsubscribe;
19
- constructor(element: ElementRef, zone: NgZone, renderer: Renderer2);
22
+ private scrollUpdate;
23
+ constructor(element: ElementRef, zone: NgZone, renderer: Renderer2, cdr: ChangeDetectorRef);
20
24
  ngOnInit(): void;
21
25
  ngAfterViewInit(): void;
22
26
  ngOnDestroy(): void;
23
27
  onScroll(): void;
28
+ autoScrollToBottom(): void;
24
29
  scrollToBottom(): void;
30
+ calculateMessageBoxSeparator(): void;
31
+ private setupScrollUpdate;
32
+ private performScroll;
25
33
  static ɵfac: i0.ɵɵFactoryDeclaration<ScrollAnchorDirective, never>;
26
34
  static ɵdir: i0.ɵɵDirectiveDeclaration<ScrollAnchorDirective, "[kendoChatScrollAnchor]", ["scrollAnchor"], { "autoScroll": { "alias": "autoScroll"; "required": false; }; }, { "autoScrollChange": "autoScrollChange"; }, never, never, true, never>;
27
35
  }
@@ -4,8 +4,9 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Message, SendButtonSettings, MessageAction, FileAction, SuggestionsLayoutMode } from "../api";
6
6
  import { ConversationalUIModelFields } from "./models/model-fields";
7
- import { FileSelectSettings } from '@progress/kendo-angular-upload';
7
+ import { FileSelectButtonSettings } from '../../promptbox/common/models';
8
8
  import { SpeechToTextButtonSettings } from "@progress/kendo-angular-buttons";
9
+ import { MessageBoxSettings } from "../api/message-box";
9
10
  /**
10
11
  * @hidden
11
12
  */
@@ -39,7 +40,7 @@ export declare const SEND_BTN_DEFAULT_SETTINGS: SendButtonSettings;
39
40
  /**
40
41
  * @hidden
41
42
  */
42
- export declare const FILESELECT_DEFAULT_SETTINGS: FileSelectSettings;
43
+ export declare const FILESELECT_BUTTON_DEFAULT_SETTINGS: FileSelectButtonSettings;
43
44
  /**
44
45
  * @hidden
45
46
  */
@@ -56,6 +57,7 @@ export declare const CONTEXT_MENU_ACTIONS: MessageAction[];
56
57
  * @hidden
57
58
  */
58
59
  export declare const FILE_ACTIONS: FileAction[];
60
+ export declare const MESSAGE_BOX_SETTINGS: MessageBoxSettings;
59
61
  /**
60
62
  * @hidden
61
63
  */
@@ -9,7 +9,7 @@ import * as i0 from "@angular/core";
9
9
  * Represents the custom messages component of the Chat.
10
10
  *
11
11
  * Use this component to override default messages for the Chat
12
- * ([see example](slug:globalization_chat#custom-messages)).
12
+ * ([see example](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/globalization#custom-messages)).
13
13
  *
14
14
  * @example
15
15
  * ```html
@@ -16,6 +16,10 @@ export declare class Messages extends ComponentMessages {
16
16
  * Sets the text that displays when the receiver deletes a message.
17
17
  */
18
18
  deletedMessageReceiverText: string;
19
+ /**
20
+ * Sets the text that displays when a message fails to send.
21
+ */
22
+ messageFailedText: string;
19
23
  /**
20
24
  * Sets the text that displays in the download section of the message.
21
25
  * This message displays below all files in the message.
@@ -26,9 +30,13 @@ export declare class Messages extends ComponentMessages {
26
30
  */
27
31
  messagePlaceholder: string;
28
32
  /**
29
- * Sets the text for the **Send** button.
33
+ * Sets the aria-label for the internal input/textarea element.
34
+ */
35
+ messageBoxTitle: string;
36
+ /**
37
+ * Sets the text for the **Action** button.
30
38
  */
31
- send: string;
39
+ actionButtonTitle: string;
32
40
  /**
33
41
  * Sets the label for the message list.
34
42
  */
@@ -81,6 +89,10 @@ export declare class Messages extends ComponentMessages {
81
89
  * Sets the title of the button that shows the **Scroll left** when the suggestions list is scrollable with buttons.
82
90
  */
83
91
  previousSuggestionsButtonTitle: string;
92
+ /**
93
+ * Sets the title of the button that unpins a pinned message.
94
+ */
95
+ unpinMessageTitle: string;
84
96
  static ɵfac: i0.ɵɵFactoryDeclaration<Messages, never>;
85
- static ɵdir: i0.ɵɵDirectiveDeclaration<Messages, "kendoConversationalUIMessages", never, { "deletedMessageSenderText": { "alias": "deletedMessageSenderText"; "required": false; }; "deletedMessageReceiverText": { "alias": "deletedMessageReceiverText"; "required": false; }; "downloadAllFilesText": { "alias": "downloadAllFilesText"; "required": false; }; "messagePlaceholder": { "alias": "messagePlaceholder"; "required": false; }; "send": { "alias": "send"; "required": false; }; "messageListLabel": { "alias": "messageListLabel"; "required": false; }; "messageBoxInputLabel": { "alias": "messageBoxInputLabel"; "required": false; }; "messageAttachmentLeftArrow": { "alias": "messageAttachmentLeftArrow"; "required": false; }; "messageAttachmentRightArrow": { "alias": "messageAttachmentRightArrow"; "required": false; }; "speechToTextButtonTitle": { "alias": "speechToTextButtonTitle"; "required": false; }; "fileSelectButtonTitle": { "alias": "fileSelectButtonTitle"; "required": false; }; "removeReplyTitle": { "alias": "removeReplyTitle"; "required": false; }; "removeFileTitle": { "alias": "removeFileTitle"; "required": false; }; "expandTitle": { "alias": "expandTitle"; "required": false; }; "collapseTitle": { "alias": "collapseTitle"; "required": false; }; "fileActionsTitle": { "alias": "fileActionsTitle"; "required": false; }; "nextSuggestionsButtonTitle": { "alias": "nextSuggestionsButtonTitle"; "required": false; }; "previousSuggestionsButtonTitle": { "alias": "previousSuggestionsButtonTitle"; "required": false; }; }, {}, never, never, true, never>;
97
+ static ɵdir: i0.ɵɵDirectiveDeclaration<Messages, "kendoConversationalUIMessages", never, { "deletedMessageSenderText": { "alias": "deletedMessageSenderText"; "required": false; }; "deletedMessageReceiverText": { "alias": "deletedMessageReceiverText"; "required": false; }; "messageFailedText": { "alias": "messageFailedText"; "required": false; }; "downloadAllFilesText": { "alias": "downloadAllFilesText"; "required": false; }; "messagePlaceholder": { "alias": "messagePlaceholder"; "required": false; }; "messageBoxTitle": { "alias": "messageBoxTitle"; "required": false; }; "actionButtonTitle": { "alias": "actionButtonTitle"; "required": false; }; "messageListLabel": { "alias": "messageListLabel"; "required": false; }; "messageBoxInputLabel": { "alias": "messageBoxInputLabel"; "required": false; }; "messageAttachmentLeftArrow": { "alias": "messageAttachmentLeftArrow"; "required": false; }; "messageAttachmentRightArrow": { "alias": "messageAttachmentRightArrow"; "required": false; }; "speechToTextButtonTitle": { "alias": "speechToTextButtonTitle"; "required": false; }; "fileSelectButtonTitle": { "alias": "fileSelectButtonTitle"; "required": false; }; "removeReplyTitle": { "alias": "removeReplyTitle"; "required": false; }; "removeFileTitle": { "alias": "removeFileTitle"; "required": false; }; "expandTitle": { "alias": "expandTitle"; "required": false; }; "collapseTitle": { "alias": "collapseTitle"; "required": false; }; "fileActionsTitle": { "alias": "fileActionsTitle"; "required": false; }; "nextSuggestionsButtonTitle": { "alias": "nextSuggestionsButtonTitle"; "required": false; }; "previousSuggestionsButtonTitle": { "alias": "previousSuggestionsButtonTitle"; "required": false; }; "unpinMessageTitle": { "alias": "unpinMessageTitle"; "required": false; }; }, {}, never, never, true, never>;
86
98
  }
@@ -7,14 +7,16 @@ import { LocalizationService } from '@progress/kendo-angular-l10n';
7
7
  import { SVGIcon } from '@progress/kendo-svg-icons';
8
8
  import { SpeechToTextButtonSettings } from '@progress/kendo-angular-buttons';
9
9
  import { ChatMessageBoxTemplateDirective } from './templates/message-box.directive';
10
- import { TextAreaComponent } from '@progress/kendo-angular-inputs';
11
- import { FileSelectComponent, SelectEvent, FileSelectSettings } from '@progress/kendo-angular-upload';
10
+ import { SelectEvent } from '@progress/kendo-angular-upload';
11
+ import { FileSelectButtonSettings } from '../promptbox/common/models';
12
12
  import { ChatFile } from './api/chat-file-interface';
13
13
  import { ChatService } from './common/chat.service';
14
- import { SuggestedActionsComponent } from "./suggested-actions.component";
14
+ import { MessageBoxSettings } from './api/message-box';
15
+ import { SuggestedActionsComponent } from './suggested-actions.component';
15
16
  import { ChatSuggestion, Message, SendButtonSettings } from './api';
16
17
  import { ChatItem } from './chat-item';
17
18
  import { ChatSuggestionTemplateDirective } from './templates/suggestion-template.directive';
19
+ import { PromptBoxComponent } from '../promptbox/promptbox.component';
18
20
  import * as i0 from "@angular/core";
19
21
  /**
20
22
  * @hidden
@@ -26,8 +28,7 @@ export declare class MessageBoxComponent implements OnInit, OnDestroy {
26
28
  private renderer;
27
29
  borderColor: string;
28
30
  messageBoxWrapperClass: boolean;
29
- messageBoxInput: TextAreaComponent;
30
- fileSelectComponent: FileSelectComponent;
31
+ messageBoxInput: PromptBoxComponent;
31
32
  suggestedActionsComponent: SuggestedActionsComponent;
32
33
  authorId: string | number;
33
34
  autoScroll: boolean;
@@ -37,15 +38,12 @@ export declare class MessageBoxComponent implements OnInit, OnDestroy {
37
38
  localization: LocalizationService;
38
39
  messageBoxTemplate: ChatMessageBoxTemplateDirective;
39
40
  suggestionTemplate: ChatSuggestionTemplateDirective;
41
+ loading: boolean;
40
42
  sendMessage: EventEmitter<any>;
41
43
  executeSuggestion: EventEmitter<ChatSuggestion>;
42
44
  fileSelect: EventEmitter<SelectEvent>;
43
45
  fileRemove: EventEmitter<ChatFile>;
44
- files: ChatFile[];
45
- sendIcon: SVGIcon;
46
- attachmentIcon: SVGIcon;
47
46
  deleteIcon: SVGIcon;
48
- fileIcon: SVGIcon;
49
47
  isListening: boolean;
50
48
  get reply(): Message;
51
49
  private selectedItem;
@@ -54,23 +52,25 @@ export declare class MessageBoxComponent implements OnInit, OnDestroy {
54
52
  ngOnInit(): void;
55
53
  ngOnDestroy(): void;
56
54
  sendClick(): void;
57
- inputKeydown(e: any): void;
58
- textAreaKeydown(e: any): void;
59
55
  handleSpeechResult(event: any): void;
60
56
  textFor(key: string): string;
61
57
  removeReply(): void;
62
58
  onReplyReferenceClick(event: Event): void;
63
59
  handleFileSelect(event: SelectEvent): void;
64
- selectFiles(): void;
65
- removeFile(index: number): void;
60
+ handleFileRemove(file: any): void;
61
+ handlePromptAction(): void;
62
+ onSpeechToTextStart(): void;
63
+ onSpeechToTextEnd(): void;
66
64
  get speechToTextButtonSettings(): SpeechToTextButtonSettings;
67
65
  get sendButtonSettings(): SendButtonSettings;
68
- get enableFileSelect(): boolean | FileSelectSettings;
69
- get isDisabledSendButton(): boolean;
66
+ get fileSelectButton(): boolean | FileSelectButtonSettings;
67
+ get messageBoxSettings(): MessageBoxSettings;
68
+ get fileSelectButtonSettings(): FileSelectButtonSettings;
69
+ get isActionButtonDisabled(): boolean;
70
70
  select(item: ChatItem, event?: Event): void;
71
71
  onBlur(args: any): void;
72
72
  onInputValueChange(value: string): void;
73
73
  dispatchSuggestion(suggestion: ChatSuggestion): void;
74
74
  static ɵfac: i0.ɵɵFactoryDeclaration<MessageBoxComponent, never>;
75
- static ɵcmp: i0.ɵɵComponentDeclaration<MessageBoxComponent, "kendo-message-box", never, { "authorId": { "alias": "authorId"; "required": false; }; "autoScroll": { "alias": "autoScroll"; "required": false; }; "suggestions": { "alias": "suggestions"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "inputValue": { "alias": "inputValue"; "required": false; }; "localization": { "alias": "localization"; "required": false; }; "messageBoxTemplate": { "alias": "messageBoxTemplate"; "required": false; }; "suggestionTemplate": { "alias": "suggestionTemplate"; "required": false; }; }, { "sendMessage": "sendMessage"; "executeSuggestion": "executeSuggestion"; "fileSelect": "fileSelect"; "fileRemove": "fileRemove"; }, never, never, true, never>;
75
+ static ɵcmp: i0.ɵɵComponentDeclaration<MessageBoxComponent, "kendo-message-box", never, { "authorId": { "alias": "authorId"; "required": false; }; "autoScroll": { "alias": "autoScroll"; "required": false; }; "suggestions": { "alias": "suggestions"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "inputValue": { "alias": "inputValue"; "required": false; }; "localization": { "alias": "localization"; "required": false; }; "messageBoxTemplate": { "alias": "messageBoxTemplate"; "required": false; }; "suggestionTemplate": { "alias": "suggestionTemplate"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; }, { "sendMessage": "sendMessage"; "executeSuggestion": "executeSuggestion"; "fileSelect": "fileSelect"; "fileRemove": "fileRemove"; }, never, never, true, never>;
76
76
  }
@@ -4,6 +4,7 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { ChangeDetectorRef, ElementRef, OnDestroy, OnInit } from '@angular/core';
6
6
  import { Message } from './api/message.interface';
7
+ import { MessageStatus } from './api/message-status.interface';
7
8
  import { ChatItem } from './chat-item';
8
9
  import { MessageContentTemplateDirective } from './templates/message-content-template.directive';
9
10
  import { IntlService } from '@progress/kendo-angular-intl';
@@ -43,6 +44,7 @@ export declare class MessageComponent extends ChatItem implements OnInit, OnDest
43
44
  showMessageTime: boolean;
44
45
  authorId: string | number;
45
46
  cssClass: boolean;
47
+ get failedClass(): boolean;
46
48
  get removedClass(): boolean;
47
49
  onKeyDown(event: KeyboardEvent): void;
48
50
  selected: boolean;
@@ -50,6 +52,8 @@ export declare class MessageComponent extends ChatItem implements OnInit, OnDest
50
52
  expandIcon: SVGIcon;
51
53
  collapseIcon: SVGIcon;
52
54
  downloadIcon: SVGIcon;
55
+ resendIcon: SVGIcon;
56
+ messageFailedIcon: SVGIcon;
53
57
  isMessageExpanded: boolean;
54
58
  showExpandCollapseIcon: boolean;
55
59
  fileActions: any;
@@ -60,6 +64,8 @@ export declare class MessageComponent extends ChatItem implements OnInit, OnDest
60
64
  get hasMessageContent(): boolean;
61
65
  get hasFiles(): boolean;
62
66
  get hasMultipleFiles(): boolean;
67
+ get isStatusString(): boolean;
68
+ get statusObject(): MessageStatus | null;
63
69
  get isActiveMessage(): boolean;
64
70
  get isMessageExpandable(): boolean;
65
71
  get showToolbar(): boolean;
@@ -83,6 +89,7 @@ export declare class MessageComponent extends ChatItem implements OnInit, OnDest
83
89
  onFileAction(action: any, file: ChatFile): void;
84
90
  getMessageById(id: string | number): Message | undefined;
85
91
  onReplyReferenceClick(event: Event, replyToId: string | number): void;
92
+ onResendMessage(event: Event): void;
86
93
  handleMenuClose(event?: ContextMenuPopupEvent): void;
87
94
  onActionButtonClick(event: MouseEvent): void;
88
95
  handleMenuOpen(): void;
@@ -24,6 +24,8 @@ export declare class SuggestedActionsComponent extends ChatItem implements After
24
24
  get defaultClass(): boolean;
25
25
  get scrollableClass(): boolean;
26
26
  get scrollButtonsClass(): boolean;
27
+ get scrollStartClass(): boolean;
28
+ get scrollEndClass(): boolean;
27
29
  get role(): string;
28
30
  actions: Action[];
29
31
  suggestions: ChatSuggestion[];
@@ -34,14 +36,17 @@ export declare class SuggestedActionsComponent extends ChatItem implements After
34
36
  dispatchSuggestion: EventEmitter<ChatSuggestion>;
35
37
  items: QueryList<ElementRef>;
36
38
  suggestionsContainer: ElementRef;
39
+ scrollableContainer: ElementRef;
37
40
  prevScrollButton: ElementRef;
38
41
  nextScrollButton: ElementRef;
39
42
  selectedIndex: number;
40
43
  activeIndex: number;
41
44
  active: boolean;
45
+ isAtScrollStart: boolean;
46
+ isAtScrollEnd: boolean;
47
+ get isScrollable(): boolean;
42
48
  get hasScrollButtons(): boolean;
43
49
  private subscriptions;
44
- private resizeObserver;
45
50
  private actionKeyHandlers;
46
51
  private suggestionKeyHandlers;
47
52
  constructor(chatService: ChatService, localization: LocalizationService, scrollService: SuggestionsScrollService, ngZone: NgZone, renderer: Renderer2);
@@ -56,8 +61,10 @@ export declare class SuggestedActionsComponent extends ChatItem implements After
56
61
  suggestionKeydown(e: any, suggestion: ChatSuggestion): void;
57
62
  getScrollButtonTitle(direction: string): string;
58
63
  onScroll(event: Event): void;
64
+ onScrollableContainerScroll(_event: Event): void;
59
65
  scrollSuggestions(direction: ScrollButtonType): void;
60
66
  focus(): void;
67
+ private updateScrollableState;
61
68
  private toggleScrollButtonState;
62
69
  private changeSelectedIndex;
63
70
  static ɵfac: i0.ɵɵFactoryDeclaration<SuggestedActionsComponent, never>;
@@ -9,7 +9,7 @@ import * as i0 from "@angular/core";
9
9
  *
10
10
  * To define an attachment template, nest an `<ng-template>` tag with the `kendoChatAttachmentTemplate` attribute inside the `<kendo-chat>` component.
11
11
  * The template context is set to the attachment instance.
12
- * For more information, refer to the article on [message attachments](slug:attachments_chat).
12
+ * For more information, refer to the article on [message attachments](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/attachments).
13
13
  *
14
14
  * You can use the following field:
15
15
  * - `attachment`&mdash;The attachment instance.
@@ -9,7 +9,7 @@ import * as i0 from "@angular/core";
9
9
  *
10
10
  * To define a message template, nest an `<ng-template>` tag with the `kendoChatAuthorMessageContentTemplate` directive inside the `<kendo-chat>` component.
11
11
  * The template context is set to the `message` instance.
12
- * For more information, refer to the article on [message templates](slug:message_templates_chat).
12
+ * For more information, refer to the article on [message templates](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/message-templates).
13
13
  *
14
14
  * @example
15
15
  * ```html
@@ -9,7 +9,7 @@ import * as i0 from "@angular/core";
9
9
  *
10
10
  * To define a message template, nest an `<ng-template>` tag with the `kendoChatAuthorMessageTemplate` directive inside the `<kendo-chat>` component.
11
11
  * The template context is set to the `message` instance.
12
- * For more information, refer to the article on [message templates](slug:message_templates_chat).
12
+ * For more information, refer to the article on [message templates](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/message-templates).
13
13
  *
14
14
  * @example
15
15
  * ```html
@@ -8,7 +8,7 @@ import * as i0 from "@angular/core";
8
8
  * Creates a message box area that overrides the default message box of the Chat component.
9
9
  *
10
10
  * To define a message box template, nest an `<ng-template>` tag with the `kendoChatMessageBoxTemplate` directive inside the `<kendo-chat>` tag.
11
- * For more information, see [Message Box Template](slug:message_templates_chat#toc-message-box-template).
11
+ * For more information, see [Message Box Template](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/message-templates#message-box-template).
12
12
  *
13
13
  * @example
14
14
  * ```html
@@ -9,7 +9,7 @@ import * as i0 from "@angular/core";
9
9
  *
10
10
  * To define a message template, nest an `<ng-template>` tag with the `kendoChatMessageContentTemplate` directive inside the `<kendo-chat>` component.
11
11
  * The template context is set to the `message` instance.
12
- * For more information, refer to the article on [message templates](slug:message_templates_chat).
12
+ * For more information, refer to the article on [message templates](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/message-templates).
13
13
  *
14
14
  * @example
15
15
  * ```html
@@ -9,7 +9,7 @@ import * as i0 from "@angular/core";
9
9
  *
10
10
  * To define a message template, nest an `<ng-template>` tag with the `kendoChatMessageTemplate` directive inside the `<kendo-chat>` component.
11
11
  * The template context is set to the `message` instance.
12
- * For more information, refer to the article on [message templates](slug:message_templates_chat).
12
+ * For more information, refer to the article on [message templates](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/message-templates).
13
13
  *
14
14
  * @example
15
15
  * ```html
@@ -8,7 +8,7 @@ import * as i0 from "@angular/core";
8
8
  * Defines a template for displaying custom content when there are no messages in the Chat.
9
9
  *
10
10
  * To define an empty Chat template, nest an `<ng-template>` tag with the `kendoChatNoDataTemplate` directive inside the `<kendo-chat>` component.
11
- * For more information, refer to the article on [message templates](slug:message_templates_chat).
11
+ * For more information, refer to the article on [message templates](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/message-templates).
12
12
  *
13
13
  * @example
14
14
  * ```html
@@ -9,7 +9,7 @@ import * as i0 from "@angular/core";
9
9
  *
10
10
  * To define a message template, nest an `<ng-template>` tag with the `kendoChatReceiverMessageContentTemplate` directive inside the `<kendo-chat>` component.
11
11
  * The template context is set to the `message` instance.
12
- * For more information, refer to the article on [message templates](slug:message_templates_chat).
12
+ * For more information, refer to the article on [message templates](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/message-templates).
13
13
  *
14
14
  * @example
15
15
  * ```html
@@ -9,7 +9,7 @@ import * as i0 from "@angular/core";
9
9
  *
10
10
  * To define a message template, nest an `<ng-template>` tag with the `kendoChatReceiverMessageTemplate` directive inside the `<kendo-chat>` component.
11
11
  * The template context is set to the `message` instance.
12
- * For more information, refer to the article on [message templates](slug:message_templates_chat).
12
+ * For more information, refer to the article on [message templates](https://www.telerik.com/kendo-angular-ui/components/conversational-ui/chat/message-templates).
13
13
  *
14
14
  * @example
15
15
  * ```html