@rt-tools/ui-kit-v2 0.23.3 → 0.24.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 (354) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +142 -71
  2. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +467 -231
  4. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +260 -91
  6. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs +80 -46
  8. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +984 -697
  10. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +452 -210
  12. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +143 -52
  14. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs +158 -83
  16. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs +335 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs.map +1 -0
  19. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +437 -363
  20. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -1
  21. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +430 -149
  22. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
  23. package/fesm2022/rt-tools-ui-kit-v2-card.mjs +155 -71
  24. package/fesm2022/rt-tools-ui-kit-v2-card.mjs.map +1 -1
  25. package/fesm2022/rt-tools-ui-kit-v2-carousel.mjs +155 -0
  26. package/fesm2022/rt-tools-ui-kit-v2-carousel.mjs.map +1 -0
  27. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +215 -110
  28. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
  29. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs +158 -75
  30. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs.map +1 -1
  31. package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs +769 -0
  32. package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs.map +1 -0
  33. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs +462 -253
  34. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs.map +1 -1
  35. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +1276 -1316
  36. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -1
  37. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +185 -80
  38. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
  39. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +2321 -2619
  40. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  41. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs +100 -44
  42. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs.map +1 -1
  43. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +290 -155
  44. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -1
  45. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +2097 -858
  46. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  47. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +2247 -1176
  48. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  49. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +1043 -705
  50. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  51. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +810 -525
  52. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  53. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs +158 -138
  54. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs.map +1 -1
  55. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +177 -67
  56. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -1
  57. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +550 -477
  58. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -1
  59. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs +185 -168
  60. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs.map +1 -1
  61. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +116 -43
  62. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -1
  63. package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs +585 -0
  64. package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs.map +1 -0
  65. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +755 -259
  66. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
  67. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +3266 -1115
  68. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
  69. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +190 -55
  70. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -1
  71. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +283 -103
  72. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
  73. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +393 -177
  74. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
  75. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +399 -207
  76. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
  77. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs +288 -212
  78. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs.map +1 -1
  79. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs +262 -116
  80. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs.map +1 -1
  81. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs +57 -31
  82. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs.map +1 -1
  83. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +258 -90
  84. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
  85. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +249 -215
  86. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -1
  87. package/fesm2022/rt-tools-ui-kit-v2-header.mjs +199 -71
  88. package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -1
  89. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs +231 -0
  90. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs.map +1 -0
  91. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs +336 -0
  92. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs.map +1 -0
  93. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +451 -162
  94. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
  95. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +931 -686
  96. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
  97. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs +664 -491
  98. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs.map +1 -1
  99. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +574 -222
  100. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
  101. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs +150 -36
  102. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs.map +1 -1
  103. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +606 -0
  104. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -0
  105. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +461 -355
  106. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  107. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +338 -143
  108. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
  109. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs +135 -48
  110. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs.map +1 -1
  111. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs +166 -92
  112. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs.map +1 -1
  113. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs +118 -56
  114. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs.map +1 -1
  115. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1054 -527
  116. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
  117. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +230 -104
  118. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
  119. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs +210 -70
  120. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs.map +1 -1
  121. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +532 -311
  122. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
  123. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs +125 -50
  124. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs.map +1 -1
  125. package/fesm2022/rt-tools-ui-kit-v2-note.mjs +73 -43
  126. package/fesm2022/rt-tools-ui-kit-v2-note.mjs.map +1 -1
  127. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +161 -53
  128. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -1
  129. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +491 -310
  130. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  131. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +374 -174
  132. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
  133. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +202 -159
  134. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -1
  135. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +438 -309
  136. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -1
  137. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +295 -0
  138. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -0
  139. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +135 -45
  140. package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -1
  141. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +293 -171
  142. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -1
  143. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs +62 -55
  144. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs.map +1 -1
  145. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +3379 -1466
  146. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  147. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs +114 -116
  148. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -1
  149. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +406 -299
  150. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
  151. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +137 -36
  152. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -1
  153. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +687 -468
  154. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
  155. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +2195 -1569
  156. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
  157. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +187 -48
  158. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -1
  159. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +242 -122
  160. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -1
  161. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +439 -0
  162. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -0
  163. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +218 -69
  164. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -1
  165. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +292 -91
  166. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -1
  167. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +225 -138
  168. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
  169. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +150 -116
  170. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
  171. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +2462 -1583
  172. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  173. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +647 -346
  174. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  175. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +335 -121
  176. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
  177. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +217 -84
  178. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -1
  179. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +151 -72
  180. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
  181. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +697 -226
  182. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  183. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +92 -38
  184. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -1
  185. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +752 -338
  186. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
  187. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +310 -129
  188. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
  189. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +286 -158
  190. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -1
  191. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +270 -134
  192. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
  193. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +322 -202
  194. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
  195. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +908 -0
  196. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -0
  197. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +785 -0
  198. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -0
  199. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +118 -63
  200. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -1
  201. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +783 -262
  202. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
  203. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +633 -294
  204. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
  205. package/fesm2022/rt-tools-ui-kit-v2.mjs +100 -103
  206. package/package.json +45 -1
  207. package/src/assets/icons/collapse-all.svg +9 -0
  208. package/src/assets/icons/expand-all.svg +9 -0
  209. package/src/assets/icons-material/collapse-all.fill.svg +5 -0
  210. package/src/assets/icons-material/collapse-all.svg +5 -0
  211. package/src/assets/icons-material/expand-all.fill.svg +5 -0
  212. package/src/assets/icons-material/expand-all.svg +5 -0
  213. package/src/assets/icons-material/undo.fill.svg +5 -0
  214. package/src/assets/icons-material/undo.svg +5 -0
  215. package/src/lib/components/bottom-sheet/CONTEXT.md +20 -2
  216. package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +36 -1
  217. package/src/lib/components/breadcrumbs/CONTEXT.md +37 -0
  218. package/src/lib/components/breadcrumbs/rt-breadcrumbs.component.scss +205 -0
  219. package/src/lib/components/carousel/CONTEXT.md +42 -0
  220. package/src/lib/components/carousel/rt-carousel.component.scss +117 -0
  221. package/src/lib/components/checkbox/CONTEXT.md +3 -0
  222. package/src/lib/components/checkbox/rt-checkbox.component.scss +9 -3
  223. package/src/lib/components/color-palette/CONTEXT.md +49 -0
  224. package/src/lib/components/color-palette/picker/rt-color-picker.component.scss +161 -0
  225. package/src/lib/components/color-palette/rt-color-palette.component.scss +132 -0
  226. package/src/lib/components/draggable-tree/CONTEXT.md +54 -0
  227. package/src/lib/components/draggable-tree/rt-draggable-tree.component.scss +219 -0
  228. package/src/lib/components/hybrid-tree/CONTEXT.md +31 -0
  229. package/src/lib/components/hybrid-tree-selector/CONTEXT.md +25 -0
  230. package/src/lib/components/icon-button/CONTEXT.md +3 -0
  231. package/src/lib/components/inline-edit/CONTEXT.md +41 -0
  232. package/src/lib/components/inline-edit/rt-inline-edit.component.scss +274 -0
  233. package/src/lib/components/popover/CONTEXT.md +3 -0
  234. package/src/lib/components/profile-menu/CONTEXT.md +32 -0
  235. package/src/lib/components/profile-menu/rt-profile-menu.component.scss +104 -0
  236. package/src/lib/components/speed-menu/CONTEXT.md +34 -0
  237. package/src/lib/components/speed-menu/rt-speed-menu.component.scss +118 -0
  238. package/src/lib/components/tag/rt-tag.component.scss +12 -0
  239. package/src/lib/components/thread-list/CONTEXT.md +1 -0
  240. package/src/lib/components/thread-list/rt-thread-list.component.scss +2 -1
  241. package/src/lib/components/toolbar/CONTEXT.md +9 -4
  242. package/src/lib/components/toolbar/rt-toolbar.component.scss +10 -2
  243. package/src/lib/components/tooltip/CONTEXT.md +8 -1
  244. package/src/lib/components/tree/CONTEXT.md +66 -0
  245. package/src/lib/components/tree/rt-tree.component.scss +313 -0
  246. package/src/lib/components/tree-selector/CONTEXT.md +47 -0
  247. package/src/lib/components/tree-selector/rt-tree-selector.component.scss +121 -0
  248. package/src/styles/_primitives.scss +4 -0
  249. package/src/styles/_semantic.scss +5 -0
  250. package/styles/tokens.css +43 -0
  251. package/types/rt-tools-ui-kit-v2-accordion.d.ts +31 -24
  252. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +112 -91
  253. package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +64 -40
  254. package/types/rt-tools-ui-kit-v2-aside-section.d.ts +13 -10
  255. package/types/rt-tools-ui-kit-v2-aside.d.ts +268 -206
  256. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +102 -61
  257. package/types/rt-tools-ui-kit-v2-bar-list.d.ts +39 -27
  258. package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +31 -20
  259. package/types/rt-tools-ui-kit-v2-breadcrumbs.d.ts +89 -0
  260. package/types/rt-tools-ui-kit-v2-button.d.ts +119 -59
  261. package/types/rt-tools-ui-kit-v2-calendar.d.ts +151 -86
  262. package/types/rt-tools-ui-kit-v2-card.d.ts +42 -21
  263. package/types/rt-tools-ui-kit-v2-carousel.d.ts +76 -0
  264. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +48 -24
  265. package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +28 -20
  266. package/types/rt-tools-ui-kit-v2-color-palette.d.ts +208 -0
  267. package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +104 -47
  268. package/types/rt-tools-ui-kit-v2-container.d.ts +278 -221
  269. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +39 -24
  270. package/types/rt-tools-ui-kit-v2-core.d.ts +862 -865
  271. package/types/rt-tools-ui-kit-v2-counter-row.d.ts +20 -12
  272. package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -38
  273. package/types/rt-tools-ui-kit-v2-data-list.d.ts +429 -264
  274. package/types/rt-tools-ui-kit-v2-data-table.d.ts +500 -351
  275. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +164 -138
  276. package/types/rt-tools-ui-kit-v2-date-range.d.ts +102 -84
  277. package/types/rt-tools-ui-kit-v2-delta-view.d.ts +16 -13
  278. package/types/rt-tools-ui-kit-v2-detail-list.d.ts +23 -16
  279. package/types/rt-tools-ui-kit-v2-dialog.d.ts +130 -101
  280. package/types/rt-tools-ui-kit-v2-dot-field.d.ts +10 -13
  281. package/types/rt-tools-ui-kit-v2-download-link.d.ts +22 -17
  282. package/types/rt-tools-ui-kit-v2-draggable-tree.d.ts +132 -0
  283. package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +185 -96
  284. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +904 -404
  285. package/types/rt-tools-ui-kit-v2-empty-state.d.ts +48 -19
  286. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +67 -39
  287. package/types/rt-tools-ui-kit-v2-field.d.ts +90 -49
  288. package/types/rt-tools-ui-kit-v2-file-card.d.ts +115 -75
  289. package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -48
  290. package/types/rt-tools-ui-kit-v2-file-input.d.ts +53 -36
  291. package/types/rt-tools-ui-kit-v2-file-list.d.ts +5 -8
  292. package/types/rt-tools-ui-kit-v2-filter-control.d.ts +83 -49
  293. package/types/rt-tools-ui-kit-v2-form-control.d.ts +102 -74
  294. package/types/rt-tools-ui-kit-v2-header.d.ts +40 -22
  295. package/types/rt-tools-ui-kit-v2-hybrid-tree-selector.d.ts +14 -0
  296. package/types/rt-tools-ui-kit-v2-hybrid-tree.d.ts +72 -0
  297. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +190 -90
  298. package/types/rt-tools-ui-kit-v2-icon.d.ts +160 -129
  299. package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +151 -111
  300. package/types/rt-tools-ui-kit-v2-image-upload.d.ts +159 -85
  301. package/types/rt-tools-ui-kit-v2-info-item.d.ts +26 -13
  302. package/types/rt-tools-ui-kit-v2-inline-edit.d.ts +194 -0
  303. package/types/rt-tools-ui-kit-v2-input-number.d.ts +102 -53
  304. package/types/rt-tools-ui-kit-v2-input.d.ts +82 -43
  305. package/types/rt-tools-ui-kit-v2-live-badge.d.ts +30 -17
  306. package/types/rt-tools-ui-kit-v2-logo.d.ts +49 -32
  307. package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +26 -17
  308. package/types/rt-tools-ui-kit-v2-menu.d.ts +272 -155
  309. package/types/rt-tools-ui-kit-v2-message.d.ts +59 -33
  310. package/types/rt-tools-ui-kit-v2-money-list.d.ts +36 -18
  311. package/types/rt-tools-ui-kit-v2-multiselect.d.ts +114 -80
  312. package/types/rt-tools-ui-kit-v2-night-grid.d.ts +34 -25
  313. package/types/rt-tools-ui-kit-v2-note.d.ts +12 -9
  314. package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +37 -16
  315. package/types/rt-tools-ui-kit-v2-page-header.d.ts +218 -150
  316. package/types/rt-tools-ui-kit-v2-pagination.d.ts +99 -63
  317. package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +61 -66
  318. package/types/rt-tools-ui-kit-v2-popover.d.ts +116 -55
  319. package/types/rt-tools-ui-kit-v2-profile-menu.d.ts +103 -0
  320. package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +26 -16
  321. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +85 -43
  322. package/types/rt-tools-ui-kit-v2-radius.d.ts +18 -15
  323. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +931 -590
  324. package/types/rt-tools-ui-kit-v2-ripple.d.ts +28 -25
  325. package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +60 -58
  326. package/types/rt-tools-ui-kit-v2-section-nav.d.ts +32 -22
  327. package/types/rt-tools-ui-kit-v2-select.d.ts +182 -139
  328. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +452 -349
  329. package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +53 -20
  330. package/types/rt-tools-ui-kit-v2-skeleton.d.ts +55 -26
  331. package/types/rt-tools-ui-kit-v2-speed-menu.d.ts +131 -0
  332. package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -28
  333. package/types/rt-tools-ui-kit-v2-split-button.d.ts +96 -55
  334. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +88 -60
  335. package/types/rt-tools-ui-kit-v2-stepper.d.ts +50 -37
  336. package/types/rt-tools-ui-kit-v2-table.d.ts +631 -480
  337. package/types/rt-tools-ui-kit-v2-tabs.d.ts +198 -113
  338. package/types/rt-tools-ui-kit-v2-tag.d.ts +106 -53
  339. package/types/rt-tools-ui-kit-v2-textarea.d.ts +48 -25
  340. package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +28 -26
  341. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +154 -94
  342. package/types/rt-tools-ui-kit-v2-timeline.d.ts +30 -28
  343. package/types/rt-tools-ui-kit-v2-toast.d.ts +174 -98
  344. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +132 -86
  345. package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +88 -50
  346. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +30 -27
  347. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +65 -41
  348. package/types/rt-tools-ui-kit-v2-tree-selector.d.ts +257 -0
  349. package/types/rt-tools-ui-kit-v2-tree.d.ts +282 -0
  350. package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +21 -24
  351. package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +195 -124
  352. package/types/rt-tools-ui-kit-v2-workspace.d.ts +122 -79
  353. package/types/rt-tools-ui-kit-v2.d.ts +100 -90
  354. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +0 -1
@@ -1,69 +1,79 @@
1
- import * as i0 from '@angular/core';
2
- import { AfterViewInit, OnDestroy, Signal, ElementRef, WritableSignal, InputSignal, OutputEmitterRef, InputSignalWithTransform, ModelSignal, TemplateRef, PipeTransform } from '@angular/core';
3
- import { RtFormControlBase, IQuillDelta, TRtKitLabelMap, IRtAiRunStatus, IRtTimeline, IRtIcon, IRtThreadList, IRtSideMenu } from '@rt-tools/ui-kit-v2';
4
- import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
5
- import { FormGroup, FormControl } from '@angular/forms';
6
-
1
+ import * as i0 from "@angular/core";
2
+ import { AfterViewInit, ElementRef, InputSignal, InputSignalWithTransform, ModelSignal, OnDestroy, OutputEmitterRef, PipeTransform, Signal, TemplateRef, WritableSignal } from "@angular/core";
3
+ import { IQuillDelta, IRtAiRunStatus, IRtIcon, IRtSideMenu, IRtThreadList, IRtTimeline, RtFormControlBase, TRtKitLabelMap } from "@rt-tools/ui-kit-v2";
4
+ import { BooleanInput, NumberInput } from "@angular/cdk/coercion";
5
+ import { FormControl, FormGroup } from "@angular/forms";
7
6
  /**
8
7
  * Режим тулбара: `full` — весь whitelist, `minimal` — жирный + два списка
9
8
  * (G113: чаты оператора/админа/саппорта).
10
9
  */
11
- type TRtRichEditorToolbar = 'full' | 'minimal';
10
+ export type TRtRichEditorToolbar = 'full' | 'minimal';
12
11
  /**
13
12
  * Rich-редактор чата на Quill. Наследует CVA-ядро input-семейства
14
13
  * (`RtFormControlBase`) — плагается в reactive-форму. Quill грузится **лениво**
15
14
  * (`import("quill")` в `ngAfterViewInit`), тип импортируется `import type` и в
16
15
  * бандл не попадает. Значение CVA — `IQuillDelta` (или `null`, когда пусто).
17
16
  */
18
- declare class RtRichEditorComponent extends RtFormControlBase<IQuillDelta | null> implements AfterViewInit, OnDestroy {
19
- #private;
20
- protected readonly editorHost: Signal<ElementRef<HTMLElement>>;
21
- /**
22
- * Смонтирована ли начинка редактора. Пока нет, хост несёт признак недостроенности: съёмке
23
- * витрины и любой другой проверке снаружи иначе нечем отличить недостроенный редактор от
24
- * достроенного пустого — оба выглядят пустым местом.
25
- */
26
- protected readonly mounted: WritableSignal<boolean>;
27
- protected readonly hasValue: Signal<boolean>;
28
- readonly placeholder: InputSignal<string>;
29
- /** Набор кнопок форматирования; сужает и принимаемые форматы (вставка из буфера). */
30
- readonly toolbar: InputSignal<TRtRichEditorToolbar>;
31
- /** Enter без Shift в редакторе — сигнал отправки (Shift+Enter остаётся переносом). */
32
- readonly enterPressed: OutputEmitterRef<void>;
33
- readonly displayText: Signal<string>;
34
- ngAfterViewInit(): Promise<void>;
35
- /** Ставит фокус в редактор; до загрузки Quill ничего не делает. */
36
- focus(): void;
37
- ngOnDestroy(): void;
38
- writeValue(value: IQuillDelta | null): void;
39
- setDisabledState(isDisabled: boolean): void;
40
- protected getEmptyValue(): IQuillDelta | null;
41
- protected focusAfterClear(): void;
42
- static ɵfac: i0.ɵɵFactoryDeclaration<RtRichEditorComponent, never>;
43
- static ɵcmp: i0.ɵɵComponentDeclaration<RtRichEditorComponent, "rt-rich-editor", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "toolbar": { "alias": "toolbar"; "required": false; "isSignal": true; }; }, { "enterPressed": "enterPressed"; }, never, never, true, never>;
17
+ export declare class RtRichEditorComponent extends RtFormControlBase<IQuillDelta | null> implements AfterViewInit, OnDestroy {
18
+ #private;
19
+ protected readonly editorHost: Signal<ElementRef<HTMLElement>>;
20
+ /**
21
+ * Смонтирована ли начинка редактора. Пока нет, хост несёт признак недостроенности: съёмке
22
+ * витрины и любой другой проверке снаружи иначе нечем отличить недостроенный редактор от
23
+ * достроенного пустого — оба выглядят пустым местом.
24
+ */
25
+ protected readonly mounted: WritableSignal<boolean>;
26
+ protected readonly hasValue: Signal<boolean>;
27
+ readonly placeholder: InputSignal<string>;
28
+ /** Набор кнопок форматирования; сужает и принимаемые форматы (вставка из буфера). */
29
+ readonly toolbar: InputSignal<TRtRichEditorToolbar>;
30
+ /** Enter без Shift в редакторе — сигнал отправки (Shift+Enter остаётся переносом). */
31
+ readonly enterPressed: OutputEmitterRef<void>;
32
+ readonly displayText: Signal<string>;
33
+ ngAfterViewInit(): Promise<void>;
34
+ /** Ставит фокус в редактор; до загрузки Quill ничего не делает. */
35
+ focus(): void;
36
+ ngOnDestroy(): void;
37
+ writeValue(value: IQuillDelta | null): void;
38
+ setDisabledState(isDisabled: boolean): void;
39
+ protected getEmptyValue(): IQuillDelta | null;
40
+ protected focusAfterClear(): void;
41
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtRichEditorComponent, never>;
42
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtRichEditorComponent, "rt-rich-editor", never, {
43
+ "placeholder": {
44
+ "alias": "placeholder";
45
+ "required": false;
46
+ "isSignal": true;
47
+ };
48
+ "toolbar": {
49
+ "alias": "toolbar";
50
+ "required": false;
51
+ "isSignal": true;
52
+ };
53
+ }, {
54
+ "enterPressed": "enterPressed";
55
+ }, never, never, true, never>;
44
56
  }
45
-
46
57
  /**
47
58
  * Модель `<rt-message-composer>`: один корневой неймспейс с
48
59
  * префиксом `I`.
49
60
  */
50
- declare namespace IRtMessageComposer {
51
- /** Полезная нагрузка отправки: текст сообщения + прикреплённые файлы. */
52
- interface SubmitPayload {
53
- text: string;
54
- files: File[];
55
- /**
56
- * Rich-тело строкой JSON (при `formatting`-режиме) — взаимоисключимо с
57
- * непустым `text`. `null`/отсутствует ⇒ отправляется plain-текст.
58
- */
59
- delta?: string | null;
60
- }
61
+ export declare namespace IRtMessageComposer {
62
+ /** Полезная нагрузка отправки: текст сообщения + прикреплённые файлы. */
63
+ interface SubmitPayload {
64
+ text: string;
65
+ files: File[];
66
+ /**
67
+ * Rich-тело строкой JSON (при `formatting`-режиме) — взаимоисключимо с
68
+ * непустым `text`. `null`/отсутствует ⇒ отправляется plain-текст.
69
+ */
70
+ delta?: string | null;
71
+ }
61
72
  }
62
-
63
73
  interface IComposerFormShape {
64
- message: FormControl<string>;
65
- files: FormControl<File[]>;
66
- delta: FormControl<IQuillDelta | null>;
74
+ message: FormControl<string>;
75
+ files: FormControl<File[]>;
76
+ delta: FormControl<IQuillDelta | null>;
67
77
  }
68
78
  /**
69
79
  * Композер сообщения — капсула: слева круглая кнопка вложения, по центру авто-растущая
@@ -76,72 +86,141 @@ interface IComposerFormShape {
76
86
  * Со `stoppable` во время `sending` вместо стрелки стоит кнопка «Стоп», а поле
77
87
  * остаётся открытым: следующий вопрос набирается, пока идёт ответ.
78
88
  */
79
- declare class RtMessageComposerComponent {
80
- #private;
81
- protected readonly t: Signal<TRtKitLabelMap>;
82
- protected readonly placeholderText: Signal<string>;
83
- protected readonly fileInput: Signal<ElementRef<HTMLInputElement> | undefined>;
84
- protected readonly textInput: Signal<ElementRef<HTMLTextAreaElement> | undefined>;
85
- protected readonly richEditor: Signal<RtRichEditorComponent | undefined>;
86
- protected readonly form: FormGroup<IComposerFormShape>;
87
- protected readonly files: Signal<readonly File[]>;
88
- /** Отправка доступна: есть контент (текст/delta/файлы), композер не занят. */
89
- protected readonly canSend: Signal<boolean>;
90
- /** Капсула выше одной строки: перенос текста, вложения или режим форматирования. */
91
- protected readonly tall: Signal<boolean>;
92
- /** Идёт ответ, который можно остановить: вместо стрелки — «Стоп», поле открыто. */
93
- protected readonly isStoppable: Signal<boolean>;
94
- protected readonly capsuleMods: Signal<Record<string, boolean>>;
95
- /** Текст-подсказка textarea. Пусто — берётся переведённое умолчание. */
96
- readonly placeholder: InputSignal<string>;
97
- /** Фильтр типов для file-input (`.pdf,.doc,...`). */
98
- readonly accept: InputSignal<string>;
99
- /** Строка под капсулой про Enter и Shift + Enter. */
100
- readonly hint: InputSignalWithTransform<boolean, BooleanInput>;
101
- /** Показывать кнопку вложения и список файлов. */
102
- readonly attachments: InputSignalWithTransform<boolean, BooleanInput>;
103
- /** Отправка в процессе — блокирует submit, кнопка отправки крутит индикатор. */
104
- readonly sending: InputSignalWithTransform<boolean, BooleanInput>;
105
- /**
106
- * Ответ на сообщение можно остановить. Во время `sending` стрелку сменяет кнопка
107
- * «Стоп», а поле не блокируется; без входа `sending` блокирует поле, как раньше.
108
- */
109
- readonly stoppable: InputSignalWithTransform<boolean, BooleanInput>;
110
- /** Полная блокировка композера. */
111
- readonly disabled: InputSignalWithTransform<boolean, BooleanInput>;
112
- /** Rich-режим: вместо textarea — Quill-редактор, отправка уходит delta-каналом. */
113
- readonly formatting: InputSignalWithTransform<boolean, BooleanInput>;
114
- /** Набор кнопок rich-редактора (проброс в `rt-rich-editor`). */
115
- readonly toolbar: InputSignal<TRtRichEditorToolbar>;
116
- /** Минимальная высота textarea в строках. */
117
- readonly minRows: InputSignalWithTransform<number, NumberInput>;
118
- /** Максимальная высота textarea в строках (дальше — скролл). */
119
- readonly maxRows: InputSignalWithTransform<number, NumberInput>;
120
- /**
121
- * Файлы, выброшенные drag-n-drop'ом в обёртку чата: пробрасываются сюда как
122
- * вложения. Каждый физический drop даёт новый массив, поэтому effect
123
- * перезапускается на каждое перетаскивание; файлы добавляются к уже выбранным.
124
- */
125
- readonly droppedFiles: InputSignal<File[] | null>;
126
- /** Отправка сообщения: текст + файлы (последние — только при `attachments`). */
127
- readonly submitted: OutputEmitterRef<IRtMessageComposer.SubmitPayload>;
128
- /** Черновик поля без форматирования: задаётся снаружи, правки уходят наружу, после отправки пуст. */
129
- readonly text: ModelSignal<string>;
130
- /** Клик по кнопке «Стоп» во время ответа, который можно остановить. */
131
- readonly stopped: OutputEmitterRef<void>;
132
- constructor();
133
- /** Ставит фокус в поле: в textarea, а в режиме форматирования — в rich-редактор. */
134
- focus(): void;
135
- protected onKeydown(event: KeyboardEvent): void;
136
- protected stop(): void;
137
- protected openPicker(): void;
138
- protected onFilesPicked(event: Event): void;
139
- protected removeFile(index: number): void;
140
- protected submit(): void;
141
- static ɵfac: i0.ɵɵFactoryDeclaration<RtMessageComposerComponent, never>;
142
- static ɵcmp: i0.ɵɵComponentDeclaration<RtMessageComposerComponent, "rt-message-composer", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "attachments": { "alias": "attachments"; "required": false; "isSignal": true; }; "sending": { "alias": "sending"; "required": false; "isSignal": true; }; "stoppable": { "alias": "stoppable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "formatting": { "alias": "formatting"; "required": false; "isSignal": true; }; "toolbar": { "alias": "toolbar"; "required": false; "isSignal": true; }; "minRows": { "alias": "minRows"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "droppedFiles": { "alias": "droppedFiles"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; }, { "submitted": "submitted"; "text": "textChange"; "stopped": "stopped"; }, never, never, true, never>;
89
+ export declare class RtMessageComposerComponent {
90
+ #private;
91
+ protected readonly t: Signal<TRtKitLabelMap>;
92
+ protected readonly placeholderText: Signal<string>;
93
+ protected readonly fileInput: Signal<ElementRef<HTMLInputElement> | undefined>;
94
+ protected readonly textInput: Signal<ElementRef<HTMLTextAreaElement> | undefined>;
95
+ protected readonly richEditor: Signal<RtRichEditorComponent | undefined>;
96
+ protected readonly form: FormGroup<IComposerFormShape>;
97
+ protected readonly files: Signal<readonly File[]>;
98
+ /** Отправка доступна: есть контент (текст/delta/файлы), композер не занят. */
99
+ protected readonly canSend: Signal<boolean>;
100
+ /** Капсула выше одной строки: перенос текста, вложения или режим форматирования. */
101
+ protected readonly tall: Signal<boolean>;
102
+ /** Идёт ответ, который можно остановить: вместо стрелки — «Стоп», поле открыто. */
103
+ protected readonly isStoppable: Signal<boolean>;
104
+ protected readonly capsuleMods: Signal<Record<string, boolean>>;
105
+ /** Текст-подсказка textarea. Пусто — берётся переведённое умолчание. */
106
+ readonly placeholder: InputSignal<string>;
107
+ /** Фильтр типов для file-input (`.pdf,.doc,...`). */
108
+ readonly accept: InputSignal<string>;
109
+ /** Строка под капсулой про Enter и Shift + Enter. */
110
+ readonly hint: InputSignalWithTransform<boolean, BooleanInput>;
111
+ /** Показывать кнопку вложения и список файлов. */
112
+ readonly attachments: InputSignalWithTransform<boolean, BooleanInput>;
113
+ /** Отправка в процессе — блокирует submit, кнопка отправки крутит индикатор. */
114
+ readonly sending: InputSignalWithTransform<boolean, BooleanInput>;
115
+ /**
116
+ * Ответ на сообщение можно остановить. Во время `sending` стрелку сменяет кнопка
117
+ * «Стоп», а поле не блокируется; без входа `sending` блокирует поле, как раньше.
118
+ */
119
+ readonly stoppable: InputSignalWithTransform<boolean, BooleanInput>;
120
+ /** Полная блокировка композера. */
121
+ readonly disabled: InputSignalWithTransform<boolean, BooleanInput>;
122
+ /** Rich-режим: вместо textarea — Quill-редактор, отправка уходит delta-каналом. */
123
+ readonly formatting: InputSignalWithTransform<boolean, BooleanInput>;
124
+ /** Набор кнопок rich-редактора (проброс в `rt-rich-editor`). */
125
+ readonly toolbar: InputSignal<TRtRichEditorToolbar>;
126
+ /** Минимальная высота textarea в строках. */
127
+ readonly minRows: InputSignalWithTransform<number, NumberInput>;
128
+ /** Максимальная высота textarea в строках (дальше — скролл). */
129
+ readonly maxRows: InputSignalWithTransform<number, NumberInput>;
130
+ /**
131
+ * Файлы, выброшенные drag-n-drop'ом в обёртку чата: пробрасываются сюда как
132
+ * вложения. Каждый физический drop даёт новый массив, поэтому effect
133
+ * перезапускается на каждое перетаскивание; файлы добавляются к уже выбранным.
134
+ */
135
+ readonly droppedFiles: InputSignal<File[] | null>;
136
+ /** Отправка сообщения: текст + файлы (последние — только при `attachments`). */
137
+ readonly submitted: OutputEmitterRef<IRtMessageComposer.SubmitPayload>;
138
+ /** Черновик поля без форматирования: задаётся снаружи, правки уходят наружу, после отправки пуст. */
139
+ readonly text: ModelSignal<string>;
140
+ /** Клик по кнопке «Стоп» во время ответа, который можно остановить. */
141
+ readonly stopped: OutputEmitterRef<void>;
142
+ constructor();
143
+ /** Ставит фокус в поле: в textarea, а в режиме форматирования — в rich-редактор. */
144
+ focus(): void;
145
+ protected onKeydown(event: KeyboardEvent): void;
146
+ protected stop(): void;
147
+ protected openPicker(): void;
148
+ protected onFilesPicked(event: Event): void;
149
+ protected removeFile(index: number): void;
150
+ protected submit(): void;
151
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtMessageComposerComponent, never>;
152
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtMessageComposerComponent, "rt-message-composer", never, {
153
+ "placeholder": {
154
+ "alias": "placeholder";
155
+ "required": false;
156
+ "isSignal": true;
157
+ };
158
+ "accept": {
159
+ "alias": "accept";
160
+ "required": false;
161
+ "isSignal": true;
162
+ };
163
+ "hint": {
164
+ "alias": "hint";
165
+ "required": false;
166
+ "isSignal": true;
167
+ };
168
+ "attachments": {
169
+ "alias": "attachments";
170
+ "required": false;
171
+ "isSignal": true;
172
+ };
173
+ "sending": {
174
+ "alias": "sending";
175
+ "required": false;
176
+ "isSignal": true;
177
+ };
178
+ "stoppable": {
179
+ "alias": "stoppable";
180
+ "required": false;
181
+ "isSignal": true;
182
+ };
183
+ "disabled": {
184
+ "alias": "disabled";
185
+ "required": false;
186
+ "isSignal": true;
187
+ };
188
+ "formatting": {
189
+ "alias": "formatting";
190
+ "required": false;
191
+ "isSignal": true;
192
+ };
193
+ "toolbar": {
194
+ "alias": "toolbar";
195
+ "required": false;
196
+ "isSignal": true;
197
+ };
198
+ "minRows": {
199
+ "alias": "minRows";
200
+ "required": false;
201
+ "isSignal": true;
202
+ };
203
+ "maxRows": {
204
+ "alias": "maxRows";
205
+ "required": false;
206
+ "isSignal": true;
207
+ };
208
+ "droppedFiles": {
209
+ "alias": "droppedFiles";
210
+ "required": false;
211
+ "isSignal": true;
212
+ };
213
+ "text": {
214
+ "alias": "text";
215
+ "required": false;
216
+ "isSignal": true;
217
+ };
218
+ }, {
219
+ "submitted": "submitted";
220
+ "text": "textChange";
221
+ "stopped": "stopped";
222
+ }, never, never, true, never>;
143
223
  }
144
-
145
224
  /**
146
225
  * Модель общего чат-компонента `rt-chat`: один корневой неймспейс
147
226
  * с префиксом `I`. Доменные стора маппят свою модель сообщения в `Message`, а сам
@@ -152,100 +231,99 @@ declare class RtMessageComposerComponent {
152
231
  * двойной чек, после того как собеседник открыл переписку — тот же чек синим,
153
232
  * при обрыве — «!» с повтором. Входящие сообщения статуса не имеют.
154
233
  */
155
- declare enum ERtChatMessageStatus {
156
- Sending = "sending",
157
- Sent = "sent",
158
- Read = "read",
159
- Failed = "failed"
234
+ export declare enum ERtChatMessageStatus {
235
+ Sending = "sending",
236
+ Sent = "sent",
237
+ Read = "read",
238
+ Failed = "failed"
160
239
  }
161
- declare namespace IRtChat {
162
- /** Алиас enum'а для доменных мапперов, работающих через неймспейс. */
163
- type MessageStatus = ERtChatMessageStatus;
240
+ export declare namespace IRtChat {
241
+ /** Алиас enum'а для доменных мапперов, работающих через неймспейс. */
242
+ type MessageStatus = ERtChatMessageStatus;
243
+ /**
244
+ * Есть ли у реплики доступные действия потребителя — гейт кнопки «…» у неё.
245
+ *
246
+ * Признак приходит предикатом, а не полем модели: действие, которого кит не знает,
247
+ * его моделью и не описывается.
248
+ */
249
+ type MessageActionsPredicate = (message: Message) => boolean;
250
+ /** Вложение сообщения — домен маппит свой ресурс, скачивание по `public_id`. */
251
+ interface Attachment {
252
+ id: number;
253
+ /** Обезличенное имя для карточки файла. */
254
+ name: string;
255
+ /** Непрозрачный идентификатор файла — консюмер качает blob по нему. */
256
+ publicId: string;
257
+ }
258
+ /**
259
+ * Одно сообщение треда в уже подготовленной для отображения форме: автор —
260
+ * готовый лейбл (домен решает, как его собрать), `own`/`system` — флаги
261
+ * выравнивания и стиля, дата — ISO-строка (форматируется `DatePipe` внутри).
262
+ */
263
+ interface Message {
264
+ /** Идентификатор сообщения — ключ `@for track`. */
265
+ id: number | string;
266
+ /** Клиентский временный id оптимистичного сообщения (до ответа сервера). */
267
+ tempId?: string;
164
268
  /**
165
- * Есть ли у реплики доступные действия потребителя — гейт кнопки «…» у неё.
166
- *
167
- * Признак приходит предикатом, а не полем модели: действие, которого кит не знает,
168
- * его моделью и не описывается.
269
+ * Статус своего сообщения. Отсутствует у входящих: чужому сообщению
270
+ * нечего сообщать о доставке.
169
271
  */
170
- type MessageActionsPredicate = (message: Message) => boolean;
171
- /** Вложение сообщения — домен маппит свой ресурс, скачивание по `public_id`. */
172
- interface Attachment {
173
- id: number;
174
- /** Обезличенное имя для карточки файла. */
175
- name: string;
176
- /** Непрозрачный идентификатор файла — консюмер качает blob по нему. */
177
- publicId: string;
178
- }
272
+ status?: MessageStatus;
273
+ /** Готовый лейбл автора (доменный authorLabel). */
274
+ author: string;
275
+ /** Сообщение текущего пользователя — выравнивается вправо, акцентный фон. */
276
+ own: boolean;
277
+ /** Признак системного сообщения (рендерится обычным входящим пузырём). */
278
+ system?: boolean;
279
+ text: string;
179
280
  /**
180
- * Одно сообщение треда в уже подготовленной для отображения форме: автор —
181
- * готовый лейбл (домен решает, как его собрать), `own`/`system` — флаги
182
- * выравнивания и стиля, дата — ISO-строка (форматируется `DatePipe` внутри).
281
+ * Rich-тело (Quill delta) — при наличии рендерится вместо plain `text`
282
+ * через `rt-delta-view`. `null`/отсутствует ⇒ показываем `text`.
183
283
  */
184
- interface Message {
185
- /** Идентификатор сообщения — ключ `@for track`. */
186
- id: number | string;
187
- /** Клиентский временный id оптимистичного сообщения (до ответа сервера). */
188
- tempId?: string;
189
- /**
190
- * Статус своего сообщения. Отсутствует у входящих: чужому сообщению
191
- * нечего сообщать о доставке.
192
- */
193
- status?: MessageStatus;
194
- /** Готовый лейбл автора (доменный authorLabel). */
195
- author: string;
196
- /** Сообщение текущего пользователя — выравнивается вправо, акцентный фон. */
197
- own: boolean;
198
- /** Признак системного сообщения (рендерится обычным входящим пузырём). */
199
- system?: boolean;
200
- text: string;
201
- /**
202
- * Rich-тело (Quill delta) — при наличии рендерится вместо plain `text`
203
- * через `rt-delta-view`. `null`/отсутствует ⇒ показываем `text`.
204
- */
205
- delta?: IQuillDelta | null;
206
- /** ISO-дата создания. */
207
- createdAt: string;
208
- /** URL вложения (если есть) — наличие включает карточку файла. */
209
- fileUrl?: string | null;
210
- /** Имя вложения для отображения в карточке. */
211
- fileName?: string | null;
212
- /**
213
- * Вложения сообщения (несколько файлов). Непустой массив имеет приоритет
214
- * над legacy-парой `fileUrl`/`fileName` (та равна первому вложению).
215
- */
216
- attachments?: readonly Attachment[];
217
- /** Внешняя ссылка-призыв (привязка Telegram) — наличие включает кнопку-ссылку. */
218
- deepLink?: string | null;
219
- /** Подпись кнопки-ссылки `deepLink` (домен решает текст по состоянию). */
220
- deepLinkLabel?: string | null;
221
- /** Сообщение помечено удалённым — рендерится плейсхолдером вместо содержимого. */
222
- deleted?: boolean;
223
- /** Показать действие «удалить» на этом сообщении (домен решает по правам/направлению). */
224
- canDelete?: boolean;
225
- /**
226
- * Текст подтверждения перед удалением. Задан — клик по корзине открывает
227
- * confirm-попап с этим текстом, удаление уходит только после подтверждения.
228
- * Пусто/undefined — удаление сразу по клику (домен без confirm-семантики).
229
- */
230
- deleteConfirm?: string;
231
- }
232
- /** Payload отправки: текст + файлы (пусто/undefined, если вложения выключены). */
233
- interface SendPayload {
234
- text: string;
235
- files?: File[];
236
- /**
237
- * Rich-тело строкой JSON (`JSON.stringify(getContents())`) — взаимоисключимо
238
- * с непустым `text`. При наличии домен шлёт delta-канал (`message:""`).
239
- */
240
- delta?: string | null;
241
- }
284
+ delta?: IQuillDelta | null;
285
+ /** ISO-дата создания. */
286
+ createdAt: string;
287
+ /** URL вложения (если есть) — наличие включает карточку файла. */
288
+ fileUrl?: string | null;
289
+ /** Имя вложения для отображения в карточке. */
290
+ fileName?: string | null;
291
+ /**
292
+ * Вложения сообщения (несколько файлов). Непустой массив имеет приоритет
293
+ * над legacy-парой `fileUrl`/`fileName` (та равна первому вложению).
294
+ */
295
+ attachments?: readonly Attachment[];
296
+ /** Внешняя ссылка-призыв (привязка Telegram) — наличие включает кнопку-ссылку. */
297
+ deepLink?: string | null;
298
+ /** Подпись кнопки-ссылки `deepLink` (домен решает текст по состоянию). */
299
+ deepLinkLabel?: string | null;
300
+ /** Сообщение помечено удалённым — рендерится плейсхолдером вместо содержимого. */
301
+ deleted?: boolean;
302
+ /** Показать действие «удалить» на этом сообщении (домен решает по правам/направлению). */
303
+ canDelete?: boolean;
304
+ /**
305
+ * Текст подтверждения перед удалением. Задан — клик по корзине открывает
306
+ * confirm-попап с этим текстом, удаление уходит только после подтверждения.
307
+ * Пусто/undefined — удаление сразу по клику (домен без confirm-семантики).
308
+ */
309
+ deleteConfirm?: string;
310
+ }
311
+ /** Payload отправки: текст + файлы (пусто/undefined, если вложения выключены). */
312
+ interface SendPayload {
313
+ text: string;
314
+ files?: File[];
315
+ /**
316
+ * Rich-тело строкой JSON (`JSON.stringify(getContents())`) — взаимоисключимо
317
+ * с непустым `text`. При наличии домен шлёт delta-канал (`message:""`).
318
+ */
319
+ delta?: string | null;
320
+ }
242
321
  }
243
-
244
322
  /**
245
323
  * Контекст шаблона `[rtChatMessageActions]`: `$implicit` — реплика треда.
246
324
  */
247
- interface IRtChatMessageActionsContext {
248
- $implicit: IRtChat.Message;
325
+ export interface IRtChatMessageActionsContext {
326
+ $implicit: IRtChat.Message;
249
327
  }
250
328
  /**
251
329
  * Захватывает `<ng-template rtChatMessageActions let-message>` — содержимое «…»-меню
@@ -269,14 +347,13 @@ interface IRtChatMessageActionsContext {
269
347
  * </rt-chat>
270
348
  * ```
271
349
  */
272
- declare class RtChatMessageActionsDirective {
273
- readonly template: TemplateRef<IRtChatMessageActionsContext>;
274
- /** Type-guard: сужает контекст шаблона до реплики при проверке шаблонов. */
275
- static ngTemplateContextGuard(_directive: RtChatMessageActionsDirective, context: unknown): context is IRtChatMessageActionsContext;
276
- static ɵfac: i0.ɵɵFactoryDeclaration<RtChatMessageActionsDirective, never>;
277
- static ɵdir: i0.ɵɵDirectiveDeclaration<RtChatMessageActionsDirective, "ng-template[rtChatMessageActions]", never, {}, {}, never, never, true, never>;
350
+ export declare class RtChatMessageActionsDirective {
351
+ readonly template: TemplateRef<IRtChatMessageActionsContext>;
352
+ /** Type-guard: сужает контекст шаблона до реплики при проверке шаблонов. */
353
+ static ngTemplateContextGuard(_directive: RtChatMessageActionsDirective, context: unknown): context is IRtChatMessageActionsContext;
354
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtChatMessageActionsDirective, never>;
355
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RtChatMessageActionsDirective, "ng-template[rtChatMessageActions]", never, {}, {}, never, never, true, never>;
278
356
  }
279
-
280
357
  /**
281
358
  * Общий презентационный чат: тред сообщений + композер. История приходит готовым массивом
282
359
  * `IRtChat.Message[]`, отправка, обновление, скачивание и набор текста уходят наружу выходами;
@@ -284,164 +361,273 @@ declare class RtChatMessageActionsDirective {
284
361
  * режим — overlay внутри компонента (`--expanded`). Шапка рисуется, только когда включена хотя бы
285
362
  * одна из иконок `showRefresh`/`showExpand`: в диалогах своя header-обёртка.
286
363
  */
287
- declare class RtChatComponent {
288
- #private;
289
- /**
290
- * Дата форматируется по активной локали приложения, а не по `LOCALE_ID`: тот вычисляется на
291
- * подъёме и при смене языка на ходу оставил бы прежний формат. Данные локали для `DatePipe`
292
- * регистрирует приложение: без них пайп падает `Missing locale data`.
293
- */
294
- protected readonly t: Signal<TRtKitLabelMap>;
295
- protected readonly locale: Signal<string>;
296
- /**
297
- * Скролл-контейнер треда — для автопрокрутки к последнему сообщению.
298
- * `viewChild` не работает на ES-private (`#`) поле, поэтому `protected`.
299
- */
300
- protected readonly thread: Signal<ElementRef<HTMLElement> | undefined>;
301
- /** Скрытый нативный input — открывается кнопкой-скрепкой внутри поля ввода. */
302
- protected readonly composerFileEl: Signal<ElementRef<HTMLInputElement> | undefined>;
303
- protected readonly attachmentFallbackName: Signal<string>;
304
- /** Подписи с учётом того, что передал хозяин компонента: своё важнее умолчания */
305
- protected readonly titleText: Signal<string>;
306
- protected readonly placeholderText: Signal<string>;
307
- protected readonly emptyHintText: Signal<string>;
308
- protected readonly MessageStatus: typeof ERtChatMessageStatus;
309
- /** Плейсхолдеры скелетонов треда при первичной загрузке. */
310
- protected readonly skeletonRows: readonly number[];
311
- /** Полноэкранный режим (overlay поверх страницы). */
312
- protected readonly expanded: WritableSignal<boolean>;
313
- protected readonly replyForm: FormGroup<{
314
- message: FormControl<string>;
315
- files: FormControl<File[]>;
316
- }>;
317
- /** Композер заблокирован при загрузке/рефреше треда или отправке in-flight. */
318
- protected readonly composerDisabled: Signal<boolean>;
319
- /**
320
- * Можно ли отправить: композер активен и есть содержимое — непустой текст или
321
- * (при включённых вложениях) хотя бы один файл. Сообщение само по себе не
322
- * бывает «невалидным» — пустоту гасим дизейблом кнопки, а не подсветкой поля.
323
- */
324
- protected readonly canSend: Signal<boolean>;
325
- /** Показывать ли шапку: только когда включена хотя бы одна иконка. */
326
- protected readonly showHeader: Signal<boolean>;
327
- /** Подпись кнопки fullscreen: тернарник в шаблоне переводом не покрыть. */
328
- protected readonly expandLabel: Signal<string>;
329
- /** Выбранные, но ещё не отправленные файлы — карточки над полем ввода. */
330
- protected readonly selectedFiles: Signal<File[]>;
331
- /**
332
- * Drop-зона активна только когда вложения включены, ответ доступен и композер
333
- * не занят (загрузка/рефреш/отправка). Иначе обёртка `rt-file-drop` просто
334
- * пропускает контент без оверлея.
335
- */
336
- protected readonly dropDisabled: Signal<boolean>;
337
- /**
338
- * Файл из drag-n-drop для rich-композера: каждый drop кладёт новый `File`,
339
- * пробрасывается в `rt-message-composer` через input. Классический композер
340
- * принимает drop напрямую в свой `replyForm`.
341
- */
342
- protected readonly droppedFiles: WritableSignal<File[] | null>;
343
- /**
344
- * Шаблон действий у реплики: `<ng-template rtChatMessageActions let-message>`.
345
- *
346
- * Не объявлен — разметка реплики прежняя, и лишней кнопки у неё не появляется.
347
- */
348
- protected readonly messageActions: Signal<RtChatMessageActionsDirective | undefined>;
349
- /** История сообщений (consumer уже смаппил из доменной модели). */
350
- readonly messages: InputSignal<readonly IRtChat.Message[]>;
351
- /** Первичная загрузка — скелетоны вместо треда. */
352
- readonly loading: InputSignalWithTransform<boolean, BooleanInput>;
353
- /** Рефреш при наличии данных — тред остаётся, композер дизейблится. */
354
- readonly fetching: InputSignalWithTransform<boolean, BooleanInput>;
355
- /** Доступна ли отправка (иначе вместо композера — note с причиной). */
356
- readonly canReply: InputSignalWithTransform<boolean, BooleanInput>;
357
- /** Причина блокировки ответа — note под тредом. */
358
- readonly replyBlockReason: InputSignal<string | null>;
359
- /** Отправка in-flight — спиннер/дизейбл на кнопке. */
360
- readonly sending: InputSignalWithTransform<boolean, BooleanInput>;
361
- /**
362
- * Подписи по умолчанию приходят пустыми и переводятся ниже: значение
363
- * `input()` вычисляется при создании компонента, и готовый перевод застыл бы
364
- * на языке, активном в этот момент.
365
- */
366
- readonly placeholder: InputSignal<string>;
367
- readonly title: InputSignal<string>;
368
- /** Текст, когда треда ещё нет (заявка не создана). */
369
- readonly emptyHint: InputSignal<string>;
370
- /** Есть ли тред (иначе показываем `emptyHint`). */
371
- readonly hasThread: InputSignalWithTransform<boolean, BooleanInput>;
372
- /** Включить загрузку файлов в композере. */
373
- readonly attachments: InputSignalWithTransform<boolean, BooleanInput>;
374
- /** `accept` для file-input (`.pdf,.doc,...`). */
375
- readonly accept: InputSignal<string>;
376
- /**
377
- * Компактный композер (`rt-message-composer`): авто-растущая textarea над
378
- * разделителем + ряд иконок (прикрепить слева, отправить справа) вместо
379
- * классического вертикального стека. По умолчанию выключен.
380
- */
381
- readonly richComposer: InputSignalWithTransform<boolean, BooleanInput>;
382
- /**
383
- * Rich-текст в композере (Quill delta). Требует `richComposer` — форматирование
384
- * живёт только в компактном композере. Отправка уходит delta-каналом.
385
- */
386
- readonly formatting: InputSignalWithTransform<boolean, BooleanInput>;
387
- /** Набор кнопок rich-редактора (проброс до `rt-rich-editor` через композер). */
388
- readonly formattingToolbar: InputSignal<TRtRichEditorToolbar>;
389
- /**
390
- * Растягивать чат на всю высоту контейнера: тред занимает свободное место,
391
- * композер прижат к низу. По умолчанию выключен (тред с фикс. max-height).
392
- * Требует, чтобы родитель давал высоту (flex-цепочка).
393
- */
394
- readonly fill: InputSignalWithTransform<boolean, BooleanInput>;
395
- /** Показать иконку refresh в шапке. */
396
- readonly showRefresh: InputSignalWithTransform<boolean, BooleanInput>;
397
- /** Показать иконку expand (fullscreen) в шапке. */
398
- readonly showExpand: InputSignalWithTransform<boolean, BooleanInput>;
399
- /** Отправка сообщения (+файлы) — consumer вызывает свой store/api. */
400
- readonly send: OutputEmitterRef<IRtChat.SendPayload>;
401
- /** Клик refresh — consumer перетягивает тред. */
402
- readonly refresh: OutputEmitterRef<void>;
403
- /** Клик по вложению — consumer качает blob своим api; шаблон зовёт выход прямо, без релея. */
404
- readonly downloadFile: OutputEmitterRef<IRtChat.Message>;
405
- /** Клик по карточке вложения из `attachments[]` — консюмер качает по `publicId`. */
406
- readonly downloadAttachment: OutputEmitterRef<IRtChat.Attachment>;
407
- /** Набор текста в поле ответа: `true` — отрезок начался, `false` — кончился. */
408
- readonly typing: OutputEmitterRef<boolean>;
409
- /** Строка о том, что печатает вторая сторона, поверх низа ленты; пустая прячет плашку. */
410
- readonly typingText: InputSignal<string>;
411
- /** Смена fullscreen-состояния. */
412
- readonly expandedChange: OutputEmitterRef<boolean>;
413
- readonly deleteMessage: OutputEmitterRef<IRtChat.Message>;
414
- /** Повторная отправка своего сообщения со статусом `failed`. */
415
- readonly retryMessage: OutputEmitterRef<IRtChat.Message>;
416
- /**
417
- * Есть ли у реплики действия потребителя — гейт кнопки «…» у неё.
418
- *
419
- * Не задан — точка действий показывается у каждой реплики: экран, который ничего не
420
- * гейтит, показывает её так же, как это делает строка таблицы.
421
- */
422
- readonly messageHasActions: InputSignal<IRtChat.MessageActionsPredicate | null>;
423
- constructor();
424
- protected onSubmit(): void;
425
- protected onComposerKeydown(event: KeyboardEvent): void;
426
- /** Релей submit'а от `rt-message-composer` (rich-режим) наружу как `send`. */
427
- protected onComposerSubmit(payload: IRtMessageComposer.SubmitPayload): void;
428
- /** Ввод в поле ответа любого из двух режимов; выбор файла набором не считается. */
429
- protected onReplyInput(event: Event): void;
430
- /**
431
- * Файлы выброшены в обёртку чата: в rich-режиме отдаём массив композеру через
432
- * input, в классическом — добавляем к уже выбранным в собственном `replyForm`.
433
- */
434
- protected onFilesDropped(files: File[]): void;
435
- protected openFilePicker(): void;
436
- protected onFilesPicked(event: Event): void;
437
- protected removeFile(index: number): void;
438
- /** Признак «читатель у нижнего края» обновляется по прокрутке: на нём стоит автопрокрутка. */
439
- protected onThreadScroll(): void;
440
- protected toggleExpand(): void;
441
- static ɵfac: i0.ɵɵFactoryDeclaration<RtChatComponent, 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>;
364
+ export declare class RtChatComponent {
365
+ #private;
366
+ /**
367
+ * Дата форматируется по активной локали приложения, а не по `LOCALE_ID`: тот вычисляется на
368
+ * подъёме и при смене языка на ходу оставил бы прежний формат. Данные локали для `DatePipe`
369
+ * регистрирует приложение: без них пайп падает `Missing locale data`.
370
+ */
371
+ protected readonly t: Signal<TRtKitLabelMap>;
372
+ protected readonly locale: Signal<string>;
373
+ /**
374
+ * Скролл-контейнер треда — для автопрокрутки к последнему сообщению.
375
+ * `viewChild` не работает на ES-private (`#`) поле, поэтому `protected`.
376
+ */
377
+ protected readonly thread: Signal<ElementRef<HTMLElement> | undefined>;
378
+ /** Скрытый нативный input — открывается кнопкой-скрепкой внутри поля ввода. */
379
+ protected readonly composerFileEl: Signal<ElementRef<HTMLInputElement> | undefined>;
380
+ protected readonly attachmentFallbackName: Signal<string>;
381
+ /** Подписи с учётом того, что передал хозяин компонента: своё важнее умолчания */
382
+ protected readonly titleText: Signal<string>;
383
+ protected readonly placeholderText: Signal<string>;
384
+ protected readonly emptyHintText: Signal<string>;
385
+ protected readonly MessageStatus: typeof ERtChatMessageStatus;
386
+ /** Плейсхолдеры скелетонов треда при первичной загрузке. */
387
+ protected readonly skeletonRows: readonly number[];
388
+ /** Полноэкранный режим (overlay поверх страницы). */
389
+ protected readonly expanded: WritableSignal<boolean>;
390
+ protected readonly replyForm: FormGroup<{
391
+ message: FormControl<string>;
392
+ files: FormControl<File[]>;
393
+ }>;
394
+ /** Композер заблокирован при загрузке/рефреше треда или отправке in-flight. */
395
+ protected readonly composerDisabled: Signal<boolean>;
396
+ /**
397
+ * Можно ли отправить: композер активен и есть содержимое — непустой текст или
398
+ * (при включённых вложениях) хотя бы один файл. Сообщение само по себе не
399
+ * бывает «невалидным» — пустоту гасим дизейблом кнопки, а не подсветкой поля.
400
+ */
401
+ protected readonly canSend: Signal<boolean>;
402
+ /** Показывать ли шапку: только когда включена хотя бы одна иконка. */
403
+ protected readonly showHeader: Signal<boolean>;
404
+ /** Подпись кнопки fullscreen: тернарник в шаблоне переводом не покрыть. */
405
+ protected readonly expandLabel: Signal<string>;
406
+ /** Выбранные, но ещё не отправленные файлы — карточки над полем ввода. */
407
+ protected readonly selectedFiles: Signal<File[]>;
408
+ /**
409
+ * Drop-зона активна только когда вложения включены, ответ доступен и композер
410
+ * не занят (загрузка/рефреш/отправка). Иначе обёртка `rt-file-drop` просто
411
+ * пропускает контент без оверлея.
412
+ */
413
+ protected readonly dropDisabled: Signal<boolean>;
414
+ /**
415
+ * Файл из drag-n-drop для rich-композера: каждый drop кладёт новый `File`,
416
+ * пробрасывается в `rt-message-composer` через input. Классический композер
417
+ * принимает drop напрямую в свой `replyForm`.
418
+ */
419
+ protected readonly droppedFiles: WritableSignal<File[] | null>;
420
+ /**
421
+ * Шаблон действий у реплики: `<ng-template rtChatMessageActions let-message>`.
422
+ *
423
+ * Не объявлен — разметка реплики прежняя, и лишней кнопки у неё не появляется.
424
+ */
425
+ protected readonly messageActions: Signal<RtChatMessageActionsDirective | undefined>;
426
+ /** История сообщений (consumer уже смаппил из доменной модели). */
427
+ readonly messages: InputSignal<readonly IRtChat.Message[]>;
428
+ /** Первичная загрузка — скелетоны вместо треда. */
429
+ readonly loading: InputSignalWithTransform<boolean, BooleanInput>;
430
+ /** Рефреш при наличии данных — тред остаётся, композер дизейблится. */
431
+ readonly fetching: InputSignalWithTransform<boolean, BooleanInput>;
432
+ /** Доступна ли отправка (иначе вместо композера — note с причиной). */
433
+ readonly canReply: InputSignalWithTransform<boolean, BooleanInput>;
434
+ /** Причина блокировки ответа — note под тредом. */
435
+ readonly replyBlockReason: InputSignal<string | null>;
436
+ /** Отправка in-flight — спиннер/дизейбл на кнопке. */
437
+ readonly sending: InputSignalWithTransform<boolean, BooleanInput>;
438
+ /**
439
+ * Подписи по умолчанию приходят пустыми и переводятся ниже: значение
440
+ * `input()` вычисляется при создании компонента, и готовый перевод застыл бы
441
+ * на языке, активном в этот момент.
442
+ */
443
+ readonly placeholder: InputSignal<string>;
444
+ readonly title: InputSignal<string>;
445
+ /** Текст, когда треда ещё нет (заявка не создана). */
446
+ readonly emptyHint: InputSignal<string>;
447
+ /** Есть ли тред (иначе показываем `emptyHint`). */
448
+ readonly hasThread: InputSignalWithTransform<boolean, BooleanInput>;
449
+ /** Включить загрузку файлов в композере. */
450
+ readonly attachments: InputSignalWithTransform<boolean, BooleanInput>;
451
+ /** `accept` для file-input (`.pdf,.doc,...`). */
452
+ readonly accept: InputSignal<string>;
453
+ /**
454
+ * Компактный композер (`rt-message-composer`): авто-растущая textarea над
455
+ * разделителем + ряд иконок (прикрепить слева, отправить справа) вместо
456
+ * классического вертикального стека. По умолчанию выключен.
457
+ */
458
+ readonly richComposer: InputSignalWithTransform<boolean, BooleanInput>;
459
+ /**
460
+ * Rich-текст в композере (Quill delta). Требует `richComposer` — форматирование
461
+ * живёт только в компактном композере. Отправка уходит delta-каналом.
462
+ */
463
+ readonly formatting: InputSignalWithTransform<boolean, BooleanInput>;
464
+ /** Набор кнопок rich-редактора (проброс до `rt-rich-editor` через композер). */
465
+ readonly formattingToolbar: InputSignal<TRtRichEditorToolbar>;
466
+ /**
467
+ * Растягивать чат на всю высоту контейнера: тред занимает свободное место,
468
+ * композер прижат к низу. По умолчанию выключен (тред с фикс. max-height).
469
+ * Требует, чтобы родитель давал высоту (flex-цепочка).
470
+ */
471
+ readonly fill: InputSignalWithTransform<boolean, BooleanInput>;
472
+ /** Показать иконку refresh в шапке. */
473
+ readonly showRefresh: InputSignalWithTransform<boolean, BooleanInput>;
474
+ /** Показать иконку expand (fullscreen) в шапке. */
475
+ readonly showExpand: InputSignalWithTransform<boolean, BooleanInput>;
476
+ /** Отправка сообщения (+файлы) — consumer вызывает свой store/api. */
477
+ readonly send: OutputEmitterRef<IRtChat.SendPayload>;
478
+ /** Клик refresh — consumer перетягивает тред. */
479
+ readonly refresh: OutputEmitterRef<void>;
480
+ /** Клик по вложению — consumer качает blob своим api; шаблон зовёт выход прямо, без релея. */
481
+ readonly downloadFile: OutputEmitterRef<IRtChat.Message>;
482
+ /** Клик по карточке вложения из `attachments[]` — консюмер качает по `publicId`. */
483
+ readonly downloadAttachment: OutputEmitterRef<IRtChat.Attachment>;
484
+ /** Набор текста в поле ответа: `true` — отрезок начался, `false` — кончился. */
485
+ readonly typing: OutputEmitterRef<boolean>;
486
+ /** Строка о том, что печатает вторая сторона, поверх низа ленты; пустая прячет плашку. */
487
+ readonly typingText: InputSignal<string>;
488
+ /** Смена fullscreen-состояния. */
489
+ readonly expandedChange: OutputEmitterRef<boolean>;
490
+ readonly deleteMessage: OutputEmitterRef<IRtChat.Message>;
491
+ /** Повторная отправка своего сообщения со статусом `failed`. */
492
+ readonly retryMessage: OutputEmitterRef<IRtChat.Message>;
493
+ /**
494
+ * Есть ли у реплики действия потребителя — гейт кнопки «…» у неё.
495
+ *
496
+ * Не задан — точка действий показывается у каждой реплики: экран, который ничего не
497
+ * гейтит, показывает её так же, как это делает строка таблицы.
498
+ */
499
+ readonly messageHasActions: InputSignal<IRtChat.MessageActionsPredicate | null>;
500
+ constructor();
501
+ protected onSubmit(): void;
502
+ protected onComposerKeydown(event: KeyboardEvent): void;
503
+ /** Релей submit'а от `rt-message-composer` (rich-режим) наружу как `send`. */
504
+ protected onComposerSubmit(payload: IRtMessageComposer.SubmitPayload): void;
505
+ /** Ввод в поле ответа любого из двух режимов; выбор файла набором не считается. */
506
+ protected onReplyInput(event: Event): void;
507
+ /**
508
+ * Файлы выброшены в обёртку чата: в rich-режиме отдаём массив композеру через
509
+ * input, в классическом — добавляем к уже выбранным в собственном `replyForm`.
510
+ */
511
+ protected onFilesDropped(files: File[]): void;
512
+ protected openFilePicker(): void;
513
+ protected onFilesPicked(event: Event): void;
514
+ protected removeFile(index: number): void;
515
+ /** Признак «читатель у нижнего края» обновляется по прокрутке: на нём стоит автопрокрутка. */
516
+ protected onThreadScroll(): void;
517
+ protected toggleExpand(): void;
518
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtChatComponent, never>;
519
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtChatComponent, "rt-chat", never, {
520
+ "messages": {
521
+ "alias": "messages";
522
+ "required": false;
523
+ "isSignal": true;
524
+ };
525
+ "loading": {
526
+ "alias": "loading";
527
+ "required": false;
528
+ "isSignal": true;
529
+ };
530
+ "fetching": {
531
+ "alias": "fetching";
532
+ "required": false;
533
+ "isSignal": true;
534
+ };
535
+ "canReply": {
536
+ "alias": "canReply";
537
+ "required": false;
538
+ "isSignal": true;
539
+ };
540
+ "replyBlockReason": {
541
+ "alias": "replyBlockReason";
542
+ "required": false;
543
+ "isSignal": true;
544
+ };
545
+ "sending": {
546
+ "alias": "sending";
547
+ "required": false;
548
+ "isSignal": true;
549
+ };
550
+ "placeholder": {
551
+ "alias": "placeholder";
552
+ "required": false;
553
+ "isSignal": true;
554
+ };
555
+ "title": {
556
+ "alias": "title";
557
+ "required": false;
558
+ "isSignal": true;
559
+ };
560
+ "emptyHint": {
561
+ "alias": "emptyHint";
562
+ "required": false;
563
+ "isSignal": true;
564
+ };
565
+ "hasThread": {
566
+ "alias": "hasThread";
567
+ "required": false;
568
+ "isSignal": true;
569
+ };
570
+ "attachments": {
571
+ "alias": "attachments";
572
+ "required": false;
573
+ "isSignal": true;
574
+ };
575
+ "accept": {
576
+ "alias": "accept";
577
+ "required": false;
578
+ "isSignal": true;
579
+ };
580
+ "richComposer": {
581
+ "alias": "richComposer";
582
+ "required": false;
583
+ "isSignal": true;
584
+ };
585
+ "formatting": {
586
+ "alias": "formatting";
587
+ "required": false;
588
+ "isSignal": true;
589
+ };
590
+ "formattingToolbar": {
591
+ "alias": "formattingToolbar";
592
+ "required": false;
593
+ "isSignal": true;
594
+ };
595
+ "fill": {
596
+ "alias": "fill";
597
+ "required": false;
598
+ "isSignal": true;
599
+ };
600
+ "showRefresh": {
601
+ "alias": "showRefresh";
602
+ "required": false;
603
+ "isSignal": true;
604
+ };
605
+ "showExpand": {
606
+ "alias": "showExpand";
607
+ "required": false;
608
+ "isSignal": true;
609
+ };
610
+ "typingText": {
611
+ "alias": "typingText";
612
+ "required": false;
613
+ "isSignal": true;
614
+ };
615
+ "messageHasActions": {
616
+ "alias": "messageHasActions";
617
+ "required": false;
618
+ "isSignal": true;
619
+ };
620
+ }, {
621
+ "send": "send";
622
+ "refresh": "refresh";
623
+ "downloadFile": "downloadFile";
624
+ "downloadAttachment": "downloadAttachment";
625
+ "typing": "typing";
626
+ "expandedChange": "expandedChange";
627
+ "deleteMessage": "deleteMessage";
628
+ "retryMessage": "retryMessage";
629
+ }, ["messageActions"], ["[rtChatHeaderActions]", "[rtChatFooter]"], true, never>;
443
630
  }
444
-
445
631
  /**
446
632
  * Есть ли у реплики хотя бы одно доступное действие потребителя.
447
633
  *
@@ -453,8 +639,7 @@ declare class RtChatComponent {
453
639
  * показывает кнопку меню. Так же это устроено у строки таблицы, и расхождение между
454
640
  * двумя точками проекции одного кита читалось бы дефектом.
455
641
  */
456
- declare function messageHasAvailableActions(message: IRtChat.Message, hasActions: IRtChat.MessageActionsPredicate | null): boolean;
457
-
642
+ export declare function messageHasAvailableActions(message: IRtChat.Message, hasActions: IRtChat.MessageActionsPredicate | null): boolean;
458
643
  /**
459
644
  * Есть ли у реплики доступные действия — гейт кнопки «…» у неё.
460
645
  *
@@ -462,17 +647,16 @@ declare function messageHasAvailableActions(message: IRtChat.Message, hasActions
462
647
  * цикле проверки. Значение приходит из контекста шаблона (реплика треда), поэтому
463
648
  * `computed()` здесь неприменим.
464
649
  */
465
- declare class RtChatMessageHasActionsPipe implements PipeTransform {
466
- transform(message: IRtChat.Message, hasActions: IRtChat.MessageActionsPredicate | null): boolean;
467
- static ɵfac: i0.ɵɵFactoryDeclaration<RtChatMessageHasActionsPipe, never>;
468
- static ɵpipe: i0.ɵɵPipeDeclaration<RtChatMessageHasActionsPipe, "rtChatMessageHasActions", true>;
650
+ export declare class RtChatMessageHasActionsPipe implements PipeTransform {
651
+ transform(message: IRtChat.Message, hasActions: IRtChat.MessageActionsPredicate | null): boolean;
652
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtChatMessageHasActionsPipe, never>;
653
+ static ɵpipe: i0.ɵɵPipeDeclaration<RtChatMessageHasActionsPipe, "rtChatMessageHasActions", true>;
469
654
  }
470
-
471
655
  /**
472
656
  * Статус уже сохранённого своего сообщения: сервер знает только, дошло ли оно до
473
657
  * собеседника. Часы и ошибка — состояния клиентской очереди, сюда не попадают.
474
658
  */
475
- declare function deliveryStatus(read: boolean): ERtChatMessageStatus;
659
+ export declare function deliveryStatus(read: boolean): ERtChatMessageStatus;
476
660
  /**
477
661
  * Сообщение, ещё не подтверждённое сервером. Серверного id и ссылок на вложения
478
662
  * у него нет: есть клиентский ключ, текст и выбранные файлы.
@@ -481,13 +665,13 @@ declare function deliveryStatus(read: boolean): ERtChatMessageStatus;
481
665
  * чём, а хранят его стороны по-разному: одна шлёт обычный текст, другая —
482
666
  * строку композера, которая в том же виде уходит на сервер.
483
667
  */
484
- interface IRtPendingMessage {
485
- tempId: string;
486
- text: string;
487
- delta?: IQuillDelta | null;
488
- createdAt: string;
489
- status: IRtChat.MessageStatus;
490
- files: readonly File[];
668
+ export interface IRtPendingMessage {
669
+ tempId: string;
670
+ text: string;
671
+ delta?: IQuillDelta | null;
672
+ createdAt: string;
673
+ status: IRtChat.MessageStatus;
674
+ files: readonly File[];
491
675
  }
492
676
  /**
493
677
  * Неподтверждённое сообщение → строка ленты. Показывается сразу после отправки:
@@ -495,25 +679,25 @@ interface IRtPendingMessage {
495
679
  *
496
680
  * Скрыть такое сообщение нельзя: на сервере его ещё нет, и удалять нечего.
497
681
  */
498
- declare function pendingToRtMessage(pending: IRtPendingMessage, authorLabel: string): IRtChat.Message;
682
+ export declare function pendingToRtMessage(pending: IRtPendingMessage, authorLabel: string): IRtChat.Message;
499
683
  /**
500
684
  * Структурный контракт доменного сообщения, достаточный для маппинга в
501
685
  * `IRtChat.Message`. Доменные модели удовлетворяют ему по форме;
502
686
  * роль-специфика (автор/own/system) задаётся опциями.
503
687
  */
504
- interface IRtMappableMessage {
505
- id: string | number;
506
- tempId?: string;
507
- status?: IRtChat.MessageStatus;
508
- message: string;
509
- messageDelta: IQuillDelta | null;
510
- createdAt: string;
511
- fileUrl: string | null;
512
- attachments: readonly {
513
- id: number;
514
- name: string;
515
- publicId: string;
516
- }[];
688
+ export interface IRtMappableMessage {
689
+ id: string | number;
690
+ tempId?: string;
691
+ status?: IRtChat.MessageStatus;
692
+ message: string;
693
+ messageDelta: IQuillDelta | null;
694
+ createdAt: string;
695
+ fileUrl: string | null;
696
+ attachments: readonly {
697
+ id: number;
698
+ name: string;
699
+ publicId: string;
700
+ }[];
517
701
  }
518
702
  /**
519
703
  * Опции маппинга: роль-специфичные куски, которые не вывести из общего контракта.
@@ -525,12 +709,12 @@ interface IRtMappableMessage {
525
709
  * - `optimistic` — включить `tempId`/`status` (оптимистичная отправка); по умолчанию да.
526
710
  * Для read-only тредов (агент) — `false`: тогда `id` берётся из серверного `id`.
527
711
  */
528
- interface IToRtMessageOptions<TMessage extends IRtMappableMessage> {
529
- roleLabel: (message: TMessage) => string;
530
- isOwn: (message: TMessage) => boolean;
531
- isSystem?: (message: TMessage) => boolean;
532
- fileName?: (message: TMessage) => string | null;
533
- optimistic?: boolean;
712
+ export interface IToRtMessageOptions<TMessage extends IRtMappableMessage> {
713
+ roleLabel: (message: TMessage) => string;
714
+ isOwn: (message: TMessage) => boolean;
715
+ isSystem?: (message: TMessage) => boolean;
716
+ fileName?: (message: TMessage) => string | null;
717
+ optimistic?: boolean;
534
718
  }
535
719
  /**
536
720
  * Собрать `IRtChat.Message` из доменного сообщения. Общие поля (текст, delta,
@@ -538,78 +722,75 @@ interface IToRtMessageOptions<TMessage extends IRtMappableMessage> {
538
722
  * из опций. Ключ `id` — `tempId ?? id` в оптимистичном режиме (пока сервер не
539
723
  * подтвердил), иначе серверный `id`.
540
724
  */
541
- declare function toRtMessage<TMessage extends IRtMappableMessage>(message: TMessage, options: IToRtMessageOptions<TMessage>): IRtChat.Message;
542
-
543
- declare namespace IRtAiChat {
544
- /** Кто написал сообщение. */
545
- type Role = 'user' | 'assistant';
546
- /** Оценка ответа человеком; `null` — не оценён. */
547
- type Feedback = 'liked' | 'disliked' | null;
548
- /** Ход работы над ответом: строка `rt-ai-run-status` над текстом ответа. */
549
- interface Run {
550
- readonly state: IRtAiRunStatus.State;
551
- readonly label: string;
552
- readonly meta?: string;
553
- readonly steps?: readonly IRtTimeline.Step[];
554
- }
555
- interface Message {
556
- readonly id: string;
557
- readonly role: Role;
558
- /** Текст сообщения; у ответа — markdown. Пустой ответ рисует только ход работы. */
559
- readonly text: string;
560
- /** Время под пузырём вопроса; пусто — не рисуется. */
561
- readonly time?: string;
562
- /** Ход работы над этим ответом. */
563
- readonly run?: Run;
564
- /** Ответ ещё пишется: оценка не рисуется. */
565
- readonly streaming?: boolean;
566
- readonly feedback?: Feedback;
567
- }
568
- /** Ответ оборвался: текст ошибки, номер обращения и можно ли спросить снова. */
569
- interface RunError {
570
- readonly message: string;
571
- readonly referenceId?: string;
572
- readonly retryable?: boolean;
573
- }
574
- /** Беседа в списке бесед. */
575
- interface Thread {
576
- readonly id: string;
577
- readonly title: string;
578
- /** Время последнего сообщения, готовой строкой. */
579
- readonly time?: string;
580
- /** Непрочитанных ответов; больше нуля — строка помечена и показывает число. */
581
- readonly unreadCount?: number;
582
- }
583
- /** Оценка ответа: какое сообщение и какая оценка. */
584
- interface FeedbackChange {
585
- readonly messageId: string;
586
- readonly feedback: Feedback;
587
- }
588
- /** Контекст шаблона вложений ответа. */
589
- interface ExtraContext {
590
- readonly $implicit: Message;
591
- }
725
+ export declare function toRtMessage<TMessage extends IRtMappableMessage>(message: TMessage, options: IToRtMessageOptions<TMessage>): IRtChat.Message;
726
+ export declare namespace IRtAiChat {
727
+ /** Кто написал сообщение. */
728
+ type Role = 'user' | 'assistant';
729
+ /** Оценка ответа человеком; `null` — не оценён. */
730
+ type Feedback = 'liked' | 'disliked' | null;
731
+ /** Ход работы над ответом: строка `rt-ai-run-status` над текстом ответа. */
732
+ interface Run {
733
+ readonly state: IRtAiRunStatus.State;
734
+ readonly label: string;
735
+ readonly meta?: string;
736
+ readonly steps?: readonly IRtTimeline.Step[];
737
+ }
738
+ interface Message {
739
+ readonly id: string;
740
+ readonly role: Role;
741
+ /** Текст сообщения; у ответа — markdown. Пустой ответ рисует только ход работы. */
742
+ readonly text: string;
743
+ /** Время под пузырём вопроса; пусто — не рисуется. */
744
+ readonly time?: string;
745
+ /** Ход работы над этим ответом. */
746
+ readonly run?: Run;
747
+ /** Ответ ещё пишется: оценка не рисуется. */
748
+ readonly streaming?: boolean;
749
+ readonly feedback?: Feedback;
750
+ }
751
+ /** Ответ оборвался: текст ошибки, номер обращения и можно ли спросить снова. */
752
+ interface RunError {
753
+ readonly message: string;
754
+ readonly referenceId?: string;
755
+ readonly retryable?: boolean;
756
+ }
757
+ /** Беседа в списке бесед. */
758
+ interface Thread {
759
+ readonly id: string;
760
+ readonly title: string;
761
+ /** Время последнего сообщения, готовой строкой. */
762
+ readonly time?: string;
763
+ /** Непрочитанных ответов; больше нуля — строка помечена и показывает число. */
764
+ readonly unreadCount?: number;
765
+ }
766
+ /** Оценка ответа: какое сообщение и какая оценка. */
767
+ interface FeedbackChange {
768
+ readonly messageId: string;
769
+ readonly feedback: Feedback;
770
+ }
771
+ /** Контекст шаблона вложений ответа. */
772
+ interface ExtraContext {
773
+ readonly $implicit: Message;
774
+ }
592
775
  }
593
-
594
776
  /**
595
777
  * Вложения ответа ассистента: то, что рисует приложение под текстом ответа — график, таблица,
596
778
  * карточка. Шаблон получает сообщение.
597
779
  */
598
- declare class RtAiChatMessageExtraDirective {
599
- readonly templateRef: TemplateRef<IRtAiChat.ExtraContext>;
600
- static ngTemplateContextGuard(_directive: RtAiChatMessageExtraDirective, context: unknown): context is IRtAiChat.ExtraContext;
601
- static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatMessageExtraDirective, never>;
602
- static ɵdir: i0.ɵɵDirectiveDeclaration<RtAiChatMessageExtraDirective, "ng-template[rtAiChatMessageExtra]", never, {}, {}, never, never, true, never>;
780
+ export declare class RtAiChatMessageExtraDirective {
781
+ readonly templateRef: TemplateRef<IRtAiChat.ExtraContext>;
782
+ static ngTemplateContextGuard(_directive: RtAiChatMessageExtraDirective, context: unknown): context is IRtAiChat.ExtraContext;
783
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatMessageExtraDirective, never>;
784
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RtAiChatMessageExtraDirective, "ng-template[rtAiChatMessageExtra]", never, {}, {}, never, never, true, never>;
603
785
  }
604
-
605
786
  /** Строка беседы для списка бесед: `rt-thread-list` ждёт `id` и `hasUnread`. */
606
787
  interface IThreadRow extends IRtThreadList.Row {
607
- readonly id: string;
608
- readonly hasUnread: boolean;
609
- readonly title: string;
610
- readonly titleParts: readonly IRtSideMenu.TitlePart[];
611
- readonly time: string;
612
- readonly unreadCount: number;
788
+ readonly id: string;
789
+ readonly hasUnread: boolean;
790
+ readonly title: string;
791
+ readonly titleParts: readonly IRtSideMenu.TitlePart[];
792
+ readonly time: string;
793
+ readonly unreadCount: number;
613
794
  }
614
795
  /**
615
796
  * Панель ИИ-ассистента одним компонентом: шапка с действиями, лента вопросов и ответов с ходом
@@ -620,139 +801,299 @@ interface IThreadRow extends IRtThreadList.Row {
620
801
  * уходят выходами. Вложения ответа — графики и прочее — приложение отдаёт шаблоном
621
802
  * `rtAiChatMessageExtra`.
622
803
  */
623
- declare class RtAiChatComponent {
624
- #private;
625
- protected readonly composer: Signal<RtMessageComposerComponent | undefined>;
626
- protected readonly backButton: Signal<ElementRef<HTMLElement> | undefined>;
627
- protected readonly feed: Signal<ElementRef<HTMLElement> | undefined>;
628
- protected readonly t: Signal<TRtKitLabelMap>;
629
- protected readonly extraTemplate: Signal<RtAiChatMessageExtraDirective | undefined>;
630
- /** Ответы, у которых человек раскрыл шаги. */
631
- protected readonly openRuns: WritableSignal<ReadonlySet<string>>;
632
- protected readonly titleText: Signal<string>;
633
- protected readonly emptyTitleText: Signal<string>;
634
- protected readonly emptyDescriptionText: Signal<string>;
635
- protected readonly disclaimerText: Signal<string>;
636
- /** Значение признака одних значков на шапке: только материальный набор, свой — без признака. */
637
- protected readonly headerIconSign: Signal<IRtIcon.Preset | null>;
638
- protected readonly hasThreads: Signal<boolean>;
639
- /** Список бесед стоит колонкой слева: на весь экран, когда беседы есть. */
640
- protected readonly isThreadColumn: Signal<boolean>;
641
- /** Список бесед стоит на месте ленты: в узкой панели по кнопке «Conversations». */
642
- protected readonly isThreadPage: Signal<boolean>;
643
- protected readonly isEmpty: Signal<boolean>;
644
- /** Строка поиска по беседам: подсвечивает совпадения и меняет подпись пустого списка. */
645
- protected readonly threadQuery: WritableSignal<string>;
646
- protected readonly threadRows: Signal<readonly IThreadRow[]>;
647
- /** Пустой список: без поиска — «бесед нет», с поиском — подпись списка «ничего не найдено». */
648
- protected readonly threadsEmptyText: Signal<string>;
649
- /** Заголовок беседы над лентой; пусто — строки нет. */
650
- readonly title: InputSignal<string>;
651
- /** Вторая строка шапки — обычно название беседы. Пусто — не рисуется. */
652
- readonly subtitle: InputSignal<string>;
653
- readonly messages: InputSignal<readonly IRtAiChat.Message[]>;
654
- /** Готовые вопросы пустого экрана. */
655
- readonly suggestions: InputSignal<readonly string[]>;
656
- readonly emptyTitle: InputSignal<string>;
657
- readonly emptyDescription: InputSignal<string>;
658
- /** Подсказка в поле сообщения; пусто — подпись поля кита. */
659
- readonly placeholder: InputSignal<string>;
660
- /** Подпись под полем сообщения; `null` — подпись кита, пустая строка — без подписи. */
661
- readonly disclaimer: InputSignal<string | null>;
662
- /** Ответ пишется: поле сообщения в режиме остановки, подсказки и новая беседа выключены. */
663
- readonly sending: InputSignalWithTransform<boolean, BooleanInput>;
664
- /** Беседа загружается: крутилка, пока сообщений нет. */
665
- readonly loading: InputSignalWithTransform<boolean, BooleanInput>;
666
- readonly error: InputSignal<IRtAiChat.RunError | null>;
667
- /** Беседы; `null` — кнопки «Conversations» нет. */
668
- readonly threads: InputSignal<readonly IRtAiChat.Thread[] | null>;
669
- readonly activeThreadId: InputSignal<string | null>;
670
- readonly threadsLoading: InputSignalWithTransform<boolean, BooleanInput>;
671
- readonly threadsFetching: InputSignalWithTransform<boolean, BooleanInput>;
672
- readonly threadsHasMore: InputSignalWithTransform<boolean, BooleanInput>;
673
- /** Значки декоративных строк-превью пустого списка бесед, по строке на значок. */
674
- readonly emptyPreviewIcons: InputSignal<readonly IRtIcon.Name[]>;
675
- /** Кнопка «Full screen» в шапке. */
676
- readonly fullScreenable: InputSignalWithTransform<boolean, BooleanInput>;
677
- /** Кнопка закрытия в шапке. */
678
- readonly closable: InputSignalWithTransform<boolean, BooleanInput>;
679
- /**
680
- * Действия строки беседы меню «More actions» вместо кнопки удаления: «Copy ID» кладёт id беседы
681
- * в буфер, «Delete» отдаёт `deleteThread` без подтверждения — его показывает приложение.
682
- */
683
- readonly threadMenu: InputSignalWithTransform<boolean, BooleanInput>;
684
- /** Кнопка копирования текста под вопросом и в строке действий ответа. */
685
- readonly copyable: InputSignalWithTransform<boolean, BooleanInput>;
686
- /**
687
- * Набор рисунков значков шапки. `'material'` ставит на шапку признак одних значков
688
- * `data-rt-icon-preset`: значки рисуются материальным набором, токены и остальной вид — свои.
689
- * Признак значок читает после первой отрисовки, поэтому вход задаётся до неё. Дефолт `'base'`.
690
- */
691
- readonly headerIconPreset: InputSignal<IRtIcon.Preset>;
692
- /** Черновик в поле сообщения. */
693
- readonly draft: ModelSignal<string>;
694
- /** Список бесед открыт на месте ленты. */
695
- readonly threadsOpen: ModelSignal<boolean>;
696
- readonly fullScreen: ModelSignal<boolean>;
697
- /** Вопрос ушёл: набранный или выбранная подсказка. */
698
- readonly send: OutputEmitterRef<string>;
699
- readonly stop: OutputEmitterRef<void>;
700
- readonly retry: OutputEmitterRef<void>;
701
- readonly newThread: OutputEmitterRef<void>;
702
- readonly closed: OutputEmitterRef<void>;
703
- readonly selectThread: OutputEmitterRef<string>;
704
- readonly deleteThread: OutputEmitterRef<string>;
705
- readonly searchThreads: OutputEmitterRef<string>;
706
- readonly loadMoreThreads: OutputEmitterRef<void>;
707
- readonly feedbackChange: OutputEmitterRef<IRtAiChat.FeedbackChange>;
708
- constructor();
709
- /** Фокус в поле сообщения после отрисовки: приложению — после своих действий вне панели. */
710
- focusComposer(): void;
711
- protected onFeedScroll(): void;
712
- protected onSubmitted(value: IRtMessageComposer.SubmitPayload): void;
713
- protected onSuggestion(text: string): void;
714
- protected onToggleRun(messageId: string, open: boolean): void;
715
- protected onFeedback(message: IRtAiChat.Message, feedback: Exclude<IRtAiChat.Feedback, null>): void;
716
- protected onToggleThreads(): void;
717
- protected onNewThread(): void;
718
- protected onStop(): void;
719
- protected onToggleFullScreen(): void;
720
- protected onSearchThreads(query: string): void;
721
- protected onSelectThread(id: IRtThreadList.TRowId): void;
722
- protected onCopyThreadId(id: string): void;
723
- static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatComponent, never>;
724
- 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; }; "threadMenu": { "alias": "threadMenu"; "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>;
804
+ export declare class RtAiChatComponent {
805
+ #private;
806
+ protected readonly composer: Signal<RtMessageComposerComponent | undefined>;
807
+ protected readonly backButton: Signal<ElementRef<HTMLElement> | undefined>;
808
+ protected readonly feed: Signal<ElementRef<HTMLElement> | undefined>;
809
+ protected readonly t: Signal<TRtKitLabelMap>;
810
+ protected readonly extraTemplate: Signal<RtAiChatMessageExtraDirective | undefined>;
811
+ /** Ответы, у которых человек раскрыл шаги. */
812
+ protected readonly openRuns: WritableSignal<ReadonlySet<string>>;
813
+ protected readonly titleText: Signal<string>;
814
+ protected readonly emptyTitleText: Signal<string>;
815
+ protected readonly emptyDescriptionText: Signal<string>;
816
+ protected readonly disclaimerText: Signal<string>;
817
+ /** Значение признака одних значков на шапке: только материальный набор, свой — без признака. */
818
+ protected readonly headerIconSign: Signal<IRtIcon.Preset | null>;
819
+ protected readonly hasThreads: Signal<boolean>;
820
+ /** Список бесед стоит колонкой слева: на весь экран, когда беседы есть. */
821
+ protected readonly isThreadColumn: Signal<boolean>;
822
+ /** Список бесед стоит на месте ленты: в узкой панели по кнопке «Conversations». */
823
+ protected readonly isThreadPage: Signal<boolean>;
824
+ protected readonly isEmpty: Signal<boolean>;
825
+ /** Строка поиска по беседам: подсвечивает совпадения и меняет подпись пустого списка. */
826
+ protected readonly threadQuery: WritableSignal<string>;
827
+ protected readonly threadRows: Signal<readonly IThreadRow[]>;
828
+ /** Пустой список: без поиска — «бесед нет», с поиском — подпись списка «ничего не найдено». */
829
+ protected readonly threadsEmptyText: Signal<string>;
830
+ /** Заголовок беседы над лентой; пусто — строки нет. */
831
+ readonly title: InputSignal<string>;
832
+ /** Вторая строка шапки — обычно название беседы. Пусто — не рисуется. */
833
+ readonly subtitle: InputSignal<string>;
834
+ readonly messages: InputSignal<readonly IRtAiChat.Message[]>;
835
+ /** Готовые вопросы пустого экрана. */
836
+ readonly suggestions: InputSignal<readonly string[]>;
837
+ readonly emptyTitle: InputSignal<string>;
838
+ readonly emptyDescription: InputSignal<string>;
839
+ /** Подсказка в поле сообщения; пусто — подпись поля кита. */
840
+ readonly placeholder: InputSignal<string>;
841
+ /** Подпись под полем сообщения; `null` — подпись кита, пустая строка — без подписи. */
842
+ readonly disclaimer: InputSignal<string | null>;
843
+ /** Ответ пишется: поле сообщения в режиме остановки, подсказки и новая беседа выключены. */
844
+ readonly sending: InputSignalWithTransform<boolean, BooleanInput>;
845
+ /** Беседа загружается: крутилка, пока сообщений нет. */
846
+ readonly loading: InputSignalWithTransform<boolean, BooleanInput>;
847
+ readonly error: InputSignal<IRtAiChat.RunError | null>;
848
+ /** Беседы; `null` — кнопки «Conversations» нет. */
849
+ readonly threads: InputSignal<readonly IRtAiChat.Thread[] | null>;
850
+ readonly activeThreadId: InputSignal<string | null>;
851
+ readonly threadsLoading: InputSignalWithTransform<boolean, BooleanInput>;
852
+ readonly threadsFetching: InputSignalWithTransform<boolean, BooleanInput>;
853
+ readonly threadsHasMore: InputSignalWithTransform<boolean, BooleanInput>;
854
+ /** Значки декоративных строк-превью пустого списка бесед, по строке на значок. */
855
+ readonly emptyPreviewIcons: InputSignal<readonly IRtIcon.Name[]>;
856
+ /** Кнопка «Full screen» в шапке. */
857
+ readonly fullScreenable: InputSignalWithTransform<boolean, BooleanInput>;
858
+ /** Кнопка закрытия в шапке. */
859
+ readonly closable: InputSignalWithTransform<boolean, BooleanInput>;
860
+ /**
861
+ * Действия строки беседы меню «More actions» вместо кнопки удаления: «Copy ID» кладёт id беседы
862
+ * в буфер, «Delete» отдаёт `deleteThread` без подтверждения — его показывает приложение.
863
+ */
864
+ readonly threadMenu: InputSignalWithTransform<boolean, BooleanInput>;
865
+ /** Кнопка копирования текста под вопросом и в строке действий ответа. */
866
+ readonly copyable: InputSignalWithTransform<boolean, BooleanInput>;
867
+ /**
868
+ * Набор рисунков значков шапки. `'material'` ставит на шапку признак одних значков
869
+ * `data-rt-icon-preset`: значки рисуются материальным набором, токены и остальной вид — свои.
870
+ * Признак значок читает после первой отрисовки, поэтому вход задаётся до неё. Дефолт `'base'`.
871
+ */
872
+ readonly headerIconPreset: InputSignal<IRtIcon.Preset>;
873
+ /** Черновик в поле сообщения. */
874
+ readonly draft: ModelSignal<string>;
875
+ /** Список бесед открыт на месте ленты. */
876
+ readonly threadsOpen: ModelSignal<boolean>;
877
+ readonly fullScreen: ModelSignal<boolean>;
878
+ /** Вопрос ушёл: набранный или выбранная подсказка. */
879
+ readonly send: OutputEmitterRef<string>;
880
+ readonly stop: OutputEmitterRef<void>;
881
+ readonly retry: OutputEmitterRef<void>;
882
+ readonly newThread: OutputEmitterRef<void>;
883
+ readonly closed: OutputEmitterRef<void>;
884
+ readonly selectThread: OutputEmitterRef<string>;
885
+ readonly deleteThread: OutputEmitterRef<string>;
886
+ readonly searchThreads: OutputEmitterRef<string>;
887
+ readonly loadMoreThreads: OutputEmitterRef<void>;
888
+ readonly feedbackChange: OutputEmitterRef<IRtAiChat.FeedbackChange>;
889
+ constructor();
890
+ /** Фокус в поле сообщения после отрисовки: приложению — после своих действий вне панели. */
891
+ focusComposer(): void;
892
+ protected onFeedScroll(): void;
893
+ protected onSubmitted(value: IRtMessageComposer.SubmitPayload): void;
894
+ protected onSuggestion(text: string): void;
895
+ protected onToggleRun(messageId: string, open: boolean): void;
896
+ protected onFeedback(message: IRtAiChat.Message, feedback: Exclude<IRtAiChat.Feedback, null>): void;
897
+ protected onToggleThreads(): void;
898
+ protected onNewThread(): void;
899
+ protected onStop(): void;
900
+ protected onToggleFullScreen(): void;
901
+ protected onSearchThreads(query: string): void;
902
+ protected onSelectThread(id: IRtThreadList.TRowId): void;
903
+ protected onCopyThreadId(id: string): void;
904
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatComponent, never>;
905
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtAiChatComponent, "rt-ai-chat", never, {
906
+ "title": {
907
+ "alias": "title";
908
+ "required": false;
909
+ "isSignal": true;
910
+ };
911
+ "subtitle": {
912
+ "alias": "subtitle";
913
+ "required": false;
914
+ "isSignal": true;
915
+ };
916
+ "messages": {
917
+ "alias": "messages";
918
+ "required": false;
919
+ "isSignal": true;
920
+ };
921
+ "suggestions": {
922
+ "alias": "suggestions";
923
+ "required": false;
924
+ "isSignal": true;
925
+ };
926
+ "emptyTitle": {
927
+ "alias": "emptyTitle";
928
+ "required": false;
929
+ "isSignal": true;
930
+ };
931
+ "emptyDescription": {
932
+ "alias": "emptyDescription";
933
+ "required": false;
934
+ "isSignal": true;
935
+ };
936
+ "placeholder": {
937
+ "alias": "placeholder";
938
+ "required": false;
939
+ "isSignal": true;
940
+ };
941
+ "disclaimer": {
942
+ "alias": "disclaimer";
943
+ "required": false;
944
+ "isSignal": true;
945
+ };
946
+ "sending": {
947
+ "alias": "sending";
948
+ "required": false;
949
+ "isSignal": true;
950
+ };
951
+ "loading": {
952
+ "alias": "loading";
953
+ "required": false;
954
+ "isSignal": true;
955
+ };
956
+ "error": {
957
+ "alias": "error";
958
+ "required": false;
959
+ "isSignal": true;
960
+ };
961
+ "threads": {
962
+ "alias": "threads";
963
+ "required": false;
964
+ "isSignal": true;
965
+ };
966
+ "activeThreadId": {
967
+ "alias": "activeThreadId";
968
+ "required": false;
969
+ "isSignal": true;
970
+ };
971
+ "threadsLoading": {
972
+ "alias": "threadsLoading";
973
+ "required": false;
974
+ "isSignal": true;
975
+ };
976
+ "threadsFetching": {
977
+ "alias": "threadsFetching";
978
+ "required": false;
979
+ "isSignal": true;
980
+ };
981
+ "threadsHasMore": {
982
+ "alias": "threadsHasMore";
983
+ "required": false;
984
+ "isSignal": true;
985
+ };
986
+ "emptyPreviewIcons": {
987
+ "alias": "emptyPreviewIcons";
988
+ "required": false;
989
+ "isSignal": true;
990
+ };
991
+ "fullScreenable": {
992
+ "alias": "fullScreenable";
993
+ "required": false;
994
+ "isSignal": true;
995
+ };
996
+ "closable": {
997
+ "alias": "closable";
998
+ "required": false;
999
+ "isSignal": true;
1000
+ };
1001
+ "threadMenu": {
1002
+ "alias": "threadMenu";
1003
+ "required": false;
1004
+ "isSignal": true;
1005
+ };
1006
+ "copyable": {
1007
+ "alias": "copyable";
1008
+ "required": false;
1009
+ "isSignal": true;
1010
+ };
1011
+ "headerIconPreset": {
1012
+ "alias": "headerIconPreset";
1013
+ "required": false;
1014
+ "isSignal": true;
1015
+ };
1016
+ "draft": {
1017
+ "alias": "draft";
1018
+ "required": false;
1019
+ "isSignal": true;
1020
+ };
1021
+ "threadsOpen": {
1022
+ "alias": "threadsOpen";
1023
+ "required": false;
1024
+ "isSignal": true;
1025
+ };
1026
+ "fullScreen": {
1027
+ "alias": "fullScreen";
1028
+ "required": false;
1029
+ "isSignal": true;
1030
+ };
1031
+ }, {
1032
+ "draft": "draftChange";
1033
+ "threadsOpen": "threadsOpenChange";
1034
+ "fullScreen": "fullScreenChange";
1035
+ "send": "send";
1036
+ "stop": "stop";
1037
+ "retry": "retry";
1038
+ "newThread": "newThread";
1039
+ "closed": "closed";
1040
+ "selectThread": "selectThread";
1041
+ "deleteThread": "deleteThread";
1042
+ "searchThreads": "searchThreads";
1043
+ "loadMoreThreads": "loadMoreThreads";
1044
+ "feedbackChange": "feedbackChange";
1045
+ }, ["extraTemplate"], never, true, never>;
725
1046
  }
726
-
727
1047
  /**
728
1048
  * Ответ ассистента в ленте `rt-ai-chat`: ход работы, текст в markdown, вложения приложения и строка
729
1049
  * действий — копирование и оценка. Строка появляется, когда текст дописан.
730
1050
  */
731
- declare class RtAiChatAnswerComponent {
732
- protected readonly t: Signal<TRtKitLabelMap>;
733
- /** Текст дописан: строка действий с копированием и оценкой. */
734
- protected readonly isWritten: Signal<boolean>;
735
- /** Что копирует кнопка: видимый текст ответа без знаков разметки — без хода работы и вложений. */
736
- protected readonly plainText: Signal<string>;
737
- readonly message: InputSignal<IRtAiChat.Message>;
738
- /** Шаблон вложений ответа; `null` — вложений нет. */
739
- readonly extra: InputSignal<TemplateRef<IRtAiChat.ExtraContext> | null>;
740
- /** Кнопка копирования текста первой в строке действий. */
741
- readonly copyable: InputSignalWithTransform<boolean, BooleanInput>;
742
- /** Шаги хода работы раскрыты. */
743
- readonly expanded: ModelSignal<boolean>;
744
- /** Нажата оценка; повторное нажатие той же снимает её — решает родитель. */
745
- readonly feedbackChange: OutputEmitterRef<Exclude<IRtAiChat.Feedback, null>>;
746
- static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatAnswerComponent, never>;
747
- 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>;
1051
+ export declare class RtAiChatAnswerComponent {
1052
+ protected readonly t: Signal<TRtKitLabelMap>;
1053
+ /** Текст дописан: строка действий с копированием и оценкой. */
1054
+ protected readonly isWritten: Signal<boolean>;
1055
+ /** Что копирует кнопка: видимый текст ответа без знаков разметки — без хода работы и вложений. */
1056
+ protected readonly plainText: Signal<string>;
1057
+ readonly message: InputSignal<IRtAiChat.Message>;
1058
+ /** Шаблон вложений ответа; `null` — вложений нет. */
1059
+ readonly extra: InputSignal<TemplateRef<IRtAiChat.ExtraContext> | null>;
1060
+ /** Кнопка копирования текста первой в строке действий. */
1061
+ readonly copyable: InputSignalWithTransform<boolean, BooleanInput>;
1062
+ /** Шаги хода работы раскрыты. */
1063
+ readonly expanded: ModelSignal<boolean>;
1064
+ /** Нажата оценка; повторное нажатие той же снимает её — решает родитель. */
1065
+ readonly feedbackChange: OutputEmitterRef<Exclude<IRtAiChat.Feedback, null>>;
1066
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtAiChatAnswerComponent, never>;
1067
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtAiChatAnswerComponent, "rt-ai-chat-answer", never, {
1068
+ "message": {
1069
+ "alias": "message";
1070
+ "required": true;
1071
+ "isSignal": true;
1072
+ };
1073
+ "extra": {
1074
+ "alias": "extra";
1075
+ "required": false;
1076
+ "isSignal": true;
1077
+ };
1078
+ "copyable": {
1079
+ "alias": "copyable";
1080
+ "required": false;
1081
+ "isSignal": true;
1082
+ };
1083
+ "expanded": {
1084
+ "alias": "expanded";
1085
+ "required": false;
1086
+ "isSignal": true;
1087
+ };
1088
+ }, {
1089
+ "expanded": "expandedChange";
1090
+ "feedbackChange": "feedbackChange";
1091
+ }, never, never, true, never>;
748
1092
  }
749
-
750
1093
  /** Ключ текстовой расшифровки иконки статуса сообщения. */
751
- declare class RtChatStatusLabelPipe implements PipeTransform {
752
- transform(status: ERtChatMessageStatus): string;
753
- static ɵfac: i0.ɵɵFactoryDeclaration<RtChatStatusLabelPipe, never>;
754
- static ɵpipe: i0.ɵɵPipeDeclaration<RtChatStatusLabelPipe, "rtChatStatusLabel", true>;
1094
+ export declare class RtChatStatusLabelPipe implements PipeTransform {
1095
+ transform(status: ERtChatMessageStatus): string;
1096
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtChatStatusLabelPipe, never>;
1097
+ static ɵpipe: i0.ɵɵPipeDeclaration<RtChatStatusLabelPipe, "rtChatStatusLabel", true>;
755
1098
  }
756
-
757
- export { ERtChatMessageStatus, IRtAiChat, IRtChat, IRtMessageComposer, RtAiChatAnswerComponent, RtAiChatComponent, RtAiChatMessageExtraDirective, RtChatComponent, RtChatMessageActionsDirective, RtChatMessageHasActionsPipe, RtChatStatusLabelPipe, RtMessageComposerComponent, RtRichEditorComponent, deliveryStatus, messageHasAvailableActions, pendingToRtMessage, toRtMessage };
758
- export type { IRtChatMessageActionsContext, IRtMappableMessage, IRtPendingMessage, IToRtMessageOptions, TRtRichEditorToolbar };
1099
+ export {};