@rt-tools/ui-kit 0.3.1 → 0.5.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 (42) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/rt-tools-ui-kit.mjs +4394 -3750
  3. package/fesm2022/rt-tools-ui-kit.mjs.map +1 -1
  4. package/package.json +3 -4
  5. package/rt-tools-ui-kit-0.5.0.tgz +0 -0
  6. package/src/lib/ui-kit/action-bar/components/bar/rtui-action-bar.component.scss +14 -0
  7. package/src/lib/ui-kit/action-bar/components/container/rtui-action-bar-container.component.scss +47 -0
  8. package/src/lib/ui-kit/action-bar/stories/component/test-action-bar.component.scss +15 -0
  9. package/src/lib/ui-kit/aside/components/container/aside-container.component.scss +4 -1
  10. package/src/lib/ui-kit/aside/components/error-notification/aside-error-box.component.scss +1 -1
  11. package/src/lib/ui-kit/aside/components/panel/aside-panel.component.scss +24 -0
  12. package/src/lib/ui-kit/buttons/unified-button/rtui-button.component.scss +210 -206
  13. package/src/lib/ui-kit/buttons/unified-button/stories/component/test-button-matrix.component.scss +38 -0
  14. package/src/lib/ui-kit/icon/rtui-icon.component.scss +43 -24
  15. package/src/lib/ui-kit/info-badge/info-badge.component.scss +23 -23
  16. package/src/lib/ui-kit/popover/stories/component/test-popover.component.scss +32 -0
  17. package/src/lib/ui-kit/scrollable/scrollable-container.component.scss +57 -0
  18. package/src/lib/ui-kit/scrollable/stories/component/test-scrollable.component.scss +17 -0
  19. package/src/lib/ui-kit/side-menu/menu/rtui-side-menu.component.scss +185 -4
  20. package/src/lib/ui-kit/side-menu/menu-sub-item/rtui-side-menu-sub-item.component.scss +45 -4
  21. package/src/lib/ui-kit/snack-bar/snack-bar.component.scss +20 -0
  22. package/src/lib/ui-kit/spinner/spinner.component.scss +1 -1
  23. package/src/lib/ui-kit/table/components/pagination-view/rtui-pagination.component.scss +20 -17
  24. package/src/lib/ui-kit/table/components/table-base-cell/table-base-cell.component.scss +21 -0
  25. package/src/lib/ui-kit/table/components/table-container/table-container.component.scss +26 -0
  26. package/src/lib/ui-kit/table/stories/dynamic-list/test-dynamic-list.component.scss +18 -0
  27. package/src/lib/ui-kit/toolbar/stories/component/test-toolbar.component.scss +22 -0
  28. package/src/styles/TOKENS.md +25 -16
  29. package/src/styles/base/_base.scss +6 -3
  30. package/src/styles/base/_tokens.scss +24 -0
  31. package/src/styles/color-scheme.spec.ts +4 -1
  32. package/src/styles/components/_rtui_button.scss +13 -547
  33. package/src/styles/components/button/_base.scss +64 -0
  34. package/src/styles/components/button/_map.scss +184 -0
  35. package/src/styles/components/button/_palettes.scss +218 -0
  36. package/src/styles/components/button/_sizes.scss +29 -0
  37. package/src/styles/components/button/_text.scss +68 -0
  38. package/src/styles/main.scss +0 -1
  39. package/styles/tokens.css +11 -0
  40. package/types/rt-tools-ui-kit.d.ts +614 -361
  41. package/rt-tools-ui-kit-0.3.1.tgz +0 -0
  42. package/src/styles/components/_button.scss +0 -372
@@ -22,33 +22,37 @@
22
22
  text-overflow: ellipsis;
23
23
  white-space: nowrap;
24
24
  }
25
- }
26
25
 
27
- .size-l {
28
- padding: var(--rt-spacing-4) var(--rt-spacing-12);
29
- font-size: var(--rt-font-size-md);
26
+ &--size-l {
27
+ padding: var(--rt-spacing-4) var(--rt-spacing-12);
28
+ font-size: var(--rt-font-size-md);
30
29
 
31
- .mat-icon {
32
- font-size: var(--rt-font-size-xl);
30
+ .mat-icon {
31
+ font-size: var(--rt-font-size-xl);
32
+ }
33
33
  }
34
- }
35
34
 
36
- .size-m {
37
- padding: var(--rt-spacing-4) var(--rt-spacing-12);
38
- font-size: var(--rt-font-size-sm);
35
+ &--size-m {
36
+ padding: var(--rt-spacing-4) var(--rt-spacing-12);
37
+ font-size: var(--rt-font-size-sm);
39
38
 
40
- .mat-icon {
41
- font-size: var(--rt-font-size-md);
39
+ .mat-icon {
40
+ font-size: var(--rt-font-size-md);
41
+ }
42
42
  }
43
- }
44
-
45
- .size-s {
46
- padding: var(--rt-spacing-4) var(--rt-spacing-12);
47
- font-size: var(--rt-font-size-xs);
48
- letter-spacing: 0.025rem;
49
43
 
50
- .mat-icon {
44
+ &--size-s {
45
+ padding: var(--rt-spacing-4) var(--rt-spacing-12);
51
46
  font-size: var(--rt-font-size-xs);
47
+ letter-spacing: 0.025rem;
48
+
49
+ .mat-icon {
50
+ font-size: var(--rt-font-size-xs);
51
+ }
52
+ }
53
+
54
+ &--bold {
55
+ font-weight: var(--rt-font-weight-bold);
52
56
  }
53
57
  }
54
58
 
@@ -56,8 +60,4 @@
56
60
  width: unset;
57
61
  height: unset;
58
62
  }
59
-
60
- .bold {
61
- font-weight: var(--rt-font-weight-bold);
62
- }
63
63
  }
@@ -0,0 +1,32 @@
1
+ :host {
2
+ position: relative;
3
+ display: block;
4
+ min-height: 12rem;
5
+
6
+ .body {
7
+ max-width: 20rem;
8
+ padding: 0.75rem 1rem;
9
+ border: 1px solid var(--rt-border-neutral-default);
10
+ border-radius: 0.5rem;
11
+ background-color: var(--rt-bg-base-base);
12
+
13
+ &__title {
14
+ margin-bottom: 0.5rem;
15
+ font-weight: 500;
16
+ }
17
+
18
+ &__list {
19
+ margin: 0 0 0.5rem;
20
+ padding-left: 1rem;
21
+ }
22
+ }
23
+
24
+ /*
25
+ * Класс от потребителя садится на хост слоя привязкой — правило целит в сам хост, а не
26
+ * внутрь него: инкапсуляция дальше хоста дочернего компонента не пускает.
27
+ */
28
+ rtui-popover-container.popover-accent {
29
+ outline: 2px solid var(--rt-border-accent-primary);
30
+ outline-offset: 0.25rem;
31
+ }
32
+ }
@@ -24,9 +24,22 @@ $scrollable: (
24
24
  padding: 1rem,
25
25
  background-color: var(--rt-bg-base-base),
26
26
  ),
27
+ // Признак непоказанного снизу: полоса растушёвки у нижнего края и значок поверх неё.
28
+ scroll-hint: (
29
+ height: 2.5rem,
30
+ icon-size: 1.25rem,
31
+ // Цвет растушёвки ведёт выбранная цветовая схема: мягкая заливка акцента берётся
32
+ // из рядов роли, которые схема и переопределяет, а светлую и тёмную темы токен
33
+ // разводит сам. Взятый нейтральным фоном, цвет стоял бы одним и тем же во всех
34
+ // схемах. Потребитель, которому нужен свой, переназначает это свойство.
35
+ color: var(--rt-bg-accent-primary-subtle),
36
+ ),
27
37
  );
28
38
 
29
39
  :host {
40
+ // Полоса растушёвки считает своё место от хоста: тело обрезает всё по своему краю, а полоса
41
+ // обязана дойти до содержимого подвала.
42
+ position: relative;
30
43
  display: var(--rt-scrollable-host-display);
31
44
  width: var(--rt-scrollable-host-width);
32
45
  height: var(--rt-scrollable-host-height);
@@ -58,5 +71,49 @@ $scrollable: (
58
71
  padding: var(--rt-scrollable-footer-padding);
59
72
  background-color: var(--rt-scrollable-footer-background-color);
60
73
  }
74
+
75
+ // Полоса стоит поверх стыка списка и подвала и не ловит указатель: под ней живой список,
76
+ // и перехваченное нажатие уводило бы человека мимо пункта. Значок ловит его сам — иначе
77
+ // подсказку не прочитать. Места в колонке полоса не занимает: занятое, оно отодвинуло бы
78
+ // последний пункт от края у каждого потребителя области.
79
+ // Подъём над низом области приходит замером — это высота подвала без верхнего отступа:
80
+ // ровно там начинается его содержимое, и до него полоса и доходит. Оборванная у края
81
+ // списка, она оставляла до разделителя полосу чистого фона.
82
+ &__scroll-hint {
83
+ position: absolute;
84
+ z-index: 1;
85
+ right: 0;
86
+ left: 0;
87
+ display: flex;
88
+ height: var(--rt-scrollable-scroll-hint-height);
89
+ align-items: flex-end;
90
+ justify-content: center;
91
+
92
+ // Растушёвка красится фоном темы, а не уходит в `transparent`: прозрачный — это
93
+ // чёрный с нулевой прозрачностью, и на тёмной теме такой градиент идёт через грязь.
94
+ // Начало берётся тем же цветом с нулевой прозрачностью — переход остаётся чистым в
95
+ // обеих темах, а потребитель, перекрасивший область, получает свой цвет даром.
96
+ background: linear-gradient(
97
+ to bottom,
98
+ rgb(from var(--rt-scrollable-scroll-hint-color) r g b / 0%),
99
+ var(--rt-scrollable-scroll-hint-color)
100
+ );
101
+ pointer-events: none;
102
+ }
103
+
104
+ // Значок сидит на своей подложке: без неё он ложится поверх растворяющегося содержимого
105
+ // и читается как его часть — на кадре его не отличить от полустёртого пункта.
106
+ &__scroll-hint-icon {
107
+ display: flex;
108
+ width: var(--rt-scrollable-scroll-hint-icon-size);
109
+ height: var(--rt-scrollable-scroll-hint-icon-size);
110
+ align-items: center;
111
+ justify-content: center;
112
+ border-radius: var(--rt-radius-full);
113
+ background-color: var(--rt-bg-base-base);
114
+ color: var(--rt-text-base-secondary);
115
+ font-size: var(--rt-scrollable-scroll-hint-icon-size);
116
+ pointer-events: auto;
117
+ }
61
118
  }
62
119
  }
@@ -0,0 +1,17 @@
1
+ :host {
2
+ display: block;
3
+
4
+ .stand {
5
+ height: 24rem;
6
+ border: 1px solid var(--rt-border-neutral-default);
7
+ }
8
+
9
+ .title {
10
+ font-weight: 500;
11
+ }
12
+
13
+ .row {
14
+ padding: 0.5rem 0;
15
+ border-bottom: 1px solid var(--rt-border-neutral-default);
16
+ }
17
+ }
@@ -19,13 +19,43 @@ $side-menu: (
19
19
  ),
20
20
  sub-menu: (
21
21
  width: 15rem,
22
+ // Скругление правых углов панели. Число здесь, а не в теме: тем же числом отступает от
23
+ // угла прокручиваемый список — иначе полоса прокрутки, идущая до самого низа, срезается
24
+ // скруглением, и её нижний конец выглядит обрубленным.
25
+ // Число, а не ступень скругления кита: то имя объявлено обоими китами, и стили, подключённые
26
+ // позже, перебивали бы его молча.
27
+ radius: 1rem,
28
+ // Ширина подменю на время набора запроса: тот же предел, до которого его растягивает тяга.
29
+ held-width: 30rem,
30
+ // Поле поиска ниже полного роста поля формы: в шапке подменю оно стоит рядом с кнопкой
31
+ // значка, и полная высота поднимала бы шапку выше двух строк списка.
32
+ search-height: 2.5rem,
22
33
  ),
23
34
  sub-menu-item: (
24
35
  width: 13.75rem,
25
36
  title-font-size: 0.85rem,
26
37
  ),
38
+ // Полоса прокрутки списков меню. Системная занимает у узкой панели заметную долю ширины и
39
+ // выглядит в каждой системе по-своему; здесь она узкая, с плоской дорожкой и скруглённым
40
+ // ползунком. Значения взяты с образца, показанного владельцем: полоса в два пикселя, дорожка
41
+ // светло-серая, ползунок серый со скруглением малой ступени. Цвета берутся токенами — они же
42
+ // разводят светлую и тёмную тему.
43
+ scrollbar: (
44
+ width: 0.125rem,
45
+ thumb-radius: var(--rt-radius-xs),
46
+ track-color: var(--rt-bg-base-strong),
47
+ thumb-color: var(--rt-bg-base-emphasis-soft),
48
+ ),
27
49
  );
28
50
 
51
+ :host(.rtui-side-menu--pinned) {
52
+ // Полоса значков и закреплённое подменю стоят в ряд. Правило висит на модификаторе хоста, а
53
+ // не на самом хосте: поставленное безусловно, оно сдвинуло экраны каждого потребителя кита,
54
+ // где закрепления нет вовсе.
55
+ display: flex;
56
+ height: 100%;
57
+ }
58
+
29
59
  :host {
30
60
  @each $element, $elements in $side-menu {
31
61
  @each $style-token, $value in $elements {
@@ -36,8 +66,33 @@ $side-menu: (
36
66
  // Hide drawer mask
37
67
  --mat-sidenav-scrim-color: transparent;
38
68
 
69
+ // Ширина, которой панель подменю стоит на экране: заданная оформлением потребителя либо
70
+ // раздвинутая тягой за край. Её знают трое — сама панель, ручка тяги и пункт внутри неё, —
71
+ // и выражение, повторённое у каждого, разъезжается на первой же правке одного из них.
72
+ --rt-side-menu-sub-menu-shown-width: max(var(--rt-side-menu-sub-menu-width), var(--rt-side-menu-sub-menu-dragged-width, 0px));
73
+
74
+ // Полоса прокрутки обоих списков меню — полосы значков и подменю. Оформляется здесь, а не у
75
+ // прокручиваемой области: вид остальных её экранов от этой правки не двигается. Правило
76
+ // пробивает инкапсуляцию, потому что прокручивается внутренний узел области, а полоса
77
+ // принадлежит ему; своего входа под вид полосы область не даёт.
78
+ ::ng-deep .rtui-scrollable__content {
79
+ &::-webkit-scrollbar {
80
+ width: var(--rt-side-menu-scrollbar-width);
81
+ height: var(--rt-side-menu-scrollbar-width);
82
+ }
83
+
84
+ &::-webkit-scrollbar-track {
85
+ background: var(--rt-side-menu-scrollbar-track-color);
86
+ }
87
+
88
+ &::-webkit-scrollbar-thumb {
89
+ border-radius: var(--rt-side-menu-scrollbar-thumb-radius);
90
+ background: var(--rt-side-menu-scrollbar-thumb-color);
91
+ }
92
+ }
93
+
39
94
  .rtui-mobile-side-menu {
40
- width: var(--rt-side-menu-sub-menu-width);
95
+ width: var(--rt-side-menu-sub-menu-shown-width);
41
96
 
42
97
  .rtui-mobile-side-menu-list {
43
98
  display: flex;
@@ -45,7 +100,7 @@ $side-menu: (
45
100
  flex-direction: column;
46
101
 
47
102
  &--scrollable {
48
- width: fit-content;
103
+ min-width: min(var(--rt-side-menu-sub-menu-item-width), 100%);
49
104
  }
50
105
 
51
106
  &__sub {
@@ -144,6 +199,23 @@ $side-menu: (
144
199
  }
145
200
  }
146
201
 
202
+ // Ручка тяги лежит вне ящика подменю и вне его контейнера: панель скруглена по правому краю
203
+ // и режет по этой дуге всё, что внутри неё, а положенное в контейнер рядом с панелью Material
204
+ // уносит в свою область содержимого. Снаружи ручка идёт от края экрана до края, и стоит она
205
+ // там, где кончается панель: отступ полосы значков плюс ширина самой панели.
206
+ .rtui-side-menu-resizer {
207
+ position: fixed;
208
+ z-index: 3;
209
+ left: calc(var(--rt-side-menu-base-width) + var(--rt-side-menu-sub-menu-shown-width) - 0.25rem);
210
+ width: 0.25rem;
211
+ cursor: col-resize;
212
+ inset-block: 0;
213
+
214
+ &:hover {
215
+ background-color: var(--rt-border-neutral-default);
216
+ }
217
+ }
218
+
147
219
  .rtui-sub-side-menu {
148
220
  position: fixed;
149
221
  top: 0;
@@ -160,21 +232,130 @@ $side-menu: (
160
232
  // Component-local elevation token for the slide-out sub-menu drawer.
161
233
  --rt-side-menu-sub-content-shadow: 14px 0 28px rgb(0 0 0 / 25%), 10px 0 10px rgb(0 0 0 / 22%);
162
234
 
163
- width: var(--rt-side-menu-sub-menu-width);
235
+ position: relative;
236
+ width: max(var(--rt-side-menu-sub-menu-width), var(--rt-side-menu-sub-menu-dragged-width, 0px));
237
+ min-width: max(var(--rt-side-menu-sub-menu-width), var(--rt-side-menu-sub-menu-dragged-width, 0px));
164
238
  height: 100%;
239
+ border-radius: 0 var(--rt-side-menu-sub-menu-radius) var(--rt-side-menu-sub-menu-radius) 0;
165
240
  border-left: 1px solid var(--rt-border-neutral-default);
166
241
  box-shadow: var(--rt-side-menu-sub-content-shadow);
167
242
 
243
+ // Список отступает от скруглённого угла на его же радиус. Панель обрезает всё, что в
244
+ // угол заходит, и полоса прокрутки, идущая по правому краю до самого низа, теряла в
245
+ // нём свой конец — выглядело это обрубленной полосой, а не скруглением панели.
246
+ rtui-scrollable {
247
+ // Отступ съедает высоту, а не прибавляет её: у области задан рост во всю панель,
248
+ // и без этого правила она вылезала бы за её нижний край на тот же радиус.
249
+ box-sizing: border-box;
250
+ padding-bottom: var(--rt-side-menu-sub-menu-radius);
251
+ }
252
+
168
253
  &__list {
169
254
  width: 100%;
170
255
  animation: fade-in-animation 0.15s ease-in-out 0.15s forwards;
171
256
  opacity: 0;
172
257
 
258
+ // Список с боковой прокруткой не уже пункта — и не шире панели. Рост по
259
+ // содержимому раздувал бы его вместе с самой длинной подписью, и пункт уезжал
260
+ // бы за край панели вместо многоточия; прокрутка при этом остаётся при деле —
261
+ // она нужна там, где панель уже самого пункта.
173
262
  &--scrollable {
174
- min-width: fit-content;
263
+ min-width: min(var(--rt-side-menu-sub-menu-item-width), 100%);
264
+ }
265
+ }
266
+
267
+ &__empty {
268
+ padding: var(--rt-spacing-16);
269
+ color: var(--rt-text-base-secondary);
270
+ font-size: var(--rt-font-size-xs);
271
+ }
272
+ }
273
+
274
+ // Закреплённая шторка стоит в потоке рядом с полосой значков, а не поверх страницы:
275
+ // тень и перекрытие у постоянно открытой панели читаются как залипший оверлей.
276
+ // Пока человек работает с полем, подменю стоит во всю разрешённую ширину: отобранный
277
+ // список читают, а не разглядывают в узкой полосе. Раздвигает панель нижняя граница, а не
278
+ // ширина: ширину шторки Material держит своим кодом, и ни переход, ни кадры её не двигают.
279
+ &--held .rtui-sub-side-menu-content {
280
+ min-width: var(--rt-side-menu-sub-menu-held-width);
281
+ }
282
+
283
+ &--pinned {
284
+ position: relative;
285
+ left: 0;
286
+ width: var(--rt-side-menu-sub-menu-shown-width);
287
+ height: 100%;
288
+ flex: 0 0 auto;
289
+
290
+ .rtui-sub-side-menu-content {
291
+ box-shadow: none;
292
+
293
+ // Появление списка рассчитано на выдвижение шторки. Закреплённая никуда не
294
+ // выезжает, и её список показан сразу — иначе он живёт под гашеной анимацией
295
+ // и не виден вовсе там, где движение выключено.
296
+ &__list {
297
+ animation: none;
298
+ opacity: 1;
175
299
  }
176
300
  }
177
301
  }
302
+
303
+ .rtui-sub-side-menu-head {
304
+ display: flex;
305
+ align-items: center;
306
+ justify-content: space-between;
307
+ padding: var(--rt-spacing-8);
308
+ gap: var(--rt-spacing-8);
309
+
310
+ // Поле рисует готовое кита. Своего у него остаётся место в ряду, форма пилюли и
311
+ // рост: в шапке подменю поле стоит рядом с кнопкой значка, и полная высота поля
312
+ // формы поднимала бы шапку выше строки списка. Скругление и высоту задают ручки
313
+ // самого поля, а не рамка поверх него.
314
+ &__search {
315
+ min-width: 0;
316
+ flex: 1 1 auto;
317
+
318
+ --mat-form-field-outlined-container-shape: var(--rt-radius-xl);
319
+ --mat-form-field-container-height: var(--rt-side-menu-sub-menu-search-height);
320
+ --mat-form-field-container-vertical-padding: var(--rt-spacing-8);
321
+
322
+ // Готовое поле разводит значок и текст на шестнадцать пикселей — двенадцать
323
+ // справа от значка и четыре у самого префикса. В узкой панели это половина
324
+ // строки запроса, поэтому зазор сведён к одной ступени. Ручки под него у поля
325
+ // формы нет: правится сам отступ значка.
326
+ &::ng-deep .mat-mdc-form-field-icon-prefix > .mat-icon {
327
+ padding: 0 var(--rt-spacing-4) 0 var(--rt-spacing-12);
328
+ }
329
+ }
330
+
331
+ // Кнопку рисует готовое кита; своего у неё остаётся место в ряду.
332
+ &__pin {
333
+ flex: 0 0 auto;
334
+ }
335
+ }
336
+ }
337
+
338
+ // Узкая раскладка: подменю занимает экран целиком, и поле поиска стоит над списком.
339
+ // Рисует его то же готовое кита, что и на широком экране.
340
+ .rtui-side-menu-search {
341
+ width: 100%;
342
+ margin: var(--rt-spacing-8) 0;
343
+
344
+ --mat-form-field-outlined-container-shape: var(--rt-radius-xl);
345
+ --mat-form-field-container-height: var(--rt-side-menu-sub-menu-search-height);
346
+ --mat-form-field-container-vertical-padding: var(--rt-spacing-8);
347
+
348
+ // Зазор между значком и запросом сведён к ступени по той же причине, что и на широком
349
+ // экране: готовое поле разводит их на шестнадцать пикселей.
350
+ &::ng-deep .mat-mdc-form-field-icon-prefix > .mat-icon {
351
+ padding: 0 var(--rt-spacing-4) 0 var(--rt-spacing-12);
352
+ }
353
+ }
354
+
355
+ .rtui-side-menu-empty {
356
+ padding: var(--rt-spacing-16);
357
+ color: var(--rt-text-base-secondary);
358
+ font-size: var(--rt-font-size-xs);
178
359
  }
179
360
  }
180
361
 
@@ -1,4 +1,11 @@
1
1
  :host {
2
+ // Хост пункта — блок шириной своего места. Строкой он не сжимается по ширине вовсе, и
3
+ // ограничение пункта внутри него ничего не решает: список растягивается по хосту, а хост —
4
+ // по самой длинной подписи. Тот же класс висит и на строке списка внутри, поэтому хост
5
+ // адресуется именем элемента.
6
+ display: block;
7
+ max-width: 100%;
8
+
2
9
  &::ng-deep {
3
10
  // Set expansion panel header padding
4
11
  .mat-expansion-indicator {
@@ -17,11 +24,22 @@
17
24
  --mat-expansion-header-expanded-state-height: var(--mat-expansion-header-collapsed-state-height);
18
25
  }
19
26
 
27
+ // Пункт занимает ширину панели и не больше её: панель знает, насколько широка, — её двигают
28
+ // тяга за край и работа с полем поиска, — а подпись, которая в эту ширину не влезла, уходит в
29
+ // многоточие. Своим числом верхний предел быть не может: панель, выросшая вдвое, держала бы
30
+ // подписи обрезанными при пустой полосе справа. Ширины места здесь тоже мало: список с
31
+ // боковой прокруткой сам растёт по содержимому, и пункт, отмеренный от него, раздувается
32
+ // вместе с подписью и уезжает за край панели. Число остаётся нижним пределом там, где
33
+ // прокрутка включена: сжатый пункт прокручивать нечем.
20
34
  .rtui-side-menu-sub-item {
21
- max-width: var(--rt-side-menu-sub-menu-item-width);
35
+ max-width: 100%;
22
36
 
37
+ // Нижний предел ширины действует, пока для него есть место. Вложенный пункт стоит с
38
+ // отступом своего уровня, и предел, взятый числом, выносил бы его правый край за панель
39
+ // ровно на этот отступ: ширину такой пункт оправдывает, а человек видит строку, уходящую
40
+ // под край панели.
23
41
  &--fixed {
24
- min-width: var(--rt-side-menu-sub-menu-item-width);
42
+ min-width: min(var(--rt-side-menu-sub-menu-item-width), 100%);
25
43
  }
26
44
 
27
45
  .rtui-side-menu-sub-item-title {
@@ -36,6 +54,15 @@
36
54
  white-space: nowrap;
37
55
  }
38
56
 
57
+ // Совпавший с запросом кусок подписи. Красится набором токенов, а не умолчанием
58
+ // разметки выделения браузера: то жёлтое и в тёмной теме читается как чужое.
59
+ &__match {
60
+ border-radius: var(--rt-radius-xs);
61
+ background-color: var(--rt-bg-accent-highlight);
62
+ color: var(--rt-text-accent-highlight);
63
+ font-weight: var(--rt-font-weight-semibold);
64
+ }
65
+
39
66
  .rtui-side-menu-sub-item-title-button {
40
67
  display: flex;
41
68
  align-items: center;
@@ -66,12 +93,16 @@
66
93
  border-radius: var(--rt-radius-xl);
67
94
  box-shadow: none;
68
95
 
96
+ // Нижний предел ширины действует, пока для него есть место. Вложенный пункт стоит с
97
+ // отступом своего уровня, и предел, взятый числом, выносил бы его правый край за панель
98
+ // ровно на этот отступ: ширину такой пункт оправдывает, а человек видит строку, уходящую
99
+ // под край панели.
69
100
  &--fixed {
70
- min-width: var(--rt-side-menu-sub-menu-item-width);
101
+ min-width: min(var(--rt-side-menu-sub-menu-item-width), 100%);
71
102
  }
72
103
 
73
104
  .rtui-side-menu-expand-sub-item-header {
74
- max-width: var(--rt-side-menu-sub-menu-item-width);
105
+ max-width: 100%;
75
106
  padding: 0;
76
107
 
77
108
  &--activated {
@@ -87,6 +118,16 @@
87
118
  font-size: var(--rt-side-menu-sub-menu-item-title-font-size);
88
119
  }
89
120
 
121
+ // Отметка совпавшего — та же, что у пункта со ссылкой: заголовок раздела попадает
122
+ // в отобранный список наравне с ним, и разное оформление одного и того же читалось
123
+ // бы как разный смысл.
124
+ &__match {
125
+ border-radius: var(--rt-radius-xs);
126
+ background-color: var(--rt-bg-accent-highlight);
127
+ color: var(--rt-text-accent-highlight);
128
+ font-weight: var(--rt-font-weight-semibold);
129
+ }
130
+
90
131
  &:hover {
91
132
  .rtui-side-menu-expand-sub-item-header__icon {
92
133
  color: var(--mdc-list-list-item-hover-leading-icon-color);
@@ -1,5 +1,19 @@
1
1
  @use '../../../styles/base/mixin' as mixins;
2
2
 
3
+ // Полоса срока: она стягивается слева направо и обрезается тем же путём, каким шла прежде.
4
+ // Обрезка нужна вместе с шириной — у полосы прижаты обе кромки, и одна ширина её не двигает.
5
+ @keyframes rt-snack-bar-progress {
6
+ from {
7
+ width: 100%;
8
+ clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
9
+ }
10
+
11
+ to {
12
+ width: 0;
13
+ clip-path: polygon(0 0, 0 0, 0 100%, 0 100%);
14
+ }
15
+ }
16
+
3
17
  $snack-bar: (
4
18
  content: (
5
19
  gap: 1rem,
@@ -92,9 +106,15 @@ $snack-bar: (
92
106
  left: 0;
93
107
  width: 100%;
94
108
  height: var(--rt-snack-bar-progress-height);
109
+ animation: rt-snack-bar-progress var(--rt-snack-bar-progress-duration) linear forwards;
95
110
  background-color: var(--mat-button-filled-container-color);
96
111
  border-bottom-left-radius: var(--mat-snack-bar-container-shape);
97
112
  border-bottom-right-radius: var(--mat-snack-bar-container-shape);
98
113
  }
99
114
  }
100
115
  }
116
+
117
+ // Под указателем срок стоит: сообщение, которое читают, не уходит само.
118
+ :host:hover .rt-snack-bar__progress {
119
+ animation-play-state: paused;
120
+ }
@@ -7,7 +7,7 @@
7
7
  align-items: center;
8
8
  justify-content: center;
9
9
 
10
- .c-spinner {
10
+ .rtui-spinner {
11
11
  &__container {
12
12
  display: flex;
13
13
  width: 100%;
@@ -10,13 +10,13 @@ $pagination: (
10
10
  font-weight: 400,
11
11
  line-height: 1rem,
12
12
  ),
13
- container-mobile: (
13
+ container-clipped: (
14
14
  gap: 1rem,
15
15
  ),
16
16
  paging: (
17
17
  gap: 0.5rem,
18
18
  ),
19
- paging-mobile: (
19
+ paging-clipped: (
20
20
  margin: 0.5rem 0 0 0,
21
21
  ),
22
22
  paging-item: (
@@ -42,7 +42,7 @@ $pagination: (
42
42
  min-width: 3rem,
43
43
  height: 2rem,
44
44
  ),
45
- size-toggle-selector-mobile: (
45
+ size-toggle-selector-clipped: (
46
46
  margin: 0 0 0.5rem 0,
47
47
  ),
48
48
  );
@@ -69,16 +69,15 @@ $pagination: (
69
69
  gap: var(--rt-table-pagination-container-gap);
70
70
  line-height: var(--rt-table-pagination-container-line-height);
71
71
 
72
- &--clipped {
73
- flex-direction: column;
74
- align-items: flex-start;
75
- justify-content: center;
76
- gap: var(--rt-table-pagination-container-mobile-gap);
77
- }
78
-
79
- &--mobile {
80
- width: 100%;
81
- justify-content: space-between;
72
+ // Перенос в столбец — ответ на нехватку ширины под полный список страниц.
73
+ // На узком экране списка нет вовсе, и строка туда влезает: правило туда не идёт.
74
+ @include mixins.media-breakpoint-up(vars.$device-xs) {
75
+ &--clipped {
76
+ flex-direction: column;
77
+ align-items: flex-start;
78
+ justify-content: center;
79
+ gap: var(--rt-table-pagination-container-clipped-gap);
80
+ }
82
81
  }
83
82
 
84
83
  .paging {
@@ -88,8 +87,10 @@ $pagination: (
88
87
  margin: var(--rt-table-pagination-container-margin);
89
88
  gap: var(--rt-table-pagination-paging-gap);
90
89
 
91
- &--clipped {
92
- margin: var(--rt-table-pagination-paging-mobile-margin);
90
+ @include mixins.media-breakpoint-up(vars.$device-xs) {
91
+ &--clipped {
92
+ margin: var(--rt-table-pagination-paging-clipped-margin);
93
+ }
93
94
  }
94
95
 
95
96
  &__item {
@@ -148,8 +149,10 @@ $pagination: (
148
149
  margin: var(--rt-table-pagination-container-margin);
149
150
  gap: var(--rt-table-pagination-size-toggle-gap);
150
151
 
151
- &--clipped {
152
- margin: var(--rt-table-pagination-size-toggle-selector-mobile-margin);
152
+ @include mixins.media-breakpoint-up(vars.$device-xs) {
153
+ &--clipped {
154
+ margin: var(--rt-table-pagination-size-toggle-selector-clipped-margin);
155
+ }
153
156
  }
154
157
 
155
158
  &__title {