@rt-tools/ui-kit-v2 0.5.0 → 0.7.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 (111) hide show
  1. package/README.md +87 -7
  2. package/fesm2022/rt-tools-ui-kit-v2.mjs +1929 -994
  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.7.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/rt-container.component.scss +91 -87
  23. package/src/lib/components/counter/rt-counter.component.scss +14 -12
  24. package/src/lib/components/counter-row/rt-counter-row.component.scss +31 -27
  25. package/src/lib/components/date-picker/rt-date-picker.component.scss +73 -71
  26. package/src/lib/components/delta-view/rt-delta-view.component.scss +27 -25
  27. package/src/lib/components/detail-list/rt-detail-list.component.scss +8 -6
  28. package/src/lib/components/detail-list/rt-detail-row.component.scss +18 -16
  29. package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +19 -17
  30. package/src/lib/components/dialog/header/rt-dialog-header.component.scss +27 -25
  31. package/src/lib/components/dialog/rt-dialog.component.scss +59 -56
  32. package/src/lib/components/download-link/rt-download-link.component.scss +32 -27
  33. package/src/lib/components/empty-state/rt-empty-state.component.scss +50 -46
  34. package/src/lib/components/field/rt-field.component.scss +63 -61
  35. package/src/lib/components/file-card/rt-file-card.component.scss +84 -78
  36. package/src/lib/components/file-drop/rt-file-drop.component.scss +83 -77
  37. package/src/lib/components/file-input/rt-file-input.component.scss +20 -18
  38. package/src/lib/components/file-list/rt-file-list.component.scss +9 -7
  39. package/src/lib/components/filter-control/rt-filter-control.component.scss +16 -14
  40. package/src/lib/components/header/rt-header.component.scss +61 -55
  41. package/src/lib/components/icon/CONTEXT.md +16 -10
  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/CONTEXT.md +9 -7
  47. package/src/lib/components/input/rt-input.component.scss +102 -98
  48. package/src/lib/components/input-number/rt-input-number.component.scss +84 -82
  49. package/src/lib/components/live-badge/rt-live-badge.component.scss +27 -23
  50. package/src/lib/components/logo/rt-logo.component.scss +54 -52
  51. package/src/lib/components/markdown-text/CONTEXT.md +40 -0
  52. package/src/lib/components/markdown-text/rt-markdown-text.component.scss +130 -0
  53. package/src/lib/components/menu/rt-menu-confirm-dialog.component.scss +30 -28
  54. package/src/lib/components/menu/rt-menu-item.component.scss +47 -42
  55. package/src/lib/components/menu/rt-menu.component.scss +23 -15
  56. package/src/lib/components/message/rt-message.component.scss +53 -49
  57. package/src/lib/components/message-composer/CONTEXT.md +1 -1
  58. package/src/lib/components/message-composer/rt-message-composer.component.scss +55 -49
  59. package/src/lib/components/money-list/rt-money-list.component.scss +13 -9
  60. package/src/lib/components/money-list/rt-money-row.component.scss +23 -19
  61. package/src/lib/components/multiselect/rt-multiselect.component.scss +169 -161
  62. package/src/lib/components/night-grid/rt-night-grid.component.scss +47 -42
  63. package/src/lib/components/note/rt-note.component.scss +15 -11
  64. package/src/lib/components/notifications-bell/rt-notifications-bell.component.scss +34 -27
  65. package/src/lib/components/page-header/rt-page-header-mobile.scss +142 -134
  66. package/src/lib/components/page-header/rt-page-header-submenu.scss +130 -123
  67. package/src/lib/components/page-header/rt-page-header.component.scss +221 -210
  68. package/src/lib/components/pagination/rt-pagination.component.scss +88 -81
  69. package/src/lib/components/photo-viewer/rt-photo-viewer.component.scss +109 -105
  70. package/src/lib/components/rich-editor/CONTEXT.md +1 -1
  71. package/src/lib/components/rich-editor/rt-rich-editor.component.scss +63 -59
  72. package/src/lib/components/section-nav/rt-section-nav.component.scss +53 -47
  73. package/src/lib/components/select/rt-select.component.scss +146 -138
  74. package/src/lib/components/skeleton/rt-skeleton.component.scss +50 -41
  75. package/src/lib/components/skeleton-wrapper/rt-skeleton-wrapper.component.scss +8 -6
  76. package/src/lib/components/spinner/rt-spinner.component.scss +35 -32
  77. package/src/lib/components/split-button/rt-split-button.component.scss +74 -62
  78. package/src/lib/components/stat-tile/rt-stat-tile.component.scss +95 -91
  79. package/src/lib/components/stepper/rt-stepper.component.scss +107 -101
  80. package/src/lib/components/table/copy-cell/rt-copy-cell.component.scss +39 -30
  81. package/src/lib/components/table/rt-table.component.scss +260 -252
  82. package/src/lib/components/table/settings-aside/rt-table-settings-aside.component.scss +7 -5
  83. package/src/lib/components/table/settings-panel/rt-table-settings-panel.component.scss +71 -61
  84. package/src/lib/components/table/sort-header/rt-table-sort-header.component.scss +31 -29
  85. package/src/lib/components/tabs/rt-tabs.component.scss +184 -175
  86. package/src/lib/components/tag/rt-tag.component.scss +97 -92
  87. package/src/lib/components/textarea/rt-textarea.component.scss +62 -60
  88. package/src/lib/components/theme-toggle/rt-theme-toggle.component.scss +7 -5
  89. package/src/lib/components/thread-list/rt-thread-list.component.scss +221 -212
  90. package/src/lib/components/timeline/rt-timeline.component.scss +82 -76
  91. package/src/lib/components/toast/rt-toast.component.scss +169 -160
  92. package/src/lib/components/toast/rt-toaster.component.scss +37 -35
  93. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +129 -122
  94. package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +97 -91
  95. package/src/lib/components/toolbar/rt-toolbar.component.scss +63 -54
  96. package/src/lib/components/tooltip/rt-tooltip.component.scss +24 -15
  97. package/src/lib/components/welcome-dialog/rt-welcome-dialog.component.scss +46 -44
  98. package/src/lib/components/workspace/rt-workspace.component.scss +139 -131
  99. package/src/lib/components/workspace-details/rt-workspace-details.component.scss +105 -101
  100. package/src/styles/_index.scss +11 -0
  101. package/src/styles/_layers.scss +22 -0
  102. package/src/styles/_login.scss +87 -85
  103. package/src/styles/_mixins.scss +1 -1
  104. package/src/styles/_primitives.scss +138 -66
  105. package/src/styles/_scrollbar.scss +21 -19
  106. package/src/styles/_semantic.scss +155 -62
  107. package/src/styles/_theme-dark-rules.scss +23 -0
  108. package/src/styles/_theme-dark.scss +61 -42
  109. package/styles/tokens.css +754 -418
  110. package/types/rt-tools-ui-kit-v2.d.ts +292 -103
  111. package/rt-tools-ui-kit-v2-0.5.0.tgz +0 -0
@@ -1,40 +1,49 @@
1
- /* rt-copy-cell — ячейка с копированием в буфер.
2
- ViewEncapsulation.None: классы глобальны, токены --rt-* наследуются.
3
- Кнопка скрыта по умолчанию и проявляется при наведении/фокусе — чтобы не
4
- зашумлять плотные таблицы. */
1
+ @layer rt-kit.components {
2
+ /* rt-copy-cell — ячейка с копированием в буфер.
3
+ ViewEncapsulation.None: классы глобальны, токены --rt-* наследуются.
4
+ Кнопка скрыта по умолчанию и проявляется при наведении/фокусе — чтобы не
5
+ зашумлять плотные таблицы. */
5
6
 
6
- .rt-copy-cell {
7
- display: inline-flex;
8
- min-width: 0;
9
- align-items: center;
10
- gap: var(--rt-space-xs);
7
+ .rt-copy-cell {
8
+ --rt-copy-cell-transition-duration: var(--rt-duration-fast);
11
9
 
12
- &__content {
10
+ display: inline-flex;
13
11
  min-width: 0;
14
- }
12
+ align-items: center;
13
+ gap: var(--rt-space-xs);
15
14
 
16
- &__button {
17
- flex: 0 0 auto;
18
- opacity: 0;
19
- transition: opacity var(--rt-duration-fast) ease;
20
- }
15
+ /* Значение длиннее места обрезается многоточием, а не наезжает на кнопку:
16
+ min-width: 0 разрешает flex-элементу сжаться, но сам по себе ничего не прячет. */
17
+ &__content {
18
+ overflow: hidden;
19
+ min-width: 0;
20
+ text-overflow: ellipsis;
21
+ white-space: nowrap;
22
+ }
21
23
 
22
- /* Reveal при наведении/клавиатурном фокусе внутри самой ячейки — работает
23
- и вне таблицы (карточки, асайды). */
24
- &:hover &__button,
25
- &:focus-within &__button {
26
- opacity: 1;
24
+ &__button {
25
+ flex: 0 0 auto;
26
+ opacity: 0;
27
+ transition: opacity var(--rt-copy-cell-transition-duration) ease;
28
+ }
29
+
30
+ /* Reveal при наведении/клавиатурном фокусе внутри самой ячейки — работает
31
+ и вне таблицы (карточки, асайды). */
32
+ &:hover &__button,
33
+ &:focus-within &__button {
34
+ opacity: 1;
35
+ }
36
+
37
+ /* revealOnHover=false — кнопка всегда видима (модалки/карточки без hover-строки). */
38
+ &--static &__button {
39
+ opacity: 1;
40
+ }
27
41
  }
28
42
 
29
- /* revealOnHover=false — кнопка всегда видима (модалки/карточки без hover-строки). */
30
- &--static &__button {
43
+ /* Reveal при наведении/фокусе на всю строку rt-table — привычное поведение
44
+ таблиц: кнопка появляется, как только курсор над строкой. */
45
+ .rt-table tbody tr:hover .rt-copy-cell__button,
46
+ .rt-table tbody tr:focus-within .rt-copy-cell__button {
31
47
  opacity: 1;
32
48
  }
33
49
  }
34
-
35
- /* Reveal при наведении/фокусе на всю строку rt-table — привычное поведение
36
- таблиц: кнопка появляется, как только курсор над строкой. */
37
- .rt-table tbody tr:hover .rt-copy-cell__button,
38
- .rt-table tbody tr:focus-within .rt-copy-cell__button {
39
- opacity: 1;
40
- }
@@ -1,312 +1,320 @@
1
- /* rt-table — common/ui таблица поверх cdk-table. ViewEncapsulation.None:
2
- классы доступны без scope-attrs, токены --rt-* наследуются. */
3
-
4
- .rt-table {
5
- position: relative;
6
- display: table;
7
- width: 100%;
8
- background: var(--rt-color-bg-surface);
9
- border-collapse: collapse;
10
- color: var(--rt-color-text-primary);
11
-
12
- .cdk-header-cell,
13
- .cdk-cell,
14
- &__skeleton-cell {
15
- position: relative;
16
- height: 50px;
17
- padding: var(--rt-space-2) var(--rt-space-5);
18
- border-bottom: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
19
-
20
- /* Single-owner границы: каждую линию сетки рисует РОВНО одна ячейка —
21
- вертикаль только левой гранью, горизонталь только нижней. Внутренние
22
- линии не удваиваются, правого периметра нет вовсе, а левый гасим у
23
- первой колонки ниже. Таблица упирается в края контейнера — боковые
24
- рамки не нужны. */
25
- border-left: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
26
- font-size: var(--rt-text-sm);
27
- font-weight: var(--rt-font-weight-medium);
28
- text-align: start;
29
- vertical-align: middle;
30
-
31
- &[data-align='right'] {
32
- text-align: right;
1
+ @layer rt-kit.components {
2
+ /* rt-table — common/ui таблица поверх cdk-table. ViewEncapsulation.None:
3
+ классы доступны без scope-attrs, токены --rt-* наследуются. */
33
4
 
34
- input {
35
- text-align: right;
36
- }
37
- }
38
- }
5
+ .rt-table {
6
+ --rt-table-border-width: var(--rt-border-width-thin);
7
+ --rt-table-card-radius: var(--rt-radius-md);
39
8
 
40
- /* Левый периметр не рисуем — первая колонка без левой грани. */
41
- .cdk-header-cell:first-child,
42
- .cdk-cell:first-child,
43
- &__skeleton-cell:first-child {
44
- border-left: none;
45
- }
46
-
47
- .cdk-header-cell {
48
- /* Верхняя грань таблицы — только у шапки (низ даёт border-bottom строк). */
49
- border-top: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
9
+ position: relative;
10
+ display: table;
11
+ width: 100%;
50
12
  background: var(--rt-color-bg-surface);
51
- color: var(--rt-color-text-muted);
52
- }
53
-
54
- .cdk-cell {
13
+ border-collapse: collapse;
55
14
  color: var(--rt-color-text-primary);
56
- overflow-wrap: anywhere;
57
- }
58
15
 
59
- /* «…»-действия строки ([showRowActions]) — НЕ отдельная видимая колонка.
60
- Ячейка нулевой ширины, sticky к правому краю scroll-контейнера
61
- (rtElem="table-scroll", overflow-x), без border/padding. Плавающая кнопка
62
- не занимает места в раскладке — поэтому горизонтальный скролл не уводит её
63
- из вьюпорта. Компаунд с .cdk-cell держит специфичность выше базовой ячейки. */
64
- &__actions-header.cdk-header-cell {
65
- width: 0;
66
- padding: 0;
67
- border: none;
68
- }
16
+ .cdk-header-cell,
17
+ .cdk-cell,
18
+ &__skeleton-cell {
19
+ position: relative;
20
+ height: 50px;
21
+ padding: var(--rt-space-2) var(--rt-space-5);
22
+ border-bottom: var(--rt-table-border-width) solid var(--rt-color-border-subtle);
23
+
24
+ /* Single-owner границы: каждую линию сетки рисует РОВНО одна ячейка —
25
+ вертикаль только левой гранью, горизонталь только нижней. Внутренние
26
+ линии не удваиваются, правого периметра нет вовсе, а левый гасим у
27
+ первой колонки ниже. Таблица упирается в края контейнера — боковые
28
+ рамки не нужны. */
29
+ border-left: var(--rt-table-border-width) solid var(--rt-color-border-subtle);
30
+ font-size: var(--rt-text-sm);
31
+ font-weight: var(--rt-font-weight-medium);
32
+ text-align: start;
33
+ vertical-align: middle;
34
+
35
+ &[data-align='right'] {
36
+ text-align: right;
69
37
 
70
- &__actions-cell.cdk-cell {
71
- position: sticky;
72
- z-index: 1;
73
- right: 0;
74
- width: 0;
75
- padding: 0;
76
- border: none;
77
- background: transparent;
78
- }
38
+ input {
39
+ text-align: right;
40
+ }
41
+ }
42
+ }
79
43
 
80
- &__actions-float {
81
- position: absolute;
82
- display: flex;
83
- height: 100%;
84
- align-items: center;
85
- padding: 0 var(--rt-space-2) 0 var(--rt-space-8);
44
+ /* Левый периметр не рисуем — первая колонка без левой грани. */
45
+ .cdk-header-cell:first-child,
46
+ .cdk-cell:first-child,
47
+ &__skeleton-cell:first-child {
48
+ border-left: none;
49
+ }
86
50
 
87
- /* Содержимое последней ячейки «утопает» под кнопкой; кнопка видна только
88
- на hover строки, поэтому фон градиента — hover-цвет строки. */
89
- background: linear-gradient(to right, transparent 0%, var(--rt-color-bg-hover) 45%);
90
- inset: 0 0 0 auto;
51
+ .cdk-header-cell {
52
+ /* Верхняя грань таблицы — только у шапки (низ даёт border-bottom строк). */
53
+ border-top: var(--rt-table-border-width) solid var(--rt-color-border-subtle);
54
+ background: var(--rt-color-bg-surface);
55
+ color: var(--rt-color-text-muted);
56
+ }
91
57
 
92
- /* Прозрачная зона пропускает клики на строку; интерактивна только кнопка. */
93
- pointer-events: none;
58
+ .cdk-cell {
59
+ color: var(--rt-color-text-primary);
60
+ overflow-wrap: anywhere;
61
+ }
94
62
 
95
- .rt-menu {
96
- pointer-events: auto;
63
+ /* «…»-действия строки ([showRowActions]) — НЕ отдельная видимая колонка.
64
+ Ячейка нулевой ширины, sticky к правому краю scroll-контейнера
65
+ (rtElem="table-scroll", overflow-x), без border/padding. Плавающая кнопка
66
+ не занимает места в раскладке — поэтому горизонтальный скролл не уводит её
67
+ из вьюпорта. Компаунд с .cdk-cell держит специфичность выше базовой ячейки. */
68
+ &__actions-header.cdk-header-cell {
69
+ width: 0;
70
+ padding: 0;
71
+ border: none;
97
72
  }
98
- }
99
73
 
100
- /* Hover-reveal: по умолчанию кнопка скрыта, появляется при наведении/фокусе
101
- строки или пока её меню открыто (:has(.rt-menu--open) — переживает уход
102
- hover'а на overlay-панель). Скрытие — только на hover-устройствах: на тач
103
- (hover: none) правило не применяется и кнопка видна всегда. */
104
- @media (hover: hover) {
105
74
  &__actions-cell.cdk-cell {
106
- visibility: hidden;
75
+ position: sticky;
76
+ z-index: 1;
77
+ right: 0;
78
+ width: 0;
79
+ padding: 0;
80
+ border: none;
81
+ background: transparent;
107
82
  }
108
83
 
109
- .cdk-row:hover &__actions-cell.cdk-cell,
110
- .cdk-row:focus-within &__actions-cell.cdk-cell,
111
- &__actions-cell.cdk-cell:has(.rt-menu--open) {
112
- visibility: visible;
113
- }
114
- }
84
+ &__actions-float {
85
+ position: absolute;
86
+ display: flex;
87
+ height: 100%;
88
+ align-items: center;
89
+ padding: 0 var(--rt-space-2) 0 var(--rt-space-8);
90
+
91
+ /* Содержимое последней ячейки «утопает» под кнопкой; кнопка видна только
92
+ на hover строки, поэтому фон градиента — hover-цвет строки. */
93
+ background: linear-gradient(to right, transparent 0%, var(--rt-color-bg-hover) 45%);
94
+ inset: 0 0 0 auto;
95
+
96
+ /* Прозрачная зона пропускает клики на строку; интерактивна только кнопка. */
97
+ pointer-events: none;
115
98
 
116
- .cdk-row {
117
- &:hover {
118
- background: var(--rt-color-bg-hover);
99
+ .rt-menu {
100
+ pointer-events: auto;
101
+ }
119
102
  }
120
103
 
121
- /* Опт-ин подсветка проблемной строки (просрочка и т.п.): потребитель
122
- вешает класс `rt-table__row--danger` на строку. Составной селектор с
123
- `.cdk-row` нужен, чтобы danger-фон держался и при :hover. */
124
- &.rt-table__row--danger {
125
- background: var(--rt-color-state-danger-bg);
104
+ /* Hover-reveal: по умолчанию кнопка скрыта, появляется при наведении/фокусе
105
+ строки или пока её меню открыто (:has(.rt-menu--open) — переживает уход
106
+ hover'а на overlay-панель). Скрытие — только на hover-устройствах: на тач
107
+ (hover: none) правило не применяется и кнопка видна всегда. */
108
+ @media (hover: hover) {
109
+ &__actions-cell.cdk-cell {
110
+ visibility: hidden;
111
+ }
126
112
 
127
- &:hover {
128
- background: var(--rt-color-state-danger-bg);
113
+ .cdk-row:hover &__actions-cell.cdk-cell,
114
+ .cdk-row:focus-within &__actions-cell.cdk-cell,
115
+ &__actions-cell.cdk-cell:has(.rt-menu--open) {
116
+ visibility: visible;
129
117
  }
130
118
  }
131
- }
132
119
 
133
- /* Строки-ссылки: курсор + focus-ring. Активацию (click/Enter/Space) и
134
- table-семантику обеспечивает директива rtTableRow на самой строке. */
135
- &--clickable {
136
120
  .cdk-row {
137
- cursor: pointer;
121
+ &:hover {
122
+ background: var(--rt-color-bg-hover);
123
+ }
124
+
125
+ /* Опт-ин подсветка проблемной строки (просрочка и т.п.): потребитель
126
+ вешает класс `rt-table__row--danger` на строку. Составной селектор с
127
+ `.cdk-row` нужен, чтобы danger-фон держался и при :hover. */
128
+ &.rt-table__row--danger {
129
+ background: var(--rt-color-state-danger-bg);
138
130
 
139
- &:focus-visible {
140
- outline: 2px solid var(--rt-color-action-primary);
141
- outline-offset: -2px;
131
+ &:hover {
132
+ background: var(--rt-color-state-danger-bg);
133
+ }
142
134
  }
143
135
  }
144
- }
145
136
 
146
- a {
147
- text-decoration: none;
148
- }
137
+ /* Строки-ссылки: курсор + focus-ring. Активацию (click/Enter/Space) и
138
+ table-семантику обеспечивает директива rtTableRow на самой строке. */
139
+ &--clickable {
140
+ .cdk-row {
141
+ cursor: pointer;
149
142
 
150
- &--density--compact {
151
- .cdk-header-cell,
152
- .cdk-cell,
153
- .rt-table__skeleton-cell {
154
- height: 36px;
155
- padding: var(--rt-space-xs) var(--rt-space-sm);
143
+ &:focus-visible {
144
+ outline: 2px solid var(--rt-color-action-primary);
145
+ outline-offset: -2px;
146
+ }
147
+ }
156
148
  }
157
- }
158
149
 
159
- &__skeleton-bar {
160
- display: block;
161
- width: 80%;
162
- height: 14px;
163
- }
164
-
165
- &__empty-row {
166
- display: table-row;
167
- }
150
+ a {
151
+ text-decoration: none;
152
+ }
168
153
 
169
- &__empty {
170
- padding: var(--rt-space-6) var(--rt-space-5);
154
+ &--density--compact {
155
+ .cdk-header-cell,
156
+ .cdk-cell,
157
+ .rt-table__skeleton-cell {
158
+ height: 36px;
159
+ padding: var(--rt-space-xs) var(--rt-space-sm);
160
+ }
161
+ }
171
162
 
172
- /* Только нижняя грань — как у строк: верхнюю даёт border-bottom шапки
173
- (иначе двойная линия), боковые не рисуем (нет периметра). */
174
- border-bottom: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
175
- background: var(--rt-color-bg-surface);
176
- color: var(--rt-color-text-muted);
177
- text-align: center;
178
- }
163
+ &__skeleton-bar {
164
+ display: block;
165
+ width: 80%;
166
+ height: 14px;
167
+ }
179
168
 
180
- &__empty-message {
181
- margin: 0;
182
- font-size: var(--rt-text-sm);
183
- }
169
+ &__empty-row {
170
+ display: table-row;
171
+ }
184
172
 
185
- &__overlay {
186
- position: absolute;
187
- z-index: 1;
188
- display: grid;
189
- min-height: 100%;
190
- inset: 0;
191
- place-items: center;
192
- pointer-events: none;
193
- }
173
+ &__empty {
174
+ padding: var(--rt-space-6) var(--rt-space-5);
194
175
 
195
- &__overlay-backdrop {
196
- position: absolute;
197
- background: var(--rt-color-bg-surface);
198
- inset: 0;
199
- opacity: 0.72;
200
- }
176
+ /* Только нижняя грань — как у строк: верхнюю даёт border-bottom шапки
177
+ (иначе двойная линия), боковые не рисуем (нет периметра). */
178
+ border-bottom: var(--rt-table-border-width) solid var(--rt-color-border-subtle);
179
+ background: var(--rt-color-bg-surface);
180
+ color: var(--rt-color-text-muted);
181
+ text-align: center;
182
+ }
201
183
 
202
- &__overlay-spinner {
203
- position: sticky;
204
- z-index: 1;
205
- top: 50%;
206
- display: flex;
207
- align-items: center;
208
- justify-content: center;
209
- transform: translateY(-50%);
210
- }
184
+ &__empty-message {
185
+ margin: 0;
186
+ font-size: var(--rt-text-sm);
187
+ }
211
188
 
212
- /* Мобильный card-режим (≤1080px, host-модификатор --cards): хост перестаёт
213
- быть таблицей, CDK-строки скрываются, вместо них — вертикальный список
214
- карточек. Карточки в DOM только при narrow (гейт @if в шаблоне). */
215
- &__cards {
216
- display: none;
217
- }
189
+ &__overlay {
190
+ position: absolute;
191
+ z-index: 1;
192
+ display: grid;
193
+ min-height: 100%;
194
+ inset: 0;
195
+ place-items: center;
196
+ pointer-events: none;
197
+ }
218
198
 
219
- &--cards {
220
- display: block;
199
+ &__overlay-backdrop {
200
+ position: absolute;
201
+ background: var(--rt-color-bg-surface);
202
+ inset: 0;
203
+ opacity: 0.72;
204
+ }
221
205
 
222
- /* Потребители часто форсят ширину таблицы под горизонтальный скролл
223
- (`min-width: max-content` на элементе таблицы). В card-режиме это увело
224
- бы карточки за вьюпорт — перебиваем `!important`, т.к. consumer-правило
225
- (Emulated, с [ngcontent]-атрибутом) выигрывает по специфичности. */
226
- min-width: 0 !important;
227
- max-width: 100%;
206
+ &__overlay-spinner {
207
+ position: sticky;
208
+ z-index: 1;
209
+ top: 50%;
210
+ display: flex;
211
+ align-items: center;
212
+ justify-content: center;
213
+ transform: translateY(-50%);
214
+ }
228
215
 
229
- .cdk-header-row,
230
- .cdk-row,
231
- .rt-table__skeleton-row,
232
- .rt-table__empty-row {
216
+ /* Мобильный card-режим (≤1080px, host-модификатор --cards): хост перестаёт
217
+ быть таблицей, CDK-строки скрываются, вместо них — вертикальный список
218
+ карточек. Карточки в DOM только при narrow (гейт @if в шаблоне). */
219
+ &__cards {
233
220
  display: none;
234
221
  }
235
222
 
236
- .rt-table__cards {
223
+ &--cards {
224
+ display: block;
225
+
226
+ /* Потребители часто форсят ширину таблицы под горизонтальный скролл
227
+ (`min-width: max-content` на элементе таблицы). В карточном виде это уводит
228
+ карточки за вьюпорт, и раньше кит настаивал на своём восклицательным знаком.
229
+ Теперь последнее слово за приложением: слой каскада отдаёт победу его
230
+ правилу, и правило кита, спорящее с ним важностью, этому противоречит.
231
+ Приложению, которому нужен и горизонтальный скролл, и карточный вид,
232
+ остаётся сузить свой селектор до широкого экрана. */
233
+ min-width: 0;
234
+ max-width: 100%;
235
+
236
+ .cdk-header-row,
237
+ .cdk-row,
238
+ .rt-table__skeleton-row,
239
+ .rt-table__empty-row {
240
+ display: none;
241
+ }
242
+
243
+ .rt-table__cards {
244
+ display: flex;
245
+ flex-direction: column;
246
+ gap: var(--rt-space-sm);
247
+ }
248
+ }
249
+
250
+ &__card {
237
251
  display: flex;
238
252
  flex-direction: column;
239
- gap: var(--rt-space-sm);
253
+ padding: var(--rt-space-md);
254
+ border: var(--rt-table-border-width) solid var(--rt-color-border-default);
255
+ border-radius: var(--rt-table-card-radius);
256
+ background: var(--rt-color-bg-surface);
257
+ gap: var(--rt-space-xs);
240
258
  }
241
- }
242
-
243
- &__card {
244
- display: flex;
245
- flex-direction: column;
246
- padding: var(--rt-space-md);
247
- border: var(--rt-border-width-thin) solid var(--rt-color-border-default);
248
- border-radius: var(--rt-radius-md);
249
- background: var(--rt-color-bg-surface);
250
- gap: var(--rt-space-xs);
251
- }
252
259
 
253
- &__card-field {
254
- display: flex;
255
- align-items: baseline;
256
- justify-content: space-between;
257
- gap: var(--rt-space-md);
258
- }
260
+ &__card-field {
261
+ display: flex;
262
+ align-items: baseline;
263
+ justify-content: space-between;
264
+ gap: var(--rt-space-md);
265
+ }
259
266
 
260
- &__card-label {
261
- flex: 0 0 auto;
262
- color: var(--rt-color-text-muted);
263
- font-size: var(--rt-text-sm);
264
- }
267
+ &__card-label {
268
+ flex: 0 0 auto;
269
+ color: var(--rt-color-text-muted);
270
+ font-size: var(--rt-text-sm);
271
+ }
265
272
 
266
- &__card-value {
267
- min-width: 0;
268
- overflow-wrap: anywhere;
269
- text-align: right;
273
+ &__card-value {
274
+ min-width: 0;
275
+ overflow-wrap: anywhere;
276
+ text-align: right;
270
277
 
271
- /* Cell-шаблон колонки — это `<td cdk-cell>` целиком; вне таблицы он тащит
272
- табличные стили (height 50px, border, padding, inline min-width под
273
- горизонтальный скролл). Гасим их, чтобы значение вело себя как inline-текст. */
274
- .cdk-cell {
275
- display: inline;
276
- height: auto;
277
- padding: 0;
278
- border: none;
279
- font: inherit;
280
- min-inline-size: 0 !important;
281
- text-align: inherit;
278
+ /* Cell-шаблон колонки — это `<td cdk-cell>` целиком; вне таблицы он тащит
279
+ табличные стили (height 50px, border, padding, inline min-width под
280
+ горизонтальный скролл). Гасим их, чтобы значение вело себя как inline-текст. */
281
+ .cdk-cell {
282
+ display: inline;
283
+ height: auto;
284
+ padding: 0;
285
+ border: none;
286
+ font: inherit;
287
+ min-inline-size: 0;
288
+ text-align: inherit;
289
+ }
282
290
  }
283
- }
284
291
 
285
- &__card-actions {
286
- display: flex;
287
- justify-content: flex-end;
288
- }
292
+ &__card-actions {
293
+ display: flex;
294
+ justify-content: flex-end;
295
+ }
289
296
 
290
- &__card-skeleton-bar {
291
- display: block;
292
- width: 60%;
293
- height: 14px;
297
+ &__card-skeleton-bar {
298
+ display: block;
299
+ width: 60%;
300
+ height: 14px;
294
301
 
295
- &:first-child {
296
- width: 80%;
302
+ &:first-child {
303
+ width: 80%;
304
+ }
297
305
  }
298
306
  }
299
- }
300
-
301
- /* В тёмной теме таблица сливается с фоном контента (bg-page), а не поднимается
302
- на bg-surface — иначе список выпирает более светлой плитой над страницей. */
303
- :root[data-theme='dark'] .rt-table,
304
- html.rt-theme-dark .rt-table {
305
- background: var(--rt-color-bg-page);
306
307
 
307
- .cdk-header-cell,
308
- .rt-table__empty,
309
- .rt-table__overlay-backdrop {
308
+ /* В тёмной теме таблица сливается с фоном контента (bg-page), а не поднимается
309
+ на bg-surface — иначе список выпирает более светлой плитой над страницей. */
310
+ :root[data-theme='dark'] .rt-table,
311
+ html.rt-theme-dark .rt-table {
310
312
  background: var(--rt-color-bg-page);
313
+
314
+ .cdk-header-cell,
315
+ .rt-table__empty,
316
+ .rt-table__overlay-backdrop {
317
+ background: var(--rt-color-bg-page);
318
+ }
311
319
  }
312
320
  }