@rt-tools/ui-kit-v2 0.15.0 → 0.17.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/README.md +7 -0
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +96 -41
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2.mjs +6824 -2700
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
- package/package.json +1 -1
- package/rt-tools-ui-kit-v2-0.17.0.tgz +0 -0
- package/src/assets/icons/chat-error.svg +9 -0
- package/src/assets/icons/fork-spoon.svg +9 -0
- package/src/assets/icons/fullscreen.svg +9 -0
- package/src/assets/icons/home.svg +9 -0
- package/src/assets/icons/layers.svg +9 -0
- package/src/assets/icons/pin.svg +5 -0
- package/src/assets/icons/troubleshoot.svg +9 -0
- package/src/assets/icons-material/chart-bar.fill.svg +5 -0
- package/src/assets/icons-material/chart-bar.svg +5 -0
- package/src/assets/icons-material/chart-line.fill.svg +5 -0
- package/src/assets/icons-material/chart-line.svg +5 -0
- package/src/assets/icons-material/chat-error.fill.svg +5 -0
- package/src/assets/icons-material/chat-error.svg +5 -0
- package/src/assets/icons-material/comment.fill.svg +5 -0
- package/src/assets/icons-material/comment.svg +5 -0
- package/src/assets/icons-material/fork-spoon.fill.svg +5 -0
- package/src/assets/icons-material/fork-spoon.svg +5 -0
- package/src/assets/icons-material/fullscreen.fill.svg +5 -0
- package/src/assets/icons-material/fullscreen.svg +5 -0
- package/src/assets/icons-material/home.fill.svg +3 -0
- package/src/assets/icons-material/home.svg +5 -0
- package/src/assets/icons-material/ico-exit.fill.svg +5 -0
- package/src/assets/icons-material/ico-exit.svg +5 -0
- package/src/assets/icons-material/ico-sun.fill.svg +5 -0
- package/src/assets/icons-material/ico-sun.svg +5 -0
- package/src/assets/icons-material/ico-user.fill.svg +5 -0
- package/src/assets/icons-material/ico-user.svg +5 -0
- package/src/assets/icons-material/layers.fill.svg +3 -0
- package/src/assets/icons-material/layers.svg +5 -0
- package/src/assets/icons-material/minus.fill.svg +3 -0
- package/src/assets/icons-material/minus.svg +3 -0
- package/src/assets/icons-material/moon.fill.svg +5 -0
- package/src/assets/icons-material/moon.svg +5 -0
- package/src/assets/icons-material/pin.fill.svg +3 -0
- package/src/assets/icons-material/pin.svg +5 -0
- package/src/assets/icons-material/search-plus.fill.svg +5 -0
- package/src/assets/icons-material/search-plus.svg +5 -0
- package/src/assets/icons-material/th-large.fill.svg +3 -0
- package/src/assets/icons-material/th-large.svg +5 -0
- package/src/assets/icons-material/troubleshoot.fill.svg +5 -0
- package/src/assets/icons-material/troubleshoot.svg +5 -0
- package/src/lib/components/CONTEXT.md +1 -1
- package/src/lib/components/action-bar/CONTEXT.md +5 -0
- package/src/lib/components/action-bar/rt-action-bar.component.scss +30 -16
- package/src/lib/components/aside/CONTEXT.md +18 -1
- package/src/lib/components/aside/error-box/rt-aside-error-box.component.scss +37 -0
- package/src/lib/components/aside/footer/rt-aside-footer.component.scss +7 -8
- package/src/lib/components/aside/header/rt-aside-header.component.scss +16 -1
- package/src/lib/components/aside/rt-aside.component.scss +31 -3
- package/src/lib/components/button/CONTEXT.md +12 -11
- package/src/lib/components/button/rt-button.directive.scss +36 -0
- package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +2 -2
- package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +1 -1
- package/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.scss +1 -1
- package/src/lib/components/data-table/rt-data-table.component.scss +1 -1
- package/src/lib/components/dialog/CONTEXT.md +9 -0
- package/src/lib/components/dialog/content/rt-dialog-content.component.scss +20 -0
- package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +18 -2
- package/src/lib/components/dialog/header/rt-dialog-header.component.scss +21 -3
- package/src/lib/components/dialog/rt-dialog.component.scss +9 -3
- package/src/lib/components/dynamic-selector/CONTEXT.md +50 -0
- package/src/lib/components/dynamic-selector/dynamic-input/rt-dynamic-input.component.scss +19 -0
- package/src/lib/components/dynamic-selector/list/rt-dynamic-selector-list.component.scss +108 -0
- package/src/lib/components/dynamic-selector/popup/rt-dynamic-selector-popup.component.scss +170 -0
- package/src/lib/components/dynamic-selector/rt-dynamic-selector.component.scss +23 -0
- package/src/lib/components/dynamic-selector/stories/component/test-dynamic-selector-matrix.component.scss +8 -0
- package/src/lib/components/dynamic-selector/stories/component/test-dynamic-selector.component.scss +7 -0
- package/src/lib/components/empty-state/CONTEXT.md +3 -0
- package/src/lib/components/empty-state/rt-empty-state.component.scss +9 -0
- package/src/lib/components/expansion-panel/CONTEXT.md +45 -0
- package/src/lib/components/expansion-panel/rt-expansion-panel.component.scss +134 -0
- package/src/lib/components/expansion-panel/stories/component/test-expansion-panel-matrix.component.scss +31 -0
- package/src/lib/components/header/CONTEXT.md +2 -2
- package/src/lib/components/icon/CONTEXT.md +11 -7
- package/src/lib/components/icon/rt-icon.component.scss +47 -0
- package/src/lib/components/icon-button/CONTEXT.md +27 -20
- package/src/lib/components/icon-button/rt-icon-button.component.scss +51 -25
- package/src/lib/components/image-cropper/CONTEXT.md +54 -0
- package/src/lib/components/image-cropper/rt-image-cropper.component.scss +220 -0
- package/src/lib/components/image-upload/CONTEXT.md +70 -0
- package/src/lib/components/image-upload/rt-image-upload.component.scss +89 -0
- package/src/lib/components/menu/CONTEXT.md +27 -0
- package/src/lib/components/menu/rt-menu-item.component.scss +42 -0
- package/src/lib/components/pagination/rt-pagination.component.scss +1 -1
- package/src/lib/components/scroll-area/CONTEXT.md +2 -0
- package/src/lib/components/scroll-area/rt-scroll-area.component.scss +20 -3
- package/src/lib/components/side-menu/CONTEXT.md +43 -0
- package/src/lib/components/side-menu/favorites/rt-side-menu-favorites.component.scss +126 -0
- package/src/lib/components/side-menu/rt-side-menu.component.scss +303 -0
- package/src/lib/components/side-menu/stories/component/test-side-menu-cell.component.scss +27 -0
- package/src/lib/components/side-menu/stories/component/test-side-menu.component.scss +39 -0
- package/src/lib/components/side-menu/sub-item/rt-side-menu-sub-item.component.scss +203 -0
- package/src/lib/components/spinner/CONTEXT.md +15 -8
- package/src/lib/components/spinner/rt-spinner.component.scss +108 -9
- package/src/lib/components/table/CONTEXT.md +6 -0
- package/src/lib/components/table/rt-table.component.scss +4 -2
- package/src/lib/components/tag/rt-tag.component.scss +43 -23
- package/src/lib/components/toast/CONTEXT.md +8 -0
- package/src/lib/components/toast/rt-toast.component.scss +74 -15
- package/src/lib/components/toast/rt-toaster.component.scss +5 -1
- package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -37
- package/src/lib/components/toggle-switch/CONTEXT.md +11 -3
- package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +53 -14
- package/src/lib/components/toolbar/rt-toolbar.component.scss +15 -4
- package/src/lib/components/tooltip/CONTEXT.md +7 -4
- package/src/rich-editor/lib/components/chat/CONTEXT.md +7 -2
- package/src/rich-editor/lib/components/chat/rt-chat.component.scss +25 -0
- package/src/styles/_color-scheme.scss +50 -0
- package/styles/tokens.css +35 -0
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +16 -20
- package/types/rt-tools-ui-kit-v2.d.ts +1588 -58
- package/rt-tools-ui-kit-v2-0.15.0.tgz +0 -0
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
--rt-toast-shadow-duration: var(--rt-duration-base);
|
|
8
8
|
--rt-toast-leave-duration: var(--rt-duration-slower);
|
|
9
9
|
--rt-toast-fade-duration: var(--rt-duration-fast);
|
|
10
|
+
--rt-toast-severity-color: var(--rt-color-state-info);
|
|
10
11
|
--y: translateY(100%);
|
|
11
12
|
--lift-amount: calc(var(--lift) * var(--gap));
|
|
12
13
|
|
|
@@ -17,11 +18,11 @@
|
|
|
17
18
|
box-sizing: border-box;
|
|
18
19
|
align-items: center;
|
|
19
20
|
padding: var(--rt-space-4);
|
|
20
|
-
border: var(--rt-toast-border-width) solid var(--rt-color-border-subtle);
|
|
21
|
+
border: var(--rt-toast-border-width) solid var(--rt-toast-border-color, var(--rt-color-border-subtle));
|
|
21
22
|
border-radius: var(--rt-toast-radius);
|
|
22
|
-
background: var(--rt-color-bg-surface);
|
|
23
|
+
background: var(--rt-toast-bg, var(--rt-color-bg-surface));
|
|
23
24
|
box-shadow: var(--rt-toast-shadow);
|
|
24
|
-
color: var(--rt-color-text-primary);
|
|
25
|
+
color: var(--rt-toast-color, var(--rt-color-text-primary));
|
|
25
26
|
font-size: var(--rt-text-sm);
|
|
26
27
|
font-weight: var(--rt-font-weight-medium);
|
|
27
28
|
gap: var(--rt-space-2);
|
|
@@ -64,33 +65,52 @@
|
|
|
64
65
|
bottom: 0;
|
|
65
66
|
}
|
|
66
67
|
|
|
68
|
+
/* Цвет важности — частное свойство: его берут значок и полоса срока. */
|
|
69
|
+
&--severity--success {
|
|
70
|
+
--rt-toast-severity-color: var(--rt-color-state-success);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
&--severity--warning {
|
|
74
|
+
--rt-toast-severity-color: var(--rt-color-state-warning);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
&--severity--danger {
|
|
78
|
+
--rt-toast-severity-color: var(--rt-color-state-danger);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Залитый тост читает свои ручки по важности, а не общие: общая ручка фона, заданная
|
|
82
|
+
на корне страницы, иначе перекрасила бы и залитые тосты. Значок идёт за текстом. */
|
|
67
83
|
&--filled {
|
|
68
84
|
.rt-toast__description {
|
|
69
85
|
color: inherit;
|
|
70
86
|
}
|
|
71
87
|
|
|
88
|
+
.rt-toast__icon {
|
|
89
|
+
color: currentcolor;
|
|
90
|
+
}
|
|
91
|
+
|
|
72
92
|
&.rt-toast--severity--info {
|
|
73
|
-
border-color: var(--rt-color-state-info-bg);
|
|
74
|
-
background: var(--rt-color-state-info-bg);
|
|
75
|
-
color: var(--rt-color-state-info);
|
|
93
|
+
border-color: var(--rt-toast-filled-info-border-color, var(--rt-color-state-info-bg));
|
|
94
|
+
background: var(--rt-toast-filled-info-bg, var(--rt-color-state-info-bg));
|
|
95
|
+
color: var(--rt-toast-filled-info-color, var(--rt-color-state-info));
|
|
76
96
|
}
|
|
77
97
|
|
|
78
98
|
&.rt-toast--severity--success {
|
|
79
|
-
border-color: var(--rt-color-state-success-bg);
|
|
80
|
-
background: var(--rt-color-state-success-bg);
|
|
81
|
-
color: var(--rt-color-state-success);
|
|
99
|
+
border-color: var(--rt-toast-filled-success-border-color, var(--rt-color-state-success-bg));
|
|
100
|
+
background: var(--rt-toast-filled-success-bg, var(--rt-color-state-success-bg));
|
|
101
|
+
color: var(--rt-toast-filled-success-color, var(--rt-color-state-success));
|
|
82
102
|
}
|
|
83
103
|
|
|
84
104
|
&.rt-toast--severity--warning {
|
|
85
|
-
border-color: var(--rt-color-state-warning-bg);
|
|
86
|
-
background: var(--rt-color-state-warning-bg);
|
|
87
|
-
color: var(--rt-color-state-warning);
|
|
105
|
+
border-color: var(--rt-toast-filled-warning-border-color, var(--rt-color-state-warning-bg));
|
|
106
|
+
background: var(--rt-toast-filled-warning-bg, var(--rt-color-state-warning-bg));
|
|
107
|
+
color: var(--rt-toast-filled-warning-color, var(--rt-color-state-warning));
|
|
88
108
|
}
|
|
89
109
|
|
|
90
110
|
&.rt-toast--severity--danger {
|
|
91
|
-
border-color: var(--rt-color-state-danger-bg);
|
|
92
|
-
background: var(--rt-color-state-danger-bg);
|
|
93
|
-
color: var(--rt-color-state-danger);
|
|
111
|
+
border-color: var(--rt-toast-filled-danger-border-color, var(--rt-color-state-danger-bg));
|
|
112
|
+
background: var(--rt-toast-filled-danger-bg, var(--rt-color-state-danger-bg));
|
|
113
|
+
color: var(--rt-toast-filled-danger-color, var(--rt-color-state-danger));
|
|
94
114
|
}
|
|
95
115
|
}
|
|
96
116
|
|
|
@@ -152,6 +172,25 @@
|
|
|
152
172
|
|
|
153
173
|
&__icon {
|
|
154
174
|
flex-shrink: 0;
|
|
175
|
+
color: var(--rt-toast-icon-color, var(--rt-toast-severity-color));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* Полоса срока — анимация того же срока, что у таймера, и встаёт от того же признака.
|
|
179
|
+
Она лежит у нижнего края внутри рамки и повторяет нижние скругления. */
|
|
180
|
+
&__progress {
|
|
181
|
+
position: absolute;
|
|
182
|
+
bottom: 0;
|
|
183
|
+
animation: rt-toast-progress var(--lifetime) linear forwards;
|
|
184
|
+
background: var(--rt-toast-progress-color, var(--rt-toast-severity-color));
|
|
185
|
+
block-size: var(--rt-toast-progress-height, var(--rt-space-0-5));
|
|
186
|
+
border-end-end-radius: var(--rt-toast-radius);
|
|
187
|
+
border-end-start-radius: var(--rt-toast-radius);
|
|
188
|
+
inset-inline: 0;
|
|
189
|
+
transform-origin: left center;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
&--paused &__progress {
|
|
193
|
+
animation-play-state: paused;
|
|
155
194
|
}
|
|
156
195
|
|
|
157
196
|
&__content {
|
|
@@ -186,7 +225,17 @@
|
|
|
186
225
|
align-self: flex-start;
|
|
187
226
|
}
|
|
188
227
|
|
|
228
|
+
/* Ручка цвета действия — заливка главной кнопки во всех её состояниях; подпись на ней
|
|
229
|
+
остаётся цветом кита. */
|
|
230
|
+
& &__action:not(.rt-button--text) {
|
|
231
|
+
--rt-btn-bg: var(--rt-toast-action-color, var(--rt-color-action-primary));
|
|
232
|
+
--rt-btn-bg-hover: var(--rt-toast-action-color, var(--rt-color-action-primary-hover));
|
|
233
|
+
--rt-btn-bg-active: var(--rt-toast-action-color, var(--rt-color-action-primary-active));
|
|
234
|
+
}
|
|
235
|
+
|
|
189
236
|
& &__close {
|
|
237
|
+
--rt-icon-button-color: var(--rt-toast-close-color, var(--rt-color-text-primary));
|
|
238
|
+
|
|
190
239
|
flex-shrink: 0;
|
|
191
240
|
align-self: flex-start;
|
|
192
241
|
margin-inline-start: auto;
|
|
@@ -207,4 +256,14 @@
|
|
|
207
256
|
}
|
|
208
257
|
}
|
|
209
258
|
}
|
|
259
|
+
|
|
260
|
+
@keyframes rt-toast-progress {
|
|
261
|
+
from {
|
|
262
|
+
transform: scaleX(1);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
to {
|
|
266
|
+
transform: scaleX(0);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
210
269
|
}
|
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
--width: 356px;
|
|
4
4
|
--toaster-offset: 32px;
|
|
5
5
|
|
|
6
|
+
/* Слой — своё свойство на шаге шкалы: шаг `sticky` и есть прежние 1100, а приложение,
|
|
7
|
+
которому тост нужен поверх диалога, перебивает свойство правилом на своём теге. */
|
|
8
|
+
--rt-toaster-z-index: var(--rt-z-sticky);
|
|
9
|
+
|
|
6
10
|
position: fixed;
|
|
7
|
-
z-index:
|
|
11
|
+
z-index: var(--rt-toaster-z-index);
|
|
8
12
|
width: var(--width);
|
|
9
13
|
box-sizing: border-box;
|
|
10
14
|
padding: 0;
|
|
@@ -10,31 +10,46 @@
|
|
|
10
10
|
(sm 30 / md 40 / lg 50px).
|
|
11
11
|
Цвета — только семантические --rt-* токены. */
|
|
12
12
|
|
|
13
|
+
/* Свойства объявлены на хосте: правило приложения на теге переопределяет их, а ступени
|
|
14
|
+
размера — тоже правила хоста, по модификатору на нём самом.
|
|
15
|
+
|
|
16
|
+
Дорожка берёт приглушённую поверхность, а не ближайшую по светлоте ступень:
|
|
17
|
+
прежний код цвета стоял почти на уровне белого, а отличаться дорожка обязана
|
|
18
|
+
именно от активного сегмента, который белым и покрашен. Default size = sm. */
|
|
13
19
|
rt-toggle-button-group {
|
|
20
|
+
--rt-toggle-button-group-track-bg: var(--rt-color-bg-surface-subtle);
|
|
21
|
+
--rt-toggle-button-group-active-bg: var(--rt-color-bg-surface);
|
|
22
|
+
--rt-toggle-button-group-height: 30px;
|
|
23
|
+
--rt-toggle-button-group-transition-duration: var(--rt-duration-fast);
|
|
24
|
+
--rt-toggle-button-group-focus-shadow: var(--rt-shadow-focus-ring);
|
|
25
|
+
--rt-toggle-button-group-track-padding: 4px;
|
|
26
|
+
--rt-toggle-button-group-track-radius: var(--rt-radius-md);
|
|
27
|
+
--rt-toggle-button-group-btn-padding: 0 8px;
|
|
28
|
+
--rt-toggle-button-group-btn-radius: var(--rt-radius-ms);
|
|
29
|
+
--rt-toggle-button-group-btn-gap: 4px;
|
|
30
|
+
--rt-toggle-button-group-btn-font-size: 12px;
|
|
31
|
+
--rt-toggle-button-group-btn-line-height: 14px;
|
|
32
|
+
|
|
14
33
|
display: inline-flex;
|
|
15
34
|
|
|
16
|
-
/*
|
|
17
|
-
|
|
35
|
+
/* Размерные тиры — общая высота совпадает с rt-button (sm/md/lg). */
|
|
36
|
+
&.rt-toggle-button-group--md {
|
|
37
|
+
--rt-toggle-button-group-height: 40px;
|
|
38
|
+
--rt-toggle-button-group-btn-padding: 0 14px;
|
|
39
|
+
--rt-toggle-button-group-btn-gap: 6px;
|
|
40
|
+
--rt-toggle-button-group-btn-font-size: 14px;
|
|
41
|
+
--rt-toggle-button-group-btn-line-height: 16px;
|
|
42
|
+
}
|
|
18
43
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
44
|
+
&.rt-toggle-button-group--lg {
|
|
45
|
+
--rt-toggle-button-group-height: 50px;
|
|
46
|
+
--rt-toggle-button-group-btn-padding: 0 20px;
|
|
47
|
+
--rt-toggle-button-group-btn-gap: 8px;
|
|
48
|
+
--rt-toggle-button-group-btn-font-size: 16px;
|
|
49
|
+
--rt-toggle-button-group-btn-line-height: 18px;
|
|
50
|
+
}
|
|
24
51
|
|
|
25
52
|
.rt-toggle-button-group {
|
|
26
|
-
/* Default size = sm. md/lg переопределяют ниже. */
|
|
27
|
-
--rt-toggle-button-group-height: 30px;
|
|
28
|
-
--rt-toggle-button-group-transition-duration: var(--rt-duration-fast);
|
|
29
|
-
--rt-toggle-button-group-focus-shadow: var(--rt-shadow-focus-ring);
|
|
30
|
-
--rt-toggle-button-group-track-padding: 4px;
|
|
31
|
-
--rt-toggle-button-group-track-radius: var(--rt-radius-md);
|
|
32
|
-
--rt-toggle-button-group-btn-padding: 0 8px;
|
|
33
|
-
--rt-toggle-button-group-btn-radius: var(--rt-radius-ms);
|
|
34
|
-
--rt-toggle-button-group-btn-gap: 4px;
|
|
35
|
-
--rt-toggle-button-group-btn-font-size: 12px;
|
|
36
|
-
--rt-toggle-button-group-btn-line-height: 14px;
|
|
37
|
-
|
|
38
53
|
display: inline-flex;
|
|
39
54
|
height: var(--rt-toggle-button-group-height);
|
|
40
55
|
box-sizing: border-box;
|
|
@@ -97,30 +112,13 @@
|
|
|
97
112
|
flex-shrink: 0;
|
|
98
113
|
}
|
|
99
114
|
|
|
100
|
-
/* Размерные тиры — общая высота совпадает с rt-button (sm/md/lg). */
|
|
101
|
-
&--md {
|
|
102
|
-
--rt-toggle-button-group-height: 40px;
|
|
103
|
-
--rt-toggle-button-group-btn-padding: 0 14px;
|
|
104
|
-
--rt-toggle-button-group-btn-gap: 6px;
|
|
105
|
-
--rt-toggle-button-group-btn-font-size: 14px;
|
|
106
|
-
--rt-toggle-button-group-btn-line-height: 16px;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
&--lg {
|
|
110
|
-
--rt-toggle-button-group-height: 50px;
|
|
111
|
-
--rt-toggle-button-group-btn-padding: 0 20px;
|
|
112
|
-
--rt-toggle-button-group-btn-gap: 8px;
|
|
113
|
-
--rt-toggle-button-group-btn-font-size: 16px;
|
|
114
|
-
--rt-toggle-button-group-btn-line-height: 18px;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
115
|
&--disabled {
|
|
118
116
|
opacity: 0.5;
|
|
119
117
|
}
|
|
120
118
|
}
|
|
121
119
|
|
|
122
120
|
/* Шаг входа `radius` переназначает скругление дорожки; сегменты держат своё. */
|
|
123
|
-
@include kv.radius-steps('--rt-toggle-button-group-track-radius'
|
|
121
|
+
@include kv.radius-steps('--rt-toggle-button-group-track-radius');
|
|
124
122
|
}
|
|
125
123
|
|
|
126
124
|
/* full-width: группа растягивается на контейнер, опции делят ширину поровну. */
|
|
@@ -8,17 +8,25 @@
|
|
|
8
8
|
| -------------------- | ---------------------- | --------- |
|
|
9
9
|
| `inputId` | `string \| null` | `null` |
|
|
10
10
|
| `ariaLabel` | `string \| null` | `null` |
|
|
11
|
+
| `label` | `string \| null` | `null` |
|
|
11
12
|
| `size` | `'sm' \| 'md' \| 'lg'` | `'sm'` |
|
|
12
13
|
| `iconOff` / `iconOn` | `IRtIcon.Name \| null` | `null` |
|
|
13
14
|
| `disabled` | `boolean` | `false` |
|
|
14
15
|
|
|
15
|
-
Значение — `boolean` через `ControlValueAccessor`.
|
|
16
|
+
Значение — `boolean` через `ControlValueAccessor`. Подпись на экране рисует только вход `label`.
|
|
16
17
|
|
|
17
18
|
## Главное, что нужно знать
|
|
18
19
|
|
|
19
20
|
**`role="switch"`, а не `checkbox`.** Скринридер произносит «switch off/on» вместо «checkbox
|
|
20
|
-
unchecked» — для тумблера это точнее.
|
|
21
|
-
|
|
21
|
+
unchecked» — для тумблера это точнее. Имя даёт вход `label`, вход `ariaLabel` или внешний
|
|
22
|
+
`<label for>` через `inputId`.
|
|
23
|
+
|
|
24
|
+
**Подпись `label` — `<label>`, связанный с кнопкой.** Нажатие на неё переключает, кнопка ссылается
|
|
25
|
+
на неё через `aria-labelledby`. Без входа разметка прежняя: ни подписи, ни своего id.
|
|
26
|
+
|
|
27
|
+
**Свойства размеров и подписи объявлены на хосте.** Ступени размера — правила хоста по его
|
|
28
|
+
модификатору, прозрачность отключения `--rt-toggle-disabled-opacity` гасит и подпись. Правило
|
|
29
|
+
приложения на теге перебивает и ступень.
|
|
22
30
|
|
|
23
31
|
## Как этим пользоваться
|
|
24
32
|
|
|
@@ -6,17 +6,20 @@
|
|
|
6
6
|
и на `<rt-toggle-switch>`, и на корне шаблона, поэтому правила блока вложены в хост —
|
|
7
7
|
так они достаются только корню шаблона. */
|
|
8
8
|
|
|
9
|
+
/* Свойства объявлены на хосте: правило приложения на теге переопределяет их, а
|
|
10
|
+
ступени размера — тоже правила хоста, по модификатору на нём самом. Имена подписи
|
|
11
|
+
не повторяют первый кит: у его переключателя свои `--rt-toggle-label-*`. */
|
|
9
12
|
rt-toggle-switch {
|
|
10
|
-
display: inline-flex;
|
|
11
|
-
|
|
12
|
-
/* Шаг входа `radius` переназначает скругление дорожки, ручка идёт за ней. */
|
|
13
|
-
@include kv.radius-steps('--rt-toggle-radius', '> .rt-toggle-switch');
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
rt-toggle-switch .rt-toggle-switch {
|
|
17
13
|
--rt-toggle-radius: var(--rt-radius-full);
|
|
18
14
|
--rt-toggle-focus-shadow: var(--rt-shadow-focus-ring);
|
|
19
15
|
--rt-toggle-transition-duration: var(--rt-duration-fast);
|
|
16
|
+
--rt-toggle-disabled-opacity: 0.5;
|
|
17
|
+
--rt-toggle-justify: flex-start;
|
|
18
|
+
--rt-toggle-label-gap: var(--rt-space-2);
|
|
19
|
+
--rt-toggle-label-size: var(--rt-text-sm);
|
|
20
|
+
--rt-toggle-label-color-off: var(--rt-color-text-muted);
|
|
21
|
+
--rt-toggle-label-color-on: var(--rt-color-text-primary);
|
|
22
|
+
--rt-toggle-label-color-hover: var(--rt-color-text-primary);
|
|
20
23
|
|
|
21
24
|
/* Геометрия размера. База — `sm`; модификаторы перекрывают только числа,
|
|
22
25
|
правила ниже к размерам не привязаны. `thumb-travel` держим явным
|
|
@@ -29,17 +32,16 @@
|
|
|
29
32
|
--rt-toggle-icon-inset: 4px;
|
|
30
33
|
|
|
31
34
|
display: inline-flex;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
cursor: pointer;
|
|
35
|
+
align-items: center;
|
|
36
|
+
justify-content: var(--rt-toggle-justify);
|
|
37
|
+
gap: var(--rt-toggle-label-gap);
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
&.rt-toggle-switch--md {
|
|
38
40
|
--rt-toggle-track-width: 52px;
|
|
39
41
|
--rt-toggle-thumb-travel: 28px;
|
|
40
42
|
}
|
|
41
43
|
|
|
42
|
-
|
|
44
|
+
&.rt-toggle-switch--lg {
|
|
43
45
|
--rt-toggle-track-width: 60px;
|
|
44
46
|
--rt-toggle-track-height: 30px;
|
|
45
47
|
--rt-toggle-thumb-size: 24px;
|
|
@@ -47,6 +49,22 @@
|
|
|
47
49
|
--rt-toggle-icon-inset: 6px;
|
|
48
50
|
}
|
|
49
51
|
|
|
52
|
+
/* Прозрачность — на хосте: подпись гаснет вместе с переключателем. */
|
|
53
|
+
&.rt-toggle-switch--disabled {
|
|
54
|
+
opacity: var(--rt-toggle-disabled-opacity);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Шаг входа `radius` переназначает скругление дорожки, ручка идёт за ней. */
|
|
58
|
+
@include kv.radius-steps('--rt-toggle-radius');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
rt-toggle-switch .rt-toggle-switch {
|
|
62
|
+
display: inline-flex;
|
|
63
|
+
padding: 0;
|
|
64
|
+
border: none;
|
|
65
|
+
background: none;
|
|
66
|
+
cursor: pointer;
|
|
67
|
+
|
|
50
68
|
&:focus-visible {
|
|
51
69
|
border-radius: var(--rt-toggle-radius);
|
|
52
70
|
box-shadow: var(--rt-toggle-focus-shadow);
|
|
@@ -56,7 +74,6 @@
|
|
|
56
74
|
|
|
57
75
|
&--disabled {
|
|
58
76
|
cursor: not-allowed;
|
|
59
|
-
opacity: 0.5;
|
|
60
77
|
}
|
|
61
78
|
|
|
62
79
|
&__track {
|
|
@@ -114,5 +131,27 @@
|
|
|
114
131
|
&--on .rt-toggle-switch__thumb {
|
|
115
132
|
transform: translateX(var(--rt-toggle-thumb-travel));
|
|
116
133
|
}
|
|
134
|
+
|
|
135
|
+
&__label {
|
|
136
|
+
color: var(--rt-toggle-label-color-off);
|
|
137
|
+
cursor: pointer;
|
|
138
|
+
font-size: var(--rt-toggle-label-size);
|
|
139
|
+
transition: color var(--rt-toggle-transition-duration) ease;
|
|
140
|
+
user-select: none;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* Состояния подписи — по модификаторам хоста: подпись стоит рядом с кнопкой, не в ней.
|
|
145
|
+
Наведение ниже включённого: под курсором подпись берёт свой цвет и у включённого. */
|
|
146
|
+
rt-toggle-switch.rt-toggle-switch--on .rt-toggle-switch__label {
|
|
147
|
+
color: var(--rt-toggle-label-color-on);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
rt-toggle-switch:not(.rt-toggle-switch--disabled):hover .rt-toggle-switch__label {
|
|
151
|
+
color: var(--rt-toggle-label-color-hover);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
rt-toggle-switch.rt-toggle-switch--disabled .rt-toggle-switch__label {
|
|
155
|
+
cursor: not-allowed;
|
|
117
156
|
}
|
|
118
157
|
}
|
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
@layer rt-kit.components {
|
|
2
2
|
.rt-toolbar {
|
|
3
|
-
/*
|
|
3
|
+
/* Раскладка полосы — свойства блока: обёртка и приложение переставляют их снаружи.
|
|
4
|
+
Высота — наименьшая: полоса, стёкшая в колонку на узком экране, не обрезается. */
|
|
4
5
|
--rt-toolbar-padding-top: var(--rt-space-2);
|
|
5
6
|
--rt-toolbar-padding-bottom: var(--rt-space-2);
|
|
7
|
+
--rt-toolbar-padding-inline: 0;
|
|
8
|
+
--rt-toolbar-height: auto;
|
|
9
|
+
--rt-toolbar-border-bottom: none;
|
|
10
|
+
--rt-toolbar-gap: var(--rt-space-2);
|
|
11
|
+
--rt-toolbar-center-justify: flex-end;
|
|
12
|
+
--rt-toolbar-center-overflow: visible;
|
|
6
13
|
|
|
7
14
|
display: block;
|
|
8
15
|
|
|
9
16
|
&__bars {
|
|
10
17
|
display: flex;
|
|
11
18
|
width: 100%;
|
|
19
|
+
min-height: var(--rt-toolbar-height);
|
|
20
|
+
box-sizing: border-box;
|
|
12
21
|
flex-direction: row;
|
|
13
22
|
align-items: center;
|
|
14
23
|
justify-content: space-between;
|
|
15
|
-
padding: var(--rt-toolbar-padding-top)
|
|
16
|
-
|
|
24
|
+
padding: var(--rt-toolbar-padding-top) var(--rt-toolbar-padding-inline) var(--rt-toolbar-padding-bottom);
|
|
25
|
+
border-bottom: var(--rt-toolbar-border-bottom);
|
|
26
|
+
gap: var(--rt-toolbar-gap);
|
|
17
27
|
}
|
|
18
28
|
|
|
19
29
|
&__bar {
|
|
@@ -29,8 +39,9 @@
|
|
|
29
39
|
}
|
|
30
40
|
|
|
31
41
|
&--center {
|
|
42
|
+
overflow: var(--rt-toolbar-center-overflow);
|
|
32
43
|
flex: 1 1 auto;
|
|
33
|
-
justify-content:
|
|
44
|
+
justify-content: var(--rt-toolbar-center-justify);
|
|
34
45
|
gap: var(--rt-space-2);
|
|
35
46
|
|
|
36
47
|
// Контрол-фильтр (поиск/селект) занимает ширину center и право-
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
<rt-icon-button icon="ico-trash" ariaLabel="Удалить" tooltip="Удалить" />
|
|
6
6
|
```
|
|
7
7
|
|
|
8
|
-
| вход
|
|
9
|
-
|
|
|
10
|
-
| `rtTooltip`
|
|
11
|
-
| `rtTooltipPlacement`
|
|
8
|
+
| вход | тип | умолчание |
|
|
9
|
+
| ------------------------ | ------------------------------------------------ | ----------------------------------------------- |
|
|
10
|
+
| `rtTooltip` | `string \| null \| undefined` | `''` |
|
|
11
|
+
| `rtTooltipPlacement` | `'top' \| 'bottom' \| 'left' \| 'right' \| null` | `null` — сверху, под материальным набором снизу |
|
|
12
|
+
| `rtTooltipWhenTruncated` | `boolean` | `false` — подсказка только у обрезанного текста |
|
|
12
13
|
|
|
13
14
|
Выходов нет. Панель — `rt-tooltip` в оверлее CDK, `role="tooltip"`.
|
|
14
15
|
|
|
@@ -26,6 +27,8 @@ no-op, а не пустая панель под курсором. Поэтому
|
|
|
26
27
|
|
|
27
28
|
- Показывают и наведение, и фокус с клавиатуры; прячут уход курсора, потеря фокуса и **клик**
|
|
28
29
|
(панель мешала бы смотреть на результат нажатия).
|
|
30
|
+
- Фокус, поставленный мышью или кодом, подсказку не показывает: меню возвращает фокус кнопке после
|
|
31
|
+
выбора пункта, и подсказка кнопки всплывала бы поверх того, что пункт открыл.
|
|
29
32
|
- `rt-icon-button` уже несёт эту директиву — там достаточно входа `tooltip`.
|
|
30
33
|
- Подсказка не заменяет `aria-label`: она вспомогательная, а имя контрола задаётся отдельно.
|
|
31
34
|
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
Основные входы: `messages`, `hasThread`, `canReply`, `replyBlockReason`, `loading`, `fetching`,
|
|
19
|
-
`sending`, `attachments`, `accept`, `formatting`, `title`, `showRefresh`, `showExpand`, `fill
|
|
20
|
-
Выходы: `send`, `refresh` и события по сообщениям (повтор, удаление).
|
|
19
|
+
`sending`, `attachments`, `accept`, `formatting`, `title`, `showRefresh`, `showExpand`, `fill`,
|
|
20
|
+
`typingText`. Выходы: `send`, `refresh`, `typing` и события по сообщениям (повтор, удаление).
|
|
21
21
|
|
|
22
22
|
## Главное, что нужно знать
|
|
23
23
|
|
|
@@ -35,6 +35,11 @@ rtChatMessageActions let-message>` рисуется в меню «…» у ре
|
|
|
35
35
|
**Поле ответа гейтится `canReply`.** Когда отвечать нельзя, вместо него рисуется причина
|
|
36
36
|
из `replyBlockReason`.
|
|
37
37
|
|
|
38
|
+
**Набор текста уходит наружу одним событием на отрезок.** `typing` шлёт `true`, когда человек начал
|
|
39
|
+
набирать, и `false` на пустом поле, при отправке и после 3 секунд без ввода — в обоих режимах поля.
|
|
40
|
+
Что печатает вторая сторона, показывает `typingText`: плашка стоит поверх низа ленты и места не
|
|
41
|
+
занимает, пустая строка её прячет. Текст и перевод даёт приложение.
|
|
42
|
+
|
|
38
43
|
**Удалённое сообщение остаётся в ленте** отдельной пометкой вместо текста: иначе непонятно, на
|
|
39
44
|
что отвечали соседние реплики.
|
|
40
45
|
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
--rt-chat-bubble-radius: var(--rt-radius-lg);
|
|
4
4
|
--rt-chat-message-border-width: var(--rt-border-width-thin);
|
|
5
5
|
--rt-chat-transition-duration: var(--rt-duration-fast);
|
|
6
|
+
--rt-chat-typing-radius: var(--rt-radius-full);
|
|
7
|
+
--rt-chat-typing-shadow: var(--rt-shadow-sm);
|
|
6
8
|
|
|
7
9
|
display: flex;
|
|
8
10
|
flex-direction: column;
|
|
@@ -114,6 +116,29 @@
|
|
|
114
116
|
inset: 0;
|
|
115
117
|
}
|
|
116
118
|
|
|
119
|
+
// Строка «печатает» стоит поверх низа ленты и места не занимает: лента не сдвигается, а чат
|
|
120
|
+
// без строки не меняется ни на пиксель. Пустой узел остаётся в разметке — иначе программа
|
|
121
|
+
// чтения с экрана не объявит первую строку.
|
|
122
|
+
&__typing {
|
|
123
|
+
position: absolute;
|
|
124
|
+
z-index: 1;
|
|
125
|
+
bottom: var(--rt-space-1);
|
|
126
|
+
left: var(--rt-space-2);
|
|
127
|
+
box-sizing: border-box;
|
|
128
|
+
color: var(--rt-color-text-muted);
|
|
129
|
+
font-size: var(--rt-text-xs);
|
|
130
|
+
max-inline-size: calc(100% - 2 * var(--rt-space-2));
|
|
131
|
+
overflow-wrap: anywhere;
|
|
132
|
+
pointer-events: none;
|
|
133
|
+
|
|
134
|
+
&--shown {
|
|
135
|
+
padding: var(--rt-space-0-5) var(--rt-space-2);
|
|
136
|
+
border-radius: var(--rt-chat-typing-radius);
|
|
137
|
+
background: var(--rt-color-bg-surface);
|
|
138
|
+
box-shadow: var(--rt-chat-typing-shadow);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
117
142
|
&__footer-slot {
|
|
118
143
|
display: flex;
|
|
119
144
|
flex-direction: column;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
@use 'sass:map';
|
|
2
|
+
@use 'sass:list';
|
|
3
|
+
@use 'sass:meta';
|
|
4
|
+
|
|
5
|
+
/* A colour scheme — the brand ramp under its own name, switched on by `data-rt-scheme` on `<html>`,
|
|
6
|
+
as in the first kit.
|
|
7
|
+
|
|
8
|
+
The scheme rewrites the steps, not the assignments: the accent of the own set derives from
|
|
9
|
+
`--rt-brand-*`, the accent of the material set from `--rt-mat-blue-100`, and the dark theme refers to
|
|
10
|
+
the same steps. So one ramp repaints every look the kit is drawn in, and the names the components
|
|
11
|
+
read stay untouched.
|
|
12
|
+
|
|
13
|
+
The scheme answers on the root only. A value referring to a step is resolved where it is declared,
|
|
14
|
+
and the assignments are declared on the root: a scheme on an inner node would change the steps under
|
|
15
|
+
assignments already resolved, and the piece would keep the old accent.
|
|
16
|
+
|
|
17
|
+
A Material theme of the application wins over the scheme in the material set: its `--mat-sys-primary`
|
|
18
|
+
stands in front of the step in that set's assignments.
|
|
19
|
+
|
|
20
|
+
Usage:
|
|
21
|
+
@use '@rt-tools/ui-kit-v2/styles/color-scheme' as rt;
|
|
22
|
+
@include rt.rt-color-scheme('teal', (50: #e6f4f3, …, 500: #008582, …, 950: #00201f));
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
$brand-steps: (50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950);
|
|
26
|
+
|
|
27
|
+
@mixin rt-color-scheme($name, $ramp) {
|
|
28
|
+
@if meta.type-of($name) != 'string' {
|
|
29
|
+
@error 'rt-color-scheme: the name must be a string, got #{meta.type-of($name)}.';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@if meta.type-of($ramp) != 'map' or not map.has-key($ramp, 500) {
|
|
33
|
+
@error 'rt-color-scheme("#{$name}"): the ramp is a map of (step: colour) and holds at least the step 500 — the brand colour.';
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@each $step, $value in $ramp {
|
|
37
|
+
@if not list.index($brand-steps, $step) {
|
|
38
|
+
@error 'rt-color-scheme("#{$name}"): unknown step #{$step}. Allowed: #{$brand-steps}.';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* `:root[…]` (0,2,0) outranks the steps on `:root` (0,1,0) whatever the order of the sources. */
|
|
43
|
+
:root[data-rt-scheme='#{$name}'] {
|
|
44
|
+
@each $step, $value in $ramp {
|
|
45
|
+
--rt-brand-#{$step}: #{$value};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
--rt-mat-blue-100: #{map.get($ramp, 500)};
|
|
49
|
+
}
|
|
50
|
+
}
|
package/styles/tokens.css
CHANGED
|
@@ -6798,6 +6798,25 @@ html.rt-theme-dark.rt-preset-material {
|
|
|
6798
6798
|
justify-content: center;
|
|
6799
6799
|
font-size: var(--rt-btn-icon-size);
|
|
6800
6800
|
}
|
|
6801
|
+
.rt-button {
|
|
6802
|
+
/* Лигатура шрифта Material Symbols для имени без пары — размер ей даёт `__icon` рядом.
|
|
6803
|
+
Шрифт подключает приложение, семью можно переназначить свойством сверху. До готовности
|
|
6804
|
+
шрифтов лигатура скрыта: иначе на её месте видно слово. */
|
|
6805
|
+
}
|
|
6806
|
+
.rt-button__glyph {
|
|
6807
|
+
overflow: hidden;
|
|
6808
|
+
font-family: var(--rt-icon-glyph-font, "Material Symbols Outlined"), sans-serif;
|
|
6809
|
+
font-feature-settings: "liga";
|
|
6810
|
+
font-style: normal;
|
|
6811
|
+
font-weight: var(--rt-font-weight-regular);
|
|
6812
|
+
letter-spacing: normal;
|
|
6813
|
+
line-height: 1;
|
|
6814
|
+
text-transform: none;
|
|
6815
|
+
white-space: nowrap;
|
|
6816
|
+
}
|
|
6817
|
+
.rt-button__glyph--pending {
|
|
6818
|
+
visibility: hidden;
|
|
6819
|
+
}
|
|
6801
6820
|
.rt-button__label {
|
|
6802
6821
|
display: inline-flex;
|
|
6803
6822
|
align-items: center;
|
|
@@ -6973,6 +6992,22 @@ html.rt-theme-dark.rt-preset-material {
|
|
|
6973
6992
|
cursor: wait;
|
|
6974
6993
|
pointer-events: none;
|
|
6975
6994
|
}
|
|
6995
|
+
.rt-button {
|
|
6996
|
+
/* Подпись спрятана на время загрузки: содержимое гаснет прозрачностью, а не
|
|
6997
|
+
`visibility` — так оно держит ширину и остаётся именем кнопки для скринридера.
|
|
6998
|
+
Загрузчик встаёт поверх по центру. */
|
|
6999
|
+
}
|
|
7000
|
+
.rt-button--loading-label-hidden {
|
|
7001
|
+
position: relative;
|
|
7002
|
+
}
|
|
7003
|
+
.rt-button--loading-label-hidden > :not(.rt-button__loader) {
|
|
7004
|
+
opacity: 0;
|
|
7005
|
+
}
|
|
7006
|
+
.rt-button__loader {
|
|
7007
|
+
position: absolute;
|
|
7008
|
+
margin: auto;
|
|
7009
|
+
inset: 0;
|
|
7010
|
+
}
|
|
6976
7011
|
.rt-button {
|
|
6977
7012
|
/* Состояние стоит ниже всех вариантов оформления и палитры того же блока.
|
|
6978
7013
|
Специфичность у них равная, и правила равной силы разбираются порядком в
|