@rt-tools/ui-kit-v2 0.20.0 → 0.21.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rt-tools/ui-kit-v2",
3
- "version": "0.20.0",
3
+ "version": "0.21.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Yauheni Krumin",
6
6
  "type": "module",
Binary file
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24">
2
+ <path
3
+ fill="currentColor"
4
+ d="M476.06-95Q315-95 203.8-207.43 92.59-319.85 94-481h94q1.15 121.3 84.01 206.65Q354.86-189 476-189q122 0 208-86.32t86-209.5Q770-605 683.63-688 597.25-771 476-771q-60 0-113.5 24.5T268-680h84v73H123v-227h71v95q55-59 127.5-93T476-866q80 0 150.5 30.5t123.74 82.51q53.24 52.01 83.5 121.5Q864-562 864-482q0 80-30.26 150.49-30.26 70.49-83.5 123Q697-156 626.5-125.5 556-95 476.06-95ZM600-311 446-463v-220h71v189l135 131-52 52Z" />
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24">
2
+ <path
3
+ fill="currentColor"
4
+ d="M476.06-95Q315-95 203.8-207.43 92.59-319.85 94-481h94q1.15 121.3 84.01 206.65Q354.86-189 476-189q122 0 208-86.32t86-209.5Q770-605 683.63-688 597.25-771 476-771q-60 0-113.5 24.5T268-680h84v73H123v-227h71v95q55-59 127.5-93T476-866q80 0 150.5 30.5t123.74 82.51q53.24 52.01 83.5 121.5Q864-562 864-482q0 80-30.26 150.49-30.26 70.49-83.5 123Q697-156 626.5-125.5 556-95 476.06-95ZM600-311 446-463v-220h71v189l135 131-52 52Z" />
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24">
2
+ <path
3
+ fill="currentColor"
4
+ d="M238-95v-143H95v-95h238v238h-95Zm390 0v-238h238v95H723v143h-95ZM95-628v-95h143v-143h95v238H95Zm533 0v-238h95v143h143v95H628Z" />
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24">
2
+ <path
3
+ fill="currentColor"
4
+ d="M238-95v-143H95v-95h238v238h-95Zm390 0v-238h238v95H723v143h-95ZM95-628v-95h143v-143h95v238H95Zm533 0v-238h95v143h143v95H628Z" />
5
+ </svg>
@@ -39,6 +39,13 @@ symbol внутри спрайта — и тем же движением про
39
39
  и на контейнере, и на одной странице законно живут оба набора рядом. Ставит его приложение своей
40
40
  разметкой, своей службы у набора нет — этим он и отличается от темы.
41
41
 
42
+ Второй признак — `data-rt-icon-preset='material'`, имя атрибута `RT_ICON_PRESET_ATTRIBUTE`. Он
43
+ стоит в том же `RT_ICON_MATERIAL_PRESET_SELECTOR`, поэтому его читают и значок, и кнопка
44
+ `rtButton`, но стили его не знают: токены набора оформления строятся только из `data-preset` и
45
+ `.rt-preset-material`. Так участок страницы получает материальные значки без чужих токенов.
46
+ Значение `'base'` у признака ничего не делает: выбирается ближайший материальный предок, а не
47
+ ближайший признак.
48
+
42
49
  Стилями набор не выбирается, хотя набор оформления работает именно так: ссылку на символ спрайта
43
50
  CSS подменить нечем. Второй `<use>` рядом с первым тоже не годится — он вечно указывает на символ,
44
51
  за которым никто не ходил, а обвязка снимков ждёт, пока нарисуется каждый значок на странице.
@@ -38,3 +38,6 @@
38
38
  директивами, а число столбцов здесь приходит из текста.
39
39
  - **Пустой текст не рисует ничего** — ни пустого абзаца, ни отступа: показывать или прятать
40
40
  заголовок раздела, решает потребитель.
41
+ - **Видимый текст без знаков разметки даёт `markdownToPlainText`** (`@rt-tools/ui-kit-v2/core`). Он
42
+ идёт по тому же дереву `parseMarkdown`: блоки через пустую строку, пункты списка и строки таблицы
43
+ построчно без маркеров, ячейки через табуляцию, у ссылки — её текст без адреса.
@@ -52,6 +52,19 @@
52
52
  беседы идут с ассистентом, а не с людьми. Вход уходит в `rt-thread-list` как есть.
53
53
  - Ответ рисует внутренний `rt-ai-chat-answer` (папка `answer/`): без него шаблон организма
54
54
  превышает предел цикломатической сложности.
55
+ - Копирование — внутренний `rt-ai-chat-copy` (папка `copy/`): у вопроса строкой под пузырём, у
56
+ ответа первым в строке оценки. Состояние «скопировано» своё у каждой кнопки, приём —
57
+ `rt-copy-value`: CDK `Clipboard`, `check` и `uiCopied` на 2000 мс. Подписи — `uiCopy`, `uiCopied`
58
+ кита, своих `ai*` нет. Вопрос копирует `message.text` как есть. Ответ — видимый текст без знаков
59
+ разметки: `plainText` через `markdownToPlainText` кита, по тому же дереву `parseMarkdown`, что
60
+ рисует `rt-markdown-text`. Ход работы, вложения `extra` и строка действий в буфер не попадают —
61
+ их нет в `message.text`. `innerText` отображённого текста не взят: в jsdom спек его нет, и
62
+ проверялась бы подмена, а не настоящий путь. `copyable` выключает обе.
63
+ - `headerIconPreset="material"` ставит на `<header>` признак `data-rt-icon-preset='material'`
64
+ (`RT_ICON_PRESET_ATTRIBUTE`): значки шапки — назад, знак ассистента в заголовке, полный экран,
65
+ беседы, новая беседа, закрыть — рисуются материальным набором, токены набора оформления не
66
+ меняются. При `'base'` признака нет. Значок читает признак один раз после первой отрисовки:
67
+ смена входа на живой панели перерисовывает только значки, появившиеся после неё.
55
68
 
56
69
  ## Рядом
57
70
 
@@ -0,0 +1,5 @@
1
+ @layer rt-kit.components {
2
+ .rt-ai-chat-copy {
3
+ display: inline-flex;
4
+ }
5
+ }
@@ -119,7 +119,14 @@
119
119
 
120
120
  &__question {
121
121
  display: flex;
122
- justify-content: flex-end;
122
+ flex-direction: column;
123
+ align-items: flex-end;
124
+ gap: var(--rt-space-2xs);
125
+ }
126
+
127
+ &__question-actions {
128
+ display: flex;
129
+ gap: var(--rt-space-xs);
123
130
  }
124
131
 
125
132
  &__bubble {
@@ -1208,6 +1208,17 @@ declare function parseInline(source: string): IRtMarkdownInlineNode[];
1208
1208
  */
1209
1209
  declare function parseMarkdown(source: string | null | undefined): IRtMarkdownBlockNode[];
1210
1210
 
1211
+ /**
1212
+ * Видимый текст разметки без её знаков: то, что `rt-markdown-text` показывает читателю.
1213
+ *
1214
+ * Строится по тому же дереву узлов, что рисует компонент, поэтому `##`, `**`, маркеры списков и
1215
+ * черта таблицы в вывод не попадают, а то, что разборщик оставил текстом, остаётся текстом.
1216
+ *
1217
+ * @param source Текст в разметке. Пустота и отсутствие значения дают пустую строку.
1218
+ * @returns Блоки через пустую строку, пункты списка и строки таблицы — построчно, ячейки — через табуляцию.
1219
+ */
1220
+ declare function markdownToPlainText(source: string | null | undefined): string;
1221
+
1211
1222
  /**
1212
1223
  * Готовая начинка `<picture>`: источники по форматам и запасной кадр на `<img>`.
1213
1224
  *
@@ -1323,5 +1334,5 @@ declare function themeScopeOfFocus(document: Document): string | null;
1323
1334
  */
1324
1335
  declare function carryThemeScopeOfFocus(pane: HTMLElement, document: Document): void;
1325
1336
 
1326
- export { BreakpointsService, ERtDataTableCellColor, ERtDataTableColumnType, ERtDataTableFilterType, ERtMarkdownBlock, ERtMarkdownInline, ERtStorageKeys, IButton, INotification, IRtDataTable, IRtIcon, IRtInput, IRtKitConfig, ITheme, MessageBus, NotificationBus, RT_CONSUMER_HANDLE_NAMES, RT_DATA_TABLE_PRESET_FROM_HOST, RT_DESIGN_TOKEN_NAMES, RT_KIT_CONFIG, RT_KIT_LABELS, RT_KIT_LABELS_EN, RT_KIT_LOCALE, RT_KIT_TRANSLATOR, RT_MATERIAL_PRESET_CLASS, RT_MATERIAL_PRESET_SELECTOR, RT_PRESET_MATERIAL_CLASS, RT_RADIUS_DEFAULT, RT_RADIUS_STEPS, RT_THEME_SCOPE_ATTRIBUTE, RtDayStampPipe, RtInfiniteScrollDirective, RtKitLabelPipe, RtThemeScopeDirective, SEARCH_DEBOUNCE_MS, ThemeService, breakNode, carryThemeScope, carryThemeScopeOfFocus, coerceQuillDeltaOutput, fileNameFromUrl, formatFileSize, iconsName, materialPresetClassesOf, materialPresetClassesOfFocus, normalizeQuillDelta, parseInline, parseMarkdown, provideRtKit, provideRtKitLabels, rtKitDefault, rtKitLabel, searchDebounce, themeScopeOf, themeScopeOfFocus };
1337
+ export { BreakpointsService, ERtDataTableCellColor, ERtDataTableColumnType, ERtDataTableFilterType, ERtMarkdownBlock, ERtMarkdownInline, ERtStorageKeys, IButton, INotification, IRtDataTable, IRtIcon, IRtInput, IRtKitConfig, ITheme, MessageBus, NotificationBus, RT_CONSUMER_HANDLE_NAMES, RT_DATA_TABLE_PRESET_FROM_HOST, RT_DESIGN_TOKEN_NAMES, RT_KIT_CONFIG, RT_KIT_LABELS, RT_KIT_LABELS_EN, RT_KIT_LOCALE, RT_KIT_TRANSLATOR, RT_MATERIAL_PRESET_CLASS, RT_MATERIAL_PRESET_SELECTOR, RT_PRESET_MATERIAL_CLASS, RT_RADIUS_DEFAULT, RT_RADIUS_STEPS, RT_THEME_SCOPE_ATTRIBUTE, RtDayStampPipe, RtInfiniteScrollDirective, RtKitLabelPipe, RtThemeScopeDirective, SEARCH_DEBOUNCE_MS, ThemeService, breakNode, carryThemeScope, carryThemeScopeOfFocus, coerceQuillDeltaOutput, fileNameFromUrl, formatFileSize, iconsName, markdownToPlainText, materialPresetClassesOf, materialPresetClassesOfFocus, normalizeQuillDelta, parseInline, parseMarkdown, provideRtKit, provideRtKitLabels, rtKitDefault, rtKitLabel, searchDebounce, themeScopeOf, themeScopeOfFocus };
1327
1338
  export type { IMessageBusEvent, IQuillDelta, IQuillDeltaAttributes, IQuillDeltaOp, IRtMarkdownBlockNode, IRtMarkdownInlineNode, IRtMarkdownListItem, IRtPicture, IRtPictureSource, TRtConsumerHandleName, TRtDataTableFilters, TRtDesignTokenName, TRtKitLabelKey, TRtKitLabelMap, TRtKitLabelParams, TRtKitTranslator, TRtRadius };
@@ -153,7 +153,16 @@ declare const RT_ICON_SYMBOL_ID_PREFIX: string;
153
153
  declare const RT_ICON_MATERIAL_SYMBOL_ID_PREFIX: string;
154
154
  /** Префикс `id` залитых рисунков материального набора: у имени их два, и `id` у каждого свой. */
155
155
  declare const RT_ICON_MATERIAL_FILL_SYMBOL_ID_PREFIX: string;
156
- /** Селекторы, которыми страница объявляет материальный набор. */
156
+ /**
157
+ * Атрибут, который переключает только набор рисунков значков: токенов набора оформления он не
158
+ * несёт. Ставится на контейнер со значением `'material'` там, где значки нужны материальные, а
159
+ * остальной вид — свой.
160
+ */
161
+ declare const RT_ICON_PRESET_ATTRIBUTE: string;
162
+ /**
163
+ * Селекторы, которыми страница объявляет материальный набор значков: признак набора оформления
164
+ * и признак одних значков. Стили читают только первые два — токены под третьим не меняются.
165
+ */
157
166
  declare const RT_ICON_MATERIAL_PRESET_SELECTOR: string;
158
167
 
159
168
  /**
@@ -244,5 +253,5 @@ declare const iconMaterialMap: readonly IRtIconMaterialEntry[];
244
253
  */
245
254
  declare const iconMaterialDrawn: ReadonlySet<IRtIcon.Name>;
246
255
 
247
- export { CATEGORY_ORDER, ICON_CATEGORY_RULES, RT_ICONS_BASE_URL, RT_ICONS_MATERIAL_BASE_URL, RT_ICON_GLYPH_STRATEGY, RT_ICON_MATERIAL_FILL_SYMBOL_ID_PREFIX, RT_ICON_MATERIAL_PRESET_SELECTOR, RT_ICON_MATERIAL_SYMBOL_ID_PREFIX, RT_ICON_SPRITE_ID, RT_ICON_SYMBOL_ID_PREFIX, RtIconComponent, RtIconFontService, RtIconRegistry, categoryOf, iconMaterialDrawn, iconMaterialMap, isKitIconName, materialPairOf, provideRtIcons, resolveIconGlyph };
256
+ export { CATEGORY_ORDER, ICON_CATEGORY_RULES, RT_ICONS_BASE_URL, RT_ICONS_MATERIAL_BASE_URL, RT_ICON_GLYPH_STRATEGY, RT_ICON_MATERIAL_FILL_SYMBOL_ID_PREFIX, RT_ICON_MATERIAL_PRESET_SELECTOR, RT_ICON_MATERIAL_SYMBOL_ID_PREFIX, RT_ICON_PRESET_ATTRIBUTE, RT_ICON_SPRITE_ID, RT_ICON_SYMBOL_ID_PREFIX, RtIconComponent, RtIconFontService, RtIconRegistry, categoryOf, iconMaterialDrawn, iconMaterialMap, isKitIconName, materialPairOf, provideRtIcons, resolveIconGlyph };
248
257
  export type { IRtIconMaterialEntry, IRtIconsOptions, TIconCategory };
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { AfterViewInit, OnDestroy, Signal, ElementRef, WritableSignal, InputSignal, OutputEmitterRef, InputSignalWithTransform, ModelSignal, TemplateRef, PipeTransform } from '@angular/core';
3
- import { RtFormControlBase, IQuillDelta, TRtKitLabelMap, IRtAiRunStatus, IRtTimeline, IRtThreadList, IRtSideMenu, IRtIcon } from '@rt-tools/ui-kit-v2';
3
+ import { RtFormControlBase, IQuillDelta, TRtKitLabelMap, IRtAiRunStatus, IRtTimeline, IRtIcon, IRtThreadList, IRtSideMenu } from '@rt-tools/ui-kit-v2';
4
4
  import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
5
5
  import { FormGroup, FormControl } from '@angular/forms';
6
6
 
@@ -633,6 +633,8 @@ declare class RtAiChatComponent {
633
633
  protected readonly emptyTitleText: Signal<string>;
634
634
  protected readonly emptyDescriptionText: Signal<string>;
635
635
  protected readonly disclaimerText: Signal<string>;
636
+ /** Значение признака одних значков на шапке: только материальный набор, свой — без признака. */
637
+ protected readonly headerIconSign: Signal<IRtIcon.Preset | null>;
636
638
  protected readonly hasThreads: Signal<boolean>;
637
639
  /** Список бесед стоит колонкой слева: на весь экран, когда беседы есть. */
638
640
  protected readonly isThreadColumn: Signal<boolean>;
@@ -674,6 +676,14 @@ declare class RtAiChatComponent {
674
676
  readonly fullScreenable: InputSignalWithTransform<boolean, BooleanInput>;
675
677
  /** Кнопка закрытия в шапке. */
676
678
  readonly closable: InputSignalWithTransform<boolean, BooleanInput>;
679
+ /** Кнопка копирования текста под вопросом и в строке действий ответа. */
680
+ readonly copyable: InputSignalWithTransform<boolean, BooleanInput>;
681
+ /**
682
+ * Набор рисунков значков шапки. `'material'` ставит на шапку признак одних значков
683
+ * `data-rt-icon-preset`: значки рисуются материальным набором, токены и остальной вид — свои.
684
+ * Признак значок читает после первой отрисовки, поэтому вход задаётся до неё. Дефолт `'base'`.
685
+ */
686
+ readonly headerIconPreset: InputSignal<IRtIcon.Preset>;
677
687
  /** Черновик в поле сообщения. */
678
688
  readonly draft: ModelSignal<string>;
679
689
  /** Список бесед открыт на месте ленты. */
@@ -705,25 +715,30 @@ declare class RtAiChatComponent {
705
715
  protected onSearchThreads(query: string): void;
706
716
  protected onSelectThread(id: IRtThreadList.TRowId): void;
707
717
  static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatComponent, never>;
708
- static ɵcmp: i0.ɵɵComponentDeclaration<RtAiChatComponent, "rt-ai-chat", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "messages": { "alias": "messages"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "emptyTitle": { "alias": "emptyTitle"; "required": false; "isSignal": true; }; "emptyDescription": { "alias": "emptyDescription"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disclaimer": { "alias": "disclaimer"; "required": false; "isSignal": true; }; "sending": { "alias": "sending"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "threads": { "alias": "threads"; "required": false; "isSignal": true; }; "activeThreadId": { "alias": "activeThreadId"; "required": false; "isSignal": true; }; "threadsLoading": { "alias": "threadsLoading"; "required": false; "isSignal": true; }; "threadsFetching": { "alias": "threadsFetching"; "required": false; "isSignal": true; }; "threadsHasMore": { "alias": "threadsHasMore"; "required": false; "isSignal": true; }; "emptyPreviewIcons": { "alias": "emptyPreviewIcons"; "required": false; "isSignal": true; }; "fullScreenable": { "alias": "fullScreenable"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "draft": { "alias": "draft"; "required": false; "isSignal": true; }; "threadsOpen": { "alias": "threadsOpen"; "required": false; "isSignal": true; }; "fullScreen": { "alias": "fullScreen"; "required": false; "isSignal": true; }; }, { "draft": "draftChange"; "threadsOpen": "threadsOpenChange"; "fullScreen": "fullScreenChange"; "send": "send"; "stop": "stop"; "retry": "retry"; "newThread": "newThread"; "closed": "closed"; "selectThread": "selectThread"; "deleteThread": "deleteThread"; "searchThreads": "searchThreads"; "loadMoreThreads": "loadMoreThreads"; "feedbackChange": "feedbackChange"; }, ["extraTemplate"], never, true, never>;
718
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtAiChatComponent, "rt-ai-chat", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "messages": { "alias": "messages"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "emptyTitle": { "alias": "emptyTitle"; "required": false; "isSignal": true; }; "emptyDescription": { "alias": "emptyDescription"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disclaimer": { "alias": "disclaimer"; "required": false; "isSignal": true; }; "sending": { "alias": "sending"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "threads": { "alias": "threads"; "required": false; "isSignal": true; }; "activeThreadId": { "alias": "activeThreadId"; "required": false; "isSignal": true; }; "threadsLoading": { "alias": "threadsLoading"; "required": false; "isSignal": true; }; "threadsFetching": { "alias": "threadsFetching"; "required": false; "isSignal": true; }; "threadsHasMore": { "alias": "threadsHasMore"; "required": false; "isSignal": true; }; "emptyPreviewIcons": { "alias": "emptyPreviewIcons"; "required": false; "isSignal": true; }; "fullScreenable": { "alias": "fullScreenable"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "copyable": { "alias": "copyable"; "required": false; "isSignal": true; }; "headerIconPreset": { "alias": "headerIconPreset"; "required": false; "isSignal": true; }; "draft": { "alias": "draft"; "required": false; "isSignal": true; }; "threadsOpen": { "alias": "threadsOpen"; "required": false; "isSignal": true; }; "fullScreen": { "alias": "fullScreen"; "required": false; "isSignal": true; }; }, { "draft": "draftChange"; "threadsOpen": "threadsOpenChange"; "fullScreen": "fullScreenChange"; "send": "send"; "stop": "stop"; "retry": "retry"; "newThread": "newThread"; "closed": "closed"; "selectThread": "selectThread"; "deleteThread": "deleteThread"; "searchThreads": "searchThreads"; "loadMoreThreads": "loadMoreThreads"; "feedbackChange": "feedbackChange"; }, ["extraTemplate"], never, true, never>;
709
719
  }
710
720
 
711
721
  /**
712
- * Ответ ассистента в ленте `rt-ai-chat`: ход работы, текст в markdown, вложения приложения и оценка.
713
- * Оценка появляется, когда текст дописан.
722
+ * Ответ ассистента в ленте `rt-ai-chat`: ход работы, текст в markdown, вложения приложения и строка
723
+ * действий — копирование и оценка. Строка появляется, когда текст дописан.
714
724
  */
715
725
  declare class RtAiChatAnswerComponent {
716
726
  protected readonly t: Signal<TRtKitLabelMap>;
717
- protected readonly isRated: Signal<boolean>;
727
+ /** Текст дописан: строка действий с копированием и оценкой. */
728
+ protected readonly isWritten: Signal<boolean>;
729
+ /** Что копирует кнопка: видимый текст ответа без знаков разметки — без хода работы и вложений. */
730
+ protected readonly plainText: Signal<string>;
718
731
  readonly message: InputSignal<IRtAiChat.Message>;
719
732
  /** Шаблон вложений ответа; `null` — вложений нет. */
720
733
  readonly extra: InputSignal<TemplateRef<IRtAiChat.ExtraContext> | null>;
734
+ /** Кнопка копирования текста первой в строке действий. */
735
+ readonly copyable: InputSignalWithTransform<boolean, BooleanInput>;
721
736
  /** Шаги хода работы раскрыты. */
722
737
  readonly expanded: ModelSignal<boolean>;
723
738
  /** Нажата оценка; повторное нажатие той же снимает её — решает родитель. */
724
739
  readonly feedbackChange: OutputEmitterRef<Exclude<IRtAiChat.Feedback, null>>;
725
740
  static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatAnswerComponent, never>;
726
- static ɵcmp: i0.ɵɵComponentDeclaration<RtAiChatAnswerComponent, "rt-ai-chat-answer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "extra": { "alias": "extra"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; "feedbackChange": "feedbackChange"; }, never, never, true, never>;
741
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtAiChatAnswerComponent, "rt-ai-chat-answer", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "extra": { "alias": "extra"; "required": false; "isSignal": true; }; "copyable": { "alias": "copyable"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; "feedbackChange": "feedbackChange"; }, never, never, true, never>;
727
742
  }
728
743
 
729
744
  /** Ключ текстовой расшифровки иконки статуса сообщения. */
Binary file