@rt-tools/ui-kit-v2 0.39.1 → 0.40.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.
- package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs +13 -1
- package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +12 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +3 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +60 -7
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +91 -10
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +76 -5
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +111 -35
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +37 -16
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +94 -5
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/components/date-picker/panel/rt-date-panel.component.scss +51 -2
- package/src/lib/components/date-range/panel/rt-date-range-panel.component.scss +95 -2
- package/src/lib/components/detail-list/CONTEXT.md +3 -0
- package/src/lib/components/detail-list/rt-detail-row.component.scss +1 -0
- package/src/lib/components/input-number/CONTEXT.md +8 -0
- package/src/lib/components/input-number/rt-input-number.component.scss +50 -0
- package/src/lib/components/stat-tile/CONTEXT.md +11 -6
- package/src/lib/components/stat-tile/rt-stat-tile.component.scss +21 -0
- package/src/lib/components/stat-tile/stories/component/test-stat-tile-matrix.component.scss +15 -0
- package/src/lib/components/table/CONTEXT.md +20 -0
- package/src/lib/components/table/rt-table.component.scss +77 -22
- package/src/lib/components/table/stories/component/test-table-pinned.component.scss +76 -0
- package/src/rich-editor/lib/components/chat/CONTEXT.md +5 -0
- package/src/styles/_primitives.scss +2 -0
- package/src/styles/_semantic.scss +9 -0
- package/src/styles/_theme-dark.scss +2 -0
- package/styles/tokens.css +66 -0
- package/types/rt-tools-ui-kit-v2-ai-prompt-input.d.ts +4 -0
- package/types/rt-tools-ui-kit-v2-core.d.ts +9 -1
- package/types/rt-tools-ui-kit-v2-date-picker.d.ts +14 -0
- package/types/rt-tools-ui-kit-v2-input-number.d.ts +30 -2
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +13 -1
- package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +29 -6
- package/types/rt-tools-ui-kit-v2-table.d.ts +31 -0
package/package.json
CHANGED
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
/* Толщина черты над подвалом. */
|
|
12
12
|
--rt-date-panel-divider-width: var(--rt-border-width-thin);
|
|
13
13
|
|
|
14
|
+
/* Рамка текущих месяца и года: тонкая линия цвета действия внутри ячейки. */
|
|
15
|
+
--rt-date-panel-current-ring: inset 0 0 0 var(--rt-border-width-thin) var(--rt-color-action-primary);
|
|
16
|
+
|
|
14
17
|
/* Видимая высота колонки времени: семь ячеек с шестью зазорами, остальное прокручивается. */
|
|
15
18
|
--rt-date-panel-column-height: calc(var(--rt-date-panel-cell-size) * 7 + var(--rt-space-0-5) * 6);
|
|
16
19
|
|
|
@@ -46,7 +49,29 @@
|
|
|
46
49
|
margin-bottom: var(--rt-space-4);
|
|
47
50
|
}
|
|
48
51
|
|
|
52
|
+
/* Год в заголовке сетки месяцев — кнопка: открывает сетку годов. */
|
|
49
53
|
&__year {
|
|
54
|
+
padding: var(--rt-space-1) var(--rt-space-2);
|
|
55
|
+
border: none;
|
|
56
|
+
border-radius: var(--rt-date-panel-cell-radius);
|
|
57
|
+
background: none;
|
|
58
|
+
color: var(--rt-color-text-primary);
|
|
59
|
+
cursor: pointer;
|
|
60
|
+
font: inherit;
|
|
61
|
+
font-weight: var(--rt-font-weight-semibold);
|
|
62
|
+
|
|
63
|
+
&:hover {
|
|
64
|
+
background: var(--rt-color-bg-subtle);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
&:focus-visible {
|
|
68
|
+
outline: var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);
|
|
69
|
+
outline-offset: var(--rt-focus-ring-offset);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* Подпись блока лет «2024 – 2035» над сеткой годов. */
|
|
74
|
+
&__span {
|
|
50
75
|
color: var(--rt-color-text-primary);
|
|
51
76
|
font-weight: var(--rt-font-weight-semibold);
|
|
52
77
|
}
|
|
@@ -57,6 +82,24 @@
|
|
|
57
82
|
grid-template-columns: repeat(3, 1fr);
|
|
58
83
|
}
|
|
59
84
|
|
|
85
|
+
/* Ячейки сеток месяцев и годов — по ячейке периода макета; колонки времени не задеты. */
|
|
86
|
+
&__month-grid &__cell {
|
|
87
|
+
font-weight: var(--rt-font-weight-medium);
|
|
88
|
+
|
|
89
|
+
&:hover:not(:disabled, [aria-pressed='true']) {
|
|
90
|
+
background: var(--rt-color-bg-hover);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
&[data-current]:not([aria-pressed='true']) {
|
|
94
|
+
color: var(--rt-color-action-primary);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
&:disabled {
|
|
98
|
+
color: var(--rt-color-text-disabled);
|
|
99
|
+
opacity: 1;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
60
103
|
&__time {
|
|
61
104
|
display: flex;
|
|
62
105
|
gap: var(--rt-space-1);
|
|
@@ -96,6 +139,11 @@
|
|
|
96
139
|
outline-offset: var(--rt-focus-ring-offset);
|
|
97
140
|
}
|
|
98
141
|
|
|
142
|
+
/* Текущий год обведён тонкой линией цвета действия, как сегодняшний день календаря. */
|
|
143
|
+
&[data-current]:not([aria-pressed='true']) {
|
|
144
|
+
box-shadow: var(--rt-date-panel-current-ring);
|
|
145
|
+
}
|
|
146
|
+
|
|
99
147
|
&[aria-pressed='true'] {
|
|
100
148
|
background: var(--rt-color-action-primary);
|
|
101
149
|
color: var(--rt-color-action-on-primary);
|
|
@@ -121,11 +169,12 @@
|
|
|
121
169
|
justify-content: center;
|
|
122
170
|
}
|
|
123
171
|
|
|
124
|
-
/* Нижняя шторка: дни и ячейки под палец, всё — в одну
|
|
172
|
+
/* Нижняя шторка: дни и ячейки под палец, всё — в одну колонку. Тело шторки своих боковых
|
|
173
|
+
отступов не даёт, поэтому панель держит отступ шапки и подвала шторки, а не край экрана. */
|
|
125
174
|
&--sheet {
|
|
126
175
|
--rt-date-panel-cell-size: calc(var(--rt-size-10) + var(--rt-size-1));
|
|
127
176
|
|
|
128
|
-
padding-inline:
|
|
177
|
+
padding-inline: var(--rt-space-5);
|
|
129
178
|
}
|
|
130
179
|
|
|
131
180
|
/* Календарь объявляет размер дня на корне своего блока, поэтому свойство ставится на сам
|
|
@@ -8,6 +8,12 @@
|
|
|
8
8
|
/* Толщина черты между вариантами и месяцами и над подвалом. */
|
|
9
9
|
--rt-date-range-panel-divider-width: var(--rt-border-width-thin);
|
|
10
10
|
|
|
11
|
+
/* Скругление ячеек сеток и кнопки года. */
|
|
12
|
+
--rt-date-range-panel-cell-radius: var(--rt-radius-md);
|
|
13
|
+
|
|
14
|
+
/* Рамка текущих месяца и года: тонкая линия цвета действия внутри ячейки. */
|
|
15
|
+
--rt-date-range-panel-current-ring: inset 0 0 0 var(--rt-border-width-thin) var(--rt-color-action-primary);
|
|
16
|
+
|
|
11
17
|
display: flex;
|
|
12
18
|
flex-direction: column;
|
|
13
19
|
padding: var(--rt-space-4);
|
|
@@ -54,6 +60,88 @@
|
|
|
54
60
|
min-inline-size: calc(var(--rt-size-10) * 14 + var(--rt-space-6));
|
|
55
61
|
}
|
|
56
62
|
|
|
63
|
+
/* Сетки месяцев и годов: на месте двух месяцев и той же ширины, четыре ячейки в ряд. */
|
|
64
|
+
&__grid {
|
|
65
|
+
flex: 1 1 auto;
|
|
66
|
+
min-inline-size: calc(var(--rt-size-10) * 14 + var(--rt-space-6));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
&__grid-header {
|
|
70
|
+
display: flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
justify-content: space-between;
|
|
73
|
+
margin-bottom: var(--rt-space-4);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* Подсказка заголовка «2026 · выберите месяц»: год в ней — кнопка к сетке годов. */
|
|
77
|
+
&__hint {
|
|
78
|
+
color: var(--rt-color-text-muted);
|
|
79
|
+
font-size: var(--rt-text-sm);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
&__year {
|
|
83
|
+
padding: var(--rt-space-1) var(--rt-space-2);
|
|
84
|
+
border: none;
|
|
85
|
+
border-radius: var(--rt-date-range-panel-cell-radius);
|
|
86
|
+
background: none;
|
|
87
|
+
color: inherit;
|
|
88
|
+
cursor: pointer;
|
|
89
|
+
font: inherit;
|
|
90
|
+
|
|
91
|
+
&:hover {
|
|
92
|
+
background: var(--rt-color-bg-subtle);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
&:focus-visible {
|
|
96
|
+
outline: var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);
|
|
97
|
+
outline-offset: var(--rt-focus-ring-offset);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
&__cells {
|
|
102
|
+
display: grid;
|
|
103
|
+
gap: var(--rt-space-2);
|
|
104
|
+
grid-template-columns: repeat(4, 1fr);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
&__cell {
|
|
108
|
+
border: none;
|
|
109
|
+
border-radius: var(--rt-date-range-panel-cell-radius);
|
|
110
|
+
background: none;
|
|
111
|
+
color: var(--rt-color-text-primary);
|
|
112
|
+
cursor: pointer;
|
|
113
|
+
font: inherit;
|
|
114
|
+
font-size: var(--rt-text-sm);
|
|
115
|
+
font-variant-numeric: tabular-nums;
|
|
116
|
+
font-weight: var(--rt-font-weight-medium);
|
|
117
|
+
min-block-size: calc(var(--rt-size-12) + var(--rt-space-2));
|
|
118
|
+
|
|
119
|
+
&:hover:not(:disabled, [aria-pressed='true']) {
|
|
120
|
+
background: var(--rt-color-bg-hover);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
&:focus-visible {
|
|
124
|
+
outline: var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);
|
|
125
|
+
outline-offset: var(--rt-focus-ring-offset);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Текущие месяц и год обведены тонкой линией цвета действия, как сегодняшний день. */
|
|
129
|
+
&[data-current]:not([aria-pressed='true']) {
|
|
130
|
+
box-shadow: var(--rt-date-range-panel-current-ring);
|
|
131
|
+
color: var(--rt-color-action-primary);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
&[aria-pressed='true'] {
|
|
135
|
+
background: var(--rt-color-action-primary);
|
|
136
|
+
color: var(--rt-color-action-on-primary);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
&:disabled {
|
|
140
|
+
color: var(--rt-color-text-disabled);
|
|
141
|
+
cursor: not-allowed;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
57
145
|
&__footer {
|
|
58
146
|
display: flex;
|
|
59
147
|
align-items: center;
|
|
@@ -68,9 +156,10 @@
|
|
|
68
156
|
font-size: var(--rt-text-sm);
|
|
69
157
|
}
|
|
70
158
|
|
|
71
|
-
/* Нижняя шторка: варианты строкой сверху с прокруткой вбок, один месяц, дни под палец.
|
|
159
|
+
/* Нижняя шторка: варианты строкой сверху с прокруткой вбок, один месяц, дни под палец.
|
|
160
|
+
Тело шторки своих боковых отступов не даёт — панель держит отступ шапки и подвала шторки. */
|
|
72
161
|
&--sheet {
|
|
73
|
-
padding-inline:
|
|
162
|
+
padding-inline: var(--rt-space-5);
|
|
74
163
|
}
|
|
75
164
|
|
|
76
165
|
&--sheet &__body {
|
|
@@ -93,6 +182,10 @@
|
|
|
93
182
|
flex: 0 0 auto;
|
|
94
183
|
}
|
|
95
184
|
|
|
185
|
+
&--sheet &__grid {
|
|
186
|
+
min-inline-size: 0;
|
|
187
|
+
}
|
|
188
|
+
|
|
96
189
|
&--sheet &__calendar {
|
|
97
190
|
--rt-calendar-month-count: 1;
|
|
98
191
|
--rt-calendar-day-size: var(--rt-date-range-panel-sheet-day-size);
|
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
**Во время загрузки подменяется только значение** — подпись остаётся, по ней читается, чего ждут.
|
|
24
24
|
Заглушка узкая (180 px), под значение, а не под всю строку.
|
|
25
25
|
|
|
26
|
+
**Значение сохраняет переносы из текста.** `\n` в значении даёт новую строку, длинный текст
|
|
27
|
+
переносится по ширине. Приложение с `preserveWhitespaces: true` увидит и переносы из своего шаблона.
|
|
28
|
+
|
|
26
29
|
## Рядом
|
|
27
30
|
|
|
28
31
|
- [`rt-info-item`](../info-item/CONTEXT.md) — одиночная пара «подпись: значение» в строку.
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
| `min` / `max` | `number \| null` | `null` (сторона не ограничена) |
|
|
17
17
|
| `minFractionDigits` | `number` | `0` |
|
|
18
18
|
| `maxFractionDigits` | `number` | `2` |
|
|
19
|
+
| `step` | `number` | `1` |
|
|
20
|
+
| `stepper` | `boolean` | `true` |
|
|
19
21
|
|
|
20
22
|
Значение — `number | null`.
|
|
21
23
|
|
|
@@ -46,6 +48,12 @@
|
|
|
46
48
|
- **Крестик обнуляет поле, а не опустошает его** (`0,00`): у числового поля ноль осмыслен.
|
|
47
49
|
При нуле крестик не показывается — обнулять больше нечего.
|
|
48
50
|
- Префикс спрятан от скринридера: валюту он прочитает из подписи поля.
|
|
51
|
+
- **Стрелки шага** стоят последними, после крестика: верхняя прибавляет `step`, нижняя вычитает.
|
|
52
|
+
Клавиши «вверх» и «вниз» делают то же и без стрелок. Пустое поле шагает от нуля, результат
|
|
53
|
+
зажимается в `min` и `max` и округляется до знаков шага. Стрелка к достигнутой границе и обе
|
|
54
|
+
стрелки выключенного поля гаснут. Стрелки не берут остановку таба и не забирают фокус у поля.
|
|
55
|
+
Обе рисуют один значок `chevron-up`, нижняя — перевёрнутым: `chevron-down` набора в 12 px
|
|
56
|
+
кладёт плечи неровно. В поле `sm` столбец 16×24 и значок 10 px, в `md` и `lg` — 20×32 и 12 px.
|
|
49
57
|
- Под материальным набором подпись вмещающего `rt-field` ложится внутрь поля: на место подсказки
|
|
50
58
|
в покое и на рамку при значении или фокусе. Признак — `fieldLabelInside` основы полей.
|
|
51
59
|
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
--rt-input-number-radius: var(--rt-input-radius);
|
|
10
10
|
--rt-input-number-fill-radius: var(--rt-radius-sm);
|
|
11
11
|
--rt-input-number-color-border-hover: var(--rt-color-text-primary);
|
|
12
|
+
--rt-input-number-step-radius: var(--rt-radius-sm);
|
|
12
13
|
|
|
13
14
|
/* Толщина боковой рамки: от неё под материальным набором считается отступ текста. */
|
|
14
15
|
--rt-input-number-edge: var(--rt-input-border-width);
|
|
@@ -183,6 +184,55 @@
|
|
|
183
184
|
flex-shrink: 0;
|
|
184
185
|
}
|
|
185
186
|
|
|
187
|
+
/* Стрелки шага — столбец двух кнопок в конце поля, после крестика. */
|
|
188
|
+
&__stepper {
|
|
189
|
+
display: flex;
|
|
190
|
+
flex-direction: column;
|
|
191
|
+
flex-shrink: 0;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* В поле sm стрелки мельче, как в макете: кнопки 16×12, столбец 16×24. */
|
|
195
|
+
&--size--sm &__step {
|
|
196
|
+
width: var(--rt-size-4);
|
|
197
|
+
height: var(--rt-size-3);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
&__step {
|
|
201
|
+
display: inline-flex;
|
|
202
|
+
width: var(--rt-size-5);
|
|
203
|
+
height: var(--rt-size-4);
|
|
204
|
+
align-items: center;
|
|
205
|
+
justify-content: center;
|
|
206
|
+
padding: 0;
|
|
207
|
+
border: none;
|
|
208
|
+
border-radius: var(--rt-input-number-step-radius);
|
|
209
|
+
background: transparent;
|
|
210
|
+
color: var(--rt-color-text-muted);
|
|
211
|
+
cursor: pointer;
|
|
212
|
+
|
|
213
|
+
&:hover:not(:disabled) {
|
|
214
|
+
background-color: var(--rt-color-bg-hover);
|
|
215
|
+
color: var(--rt-color-text-primary);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* Стрелка у границы и в выключенном поле гаснет: состояние ниже наведения. */
|
|
219
|
+
&:disabled {
|
|
220
|
+
color: var(--rt-color-text-disabled);
|
|
221
|
+
cursor: not-allowed;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* Значок берёт цвет кнопки и не перехватывает нажатие. */
|
|
226
|
+
&__step-icon {
|
|
227
|
+
pointer-events: none;
|
|
228
|
+
|
|
229
|
+
/* Нижняя стрелка — та же верхняя, перевёрнутая: `chevron-down` набора в растре 12 px
|
|
230
|
+
кладёт одно плечо темнее другого, и пара читается как стрелки разного размера. */
|
|
231
|
+
&--flipped {
|
|
232
|
+
transform: rotate(180deg);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
186
236
|
/* Текстовый префикс (напр. «₽»): приглушён, неинтерактивен. */
|
|
187
237
|
&__prefix {
|
|
188
238
|
color: var(--rt-color-text-muted);
|
|
@@ -12,12 +12,13 @@
|
|
|
12
12
|
[deltaSecondary]="{ percent: 8, label: 'к прошлому году' }" />
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
| вход | тип
|
|
16
|
-
| --------------------------------- |
|
|
17
|
-
| `label` / `value` | `string`
|
|
18
|
-
| `secondary` | `string \| null`
|
|
19
|
-
| `hint` | `string \| null`
|
|
20
|
-
| `deltaPrimary` / `deltaSecondary` | `{ percent, label, baseline? } \| null` | `null` |
|
|
15
|
+
| вход | тип | умолчание |
|
|
16
|
+
| --------------------------------- | ---------------------------------------------- | --------------- |
|
|
17
|
+
| `label` / `value` | `string` | **обязательны** |
|
|
18
|
+
| `secondary` | `string \| null` | `null` |
|
|
19
|
+
| `hint` | `string \| null` | `null` |
|
|
20
|
+
| `deltaPrimary` / `deltaSecondary` | `{ percent, unit?, label, baseline? } \| null` | `null` |
|
|
21
|
+
| `growthIsWorse` | `boolean` | `false` |
|
|
21
22
|
|
|
22
23
|
Выходов нет.
|
|
23
24
|
|
|
@@ -29,6 +30,10 @@
|
|
|
29
30
|
Знак и стрелка выводятся из числа: `> 0` — «+» и стрелка вверх, `< 0` — стрелка вниз. Дробная
|
|
30
31
|
часть отделяется запятой.
|
|
31
32
|
|
|
33
|
+
`unit: 'points'` пишет строку в процентных пунктах подписью `uiPercentagePoints` («+10 п.п.»),
|
|
34
|
+
без `unit` — в процентах. `growthIsWorse` меняет цвета обеих строк местами, стрелка остаётся по
|
|
35
|
+
знаку числа.
|
|
36
|
+
|
|
32
37
|
**Значение базы уходит параметром подписи, а не подставляется в готовую строку.** Переводчик приложения
|
|
33
38
|
интерполирует `{{value}}` в момент перевода, и к возвращённой строке подставлять уже нечего:
|
|
34
39
|
`String.replace` после `translateSignal` не находил плейсхолдера, и от подписи оставалась одна
|
|
@@ -99,6 +99,27 @@
|
|
|
99
99
|
white-space: nowrap;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
+
/* Рост хуже: цвета строк меняются местами, стрелки остаются по знаку числа. */
|
|
103
|
+
&--growth-worse {
|
|
104
|
+
.rt-stat-tile__delta--direction--up {
|
|
105
|
+
color: var(--rt-color-state-danger);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.rt-stat-tile__delta--direction--down {
|
|
109
|
+
color: var(--rt-color-state-success);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.rt-stat-tile__year--direction--up {
|
|
113
|
+
background: var(--rt-color-state-danger-bg);
|
|
114
|
+
color: var(--rt-color-state-danger);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.rt-stat-tile__year--direction--down {
|
|
118
|
+
background: var(--rt-color-state-success-bg);
|
|
119
|
+
color: var(--rt-color-state-success);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
102
123
|
/* Вторичная метрика прижата к низу: строки «было …» может не быть,
|
|
103
124
|
и без прижатия плитки в ряду разъезжались бы по базовой линии. */
|
|
104
125
|
&__secondary {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* Ряд отчёта: плитки одной ширины в карточках, как их ставит приложение. */
|
|
3
|
+
.app-stat-tile-matrix {
|
|
4
|
+
&__report {
|
|
5
|
+
display: grid;
|
|
6
|
+
gap: var(--rt-space-4);
|
|
7
|
+
grid-template-columns: repeat(3, 17.5rem);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/* Хост карточки — сетка: так её статья тянется на высоту ряда, и карточки ряда равны. */
|
|
11
|
+
&__card {
|
|
12
|
+
display: grid;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -22,6 +22,26 @@
|
|
|
22
22
|
отрисовки строк, а колонка обязана попасть в реестр до неё. Ячейки колонки получают своё
|
|
23
23
|
объявление тем же вызовом: без ручного присвоения CDK падает на разборе шаблона ячейки.
|
|
24
24
|
|
|
25
|
+
## Закреплённая колонка
|
|
26
|
+
|
|
27
|
+
Колонку закрепляет потребитель атрибутом `sticky` или `stickyEnd` у своего `cdkColumnDef`;
|
|
28
|
+
своего входа у таблицы для этого нет. Закреплённая ячейка не прозрачна: она кладёт цвет своей
|
|
29
|
+
строки поверх подложки, поэтому колонки, уезжающие под неё при прокрутке вбок, не просвечивают.
|
|
30
|
+
У края закрепления тень — пока под колонкой есть прокрученное содержимое.
|
|
31
|
+
|
|
32
|
+
Свойства блока, которыми приложение меняет вид без своих правил:
|
|
33
|
+
|
|
34
|
+
| Свойство | Что задаёт | По умолчанию |
|
|
35
|
+
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- |
|
|
36
|
+
| `--rt-table-row-bg` | цвет строки; его же берёт закреплённая ячейка. Наведение и проблемная строка переназначают его, строке итога приложение ставит своё значение | прозрачный |
|
|
37
|
+
| `--rt-table-pinned-bg` | подложка закреплённой ячейки под цветом строки | поверхность, в тёмной теме — фон страницы |
|
|
38
|
+
| `--rt-table-pinned-shadow-color` | цвет тени у края закрепления | `--rt-color-table-pinned-shadow` |
|
|
39
|
+
| `--rt-table-pinned-shadow-width` | ширина тени | `12px` |
|
|
40
|
+
|
|
41
|
+
Прокрутку вбок ведёт не таблица, а её контейнер у потребителя: таблица находит ближайшего
|
|
42
|
+
предка, который прокручивается вбок, и по его положению ставит хосту модификаторы
|
|
43
|
+
`rt-table--hidden-start` и `rt-table--hidden-end`.
|
|
44
|
+
|
|
25
45
|
## Строка отбора
|
|
26
46
|
|
|
27
47
|
Ряд отбора рисует сама таблица, по полю `filter` в `columnsConfig`, и только когда его просят
|
|
@@ -7,20 +7,32 @@
|
|
|
7
7
|
.rt-table {
|
|
8
8
|
--rt-table-border-width: var(--rt-border-width-thin);
|
|
9
9
|
--rt-table-card-radius: var(--rt-radius-md);
|
|
10
|
+
--rt-table-row-bg: transparent;
|
|
11
|
+
--rt-table-pinned-bg: var(--rt-color-table-bg);
|
|
12
|
+
--rt-table-pinned-shadow-color: var(--rt-color-table-pinned-shadow);
|
|
13
|
+
--rt-table-pinned-shadow-width: 12px;
|
|
10
14
|
|
|
11
15
|
position: relative;
|
|
12
16
|
display: table;
|
|
13
17
|
width: 100%;
|
|
14
|
-
background: var(--rt-color-bg
|
|
18
|
+
background: var(--rt-color-table-bg);
|
|
15
19
|
border-collapse: collapse;
|
|
16
20
|
color: var(--rt-color-text-primary);
|
|
17
21
|
|
|
22
|
+
/* Строка в 50 по макету вместе с отступами и нижней линией. Высота стоит на строке, а не на
|
|
23
|
+
ячейке: высоту ячейки браузер считает по модели размеров страницы, и под сбросом
|
|
24
|
+
`box-sizing: border-box` у приложения строка выходила в 37. Ширину ячеек задают приложения. */
|
|
25
|
+
.cdk-header-row,
|
|
26
|
+
.cdk-row,
|
|
27
|
+
&__skeleton-row {
|
|
28
|
+
height: 50px;
|
|
29
|
+
}
|
|
30
|
+
|
|
18
31
|
.cdk-header-cell,
|
|
19
32
|
.cdk-cell,
|
|
20
33
|
&__filter-cell,
|
|
21
34
|
&__skeleton-cell {
|
|
22
35
|
position: relative;
|
|
23
|
-
height: 50px;
|
|
24
36
|
padding: var(--rt-space-2) var(--rt-space-5);
|
|
25
37
|
border-bottom: var(--rt-table-border-width) solid var(--rt-color-border-subtle);
|
|
26
38
|
|
|
@@ -55,7 +67,7 @@
|
|
|
55
67
|
.cdk-header-cell {
|
|
56
68
|
/* Верхняя грань таблицы — только у шапки (низ даёт border-bottom строк). */
|
|
57
69
|
border-top: var(--rt-table-border-width) solid var(--rt-color-border-subtle);
|
|
58
|
-
background: var(--rt-color-bg
|
|
70
|
+
background: var(--rt-color-table-bg);
|
|
59
71
|
color: var(--rt-color-text-muted);
|
|
60
72
|
}
|
|
61
73
|
|
|
@@ -146,23 +158,74 @@
|
|
|
146
158
|
}
|
|
147
159
|
}
|
|
148
160
|
|
|
161
|
+
/* Цвет строки — свойство строки, а не правило фона: его же берёт закреплённая ячейка.
|
|
162
|
+
Цвета наведения и проблемной строки полупрозрачны, поэтому закреплённая ячейка кладёт
|
|
163
|
+
цвет строки поверх непрозрачной подложки — иначе под ней просвечивали бы колонки,
|
|
164
|
+
уезжающие при прокрутке вбок. Строка итога получает свой цвет тем же свойством. */
|
|
165
|
+
.cdk-row,
|
|
166
|
+
.cdk-footer-row {
|
|
167
|
+
background: var(--rt-table-row-bg);
|
|
168
|
+
}
|
|
169
|
+
|
|
149
170
|
.cdk-row {
|
|
150
171
|
&:hover {
|
|
151
|
-
|
|
172
|
+
--rt-table-row-bg: var(--rt-color-bg-hover);
|
|
152
173
|
}
|
|
153
174
|
|
|
154
175
|
/* Опт-ин подсветка проблемной строки (просрочка и т.п.): потребитель
|
|
155
176
|
вешает класс `rt-table__row--danger` на строку. Составной селектор с
|
|
156
177
|
`.cdk-row` нужен, чтобы danger-фон держался и при :hover. */
|
|
157
178
|
&.rt-table__row--danger {
|
|
158
|
-
|
|
179
|
+
--rt-table-row-bg: var(--rt-color-state-danger-bg);
|
|
159
180
|
|
|
160
181
|
&:hover {
|
|
161
|
-
|
|
182
|
+
--rt-table-row-bg: var(--rt-color-state-danger-bg);
|
|
162
183
|
}
|
|
163
184
|
}
|
|
164
185
|
}
|
|
165
186
|
|
|
187
|
+
/* Закреплённая колонка: CDK ставит ячейке `position: sticky` и класс `cdk-table-sticky`.
|
|
188
|
+
Шапка уже залита поверхностью и правила не требует. */
|
|
189
|
+
.cdk-cell.cdk-table-sticky,
|
|
190
|
+
.cdk-footer-cell.cdk-table-sticky {
|
|
191
|
+
background: linear-gradient(var(--rt-table-row-bg), var(--rt-table-row-bg)), var(--rt-table-pinned-bg);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* Тень у края: крайнюю ячейку закрепления CDK помечает классом `…-border-elem-<сторона>`.
|
|
195
|
+
Тень видна, пока под колонкой есть прокрученное содержимое — это говорят модификаторы
|
|
196
|
+
хоста `--hidden-start` и `--hidden-end`, которые таблица ставит по прокрутке. Без скрытого
|
|
197
|
+
края псевдоэлемента нет вовсе: невидимый, он всё равно выходил за край таблицы и давал
|
|
198
|
+
лишнюю прокрутку вбок. */
|
|
199
|
+
.cdk-table-sticky-border-elem-left,
|
|
200
|
+
.cdk-table-sticky-border-elem-right {
|
|
201
|
+
&:after {
|
|
202
|
+
position: absolute;
|
|
203
|
+
top: 0;
|
|
204
|
+
bottom: 0;
|
|
205
|
+
width: var(--rt-table-pinned-shadow-width);
|
|
206
|
+
pointer-events: none;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.cdk-table-sticky-border-elem-left:after {
|
|
211
|
+
left: 100%;
|
|
212
|
+
background: linear-gradient(to right, var(--rt-table-pinned-shadow-color), transparent);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.cdk-table-sticky-border-elem-right:after {
|
|
216
|
+
right: 100%;
|
|
217
|
+
background: linear-gradient(to left, var(--rt-table-pinned-shadow-color), transparent);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* Начало и конец — логические края, а класс CDK называет физическую сторону: при письме
|
|
221
|
+
справа налево колонка у начала получает `…-right`. */
|
|
222
|
+
&--hidden-start:dir(ltr) .cdk-table-sticky-border-elem-left:after,
|
|
223
|
+
&--hidden-end:dir(ltr) .cdk-table-sticky-border-elem-right:after,
|
|
224
|
+
&--hidden-start:dir(rtl) .cdk-table-sticky-border-elem-right:after,
|
|
225
|
+
&--hidden-end:dir(rtl) .cdk-table-sticky-border-elem-left:after {
|
|
226
|
+
content: '';
|
|
227
|
+
}
|
|
228
|
+
|
|
166
229
|
/* Строки-ссылки: курсор + focus-ring. Активацию (click/Enter/Space) и
|
|
167
230
|
table-семантику обеспечивает директива rtTableRow на самой строке.
|
|
168
231
|
Карточка узкого экрана открывает запись так же, как строка: вид у неё тот же. */
|
|
@@ -183,10 +246,15 @@
|
|
|
183
246
|
}
|
|
184
247
|
|
|
185
248
|
&--density--compact {
|
|
249
|
+
.cdk-header-row,
|
|
250
|
+
.cdk-row,
|
|
251
|
+
.rt-table__skeleton-row {
|
|
252
|
+
height: 36px;
|
|
253
|
+
}
|
|
254
|
+
|
|
186
255
|
.cdk-header-cell,
|
|
187
256
|
.cdk-cell,
|
|
188
257
|
.rt-table__skeleton-cell {
|
|
189
|
-
height: 36px;
|
|
190
258
|
padding: var(--rt-space-xs) var(--rt-space-sm);
|
|
191
259
|
}
|
|
192
260
|
}
|
|
@@ -207,7 +275,7 @@
|
|
|
207
275
|
/* Только нижняя грань — как у строк: верхнюю даёт border-bottom шапки
|
|
208
276
|
(иначе двойная линия), боковые не рисуем (нет периметра). */
|
|
209
277
|
border-bottom: var(--rt-table-border-width) solid var(--rt-color-border-subtle);
|
|
210
|
-
background: var(--rt-color-bg
|
|
278
|
+
background: var(--rt-color-table-bg);
|
|
211
279
|
color: var(--rt-color-text-muted);
|
|
212
280
|
text-align: center;
|
|
213
281
|
}
|
|
@@ -229,7 +297,7 @@
|
|
|
229
297
|
|
|
230
298
|
&__overlay-backdrop {
|
|
231
299
|
position: absolute;
|
|
232
|
-
background: var(--rt-color-bg
|
|
300
|
+
background: var(--rt-color-table-bg);
|
|
233
301
|
inset: 0;
|
|
234
302
|
opacity: 0.72;
|
|
235
303
|
}
|
|
@@ -349,17 +417,4 @@
|
|
|
349
417
|
/* Шаг входа `radius` переназначает скругление карточки узкого вида; у широкого вида углов нет. */
|
|
350
418
|
@include kv.radius-steps('--rt-table-card-radius');
|
|
351
419
|
}
|
|
352
|
-
|
|
353
|
-
/* В тёмной теме таблица сливается с фоном контента (bg-page), а не поднимается
|
|
354
|
-
на bg-surface — иначе список выпирает более светлой плитой над страницей. */
|
|
355
|
-
:root[data-theme='dark'] .rt-table,
|
|
356
|
-
html.rt-theme-dark .rt-table {
|
|
357
|
-
background: var(--rt-color-bg-page);
|
|
358
|
-
|
|
359
|
-
.cdk-header-cell,
|
|
360
|
-
.rt-table__empty,
|
|
361
|
-
.rt-table__overlay-backdrop {
|
|
362
|
-
background: var(--rt-color-bg-page);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
420
|
}
|