@rt-tools/ui-kit-v2 0.4.0 → 0.6.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 (108) hide show
  1. package/README.md +71 -0
  2. package/fesm2022/rt-tools-ui-kit-v2.mjs +395 -188
  3. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  4. package/package.json +1 -1
  5. package/rt-tools-ui-kit-v2-0.6.0.tgz +0 -0
  6. package/src/lib/components/aside/_rt-aside-overlay.scss +73 -71
  7. package/src/lib/components/aside/footer/rt-aside-footer.component.scss +20 -16
  8. package/src/lib/components/aside/header/rt-aside-header.component.scss +72 -70
  9. package/src/lib/components/aside/rt-aside.component.scss +107 -105
  10. package/src/lib/components/aside/unsaved-dialog/rt-aside-unsaved-dialog.component.scss +33 -31
  11. package/src/lib/components/aside-section/rt-aside-section.component.scss +27 -23
  12. package/src/lib/components/autocomplete/rt-autocomplete.component.scss +124 -118
  13. package/src/lib/components/bar-list/rt-bar-list.component.scss +85 -81
  14. package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +64 -57
  15. package/src/lib/components/button/rt-button.directive.scss +319 -280
  16. package/src/lib/components/calendar/rt-calendar.component.scss +106 -102
  17. package/src/lib/components/card/rt-card.component.scss +53 -45
  18. package/src/lib/components/chat/rt-chat.component.scss +312 -306
  19. package/src/lib/components/checkbox/rt-checkbox.component.scss +61 -54
  20. package/src/lib/components/collapsible-text/rt-collapsible-text.component.scss +36 -34
  21. package/src/lib/components/confirm-popover/rt-confirm-popover.component.scss +36 -30
  22. package/src/lib/components/container/CONTEXT.md +22 -0
  23. package/src/lib/components/container/rt-container.component.scss +91 -87
  24. package/src/lib/components/counter/rt-counter.component.scss +14 -12
  25. package/src/lib/components/counter-row/rt-counter-row.component.scss +31 -27
  26. package/src/lib/components/date-picker/rt-date-picker.component.scss +73 -71
  27. package/src/lib/components/delta-view/rt-delta-view.component.scss +27 -25
  28. package/src/lib/components/detail-list/rt-detail-list.component.scss +8 -6
  29. package/src/lib/components/detail-list/rt-detail-row.component.scss +18 -16
  30. package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +19 -17
  31. package/src/lib/components/dialog/header/rt-dialog-header.component.scss +27 -25
  32. package/src/lib/components/dialog/rt-dialog.component.scss +59 -56
  33. package/src/lib/components/download-link/rt-download-link.component.scss +32 -27
  34. package/src/lib/components/empty-state/rt-empty-state.component.scss +50 -46
  35. package/src/lib/components/field/rt-field.component.scss +63 -61
  36. package/src/lib/components/file-card/rt-file-card.component.scss +84 -78
  37. package/src/lib/components/file-drop/rt-file-drop.component.scss +83 -77
  38. package/src/lib/components/file-input/rt-file-input.component.scss +20 -18
  39. package/src/lib/components/file-list/rt-file-list.component.scss +9 -7
  40. package/src/lib/components/filter-control/rt-filter-control.component.scss +16 -14
  41. package/src/lib/components/header/rt-header.component.scss +61 -55
  42. package/src/lib/components/icon/rt-icon.component.scss +14 -12
  43. package/src/lib/components/icon-button/CONTEXT.md +4 -2
  44. package/src/lib/components/icon-button/rt-icon-button.component.scss +128 -112
  45. package/src/lib/components/info-item/rt-info-item.component.scss +38 -36
  46. package/src/lib/components/input/rt-input.component.scss +102 -98
  47. package/src/lib/components/input-number/rt-input-number.component.scss +84 -82
  48. package/src/lib/components/live-badge/rt-live-badge.component.scss +27 -23
  49. package/src/lib/components/logo/rt-logo.component.scss +54 -52
  50. package/src/lib/components/menu/rt-menu-confirm-dialog.component.scss +30 -28
  51. package/src/lib/components/menu/rt-menu-item.component.scss +47 -42
  52. package/src/lib/components/menu/rt-menu.component.scss +23 -15
  53. package/src/lib/components/message/rt-message.component.scss +53 -49
  54. package/src/lib/components/message-composer/rt-message-composer.component.scss +55 -49
  55. package/src/lib/components/money-list/rt-money-list.component.scss +13 -9
  56. package/src/lib/components/money-list/rt-money-row.component.scss +23 -19
  57. package/src/lib/components/multiselect/rt-multiselect.component.scss +169 -161
  58. package/src/lib/components/night-grid/rt-night-grid.component.scss +47 -42
  59. package/src/lib/components/note/rt-note.component.scss +15 -11
  60. package/src/lib/components/notifications-bell/rt-notifications-bell.component.scss +34 -27
  61. package/src/lib/components/page-header/rt-page-header-mobile.scss +142 -134
  62. package/src/lib/components/page-header/rt-page-header-submenu.scss +130 -123
  63. package/src/lib/components/page-header/rt-page-header.component.scss +221 -210
  64. package/src/lib/components/pagination/rt-pagination.component.scss +88 -81
  65. package/src/lib/components/photo-viewer/rt-photo-viewer.component.scss +109 -105
  66. package/src/lib/components/rich-editor/rt-rich-editor.component.scss +63 -59
  67. package/src/lib/components/section-nav/rt-section-nav.component.scss +53 -47
  68. package/src/lib/components/select/rt-select.component.scss +146 -138
  69. package/src/lib/components/skeleton/rt-skeleton.component.scss +50 -41
  70. package/src/lib/components/skeleton-wrapper/rt-skeleton-wrapper.component.scss +8 -6
  71. package/src/lib/components/spinner/rt-spinner.component.scss +35 -32
  72. package/src/lib/components/split-button/rt-split-button.component.scss +74 -62
  73. package/src/lib/components/stat-tile/rt-stat-tile.component.scss +95 -91
  74. package/src/lib/components/stepper/rt-stepper.component.scss +107 -101
  75. package/src/lib/components/table/copy-cell/rt-copy-cell.component.scss +34 -30
  76. package/src/lib/components/table/rt-table.component.scss +260 -252
  77. package/src/lib/components/table/settings-aside/rt-table-settings-aside.component.scss +7 -5
  78. package/src/lib/components/table/settings-panel/rt-table-settings-panel.component.scss +71 -61
  79. package/src/lib/components/table/sort-header/CONTEXT.md +40 -0
  80. package/src/lib/components/table/sort-header/rt-table-sort-header.component.scss +31 -29
  81. package/src/lib/components/tabs/CONTEXT.md +5 -0
  82. package/src/lib/components/tabs/rt-tabs.component.scss +184 -175
  83. package/src/lib/components/tag/rt-tag.component.scss +97 -92
  84. package/src/lib/components/textarea/rt-textarea.component.scss +62 -60
  85. package/src/lib/components/theme-toggle/rt-theme-toggle.component.scss +7 -5
  86. package/src/lib/components/thread-list/rt-thread-list.component.scss +221 -212
  87. package/src/lib/components/timeline/rt-timeline.component.scss +82 -76
  88. package/src/lib/components/toast/CONTEXT.md +8 -0
  89. package/src/lib/components/toast/rt-toast.component.scss +169 -160
  90. package/src/lib/components/toast/rt-toaster.component.scss +37 -35
  91. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +129 -122
  92. package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +97 -91
  93. package/src/lib/components/toolbar/rt-toolbar.component.scss +56 -54
  94. package/src/lib/components/tooltip/rt-tooltip.component.scss +20 -15
  95. package/src/lib/components/welcome-dialog/rt-welcome-dialog.component.scss +46 -44
  96. package/src/lib/components/workspace/rt-workspace.component.scss +139 -131
  97. package/src/lib/components/workspace-details/rt-workspace-details.component.scss +105 -101
  98. package/src/styles/_index.scss +4 -0
  99. package/src/styles/_layers.scss +22 -0
  100. package/src/styles/_login.scss +87 -85
  101. package/src/styles/_mixins.scss +1 -1
  102. package/src/styles/_primitives.scss +126 -67
  103. package/src/styles/_scrollbar.scss +21 -19
  104. package/src/styles/_semantic.scss +140 -56
  105. package/src/styles/_theme-dark.scss +60 -27
  106. package/styles/tokens.css +628 -408
  107. package/types/rt-tools-ui-kit-v2.d.ts +9 -16
  108. package/rt-tools-ui-kit-v2-0.4.0.tgz +0 -0
@@ -1,66 +1,73 @@
1
- /* rt-checkbox — чекбокс в common/ui. ViewEncapsulation.None.
2
- Хост адресуется по имени элемента, а не по классу блока: класс `.rt-checkbox` висит
3
- и на `<rt-checkbox>`, и на корне шаблона, поэтому правила блока вложены в хост —
4
- так они достаются только корню шаблона. */
1
+ @layer rt-kit.components {
2
+ /* rt-checkbox — чекбокс в common/ui. ViewEncapsulation.None.
3
+ Хост адресуется по имени элемента, а не по классу блока: класс `.rt-checkbox` висит
4
+ и на `<rt-checkbox>`, и на корне шаблона, поэтому правила блока вложены в хост —
5
+ так они достаются только корню шаблона. */
5
6
 
6
- rt-checkbox {
7
- display: inline-block;
8
- }
9
-
10
- rt-checkbox .rt-checkbox {
11
- display: inline-flex;
12
- align-items: center;
13
- padding: 0;
14
- border: none;
15
- background: none;
16
- cursor: pointer;
17
- gap: var(--rt-space-sm);
18
- text-align: start;
19
-
20
- &:focus-visible {
21
- border-radius: var(--rt-radius-sm);
22
- box-shadow: var(--rt-shadow-focus-ring);
23
- outline: 2px solid transparent;
24
- outline-offset: 2px;
7
+ rt-checkbox {
8
+ display: inline-block;
25
9
  }
26
10
 
27
- &--disabled {
28
- cursor: not-allowed;
29
- opacity: 0.5;
30
- }
11
+ rt-checkbox .rt-checkbox {
12
+ --rt-checkbox-focus-radius: var(--rt-radius-sm);
13
+ --rt-checkbox-focus-shadow: var(--rt-shadow-focus-ring);
14
+ --rt-checkbox-box-radius: var(--rt-radius-sm);
15
+ --rt-checkbox-transition-duration: var(--rt-duration-fast);
31
16
 
32
- &__box {
33
17
  display: inline-flex;
34
- width: 18px;
35
- height: 18px;
36
- flex-shrink: 0;
37
18
  align-items: center;
38
- justify-content: center;
39
- border: var(--rt-input-border-width) solid var(--rt-color-border-strong);
40
- border-radius: var(--rt-radius-sm);
41
- background: var(--rt-color-bg-surface);
42
- transition:
43
- background var(--rt-duration-fast) ease,
44
- border-color var(--rt-duration-fast) ease;
45
- }
19
+ padding: 0;
20
+ border: none;
21
+ background: none;
22
+ cursor: pointer;
23
+ gap: var(--rt-space-sm);
24
+ text-align: start;
46
25
 
47
- /* Элемент адресуется классом, а не вторым `&`: родитель здесь составной
48
- (`rt-checkbox .rt-checkbox`), и второй `&` развернулся бы в него целиком —
49
- `… .rt-checkbox--checked rt-checkbox .rt-checkbox__box`, то есть в селектор,
50
- требующий вложенного чекбокса. Заливка отмеченного из-за этого не применялась. */
51
- &--checked .rt-checkbox__box,
52
- &--indeterminate .rt-checkbox__box {
53
- border-color: var(--rt-color-action-primary);
54
- background: var(--rt-color-action-primary);
55
- }
26
+ &:focus-visible {
27
+ border-radius: var(--rt-checkbox-focus-radius);
28
+ box-shadow: var(--rt-checkbox-focus-shadow);
29
+ outline: 2px solid transparent;
30
+ outline-offset: 2px;
31
+ }
32
+
33
+ &--disabled {
34
+ cursor: not-allowed;
35
+ opacity: 0.5;
36
+ }
37
+
38
+ &__box {
39
+ display: inline-flex;
40
+ width: 18px;
41
+ height: 18px;
42
+ flex-shrink: 0;
43
+ align-items: center;
44
+ justify-content: center;
45
+ border: var(--rt-input-border-width) solid var(--rt-color-border-strong);
46
+ border-radius: var(--rt-checkbox-box-radius);
47
+ background: var(--rt-color-bg-surface);
48
+ transition:
49
+ background var(--rt-checkbox-transition-duration) ease,
50
+ border-color var(--rt-checkbox-transition-duration) ease;
51
+ }
52
+
53
+ /* Элемент адресуется классом, а не вторым `&`: родитель здесь составной
54
+ (`rt-checkbox .rt-checkbox`), и второй `&` развернулся бы в него целиком —
55
+ `… .rt-checkbox--checked rt-checkbox .rt-checkbox__box`, то есть в селектор,
56
+ требующий вложенного чекбокса. Заливка отмеченного из-за этого не применялась. */
57
+ &--checked .rt-checkbox__box,
58
+ &--indeterminate .rt-checkbox__box {
59
+ border-color: var(--rt-color-action-primary);
60
+ background: var(--rt-color-action-primary);
61
+ }
56
62
 
57
- &__label {
58
- color: var(--rt-color-text-primary);
59
- font-size: var(--rt-text-sm);
60
- user-select: none;
63
+ &__label {
64
+ color: var(--rt-color-text-primary);
65
+ font-size: var(--rt-text-sm);
66
+ user-select: none;
61
67
 
62
- &:empty {
63
- display: none;
68
+ &:empty {
69
+ display: none;
70
+ }
64
71
  }
65
72
  }
66
73
  }
@@ -1,43 +1,45 @@
1
- .rt-collapsible-text {
2
- display: flex;
3
- flex-direction: column;
4
- gap: var(--rt-space-sm);
1
+ @layer rt-kit.components {
2
+ .rt-collapsible-text {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: var(--rt-space-sm);
5
6
 
6
- &__text {
7
- display: block;
7
+ &__text {
8
+ display: block;
8
9
 
9
- &--clamped {
10
- display: -webkit-box;
11
- overflow: hidden;
12
- -webkit-box-orient: vertical;
10
+ &--clamped {
11
+ display: -webkit-box;
12
+ overflow: hidden;
13
+ -webkit-box-orient: vertical;
14
+ }
13
15
  }
14
- }
15
16
 
16
- &__paragraph {
17
- margin: 0;
18
- color: var(--rt-color-text-primary);
19
- font-family: var(--rt-font-family-sans);
20
- font-size: var(--rt-text-xs);
21
- font-weight: var(--rt-font-weight-regular);
22
- letter-spacing: var(--rt-letter-spacing-wide);
23
- line-height: var(--rt-leading-snug);
17
+ &__paragraph {
18
+ margin: 0;
19
+ color: var(--rt-color-text-primary);
20
+ font-family: var(--rt-font-family-sans);
21
+ font-size: var(--rt-text-xs);
22
+ font-weight: var(--rt-font-weight-regular);
23
+ letter-spacing: var(--rt-letter-spacing-wide);
24
+ line-height: var(--rt-leading-snug);
24
25
 
25
- & + & {
26
- margin-top: var(--rt-space-sm);
26
+ & + & {
27
+ margin-top: var(--rt-space-sm);
28
+ }
27
29
  }
28
- }
29
30
 
30
- &__toggle {
31
- align-self: flex-start;
32
- padding: 0;
33
- border: 0;
34
- background: transparent;
35
- color: var(--rt-color-text-link);
36
- cursor: pointer;
37
- font-family: var(--rt-font-family-sans);
38
- font-size: var(--rt-text-xs);
39
- font-weight: var(--rt-font-weight-medium);
40
- letter-spacing: var(--rt-letter-spacing-wide);
41
- line-height: var(--rt-leading-snug);
31
+ &__toggle {
32
+ align-self: flex-start;
33
+ padding: 0;
34
+ border: 0;
35
+ background: transparent;
36
+ color: var(--rt-color-text-link);
37
+ cursor: pointer;
38
+ font-family: var(--rt-font-family-sans);
39
+ font-size: var(--rt-text-xs);
40
+ font-weight: var(--rt-font-weight-medium);
41
+ letter-spacing: var(--rt-letter-spacing-wide);
42
+ line-height: var(--rt-leading-snug);
43
+ }
42
44
  }
43
45
  }
@@ -1,36 +1,42 @@
1
- /* rt-confirm-popover — панель подтверждения в CDK Overlay. ViewEncapsulation.None.
2
- Селекторы префиксованы `.rt-confirm-popover`. */
1
+ @layer rt-kit.components {
2
+ /* rt-confirm-popover — панель подтверждения в CDK Overlay. ViewEncapsulation.None.
3
+ Селекторы префиксованы `.rt-confirm-popover`. */
3
4
 
4
- .rt-confirm-popover {
5
- display: flex;
6
- width: 280px;
7
- max-width: 280px;
8
- flex-direction: column;
9
- padding: var(--rt-space-md);
10
- border: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
11
- border-radius: var(--rt-radius-md);
12
- background: var(--rt-color-bg-surface);
13
- box-shadow: var(--rt-shadow-lg);
14
- gap: var(--rt-space-sm);
5
+ .rt-confirm-popover {
6
+ --rt-confirm-popover-radius: var(--rt-radius-md);
7
+ --rt-confirm-popover-border-width: var(--rt-border-width-thin);
8
+ --rt-confirm-popover-shadow: var(--rt-shadow-lg);
15
9
 
16
- &__title {
17
- margin: 0;
18
- color: var(--rt-color-text-primary);
19
- font-size: var(--rt-text-sm);
20
- font-weight: var(--rt-font-weight-semibold);
21
- }
22
-
23
- &__message {
24
- margin: 0;
25
- color: var(--rt-color-text-primary);
26
- font-size: var(--rt-text-sm);
27
- line-height: var(--rt-leading-normal);
28
- }
29
-
30
- &__actions {
31
10
  display: flex;
32
- justify-content: space-between;
11
+ width: 280px;
12
+ max-width: 280px;
13
+ flex-direction: column;
14
+ padding: var(--rt-space-md);
15
+ border: var(--rt-confirm-popover-border-width) solid var(--rt-color-border-subtle);
16
+ border-radius: var(--rt-confirm-popover-radius);
17
+ background: var(--rt-color-bg-surface);
18
+ box-shadow: var(--rt-confirm-popover-shadow);
33
19
  gap: var(--rt-space-sm);
34
- margin-block-start: var(--rt-space-xs);
20
+
21
+ &__title {
22
+ margin: 0;
23
+ color: var(--rt-color-text-primary);
24
+ font-size: var(--rt-text-sm);
25
+ font-weight: var(--rt-font-weight-semibold);
26
+ }
27
+
28
+ &__message {
29
+ margin: 0;
30
+ color: var(--rt-color-text-primary);
31
+ font-size: var(--rt-text-sm);
32
+ line-height: var(--rt-leading-normal);
33
+ }
34
+
35
+ &__actions {
36
+ display: flex;
37
+ justify-content: space-between;
38
+ gap: var(--rt-space-sm);
39
+ margin-block-start: var(--rt-space-xs);
40
+ }
35
41
  }
36
42
  }
@@ -36,6 +36,28 @@
36
36
  **Стопка уведомлений встроена в каркас** (`rt-toaster` внизу по центру): заводить её отдельно
37
37
  не нужно.
38
38
 
39
+ ## Уход с route-панели
40
+
41
+ Панель, живущая на своём маршруте (`RtRouteAsideComponent` + `rtAsideUnsavedGuard` на
42
+ ro-маршруте), уступает место навигацией, и о несохранённых правках её спрашивает роутер.
43
+
44
+ **Гард спрашивает панель, учтённую под маршрутом ухода, а не компонент, который ему подставил
45
+ роутер.** Когда ro-маршрут объявлен под уровнем без своего компонента — тем, что держит одни
46
+ `providers` для ветки, — Angular отдаёт детям контекст родителя, и в гард приходит компонент
47
+ первичного аутлета. Учёт ведёт `RtRouteAsideRegistry`: панель встаёт в него, когда занимает
48
+ аутлет, и снимается при уничтожении. Наружу кита учёт не выведен — приложению он не нужен.
49
+
50
+ **Компонент от роутера остаётся запасным путём.** Панель приложения может отвечать о правках,
51
+ не наследуя `RtRouteAsideComponent`: гард спросит её, если под маршрутом никто не учтён и метод
52
+ у компонента есть.
53
+
54
+ **Уход, начатый самой панелью, о правках не спрашивает.** Разрешение выдаётся вплотную к вызову
55
+ роутера, действует на один уход и снимается, если навигация не состоялась. Поэтому закрытие
56
+ после удачной записи не открывает окно про то, что уже сохранено.
57
+
58
+ **Отказом навигации гард не отвечает никогда.** Упавший ответ панели отменяет один уход и
59
+ снимает панель с учёта: приложение не запирается на адресе панели.
60
+
39
61
  ## Рядом
40
62
 
41
63
  - [`rt-toaster`](../toast/CONTEXT.md) — та самая стопка.
@@ -3,109 +3,113 @@
3
3
  взял ни один маршрут, а панель контейнер держит в persistent-режиме. */
4
4
  @use '../aside/rt-aside-overlay';
5
5
 
6
- .rt-container {
7
- display: grid;
8
- min-height: 100%;
9
- flex: 1 1 auto;
10
- background-color: var(--rt-color-bg-page, #f5f5f5);
11
- color: var(--rt-color-text-primary, #222);
12
- grid-template: 'header header' auto 'left-sidenav toolbar' auto 'left-sidenav content' 1fr / auto 1fr;
6
+ @layer rt-kit.components {
7
+ .rt-container {
8
+ --rt-container-border-width: var(--rt-border-width-thin);
13
9
 
14
- &__header {
15
- // Хедер закреплён вверху: при скролле документа (высота контейнера не
16
- // ограничена вьюпортом) grid-строка header уезжала бы вверх. sticky top:0
17
- // держит её на месте. z-index:1 — выше later-DOM контента, но ниже CDK
18
- // overlay асайдов (1000). Работает благодаря `html { overflow-x: clip }`
19
- // (clip, в отличие от hidden, не создаёт scroll-контейнер и не ломает sticky).
20
- position: sticky;
21
- z-index: 1;
22
- top: 0;
23
- display: block;
24
- grid-area: header;
10
+ display: grid;
11
+ min-height: 100%;
12
+ flex: 1 1 auto;
13
+ background-color: var(--rt-color-bg-page);
14
+ color: var(--rt-color-text-primary);
15
+ grid-template: 'header header' auto 'left-sidenav toolbar' auto 'left-sidenav content' 1fr / auto 1fr;
25
16
 
26
- // Обёртка прозрачна: спроецированный хедер даёт собственный фон. Свой
27
- // bg-surface здесь протекал бы за скруглёнными нижними углами хедера —
28
- // в тёмной теме это давало серые «уголки» (surface ≠ фон хедера).
29
- }
30
-
31
- &__left-sidenav {
32
- display: block;
33
- padding: var(--rt-space-md);
34
- border-right: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
35
- background-color: var(--rt-color-bg-surface, #fff);
36
- grid-area: left-sidenav;
37
- }
38
-
39
- &__toolbar {
40
- display: flex;
41
- align-items: center;
42
- padding: var(--rt-space-sm) var(--rt-space-md);
43
- border-bottom: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
44
- background-color: var(--rt-color-bg-surface, #fff);
45
- grid-area: toolbar;
17
+ &__header {
18
+ // Хедер закреплён вверху: при скролле документа (высота контейнера не
19
+ // ограничена вьюпортом) grid-строка header уезжала бы вверх. sticky top:0
20
+ // держит её на месте. z-index:1 — выше later-DOM контента, но ниже CDK
21
+ // overlay асайдов (1000). Работает благодаря `html { overflow-x: clip }`
22
+ // (clip, в отличие от hidden, не создаёт scroll-контейнер и не ломает sticky).
23
+ position: sticky;
24
+ z-index: 1;
25
+ top: 0;
26
+ display: block;
27
+ grid-area: header;
46
28
 
47
- &--slot--left {
48
- justify-content: flex-start;
29
+ // Обёртка прозрачна: спроецированный хедер даёт собственный фон. Свой
30
+ // bg-surface здесь протекал бы за скруглёнными нижними углами хедера —
31
+ // в тёмной теме это давало серые «уголки» (surface ≠ фон хедера).
49
32
  }
50
33
 
51
- &--slot--center {
52
- justify-content: center;
34
+ &__left-sidenav {
35
+ display: block;
36
+ padding: var(--rt-space-md);
37
+ border-right: var(--rt-container-border-width) solid var(--rt-color-border-subtle);
38
+ background-color: var(--rt-color-bg-surface);
39
+ grid-area: left-sidenav;
53
40
  }
54
41
 
55
- &--slot--right {
56
- justify-content: flex-end;
42
+ &__toolbar {
43
+ display: flex;
44
+ align-items: center;
45
+ padding: var(--rt-space-sm) var(--rt-space-md);
46
+ border-bottom: var(--rt-container-border-width) solid var(--rt-color-border-subtle);
47
+ background-color: var(--rt-color-bg-surface);
48
+ grid-area: toolbar;
49
+
50
+ &--slot--left {
51
+ justify-content: flex-start;
52
+ }
53
+
54
+ &--slot--center {
55
+ justify-content: center;
56
+ }
57
+
58
+ &--slot--right {
59
+ justify-content: flex-end;
60
+ }
57
61
  }
58
- }
59
62
 
60
- &__content {
61
- display: flex;
62
- overflow: auto;
63
- min-height: 0;
64
- flex-direction: column;
65
- grid-area: content;
63
+ &__content {
64
+ display: flex;
65
+ overflow: auto;
66
+ min-height: 0;
67
+ flex-direction: column;
68
+ grid-area: content;
69
+ }
66
70
  }
67
- }
68
71
 
69
- /* App-shell раскладка (opt-in `height="viewport"`): контейнер жёстко равен
70
- вьюпорту, документ не скроллится вовсе — скроллятся зоны внутри, каждая сама.
71
- В дефолтном `auto` контейнер не ограничен вьюпортом (растёт под контент), из-за
72
- чего `&__content { overflow: auto }` никогда не переполняется: скролл забирает
73
- документ и утаскивает нав-рейл вместе со списком и лентой чата одним движением.
74
- `min-block-size` сбрасываем — иначе `min-height: 100%` спорит с фиксированной
75
- высотой, если родитель окажется выше вьюпорта. */
76
- .rt-container--viewport {
77
- block-size: 100dvh;
78
- min-block-size: 0;
72
+ /* App-shell раскладка (opt-in `height="viewport"`): контейнер жёстко равен
73
+ вьюпорту, документ не скроллится вовсе — скроллятся зоны внутри, каждая сама.
74
+ В дефолтном `auto` контейнер не ограничен вьюпортом (растёт под контент), из-за
75
+ чего `&__content { overflow: auto }` никогда не переполняется: скролл забирает
76
+ документ и утаскивает нав-рейл вместе со списком и лентой чата одним движением.
77
+ `min-block-size` сбрасываем — иначе `min-height: 100%` спорит с фиксированной
78
+ высотой, если родитель окажется выше вьюпорта. */
79
+ .rt-container--viewport {
80
+ block-size: 100dvh;
81
+ min-block-size: 0;
79
82
 
80
- /* Content перестаёт быть скролл-владельцем: он клипает, а скроллит то, что
81
- внутри (список диалогов, лента чата) — у каждой зоны свой overflow. */
82
- .rt-container__content {
83
- overflow: hidden;
84
- }
83
+ /* Content перестаёт быть скролл-владельцем: он клипает, а скроллит то, что
84
+ внутри (список диалогов, лента чата) — у каждой зоны свой overflow. */
85
+ .rt-container__content {
86
+ overflow: hidden;
87
+ }
85
88
 
86
- /* Нав-рейлу высоты вьюпорта хватает, скролла на нём быть не должно. `auto`,
87
- а не `hidden`: в низком окне пункты меню иначе стали бы недостижимы. */
88
- .rt-container__left-sidenav {
89
- overflow: auto;
89
+ /* Нав-рейлу высоты вьюпорта хватает, скролла на нём быть не должно. `auto`,
90
+ а не `hidden`: в низком окне пункты меню иначе стали бы недостижимы. */
91
+ .rt-container__left-sidenav {
92
+ overflow: auto;
93
+ }
90
94
  }
91
- }
92
95
 
93
- @media (width <= 768px) {
94
- // Opt-in: левый sidenav сворачивается в нижний ряд grid'а (таб-бар).
95
- // Контент занимает всю ширину и скроллится в своём `1fr` над баром —
96
- // бар остаётся видимым без position:fixed и без привязки к его высоте.
97
- .rt-container--mobile-left-bottom {
98
- grid-template:
99
- 'header' auto
100
- 'toolbar' auto
101
- 'content' 1fr
102
- 'left-sidenav' auto
103
- / 1fr;
96
+ @media (width <= 768px) {
97
+ // Opt-in: левый sidenav сворачивается в нижний ряд grid'а (таб-бар).
98
+ // Контент занимает всю ширину и скроллится в своём `1fr` над баром —
99
+ // бар остаётся видимым без position:fixed и без привязки к его высоте.
100
+ .rt-container--mobile-left-bottom {
101
+ grid-template:
102
+ 'header' auto
103
+ 'toolbar' auto
104
+ 'content' 1fr
105
+ 'left-sidenav' auto
106
+ / 1fr;
104
107
 
105
- .rt-container__left-sidenav {
106
- padding: 0;
107
- border-top: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
108
- border-right: none;
108
+ .rt-container__left-sidenav {
109
+ padding: 0;
110
+ border-top: var(--rt-container-border-width) solid var(--rt-color-border-subtle);
111
+ border-right: none;
112
+ }
109
113
  }
110
114
  }
111
115
  }
@@ -1,16 +1,18 @@
1
- /* rt-counter — ViewEncapsulation.None: правила таргетируют BEM-класс блока.
2
- `.rt-counter` — сам хост (шаблон начинается с ng-container, класс ставит host). */
1
+ @layer rt-kit.components {
2
+ /* rt-counter — ViewEncapsulation.None: правила таргетируют BEM-класс блока.
3
+ `.rt-counter` — сам хост (шаблон начинается с ng-container, класс ставит host). */
3
4
 
4
- .rt-counter {
5
- display: inline-flex;
6
- align-items: center;
7
- gap: var(--rt-counter-gap);
5
+ .rt-counter {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ gap: var(--rt-counter-gap);
8
9
 
9
- &__value {
10
- min-width: var(--rt-counter-value-min-width);
11
- color: var(--rt-counter-value-color);
12
- font-size: var(--rt-counter-value-font-size);
13
- font-variant-numeric: tabular-nums;
14
- text-align: center;
10
+ &__value {
11
+ min-width: var(--rt-counter-value-min-width);
12
+ color: var(--rt-counter-value-color);
13
+ font-size: var(--rt-counter-value-font-size);
14
+ font-variant-numeric: tabular-nums;
15
+ text-align: center;
16
+ }
15
17
  }
16
18
  }
@@ -1,34 +1,38 @@
1
- /* rt-counter-row — ViewEncapsulation.None: правила таргетируют BEM-класс блока.
2
- `.rt-counter-row` — сам хост (шаблон начинается с ng-container, класс ставит host). */
1
+ @layer rt-kit.components {
2
+ /* rt-counter-row — ViewEncapsulation.None: правила таргетируют BEM-класс блока.
3
+ `.rt-counter-row` — сам хост (шаблон начинается с ng-container, класс ставит host). */
3
4
 
4
- .rt-counter-row {
5
- display: flex;
6
- align-items: center;
7
- justify-content: space-between;
8
- padding: var(--rt-counter-row-padding-y) 0;
9
- gap: var(--rt-counter-row-gap);
5
+ .rt-counter-row {
6
+ --rt-counter-row-border-width: var(--rt-border-width-thin);
10
7
 
11
- // Линия разделяет соседние строки, а не обводит каждую: рамка на всех дала бы
12
- // лишние границы сверху у первой и снизу у последней
13
- &:not(:first-of-type) {
14
- border-top: var(--rt-border-width-thin) solid var(--rt-counter-row-color-border);
15
- }
16
-
17
- &__text {
18
8
  display: flex;
19
- flex-direction: column;
20
- gap: var(--rt-space-2xs);
21
- text-align: start;
22
- }
9
+ align-items: center;
10
+ justify-content: space-between;
11
+ padding: var(--rt-counter-row-padding-y) 0;
12
+ gap: var(--rt-counter-row-gap);
23
13
 
24
- &__label {
25
- color: var(--rt-counter-row-label-color);
26
- font-size: var(--rt-counter-row-label-font-size);
27
- font-weight: var(--rt-font-weight-medium);
28
- }
14
+ // Линия разделяет соседние строки, а не обводит каждую: рамка на всех дала бы
15
+ // лишние границы сверху у первой и снизу у последней
16
+ &:not(:first-of-type) {
17
+ border-top: var(--rt-counter-row-border-width) solid var(--rt-counter-row-color-border);
18
+ }
19
+
20
+ &__text {
21
+ display: flex;
22
+ flex-direction: column;
23
+ gap: var(--rt-space-2xs);
24
+ text-align: start;
25
+ }
26
+
27
+ &__label {
28
+ color: var(--rt-counter-row-label-color);
29
+ font-size: var(--rt-counter-row-label-font-size);
30
+ font-weight: var(--rt-font-weight-medium);
31
+ }
29
32
 
30
- &__hint {
31
- color: var(--rt-counter-row-hint-color);
32
- font-size: var(--rt-counter-row-hint-font-size);
33
+ &__hint {
34
+ color: var(--rt-counter-row-hint-color);
35
+ font-size: var(--rt-counter-row-hint-font-size);
36
+ }
33
37
  }
34
38
  }