@rt-tools/ui-kit-v2 0.16.0 → 0.17.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.
Files changed (53) hide show
  1. package/README.md +7 -0
  2. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +96 -41
  3. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  4. package/fesm2022/rt-tools-ui-kit-v2.mjs +1106 -451
  5. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  6. package/package.json +1 -1
  7. package/rt-tools-ui-kit-v2-0.17.0.tgz +0 -0
  8. package/src/lib/components/action-bar/CONTEXT.md +5 -0
  9. package/src/lib/components/action-bar/rt-action-bar.component.scss +30 -16
  10. package/src/lib/components/aside/CONTEXT.md +9 -1
  11. package/src/lib/components/aside/footer/rt-aside-footer.component.scss +7 -8
  12. package/src/lib/components/aside/header/rt-aside-header.component.scss +16 -1
  13. package/src/lib/components/aside/rt-aside.component.scss +17 -1
  14. package/src/lib/components/button/CONTEXT.md +12 -11
  15. package/src/lib/components/button/rt-button.directive.scss +36 -0
  16. package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +2 -2
  17. package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +1 -1
  18. package/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.scss +1 -1
  19. package/src/lib/components/data-table/rt-data-table.component.scss +1 -1
  20. package/src/lib/components/dialog/CONTEXT.md +9 -0
  21. package/src/lib/components/dialog/content/rt-dialog-content.component.scss +20 -0
  22. package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +18 -2
  23. package/src/lib/components/dialog/header/rt-dialog-header.component.scss +21 -3
  24. package/src/lib/components/dialog/rt-dialog.component.scss +9 -3
  25. package/src/lib/components/dynamic-selector/CONTEXT.md +6 -0
  26. package/src/lib/components/header/CONTEXT.md +2 -2
  27. package/src/lib/components/icon/CONTEXT.md +11 -7
  28. package/src/lib/components/icon/rt-icon.component.scss +47 -0
  29. package/src/lib/components/icon-button/CONTEXT.md +27 -20
  30. package/src/lib/components/icon-button/rt-icon-button.component.scss +51 -25
  31. package/src/lib/components/image-upload/CONTEXT.md +20 -15
  32. package/src/lib/components/image-upload/rt-image-upload.component.scss +14 -2
  33. package/src/lib/components/pagination/rt-pagination.component.scss +1 -1
  34. package/src/lib/components/scroll-area/CONTEXT.md +2 -0
  35. package/src/lib/components/scroll-area/rt-scroll-area.component.scss +20 -3
  36. package/src/lib/components/side-menu/CONTEXT.md +7 -2
  37. package/src/lib/components/spinner/CONTEXT.md +15 -8
  38. package/src/lib/components/spinner/rt-spinner.component.scss +108 -9
  39. package/src/lib/components/tag/rt-tag.component.scss +43 -23
  40. package/src/lib/components/toast/CONTEXT.md +8 -0
  41. package/src/lib/components/toast/rt-toast.component.scss +74 -15
  42. package/src/lib/components/toast/rt-toaster.component.scss +5 -1
  43. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -37
  44. package/src/lib/components/toggle-switch/CONTEXT.md +11 -3
  45. package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +53 -14
  46. package/src/lib/components/toolbar/rt-toolbar.component.scss +15 -4
  47. package/src/lib/components/tooltip/CONTEXT.md +5 -5
  48. package/src/rich-editor/lib/components/chat/CONTEXT.md +7 -2
  49. package/src/rich-editor/lib/components/chat/rt-chat.component.scss +25 -0
  50. package/styles/tokens.css +35 -0
  51. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +16 -20
  52. package/types/rt-tools-ui-kit-v2.d.ts +371 -62
  53. package/rt-tools-ui-kit-v2-0.16.0.tgz +0 -0
@@ -6,17 +6,20 @@
6
6
  и на `<rt-toggle-switch>`, и на корне шаблона, поэтому правила блока вложены в хост —
7
7
  так они достаются только корню шаблона. */
8
8
 
9
+ /* Свойства объявлены на хосте: правило приложения на теге переопределяет их, а
10
+ ступени размера — тоже правила хоста, по модификатору на нём самом. Имена подписи
11
+ не повторяют первый кит: у его переключателя свои `--rt-toggle-label-*`. */
9
12
  rt-toggle-switch {
10
- display: inline-flex;
11
-
12
- /* Шаг входа `radius` переназначает скругление дорожки, ручка идёт за ней. */
13
- @include kv.radius-steps('--rt-toggle-radius', '> .rt-toggle-switch');
14
- }
15
-
16
- rt-toggle-switch .rt-toggle-switch {
17
13
  --rt-toggle-radius: var(--rt-radius-full);
18
14
  --rt-toggle-focus-shadow: var(--rt-shadow-focus-ring);
19
15
  --rt-toggle-transition-duration: var(--rt-duration-fast);
16
+ --rt-toggle-disabled-opacity: 0.5;
17
+ --rt-toggle-justify: flex-start;
18
+ --rt-toggle-label-gap: var(--rt-space-2);
19
+ --rt-toggle-label-size: var(--rt-text-sm);
20
+ --rt-toggle-label-color-off: var(--rt-color-text-muted);
21
+ --rt-toggle-label-color-on: var(--rt-color-text-primary);
22
+ --rt-toggle-label-color-hover: var(--rt-color-text-primary);
20
23
 
21
24
  /* Геометрия размера. База — `sm`; модификаторы перекрывают только числа,
22
25
  правила ниже к размерам не привязаны. `thumb-travel` держим явным
@@ -29,17 +32,16 @@
29
32
  --rt-toggle-icon-inset: 4px;
30
33
 
31
34
  display: inline-flex;
32
- padding: 0;
33
- border: none;
34
- background: none;
35
- cursor: pointer;
35
+ align-items: center;
36
+ justify-content: var(--rt-toggle-justify);
37
+ gap: var(--rt-toggle-label-gap);
36
38
 
37
- &--md {
39
+ &.rt-toggle-switch--md {
38
40
  --rt-toggle-track-width: 52px;
39
41
  --rt-toggle-thumb-travel: 28px;
40
42
  }
41
43
 
42
- &--lg {
44
+ &.rt-toggle-switch--lg {
43
45
  --rt-toggle-track-width: 60px;
44
46
  --rt-toggle-track-height: 30px;
45
47
  --rt-toggle-thumb-size: 24px;
@@ -47,6 +49,22 @@
47
49
  --rt-toggle-icon-inset: 6px;
48
50
  }
49
51
 
52
+ /* Прозрачность — на хосте: подпись гаснет вместе с переключателем. */
53
+ &.rt-toggle-switch--disabled {
54
+ opacity: var(--rt-toggle-disabled-opacity);
55
+ }
56
+
57
+ /* Шаг входа `radius` переназначает скругление дорожки, ручка идёт за ней. */
58
+ @include kv.radius-steps('--rt-toggle-radius');
59
+ }
60
+
61
+ rt-toggle-switch .rt-toggle-switch {
62
+ display: inline-flex;
63
+ padding: 0;
64
+ border: none;
65
+ background: none;
66
+ cursor: pointer;
67
+
50
68
  &:focus-visible {
51
69
  border-radius: var(--rt-toggle-radius);
52
70
  box-shadow: var(--rt-toggle-focus-shadow);
@@ -56,7 +74,6 @@
56
74
 
57
75
  &--disabled {
58
76
  cursor: not-allowed;
59
- opacity: 0.5;
60
77
  }
61
78
 
62
79
  &__track {
@@ -114,5 +131,27 @@
114
131
  &--on .rt-toggle-switch__thumb {
115
132
  transform: translateX(var(--rt-toggle-thumb-travel));
116
133
  }
134
+
135
+ &__label {
136
+ color: var(--rt-toggle-label-color-off);
137
+ cursor: pointer;
138
+ font-size: var(--rt-toggle-label-size);
139
+ transition: color var(--rt-toggle-transition-duration) ease;
140
+ user-select: none;
141
+ }
142
+ }
143
+
144
+ /* Состояния подписи — по модификаторам хоста: подпись стоит рядом с кнопкой, не в ней.
145
+ Наведение ниже включённого: под курсором подпись берёт свой цвет и у включённого. */
146
+ rt-toggle-switch.rt-toggle-switch--on .rt-toggle-switch__label {
147
+ color: var(--rt-toggle-label-color-on);
148
+ }
149
+
150
+ rt-toggle-switch:not(.rt-toggle-switch--disabled):hover .rt-toggle-switch__label {
151
+ color: var(--rt-toggle-label-color-hover);
152
+ }
153
+
154
+ rt-toggle-switch.rt-toggle-switch--disabled .rt-toggle-switch__label {
155
+ cursor: not-allowed;
117
156
  }
118
157
  }
@@ -1,19 +1,29 @@
1
1
  @layer rt-kit.components {
2
2
  .rt-toolbar {
3
- /* Отступ полосы сверху и снизу — свойства блока: обёртка переставляет их снаружи. */
3
+ /* Раскладка полосы — свойства блока: обёртка и приложение переставляют их снаружи.
4
+ Высота — наименьшая: полоса, стёкшая в колонку на узком экране, не обрезается. */
4
5
  --rt-toolbar-padding-top: var(--rt-space-2);
5
6
  --rt-toolbar-padding-bottom: var(--rt-space-2);
7
+ --rt-toolbar-padding-inline: 0;
8
+ --rt-toolbar-height: auto;
9
+ --rt-toolbar-border-bottom: none;
10
+ --rt-toolbar-gap: var(--rt-space-2);
11
+ --rt-toolbar-center-justify: flex-end;
12
+ --rt-toolbar-center-overflow: visible;
6
13
 
7
14
  display: block;
8
15
 
9
16
  &__bars {
10
17
  display: flex;
11
18
  width: 100%;
19
+ min-height: var(--rt-toolbar-height);
20
+ box-sizing: border-box;
12
21
  flex-direction: row;
13
22
  align-items: center;
14
23
  justify-content: space-between;
15
- padding: var(--rt-toolbar-padding-top) 0 var(--rt-toolbar-padding-bottom);
16
- gap: var(--rt-space-2);
24
+ padding: var(--rt-toolbar-padding-top) var(--rt-toolbar-padding-inline) var(--rt-toolbar-padding-bottom);
25
+ border-bottom: var(--rt-toolbar-border-bottom);
26
+ gap: var(--rt-toolbar-gap);
17
27
  }
18
28
 
19
29
  &__bar {
@@ -29,8 +39,9 @@
29
39
  }
30
40
 
31
41
  &--center {
42
+ overflow: var(--rt-toolbar-center-overflow);
32
43
  flex: 1 1 auto;
33
- justify-content: flex-end;
44
+ justify-content: var(--rt-toolbar-center-justify);
34
45
  gap: var(--rt-space-2);
35
46
 
36
47
  // Контрол-фильтр (поиск/селект) занимает ширину center и право-
@@ -5,11 +5,11 @@
5
5
  <rt-icon-button icon="ico-trash" ariaLabel="Удалить" tooltip="Удалить" />
6
6
  ```
7
7
 
8
- | вход | тип | умолчание |
9
- | ------------------------ | ----------------------------- | ----------------------------------------------- |
10
- | `rtTooltip` | `string \| null \| undefined` | `''` |
11
- | `rtTooltipPlacement` | `'top' \| 'bottom' \| null` | `null` — сверху, под материальным набором снизу |
12
- | `rtTooltipWhenTruncated` | `boolean` | `false` — подсказка только у обрезанного текста |
8
+ | вход | тип | умолчание |
9
+ | ------------------------ | ------------------------------------------------ | ----------------------------------------------- |
10
+ | `rtTooltip` | `string \| null \| undefined` | `''` |
11
+ | `rtTooltipPlacement` | `'top' \| 'bottom' \| 'left' \| 'right' \| null` | `null` — сверху, под материальным набором снизу |
12
+ | `rtTooltipWhenTruncated` | `boolean` | `false` — подсказка только у обрезанного текста |
13
13
 
14
14
  Выходов нет. Панель — `rt-tooltip` в оверлее CDK, `role="tooltip"`.
15
15
 
@@ -16,8 +16,8 @@
16
16
  ```
17
17
 
18
18
  Основные входы: `messages`, `hasThread`, `canReply`, `replyBlockReason`, `loading`, `fetching`,
19
- `sending`, `attachments`, `accept`, `formatting`, `title`, `showRefresh`, `showExpand`, `fill`.
20
- Выходы: `send`, `refresh` и события по сообщениям (повтор, удаление).
19
+ `sending`, `attachments`, `accept`, `formatting`, `title`, `showRefresh`, `showExpand`, `fill`,
20
+ `typingText`. Выходы: `send`, `refresh`, `typing` и события по сообщениям (повтор, удаление).
21
21
 
22
22
  ## Главное, что нужно знать
23
23
 
@@ -35,6 +35,11 @@ rtChatMessageActions let-message>` рисуется в меню «…» у ре
35
35
  **Поле ответа гейтится `canReply`.** Когда отвечать нельзя, вместо него рисуется причина
36
36
  из `replyBlockReason`.
37
37
 
38
+ **Набор текста уходит наружу одним событием на отрезок.** `typing` шлёт `true`, когда человек начал
39
+ набирать, и `false` на пустом поле, при отправке и после 3 секунд без ввода — в обоих режимах поля.
40
+ Что печатает вторая сторона, показывает `typingText`: плашка стоит поверх низа ленты и места не
41
+ занимает, пустая строка её прячет. Текст и перевод даёт приложение.
42
+
38
43
  **Удалённое сообщение остаётся в ленте** отдельной пометкой вместо текста: иначе непонятно, на
39
44
  что отвечали соседние реплики.
40
45
 
@@ -3,6 +3,8 @@
3
3
  --rt-chat-bubble-radius: var(--rt-radius-lg);
4
4
  --rt-chat-message-border-width: var(--rt-border-width-thin);
5
5
  --rt-chat-transition-duration: var(--rt-duration-fast);
6
+ --rt-chat-typing-radius: var(--rt-radius-full);
7
+ --rt-chat-typing-shadow: var(--rt-shadow-sm);
6
8
 
7
9
  display: flex;
8
10
  flex-direction: column;
@@ -114,6 +116,29 @@
114
116
  inset: 0;
115
117
  }
116
118
 
119
+ // Строка «печатает» стоит поверх низа ленты и места не занимает: лента не сдвигается, а чат
120
+ // без строки не меняется ни на пиксель. Пустой узел остаётся в разметке — иначе программа
121
+ // чтения с экрана не объявит первую строку.
122
+ &__typing {
123
+ position: absolute;
124
+ z-index: 1;
125
+ bottom: var(--rt-space-1);
126
+ left: var(--rt-space-2);
127
+ box-sizing: border-box;
128
+ color: var(--rt-color-text-muted);
129
+ font-size: var(--rt-text-xs);
130
+ max-inline-size: calc(100% - 2 * var(--rt-space-2));
131
+ overflow-wrap: anywhere;
132
+ pointer-events: none;
133
+
134
+ &--shown {
135
+ padding: var(--rt-space-0-5) var(--rt-space-2);
136
+ border-radius: var(--rt-chat-typing-radius);
137
+ background: var(--rt-color-bg-surface);
138
+ box-shadow: var(--rt-chat-typing-shadow);
139
+ }
140
+ }
141
+
117
142
  &__footer-slot {
118
143
  display: flex;
119
144
  flex-direction: column;
package/styles/tokens.css CHANGED
@@ -6798,6 +6798,25 @@ html.rt-theme-dark.rt-preset-material {
6798
6798
  justify-content: center;
6799
6799
  font-size: var(--rt-btn-icon-size);
6800
6800
  }
6801
+ .rt-button {
6802
+ /* Лигатура шрифта Material Symbols для имени без пары — размер ей даёт `__icon` рядом.
6803
+ Шрифт подключает приложение, семью можно переназначить свойством сверху. До готовности
6804
+ шрифтов лигатура скрыта: иначе на её месте видно слово. */
6805
+ }
6806
+ .rt-button__glyph {
6807
+ overflow: hidden;
6808
+ font-family: var(--rt-icon-glyph-font, "Material Symbols Outlined"), sans-serif;
6809
+ font-feature-settings: "liga";
6810
+ font-style: normal;
6811
+ font-weight: var(--rt-font-weight-regular);
6812
+ letter-spacing: normal;
6813
+ line-height: 1;
6814
+ text-transform: none;
6815
+ white-space: nowrap;
6816
+ }
6817
+ .rt-button__glyph--pending {
6818
+ visibility: hidden;
6819
+ }
6801
6820
  .rt-button__label {
6802
6821
  display: inline-flex;
6803
6822
  align-items: center;
@@ -6973,6 +6992,22 @@ html.rt-theme-dark.rt-preset-material {
6973
6992
  cursor: wait;
6974
6993
  pointer-events: none;
6975
6994
  }
6995
+ .rt-button {
6996
+ /* Подпись спрятана на время загрузки: содержимое гаснет прозрачностью, а не
6997
+ `visibility` — так оно держит ширину и остаётся именем кнопки для скринридера.
6998
+ Загрузчик встаёт поверх по центру. */
6999
+ }
7000
+ .rt-button--loading-label-hidden {
7001
+ position: relative;
7002
+ }
7003
+ .rt-button--loading-label-hidden > :not(.rt-button__loader) {
7004
+ opacity: 0;
7005
+ }
7006
+ .rt-button__loader {
7007
+ position: absolute;
7008
+ margin: auto;
7009
+ inset: 0;
7010
+ }
6976
7011
  .rt-button {
6977
7012
  /* Состояние стоит ниже всех вариантов оформления и палитры того же блока.
6978
7013
  Специфичность у них равная, и правила равной силы разбираются порядком в
@@ -278,27 +278,18 @@ declare class RtChatMessageActionsDirective {
278
278
  }
279
279
 
280
280
  /**
281
- * Общий презентационный чат: тред сообщений + композер. Никакого data-access/api — история
282
- * приходит готовым массивом `IRtChat.Message[]`, отправка/обновление/скачивание уходят наружу
283
- * через outputs, а стор и blob-загрузка остаются в feature-компоненте каждого домена.
284
- *
285
- * Композер держит свой `FormGroup` — наружу торчит только `send`. Полноэкранный
286
- * режим (expand) — overlay внутри самого компонента (`--expanded`), потребителю
287
- * лишь опционально сообщается через `expandedChange`.
288
- *
289
- * Шапка (тулбар «Чат» + refresh/expand) рендерится только когда включена хотя бы
290
- * одна из иконок (`showRefresh`/`showExpand`): в диалогах своя header-обёртка,
291
- * туда тулбар не нужен.
281
+ * Общий презентационный чат: тред сообщений + композер. История приходит готовым массивом
282
+ * `IRtChat.Message[]`, отправка, обновление, скачивание и набор текста уходят наружу выходами;
283
+ * стор и blob-загрузка остаются у потребителя. Композер держит свой `FormGroup`. Полноэкранный
284
+ * режим — overlay внутри компонента (`--expanded`). Шапка рисуется, только когда включена хотя бы
285
+ * одна из иконок `showRefresh`/`showExpand`: в диалогах своя header-обёртка.
292
286
  */
293
287
  declare class RtChatComponent {
294
288
  #private;
295
289
  /**
296
- * Дата сообщения форматируется по активной локали приложения, а не по
297
- * `LOCALE_ID`: тот вычисляется на подъёме приложения и там, где язык
298
- * переключают на ходу, оставил бы часы в прежнем формате до перезагрузки.
299
- *
300
- * Данные локали для `DatePipe` регистрирует приложение: без них пайп падает
301
- * `Missing locale data`, и кит за это не отвечает.
290
+ * Дата форматируется по активной локали приложения, а не по `LOCALE_ID`: тот вычисляется на
291
+ * подъёме и при смене языка на ходу оставил бы прежний формат. Данные локали для `DatePipe`
292
+ * регистрирует приложение: без них пайп падает `Missing locale data`.
302
293
  */
303
294
  protected readonly t: Signal<TRtKitLabelMap>;
304
295
  protected readonly locale: Signal<string>;
@@ -409,11 +400,14 @@ declare class RtChatComponent {
409
400
  readonly send: OutputEmitterRef<IRtChat.SendPayload>;
410
401
  /** Клик refresh — consumer перетягивает тред. */
411
402
  readonly refresh: OutputEmitterRef<void>;
412
- /** Клик по вложению — consumer качает blob своим api. Шаблон зовёт выход прямо: релей-метод,
413
- * который только повторял `emit`, ничего не добавлял, а файл при этом рос. */
403
+ /** Клик по вложению — consumer качает blob своим api; шаблон зовёт выход прямо, без релея. */
414
404
  readonly downloadFile: OutputEmitterRef<IRtChat.Message>;
415
405
  /** Клик по карточке вложения из `attachments[]` — консюмер качает по `publicId`. */
416
406
  readonly downloadAttachment: OutputEmitterRef<IRtChat.Attachment>;
407
+ /** Набор текста в поле ответа: `true` — отрезок начался, `false` — кончился. */
408
+ readonly typing: OutputEmitterRef<boolean>;
409
+ /** Строка о том, что печатает вторая сторона, поверх низа ленты; пустая прячет плашку. */
410
+ readonly typingText: InputSignal<string>;
417
411
  /** Смена fullscreen-состояния. */
418
412
  readonly expandedChange: OutputEmitterRef<boolean>;
419
413
  readonly deleteMessage: OutputEmitterRef<IRtChat.Message>;
@@ -431,6 +425,8 @@ declare class RtChatComponent {
431
425
  protected onComposerKeydown(event: KeyboardEvent): void;
432
426
  /** Релей submit'а от `rt-message-composer` (rich-режим) наружу как `send`. */
433
427
  protected onComposerSubmit(payload: IRtMessageComposer.SubmitPayload): void;
428
+ /** Ввод в поле ответа любого из двух режимов; выбор файла набором не считается. */
429
+ protected onReplyInput(event: Event): void;
434
430
  /**
435
431
  * Файлы выброшены в обёртку чата: в rich-режиме отдаём массив композеру через
436
432
  * input, в классическом — добавляем к уже выбранным в собственном `replyForm`.
@@ -443,7 +439,7 @@ declare class RtChatComponent {
443
439
  protected onThreadScroll(): void;
444
440
  protected toggleExpand(): void;
445
441
  static ɵfac: i0.ɵɵFactoryDeclaration<RtChatComponent, never>;
446
- static ɵcmp: i0.ɵɵComponentDeclaration<RtChatComponent, "rt-chat", never, { "messages": { "alias": "messages"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fetching": { "alias": "fetching"; "required": false; "isSignal": true; }; "canReply": { "alias": "canReply"; "required": false; "isSignal": true; }; "replyBlockReason": { "alias": "replyBlockReason"; "required": false; "isSignal": true; }; "sending": { "alias": "sending"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyHint": { "alias": "emptyHint"; "required": false; "isSignal": true; }; "hasThread": { "alias": "hasThread"; "required": false; "isSignal": true; }; "attachments": { "alias": "attachments"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "richComposer": { "alias": "richComposer"; "required": false; "isSignal": true; }; "formatting": { "alias": "formatting"; "required": false; "isSignal": true; }; "formattingToolbar": { "alias": "formattingToolbar"; "required": false; "isSignal": true; }; "fill": { "alias": "fill"; "required": false; "isSignal": true; }; "showRefresh": { "alias": "showRefresh"; "required": false; "isSignal": true; }; "showExpand": { "alias": "showExpand"; "required": false; "isSignal": true; }; "messageHasActions": { "alias": "messageHasActions"; "required": false; "isSignal": true; }; }, { "send": "send"; "refresh": "refresh"; "downloadFile": "downloadFile"; "downloadAttachment": "downloadAttachment"; "expandedChange": "expandedChange"; "deleteMessage": "deleteMessage"; "retryMessage": "retryMessage"; }, ["messageActions"], ["[rtChatHeaderActions]", "[rtChatFooter]"], true, never>;
442
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtChatComponent, "rt-chat", never, { "messages": { "alias": "messages"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fetching": { "alias": "fetching"; "required": false; "isSignal": true; }; "canReply": { "alias": "canReply"; "required": false; "isSignal": true; }; "replyBlockReason": { "alias": "replyBlockReason"; "required": false; "isSignal": true; }; "sending": { "alias": "sending"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyHint": { "alias": "emptyHint"; "required": false; "isSignal": true; }; "hasThread": { "alias": "hasThread"; "required": false; "isSignal": true; }; "attachments": { "alias": "attachments"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "richComposer": { "alias": "richComposer"; "required": false; "isSignal": true; }; "formatting": { "alias": "formatting"; "required": false; "isSignal": true; }; "formattingToolbar": { "alias": "formattingToolbar"; "required": false; "isSignal": true; }; "fill": { "alias": "fill"; "required": false; "isSignal": true; }; "showRefresh": { "alias": "showRefresh"; "required": false; "isSignal": true; }; "showExpand": { "alias": "showExpand"; "required": false; "isSignal": true; }; "typingText": { "alias": "typingText"; "required": false; "isSignal": true; }; "messageHasActions": { "alias": "messageHasActions"; "required": false; "isSignal": true; }; }, { "send": "send"; "refresh": "refresh"; "downloadFile": "downloadFile"; "downloadAttachment": "downloadAttachment"; "typing": "typing"; "expandedChange": "expandedChange"; "deleteMessage": "deleteMessage"; "retryMessage": "retryMessage"; }, ["messageActions"], ["[rtChatHeaderActions]", "[rtChatFooter]"], true, never>;
447
443
  }
448
444
 
449
445
  /**