@rt-tools/ui-kit-v2 0.38.0 → 0.39.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 (89) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +45 -7
  2. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +2 -2
  4. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +3 -0
  6. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +10 -7
  8. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +45 -44
  10. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +2 -2
  12. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
  14. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +2 -2
  16. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +4 -1
  18. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -1
  19. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +10 -0
  20. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
  21. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +2 -2
  22. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  23. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +2 -2
  24. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +3 -3
  25. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
  26. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +4 -4
  27. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
  28. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +2 -2
  29. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  30. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +22 -6
  31. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -1
  32. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +9 -5
  33. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -1
  34. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +2 -1
  35. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  36. package/fesm2022/rt-tools-ui-kit-v2-table-core.mjs +101 -0
  37. package/fesm2022/rt-tools-ui-kit-v2-table-core.mjs.map +1 -0
  38. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +39 -38
  39. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  40. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +41 -4
  41. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  42. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +342 -17
  43. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
  44. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +2 -0
  45. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
  46. package/package.json +5 -1
  47. package/src/assets/icons-material/bookmark.fill.svg +5 -0
  48. package/src/assets/icons-material/bookmark.svg +5 -0
  49. package/src/assets/icons-material/flag.fill.svg +3 -0
  50. package/src/assets/icons-material/flag.svg +5 -0
  51. package/src/lib/components/aside/CONTEXT.md +4 -1
  52. package/src/lib/components/aside/footer/CONTEXT.md +27 -0
  53. package/src/lib/components/aside/footer/rt-aside-footer.component.scss +8 -3
  54. package/src/lib/components/aside/header/rt-aside-header.component.scss +15 -4
  55. package/src/lib/components/button/rt-button.directive.scss +5 -1
  56. package/src/lib/components/data-table/CONTEXT.md +8 -2
  57. package/src/lib/components/field/CONTEXT.md +4 -2
  58. package/src/lib/components/field/rt-field.component.scss +14 -0
  59. package/src/lib/components/form-control/CONTEXT.md +13 -8
  60. package/src/lib/components/input/rt-input.component.scss +4 -0
  61. package/src/lib/components/message/CONTEXT.md +1 -1
  62. package/src/lib/components/message/rt-message.component.scss +2 -1
  63. package/src/lib/components/multiselect/rt-multiselect.component.scss +21 -0
  64. package/src/lib/components/popover/CONTEXT.md +3 -0
  65. package/src/lib/components/profile-menu/CONTEXT.md +4 -0
  66. package/src/lib/components/profile-menu/rt-profile-menu.component.scss +11 -0
  67. package/src/lib/components/service-block/stories/component/test-service-block-panel.component.scss +29 -0
  68. package/src/lib/components/table/CONTEXT.md +3 -0
  69. package/src/lib/components/table/copy-cell/CONTEXT.md +32 -0
  70. package/src/lib/components/table/copy-cell/rt-copy-cell.component.scss +26 -0
  71. package/src/lib/components/tabs/CONTEXT.md +19 -16
  72. package/src/lib/components/tabs/rt-tabs.component.scss +25 -1
  73. package/src/lib/components/toolbar/CONTEXT.md +21 -4
  74. package/src/lib/components/toolbar/filters-aside/rt-toolbar-filters-aside.component.scss +22 -0
  75. package/src/lib/components/toolbar/rt-toolbar.component.scss +12 -0
  76. package/src/styles/_form.scss +10 -0
  77. package/src/styles/_semantic.scss +2 -1
  78. package/styles/tokens.css +29 -9
  79. package/types/rt-tools-ui-kit-v2-aside.d.ts +21 -2
  80. package/types/rt-tools-ui-kit-v2-core.d.ts +21 -5
  81. package/types/rt-tools-ui-kit-v2-data-table.d.ts +23 -9
  82. package/types/rt-tools-ui-kit-v2-form-control.d.ts +2 -2
  83. package/types/rt-tools-ui-kit-v2-message.d.ts +1 -1
  84. package/types/rt-tools-ui-kit-v2-popover.d.ts +3 -1
  85. package/types/rt-tools-ui-kit-v2-profile-menu.d.ts +6 -1
  86. package/types/rt-tools-ui-kit-v2-table-core.d.ts +76 -0
  87. package/types/rt-tools-ui-kit-v2-table.d.ts +21 -18
  88. package/types/rt-tools-ui-kit-v2-tabs.d.ts +26 -0
  89. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +79 -2
@@ -101,4 +101,7 @@
101
101
  [`rt-menu`](../menu/CONTEXT.md) в строке.
102
102
  - Отбор колонки объявляется полем `filter` в `columnsConfig`, и ряд отбора таблица рисует сама —
103
103
  см. раздел выше. Колонка без `filter` не отбирает вовсе. Строк таблица не сужает.
104
+ - Отбор и сортировку считает общее ядро таблиц `@rt-tools/ui-kit-v2/table-core`, то же, что у
105
+ `rt-data-table`. Таблица передаёт ему свой режим: пустым считается только `''`, а третье нажатие
106
+ на шапку снимает порядок.
104
107
  - Спеки логики лежат рядом: сортировка и предикат действий строки проверены отдельно.
@@ -0,0 +1,32 @@
1
+ # `rt-copy-cell`
2
+
3
+ Значение с кнопкой копирования. Кнопка рисует `ico-copy`, после нажатия на две секунды — `check`.
4
+
5
+ ```html
6
+ <rt-copy-cell [value]="row.id">{{ row.id }}</rt-copy-cell>
7
+ <rt-copy-cell framed>https://example.com/hook</rt-copy-cell>
8
+ ```
9
+
10
+ | вход | тип | умолчание |
11
+ | --------------- | ----------------------- | --------- |
12
+ | `value` | `string \| number` | `null` |
13
+ | `variant` | `IRtIconButton.Variant` | `'ghost'` |
14
+ | `revealOnHover` | `boolean` | `true` |
15
+ | `framed` | `boolean` | `false` |
16
+
17
+ ## Главное, что нужно знать
18
+
19
+ **В таблице кнопка появляется при наведении на строку.** Вне таблицы строки для наведения нет,
20
+ и `revealOnHover="false"` держит кнопку видимой всегда.
21
+
22
+ **`framed` ставит ячейку в рамку поля ввода.** Фон, рамка и радиус поля, значение кеглем поля,
23
+ отступ слева как у текста поля, кнопка видна всегда и прижата к правому краю рамки. Так адрес для
24
+ копирования стоит в форме панели подключения службы. Длинное значение в рамке переносится на
25
+ следующую строку, а не обрезается: на телефоне адрес идёт в две строки.
26
+
27
+ **Обрезанное значение показывает подсказку целиком.** Обрезка меряется в минуту наведения; в
28
+ рамке значение не обрезается.
29
+
30
+ ## Рядом
31
+
32
+ - [`rt-table`](../CONTEXT.md) — таблица, где ячейка живёт по умолчанию.
@@ -38,6 +38,32 @@
38
38
  &--static &__button {
39
39
  opacity: 1;
40
40
  }
41
+
42
+ /* framed — ячейка в рамке поля ввода на всю ширину формы: фон, рамка и радиус поля,
43
+ отступ слева как у текста поля, кнопка прижата к правому краю рамки. */
44
+ &--framed {
45
+ display: flex;
46
+ width: 100%;
47
+ box-sizing: border-box;
48
+ padding: var(--rt-space-1) var(--rt-space-1) var(--rt-space-1) var(--rt-input-padding-x);
49
+ border: var(--rt-input-border-width) solid var(--rt-input-color-border);
50
+ border-radius: var(--rt-input-radius);
51
+ background-color: var(--rt-input-color-bg);
52
+ color: var(--rt-color-text-primary);
53
+ font-size: var(--rt-text-sm);
54
+ gap: var(--rt-space-sm);
55
+ line-height: var(--rt-leading-normal);
56
+ }
57
+
58
+ /* В рамке значение переносится, а не обрезается: адрес в форме читают целиком, и на
59
+ телефоне он идёт в две строки, как в эталоне панели подключения. Без переноса строка
60
+ значения распирала форму шире панели. */
61
+ &--framed &__content {
62
+ flex: 1 1 auto;
63
+ overflow-wrap: anywhere;
64
+ text-overflow: clip;
65
+ white-space: normal;
66
+ }
41
67
  }
42
68
 
43
69
  /* Reveal при наведении/фокусе на всю строку rt-table — привычное поведение
@@ -25,27 +25,30 @@
25
25
  | `scrollStep` | `'fixed' \| 'page' \| 'third'` | `'fixed'` |
26
26
  | `animationDuration` | `string \| number \| null` | `null` |
27
27
  | `preserveContent` | `boolean` | `false` |
28
+ | `dense` | `boolean` | `false` |
28
29
 
29
30
  Выходы: `activeIdChange: IRtTabs.Id`, `tabClose: IRtTabs.Id` — просьба закрыть вкладку с `closable`.
30
31
 
31
32
  ## `[rtTab]`
32
33
 
33
- | вход | тип | умолчание |
34
- | --------------------------------- | --------------------------------------------- | --------------------- |
35
- | `rtTab` | `IRtTabs.Id` — идентификатор вкладки | `''` |
36
- | `label` | `string` | `''` |
37
- | `titleTemplate` | `TemplateRef \| null` | `null` |
38
- | `icon` / `iconColor` | `IRtIcon.Name \| null` / `IRtTabs.TitleColor` | `null` / `'current'` |
39
- | `badge` | `string \| number \| null` | `null` |
40
- | `badgeTitle` | `string` — подсказка при наведении на метку | `''` |
41
- | `badgeAriaLabel` | `string` — подпись метки для чтения с экрана | `''` |
42
- | `disabled` / `hidden` / `invalid` | `boolean` | `false` |
43
- | `invalidMessage` | `string` | `''` → `uiTabInvalid` |
44
- | `glyph` | `string \| null` — значок Material | `null` |
45
- | `tooltip` | `string` — подсказка, и у отключённой | `''` |
46
- | `closable` | `boolean` | `false` |
47
- | `closeTooltip` | `string` — подсказка крестика | `''` |
48
- | `closeTooltipPlacement` | `IRtTooltip.Placement \| null` | `null` |
34
+ | вход | тип | умолчание |
35
+ | --------------------------------- | ------------------------------------------------- | --------------------- |
36
+ | `rtTab` | `IRtTabs.Id` — идентификатор вкладки | `''` |
37
+ | `label` | `string` | `''` |
38
+ | `titleTemplate` | `TemplateRef \| null` | `null` |
39
+ | `icon` / `iconColor` | `IRtIcon.Name \| null` / `IRtTabs.TitleColor` | `null` / `'current'` |
40
+ | `badge` | `string \| number \| null` | `null` |
41
+ | `badgeTitle` | `string` — подсказка при наведении на метку | `''` |
42
+ | `badgeAriaLabel` | `string` — подпись метки для чтения с экрана | `''` |
43
+ | `badgePosition` | `IRtTabs.BadgePosition` — `'overlay'` над иконкой | `'inline'` |
44
+ | `iconFill` | `boolean` — иконка залита | `false` |
45
+ | `disabled` / `hidden` / `invalid` | `boolean` | `false` |
46
+ | `invalidMessage` | `string` | `''` → `uiTabInvalid` |
47
+ | `glyph` | `string \| null` — значок Material | `null` |
48
+ | `tooltip` | `string` — подсказка, и у отключённой | `''` |
49
+ | `closable` | `boolean` | `false` |
50
+ | `closeTooltip` | `string` — подсказка крестика | `''` |
51
+ | `closeTooltipPlacement` | `IRtTooltip.Placement \| null` | `null` |
49
52
 
50
53
  ## Главное, что нужно знать
51
54
 
@@ -351,6 +351,13 @@
351
351
  flex-shrink: 0;
352
352
  }
353
353
 
354
+ /* Опора бейджа над иконкой: вкладка не знает, где иконка, и кружок ставится от её коробки. */
355
+ &__icon-box {
356
+ position: relative;
357
+ display: inline-flex;
358
+ flex-shrink: 0;
359
+ }
360
+
354
361
  &__badge {
355
362
  display: inline-flex;
356
363
  min-width: 18px;
@@ -364,6 +371,23 @@
364
371
  font-size: var(--rt-text-xs);
365
372
  font-weight: var(--rt-font-weight-medium);
366
373
  line-height: var(--rt-leading-none);
374
+
375
+ /* Кружок над правым верхним углом иконки, как `matBadge` у Material: из потока вынут, и
376
+ вкладка той же ширины, что без бейджа. Привязан правым краем — длинное число растёт
377
+ на иконку, а не на подпись. Сторона кружка — его полная ширина: поля внутри неё, иначе
378
+ однозначное число шире 16 px. */
379
+ &--overlay {
380
+ position: absolute;
381
+ top: calc(-1 * var(--rt-space-2));
382
+ right: calc(-1 * (var(--rt-space-1) + var(--rt-space-0-5)));
383
+ min-width: var(--rt-size-4);
384
+ height: var(--rt-size-4);
385
+ box-sizing: border-box;
386
+ padding: 0 var(--rt-space-1);
387
+ background-color: var(--rt-color-action-primary);
388
+ color: var(--rt-color-action-on-primary);
389
+ font-size: var(--rt-text-2xs);
390
+ }
367
391
  }
368
392
 
369
393
  /* Крестик закрываемой вкладки: подложка при наведении отделяет его от самой вкладки,
@@ -419,7 +443,7 @@
419
443
  background-color: var(--rt-color-action-primary);
420
444
  }
421
445
 
422
- .rt-tab-item__badge {
446
+ .rt-tab-item__badge:not(.rt-tab-item__badge--overlay) {
423
447
  background-color: var(--rt-color-action-primary-soft);
424
448
  color: var(--rt-color-action-primary);
425
449
  }
@@ -10,11 +10,15 @@
10
10
  </rt-toolbar>
11
11
  ```
12
12
 
13
- | вход | тип | умолчание |
14
- | ------- | --------- | --------- |
15
- | `dense` | `boolean` | `false` |
13
+ | вход | тип | умолчание |
14
+ | --------------- | --------- | --------- |
15
+ | `dense` | `boolean` | `false` |
16
+ | `filtersActive` | `boolean` | `false` |
16
17
 
17
- Выходов нет.
18
+ | выход | когда |
19
+ | -------------- | ---------------------------------------------- |
20
+ | `filtersApply` | нажата «Применить» панели отборов, она закрыта |
21
+ | `filtersReset` | нажата «Сбросить» панели отборов, она открыта |
18
22
 
19
23
  ## Главное, что нужно знать
20
24
 
@@ -37,3 +41,16 @@
37
41
  **Плотная полоса остаётся строкой на любой ширине, и её левая часть сжимается.** Длинный
38
42
  заголовок в ней переносится по словам и не выходит за правый край. Кнопки справа держат свою
39
43
  ширину. Обычная полоса левую часть не сжимает: на узком экране она стекает в колонку.
44
+
45
+ **Отборы списка объявляются слотом `rtToolbarFilters`, и на узком месте они уходят за кнопку.** На
46
+ широком месте слот стоит в левой части после её содержимого. На узком месте
47
+ (`BreakpointsService.narrow`) вместо полей рисуется кнопка фильтров, первой в ряду кнопок правой
48
+ части; ниже 768 этот ряд начинается от левого края. Вход `filtersActive` ставит точку в угол значка.
49
+ Кнопка открывает панель `RtToolbarFiltersAsideComponent` службой боковых панелей. «Сбросить»
50
+ сообщает `filtersReset`, и панель остаётся открытой; «Применить» сообщает `filtersApply` и
51
+ закрывает её. Контекст шаблона — место, где он нарисован: `bar` или `panel`. Хозяин панели —
52
+ инжектор полосы: уничтожение полосы закрывает панель, и расширение места тоже — иначе поля отборов
53
+ стояли бы в полосе и в панели сразу; фокус из закрытой так панели уходит в левую секцию полосы.
54
+ Второе нажатие кнопки, пока панель открыта, ничего не открывает. Панель держит фокус
55
+ (`trapFocus`) и объявлена модальным диалогом (`modal`), а имя кнопки при `filtersActive` говорит
56
+ скринридеру, что отбор включён.
@@ -0,0 +1,22 @@
1
+ @layer rt-kit.components {
2
+ /* rt-toolbar-filters-aside — панель отборов полосы на узком экране. ViewEncapsulation.None. */
3
+ .rt-toolbar-filters-aside {
4
+ --rt-toolbar-filters-aside-gap: var(--rt-space-md);
5
+
6
+ /* Поля отборов — одно под другим во всю ширину тела панели. */
7
+ &__fields {
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: var(--rt-toolbar-filters-aside-gap);
11
+
12
+ // Блок получает начальный фокус панели как место, а не как элемент управления: рамки нет
13
+ &:focus {
14
+ outline: none;
15
+ }
16
+
17
+ > * {
18
+ width: 100%;
19
+ }
20
+ }
21
+ }
22
+ }
@@ -83,6 +83,12 @@
83
83
  gap: var(--rt-space-sm);
84
84
  }
85
85
  }
86
+
87
+ /* Кнопка фильтров узкого места — первая в ряду кнопок и не сжимается: точка включённого
88
+ отбора выступает за её угол, и полоса её не режет — у секций нет своего overflow. */
89
+ &__filters-trigger {
90
+ flex-shrink: 0;
91
+ }
86
92
  }
87
93
 
88
94
  // Плотная полоса не стекает в колонку, и длинный заголовок левой зоны ей некуда деть: зона
@@ -119,5 +125,11 @@
119
125
  margin-left: 0;
120
126
  }
121
127
  }
128
+
129
+ // Отборы ушли за кнопку: она открывает ряд кнопок полосы у левого края, как в макете
130
+ // «Телефон · Toolbar · фильтры за кнопкой».
131
+ .rt-toolbar--filters-collapsed:not(.rt-toolbar--dense) .rt-toolbar__bar--right {
132
+ justify-content: flex-start;
133
+ }
122
134
  }
123
135
  }
@@ -231,6 +231,16 @@
231
231
  }
232
232
  }
233
233
 
234
+ /* Блок службы, стоящий прямо в форме, отбивается от следующего раздела шагом строк: на
235
+ макете панели подключения поле под чертой блока стоит на 16 при любой ширине. Источник
236
+ промежутка остаётся один, зазор формы, а блок снимает с него разницу между шагом разделов
237
+ и шагом строк. Разница есть только шире порога панели: на узком экране зазор формы и так 16. */
238
+ @media (width > #{bp.$rt-bp-md}) {
239
+ .rt-form > .rt-service-block {
240
+ margin-bottom: calc(var(--rt-space-md) - var(--rt-space-xl));
241
+ }
242
+ }
243
+
234
244
  /* На узком экране панель занимает весь экран, и ритм разделов сжимается вдвое. Порог тот же,
235
245
  что у самой панели. Ритм строк не трогается: строки и на узком идут тем же шагом. */
236
246
  @media (width <= #{bp.$rt-bp-md}) {
@@ -398,6 +398,7 @@
398
398
  --rt-field-gap: var(--rt-space-xs);
399
399
  --rt-field-label-font-size: var(--rt-text-sm);
400
400
  --rt-field-label-font-weight: var(--rt-font-weight-medium);
401
+ --rt-field-label-line-height: var(--rt-leading-none);
401
402
  --rt-field-label-color: var(--rt-color-text-muted);
402
403
  --rt-field-label-help-gap: var(--rt-space-xs);
403
404
  --rt-field-hint-font-size: var(--rt-text-xs);
@@ -407,7 +408,7 @@
407
408
  --rt-field-messages-padding-top: 0px;
408
409
  --rt-field-error-color: var(--rt-color-state-danger);
409
410
  --rt-field-required-color: var(--rt-color-state-danger);
410
- --rt-field-required-gap: var(--rt-space-1);
411
+ --rt-field-required-gap: var(--rt-space-0-5);
411
412
  --rt-field-value-font-size: var(--rt-text-sm);
412
413
  --rt-field-value-color: var(--rt-color-text-primary);
413
414
  --rt-field-value-empty-color: var(--rt-color-text-muted);
package/styles/tokens.css CHANGED
@@ -808,6 +808,7 @@
808
808
  --rt-field-gap: var(--rt-space-xs);
809
809
  --rt-field-label-font-size: var(--rt-text-sm);
810
810
  --rt-field-label-font-weight: var(--rt-font-weight-medium);
811
+ --rt-field-label-line-height: var(--rt-leading-none);
811
812
  --rt-field-label-color: var(--rt-color-text-muted);
812
813
  --rt-field-label-help-gap: var(--rt-space-xs);
813
814
  --rt-field-hint-font-size: var(--rt-text-xs);
@@ -817,7 +818,7 @@
817
818
  --rt-field-messages-padding-top: 0px;
818
819
  --rt-field-error-color: var(--rt-color-state-danger);
819
820
  --rt-field-required-color: var(--rt-color-state-danger);
820
- --rt-field-required-gap: var(--rt-space-1);
821
+ --rt-field-required-gap: var(--rt-space-0-5);
821
822
  --rt-field-value-font-size: var(--rt-text-sm);
822
823
  --rt-field-value-color: var(--rt-color-text-primary);
823
824
  --rt-field-value-empty-color: var(--rt-color-text-muted);
@@ -1842,6 +1843,7 @@ html.rt-theme-dark {
1842
1843
  --rt-field-gap: var(--rt-space-xs);
1843
1844
  --rt-field-label-font-size: var(--rt-text-sm);
1844
1845
  --rt-field-label-font-weight: var(--rt-font-weight-medium);
1846
+ --rt-field-label-line-height: var(--rt-leading-none);
1845
1847
  --rt-field-label-color: var(--rt-color-text-muted);
1846
1848
  --rt-field-label-help-gap: var(--rt-space-xs);
1847
1849
  --rt-field-hint-font-size: var(--rt-text-xs);
@@ -1851,7 +1853,7 @@ html.rt-theme-dark {
1851
1853
  --rt-field-messages-padding-top: 0px;
1852
1854
  --rt-field-error-color: var(--rt-color-state-danger);
1853
1855
  --rt-field-required-color: var(--rt-color-state-danger);
1854
- --rt-field-required-gap: var(--rt-space-1);
1856
+ --rt-field-required-gap: var(--rt-space-0-5);
1855
1857
  --rt-field-value-font-size: var(--rt-text-sm);
1856
1858
  --rt-field-value-color: var(--rt-color-text-primary);
1857
1859
  --rt-field-value-empty-color: var(--rt-color-text-muted);
@@ -2379,6 +2381,7 @@ html.rt-theme-dark {
2379
2381
  --rt-field-gap: var(--rt-space-xs);
2380
2382
  --rt-field-label-font-size: var(--rt-text-sm);
2381
2383
  --rt-field-label-font-weight: var(--rt-font-weight-medium);
2384
+ --rt-field-label-line-height: var(--rt-leading-none);
2382
2385
  --rt-field-label-color: var(--rt-color-text-muted);
2383
2386
  --rt-field-label-help-gap: var(--rt-space-xs);
2384
2387
  --rt-field-hint-font-size: var(--rt-text-xs);
@@ -2388,7 +2391,7 @@ html.rt-theme-dark {
2388
2391
  --rt-field-messages-padding-top: 0px;
2389
2392
  --rt-field-error-color: var(--rt-color-state-danger);
2390
2393
  --rt-field-required-color: var(--rt-color-state-danger);
2391
- --rt-field-required-gap: var(--rt-space-1);
2394
+ --rt-field-required-gap: var(--rt-space-0-5);
2392
2395
  --rt-field-value-font-size: var(--rt-text-sm);
2393
2396
  --rt-field-value-color: var(--rt-color-text-primary);
2394
2397
  --rt-field-value-empty-color: var(--rt-color-text-muted);
@@ -3065,6 +3068,7 @@ html.rt-theme-dark {
3065
3068
  --rt-field-gap: var(--rt-space-xs);
3066
3069
  --rt-field-label-font-size: var(--rt-text-sm);
3067
3070
  --rt-field-label-font-weight: var(--rt-font-weight-medium);
3071
+ --rt-field-label-line-height: var(--rt-leading-none);
3068
3072
  --rt-field-label-color: var(--rt-color-text-muted);
3069
3073
  --rt-field-label-help-gap: var(--rt-space-xs);
3070
3074
  --rt-field-hint-font-size: var(--rt-text-xs);
@@ -3074,7 +3078,7 @@ html.rt-theme-dark {
3074
3078
  --rt-field-messages-padding-top: 0px;
3075
3079
  --rt-field-error-color: var(--rt-color-state-danger);
3076
3080
  --rt-field-required-color: var(--rt-color-state-danger);
3077
- --rt-field-required-gap: var(--rt-space-1);
3081
+ --rt-field-required-gap: var(--rt-space-0-5);
3078
3082
  --rt-field-value-font-size: var(--rt-text-sm);
3079
3083
  --rt-field-value-color: var(--rt-color-text-primary);
3080
3084
  --rt-field-value-empty-color: var(--rt-color-text-muted);
@@ -3877,6 +3881,7 @@ html.rt-theme-dark .rt-preset-material {
3877
3881
  --rt-field-gap: var(--rt-space-xs);
3878
3882
  --rt-field-label-font-size: var(--rt-text-sm);
3879
3883
  --rt-field-label-font-weight: var(--rt-font-weight-medium);
3884
+ --rt-field-label-line-height: var(--rt-leading-none);
3880
3885
  --rt-field-label-color: var(--rt-color-text-muted);
3881
3886
  --rt-field-label-help-gap: var(--rt-space-xs);
3882
3887
  --rt-field-hint-font-size: var(--rt-text-xs);
@@ -3886,7 +3891,7 @@ html.rt-theme-dark .rt-preset-material {
3886
3891
  --rt-field-messages-padding-top: 0px;
3887
3892
  --rt-field-error-color: var(--rt-color-state-danger);
3888
3893
  --rt-field-required-color: var(--rt-color-state-danger);
3889
- --rt-field-required-gap: var(--rt-space-1);
3894
+ --rt-field-required-gap: var(--rt-space-0-5);
3890
3895
  --rt-field-value-font-size: var(--rt-text-sm);
3891
3896
  --rt-field-value-color: var(--rt-color-text-primary);
3892
3897
  --rt-field-value-empty-color: var(--rt-color-text-muted);
@@ -4874,6 +4879,7 @@ html.rt-theme-dark [data-theme=light] .rt-preset-material {
4874
4879
  --rt-field-gap: var(--rt-space-xs);
4875
4880
  --rt-field-label-font-size: var(--rt-text-sm);
4876
4881
  --rt-field-label-font-weight: var(--rt-font-weight-medium);
4882
+ --rt-field-label-line-height: var(--rt-leading-none);
4877
4883
  --rt-field-label-color: var(--rt-color-text-muted);
4878
4884
  --rt-field-label-help-gap: var(--rt-space-xs);
4879
4885
  --rt-field-hint-font-size: var(--rt-text-xs);
@@ -4883,7 +4889,7 @@ html.rt-theme-dark [data-theme=light] .rt-preset-material {
4883
4889
  --rt-field-messages-padding-top: 0px;
4884
4890
  --rt-field-error-color: var(--rt-color-state-danger);
4885
4891
  --rt-field-required-color: var(--rt-color-state-danger);
4886
- --rt-field-required-gap: var(--rt-space-1);
4892
+ --rt-field-required-gap: var(--rt-space-0-5);
4887
4893
  --rt-field-value-font-size: var(--rt-text-sm);
4888
4894
  --rt-field-value-color: var(--rt-color-text-primary);
4889
4895
  --rt-field-value-empty-color: var(--rt-color-text-muted);
@@ -5685,6 +5691,7 @@ html.rt-theme-dark [data-theme=light] .rt-preset-material {
5685
5691
  --rt-field-gap: var(--rt-space-xs);
5686
5692
  --rt-field-label-font-size: var(--rt-text-sm);
5687
5693
  --rt-field-label-font-weight: var(--rt-font-weight-medium);
5694
+ --rt-field-label-line-height: var(--rt-leading-none);
5688
5695
  --rt-field-label-color: var(--rt-color-text-muted);
5689
5696
  --rt-field-label-help-gap: var(--rt-space-xs);
5690
5697
  --rt-field-hint-font-size: var(--rt-text-xs);
@@ -5694,7 +5701,7 @@ html.rt-theme-dark [data-theme=light] .rt-preset-material {
5694
5701
  --rt-field-messages-padding-top: 0px;
5695
5702
  --rt-field-error-color: var(--rt-color-state-danger);
5696
5703
  --rt-field-required-color: var(--rt-color-state-danger);
5697
- --rt-field-required-gap: var(--rt-space-1);
5704
+ --rt-field-required-gap: var(--rt-space-0-5);
5698
5705
  --rt-field-value-font-size: var(--rt-text-sm);
5699
5706
  --rt-field-value-color: var(--rt-color-text-primary);
5700
5707
  --rt-field-value-empty-color: var(--rt-color-text-muted);
@@ -6493,6 +6500,7 @@ html.rt-theme-dark [data-theme=light] .rt-preset-material {
6493
6500
  --rt-field-gap: var(--rt-space-xs);
6494
6501
  --rt-field-label-font-size: var(--rt-text-sm);
6495
6502
  --rt-field-label-font-weight: var(--rt-font-weight-medium);
6503
+ --rt-field-label-line-height: var(--rt-leading-none);
6496
6504
  --rt-field-label-color: var(--rt-color-text-muted);
6497
6505
  --rt-field-label-help-gap: var(--rt-space-xs);
6498
6506
  --rt-field-hint-font-size: var(--rt-text-xs);
@@ -6502,7 +6510,7 @@ html.rt-theme-dark [data-theme=light] .rt-preset-material {
6502
6510
  --rt-field-messages-padding-top: 0px;
6503
6511
  --rt-field-error-color: var(--rt-color-state-danger);
6504
6512
  --rt-field-required-color: var(--rt-color-state-danger);
6505
- --rt-field-required-gap: var(--rt-space-1);
6513
+ --rt-field-required-gap: var(--rt-space-0-5);
6506
6514
  --rt-field-value-font-size: var(--rt-text-sm);
6507
6515
  --rt-field-value-color: var(--rt-color-text-primary);
6508
6516
  --rt-field-value-empty-color: var(--rt-color-text-muted);
@@ -7638,6 +7646,15 @@ html.rt-theme-dark.rt-preset-material {
7638
7646
  .rt-form .rt-tabs__content {
7639
7647
  gap: var(--rt-space-xl);
7640
7648
  }
7649
+ /* Блок службы, стоящий прямо в форме, отбивается от следующего раздела шагом строк: на
7650
+ макете панели подключения поле под чертой блока стоит на 16 при любой ширине. Источник
7651
+ промежутка остаётся один, зазор формы, а блок снимает с него разницу между шагом разделов
7652
+ и шагом строк. Разница есть только шире порога панели: на узком экране зазор формы и так 16. */
7653
+ @media (width > 768px) {
7654
+ .rt-form > .rt-service-block {
7655
+ margin-bottom: calc(var(--rt-space-md) - var(--rt-space-xl));
7656
+ }
7657
+ }
7641
7658
  /* На узком экране панель занимает весь экран, и ритм разделов сжимается вдвое. Порог тот же,
7642
7659
  что у самой панели. Ритм строк не трогается: строки и на узком идут тем же шагом. */
7643
7660
  @media (width <= 768px) {
@@ -7665,7 +7682,9 @@ html.rt-theme-dark.rt-preset-material {
7665
7682
  --rt-btn-padding: 0 1.25rem;
7666
7683
  --rt-btn-gap: 0.5rem;
7667
7684
  --rt-btn-radius: var(--rt-radius-control);
7668
- --rt-btn-border-width: var(--rt-border-width-thin);
7685
+ /* Рамка есть только у кнопки в рамке, как в макете кнопок: у залитой и текстовой
7686
+ её нет, и подпись стоит на отступе от края, а не на отступе плюс рамка. */
7687
+ --rt-btn-border-width: 0px;
7669
7688
  --rt-btn-transition-duration: var(--rt-duration-fast);
7670
7689
  --rt-btn-focus-shadow: var(--rt-shadow-focus-ring);
7671
7690
  --rt-btn-font-size: 0.95rem;
@@ -7818,6 +7837,7 @@ html.rt-theme-dark.rt-preset-material {
7818
7837
  свойствами — на графите слабый оттенок не виден, и тёмная тема их поднимает. */
7819
7838
  }
7820
7839
  .rt-button--outlined {
7840
+ --rt-btn-border-width: var(--rt-border-width-thin);
7821
7841
  --rt-btn-bg: transparent;
7822
7842
  --rt-btn-bg-hover: color-mix(in srgb, var(--rt-btn-color) var(--rt-btn-tint-hover), transparent);
7823
7843
  --rt-btn-bg-active: color-mix(in srgb, var(--rt-btn-color) var(--rt-btn-tint-active), transparent);
@@ -35,7 +35,8 @@ export type TRtAsideContentLayout = 'default' | 'tabs';
35
35
  * обводка фокуса поля срезалась краем такого мини-скроллера.
36
36
  *
37
37
  * Семантика — `role="complementary"` (mirror rt-dialog имеет `role="dialog"`,
38
- * aside — другая роль, side-sheet не обязательно блокирующий).
38
+ * aside — другая роль, side-sheet не обязательно блокирующий). Панель, которая блокирует
39
+ * страницу и держит фокус, включает вход `modal`: рамка объявлена `role="dialog"` с `aria-modal`.
39
40
  *
40
41
  * `ViewEncapsulation.None` — стили префиксованы `.rt-aside`, чтобы соседние
41
42
  * rt-aside-header / rt-aside-footer работали с одним BEM-блоком без
@@ -59,6 +60,8 @@ export declare class RtAsideComponent {
59
60
  * элемент под Tab, а когда панель уходит или вход гаснет, возвращается туда, где стоял.
60
61
  */
61
62
  readonly trapFocus: InputSignalWithTransform<boolean, BooleanInput>;
63
+ /** Панель блокирует страницу: рамка объявлена скринридеру модальным диалогом. */
64
+ readonly modal: InputSignalWithTransform<boolean, BooleanInput>;
62
65
  /** Идёт запрос: панель накрыта слоем с крутилкой и помечена занятой. */
63
66
  readonly pending: InputSignalWithTransform<boolean, BooleanInput>;
64
67
  constructor();
@@ -94,6 +97,11 @@ export declare class RtAsideComponent {
94
97
  "required": false;
95
98
  "isSignal": true;
96
99
  };
100
+ "modal": {
101
+ "alias": "modal";
102
+ "required": false;
103
+ "isSignal": true;
104
+ };
97
105
  "pending": {
98
106
  "alias": "pending";
99
107
  "required": false;
@@ -429,9 +437,20 @@ export declare class RtAsideFooterComponent {
429
437
  #private;
430
438
  protected readonly buttons: Signal<readonly RtButtonDirective[]>;
431
439
  protected readonly hosts: Signal<readonly ElementRef<HTMLElement>[]>;
440
+ /**
441
+ * На телефоне кнопка слота `[asideDismiss]` читается «Закрыть»: так она названа у всех панелей.
442
+ * `false` оставляет подпись потребителя — у панели фильтров эта кнопка «Сбросить», а не выход.
443
+ */
444
+ readonly phoneCloseLabel: InputSignalWithTransform<boolean, boolean | string>;
432
445
  constructor();
433
446
  static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideFooterComponent, never>;
434
- static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideFooterComponent, "rt-aside-footer", never, {}, {}, ["buttons", "hosts"], ["[asideDismiss]", "[asidePrimary]"], true, never>;
447
+ static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideFooterComponent, "rt-aside-footer", never, {
448
+ "phoneCloseLabel": {
449
+ "alias": "phoneCloseLabel";
450
+ "required": false;
451
+ "isSignal": true;
452
+ };
453
+ }, {}, ["buttons", "hosts"], ["[asideDismiss]", "[asidePrimary]"], true, never>;
435
454
  }
436
455
  /**
437
456
  * Блок ошибки запроса боковой панели: надпись и кнопка, которая кладёт в буфер обмена время и