@rt-tools/ui-kit-v2 0.32.0 → 0.34.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 (220) hide show
  1. package/README.md +4 -3
  2. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +1 -0
  3. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -1
  4. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +92 -5
  5. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
  6. package/fesm2022/rt-tools-ui-kit-v2-badge.mjs +191 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-badge.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs +3 -2
  9. package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs.map +1 -1
  10. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +6 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -1
  12. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +35 -4
  13. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
  14. package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs +13 -4
  15. package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs.map +1 -1
  16. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +245 -60
  17. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -1
  18. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +30 -5
  19. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
  20. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +114 -2
  21. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  22. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +14 -3
  23. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  24. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +17 -3
  25. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  26. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +6 -3
  27. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  28. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
  29. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  30. package/fesm2022/rt-tools-ui-kit-v2-divider.mjs +112 -0
  31. package/fesm2022/rt-tools-ui-kit-v2-divider.mjs.map +1 -0
  32. package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs +1 -0
  33. package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs.map +1 -1
  34. package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs +854 -0
  35. package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs.map +1 -0
  36. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +16 -5
  37. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
  38. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +580 -65
  39. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
  40. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +203 -15
  41. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
  42. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +40 -8
  43. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
  44. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -0
  45. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
  46. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +7 -3
  47. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
  48. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +53 -2
  49. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -1
  50. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs +14 -4
  51. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs.map +1 -1
  52. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs +6 -3
  53. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs.map +1 -1
  54. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +16 -5
  55. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
  56. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +1 -0
  57. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
  58. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +14 -4
  59. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -1
  60. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +3 -2
  61. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  62. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +207 -7
  63. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
  64. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -0
  65. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
  66. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +3 -2
  67. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
  68. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +2 -0
  69. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  70. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +3 -2
  71. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
  72. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +3 -2
  73. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -1
  74. package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs +171 -0
  75. package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs.map +1 -0
  76. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +176 -6
  77. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -1
  78. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +9 -6
  79. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  80. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -0
  81. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
  82. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +142 -23
  83. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
  84. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +22 -9
  85. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
  86. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +3 -2
  87. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -1
  88. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +105 -8
  89. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
  90. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +13 -2
  91. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  92. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +609 -33
  93. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  94. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -0
  95. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
  96. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +45 -7
  97. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -1
  98. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +2 -2
  99. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
  100. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +11 -2
  101. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  102. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +152 -11
  103. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
  104. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +199 -17
  105. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
  106. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +35 -5
  107. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
  108. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +14 -4
  109. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -1
  110. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +6 -3
  111. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -1
  112. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +21 -6
  113. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
  114. package/fesm2022/rt-tools-ui-kit-v2.mjs +4 -0
  115. package/package.json +17 -1
  116. package/src/assets/icons/volume-off.svg +2 -1
  117. package/src/lib/components/autocomplete/CONTEXT.md +25 -14
  118. package/src/lib/components/autocomplete/rt-autocomplete.component.scss +19 -0
  119. package/src/lib/components/badge/CONTEXT.md +33 -0
  120. package/src/lib/components/badge/rt-badge.directive.scss +104 -0
  121. package/src/lib/components/breadcrumbs/rt-breadcrumbs.component.scss +2 -2
  122. package/src/lib/components/button/CONTEXT.md +5 -0
  123. package/src/lib/components/button/rt-button.directive.scss +3 -1
  124. package/src/lib/components/checkbox/CONTEXT.md +15 -8
  125. package/src/lib/components/color-palette/rt-color-palette.component.scss +2 -2
  126. package/src/lib/components/container/CONTEXT.md +23 -6
  127. package/src/lib/components/container/rt-container.component.scss +90 -1
  128. package/src/lib/components/copy-value/CONTEXT.md +6 -5
  129. package/src/lib/components/copy-value/rt-copy-value.component.scss +16 -0
  130. package/src/lib/components/date-picker/rt-date-picker.component.scss +7 -0
  131. package/src/lib/components/date-range/rt-date-range.component.scss +7 -0
  132. package/src/lib/components/divider/CONTEXT.md +21 -0
  133. package/src/lib/components/divider/rt-divider.component.scss +34 -0
  134. package/src/lib/components/drawer/CONTEXT.md +73 -0
  135. package/src/lib/components/drawer/rt-drawer-container.component.scss +19 -0
  136. package/src/lib/components/drawer/rt-drawer.component.scss +168 -0
  137. package/src/lib/components/drawer/rt-resize-handle.component.scss +42 -0
  138. package/src/lib/components/dynamic-selector/CONTEXT.md +5 -0
  139. package/src/lib/components/expansion-panel/CONTEXT.md +32 -8
  140. package/src/lib/components/expansion-panel/rt-expansion-panel.component.scss +67 -2
  141. package/src/lib/components/field/CONTEXT.md +43 -0
  142. package/src/lib/components/field/rt-field-label-inside.scss +179 -0
  143. package/src/lib/components/field/rt-field.component.scss +51 -2
  144. package/src/lib/components/icon-button/CONTEXT.md +17 -15
  145. package/src/lib/components/icon-button/rt-icon-button.component.scss +3 -1
  146. package/src/lib/components/inline-edit/rt-inline-edit.component.scss +4 -4
  147. package/src/lib/components/input/CONTEXT.md +45 -11
  148. package/src/lib/components/input/rt-input-floating-label.scss +192 -0
  149. package/src/lib/components/input/rt-input-icons.scss +105 -0
  150. package/src/lib/components/input/rt-input.component.scss +91 -13
  151. package/src/lib/components/input-number/CONTEXT.md +7 -0
  152. package/src/lib/components/input-number/rt-input-number.component.scss +58 -1
  153. package/src/lib/components/menu/CONTEXT.md +1 -0
  154. package/src/lib/components/multiselect/CONTEXT.md +2 -1
  155. package/src/lib/components/multiselect/rt-multiselect.component.scss +7 -0
  156. package/src/lib/components/pagination/CONTEXT.md +3 -0
  157. package/src/lib/components/pagination/rt-pagination.component.scss +7 -0
  158. package/src/lib/components/progress-bar/CONTEXT.md +22 -0
  159. package/src/lib/components/progress-bar/rt-progress-bar.component.scss +77 -0
  160. package/src/lib/components/radio-button/CONTEXT.md +9 -0
  161. package/src/lib/components/radio-button/rt-radio-group.component.scss +13 -0
  162. package/src/lib/components/select/CONTEXT.md +28 -0
  163. package/src/lib/components/select/rt-select-clear.scss +88 -0
  164. package/src/lib/components/select/rt-select-floating-label.scss +155 -0
  165. package/src/lib/components/select/rt-select-material.scss +54 -0
  166. package/src/lib/components/select/rt-select.component.scss +54 -16
  167. package/src/lib/components/side-menu/CONTEXT.md +5 -0
  168. package/src/lib/components/speed-menu/rt-speed-menu.component.scss +5 -5
  169. package/src/lib/components/stepper/CONTEXT.md +13 -5
  170. package/src/lib/components/stepper/rt-stepper.component.scss +93 -0
  171. package/src/lib/components/tabs/CONTEXT.md +57 -9
  172. package/src/lib/components/tabs/rt-tabs.component.scss +201 -5
  173. package/src/lib/components/textarea/CONTEXT.md +12 -1
  174. package/src/lib/components/textarea/rt-textarea.component.scss +116 -1
  175. package/src/lib/components/toast/CONTEXT.md +23 -0
  176. package/src/lib/components/toast/rt-toast.component.scss +37 -0
  177. package/src/lib/components/toggle-button-group/CONTEXT.md +24 -4
  178. package/src/lib/components/toggle-button-group/rt-toggle-button-group-chips.scss +151 -0
  179. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -0
  180. package/src/lib/components/tooltip/CONTEXT.md +7 -1
  181. package/src/lib/components/tree/rt-tree.component.scss +2 -2
  182. package/src/rich-editor/lib/components/chat/CONTEXT.md +3 -0
  183. package/src/rich-editor/lib/components/chat/rt-chat.component.scss +9 -0
  184. package/src/styles/_color-scheme.scss +1 -1
  185. package/src/styles/_density.scss +48 -0
  186. package/src/styles/_index.scss +8 -0
  187. package/src/styles/_preset-material.scss +160 -70
  188. package/src/styles/_primitives.scss +1 -0
  189. package/src/styles/_semantic-navigation.scss +117 -0
  190. package/src/styles/_semantic.scss +29 -98
  191. package/src/styles/_theme-dark.scss +8 -0
  192. package/styles/tokens.css +2066 -1134
  193. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +34 -0
  194. package/types/rt-tools-ui-kit-v2-badge.d.ts +71 -0
  195. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +17 -3
  196. package/types/rt-tools-ui-kit-v2-container.d.ts +65 -9
  197. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +11 -1
  198. package/types/rt-tools-ui-kit-v2-core.d.ts +110 -4
  199. package/types/rt-tools-ui-kit-v2-divider.d.ts +29 -0
  200. package/types/rt-tools-ui-kit-v2-drawer.d.ts +257 -0
  201. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +240 -25
  202. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +87 -3
  203. package/types/rt-tools-ui-kit-v2-field.d.ts +18 -1
  204. package/types/rt-tools-ui-kit-v2-form-control.d.ts +42 -4
  205. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +2 -1
  206. package/types/rt-tools-ui-kit-v2-input-number.d.ts +1 -0
  207. package/types/rt-tools-ui-kit-v2-input.d.ts +98 -4
  208. package/types/rt-tools-ui-kit-v2-progress-bar.d.ts +53 -0
  209. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +80 -1
  210. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +5 -2
  211. package/types/rt-tools-ui-kit-v2-select.d.ts +65 -1
  212. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +3 -0
  213. package/types/rt-tools-ui-kit-v2-stepper.d.ts +57 -4
  214. package/types/rt-tools-ui-kit-v2-tabs.d.ts +291 -6
  215. package/types/rt-tools-ui-kit-v2-textarea.d.ts +16 -0
  216. package/types/rt-tools-ui-kit-v2-toast.d.ts +38 -2
  217. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +83 -3
  218. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +17 -2
  219. package/types/rt-tools-ui-kit-v2.d.ts +4 -0
  220. package/src/lib/components/dynamic-selector/stories/component/test-dynamic-selector-popup-frame.component.scss +0 -6
@@ -2,6 +2,7 @@ import { BooleanInput } from "@angular/cdk/coercion";
2
2
  import * as i0 from "@angular/core";
3
3
  import { ElementRef, InputSignal, InputSignalWithTransform, OutputEmitterRef, Signal, TemplateRef, WritableSignal } from "@angular/core";
4
4
  import { IRtIcon } from "@rt-tools/ui-kit-v2/core";
5
+ import { IRtTooltip } from "@rt-tools/ui-kit-v2/tooltip";
5
6
  /**
6
7
  * Модель `<rt-tabs>`: один корневой неймспейс с префиксом `I`.
7
8
  * Содержит публичные union-типы для ориентации и стороны header-контролов.
@@ -11,6 +12,28 @@ export declare namespace IRtTabs {
11
12
  type Id = string | number;
12
13
  /** Ориентация полосы вкладок. */
13
14
  type Direction = 'horizontal' | 'vertical';
15
+ /**
16
+ * Что делают стрелки и Home/End на вкладке: `auto` — сразу открывают вкладку, `manual` — только
17
+ * переводят фокус, а открывают Enter и Space.
18
+ */
19
+ type Activation = 'auto' | 'manual';
20
+ /**
21
+ * Где стоят стрелки прокрутки переполненной полосы: `overlay` — поверх вкладок, только в ту
22
+ * сторону, куда можно прокрутить; `inline` — обе в своих местах по краям, полоса между ними уже,
23
+ * стрелка в сторону, куда прокручивать некуда, неактивна.
24
+ */
25
+ type ScrollArrows = 'overlay' | 'inline';
26
+ /**
27
+ * На сколько сдвигает полосу одно нажатие на стрелку: `fixed` — на 80 px, как прежде; `page` —
28
+ * на видимую ширину, `third` — на её треть, как у Material.
29
+ */
30
+ type ScrollStep = 'fixed' | 'page' | 'third';
31
+ /**
32
+ * Длительность движения при смене вкладки: переезда полосы и сдвига панели. Число — миллисекунды,
33
+ * строка — значение CSS (`'500ms'`, `'0.5s'`); строка из одних цифр читается как миллисекунды.
34
+ * `null` — длительности берутся из токенов `--rt-tabs-indicator-duration` и `--rt-tabs-panel-duration`.
35
+ */
36
+ type AnimationDuration = string | number | null;
14
37
  /** Сторона размещения header-контрола относительно полосы вкладок. */
15
38
  type ControlSide = 'left' | 'right';
16
39
  /** Семантический цвет иконки/бейджа вкладки — маппится на палитру `rt-icon`. */
@@ -36,6 +59,11 @@ export declare class RtTabDirective {
36
59
  readonly titleTemplate: InputSignal<TemplateRef<unknown> | null>;
37
60
  /** Иконка слева от заголовка. */
38
61
  readonly icon: InputSignal<IRtIcon.Name | null>;
62
+ /**
63
+ * Имя значка Material вместо `icon` — рисуется так же, как вход `glyph` у `rt-icon`.
64
+ * Задан вместе с `icon` — решает `rt-icon`.
65
+ */
66
+ readonly glyph: InputSignal<string | null>;
39
67
  /** Семантический цвет иконки заголовка. */
40
68
  readonly iconColor: InputSignal<IRtTabs.TitleColor>;
41
69
  /** Значение бейджа справа от заголовка (число/строка). `null` — без бейджа. */
@@ -58,8 +86,42 @@ export declare class RtTabDirective {
58
86
  readonly invalid: InputSignalWithTransform<boolean, BooleanInput>;
59
87
  /** Подсказка для невалидной вкладки. Пусто — берётся переведённое умолчание. */
60
88
  readonly invalidMessage: InputSignal<string>;
89
+ /**
90
+ * Подсказка при наведении на вкладку — в том числе на отключённую, чтобы объяснить, почему она
91
+ * недоступна. У вкладки без подписи она же становится её именем для чтения с экрана.
92
+ */
93
+ readonly tooltip: InputSignal<string>;
94
+ /** Вкладку можно закрыть: крестик в шапке и клавиша Delete поднимают `tabClose` у `rt-tabs`. */
95
+ readonly closable: InputSignalWithTransform<boolean, BooleanInput>;
96
+ /** Подсказка крестика закрываемой вкладки. Пусто — подсказки нет. */
97
+ readonly closeTooltip: InputSignal<string>;
98
+ /** Сторона подсказки крестика. Не задана — сторона подсказки по умолчанию. */
99
+ readonly closeTooltipPlacement: InputSignal<IRtTooltip.Placement | null>;
100
+ /**
101
+ * Указатель стоит на крестике. Выставляет `rt-tabs`: пока он там, подсказка самой вкладки
102
+ * молчит, и видна только подсказка крестика.
103
+ */
104
+ readonly closeHovered: WritableSignal<boolean>;
61
105
  /** Готовый текст подсказки: своя формулировка важнее умолчания. */
62
106
  readonly invalidTitle: Signal<string>;
107
+ /**
108
+ * Подсказка кнопки вкладки: у неверной — объяснение ошибки, иначе своя подсказка. Пока
109
+ * указатель на крестике, пусто: две подсказки разом читались бы как одна. Крестик, убранный
110
+ * из-под указателя, ухода не сообщает, поэтому признак читается вместе с `showClose`.
111
+ */
112
+ readonly buttonTooltip: Signal<string>;
113
+ /**
114
+ * Имя вкладки для чтения с экрана, когда видимой подписи нет: вкладка из одного значка
115
+ * называется своей подсказкой. С подписью или своим заголовком атрибут не ставится.
116
+ */
117
+ readonly ariaLabel: Signal<string | null>;
118
+ /**
119
+ * Имя крестика для чтения с экрана: текст его подсказки, без подсказки — переведённое «Закрыть».
120
+ * Крестик — отдельная кнопка, и без имени диктор назвал бы её просто «кнопка».
121
+ */
122
+ readonly closeLabel: Signal<string>;
123
+ /** Крестик рисуется только у доступной вкладки: отключённую закрыть нельзя. */
124
+ readonly showClose: Signal<boolean>;
63
125
  static ɵfac: i0.ɵɵFactoryDeclaration<RtTabDirective, never>;
64
126
  static ɵdir: i0.ɵɵDirectiveDeclaration<RtTabDirective, "[rtTab]", never, {
65
127
  "id": {
@@ -82,6 +144,11 @@ export declare class RtTabDirective {
82
144
  "required": false;
83
145
  "isSignal": true;
84
146
  };
147
+ "glyph": {
148
+ "alias": "glyph";
149
+ "required": false;
150
+ "isSignal": true;
151
+ };
85
152
  "iconColor": {
86
153
  "alias": "iconColor";
87
154
  "required": false;
@@ -122,6 +189,26 @@ export declare class RtTabDirective {
122
189
  "required": false;
123
190
  "isSignal": true;
124
191
  };
192
+ "tooltip": {
193
+ "alias": "tooltip";
194
+ "required": false;
195
+ "isSignal": true;
196
+ };
197
+ "closable": {
198
+ "alias": "closable";
199
+ "required": false;
200
+ "isSignal": true;
201
+ };
202
+ "closeTooltip": {
203
+ "alias": "closeTooltip";
204
+ "required": false;
205
+ "isSignal": true;
206
+ };
207
+ "closeTooltipPlacement": {
208
+ "alias": "closeTooltipPlacement";
209
+ "required": false;
210
+ "isSignal": true;
211
+ };
125
212
  }, {}, never, never, true, never>;
126
213
  }
127
214
  /**
@@ -150,6 +237,110 @@ export declare class RtTabsControlDirective {
150
237
  };
151
238
  }, {}, never, never, true, never>;
152
239
  }
240
+ /** Признак, по которому пользователь просит обходиться без движения. */
241
+ declare const RT_TABS_REDUCED_MOTION: string;
242
+ /** Куда сдвигается содержимое: к вкладке правее (`forward`) или левее (`backward`). */
243
+ type TRtTabsPanelShift = 'forward' | 'backward';
244
+ /** Панель прежней вкладки, пока её уход не кончился, и место, с которого она уходит (px от хоста). */
245
+ interface IRtTabsLeavingPanel {
246
+ readonly id: IRtTabs.Id;
247
+ readonly shift: TRtTabsPanelShift;
248
+ readonly top: number;
249
+ readonly left: number;
250
+ }
251
+ /** Смена выбора: с какой вкладки, на какую и длительность из входа (`null` — из токена). */
252
+ interface IRtTabsMove {
253
+ readonly previous: IRtTabs.Id | null;
254
+ readonly next: IRtTabs.Id | null;
255
+ readonly duration: string | null;
256
+ }
257
+ /**
258
+ * Панель в области содержимого: активная, уходящая (`leaving`) или сохранённая скрытой (`idle`) —
259
+ * тело посещённой вкладки при `preserveContent`.
260
+ */
261
+ interface IRtTabsPanel {
262
+ readonly tab: RtTabDirective;
263
+ readonly leaving: IRtTabsLeavingPanel | null;
264
+ readonly idle: boolean;
265
+ }
266
+ /** Что показывает область содержимого: активная вкладка, длительность и сохранение посещённых. */
267
+ interface IRtTabsShown {
268
+ readonly active: Signal<RtTabDirective | null>;
269
+ readonly duration: () => IRtTabs.AnimationDuration;
270
+ readonly preserve: () => boolean;
271
+ }
272
+ /** Вкладки компонента: все объявленные, видимые и выбранная. */
273
+ interface IRtTabsSet {
274
+ readonly all: Signal<readonly RtTabDirective[]>;
275
+ readonly visible: Signal<readonly RtTabDirective[]>;
276
+ readonly selectedId: Signal<IRtTabs.Id | null>;
277
+ }
278
+ /** Место полосы выбранной вкладки внутри полосы вкладок: левый край, низ вкладки и ширина (px). */
279
+ interface IInkBox {
280
+ readonly x: number;
281
+ readonly bottom: number;
282
+ readonly width: number;
283
+ }
284
+ /** Длительность из входа в значение CSS: число и строка из одних цифр — миллисекунды. */
285
+ declare function rtTabsCssDuration(value: IRtTabs.AnimationDuration): string | null;
286
+ /** Длительность CSS в миллисекундах; то, что не читается как время, — ноль. */
287
+ declare function rtTabsDurationMs(value: string): number;
288
+ /**
289
+ * Уходящая панель при смене выбора. Место берётся у панели прежней вкладки, пока она ещё в потоке:
290
+ * уходя, она встаёт поверх области содержимого в ту же точку. Без движения — нулевая длительность
291
+ * или `prefers-reduced-motion` — уходящей панели нет.
292
+ */
293
+ declare function rtTabsLeavingPanel(host: HTMLElement, win: Window | null, ids: readonly IRtTabs.Id[], move: IRtTabsMove): IRtTabsLeavingPanel | null;
294
+ /**
295
+ * Панели при сохранении посещённых: тело вкладки появляется при первом открытии и дальше живёт
296
+ * скрытым. Порядок — порядок вкладок, чтобы вид панели не переставлялся в разметке при смене.
297
+ */
298
+ declare function rtTabsPreservedPanels(all: readonly RtTabDirective[], visited: ReadonlySet<IRtTabs.Id>, active: RtTabDirective, leaving: IRtTabsLeavingPanel | null): IRtTabsPanel[];
299
+ /**
300
+ * Смена панелей: уходящая панель прежней вкладки и въезжающая новая. Уходящая считается от смены
301
+ * выбора и гасится концом её движения. Создаётся в контексте внедрения компонента.
302
+ */
303
+ declare class RtTabsPanels {
304
+ #private;
305
+ /** Панель прежней вкладки, пока она уходит; без движения её нет вовсе. */
306
+ readonly leaving: WritableSignal<IRtTabsLeavingPanel | null>;
307
+ /**
308
+ * Панели области содержимого: активная и, пока она уходит, прежняя. Прежняя стоит первой, и
309
+ * `track` по id сохраняет её вид — уходит та же панель, а не её новая копия. При сохранении
310
+ * посещённых панели стоят в порядке вкладок, и неактивные остаются скрытыми.
311
+ */
312
+ readonly list: Signal<readonly IRtTabsPanel[]>;
313
+ /** Направление идущей смены панели; `null` — панель стоит на месте. */
314
+ readonly shift: Signal<TRtTabsPanelShift | null>;
315
+ /** Длительность из входа `animationDuration` в виде CSS; `null` — длительности из токенов. */
316
+ readonly duration: Signal<string | null>;
317
+ /** Длительности полосы и панели на хосте из входа; без входа их держат токены. Прокрутку полосы
318
+ * вход не трогает, как у `mat-tab-group`: её длительность — только токен. */
319
+ readonly durations: Signal<Readonly<Record<string, string>> | null>;
320
+ constructor(host: HTMLElement, win: Window | null, tabs: IRtTabsSet, shown: IRtTabsShown);
321
+ /** Конец движения панели убирает уходящую. Движение вложенных узлов сюда не считается. */
322
+ animationEnd(event: AnimationEvent): void;
323
+ }
324
+ /**
325
+ * Полоса выбранной вкладки — один элемент на всю полосу: замер ставит её под выбранную вкладку, и
326
+ * при смене выбора она переезжает. Слежение за размером полосы и вкладок ловит сдвиг без смены
327
+ * выбора — подпись поменялась или шрифт догрузился.
328
+ */
329
+ declare class RtTabsInk {
330
+ #private;
331
+ /** Где стоит полоса; `null` — не измерена, и полосу рисует сама вкладка. */
332
+ readonly box: WritableSignal<IInkBox | null>;
333
+ /** Полоса уже стоит на месте и дальше переезжает: первое измерение ставит её без движения. */
334
+ readonly animated: WritableSignal<boolean>;
335
+ /** Сдвиг полосы к левому краю вкладки и к её низу. */
336
+ readonly translate: Signal<string | null>;
337
+ /** Полоса красится как ошибка, когда выбранная вкладка неверна. */
338
+ readonly invalid: Signal<boolean>;
339
+ constructor(win: Window | null, list: Signal<ElementRef<HTMLElement> | undefined>, tabs: {
340
+ readonly visible: Signal<readonly RtTabDirective[]>;
341
+ readonly active: Signal<RtTabDirective | null>;
342
+ });
343
+ }
153
344
  type TScrollDirection = 'before' | 'after';
154
345
  /**
155
346
  * Полоса вкладок с проекцией контента. Вкладки декларируются через
@@ -162,11 +353,18 @@ type TScrollDirection = 'before' | 'after';
162
353
  * эмиттят `activeIdChange`; синхронизацию `activeId` оставляем потребителю.
163
354
  *
164
355
  * Горизонтальная полоса при переполнении прячет вкладки под скролл и показывает
165
- * стрелки-«хвосты» (`__rest`) с прокруткой по удержанию. Вертикальная ориентация
166
- * раскладывает вкладки в колонку без стрелок.
356
+ * стрелки-«хвосты» (`__rest`): нажатие сдвигает полосу на шаг `scrollStep`, удержание
357
+ * прокручивает непрерывно. Стрелки стоят поверх вкладок или, при `scrollArrows="inline"`, в своих
358
+ * местах по краям. Вертикальная ориентация раскладывает вкладки в колонку без стрелок.
359
+ *
360
+ * Смена вкладки движется: полоса выбранной вкладки — один элемент полосы, он переезжает на новую
361
+ * вкладку; панель прежней вкладки уходит в сторону, обратную переходу, новая въезжает следом.
362
+ * Длительности — токены `--rt-tabs-indicator-duration` и `--rt-tabs-panel-duration` или вход
363
+ * `animationDuration`; `prefers-reduced-motion` снимает движение целиком.
167
364
  *
168
365
  * Доступность: `role="tablist"`/`role="tab"`/`role="tabpanel"`, `aria-selected`,
169
- * roving `tabindex`, навигация стрелками + Home/End.
366
+ * roving `tabindex`, навигация стрелками + Home/End; при `activation="manual"` они только
367
+ * переводят фокус, а вкладку открывают Enter и Space.
170
368
  */
171
369
  export declare class RtTabsComponent {
172
370
  #private;
@@ -187,10 +385,21 @@ export declare class RtTabsComponent {
187
385
  protected readonly selectedId: Signal<IRtTabs.Id | null>;
188
386
  /** Активная вкладка целиком (для рендера панели). */
189
387
  protected readonly activeTab: Signal<RtTabDirective | null>;
388
+ /**
389
+ * Вкладка в таб-порядке: та, на которую стрелками перевели фокус в ручном режиме, иначе
390
+ * активная. Фокус на вкладке, которой больше нет или которая отключилась, не держится.
391
+ */
392
+ protected readonly focusId: Signal<IRtTabs.Id | null>;
190
393
  /** Видны ли стрелки прокрутки слева/справа (только горизонтальная полоса). */
191
394
  protected readonly restBeforeVisible: WritableSignal<boolean>;
192
395
  protected readonly restAfterVisible: WritableSignal<boolean>;
396
+ /** Полоса шире своего места: в раскладке `inline` по этому признаку встают обе стрелки. */
397
+ protected readonly overflowing: Signal<boolean>;
193
398
  protected readonly tabListRef: Signal<ElementRef<HTMLElement> | undefined>;
399
+ /** Смена панелей: прежняя уходит в сторону, обратную переходу, новая въезжает следом. */
400
+ protected readonly panels: RtTabsPanels;
401
+ /** Полоса выбранной вкладки: одна на всю полосу, переезжает при смене выбора. */
402
+ protected readonly ink: RtTabsInk;
194
403
  /** Контролируемый активный id. `null` — компонент сам выбирает первую вкладку. */
195
404
  readonly activeId: InputSignal<IRtTabs.Id | null>;
196
405
  /** Ориентация полосы. */
@@ -199,15 +408,55 @@ export declare class RtTabsComponent {
199
408
  readonly stretch: InputSignalWithTransform<boolean, BooleanInput>;
200
409
  /** Скроллить область контента при переполнении. */
201
410
  readonly contentScrollable: InputSignalWithTransform<boolean, BooleanInput>;
411
+ /**
412
+ * Только полоса, без панели: вкладки служат навигацией, а содержимое живёт в другом месте —
413
+ * например, полоса стоит в середине `rt-toolbar`. Панель `role="tabpanel"` не рисуется, и
414
+ * вкладки не ссылаются на неё.
415
+ */
416
+ readonly headerOnly: InputSignalWithTransform<boolean, BooleanInput>;
417
+ /**
418
+ * Тело вкладки создаётся при первом открытии и дальше живёт скрытым, как у `mat-tab-group` с
419
+ * `preserveContent`: введённое на вкладке переживает уход с неё. Неоткрытая вкладка не создаётся.
420
+ */
421
+ readonly preserveContent: InputSignalWithTransform<boolean, BooleanInput>;
422
+ /** Стрелки и Home/End открывают вкладку сразу (`auto`) или только переводят фокус (`manual`). */
423
+ readonly activation: InputSignal<IRtTabs.Activation>;
424
+ /** Стрелки прокрутки поверх вкладок (`overlay`) или в своих местах по краям полосы (`inline`). */
425
+ readonly scrollArrows: InputSignal<IRtTabs.ScrollArrows>;
426
+ /** Шаг нажатия на стрелку: 80 px (`fixed`), видимая ширина полосы (`page`) или её треть (`third`), как у Material. */
427
+ readonly scrollStep: InputSignal<IRtTabs.ScrollStep>;
428
+ /**
429
+ * Длительность движения при смене вкладки — и полосы, и панели, как у `mat-tab-group`: `500`,
430
+ * `'500ms'`, `'0.5s'`; `0` выключает движение. Без входа длительности берутся из токенов.
431
+ */
432
+ readonly animationDuration: InputSignal<IRtTabs.AnimationDuration>;
433
+ /** Таб-стоп открытой панели, как `contentTabIndex` у `mat-tab-group`: `null` — Tab идёт с полосы прямо в поля панели. */
434
+ readonly contentTabIndex: InputSignal<number | null>;
202
435
  /** Эмиттит id вкладки при её выборе (клик/клавиатура). */
203
436
  readonly activeIdChange: OutputEmitterRef<IRtTabs.Id>;
437
+ /**
438
+ * Просьба закрыть вкладку с `closable`: крестик или Delete на вкладке в фокусе. Набор вкладок
439
+ * держит потребитель — он и убирает вкладку; закрытая активная откатывается на первую доступную.
440
+ */
441
+ readonly tabClose: OutputEmitterRef<IRtTabs.Id>;
204
442
  constructor();
205
443
  protected selectTab(id: IRtTabs.Id): void;
206
- /** Навигация по вкладкам с клавиатуры (automatic activation). */
207
- protected onTabKeydown(event: KeyboardEvent): void;
208
- /** Старт прокрутки полосы по удержанию ЛКМ на стрелке. */
444
+ /** Крестик: нажатие не выбирает вкладку; фокус с крестика после закрытия уходит на вкладку, не на страницу. */
445
+ protected onCloseClick(event: MouseEvent, tab: RtTabDirective): void;
446
+ /**
447
+ * Навигация по вкладкам с клавиатуры. Шаг считается от вкладки в фокусе: в ручном режиме она
448
+ * не совпадает с активной. Enter и Space ловит сама кнопка — они дают click и выбор.
449
+ */
450
+ protected onTabKeydown(event: KeyboardEvent, tab: RtTabDirective): void;
451
+ /**
452
+ * Нажатие ЛКМ на стрелку. Отпущенная до `HOLD_DELAY_MS` стрелка сдвигает полосу на шаг
453
+ * `scrollStep`, удержанная дольше — прокручивает её непрерывно, пока не отпустят.
454
+ */
209
455
  protected onRestPointerDown(direction: TScrollDirection, event: MouseEvent): void;
456
+ /** Стрелку отпустили: короткое нажатие — шаг `scrollStep`, после удержания — только стоп. */
210
457
  protected onRestPointerUp(): void;
458
+ /** Указатель ушёл со стрелки: прокрутка останавливается, шага нет. */
459
+ protected onRestPointerLeave(): void;
211
460
  protected onTabListScroll(): void;
212
461
  static ɵfac: i0.ɵɵFactoryDeclaration<RtTabsComponent, never>;
213
462
  static ɵcmp: i0.ɵɵComponentDeclaration<RtTabsComponent, "rt-tabs", never, {
@@ -231,8 +480,44 @@ export declare class RtTabsComponent {
231
480
  "required": false;
232
481
  "isSignal": true;
233
482
  };
483
+ "headerOnly": {
484
+ "alias": "headerOnly";
485
+ "required": false;
486
+ "isSignal": true;
487
+ };
488
+ "preserveContent": {
489
+ "alias": "preserveContent";
490
+ "required": false;
491
+ "isSignal": true;
492
+ };
493
+ "activation": {
494
+ "alias": "activation";
495
+ "required": false;
496
+ "isSignal": true;
497
+ };
498
+ "scrollArrows": {
499
+ "alias": "scrollArrows";
500
+ "required": false;
501
+ "isSignal": true;
502
+ };
503
+ "scrollStep": {
504
+ "alias": "scrollStep";
505
+ "required": false;
506
+ "isSignal": true;
507
+ };
508
+ "animationDuration": {
509
+ "alias": "animationDuration";
510
+ "required": false;
511
+ "isSignal": true;
512
+ };
513
+ "contentTabIndex": {
514
+ "alias": "contentTabIndex";
515
+ "required": false;
516
+ "isSignal": true;
517
+ };
234
518
  }, {
235
519
  "activeIdChange": "activeIdChange";
520
+ "tabClose": "tabClose";
236
521
  }, ["tabs", "controls"], never, true, never>;
237
522
  }
238
523
  export {};
@@ -4,6 +4,8 @@ import { ElementRef, InputSignal, InputSignalWithTransform, Signal } from "@angu
4
4
  import { RtFormControlBase } from "@rt-tools/ui-kit-v2/form-control";
5
5
  import * as i1 from "@rt-tools/ui-kit-v2/radius";
6
6
  export type TRtTextareaResize = 'none' | 'vertical';
7
+ /** Вид рамки: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу, как у `rt-input`. */
8
+ export type TRtTextareaAppearance = 'outline' | 'fill';
7
9
  /**
8
10
  * Шеренный textarea common/ui. CVA через общий `RtFormControlBase` —
9
11
  * авто-подсветка invalid. Размерные варианты sm/md/lg через host-класс. Resize
@@ -18,11 +20,15 @@ export type TRtTextareaResize = 'none' | 'vertical';
18
20
  export declare class RtTextareaComponent extends RtFormControlBase<string> {
19
21
  protected readonly fieldEl: Signal<ElementRef<HTMLTextAreaElement> | undefined>;
20
22
  protected readonly hasValue: Signal<boolean>;
23
+ readonly fieldLabelInside: boolean;
21
24
  readonly displayText: Signal<string>;
22
25
  readonly placeholder: InputSignal<string>;
23
26
  readonly readonly: InputSignalWithTransform<boolean, BooleanInput>;
24
27
  readonly rows: InputSignalWithTransform<number, NumberInput>;
25
28
  readonly resize: InputSignal<TRtTextareaResize>;
29
+ readonly appearance: InputSignal<TRtTextareaAppearance>;
30
+ /** Предел длины значения: атрибут `maxlength` на поле, браузер не даёт набрать больше. `null` — предела нет. */
31
+ readonly maxlength: InputSignalWithTransform<number | null, NumberInput>;
26
32
  protected getEmptyValue(): string;
27
33
  protected focusAfterClear(): void;
28
34
  protected onInput(event: Event): void;
@@ -49,6 +55,16 @@ export declare class RtTextareaComponent extends RtFormControlBase<string> {
49
55
  "required": false;
50
56
  "isSignal": true;
51
57
  };
58
+ "appearance": {
59
+ "alias": "appearance";
60
+ "required": false;
61
+ "isSignal": true;
62
+ };
63
+ "maxlength": {
64
+ "alias": "maxlength";
65
+ "required": false;
66
+ "isSignal": true;
67
+ };
52
68
  }, {}, never, never, true, [{
53
69
  directive: typeof i1.RtRadiusDirective;
54
70
  inputs: {
@@ -1,13 +1,15 @@
1
1
  import { BooleanInput } from "@angular/cdk/coercion";
2
2
  import * as i0 from "@angular/core";
3
- import { AfterViewInit, InjectionToken, InputSignal, InputSignalWithTransform, OnDestroy, OutputEmitterRef, Signal, WritableSignal } from "@angular/core";
4
- import { INotification, IRtIcon, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
3
+ import { AfterViewInit, InjectionToken, Injector, InputSignal, InputSignalWithTransform, OnDestroy, OutputEmitterRef, Signal, Type, WritableSignal } from "@angular/core";
4
+ import { INotification, IRtIcon, NotificationRef, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
5
5
  export declare const RT_TOASTER_GAP_PX: number;
6
6
  /**
7
7
  * Значки severity у тоста. Приложение подменяет карту целиком — например, на имена
8
8
  * Material, — а тост со своим `icon` берёт свой значок мимо карты.
9
9
  */
10
10
  export declare const RT_TOAST_SEVERITY_ICONS: InjectionToken<Readonly<Record<INotification.Severity, IRtIcon.Name>>>;
11
+ /** Данные своего компонента тоста — то, что приложение передало в `openFromComponent`. */
12
+ export declare const RT_TOAST_DATA: InjectionToken<unknown>;
11
13
  export declare namespace IRtToaster {
12
14
  type Position = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
13
15
  type PositionY = 'top' | 'bottom';
@@ -29,6 +31,21 @@ export declare namespace IRtToaster {
29
31
  readonly onDismiss?: (reason: INotification.DismissReason) => void;
30
32
  /** Тост вытеснен новым в режиме `replace` и уходит своей анимацией. */
31
33
  readonly replaced?: boolean;
34
+ readonly progressValue?: number | null;
35
+ readonly details?: string;
36
+ readonly component?: Type<unknown>;
37
+ readonly data?: unknown;
38
+ /** Голый тост: оболочки нет, свой компонент рисует карточку сам. */
39
+ readonly bare?: boolean;
40
+ /** Ручка тоста: тост сообщает ей, почему ушёл. */
41
+ readonly ref?: NotificationRef;
42
+ /** Приложение закрыло тост ручкой: он уходит своей анимацией, как вытесненный. */
43
+ readonly dismissRequested?: boolean;
44
+ }
45
+ /** Изменение показанного тоста от его ручки. */
46
+ interface Change {
47
+ readonly toastId: number;
48
+ readonly patch: INotification.Update & Pick<Toast, 'dismissRequested'>;
32
49
  }
33
50
  interface Height {
34
51
  readonly toastId: number;
@@ -42,6 +59,14 @@ export declare class RtToastComponent implements AfterViewInit, OnDestroy {
42
59
  protected readonly icon: Signal<IRtIcon.Name | null>;
43
60
  /** Срок жизни тоста: свой, если задан, иначе тостера; `null` — таймера нет. */
44
61
  protected readonly lifetime: Signal<number | null>;
62
+ /** Инжектор своего компонента: данные токеном `RT_TOAST_DATA` и ручка `NotificationRef`. */
63
+ protected readonly componentInjector: Signal<Injector>;
64
+ /** Живая доля задачи: число 0–100 — полоса стоит, `null` и пусто — её нет. */
65
+ protected readonly progressValue: Signal<number | null>;
66
+ /** Подробности раскрыты. */
67
+ protected readonly detailsOpen: WritableSignal<boolean>;
68
+ /** Голый тост: значка, крестика и полосы срока нет, оболочку снимает модификатор. */
69
+ protected readonly bare: Signal<boolean>;
45
70
  protected readonly showProgress: Signal<boolean>;
46
71
  /** Таймер и полоса срока встают от одного признака, чтобы не разойтись. */
47
72
  protected readonly paused: Signal<boolean>;
@@ -66,6 +91,7 @@ export declare class RtToastComponent implements AfterViewInit, OnDestroy {
66
91
  protected onAction(): void;
67
92
  protected onSecondaryAction(): void;
68
93
  protected onClose(): void;
94
+ protected toggleDetails(): void;
69
95
  static ɵfac: i0.ɵɵFactoryDeclaration<RtToastComponent, never>;
70
96
  static ɵcmp: i0.ɵɵComponentDeclaration<RtToastComponent, "rt-toast", never, {
71
97
  "toast": {
@@ -139,6 +165,11 @@ export declare class RtToasterComponent {
139
165
  /** `replace` — новый тост уводит прежние их же анимацией ухода, а не копится стопкой. */
140
166
  readonly mode: InputSignal<IRtToaster.Mode>;
141
167
  readonly expand: InputSignalWithTransform<boolean, boolean | string>;
168
+ /**
169
+ * Канал тостера: он показывает только события с этим `channel`. Второй тостер со своим каналом
170
+ * держит закреплённые тосты в своём углу и своей стопке.
171
+ */
172
+ readonly channel: InputSignal<string>;
142
173
  get hostModifierClasses(): Record<string, boolean>;
143
174
  get hostStackStyles(): Record<string, string>;
144
175
  constructor();
@@ -176,5 +207,10 @@ export declare class RtToasterComponent {
176
207
  "required": false;
177
208
  "isSignal": true;
178
209
  };
210
+ "channel": {
211
+ "alias": "channel";
212
+ "required": false;
213
+ "isSignal": true;
214
+ };
179
215
  }, {}, never, never, true, never>;
180
216
  }
@@ -1,6 +1,7 @@
1
1
  import { BooleanInput } from "@angular/cdk/coercion";
2
2
  import * as i0 from "@angular/core";
3
- import { InputSignal, InputSignalWithTransform, OutputEmitterRef, Signal } from "@angular/core";
3
+ import { InputSignal, InputSignalWithTransform, OutputEmitterRef, Signal, TemplateRef } from "@angular/core";
4
+ import { ControlValueAccessor } from "@angular/forms";
4
5
  import { IRtIcon } from "@rt-tools/ui-kit-v2/core";
5
6
  import * as i1 from "@rt-tools/ui-kit-v2/radius";
6
7
  /**
@@ -46,7 +47,48 @@ export declare namespace IRtToggleButtonGroup {
46
47
  readonly option: Option<T>;
47
48
  readonly active: boolean;
48
49
  readonly disabled: boolean;
50
+ readonly context: OptionContext<T>;
49
51
  }
52
+ /** Обстановка шаблона сегмента: опция приходит как `$implicit`. */
53
+ interface OptionContext<T = string> {
54
+ readonly $implicit: Option<T>;
55
+ /** Нажат ли сегмент. */
56
+ readonly active: boolean;
57
+ }
58
+ /**
59
+ * Раскладка сегментов. `row` — одна строка, как прежде; `wrap` — сегменты, не влезшие в строку,
60
+ * уходят на следующую; `column` — сегменты стоят один под другим.
61
+ */
62
+ type Layout = 'row' | 'wrap' | 'column';
63
+ /**
64
+ * Вид группы. `segmented` — дорожка с сегментами, выбранный светлее дорожки; `chips` — отдельные
65
+ * пункты с обводкой и просветом между ними, выбранный залит. Поведение у обоих одно: выбор,
66
+ * множественный выбор, раскладка и связь с формой от вида не зависят.
67
+ */
68
+ type Appearance = 'segmented' | 'chips';
69
+ /** Значение, которое группа пишет в форму: одно при одиночном выборе, набор — при множественном. */
70
+ type FormValue<T = string> = T | ReadonlyArray<T> | null | undefined;
71
+ }
72
+ /**
73
+ * Маркер своей разметки сегмента — того, что рисуется внутри кнопки на месте значка и подписи.
74
+ *
75
+ * Кнопка остаётся киту: нажатие, подсветка, недоступность, фокус и связь с формой. Потребитель даёт
76
+ * только содержимое — например картинку-превью раскладки — и получает опцию и признак, нажат ли
77
+ * сегмент.
78
+ *
79
+ * @example
80
+ * ```html
81
+ * <rt-toggle-button-group [options]="layouts" formControlName="layout">
82
+ * <ng-template rtToggleButtonOption let-option let-active="active">
83
+ * <img [src]="option.value + '.svg'" [alt]="option.label" />
84
+ * </ng-template>
85
+ * </rt-toggle-button-group>
86
+ * ```
87
+ */
88
+ export declare class RtToggleButtonOptionDirective<T = string> {
89
+ readonly templateRef: TemplateRef<IRtToggleButtonGroup.OptionContext<T>>;
90
+ static ɵfac: i0.ɵɵFactoryDeclaration<RtToggleButtonOptionDirective<any>, never>;
91
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RtToggleButtonOptionDirective<any>, "[rtToggleButtonOption]", never, {}, {}, never, never, true, never>;
50
92
  }
51
93
  /**
52
94
  * Generic segmented control кита.
@@ -66,7 +108,11 @@ export declare namespace IRtToggleButtonGroup {
66
108
  * union'ы, enum'ы). Дефолт `string` нужен, чтобы шаблон-инстанцирование
67
109
  * без явного параметра компилировалось.
68
110
  */
69
- export declare class RtToggleButtonGroupComponent<T = string> {
111
+ export declare class RtToggleButtonGroupComponent<T = string> implements ControlValueAccessor {
112
+ #private;
113
+ protected readonly isDisabled: Signal<boolean>;
114
+ /** Своя разметка сегмента; без неё кнопка рисует значок и подпись. */
115
+ protected readonly optionTpl: Signal<RtToggleButtonOptionDirective<T> | undefined>;
70
116
  protected readonly iconSize: Signal<IRtIcon.Size>;
71
117
  /**
72
118
  * Сегменты, готовые к отрисовке: подсветка и недоступность посчитаны здесь, а не в шаблоне.
@@ -93,12 +139,31 @@ export declare class RtToggleButtonGroupComponent<T = string> {
93
139
  readonly disabled: InputSignalWithTransform<boolean, BooleanInput>;
94
140
  /** Растягивает группу на всю ширину контейнера; опции делят ширину поровну. */
95
141
  readonly fullWidth: InputSignalWithTransform<boolean, BooleanInput>;
142
+ /**
143
+ * Раскладка сегментов: одна строка, перенос на следующую или столбик. Перенос нужен длинным
144
+ * спискам во всплывающих окнах, столбик — спискам вроде дней недели.
145
+ */
146
+ readonly layout: InputSignal<IRtToggleButtonGroup.Layout>;
147
+ /**
148
+ * Вид группы: дорожка с сегментами или отдельные чипы. Вид — входом, а не классом потребителя:
149
+ * у чипов своя коробка пункта, свой просвет и своя подсветка, и класс снаружи до неё не достаёт.
150
+ */
151
+ readonly appearance: InputSignal<IRtToggleButtonGroup.Appearance>;
152
+ /**
153
+ * Галочка перед подписью выбранного пункта, как у фильтр-чипа Material. Выключена по умолчанию:
154
+ * в сегментах выбор и так виден подложкой, а место под галочку раздвигает пункт.
155
+ */
156
+ readonly checkmark: InputSignalWithTransform<boolean, BooleanInput>;
96
157
  readonly valueChange: OutputEmitterRef<T>;
97
158
  /**
98
159
  * Весь набор выбранного после нажатия, а не разница с прежним: разницу вызывающий сводит со
99
160
  * своим состоянием сам, и каждый сводит по-своему.
100
161
  */
101
162
  readonly valuesChange: OutputEmitterRef<ReadonlyArray<T>>;
163
+ writeValue(value: IRtToggleButtonGroup.FormValue<T>): void;
164
+ registerOnChange(fn: (value: IRtToggleButtonGroup.FormValue<T>) => void): void;
165
+ registerOnTouched(fn: () => void): void;
166
+ setDisabledState(disabled: boolean): void;
102
167
  protected onOptionClick(item: IRtToggleButtonGroup.Rendered<T>): void;
103
168
  static ɵfac: i0.ɵɵFactoryDeclaration<RtToggleButtonGroupComponent<any>, never>;
104
169
  static ɵcmp: i0.ɵɵComponentDeclaration<RtToggleButtonGroupComponent<any>, "rt-toggle-button-group", never, {
@@ -142,10 +207,25 @@ export declare class RtToggleButtonGroupComponent<T = string> {
142
207
  "required": false;
143
208
  "isSignal": true;
144
209
  };
210
+ "layout": {
211
+ "alias": "layout";
212
+ "required": false;
213
+ "isSignal": true;
214
+ };
215
+ "appearance": {
216
+ "alias": "appearance";
217
+ "required": false;
218
+ "isSignal": true;
219
+ };
220
+ "checkmark": {
221
+ "alias": "checkmark";
222
+ "required": false;
223
+ "isSignal": true;
224
+ };
145
225
  }, {
146
226
  "valueChange": "valueChange";
147
227
  "valuesChange": "valuesChange";
148
- }, never, never, true, [{
228
+ }, ["optionTpl"], never, true, [{
149
229
  directive: typeof i1.RtRadiusDirective;
150
230
  inputs: {
151
231
  "radius": "radius";