@rt-tools/ui-kit-v2 0.41.0 → 0.43.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 (56) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +4 -4
  2. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +22 -0
  4. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +155 -100
  6. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
  8. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +1778 -18
  10. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +22 -5
  12. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +34 -11
  14. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +725 -47
  16. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +6 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
  19. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +217 -6
  20. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
  21. package/package.json +1 -1
  22. package/src/lib/components/calendar/CONTEXT.md +4 -2
  23. package/src/lib/components/calendar/rt-calendar.component.scss +29 -2
  24. package/src/lib/components/date-picker/CONTEXT.md +5 -0
  25. package/src/lib/components/date-picker/panel/CONTEXT.md +42 -0
  26. package/src/lib/components/date-picker/panel/rt-date-panel.component.scss +55 -2
  27. package/src/lib/components/page-header/CONTEXT.md +35 -1
  28. package/src/lib/components/page-header/bar/rt-page-bar.component.scss +161 -0
  29. package/src/lib/components/page-header/rail/rt-page-actions.component.scss +115 -0
  30. package/src/lib/components/page-header/rail/rt-page-phone-menu.component.scss +129 -0
  31. package/src/lib/components/page-header/rail/rt-page-rail.component.scss +281 -0
  32. package/src/lib/components/page-header/rail/rt-page-user.component.scss +76 -0
  33. package/src/lib/components/page-header/rt-page-header.component.scss +5 -0
  34. package/src/lib/components/page-header/stories/component/test-page-header-vertical.component.scss +72 -0
  35. package/src/lib/components/page-header/stories/component/test-page-table.component.scss +81 -0
  36. package/src/lib/components/page-header/user/rt-page-header-user.component.scss +6 -0
  37. package/src/lib/components/stepper/CONTEXT.md +34 -2
  38. package/src/lib/components/stepper/rt-stepper.component.scss +62 -43
  39. package/src/lib/components/tabs/CONTEXT.md +30 -1
  40. package/src/lib/components/tabs/rt-tabs-arrows.scss +140 -0
  41. package/src/lib/components/tabs/rt-tabs-more-menu.scss +126 -0
  42. package/src/lib/components/tabs/rt-tabs-more.component.scss +29 -0
  43. package/src/lib/components/tabs/rt-tabs.component.scss +18 -61
  44. package/src/lib/components/workspace/CONTEXT.md +11 -1
  45. package/src/lib/components/workspace/rt-workspace.component.scss +51 -3
  46. package/src/rich-editor/lib/components/chat/CONTEXT.md +12 -2
  47. package/src/rich-editor/lib/components/chat/rt-chat-messenger.scss +9 -3
  48. package/src/rich-editor/lib/components/chat/rt-chat-translation.scss +92 -0
  49. package/types/rt-tools-ui-kit-v2-calendar.d.ts +13 -1
  50. package/types/rt-tools-ui-kit-v2-core.d.ts +9 -1
  51. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +157 -5
  52. package/types/rt-tools-ui-kit-v2-page-header.d.ts +202 -2
  53. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +25 -0
  54. package/types/rt-tools-ui-kit-v2-stepper.d.ts +20 -6
  55. package/types/rt-tools-ui-kit-v2-tabs.d.ts +120 -1
  56. package/types/rt-tools-ui-kit-v2-workspace.d.ts +33 -1
@@ -0,0 +1,81 @@
1
+ @layer rt-kit.components {
2
+ /* Содержимое страницы кадров: таблица в окне с прокруткой и подвал пагинации под ней. */
3
+ .app-page-table {
4
+ display: flex;
5
+ height: 100%;
6
+ min-height: 0;
7
+ flex-direction: column;
8
+
9
+ &__window {
10
+ overflow: auto hidden;
11
+ min-height: 0;
12
+ flex: 1 1 0;
13
+ }
14
+
15
+ /* Подвал кадров: высота 40, кнопки и поле 32, подпись в одну строку. */
16
+ &__pagination {
17
+ --rt-pagination-padding-y: var(--rt-space-1);
18
+ --rt-pagination-padding-x: var(--rt-space-1);
19
+ --rt-pagination-box-size: var(--rt-control-height-sm);
20
+ --rt-pagination-field-height: var(--rt-control-height-sm);
21
+ --rt-pagination-per-page-label-white-space: nowrap;
22
+
23
+ flex: none;
24
+ }
25
+
26
+ @media (width > 768px) {
27
+ &__table {
28
+ min-width: 1570px;
29
+ table-layout: fixed;
30
+ }
31
+
32
+ &__table th {
33
+ box-sizing: border-box;
34
+ }
35
+
36
+ /* Длинное значение в широкой таблице кадров — в одну строку с многоточием. */
37
+ &__table td {
38
+ overflow: hidden;
39
+ text-overflow: ellipsis;
40
+ white-space: nowrap;
41
+ }
42
+
43
+ /* Ширины колонок кадров: в сумме 1570. */
44
+ .cdk-column-dates {
45
+ width: 230px;
46
+ }
47
+
48
+ .cdk-column-place {
49
+ width: 170px;
50
+ }
51
+
52
+ .cdk-column-guest {
53
+ width: 180px;
54
+ }
55
+
56
+ .cdk-column-contact {
57
+ width: 200px;
58
+ }
59
+
60
+ .cdk-column-party {
61
+ width: 110px;
62
+ }
63
+
64
+ .cdk-column-source {
65
+ width: 130px;
66
+ }
67
+
68
+ .cdk-column-status {
69
+ width: 190px;
70
+ }
71
+
72
+ .cdk-column-payment {
73
+ width: 170px;
74
+ }
75
+
76
+ .cdk-column-sum {
77
+ width: 190px;
78
+ }
79
+ }
80
+ }
81
+ }
@@ -0,0 +1,6 @@
1
+ @layer rt-kit.components {
2
+ /* Кнопка стоит в ряду шапки прямым участником: своего места у этой части нет. */
3
+ .rt-page-header-user {
4
+ display: contents;
5
+ }
6
+ }
@@ -14,6 +14,32 @@
14
14
 
15
15
  Выходов нет — шаги переключает потребитель. Описание шага необязательно.
16
16
 
17
+ Полоса тянется по ширине места, от узкой панели в 280 px до любой. Шагов сколько угодно, текущий —
18
+ любой.
19
+
20
+ ## Цвета
21
+
22
+ Цвета — ручки потребителя `--rt-stepper-*`: кит их не объявляет, приложение задаёт их правилом на
23
+ `rt-stepper` или на любом родителе. Пока не задано, работает запасное значение — токен темы.
24
+ Объявить их на хосте нельзя: объявление на хосте перебило бы значение, унаследованное от родителя.
25
+
26
+ | свойство | что красит | умолчание |
27
+ | ------------------------------------- | ----------------------------- | ----------------------------- |
28
+ | `--rt-stepper-track-color` | трек и будущие точки | `--rt-color-stepper-track` |
29
+ | `--rt-stepper-progress-color` | заполнение и пройденные точки | `--rt-color-stepper-progress` |
30
+ | `--rt-stepper-current-color` | текущая точка | `--rt-color-stepper-current` |
31
+ | `--rt-stepper-label-color` | подпись текущего шага | `--rt-stepper-current-color` |
32
+ | `--rt-stepper-description-color` | описание под полосой | `--rt-color-text-primary` |
33
+ | `--rt-stepper-point-shadow` | ореол текущей точки | `--rt-shadow-step-indicator` |
34
+ | `--rt-stepper-inset` | отступ трека, точек и подписи | `0` |
35
+ | `--rt-stepper-line-color` | линия между метками списка | `--rt-color-border-default` |
36
+ | `--rt-stepper-step-label-color` | подпись шага в списке | `--rt-color-text-primary` |
37
+ | `--rt-stepper-step-description-color` | описание шага в списке | `--rt-color-text-muted` |
38
+ | `--rt-stepper-mark-<состояние>-bg` | фон метки списка | по состоянию |
39
+ | `--rt-stepper-mark-<состояние>-color` | цифра метки списка | по состоянию |
40
+
41
+ Состояния метки: `complete`, `current`, `upcoming`, `neutral`.
42
+
17
43
  ## Вертикальный список
18
44
 
19
45
  `orientation="vertical"` рисует `<ol>`: метка с номером, подпись, описание, линия между метками.
@@ -36,8 +62,14 @@
36
62
  - Описание разбивается на абзацы по пустой строке (`\n\n`); пустое описание не создаёт абзаца.
37
63
  - Точки спрятаны от скринридера — прогресс он читает с самой полосы: `role="progressbar"`,
38
64
  `aria-valuemin/max/now` и `aria-valuetext` с подписью текущего шага.
39
- - Подпись текущего шага прижимается к началу, центру или концу полосы в зависимости от того,
40
- где стоит шаг.
65
+ - Подпись текущего шага стоит в отрезке полосы: на первом шаге вся полоса и прижим к началу, на
66
+ последнем — к концу, на среднем отрезок с центром на доле шага шириной в два расстояния до
67
+ ближнего края. Текущая точка шире соседних, поэтому её центр отходит от центра отрезка не больше
68
+ чем на 4 px. Если такой отрезок уже половины полосы, подпись берёт всю полосу и прижимается к
69
+ ближнему краю. За полосу подпись не выходит, длинная переносится и растит полосу вниз. Так же
70
+ собран макет.
71
+ - Ореол текущей точки на первом и последнем шаге выходит за полосу на 4 px. Родитель, который
72
+ обрезает содержимое, задаёт `--rt-stepper-inset` не меньше 4 px.
41
73
 
42
74
  ## Рядом
43
75
 
@@ -1,81 +1,96 @@
1
1
  @use '../../../styles/mixins' as kv;
2
2
 
3
3
  @layer rt-kit.components {
4
- /* rt-stepper — линейный прогресс-степпер в common/ui. ViewEncapsulation.None.
4
+ /* rt-stepper — полоса прогресса по шагам и вертикальный список. ViewEncapsulation.None.
5
5
  Хост адресуется по имени элемента, а не по классу блока: класс `.rt-stepper` висит
6
6
  и на `<rt-stepper>`, и на корне шаблона, поэтому правила блока вложены в хост —
7
7
  так они достаются только корню шаблона. */
8
8
 
9
9
  rt-stepper {
10
+ /* Цвета степпера переопределяются свойствами `--rt-stepper-*` на `rt-stepper` или на родителе.
11
+ Здесь они не объявляются: объявление на хосте перебило бы значение, унаследованное от
12
+ родителя. Умолчание — запасное значение в месте использования, токен темы. */
10
13
  display: block;
11
14
 
12
15
  .rt-stepper {
13
16
  --rt-stepper-radius: var(--rt-radius-full);
14
- --rt-stepper-point-shadow: var(--rt-shadow-step-indicator);
17
+ --rt-stepper-halo: var(--rt-stepper-point-shadow, var(--rt-shadow-step-indicator));
15
18
  --rt-stepper-transition-duration: var(--rt-duration-fast);
16
19
 
17
20
  display: flex;
18
21
  flex-direction: column;
19
22
  gap: var(--rt-space-4);
20
23
 
24
+ /* Подпись над полосой, под ней полоса с точками. Подпись в несколько строк
25
+ растит полосу вниз, точки и описание сдвигаются за ней. Отступ точек от краёв
26
+ задаёт приложение: трек, точки и подпись сдвигаются внутрь на одно расстояние. Ореол текущей точки выходит за полосу на 4 px, и родитель,
27
+ который обрезает содержимое, даёт отступ не меньше. */
21
28
  &__rail {
22
- position: relative;
23
- block-size: 39px;
29
+ display: flex;
30
+ flex-direction: column;
31
+ padding-inline: var(--rt-stepper-inset, 0);
24
32
  }
25
33
 
34
+ /* Отрезок подписи (`margin-inline-start` и `inline-size`) задаётся инлайном:
35
+ по центру над точкой, на крайних шагах — вся полоса и прижим к краю. */
26
36
  &__label {
27
- position: absolute;
28
37
  margin: 0;
29
- color: var(--rt-color-stepper-current);
38
+ color: var(--rt-stepper-label-color, var(--rt-stepper-current-color, var(--rt-color-stepper-current)));
30
39
  font-size: var(--rt-text-xs);
31
40
  font-weight: var(--rt-font-weight-regular);
32
- inset-block-start: 0;
33
41
  letter-spacing: var(--rt-letter-spacing-wide);
34
- line-height: var(--rt-leading-none);
35
- transition: left var(--rt-stepper-transition-duration) ease-out;
36
- white-space: nowrap;
42
+ line-height: var(--rt-leading-normal);
43
+ overflow-wrap: anywhere;
44
+ transition:
45
+ margin-inline-start var(--rt-stepper-transition-duration) ease-out,
46
+ inline-size var(--rt-stepper-transition-duration) ease-out;
37
47
 
38
- /* Подпись висит над активной точкой (`left` задаётся инлайном):
39
- на крайних шагах прижимаем к краю точки, иначе центрируем. */
40
48
  &--anchor--start {
41
- transform: translateX(0);
49
+ text-align: start;
42
50
  }
43
51
 
44
52
  &--anchor--center {
45
- transform: translateX(-50%);
53
+ text-align: center;
46
54
  }
47
55
 
48
56
  &--anchor--end {
49
- transform: translateX(-100%);
57
+ text-align: end;
50
58
  }
51
59
  }
52
60
 
61
+ /* Полоса 21 px: 5 px просвета под подписью и 16 px под точки, точки прижаты к низу.
62
+ Подпись в 18 px и полоса дают те же 39 px, что и макет. */
53
63
  &__track-band {
54
- position: absolute;
64
+ position: relative;
55
65
  display: flex;
56
- align-items: center;
57
- block-size: 16px;
58
- inset-block-end: 0;
59
- inset-inline: 0;
66
+ align-items: flex-end;
67
+ block-size: 21px;
68
+ }
69
+
70
+ /* Линия идёт от центра первой точки до центра последней: отступ — половина малой точки.
71
+ Заполнение считается в долях этой линии и кончается в центре текущей точки. */
72
+ &__line {
73
+ position: absolute;
74
+ block-size: 2px;
75
+ inset-block-end: 7px;
76
+ inset-inline: 4px;
60
77
  }
61
78
 
62
79
  &__track,
63
80
  &__progress {
64
81
  position: absolute;
65
82
  border-radius: var(--rt-stepper-radius);
66
- block-size: 2px;
67
- inset-block-start: 50%;
83
+ inset-block: 0;
68
84
  inset-inline-start: 0;
69
- transform: translateY(-50%);
70
85
  }
71
86
 
72
87
  &__track {
73
- background: var(--rt-color-stepper-track);
88
+ background: var(--rt-stepper-track-color, var(--rt-color-stepper-track));
74
89
  inset-inline-end: 0;
75
90
  }
76
91
 
77
92
  &__progress {
78
- background: var(--rt-color-stepper-progress);
93
+ background: var(--rt-stepper-progress-color, var(--rt-color-stepper-progress));
79
94
  transition: width var(--rt-stepper-transition-duration) ease-out;
80
95
  }
81
96
 
@@ -92,7 +107,7 @@
92
107
 
93
108
  &__point {
94
109
  border-radius: var(--rt-stepper-radius);
95
- background: var(--rt-color-stepper-track);
110
+ background: var(--rt-stepper-track-color, var(--rt-color-stepper-track));
96
111
  block-size: 8px;
97
112
  inline-size: 8px;
98
113
  transition:
@@ -101,20 +116,20 @@
101
116
  background var(--rt-stepper-transition-duration) ease-out;
102
117
 
103
118
  &--complete {
104
- background: var(--rt-color-stepper-progress);
119
+ background: var(--rt-stepper-progress-color, var(--rt-color-stepper-progress));
105
120
  }
106
121
 
107
122
  &--current {
108
- background: var(--rt-color-stepper-current);
123
+ background: var(--rt-stepper-current-color, var(--rt-color-stepper-current));
109
124
  block-size: 16px;
110
- box-shadow: var(--rt-stepper-point-shadow);
125
+ box-shadow: var(--rt-stepper-halo);
111
126
  inline-size: 16px;
112
127
  }
113
128
  }
114
129
 
115
130
  &__description {
116
131
  margin: 0;
117
- color: var(--rt-color-text-primary);
132
+ color: var(--rt-stepper-description-color, var(--rt-color-text-primary));
118
133
  font-size: var(--rt-text-xs);
119
134
  letter-spacing: var(--rt-letter-spacing-wide);
120
135
  line-height: var(--rt-leading-snug);
@@ -130,10 +145,9 @@
130
145
  &.rt-stepper--vertical > .rt-stepper {
131
146
  --rt-stepper-mark-size: var(--rt-size-6);
132
147
  --rt-stepper-mark-font-size: var(--rt-text-xs);
133
- --rt-stepper-mark-bg: var(--rt-color-text-muted);
134
- --rt-stepper-mark-color: var(--rt-color-text-inverse);
148
+ --rt-stepper-mark-bg: var(--rt-stepper-mark-neutral-bg, var(--rt-color-text-muted));
149
+ --rt-stepper-mark-color: var(--rt-stepper-mark-neutral-color, var(--rt-color-text-inverse));
135
150
  --rt-stepper-line-width: var(--rt-border-width-thin);
136
- --rt-stepper-line-color: var(--rt-color-border-default);
137
151
  --rt-stepper-item-gap: var(--rt-space-6);
138
152
 
139
153
  padding: 0;
@@ -155,28 +169,33 @@
155
169
  /* Линия от метки до метки следующего шага, с просветом у обеих. */
156
170
  &:not(:last-child):after {
157
171
  position: absolute;
158
- background: var(--rt-stepper-line-color);
172
+ background: var(--rt-stepper-line-color, var(--rt-color-border-default));
159
173
  content: '';
160
174
  inline-size: var(--rt-stepper-line-width);
161
175
  inset-block: calc(var(--rt-stepper-mark-size) + var(--rt-space-1)) var(--rt-space-1);
162
176
  inset-inline-start: calc((var(--rt-stepper-mark-size) - var(--rt-stepper-line-width)) / 2);
163
177
  }
164
178
 
165
- /* Цифра пройденного шага — цвет, обратный тексту: прогресс в тёмной теме светлый. */
166
179
  &--state--complete {
167
- --rt-stepper-mark-bg: var(--rt-color-stepper-progress);
168
- --rt-stepper-mark-color: var(--rt-color-text-inverse);
180
+ --rt-stepper-mark-bg: var(
181
+ --rt-stepper-mark-complete-bg,
182
+ var(--rt-stepper-progress-color, var(--rt-color-stepper-progress))
183
+ );
184
+ --rt-stepper-mark-color: var(--rt-stepper-mark-complete-color, var(--rt-color-text-inverse));
169
185
  }
170
186
 
171
187
  /* Янтарь текущего шага один в обеих темах, и цифра на нём одна — тёмная. */
172
188
  &--state--current {
173
- --rt-stepper-mark-bg: var(--rt-color-stepper-current);
174
- --rt-stepper-mark-color: var(--rt-neutral-950);
189
+ --rt-stepper-mark-bg: var(
190
+ --rt-stepper-mark-current-bg,
191
+ var(--rt-stepper-current-color, var(--rt-color-stepper-current))
192
+ );
193
+ --rt-stepper-mark-color: var(--rt-stepper-mark-current-color, var(--rt-neutral-950));
175
194
  }
176
195
 
177
196
  &--state--upcoming {
178
- --rt-stepper-mark-bg: var(--rt-color-stepper-track);
179
- --rt-stepper-mark-color: var(--rt-color-text-primary);
197
+ --rt-stepper-mark-bg: var(--rt-stepper-mark-upcoming-bg, var(--rt-stepper-track-color, var(--rt-color-stepper-track)));
198
+ --rt-stepper-mark-color: var(--rt-stepper-mark-upcoming-color, var(--rt-color-text-primary));
180
199
  }
181
200
  }
182
201
 
@@ -204,7 +223,7 @@
204
223
  }
205
224
 
206
225
  .rt-stepper__step-label {
207
- color: var(--rt-color-text-primary);
226
+ color: var(--rt-stepper-step-label-color, var(--rt-color-text-primary));
208
227
  font-size: var(--rt-text-sm);
209
228
  line-height: var(--rt-leading-snug);
210
229
  overflow-wrap: anywhere;
@@ -212,7 +231,7 @@
212
231
 
213
232
  .rt-stepper__step-description {
214
233
  margin: 0;
215
- color: var(--rt-color-text-muted);
234
+ color: var(--rt-stepper-step-description-color, var(--rt-color-text-muted));
216
235
  font-size: var(--rt-text-xs);
217
236
  line-height: var(--rt-leading-snug);
218
237
  }
@@ -22,10 +22,14 @@
22
22
  | `headerOnly` | `boolean` | `false` |
23
23
  | `activation` | `'auto' \| 'manual'` | `'auto'` |
24
24
  | `scrollArrows` | `'overlay' \| 'inline'` | `'overlay'` |
25
+ | `arrowLook` | `'block' \| 'compact'` | `'block'` |
25
26
  | `scrollStep` | `'fixed' \| 'page' \| 'third'` | `'fixed'` |
27
+ | `overflow` | `'scroll' \| 'more'` | `'scroll'` |
28
+ | `moreLimit` | `number` | `10` |
26
29
  | `animationDuration` | `string \| number \| null` | `null` |
27
30
  | `preserveContent` | `boolean` | `false` |
28
31
  | `dense` | `boolean` | `false` |
32
+ | `closeOn` | `'all' \| 'selected'` | `'all'` |
29
33
 
30
34
  Выходы: `activeIdChange: IRtTabs.Id`, `tabClose: IRtTabs.Id` — просьба закрыть вкладку с `closable`.
31
35
 
@@ -47,6 +51,8 @@
47
51
  | `glyph` | `string \| null` — значок Material | `null` |
48
52
  | `tooltip` | `string` — подсказка, и у отключённой | `''` |
49
53
  | `closable` | `boolean` | `false` |
54
+ | `pinned` | `boolean` | `false` |
55
+ | `contextMenu` | `TemplateRef<ContextMenuContext> \| null` | `null` |
50
56
  | `closeTooltip` | `string` — подсказка крестика | `''` |
51
57
  | `closeTooltipPlacement` | `IRtTooltip.Placement \| null` | `null` |
52
58
 
@@ -98,7 +104,8 @@
98
104
  кнопку по `data-tabid`. Нажатие в любом месте обёртки выбирает вкладку, крестик своё нажатие
99
105
  дальше не пускает.
100
106
  - Крестик стоит в таб-порядке только у вкладки в фокусе. Его имя — `closeTooltip` или
101
- переведённое `uiClose`. На вкладке закрывает и `Delete`. Фокус после закрытия с клавиатуры
107
+ переведённое `uiClose`. На вкладке закрывает и `Delete`, но только там, где крестик виден: при
108
+ `closeOn="selected"` — на выбранной. Фокус после закрытия с клавиатуры
102
109
  встаёт на активную вкладку.
103
110
  - У крестика своя подсказка `closeTooltip`; пока указатель на нём, подсказка вкладки пуста. Вид
104
111
  крестика — свойства `--rt-tab-item-close-*` на `.rt-tab-item`; размер иконки идёт через шаг `xs`
@@ -118,5 +125,27 @@
118
125
  - `preserveContent`: тело создаётся при первом открытии вкладки и дальше живёт; неактивное скрыто
119
126
  (`hidden`, `inert`, `aria-hidden`, вне таб-порядка) с якорем `tabs-panel-idle`. Уходит при смене
120
127
  живое тело прежней вкладки. Тело вкладки, убранной из набора, уничтожается вместе с ней.
128
+ - `overflow="more"`: полоса не прокручивается, лишние вкладки уходят в меню «Ещё» в конце ряда.
129
+ Вкладка меню остаётся в разметке скрытой: ряд читает её ширину при каждом пересчёте. Выбранная
130
+ вкладка всегда в ряду, из меню она встаёт последней и вытесняет соседа. Подбор ряда решает чистая
131
+ функция `rtTabsFitRow`. Вертикальная полоса режима не знает и остаётся как есть.
132
+ - `moreLimit` (по умолчанию 10): в ряду режима «Ещё» не больше стольких вкладок вместе с
133
+ закреплёнными, даже если места больше. Выбранная из меню или новая встаёт на место последней,
134
+ прежняя последняя уходит в меню. Закреплённые, занявшие весь предел, пропускают выбранную после
135
+ себя: в ряду тогда на одну вкладку больше предела. Крестик строки меню виден под указателем, при
136
+ фокусе и всегда на экране без наведения. Растянутые вкладки (`stretch`) ряд меряет по содержимому,
137
+ поэтому на широкой полосе они возвращаются из меню. Вкладка в фокусе, ушедшая в меню, отдаёт
138
+ таб-порядок выбранной. Отключённая строка меню ничего не выбирает и меню не закрывает. Строка
139
+ вкладки с `titleTemplate` рисует этот шаблон; опустевшее меню закрывается само.
140
+ - Меню «Ещё» и меню по правой кнопке работают с клавиатуры, как `rt-menu`: директива
141
+ `rtTabsMenuKeys` ставит фокус на первый пункт, водит его стрелками, Home и End и возвращает туда,
142
+ откуда меню открыли. Клавиша меню и Shift+F10 открывают меню вкладки под ней.
143
+ - `pinned`: вкладка рисует значок `pin`, если своей иконки нет, стоит первой и в меню не уходит.
144
+ Закрывается она как обычная: крестик задаёт `closable`.
121
145
  - `scrollArrows="inline"`: при переполнении обе стрелки стоят по краям, полоса между ними уже;
122
146
  стрелка, в сторону которой прокручивать некуда, бледная и не нажимается.
147
+ - Стрелка по умолчанию (`arrowLook="block"`) — квадрат во всю высоту полосы, как до вертикальной
148
+ шапки. `arrowLook="compact"` — кнопка 24 (`__arrow`) в своём месте у края (`__rest`); поверх
149
+ вкладок под ней текст гаснет в цвет `--rt-tabs-arrow-fade`. Скругление, фон, цвет и тень
150
+ компактной кнопки задают свойства `--rt-tabs-arrow-*`. Стили стрелок лежат в `rt-tabs-arrows.scss`: основной файл вкладок упирается
151
+ в бюджет стилей компонента приложений.
@@ -0,0 +1,140 @@
1
+ @layer rt-kit.components {
2
+ /* Стрелки прокрутки полосы вкладок. Свой файл: правила вкладок упираются в бюджет стилей
3
+ компонента у приложений, которые собирают кит из исходников.
4
+
5
+ `__rest` — место стрелки у края полосы, `__arrow` — значок в нём. Базовый вид — квадрат во всю
6
+ высоту полосы. Компактный (`arrowLook="compact"`) — кнопка `__arrow`, её скругление, фон и цвет
7
+ потребитель задаёт свойствами `--rt-tabs-arrow-*` на `rt-tabs`. */
8
+ .rt-tabs {
9
+ --rt-tabs-arrow-size: var(--rt-size-6);
10
+ --rt-tabs-arrow-inset: var(--rt-space-1);
11
+ --rt-tabs-arrow-radius: var(--rt-radius-sm);
12
+ --rt-tabs-arrow-shadow: var(--rt-shadow-sm);
13
+ --rt-tabs-arrow-bg: var(--rt-color-bg-surface);
14
+ --rt-tabs-arrow-bg-hover: var(--rt-color-bg-hover);
15
+ --rt-tabs-arrow-color: var(--rt-color-text-muted);
16
+ --rt-tabs-arrow-color-hover: var(--rt-color-text-primary);
17
+ --rt-tabs-arrow-fade: var(--rt-color-bg-surface);
18
+
19
+ &__rest {
20
+ position: absolute;
21
+ z-index: 1;
22
+ top: 0;
23
+ bottom: 0;
24
+ display: flex;
25
+ width: var(--rt-control-height-lg);
26
+ align-items: center;
27
+ justify-content: center;
28
+ background-color: var(--rt-color-bg-surface);
29
+ color: var(--rt-color-text-muted);
30
+ cursor: pointer;
31
+ transition: color var(--rt-tabs-transition-duration) linear;
32
+ visibility: hidden;
33
+
34
+ &:hover {
35
+ color: var(--rt-color-text-primary);
36
+ }
37
+
38
+ &--before {
39
+ left: 0;
40
+ border-right: var(--rt-tabs-border-width) solid var(--rt-color-border-default);
41
+ }
42
+
43
+ &--after {
44
+ right: 0;
45
+ border-left: var(--rt-tabs-border-width) solid var(--rt-color-border-default);
46
+ }
47
+
48
+ &--visible {
49
+ visibility: visible;
50
+ }
51
+ }
52
+
53
+ /* В базовом виде у значка своей коробки нет: он стоит в месте стрелки, как до компактного вида. */
54
+ &__arrow {
55
+ display: contents;
56
+ }
57
+
58
+ /* Стрелки в своих местах: при переполнении обе стоят по краям, полоса между ними уже.
59
+ Стрелка в сторону, куда прокручивать некуда, бледнеет и не нажимается. Черта снизу
60
+ продолжает черту полосы под стрелками. */
61
+ &__tab-list-wrapper--inline {
62
+ align-items: stretch;
63
+
64
+ .rt-tabs__rest {
65
+ position: static;
66
+ display: none;
67
+ flex-shrink: 0;
68
+ border: 0;
69
+ border-bottom: var(--rt-tabs-border-width) solid var(--rt-color-border-default);
70
+ background-color: transparent;
71
+ }
72
+
73
+ &.rt-tabs__tab-list-wrapper--overflowing .rt-tabs__rest {
74
+ display: flex;
75
+ visibility: visible;
76
+ }
77
+
78
+ .rt-tabs__rest--inactive {
79
+ color: var(--rt-color-text-disabled);
80
+ cursor: default;
81
+ pointer-events: none;
82
+ }
83
+ }
84
+
85
+ /* Компактный вид. Поверх вкладок кнопка лежит у края полосы и чуть заходит на крайнюю
86
+ вкладку, а под ней текст вкладки гаснет в цвет полосы — `--rt-tabs-arrow-fade`. */
87
+ &__tab-list-wrapper--compact {
88
+ .rt-tabs__rest {
89
+ width: auto;
90
+ border: 0;
91
+ padding-inline: var(--rt-tabs-arrow-inset);
92
+ }
93
+
94
+ .rt-tabs__rest--before {
95
+ background: linear-gradient(to right, var(--rt-tabs-arrow-fade) 70%, transparent);
96
+ }
97
+
98
+ .rt-tabs__rest--after {
99
+ background: linear-gradient(to left, var(--rt-tabs-arrow-fade) 70%, transparent);
100
+ }
101
+
102
+ .rt-tabs__arrow {
103
+ display: flex;
104
+ width: var(--rt-tabs-arrow-size);
105
+ height: var(--rt-tabs-arrow-size);
106
+ flex: none;
107
+ align-items: center;
108
+ justify-content: center;
109
+ border-radius: var(--rt-tabs-arrow-radius);
110
+ background-color: var(--rt-tabs-arrow-bg);
111
+ box-shadow: var(--rt-tabs-arrow-shadow);
112
+ color: var(--rt-tabs-arrow-color);
113
+ transition:
114
+ color var(--rt-tabs-transition-duration) linear,
115
+ background-color var(--rt-tabs-transition-duration) linear;
116
+ }
117
+
118
+ .rt-tabs__rest:hover .rt-tabs__arrow {
119
+ background-color: var(--rt-tabs-arrow-bg-hover);
120
+ color: var(--rt-tabs-arrow-color-hover);
121
+ }
122
+
123
+ /* Рядом с вкладками тени у кнопки нет: она не лежит поверх. */
124
+ &.rt-tabs__tab-list-wrapper--inline {
125
+ .rt-tabs__rest {
126
+ border-bottom: var(--rt-tabs-border-width) solid var(--rt-tabs-list-border-color);
127
+ background: none;
128
+ }
129
+
130
+ .rt-tabs__arrow {
131
+ box-shadow: none;
132
+ }
133
+
134
+ .rt-tabs__rest--inactive .rt-tabs__arrow {
135
+ color: var(--rt-color-text-disabled);
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }