@rt-tools/ui-kit-v2 0.33.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 (217) 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 +113 -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 +2 -1
  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/styles/_color-scheme.scss +1 -1
  183. package/src/styles/_density.scss +48 -0
  184. package/src/styles/_index.scss +8 -0
  185. package/src/styles/_preset-material.scss +160 -70
  186. package/src/styles/_primitives.scss +1 -0
  187. package/src/styles/_semantic-navigation.scss +117 -0
  188. package/src/styles/_semantic.scss +29 -98
  189. package/src/styles/_theme-dark.scss +8 -0
  190. package/styles/tokens.css +2066 -1134
  191. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +34 -0
  192. package/types/rt-tools-ui-kit-v2-badge.d.ts +71 -0
  193. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +17 -3
  194. package/types/rt-tools-ui-kit-v2-container.d.ts +65 -9
  195. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +11 -1
  196. package/types/rt-tools-ui-kit-v2-core.d.ts +109 -4
  197. package/types/rt-tools-ui-kit-v2-divider.d.ts +29 -0
  198. package/types/rt-tools-ui-kit-v2-drawer.d.ts +257 -0
  199. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +240 -25
  200. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +87 -3
  201. package/types/rt-tools-ui-kit-v2-field.d.ts +18 -1
  202. package/types/rt-tools-ui-kit-v2-form-control.d.ts +42 -4
  203. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +2 -1
  204. package/types/rt-tools-ui-kit-v2-input-number.d.ts +1 -0
  205. package/types/rt-tools-ui-kit-v2-input.d.ts +98 -4
  206. package/types/rt-tools-ui-kit-v2-progress-bar.d.ts +53 -0
  207. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +80 -1
  208. package/types/rt-tools-ui-kit-v2-select.d.ts +65 -1
  209. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +3 -0
  210. package/types/rt-tools-ui-kit-v2-stepper.d.ts +57 -4
  211. package/types/rt-tools-ui-kit-v2-tabs.d.ts +291 -6
  212. package/types/rt-tools-ui-kit-v2-textarea.d.ts +16 -0
  213. package/types/rt-tools-ui-kit-v2-toast.d.ts +38 -2
  214. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +83 -3
  215. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +17 -2
  216. package/types/rt-tools-ui-kit-v2.d.ts +4 -0
  217. package/src/lib/components/dynamic-selector/stories/component/test-dynamic-selector-popup-frame.component.scss +0 -6
@@ -13,12 +13,18 @@
13
13
  </rt-container>
14
14
  ```
15
15
 
16
- | вход | тип | умолчание |
17
- | --------------- | ---------------------- | --------- |
18
- | `mobileLeftNav` | `'keep' \| 'bottom'` | `'keep'` |
19
- | `height` | `'auto' \| 'viewport'` | `'auto'` |
20
-
21
- Выходы: `backdropClick`, `rightOpened`, `rightClosed`. Публичное API: `openRight()`,
16
+ | вход | тип | умолчание |
17
+ | ---------------- | ---------------------- | --------- |
18
+ | `mobileLeftNav` | `'keep' \| 'bottom'` | `'keep'` |
19
+ | `height` | `'auto' \| 'viewport'` | `'auto'` |
20
+ | `rightMode` | `'over' \| 'side'` | `'over'` |
21
+ | `rightBackdrop` | `boolean` | `true` |
22
+ | `rightWidth` | `number \| null` | `null` |
23
+ | `rightResizable` | `boolean` | `false` |
24
+ | `rightMinWidth` | `number` | `240` |
25
+ | `rightMaxWidth` | `number` | `960` |
26
+
27
+ Выходы: `backdropClick`, `rightOpened`, `rightClosed`, `rightWidthChange`. Публичное API: `openRight()`,
22
28
  `closeRight()`, `rightOpen()`, `rightOverlayReady()`.
23
29
 
24
30
  ## Главное, что нужно знать
@@ -35,6 +41,17 @@
35
41
  **Правая панель существует, только когда её зона объявлена.** Оверлей под неё создаётся заранее
36
42
  (`rightOverlayReady()`), а `openRight()` без объявленной зоны — no-op.
37
43
 
44
+ **Место правой панели — `rightMode`, и оно переключается на ходу.** `side` ставит панель
45
+ колонкой справа (сетка `auto 1fr auto`), `over` — прежний оверлей. Смена места или подложки
46
+ пересоздаёт оверлей; открытая панель остаётся открытой без второго `rightOpened`, а содержимое
47
+ создаётся заново. Готовность (`rightOverlayReady()`) в `side` — это объявленная зона.
48
+
49
+ **Ширина — `rightWidth` и ручка `rt-resize-handle` из `@rt-tools/ui-kit-v2/drawer`.** Одна
50
+ обёртка (`#rightPane`) с шириной и ручкой ставится и в колонку, и в оверлей. В оверлее она
51
+ сжимается до его ширины: панель не шире окна, и длинное содержимое переносится. На узком экране
52
+ (не более 768 px) оверлей во всё окно, и панель с заданной шириной заполняет его, как колонка.
53
+ В колонке рядом с содержимым сжатие запрещено: ширина держит содержимое во время перехода.
54
+
38
55
  **`rightOpened` / `rightClosed` привязаны к `transitionend` панели.** Там, где анимаций нет
39
56
  (тест, `prefers-reduced-motion`), события не придут, а `rightOpen()` уже верен — смотреть надо
40
57
  на него.
@@ -6,6 +6,7 @@
6
6
  @layer rt-kit.components {
7
7
  .rt-container {
8
8
  --rt-container-border-width: var(--rt-border-width-thin);
9
+ --rt-container-right-duration: var(--rt-duration-base);
9
10
 
10
11
  display: grid;
11
12
  min-height: 100%;
@@ -16,7 +17,11 @@
16
17
  /* Контейнер — место страницы: компоненты внутри считают пороги от его ширины. Боковая
17
18
  панель приложения рядом сужает его, и вид внутри сужается вместе с ним. */
18
19
  container: rt-place / inline-size;
19
- grid-template: 'header header' auto 'left-sidenav toolbar' auto 'left-sidenav content' 1fr / auto 1fr;
20
+ grid-template:
21
+ 'header header header' auto
22
+ 'left-sidenav toolbar right-sidenav' auto
23
+ 'left-sidenav content right-sidenav' 1fr
24
+ / auto 1fr auto;
20
25
 
21
26
  &__header {
22
27
  // Хедер закреплён вверху: при скролле документа (высота контейнера не
@@ -78,6 +83,68 @@
78
83
  flex-direction: column;
79
84
  grid-area: content;
80
85
  }
86
+
87
+ /* Правая панель колонкой рядом с содержимым (`rightMode="side"`). Закрытая сжимается до
88
+ нуля и гаснет после перехода; содержимое панели держит свою ширину и не переносится
89
+ заново на каждом кадре. */
90
+ &__right-sidenav {
91
+ --rt-container-right-width: auto;
92
+
93
+ display: flex;
94
+ overflow: clip;
95
+ min-height: 0;
96
+ border-left: var(--rt-container-border-width) solid var(--rt-color-border-subtle);
97
+ background-color: var(--rt-color-bg-surface);
98
+ grid-area: right-sidenav;
99
+ inline-size: var(--rt-container-right-width);
100
+ transition:
101
+ inline-size var(--rt-container-right-duration) ease,
102
+ visibility 0s linear;
103
+
104
+ &:not(#{&}--open) {
105
+ border-left-width: 0;
106
+ inline-size: 0;
107
+ transition:
108
+ inline-size var(--rt-container-right-duration) ease,
109
+ visibility 0s linear var(--rt-container-right-duration);
110
+ visibility: hidden;
111
+ }
112
+
113
+ &--resizing {
114
+ transition: none;
115
+ }
116
+ }
117
+ }
118
+
119
+ /* Обёртка правой панели: ширина и ручка. Живёт и в колонке сетки, и в оверлее в конце
120
+ страницы, поэтому стоит своим правилом, а не внутри блока. */
121
+ .rt-container__right-pane {
122
+ --rt-container-right-width: auto;
123
+
124
+ position: relative;
125
+ display: flex;
126
+ overflow: auto;
127
+ min-height: 0;
128
+ flex: 0 0 auto;
129
+ block-size: 100%;
130
+
131
+ /* Строка, как у панели оверлея: содержимое растягивается на всю высоту, и его
132
+ `height: 100%` считается от панели, а не от собственного содержимого. */
133
+ > :not(rt-resize-handle) {
134
+ min-width: 0;
135
+ flex: 1 1 auto;
136
+ }
137
+
138
+ &--sized {
139
+ inline-size: var(--rt-container-right-width);
140
+ }
141
+ }
142
+
143
+ /* В оверлее обёртка сжимается до его ширины: панель не шире окна, и содержимое переносится,
144
+ а не уходит за край. Колонке рядом с содержимым сжатие по-прежнему запрещено — там ширина
145
+ держит содержимое во время перехода. */
146
+ .cdk-overlay-pane > .rt-container__right-pane {
147
+ flex-shrink: 1;
81
148
  }
82
149
 
83
150
  /* App-shell раскладка (opt-in `height="viewport"`): контейнер жёстко равен
@@ -104,7 +171,29 @@
104
171
  }
105
172
  }
106
173
 
174
+ @media (prefers-reduced-motion: reduce) {
175
+ .rt-container__right-sidenav,
176
+ .rt-container__right-sidenav:not(.rt-container__right-sidenav--open) {
177
+ transition: none;
178
+ }
179
+ }
180
+
107
181
  @media (width <= 768px) {
182
+ /* На узком экране колонке рядом с содержимым нет места: панель ложится на зону
183
+ содержимого и панели инструментов, на всю их ширину. */
184
+ .rt-container__right-sidenav {
185
+ grid-column: content;
186
+ grid-row: toolbar / content;
187
+ inline-size: auto;
188
+ }
189
+
190
+ /* Оверлей здесь во всё окно, и панель поверх с заданной шириной заполняет его так же, а не
191
+ стоит у левого края с щелью справа. */
192
+ .rt-container__right-sidenav .rt-container__right-pane--sized,
193
+ .cdk-overlay-pane > .rt-container__right-pane--sized {
194
+ inline-size: 100%;
195
+ }
196
+
108
197
  // Opt-in: левый sidenav сворачивается в нижний ряд grid'а (таб-бар).
109
198
  // Контент занимает всю ширину и скроллится в своём `1fr` над баром —
110
199
  // бар остаётся видимым без position:fixed и без привязки к его высоте.
@@ -4,11 +4,12 @@
4
4
  <rt-copy-value label="Reference" copyLabel="Copy reference" [value]="error.referenceId" />
5
5
  ```
6
6
 
7
- | вход | тип | умолчание |
8
- | ----------- | -------- | ---------------------------- |
9
- | `value` | `string` | обязателен |
10
- | `label` | `string` | `''` — не рисуется |
11
- | `copyLabel` | `string` | `''` → переведённое `uiCopy` |
7
+ | вход | тип | умолчание |
8
+ | ----------- | --------- | --------------------------------------------- |
9
+ | `value` | `string` | обязателен |
10
+ | `label` | `string` | `''` — не рисуется |
11
+ | `copyLabel` | `string` | `''` → переведённое `uiCopy` |
12
+ | `wrap` | `boolean` | `false` — многострочное значение с прокруткой |
12
13
 
13
14
  Выход: `copiedValue` — значение, ушедшее в буфер.
14
15
 
@@ -4,6 +4,7 @@
4
4
 
5
5
  .rt-copy-value {
6
6
  --rt-copy-value-radius: var(--rt-radius-sm);
7
+ --rt-copy-value-wrap-max-height: var(--rt-size-30);
7
8
 
8
9
  display: inline-flex;
9
10
  align-items: center;
@@ -35,5 +36,20 @@
35
36
  &__button {
36
37
  flex: none;
37
38
  }
39
+
40
+ /* Многострочное значение: переносится по строкам, держит свою высоту и прокручивается в
41
+ ней. Кнопка стоит у верхнего края, рядом с началом текста. */
42
+ &--wrap {
43
+ display: flex;
44
+ align-items: flex-start;
45
+ }
46
+
47
+ &--wrap &__value {
48
+ overflow: auto;
49
+ flex: 1 1 auto;
50
+ max-block-size: var(--rt-copy-value-wrap-max-height);
51
+ overflow-wrap: anywhere;
52
+ white-space: pre-wrap;
53
+ }
38
54
  }
39
55
  }
@@ -4,6 +4,7 @@
4
4
  .rt-date-picker {
5
5
  --rt-date-picker-radius: var(--rt-input-radius);
6
6
  --rt-date-picker-fill-radius: var(--rt-radius-sm);
7
+ --rt-date-picker-color-border-hover: var(--rt-color-text-primary);
7
8
 
8
9
  position: relative;
9
10
  display: inline-flex;
@@ -29,6 +30,12 @@
29
30
  outline-offset: var(--rt-input-focus-outline-offset);
30
31
  }
31
32
 
33
+ /* Наведение в материальном наборе — как у поля Material: рамка цвета текста. `:where` держит
34
+ силу правила на уровне вида, и фокус, ошибка, залитый вид и «без рамки» его перекрывают. */
35
+ :where(.rt-preset-material, [data-preset='material']) &:where(:hover:not(:has(:disabled))) {
36
+ border-color: var(--rt-date-picker-color-border-hover);
37
+ }
38
+
32
39
  /* bordered=false: снимаем только resting-рамку; invalid/focus/readonly идут
33
40
  ниже по source-order и перекрывают её своей рамкой. */
34
41
  &--borderless {
@@ -4,6 +4,7 @@
4
4
  .rt-date-range {
5
5
  --rt-date-range-radius: var(--rt-input-radius);
6
6
  --rt-date-range-fill-radius: var(--rt-radius-sm);
7
+ --rt-date-range-color-border-hover: var(--rt-color-text-primary);
7
8
 
8
9
  position: relative;
9
10
  display: inline-flex;
@@ -29,6 +30,12 @@
29
30
  outline-offset: var(--rt-input-focus-outline-offset);
30
31
  }
31
32
 
33
+ /* Наведение в материальном наборе — как у поля Material: рамка цвета текста. `:where` держит
34
+ силу правила на уровне вида, и фокус, ошибка, залитый вид и «без рамки» его перекрывают. */
35
+ :where(.rt-preset-material, [data-preset='material']) &:where(:hover:not(:has(:disabled))) {
36
+ border-color: var(--rt-date-range-color-border-hover);
37
+ }
38
+
32
39
  /* bordered=false: снимаем только resting-рамку; invalid/focus/readonly идут
33
40
  ниже по source-order и перекрывают её своей рамкой. */
34
41
  &--borderless {
@@ -0,0 +1,21 @@
1
+ # `rt-divider`
2
+
3
+ ```html
4
+ <rt-divider inset />
5
+ <rt-divider vertical />
6
+ ```
7
+
8
+ | вход | тип | умолчание |
9
+ | ---------- | --------- | --------- |
10
+ | `vertical` | `boolean` | `false` |
11
+ | `inset` | `boolean` | `false` |
12
+
13
+ Выходов нет.
14
+
15
+ ## Главное, что нужно знать
16
+
17
+ **Линия — граница хоста.** Вертикальная тянется по поперечной оси flex-строки (`align-self:
18
+ stretch`); в обычной строке она высотой в строку текста.
19
+
20
+ **`inset` значит разное по направлению.** Горизонтальная отступает от начала на
21
+ `--rt-divider-inset`, вертикальная укорачивается сверху и снизу на `--rt-divider-inset-block`.
@@ -0,0 +1,34 @@
1
+ @layer rt-kit.components {
2
+ /* rt-divider — линия-разделитель. ViewEncapsulation.None, линия — граница хоста. */
3
+ .rt-divider {
4
+ --rt-divider-width: var(--rt-border-width-thin);
5
+ --rt-divider-color: var(--rt-color-border-default);
6
+ --rt-divider-inset: var(--rt-space-16);
7
+ --rt-divider-inset-block: var(--rt-space-2);
8
+
9
+ display: block;
10
+ flex-shrink: 0;
11
+ border: 0;
12
+ border-top: var(--rt-divider-width) solid var(--rt-divider-color);
13
+ margin: 0;
14
+
15
+ &--inset {
16
+ margin-inline-start: var(--rt-divider-inset);
17
+ }
18
+
19
+ /* Вертикальная линия тянется по высоте строки: в гибкой строке — по поперечной оси. */
20
+ &--vertical {
21
+ display: inline-block;
22
+ min-height: 1em;
23
+ align-self: stretch;
24
+ border-top: 0;
25
+ border-inline-start: var(--rt-divider-width) solid var(--rt-divider-color);
26
+ }
27
+
28
+ /* Вертикальной линии отступ не от начала строки, а сверху и снизу: она короче соседей. */
29
+ &--vertical#{&}--inset {
30
+ margin-block: var(--rt-divider-inset-block);
31
+ margin-inline-start: 0;
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,73 @@
1
+ # `rt-drawer`
2
+
3
+ Боковая панель внутри участка страницы. `rt-drawer-container` — строка из содержимого и
4
+ панелей, `rt-drawer` — панель у края, `rt-resize-handle` — ручка ширины.
5
+
6
+ ```html
7
+ <rt-drawer-container>
8
+ <rt-drawer mode="over" position="end" resizable [(opened)]="open" [(width)]="width">…</rt-drawer>
9
+ <section>Отчёт</section>
10
+ </rt-drawer-container>
11
+ ```
12
+
13
+ | вход | тип | умолчание |
14
+ | -------------- | --------------------- | --------- |
15
+ | `opened` | `boolean` | `false` |
16
+ | `mode` | `'side' \| 'over'` | `'side'` |
17
+ | `position` | `'start' \| 'end'` | `'start'` |
18
+ | `hasBackdrop` | `boolean` | `true` |
19
+ | `disableClose` | `boolean` | `false` |
20
+ | `width` | `number \| null` | `320` |
21
+ | `minWidth` | `number` | `200` |
22
+ | `maxWidth` | `number` | `640` |
23
+ | `resizable` | `boolean` | `false` |
24
+ | `ariaLabel` | `string \| null` | `null` |
25
+ | `overflow` | `'clip' \| 'visible'` | `'clip'` |
26
+ | `autoFocus` | `boolean \| string` | `true` |
27
+
28
+ Выходы: `openedChange`, `widthChange`, `openedStart`, `closedStart`, `afterOpened`, `afterClosed`,
29
+ `backdropClick`. Методы: `open()`, `close()`, `toggle()`.
30
+
31
+ ## Главное, что нужно знать
32
+
33
+ **Хост панели — `display: contents`.** Подложка и `<aside>` становятся участниками гибкой строки
34
+ контейнера; порядок на экране задаёт `order` по краю, а в разметке содержимое идёт первым, чтобы
35
+ панель поверх рисовалась над его узлами с положением без слоёв.
36
+
37
+ **Закрытая панель не уходит из разметки.** Рядом — `inline-size: 0`, поверх — сдвиг за край;
38
+ видимость гаснет после перехода, `inert` снимает её из фокуса.
39
+
40
+ **Escape и подложка закрывают только поверх.** Рядом панель — часть страницы.
41
+
42
+ **Ярусы — внутри контейнера.** Поверх подложка стоит на `--rt-drawer-backdrop-z-index`, панель на
43
+ `--rt-drawer-over-z-index`, а контейнер с `isolation: isolate` не пускает их над страницей. Узел
44
+ содержимого со своим `z-index` под подложкой. Рядом ярус панели — `--rt-drawer-z-index`, по умолчанию
45
+ `auto`: начальная панель стоит в строке раньше содержимого, и содержимое со своим контекстом
46
+ наложения накрывает её тень. Тень рядом — `--rt-drawer-side-shadow`, по умолчанию её нет. Справа
47
+ налево закрытая панель уезжает за свой край по `:dir(rtl)`.
48
+
49
+ **Ручка ширину не хранит.** Она сообщает новую в пределах; без `width` меряет родителя в момент
50
+ первого движения — так её берёт правая панель `rt-container` шириной по содержимому. Шаблон ручки
51
+ пуст и лежит в своём файле, `rt-resize-handle.component.html`: всё, что она рисует, висит на хосте.
52
+
53
+ **Начало и конец смены — разные выходы.** `openedStart` и `closedStart` приходят в момент смены
54
+ `opened`, `afterOpened` и `afterClosed` — по `transitionend` ширины рядом и сдвига поверх, со
55
+ страховочным таймером на случай, когда перехода нет. Исходное состояние ничего не сообщает; конец,
56
+ обогнанный новой сменой, молчит.
57
+
58
+ **`overflow: 'visible'` снимает обрезку только с открытой панели.** Закрываясь, панель обрезает
59
+ содержимое сразу: иначе оно висело бы над страницей, пока панель сжимается.
60
+
61
+ **`width: null` — ширина по содержимому.** Своей ширины нет, ручки ширины тоже; переход рядом от
62
+ неё к нулю не анимируется, конец закрытия приходит по таймеру.
63
+
64
+ **`autoFocus` по умолчанию — как раньше:** поверх содержимого фокус встаёт на панель, рядом не
65
+ трогается. Селектор и `'first-tabbable'` работают в обоих местах; узел не нашёлся — фокус на панели.
66
+ Панель, открытая с первой отрисовки, фокус не берёт: страницу только загрузили.
67
+ Пустой атрибут и строка `'true'` значат `true`, строка `'false'` — `false`.
68
+
69
+ **`backdropClick` приходит до закрытия и с `disableClose`.** Так приложение узнаёт о нажатии, даже
70
+ когда закрывать панель решает само.
71
+
72
+ **Высота окна — от контейнера.** Контейнер высотой в окно обрезает края, а прокручивается его
73
+ содержимое: панели остаются высотой в окно без отдельного входа.
@@ -0,0 +1,19 @@
1
+ @layer rt-kit.components {
2
+ /* rt-drawer-container — строка из содержимого и панелей. Панель поверх содержимого
3
+ отсчитывает своё место от контейнера, поэтому он и задаёт положение, и обрезает края. */
4
+ .rt-drawer-container {
5
+ position: relative;
6
+ display: flex;
7
+ overflow: hidden;
8
+ min-height: 0;
9
+
10
+ /* Ярусы панели и подложки — внутри контейнера, а содержимое со своим z-index их не перекрывает. */
11
+ isolation: isolate;
12
+
13
+ &__content {
14
+ overflow: auto;
15
+ min-width: 0;
16
+ flex: 1 1 auto;
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,168 @@
1
+ @layer rt-kit.components {
2
+ /* rt-drawer — панель внутри rt-drawer-container. Хост прозрачен для раскладки: подложка и
3
+ панель становятся прямыми участниками гибкой строки контейнера. */
4
+ .rt-drawer {
5
+ display: contents;
6
+ }
7
+
8
+ .rt-drawer__panel {
9
+ --rt-drawer-width: var(--rt-size-64);
10
+ --rt-drawer-bg: var(--rt-color-bg-surface);
11
+ --rt-drawer-border-width: var(--rt-border-width-thin);
12
+ --rt-drawer-border-color: var(--rt-color-border-subtle);
13
+ --rt-drawer-shadow: var(--rt-shadow-lg);
14
+ --rt-drawer-side-shadow: none;
15
+ --rt-drawer-duration: var(--rt-duration-base);
16
+
17
+ /* Ярус панели рядом с содержимым. Начальная панель стоит в строке раньше содержимого, и
18
+ содержимое со своим контекстом наложения рисуется поверх её тени; ярус выше `auto` это
19
+ меняет. Поверх содержимого ярус свой, выше подложки: `isolation` контейнера не пускает
20
+ оба над страницей. */
21
+ --rt-drawer-z-index: auto;
22
+ --rt-drawer-over-z-index: var(--rt-z-modal);
23
+
24
+ position: relative;
25
+ z-index: var(--rt-drawer-z-index);
26
+ display: flex;
27
+ overflow: clip;
28
+ min-height: 0;
29
+ flex: 0 0 auto;
30
+ background-color: var(--rt-drawer-bg);
31
+ inline-size: var(--rt-drawer-width);
32
+ outline: none;
33
+ transition:
34
+ inline-size var(--rt-drawer-duration) ease,
35
+ transform var(--rt-drawer-duration) ease,
36
+ visibility 0s linear;
37
+
38
+ &--position--start {
39
+ order: -1;
40
+ }
41
+
42
+ &--position--end {
43
+ order: 1;
44
+ }
45
+
46
+ &--mode--side {
47
+ box-shadow: var(--rt-drawer-side-shadow);
48
+ }
49
+
50
+ &--mode--side#{&}--position--start {
51
+ border-inline-end: var(--rt-drawer-border-width) solid var(--rt-drawer-border-color);
52
+ }
53
+
54
+ &--mode--side#{&}--position--end {
55
+ border-inline-start: var(--rt-drawer-border-width) solid var(--rt-drawer-border-color);
56
+ }
57
+
58
+ /* Поверх содержимого: панель снята со строки и прижата к своему краю контейнера. */
59
+ &--mode--over {
60
+ position: absolute;
61
+ z-index: var(--rt-drawer-over-z-index);
62
+ box-shadow: var(--rt-drawer-shadow);
63
+ inset-block: 0;
64
+ }
65
+
66
+ &--mode--over#{&}--position--start {
67
+ inset-inline-start: 0;
68
+ }
69
+
70
+ &--mode--over#{&}--position--end {
71
+ inset-inline-end: 0;
72
+ }
73
+
74
+ /* Открытая панель с visible не обрезает своё: подпанель выходит вбок, ручка ложится на
75
+ край. Закрываясь, панель обрезает сразу — содержимое не висит над страницей, пока она
76
+ сжимается. */
77
+ &--overflow--visible#{&}--opened {
78
+ overflow: visible;
79
+ }
80
+
81
+ /* Ширина по содержимому: своей ширины нет, переход от неё к нулю не анимируется. */
82
+ &--auto-width {
83
+ inline-size: fit-content;
84
+ }
85
+
86
+ /* Закрытая панель остаётся в разметке: рядом с содержимым она сжимается до нуля, поверх —
87
+ уезжает за свой край. Видимость гаснет после перехода, иначе уход не виден. */
88
+ &:not(#{&}--opened) {
89
+ transition:
90
+ inline-size var(--rt-drawer-duration) ease,
91
+ transform var(--rt-drawer-duration) ease,
92
+ visibility 0s linear var(--rt-drawer-duration);
93
+ visibility: hidden;
94
+ }
95
+
96
+ &--mode--side:not(#{&}--opened) {
97
+ border-width: 0;
98
+ inline-size: 0;
99
+ }
100
+
101
+ &--mode--over#{&}--position--start:not(#{&}--opened) {
102
+ transform: translateX(-100%);
103
+ }
104
+
105
+ &--mode--over#{&}--position--end:not(#{&}--opened) {
106
+ transform: translateX(100%);
107
+ }
108
+
109
+ /* Справа налево начало строки справа: панель уезжает за правый край, а конечная — за левый. */
110
+ &--mode--over#{&}--position--start:not(#{&}--opened):dir(rtl) {
111
+ transform: translateX(100%);
112
+ }
113
+
114
+ &--mode--over#{&}--position--end:not(#{&}--opened):dir(rtl) {
115
+ transform: translateX(-100%);
116
+ }
117
+
118
+ /* Пока ручку тянут, ширина идёт за указателем без запаздывания. */
119
+ &--resizing {
120
+ transition: none;
121
+ }
122
+ }
123
+
124
+ /* Содержимое держит полную ширину и тогда, когда панель сжимается: строки не переносятся
125
+ заново на каждом кадре перехода. */
126
+ .rt-drawer__inner {
127
+ overflow: auto;
128
+ min-width: 0;
129
+ flex: 0 0 var(--rt-drawer-width);
130
+ }
131
+
132
+ .rt-drawer__panel--overflow--visible.rt-drawer__panel--opened > .rt-drawer__inner {
133
+ overflow: visible;
134
+ }
135
+
136
+ .rt-drawer__panel--auto-width > .rt-drawer__inner {
137
+ flex-basis: auto;
138
+ }
139
+
140
+ .rt-drawer__backdrop {
141
+ --rt-drawer-backdrop-bg: var(--rt-color-bg-overlay);
142
+ --rt-drawer-backdrop-duration: var(--rt-duration-base);
143
+
144
+ /* Подложка под панелью, но над содержимым и его ярусами. */
145
+ --rt-drawer-backdrop-z-index: var(--rt-z-modal-backdrop);
146
+
147
+ position: absolute;
148
+ z-index: var(--rt-drawer-backdrop-z-index);
149
+ background: var(--rt-drawer-backdrop-bg);
150
+ inset: 0;
151
+ opacity: 0;
152
+ pointer-events: none;
153
+ transition: opacity var(--rt-drawer-backdrop-duration) ease;
154
+
155
+ &--visible {
156
+ opacity: 1;
157
+ pointer-events: auto;
158
+ }
159
+ }
160
+
161
+ @media (prefers-reduced-motion: reduce) {
162
+ .rt-drawer__panel,
163
+ .rt-drawer__panel:not(.rt-drawer__panel--opened),
164
+ .rt-drawer__backdrop {
165
+ transition: none;
166
+ }
167
+ }
168
+ }
@@ -0,0 +1,42 @@
1
+ @layer rt-kit.components {
2
+ /* rt-resize-handle — полоса на краю панели. Сама линия видна на наведении, фокусе и во время
3
+ движения; в покое ручка прозрачна, чтобы край панели оставался краем. */
4
+ .rt-resize-handle {
5
+ --rt-resize-handle-hit: var(--rt-space-2);
6
+ --rt-resize-handle-line: var(--rt-border-width-medium);
7
+ --rt-resize-handle-color: var(--rt-color-action-primary);
8
+ --rt-resize-handle-duration: var(--rt-duration-fast);
9
+
10
+ position: absolute;
11
+ width: var(--rt-resize-handle-hit);
12
+ cursor: col-resize;
13
+ inset-block: 0;
14
+ outline: none;
15
+ touch-action: none;
16
+
17
+ &:after {
18
+ position: absolute;
19
+ width: var(--rt-resize-handle-line);
20
+ background-color: transparent;
21
+ content: '';
22
+ inset-block: 0;
23
+ inset-inline-start: calc(50% - var(--rt-resize-handle-line) / 2);
24
+ transition: background-color var(--rt-resize-handle-duration) ease;
25
+ }
26
+
27
+ &:hover:after,
28
+ &:focus-visible:after,
29
+ &--dragging:after {
30
+ background-color: var(--rt-resize-handle-color);
31
+ }
32
+
33
+ /* Ручка стоит внутри панели у её края: панель обрезает всё, что за краем. */
34
+ &--edge--start {
35
+ inset-inline-start: 0;
36
+ }
37
+
38
+ &--edge--end {
39
+ inset-inline-end: 0;
40
+ }
41
+ }
42
+ }
@@ -33,6 +33,11 @@
33
33
  `emptyResultsText`; у поля строк вид поля новой строки — `fieldAppearance`. Цвет кнопки «Добавить»
34
34
  — ручка `--rt-dynamic-selector-list-add-color`: кнопку проецируют оба поля, и вид у неё разный.
35
35
 
36
+ **Окно выбора работает и само по себе.** В своём оверлее под своей кнопкой приложения оно берёт
37
+ записи и настройки из своих входов (`keyExp` и `displayExp` обязательны) и сообщает о действиях
38
+ событиями `applied`, `cancelled`, `searchChange`, `loadMore`, `temporaryChoiceChange`. Внутри
39
+ селектора и поля строк входы окна молчат: оно читает корень через сервис частей.
40
+
36
41
  **Поле строк срезает пробелы по краям и не добавляет пустое и повторное.** Повтор сравнивается
37
42
  точно, с учётом регистра.
38
43