@rt-tools/ui-kit-v2 0.33.0 → 0.34.1

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 +654 -43
  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 +61 -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 +337 -8
  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
@@ -9,17 +9,27 @@
9
9
  ```
10
10
 
11
11
  Свои входы поверх общих из [`RtFormControlBase`](../form-control/CONTEXT.md)
12
- (`size`, `disabled`, `controlId`, `ariaLabel`, `clearable`, `bordered`):
12
+ (`size`, `disabled`, `controlId`, `ariaLabel`, `clearable`, `clearTabbable`, `bordered`):
13
13
 
14
- | вход | тип | умолчание |
15
- | ------------------------ | ---------------------------------------------------- | --------- |
16
- | `type` | `'text' \| 'password' \| 'email' \| 'time' \| 'url'` | `'text'` |
17
- | `placeholder` | `string` | `''` |
18
- | `iconLeft` / `iconRight` | `IRtIcon.Name \| null` | `null` |
19
- | `passwordToggle` | `boolean` | `false` |
20
- | `autocomplete` | `string \| null` | `null` |
14
+ | вход | тип | умолчание |
15
+ | -------------------------------------- | ---------------------------------------------------- | --------- |
16
+ | `type` | `'text' \| 'password' \| 'email' \| 'time' \| 'url'` | `'text'` |
17
+ | `placeholder` | `string` | `''` |
18
+ | `iconLeft` / `iconRight` | `IRtIcon.Name \| null` | `null` |
19
+ | `iconLeftAction` / `iconRightAction` | `boolean` | `false` |
20
+ | `iconLeftTooltip` / `iconRightTooltip` | `string \| null` | `null` |
21
+ | `floatingLabel` | `string \| null` | `null` |
22
+ | `passwordToggle` | `boolean` | `false` |
23
+ | `autocomplete` | `string \| null` | `null` |
24
+ | `maxlength` | `number \| null` | `null` |
21
25
 
22
- Значение — `string`.
26
+ | выход | тип |
27
+ | ---------------------------------- | ------------ |
28
+ | `iconLeftClick` / `iconRightClick` | `MouseEvent` |
29
+ | `cleared` | `void` |
30
+
31
+ Значение — `string`. `maxlength` уходит атрибутом на поле: браузер не даёт набрать больше, а
32
+ значение из кода не режет, поэтому проверка формы остаётся за приложением.
23
33
 
24
34
  ## Главное, что нужно знать
25
35
 
@@ -27,8 +37,19 @@
27
37
  переключателем крестика не будет: показать оба некуда.
28
38
 
29
39
  Крестик показывается при выполнении трёх условий сразу: `clearable` (по умолчанию включён),
30
- в поле есть значение, поле не отключено. Из таб-порядка он исключён (`tabindex="-1"`) — до
31
- вспомогательного аффорданса не должны доходить табом.
40
+ в поле есть значение, поле не отключено. Из порядка Tab он исключён, пока поле не попросит
41
+ `clearTabbable`. После сброса приходит `cleared` — когда пустое значение уже ушло в форму.
42
+
43
+ Размер, цвет, подложку и отступы крестика задают свойства `--rt-input-clear-*`. В своём виде кита
44
+ крестик без подложки; под материальным набором это крестик первого кита: кнопка 19 px на круглой
45
+ серой подложке, значок 12 px, 8 px от края. Поле с `clearable` несёт класс `rt-input--clearable`.
46
+
47
+ **Иконка с `iconLeftAction` или `iconRightAction` становится кнопкой.** Она берёт фокус с
48
+ клавиатуры, нажимается мышью, Enter и пробелом и показывает подсказку из `iconLeftTooltip`. Без
49
+ входа иконка остаётся картинкой.
50
+
51
+ **`floatingLabel` — подпись на рамке.** Пустое поле в покое показывает подпись на месте подсказки,
52
+ значение или фокус поднимают её на рамку, и рамка под ней разрывается. Высота поля не меняется.
32
53
 
33
54
  ## Как этим пользоваться
34
55
 
@@ -42,6 +63,19 @@
42
63
  компонента: `[readonly]` стоит на поле-обёртке. Пустое значение в этом режиме рисуется прочерком.
43
64
  - Подсветка ошибки (`rt-input--invalid`) включается сама после касания — см. основу полей.
44
65
 
66
+ **Кнопка-значок отключается своим входом.** `iconLeftDisabled` и `iconRightDisabled` отключают
67
+ только кнопку, поле остаётся доступным; подсказка кнопки остаётся и объясняет почему.
68
+
69
+ **Под материальным набором кнопка-значок не выше поля без рамки.** Ширину и высоту внутренней
70
+ кнопки поле под набором ограничивает `min()` от размера кнопки и своей высоты: низкое поле плотности
71
+ или своей высоты приложения не растёт до высоты кнопки. Свой вид кита держит размер кнопки, и малое
72
+ поле с крестиком в нём 34 px, как до набора.
73
+
74
+ ## Межбуквенный интервал
75
+
76
+ Значение берёт интервал из ручки `--rt-input-letter-spacing`, общей для поля, числа, выбора и
77
+ текста. Кит её не объявляет: без неё интервал `normal`.
78
+
45
79
  ## Рядом
46
80
 
47
81
  - [`rt-field`](../field/CONTEXT.md) — подпись, звёздочка, текст ошибки, режим чтения.
@@ -0,0 +1,192 @@
1
+ @layer rt-kit.components {
2
+ /* Признак набора — на предке или на самом поле: приложение ставит его и на тег контрола. */
3
+ $preset: ':is(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
4
+ $preset-weak: ':where(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
5
+
6
+ /* Подпись на рамке и разрыв рамки под ней — отдельный лист стилей компонента. Одним листом с
7
+ остальными правилами он перешёл бы порог в 8 КБ на лист, который Angular по умолчанию ставит
8
+ приложению, и сборка потребителя упала бы. Лист подключается вторым, после основного. */
9
+ .rt-input {
10
+ /* Подпись на рамке. Лежит поверх поля и в поток не входит — высота поля от неё не меняется.
11
+ В покое стоит на месте подсказки (за левой иконкой, если она есть), при значении или
12
+ фокусе поднимается на верхнюю рамку и разрывает её своей подложкой. Клик проходит
13
+ сквозь подпись: поле фокусирует обработчик mousedown хоста. */
14
+ &--with-icon-left {
15
+ --rt-input-floating-label-rest-start: calc(
16
+ var(--rt-input-floating-label-start) + var(--rt-input-icon-size) + var(--rt-input-gap)
17
+ );
18
+ }
19
+
20
+ /* Обведённое поле материального набора прозрачное, и подпись на рамке подложки не имеет:
21
+ рамка под ней разорвана, как у поля Material. `:where` держит силу правила на уровне вида,
22
+ и залитый вид ниже его перекрывает. */
23
+ &#{$preset-weak} {
24
+ --rt-input-floating-label-bg: transparent;
25
+
26
+ /* Подпись на рамке начинается за скруглением угла: на изгибе верхней рамки нет, и
27
+ подпись легла бы на него без просвета слева. Скругление «таблетки» больше поля —
28
+ берётся половина высоты. */
29
+ --rt-input-floating-label-raised-start: max(
30
+ var(--rt-input-floating-label-start),
31
+ calc(min(var(--rt-input-box-radius), var(--rt-input-height) / 2) + var(--rt-space-2))
32
+ );
33
+ }
34
+
35
+ /* Значок слева в наборе стоит в 12 px от края поля и в 4 px от текста — подпись в покое
36
+ встаёт туда же, где начинается текст. Кнопка-значок стоит на месте значка. */
37
+ &--with-icon-left#{$preset-weak}:has(> .rt-input__icon-left) {
38
+ --rt-input-floating-label-rest-start: calc(
39
+ var(--rt-space-2) + var(--rt-space-1) - var(--rt-input-edge) + var(--rt-input-icon-size) + var(--rt-space-1)
40
+ );
41
+ }
42
+
43
+ &--appearance--fill,
44
+ &--appearance--pill {
45
+ --rt-input-floating-label-bg: var(--rt-color-bg-surface-subtle-2);
46
+ }
47
+
48
+ /* У залитого поля скругление малое, и подпись встаёт у начала поля, как прежде. */
49
+ &--appearance--fill {
50
+ --rt-input-floating-label-raised-start: var(--rt-input-floating-label-start);
51
+ }
52
+
53
+ /* Подпись на рамке рисует только материальный набор: свой вид кита держит поле прежним — с
54
+ подсказкой и без подписи. Имя контролу подпись даёт в обоих видах. */
55
+ &__floating-label {
56
+ position: absolute;
57
+ top: 50%;
58
+ left: var(--rt-input-floating-label-rest-start);
59
+ display: none;
60
+ overflow: hidden;
61
+ max-width: calc(100% - var(--rt-input-floating-label-rest-start) - var(--rt-input-padding-x));
62
+ color: var(--rt-input-floating-label-color);
63
+ pointer-events: none;
64
+ text-overflow: ellipsis;
65
+ transform: translateY(-50%);
66
+ transform-origin: left center;
67
+ transition:
68
+ top var(--rt-input-floating-label-duration) ease,
69
+ left var(--rt-input-floating-label-duration) ease,
70
+ font-size var(--rt-input-floating-label-duration) ease,
71
+ color var(--rt-input-floating-label-duration) ease;
72
+ white-space: nowrap;
73
+ }
74
+
75
+ &#{$preset} &__floating-label {
76
+ display: block;
77
+ }
78
+
79
+ /* Пока подпись лежит на месте подсказки, подсказка не рисуется: они легли бы друг на друга. */
80
+ &--floating#{$preset}:not(.rt-input--filled, :focus-within) &__field::placeholder {
81
+ color: transparent;
82
+ }
83
+
84
+ &--filled &__floating-label,
85
+ &:focus-within &__floating-label {
86
+ top: 0;
87
+ left: var(--rt-input-floating-label-raised-start);
88
+ max-width: calc(100% - var(--rt-input-floating-label-raised-start) - var(--rt-input-floating-label-start));
89
+ padding: 0 var(--rt-space-1);
90
+ margin-left: calc(-1 * var(--rt-space-1));
91
+ background-color: var(--rt-input-floating-label-bg);
92
+ font-size: var(--rt-input-floating-label-font-size);
93
+ line-height: 1;
94
+ }
95
+
96
+ &:focus-within &__floating-label {
97
+ color: var(--rt-input-floating-label-color-focus);
98
+ }
99
+
100
+ &--invalid &__floating-label {
101
+ color: var(--rt-input-floating-label-color-error);
102
+ }
103
+
104
+ /* Залитое поле материального набора — как поле Material: оно выше, и поднятая подпись
105
+ уменьшается и встаёт внутрь поля над значением, а не на рамку. Пустое поле держит подпись
106
+ на месте подсказки размером со значение. Свой вид кита не меняется. */
107
+ &--floating#{$preset}.rt-input--appearance--fill,
108
+ &--floating#{$preset}.rt-input--appearance--pill {
109
+ --rt-input-height: var(--rt-input-fill-floating-height);
110
+ }
111
+
112
+ /* Подпись в покое — строкой Material, значение — ниже середины, под поднятой подписью:
113
+ при 52 px текст начинается в 22 px от верха строкой в 24 px. */
114
+ &--floating#{$preset}.rt-input--appearance--fill .rt-input__floating-label,
115
+ &--floating#{$preset}.rt-input--appearance--pill .rt-input__floating-label {
116
+ line-height: var(--rt-leading-tight);
117
+ }
118
+
119
+ &--floating#{$preset}.rt-input--appearance--fill .rt-input__field,
120
+ &--floating#{$preset}.rt-input--appearance--pill .rt-input__field {
121
+ align-self: stretch;
122
+ padding: calc(var(--rt-input-height) / 2 - var(--rt-space-1) - var(--rt-input-edge)) 0
123
+ calc(var(--rt-input-height) / 2 - var(--rt-space-5) - var(--rt-input-border-width));
124
+ line-height: var(--rt-leading-normal);
125
+ }
126
+
127
+ &--floating#{$preset}.rt-input--appearance--fill.rt-input--filled .rt-input__floating-label,
128
+ &--floating#{$preset}.rt-input--appearance--fill:focus-within .rt-input__floating-label,
129
+ &--floating#{$preset}.rt-input--appearance--pill.rt-input--filled .rt-input__floating-label,
130
+ &--floating#{$preset}.rt-input--appearance--pill:focus-within .rt-input__floating-label {
131
+ top: calc(var(--rt-input-height) / 2 - var(--rt-space-5) - var(--rt-input-edge));
132
+ left: var(--rt-input-floating-label-rest-start);
133
+ padding: 0;
134
+ margin-left: 0;
135
+ background-color: transparent;
136
+ transform: none;
137
+ }
138
+
139
+ /* Разрыв рамки под подписью в материальном наборе. Рамку поля рисует слой поверх него, и
140
+ разрыв режется в этом слое: вырезать рамку самого поля нельзя — подпись лежит внутри
141
+ него и обрезалась бы вместе с рамкой. Залитый вид, «таблетка» и чтение рамки на
142
+ верху не имеют. */
143
+ &--floating#{$preset}:not(.rt-input--appearance--fill, .rt-input--appearance--pill, .rt-input--readonly) {
144
+ border-color: transparent;
145
+ box-shadow: none;
146
+
147
+ &:before {
148
+ position: absolute;
149
+ border: var(--rt-input-border-width) solid var(--rt-input-color-border);
150
+ border-radius: inherit;
151
+ content: '';
152
+ inset: calc(-1 * var(--rt-input-border-width));
153
+ pointer-events: none;
154
+ }
155
+
156
+ &:where(:hover:not(:has(:disabled))):before {
157
+ border-color: var(--rt-input-color-border-hover);
158
+ }
159
+
160
+ &:focus-within:before {
161
+ border-color: var(--rt-input-color-border-focus);
162
+ box-shadow: var(--rt-input-focus-shadow);
163
+ }
164
+
165
+ &.rt-input--invalid:before {
166
+ border-color: var(--rt-input-color-border-error);
167
+ }
168
+
169
+ &.rt-input--invalid:focus-within:before {
170
+ box-shadow: var(--rt-input-focus-shadow-error);
171
+ }
172
+
173
+ &.rt-input--borderless:not(:focus-within, .rt-input--invalid):before {
174
+ border-color: transparent;
175
+ }
176
+
177
+ &.rt-input--filled:before,
178
+ &:focus-within:before {
179
+ clip-path: polygon(
180
+ 0 0,
181
+ var(--rt-input-notch-start) 0,
182
+ var(--rt-input-notch-start) var(--rt-input-notch-depth),
183
+ calc(var(--rt-input-notch-start) + var(--rt-input-notch-width)) var(--rt-input-notch-depth),
184
+ calc(var(--rt-input-notch-start) + var(--rt-input-notch-width)) 0,
185
+ 100% 0,
186
+ 100% 100%,
187
+ 0 100%
188
+ );
189
+ }
190
+ }
191
+ }
192
+ }
@@ -0,0 +1,105 @@
1
+ @layer rt-kit.components {
2
+ /* Признак набора — на предке или на самом поле: приложение ставит его и на тег контрола. */
3
+ $preset-weak: ':where(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
4
+
5
+ /* Значки, кнопки-значки и крестик очистки — отдельный лист стилей компонента: одним листом с
6
+ остальными правилами он перешёл бы порог в 8 КБ на лист, который Angular по умолчанию ставит
7
+ приложению. Лист подключается после основного. */
8
+ .rt-input {
9
+ /* Под набором кнопка-значок в поле не выше поля без рамки: иначе низкое поле плотности или
10
+ своей высоты приложения вырастает до высоты кнопки. Свой вид кита держит прежний размер
11
+ кнопки: малое поле с кнопкой в нём 34 px, как до набора. Свой размер кнопки приложения
12
+ остаётся в силе, пока помещается. */
13
+ &#{$preset-weak} &__icon-left .rt-icon-button,
14
+ &#{$preset-weak} &__icon-right .rt-icon-button {
15
+ width: min(
16
+ var(--rt-icon-button-size, var(--rt-icon-button-size-step)),
17
+ calc(var(--rt-input-height) - 2 * var(--rt-input-border-width))
18
+ );
19
+ height: min(
20
+ var(--rt-icon-button-size, var(--rt-icon-button-size-step)),
21
+ calc(var(--rt-input-height) - 2 * var(--rt-input-border-width))
22
+ );
23
+ }
24
+
25
+ /* Размер и цвет значка приходят от самого значка встроенным стилем и правилом не перебиваются.
26
+ Нижняя граница размер расширяет, а приглушённый тон значок берёт из свойства, которое читает
27
+ его встроенный стиль: так набор оформления даёт значку поля вид первого кита, не трогая входов
28
+ значка. По умолчанию оба равны нынешним, и вид не меняется. */
29
+ &__icon-left,
30
+ &__icon-right {
31
+ --rt-icon-color-muted: var(--rt-input-icon-color);
32
+ --rt-icon-step-sm: var(--rt-input-icon-size);
33
+
34
+ min-width: var(--rt-input-icon-size);
35
+ min-height: var(--rt-input-icon-size);
36
+ }
37
+
38
+ /* Крестик очистки берёт размер, значок и цвет из своих свойств поля тем же путём. Набор
39
+ оформления даёт ему вид крестика первого кита: 19 px, значок 12 px, в 8 px от края поля.
40
+ Свой вид кита держит прежние 32 px. */
41
+ &__clear {
42
+ --rt-icon-color-muted: var(--rt-input-clear-color);
43
+ --rt-icon-step-sm: var(--rt-input-clear-icon-size);
44
+
45
+ margin-inline-start: var(--rt-input-clear-offset-start);
46
+ }
47
+
48
+ /* Поле с крестиком очистки в наборе — как поле Material с крестиком: справа от текста 4 px, и у
49
+ пустого поля текст идёт до них, а не до 16 px. Поле со значком справа и поле только для
50
+ чтения держат свой отступ. */
51
+ &--clearable#{$preset-weak}:not(.rt-input--with-icon-right, .rt-input--readonly) {
52
+ padding-right: calc(var(--rt-space-1) - var(--rt-input-edge));
53
+ }
54
+
55
+ &#{$preset-weak} &__clear .rt-icon-button {
56
+ width: min(var(--rt-input-clear-size), calc(var(--rt-input-height) - 2 * var(--rt-input-border-width)));
57
+ height: min(var(--rt-input-clear-size), calc(var(--rt-input-height) - 2 * var(--rt-input-border-width)));
58
+ }
59
+
60
+ /* Скругление, заливку и заливку под указателем кнопка объявляет на себе шагами, и свойства
61
+ поля их перекрывают правилом сильнее: под набором крестик лежит на сером круге, как у
62
+ первого кита. Публичные свойства кнопки остаются приложению. */
63
+ & &__clear .rt-icon-button {
64
+ --rt-icon-button-radius: var(--rt-input-clear-radius);
65
+ --rt-icon-button-bg-variant: var(--rt-input-clear-bg);
66
+ --rt-icon-button-color-bg-hover: var(--rt-input-clear-bg-hover);
67
+ }
68
+
69
+ &__clear:last-child {
70
+ margin-inline-end: var(--rt-input-clear-offset-end);
71
+ }
72
+
73
+ /* Значок в материальном наборе стоит, как у поля Material: 12 px от края поля и 4 px до
74
+ текста, текст после значка слева — с 40 px. Кнопка-значок стоит так же: её значок — на
75
+ месте простого значка, а сама кнопка шире значка и выходит за него поровну в обе стороны. */
76
+ &--with-icon-left#{$preset-weak}:has(> .rt-input__icon-left) {
77
+ padding-left: calc(var(--rt-space-2) + var(--rt-space-1) - var(--rt-input-edge));
78
+
79
+ > .rt-input__icon-left {
80
+ margin-right: calc(var(--rt-space-1) - var(--rt-input-gap));
81
+ }
82
+ }
83
+
84
+ &--with-icon-right#{$preset-weak}:has(> .rt-input__icon-right) {
85
+ padding-right: calc(var(--rt-space-2) + var(--rt-space-1) - var(--rt-input-edge));
86
+
87
+ > .rt-input__icon-right {
88
+ margin-left: calc(var(--rt-space-1) - var(--rt-input-gap));
89
+ }
90
+ }
91
+
92
+ /* Свес кнопки-значка за её значок — по половине разницы с каждой стороны: на него кнопка
93
+ сдвигается наружу, и значок встаёт на место простого значка. */
94
+ &#{$preset-weak} > &__icon-left .rt-icon-button,
95
+ &#{$preset-weak} > &__icon-right .rt-icon-button {
96
+ --rt-input-icon-button-width: min(
97
+ var(--rt-icon-button-size, var(--rt-icon-button-size-step)),
98
+ calc(var(--rt-input-height) - 2 * var(--rt-input-border-width))
99
+ );
100
+ --rt-input-icon-overhang: calc((var(--rt-input-icon-button-width) - var(--rt-input-icon-size)) / 2);
101
+
102
+ margin-inline: calc(-1 * var(--rt-input-icon-overhang));
103
+ }
104
+ }
105
+ }
@@ -1,14 +1,43 @@
1
1
  @use '../../../styles/mixins' as kv;
2
2
 
3
3
  @layer rt-kit.components {
4
+ /* Признак набора — на предке или на самом поле: приложение ставит его и на тег контрола. */
5
+ $preset: ':is(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
6
+ $preset-weak: ':where(.rt-preset-material *, [data-preset="material"] *, .rt-preset-material, [data-preset="material"])';
7
+
4
8
  .rt-input {
5
9
  --rt-input-box-radius: var(--rt-input-radius);
6
10
  --rt-input-fill-radius: var(--rt-radius-sm);
7
11
  --rt-input-toggle-radius: var(--rt-radius-sm);
12
+ --rt-input-floating-label-color: var(--rt-input-color-text-placeholder);
13
+ --rt-input-floating-label-color-focus: var(--rt-input-color-border-focus);
14
+ --rt-input-floating-label-color-error: var(--rt-input-color-border-error);
15
+ --rt-input-floating-label-bg: var(--rt-input-color-bg);
16
+ --rt-input-floating-label-font-size: var(--rt-text-xs);
17
+ --rt-input-floating-label-start: var(--rt-input-padding-x);
18
+ --rt-input-floating-label-rest-start: var(--rt-input-floating-label-start);
19
+ --rt-input-floating-label-raised-start: var(--rt-input-floating-label-start);
20
+
21
+ /* Разрыв рамки под подписью: его начало в слое рамки, глубина — толщина рамки фокуса.
22
+ Ширину подписи ставит компонент замером; до замера разрыва нет. */
23
+ --rt-input-notch-start: calc(var(--rt-input-floating-label-raised-start) - var(--rt-space-1) + var(--rt-input-border-width));
24
+ --rt-input-notch-depth: calc(2 * var(--rt-input-border-width));
25
+ --rt-input-notch-width: 0px;
26
+
27
+ /* Высота залитого поля Material с подписью: подпись лежит внутри поля над значением. Она
28
+ равна средней высоте поля — под набором это высота Material при выбранной плотности. */
29
+ --rt-input-fill-floating-height: var(--rt-input-height-md);
30
+ --rt-input-color-border-hover: var(--rt-color-text-primary);
31
+ --rt-input-floating-label-duration: var(--rt-duration-fast);
32
+
33
+ /* Боковая рамка поля: от неё отсчитываются значок слева и подпись. У залитого поля
34
+ материального набора боковой рамки нет. */
35
+ --rt-input-edge: var(--rt-input-border-width);
8
36
 
9
37
  position: relative;
10
38
  display: inline-flex;
11
39
  width: 100%;
40
+ min-width: var(--rt-input-min-width);
12
41
  min-height: var(--rt-input-height);
13
42
  box-sizing: border-box;
14
43
  align-items: center;
@@ -30,6 +59,13 @@
30
59
  outline-offset: var(--rt-input-focus-outline-offset);
31
60
  }
32
61
 
62
+ /* Наведение в материальном наборе — как у поля Material: рамка цвета текста. `:where` держит
63
+ силу правила на уровне вида, и фокус, ошибка, залитый вид и «без рамки» его перекрывают;
64
+ отключённое поле наведения не показывает. */
65
+ &#{$preset-weak}:where(:hover:not(:has(:disabled))) {
66
+ border-color: var(--rt-input-color-border-hover);
67
+ }
68
+
33
69
  /* bordered=false: снимаем только resting-рамку; invalid/focus/readonly идут
34
70
  ниже по source-order и перекрывают её своей рамкой. */
35
71
  &--borderless {
@@ -41,6 +77,9 @@
41
77
  Объявлен до блоков состояний: фокус, ошибка и «только чтение» идут ниже и
42
78
  перекрывают его рамку. */
43
79
  &--appearance--fill {
80
+ --rt-input-edge: var(--rt-input-fill-edge);
81
+
82
+ border-width: var(--rt-input-fill-edge) var(--rt-input-fill-edge) var(--rt-input-border-width);
44
83
  border-color: transparent;
45
84
  border-radius: var(--rt-input-fill-radius) var(--rt-input-fill-radius) 0 0;
46
85
  border-bottom-color: var(--rt-color-field-fill-underline);
@@ -72,19 +111,66 @@
72
111
  }
73
112
  }
74
113
 
114
+ /* Фокус залитого поля: в материальном наборе — черта снизу вдвое толще, а не кольцо по
115
+ периметру. Своим видом кита назначения равны общим, и фокус не меняется. */
116
+ &--appearance--fill:focus-within {
117
+ box-shadow: var(--rt-input-fill-focus-shadow);
118
+ }
119
+
120
+ &--appearance--fill.rt-input--invalid:focus-within {
121
+ box-shadow: var(--rt-input-fill-focus-shadow-error);
122
+ }
123
+
124
+ /* Отключённое поле своим видом кита тускнеет целиком; материальный набор вместо этого красит
125
+ рамку, текст и подсказку, как поле Material. Своим видом цвета равны обычным. Рамку
126
+ недействительного, залитого, безрамочного поля и поля только для чтения правило не трогает. */
75
127
  &--disabled {
128
+ color: var(--rt-input-color-text-disabled);
76
129
  cursor: not-allowed;
77
- opacity: var(--rt-input-disabled-opacity);
130
+ opacity: var(--rt-input-disabled-field-opacity);
131
+ }
132
+
133
+ &--disabled:not(
134
+ .rt-input--invalid,
135
+ .rt-input--appearance--fill,
136
+ .rt-input--appearance--pill,
137
+ .rt-input--borderless,
138
+ .rt-input--readonly
139
+ ) {
140
+ border-color: var(--rt-input-color-border-disabled);
141
+ }
142
+
143
+ /* Отключённое залитое поле в наборе залито, как поле Material: on-surface 4 %. Своим видом
144
+ заливка прежняя. */
145
+ &--appearance--fill.rt-input--disabled {
146
+ background-color: var(--rt-input-fill-color-bg-disabled);
78
147
  }
79
148
 
149
+ &--disabled &__field::placeholder {
150
+ color: var(--rt-input-color-placeholder-disabled);
151
+ }
152
+
153
+ /* Ступень размера — высота поля целиком: по ней считаются и кнопки-значки внутри. */
80
154
  &--size--sm {
155
+ --rt-input-height: var(--rt-input-height-sm);
156
+
81
157
  min-height: var(--rt-input-height-sm);
82
158
  }
83
159
 
84
160
  &--size--lg {
161
+ --rt-input-height: var(--rt-input-height-lg);
162
+
85
163
  min-height: var(--rt-input-height-lg);
86
164
  }
87
165
 
166
+ /* Текст поля Material начинается в 16 px от внешнего края поля, рамка входит в этот отступ.
167
+ Своим видом кита отступ считается от рамки. Поле только для чтения ниже снимает отступ. */
168
+ &#{$preset-weak} {
169
+ --rt-input-floating-label-start: calc(var(--rt-input-padding-x) - var(--rt-input-edge));
170
+
171
+ padding-inline: calc(var(--rt-input-padding-x) - var(--rt-input-edge));
172
+ }
173
+
88
174
  /* Read-only: контрол превращается в плоский текст — снимаем рамку/фон/паддинги,
89
175
  чтобы значение читалось как обычный текст под label'ом rt-field. */
90
176
  &--readonly {
@@ -110,8 +196,12 @@
110
196
  padding: 0;
111
197
  border: none;
112
198
  background: transparent;
199
+ caret-color: var(--rt-input-caret-color);
113
200
  color: inherit;
114
201
  font: inherit;
202
+
203
+ /* Межбуквенный интервал значения — ручка приложения: кит её не объявляет, без неё normal. */
204
+ letter-spacing: var(--rt-input-letter-spacing, normal);
115
205
  outline: none;
116
206
 
117
207
  &::placeholder {
@@ -130,18 +220,6 @@
130
220
  flex-shrink: 0;
131
221
  }
132
222
 
133
- /* Размер и цвет значка приходят от самого значка встроенным стилем и правилом не перебиваются.
134
- Нижняя граница размер расширяет, а приглушённый тон значок берёт из свойства, которое читает
135
- его встроенный стиль: так набор оформления даёт значку поля вид первого кита, не трогая входов
136
- значка. По умолчанию оба равны нынешним, и вид не меняется. */
137
- &__icon-left,
138
- &__icon-right {
139
- --rt-icon-color-muted: var(--rt-input-icon-color);
140
-
141
- min-width: var(--rt-input-icon-size);
142
- min-height: var(--rt-input-icon-size);
143
- }
144
-
145
223
  &__toggle {
146
224
  display: inline-flex;
147
225
  flex-shrink: 0;
@@ -46,6 +46,13 @@
46
46
  - **Крестик обнуляет поле, а не опустошает его** (`0,00`): у числового поля ноль осмыслен.
47
47
  При нуле крестик не показывается — обнулять больше нечего.
48
48
  - Префикс спрятан от скринридера: валюту он прочитает из подписи поля.
49
+ - Под материальным набором подпись вмещающего `rt-field` ложится внутрь поля: на место подсказки
50
+ в покое и на рамку при значении или фокусе. Признак — `fieldLabelInside` основы полей.
51
+
52
+ ## Межбуквенный интервал
53
+
54
+ Значение берёт интервал из ручки `--rt-input-letter-spacing`, общей с полем, выбором и текстом.
55
+ Кит её не объявляет: без неё интервал `normal`.
49
56
 
50
57
  ## Рядом
51
58