@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
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* rt-side-menu-sub-item — строка подменю бокового меню. ViewEncapsulation.None.
|
|
3
|
+
Host несёт класс блока; строка — ссылка или кнопка папки. */
|
|
4
|
+
|
|
5
|
+
.rt-side-menu-sub-item {
|
|
6
|
+
--rt-side-menu-sub-item-radius: var(--rt-radius-full);
|
|
7
|
+
--rt-side-menu-sub-item-transition-duration: var(--rt-duration-fast);
|
|
8
|
+
|
|
9
|
+
/* Маркер совпадения поиска — жёлтая подложка с тёмной подписью в обеих темах, как у первого кита. */
|
|
10
|
+
--rt-side-menu-sub-item-match-bg: var(--rt-yellow-400);
|
|
11
|
+
--rt-side-menu-sub-item-match-color: var(--rt-neutral-950);
|
|
12
|
+
--rt-side-menu-sub-item-match-radius: var(--rt-radius-xs);
|
|
13
|
+
|
|
14
|
+
display: block;
|
|
15
|
+
|
|
16
|
+
&__row {
|
|
17
|
+
/* Глубину вложения ставит шаблон на саму строку; здесь — значение строки верхнего уровня. */
|
|
18
|
+
--rt-side-menu-sub-item-depth: 0;
|
|
19
|
+
|
|
20
|
+
display: flex;
|
|
21
|
+
width: 100%;
|
|
22
|
+
min-height: var(--rt-control-height-md);
|
|
23
|
+
box-sizing: border-box;
|
|
24
|
+
align-items: center;
|
|
25
|
+
border: 0;
|
|
26
|
+
border-radius: var(--rt-side-menu-sub-item-radius);
|
|
27
|
+
background: transparent;
|
|
28
|
+
color: var(--rt-color-text-primary);
|
|
29
|
+
cursor: pointer;
|
|
30
|
+
font: inherit;
|
|
31
|
+
font-size: var(--rt-text-sm);
|
|
32
|
+
gap: var(--rt-space-sm);
|
|
33
|
+
padding-block: var(--rt-space-2);
|
|
34
|
+
padding-inline: calc(var(--rt-space-md) * (1 + var(--rt-side-menu-sub-item-depth))) var(--rt-space-sm);
|
|
35
|
+
text-align: start;
|
|
36
|
+
text-decoration: none;
|
|
37
|
+
transition: background-color var(--rt-side-menu-sub-item-transition-duration) ease;
|
|
38
|
+
|
|
39
|
+
&:hover,
|
|
40
|
+
&:active,
|
|
41
|
+
&--highlighted {
|
|
42
|
+
background: var(--rt-color-bg-hover);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
&:focus-visible {
|
|
46
|
+
outline: var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);
|
|
47
|
+
outline-offset: calc(var(--rt-focus-ring-width) * -1);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Активна строка со ссылкой; у папки активность видна по её раскрытым пунктам. */
|
|
51
|
+
&--active {
|
|
52
|
+
background: var(--rt-color-action-primary-subtle);
|
|
53
|
+
color: var(--rt-color-action-primary-on-surface);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
&__icon {
|
|
58
|
+
flex-shrink: 0;
|
|
59
|
+
color: inherit;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Свой значок приложения: коробка держит размер значка строки и её цвет, рисунок внутри
|
|
63
|
+
занимает её целиком и красится через currentColor. */
|
|
64
|
+
&__own-icon {
|
|
65
|
+
--rt-side-menu-sub-item-own-icon-size: var(--rt-size-4);
|
|
66
|
+
|
|
67
|
+
display: inline-flex;
|
|
68
|
+
width: var(--rt-side-menu-sub-item-own-icon-size);
|
|
69
|
+
height: var(--rt-side-menu-sub-item-own-icon-size);
|
|
70
|
+
flex-shrink: 0;
|
|
71
|
+
align-items: center;
|
|
72
|
+
justify-content: center;
|
|
73
|
+
color: inherit;
|
|
74
|
+
line-height: 1;
|
|
75
|
+
|
|
76
|
+
> * {
|
|
77
|
+
max-width: 100%;
|
|
78
|
+
max-height: 100%;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Подпись режется многоточием, полное имя — в подсказке. */
|
|
83
|
+
&__title {
|
|
84
|
+
overflow: hidden;
|
|
85
|
+
min-width: 0;
|
|
86
|
+
flex: 1 1 auto;
|
|
87
|
+
text-overflow: ellipsis;
|
|
88
|
+
white-space: nowrap;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
&__part {
|
|
92
|
+
color: inherit;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
&__match {
|
|
96
|
+
border-radius: var(--rt-side-menu-sub-item-match-radius);
|
|
97
|
+
background: var(--rt-side-menu-sub-item-match-bg);
|
|
98
|
+
color: var(--rt-side-menu-sub-item-match-color);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Кнопка потребителя — круг, как у первого кита: рамка круга прозрачна в покое и
|
|
102
|
+
проявляется под указателем. Рамка — обводкой, а не границей: граница раздвинула бы
|
|
103
|
+
кнопку, и «+» ушёл бы со столбца шевронов. */
|
|
104
|
+
&__action {
|
|
105
|
+
--rt-side-menu-sub-item-action-ring-width: var(--rt-border-width-thin);
|
|
106
|
+
--rt-side-menu-sub-item-action-radius: var(--rt-radius-full);
|
|
107
|
+
|
|
108
|
+
flex-shrink: 0;
|
|
109
|
+
border-radius: var(--rt-side-menu-sub-item-action-radius);
|
|
110
|
+
outline: var(--rt-side-menu-sub-item-action-ring-width) solid transparent;
|
|
111
|
+
outline-offset: calc(var(--rt-side-menu-sub-item-action-ring-width) * -1);
|
|
112
|
+
|
|
113
|
+
&:hover {
|
|
114
|
+
outline-color: var(--rt-color-border-strong);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Кнопка избранного: звезда у пункта раздела и «убрать» у строки блока. Закрашенная звезда
|
|
119
|
+
видна всегда — выбранное читается с одного взгляда; остальные — под наведением и фокусом
|
|
120
|
+
клавиатуры своей строки, а где указатель не умеет наводиться, — всегда. Прячется
|
|
121
|
+
прозрачностью: кнопка остаётся на месте и в порядке Tab. */
|
|
122
|
+
&__favorite {
|
|
123
|
+
flex-shrink: 0;
|
|
124
|
+
opacity: 0;
|
|
125
|
+
|
|
126
|
+
&--on {
|
|
127
|
+
--rt-icon-button-color: var(--rt-color-action-primary);
|
|
128
|
+
|
|
129
|
+
opacity: 1;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* Корзина под указателем и под фокусом клавиатуры краснеет: нажатие убирает пункт. */
|
|
133
|
+
@media (hover: hover) {
|
|
134
|
+
&--remove:hover {
|
|
135
|
+
--rt-icon-button-color: var(--rt-color-state-danger);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
&--remove:has(:focus-visible) {
|
|
140
|
+
--rt-icon-button-color: var(--rt-color-state-danger);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
@media (hover: none) {
|
|
144
|
+
opacity: 1;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
&__row:hover &__favorite,
|
|
149
|
+
&__row:focus-visible &__favorite,
|
|
150
|
+
&__row:has(:focus-visible) &__favorite {
|
|
151
|
+
opacity: 1;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* Папка — раскрывающаяся панель кита в простом виде. Её заголовок оформлен как строка со
|
|
155
|
+
ссылкой: те же высота, скругление, отступ глубины и подсветка ходьбы стрелками; шеврон
|
|
156
|
+
панели стоит в столбце кнопок строк, и «+» соседних строк с ним на одной вертикали.
|
|
157
|
+
Свойства переназначены правилом двух классов: так они сильнее значений самой панели,
|
|
158
|
+
объявленных на том же узле, а вложенная папка объявляет свои заново. */
|
|
159
|
+
&__folder.rt-expansion-panel {
|
|
160
|
+
--rt-expansion-panel-duration: var(--rt-side-menu-sub-item-transition-duration);
|
|
161
|
+
--rt-expansion-panel-header-radius: var(--rt-side-menu-sub-item-radius);
|
|
162
|
+
--rt-expansion-panel-header-min-height: var(--rt-control-height-md);
|
|
163
|
+
--rt-expansion-panel-header-padding-block: var(--rt-space-2);
|
|
164
|
+
--rt-expansion-panel-header-padding-start: calc(var(--rt-space-md) * (1 + var(--rt-side-menu-sub-item-depth)));
|
|
165
|
+
--rt-expansion-panel-header-padding-end: var(--rt-space-sm);
|
|
166
|
+
--rt-expansion-panel-header-gap: var(--rt-space-sm);
|
|
167
|
+
--rt-expansion-panel-header-font-size: var(--rt-text-sm);
|
|
168
|
+
--rt-expansion-panel-header-bg: transparent;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
&__folder--highlighted.rt-expansion-panel {
|
|
172
|
+
--rt-expansion-panel-header-bg: var(--rt-color-bg-hover);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
&__children {
|
|
176
|
+
display: flex;
|
|
177
|
+
flex-direction: column;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/* Меню с `favoriteActionsReserve="none"`: кнопка избранного, ждущая наведения, в покое не
|
|
182
|
+
занимает ширины, и подпись идёт до края или до кнопки потребителя; отступ ряда перед ней
|
|
183
|
+
снимается тоже. Закрашенная звезда и экран без наведения держат место: там кнопка видна
|
|
184
|
+
всегда. Сжата, а не снята с раскладки: остаётся в порядке Tab. */
|
|
185
|
+
@media (hover: hover) {
|
|
186
|
+
.rt-side-menu--favorite-actions-none .rt-side-menu-sub-item__favorite:not(.rt-side-menu-sub-item__favorite--on) {
|
|
187
|
+
overflow: hidden;
|
|
188
|
+
width: 0;
|
|
189
|
+
margin-inline-start: calc(var(--rt-space-sm) * -1);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* Возврат места — прямым правилом, а не отрицанием в правиле выше: `:hover` внутри
|
|
193
|
+
`:not()` рядом с `:has()` браузер при наведении не пересчитывал, и кнопка оставалась
|
|
194
|
+
без ширины под указателем. */
|
|
195
|
+
.rt-side-menu--favorite-actions-none .rt-side-menu-sub-item__row:hover .rt-side-menu-sub-item__favorite,
|
|
196
|
+
.rt-side-menu--favorite-actions-none .rt-side-menu-sub-item__row:focus-visible .rt-side-menu-sub-item__favorite,
|
|
197
|
+
.rt-side-menu--favorite-actions-none .rt-side-menu-sub-item__row:has(:focus-visible) .rt-side-menu-sub-item__favorite {
|
|
198
|
+
overflow: visible;
|
|
199
|
+
width: auto;
|
|
200
|
+
margin-inline-start: 0;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
@@ -4,17 +4,24 @@
|
|
|
4
4
|
<rt-spinner color="primary" [diameter]="32" />
|
|
5
5
|
```
|
|
6
6
|
|
|
7
|
-
| вход
|
|
8
|
-
|
|
|
9
|
-
| `diameter`
|
|
10
|
-
| `color`
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
| вход | тип | умолчание |
|
|
8
|
+
| ------------ | ---------------------------------------- | ----------- |
|
|
9
|
+
| `diameter` | `number \| string` (px) | `32` |
|
|
10
|
+
| `color` | `'primary' \| 'neutral' \| 'on-primary'` | `'primary'` |
|
|
11
|
+
| `appearance` | `'border' \| 'arc'` | `'border'` |
|
|
12
|
+
| `overlay` | `boolean` | `false` |
|
|
13
|
+
| `backdrop` | `boolean` — только вместе с `overlay` | `false` |
|
|
14
|
+
| `plate` | `boolean` | `false` |
|
|
15
|
+
|
|
16
|
+
Выходов нет. Без `overlay`, `plate` и `arc` собственной разметки нет — кольцо рисуется на host-е,
|
|
17
|
+
и так спиннер стоит в компонентах кита. Любой из этих входов включает внутреннюю разметку.
|
|
13
18
|
|
|
14
19
|
## Главное, что нужно знать
|
|
15
20
|
|
|
16
|
-
**Спиннер не решает, показывать ли себя.**
|
|
17
|
-
и
|
|
21
|
+
**Спиннер не решает, показывать ли себя.** Условной отрисовки внутри нет — это дело вмещающего.
|
|
22
|
+
Подложку и накрытие блока он рисует по просьбе: `overlay` занимает позиционированного родителя,
|
|
23
|
+
`backdrop` приглушает его содержимое. Слой оверлея — `sticky`, переназначается свойством
|
|
24
|
+
`--rt-spinner-overlay-z`. Таблица рисует свой sticky-overlay и кладёт спиннер внутрь, кнопка
|
|
18
25
|
подменяет им иконку.
|
|
19
26
|
|
|
20
27
|
Диаметр едет свойством оформления `--rt-spinner-diameter`, а не классом, — поэтому размер
|
|
@@ -7,15 +7,28 @@
|
|
|
7
7
|
--rt-spinner-rotation-duration: 1s;
|
|
8
8
|
--rt-spinner-rotation-duration-reduced: 4s;
|
|
9
9
|
--rt-spinner-radius: var(--rt-radius-full);
|
|
10
|
+
--rt-spinner-overlay-z: var(--rt-z-sticky);
|
|
11
|
+
--rt-spinner-plate-size: calc(var(--rt-spinner-diameter) + 2 * var(--rt-space-2));
|
|
12
|
+
--rt-spinner-plate-bg: var(--rt-color-bg-surface);
|
|
13
|
+
--rt-spinner-plate-shadow: var(--rt-shadow-md);
|
|
14
|
+
--rt-spinner-plate-radius: var(--rt-radius-full);
|
|
15
|
+
--rt-spinner-backdrop-bg: color-mix(in srgb, var(--rt-color-bg-subtle) 85%, transparent);
|
|
16
|
+
--rt-spinner-arc-duration: 1.4s;
|
|
17
|
+
--rt-spinner-arc-duration-reduced: 5.6s;
|
|
10
18
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
/* Кольцо: border с одной цветной стороной и вращение. Его рисует host без новых режимов,
|
|
20
|
+
а в них — элемент `__ring` внутри, теми же правилами. */
|
|
21
|
+
&,
|
|
22
|
+
&__ring {
|
|
23
|
+
display: inline-block;
|
|
24
|
+
width: var(--rt-spinner-diameter);
|
|
25
|
+
height: var(--rt-spinner-diameter);
|
|
26
|
+
box-sizing: border-box;
|
|
27
|
+
border: var(--rt-spinner-border-width) solid var(--rt-spinner-track-color);
|
|
28
|
+
border-radius: var(--rt-spinner-radius);
|
|
29
|
+
border-right-color: var(--rt-spinner-progress-color);
|
|
30
|
+
animation: rt-spinner-rotate var(--rt-spinner-rotation-duration) linear infinite;
|
|
31
|
+
}
|
|
19
32
|
|
|
20
33
|
&--primary {
|
|
21
34
|
--rt-spinner-progress-color: var(--rt-color-action-primary);
|
|
@@ -29,6 +42,61 @@
|
|
|
29
42
|
--rt-spinner-track-color: var(--rt-overlay-white-25);
|
|
30
43
|
--rt-spinner-progress-color: var(--rt-color-action-on-primary);
|
|
31
44
|
}
|
|
45
|
+
|
|
46
|
+
/* В новых режимах host — коробка, а кольцо внутри: border и вращение с host-а снимаются. */
|
|
47
|
+
&--framed {
|
|
48
|
+
display: inline-flex;
|
|
49
|
+
width: auto;
|
|
50
|
+
height: auto;
|
|
51
|
+
align-items: center;
|
|
52
|
+
justify-content: center;
|
|
53
|
+
border: 0;
|
|
54
|
+
border-radius: 0;
|
|
55
|
+
animation: none;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* Слой — ступень sticky: выше закреплённых частей самого блока, ниже всего, что открывается
|
|
59
|
+
поверх страницы; приложение переназначает слой свойством `--rt-spinner-overlay-z`. Родитель
|
|
60
|
+
должен быть позиционирован — его спиннер не трогает. */
|
|
61
|
+
&--overlay {
|
|
62
|
+
position: absolute;
|
|
63
|
+
z-index: var(--rt-spinner-overlay-z);
|
|
64
|
+
display: flex;
|
|
65
|
+
inset: 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
&--backdrop {
|
|
69
|
+
background: var(--rt-spinner-backdrop-bg);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
&__plate {
|
|
73
|
+
display: inline-flex;
|
|
74
|
+
width: var(--rt-spinner-plate-size);
|
|
75
|
+
height: var(--rt-spinner-plate-size);
|
|
76
|
+
align-items: center;
|
|
77
|
+
justify-content: center;
|
|
78
|
+
border-radius: var(--rt-spinner-plate-radius);
|
|
79
|
+
background: var(--rt-spinner-plate-bg);
|
|
80
|
+
box-shadow: var(--rt-spinner-plate-shadow);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* Дуга как у Material: контейнер вращается, а длина дуги растёт и сокращается. Дорожки нет. */
|
|
84
|
+
&__arc {
|
|
85
|
+
display: block;
|
|
86
|
+
width: var(--rt-spinner-diameter);
|
|
87
|
+
height: var(--rt-spinner-diameter);
|
|
88
|
+
animation: rt-spinner-rotate var(--rt-spinner-arc-duration) linear infinite;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
&__arc-circle {
|
|
92
|
+
animation: rt-spinner-arc-dash var(--rt-spinner-arc-duration) ease-in-out infinite;
|
|
93
|
+
fill: none;
|
|
94
|
+
stroke: var(--rt-spinner-progress-color);
|
|
95
|
+
stroke-dasharray: 89 200;
|
|
96
|
+
stroke-dashoffset: -35;
|
|
97
|
+
stroke-linecap: round;
|
|
98
|
+
stroke-width: 4;
|
|
99
|
+
}
|
|
32
100
|
}
|
|
33
101
|
|
|
34
102
|
@keyframes rt-spinner-rotate {
|
|
@@ -37,9 +105,40 @@
|
|
|
37
105
|
}
|
|
38
106
|
}
|
|
39
107
|
|
|
108
|
+
/* Цикл Material — точка, длинная дуга, дуга уходит в точку — начат с длинной дуги. Движение то
|
|
109
|
+
же, а кадр с остановленным движением показывает дугу, а не точку. В середине дуга уже точка, и
|
|
110
|
+
переход к началу её длины глазу не виден. */
|
|
111
|
+
@keyframes rt-spinner-arc-dash {
|
|
112
|
+
0% {
|
|
113
|
+
stroke-dasharray: 89 200;
|
|
114
|
+
stroke-dashoffset: -35;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
50% {
|
|
118
|
+
stroke-dasharray: 89 200;
|
|
119
|
+
stroke-dashoffset: -124;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
50.01% {
|
|
123
|
+
stroke-dasharray: 1 200;
|
|
124
|
+
stroke-dashoffset: 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
100% {
|
|
128
|
+
stroke-dasharray: 89 200;
|
|
129
|
+
stroke-dashoffset: -35;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
40
133
|
@media (prefers-reduced-motion: reduce) {
|
|
41
|
-
.rt-spinner
|
|
134
|
+
.rt-spinner,
|
|
135
|
+
.rt-spinner__ring {
|
|
42
136
|
animation-duration: var(--rt-spinner-rotation-duration-reduced);
|
|
43
137
|
}
|
|
138
|
+
|
|
139
|
+
.rt-spinner__arc,
|
|
140
|
+
.rt-spinner__arc-circle {
|
|
141
|
+
animation-duration: var(--rt-spinner-arc-duration-reduced);
|
|
142
|
+
}
|
|
44
143
|
}
|
|
45
144
|
}
|
|
@@ -85,6 +85,12 @@
|
|
|
85
85
|
колонки**: заголовки живут в шаблонах ячеек CDK, куда карточка не дотягивается. Осмысленные
|
|
86
86
|
подписи даёт `columnsConfig`.
|
|
87
87
|
|
|
88
|
+
**Карточка открывает запись так же, как строка.** Нажатие, Enter и пробел на карточке передаются
|
|
89
|
+
спрятанной строке с тем же номером, и срабатывает её `(activated)` от `rtTableRow`: приложению не
|
|
90
|
+
нужен второй обработчик. Нажатие по кнопке, ссылке, полю, `role="button"` или `role="switch"`
|
|
91
|
+
внутри карточки открытием не считается. Карточка отзывается и берёт фокус клавишей Tab только при
|
|
92
|
+
`clickable`.
|
|
93
|
+
|
|
88
94
|
**Настройка колонок требует и `columnsConfig`, и `tableId`.** Выбор хранится в IndexedDB, и без
|
|
89
95
|
идентификатора таблицы его некуда положить — поэтому `canConfigure()` останется `false`.
|
|
90
96
|
|
|
@@ -164,9 +164,11 @@
|
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
/* Строки-ссылки: курсор + focus-ring. Активацию (click/Enter/Space) и
|
|
167
|
-
table-семантику обеспечивает директива rtTableRow на самой строке.
|
|
167
|
+
table-семантику обеспечивает директива rtTableRow на самой строке.
|
|
168
|
+
Карточка узкого экрана открывает запись так же, как строка: вид у неё тот же. */
|
|
168
169
|
&--clickable {
|
|
169
|
-
.cdk-row
|
|
170
|
+
.cdk-row,
|
|
171
|
+
.rt-table__card {
|
|
170
172
|
cursor: pointer;
|
|
171
173
|
|
|
172
174
|
&:focus-visible {
|
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
так они достаются только корню шаблона. */
|
|
8
8
|
|
|
9
9
|
rt-tag {
|
|
10
|
+
/* Скругление и толщина рамки объявлены на хосте: правило приложения на теге компонента
|
|
11
|
+
их переопределяет, а шаги входа `radius` стоят тоже на хосте. */
|
|
12
|
+
--rt-tag-radius: var(--rt-radius-full);
|
|
13
|
+
--rt-tag-border-width: var(--rt-border-width-thin);
|
|
14
|
+
|
|
10
15
|
display: inline-flex;
|
|
11
16
|
|
|
12
17
|
/* Предел стоит и на хосте, и на пилюле внутри. Вмещающий блок пилюли — сам хост, и без
|
|
@@ -14,73 +19,88 @@
|
|
|
14
19
|
разросшегося хоста, и метка вылезает за место, которое ей дали. */
|
|
15
20
|
max-width: 100%;
|
|
16
21
|
|
|
22
|
+
/* Цвета и отступы приложение задаёт ручками `--rt-tag-color-*` и `--rt-tag-padding-*`:
|
|
23
|
+
их кит не объявляет, а запасное значение — то, что дают палитра и ступень размера.
|
|
24
|
+
У интервала запасного нет нарочно: незаданная ручка даёт unset, то есть наследование
|
|
25
|
+
от родителя, как до ручки. Запасное normal обрывало его. */
|
|
17
26
|
.rt-tag {
|
|
18
|
-
--rt-tag-
|
|
19
|
-
--rt-tag-
|
|
27
|
+
--rt-tag-severity-bg: var(--rt-neutral-100);
|
|
28
|
+
--rt-tag-severity-text: var(--rt-neutral-700);
|
|
29
|
+
--rt-tag-size-padding-block: var(--rt-space-1);
|
|
30
|
+
--rt-tag-size-padding-inline: var(--rt-space-2);
|
|
20
31
|
|
|
21
32
|
display: inline-flex;
|
|
22
33
|
max-width: 100%;
|
|
23
34
|
align-items: center;
|
|
24
|
-
padding: var(--rt-
|
|
35
|
+
padding: var(--rt-tag-padding-block, var(--rt-tag-size-padding-block))
|
|
36
|
+
var(--rt-tag-padding-inline, var(--rt-tag-size-padding-inline));
|
|
25
37
|
border-radius: var(--rt-tag-radius);
|
|
26
|
-
background: var(--rt-
|
|
27
|
-
color: var(--rt-
|
|
38
|
+
background: var(--rt-tag-color-bg, var(--rt-tag-severity-bg));
|
|
39
|
+
color: var(--rt-tag-color-text, var(--rt-tag-severity-text));
|
|
28
40
|
font-size: var(--rt-text-sm);
|
|
29
41
|
gap: var(--rt-space-1);
|
|
42
|
+
letter-spacing: var(--rt-tag-letter-spacing);
|
|
30
43
|
line-height: var(--rt-leading-tight);
|
|
31
44
|
|
|
32
45
|
/* Ступени размера: отступы, кегль и просвет между частями двигаются вместе. `md`
|
|
33
46
|
повторяет то, чем метка рисовалась до появления ступеней, и вид без входа не
|
|
34
47
|
меняется ни на пиксель. */
|
|
35
48
|
&--size--sm {
|
|
36
|
-
padding: var(--rt-space-0-5)
|
|
49
|
+
--rt-tag-size-padding-block: var(--rt-space-0-5);
|
|
50
|
+
--rt-tag-size-padding-inline: var(--rt-space-1);
|
|
51
|
+
|
|
37
52
|
font-size: var(--rt-text-xs);
|
|
38
53
|
gap: var(--rt-space-0-5);
|
|
39
54
|
}
|
|
40
55
|
|
|
41
56
|
&--size--md {
|
|
42
|
-
|
|
57
|
+
--rt-tag-size-padding-block: var(--rt-space-1);
|
|
58
|
+
--rt-tag-size-padding-inline: var(--rt-space-2);
|
|
59
|
+
|
|
43
60
|
font-size: var(--rt-text-sm);
|
|
44
61
|
gap: var(--rt-space-1);
|
|
45
62
|
}
|
|
46
63
|
|
|
47
64
|
&--size--lg {
|
|
48
|
-
|
|
65
|
+
--rt-tag-size-padding-block: var(--rt-space-2);
|
|
66
|
+
--rt-tag-size-padding-inline: var(--rt-space-4);
|
|
67
|
+
|
|
49
68
|
font-size: var(--rt-text-md);
|
|
50
69
|
gap: var(--rt-space-2);
|
|
51
70
|
}
|
|
52
71
|
|
|
53
72
|
&--severity--info {
|
|
54
|
-
|
|
55
|
-
|
|
73
|
+
--rt-tag-severity-bg: var(--rt-color-state-info-bg);
|
|
74
|
+
--rt-tag-severity-text: var(--rt-color-state-info);
|
|
56
75
|
}
|
|
57
76
|
|
|
58
77
|
&--severity--success {
|
|
59
|
-
|
|
60
|
-
|
|
78
|
+
--rt-tag-severity-bg: var(--rt-color-state-success-bg);
|
|
79
|
+
--rt-tag-severity-text: var(--rt-color-state-success);
|
|
61
80
|
}
|
|
62
81
|
|
|
63
82
|
&--severity--warning {
|
|
64
|
-
|
|
65
|
-
|
|
83
|
+
--rt-tag-severity-bg: var(--rt-color-state-warning-bg);
|
|
84
|
+
--rt-tag-severity-text: var(--rt-color-state-warning);
|
|
66
85
|
}
|
|
67
86
|
|
|
68
87
|
&--severity--danger {
|
|
69
|
-
|
|
70
|
-
|
|
88
|
+
--rt-tag-severity-bg: var(--rt-color-state-danger-bg);
|
|
89
|
+
--rt-tag-severity-text: var(--rt-color-state-danger);
|
|
71
90
|
}
|
|
72
91
|
|
|
73
92
|
&--severity--secondary,
|
|
74
93
|
&--severity--neutral {
|
|
75
|
-
|
|
76
|
-
|
|
94
|
+
--rt-tag-severity-bg: var(--rt-color-bg-subtle);
|
|
95
|
+
--rt-tag-severity-text: var(--rt-color-text-primary);
|
|
77
96
|
}
|
|
78
97
|
|
|
79
98
|
/* Outlined: прозрачный фон + рамка цвета палитры (currentColor = текст).
|
|
80
|
-
После severity-блоков — иначе их
|
|
99
|
+
После severity-блоков — иначе их фон перебил бы transparent. */
|
|
81
100
|
&--appearance--outlined {
|
|
82
|
-
|
|
83
|
-
|
|
101
|
+
--rt-tag-severity-bg: transparent;
|
|
102
|
+
|
|
103
|
+
border: var(--rt-tag-border-width) solid var(--rt-tag-color-border, currentcolor);
|
|
84
104
|
}
|
|
85
105
|
|
|
86
106
|
&__icon {
|
|
@@ -111,7 +131,7 @@
|
|
|
111
131
|
}
|
|
112
132
|
}
|
|
113
133
|
|
|
114
|
-
/* Шаг входа `radius` переназначает собственное свойство
|
|
115
|
-
@include kv.radius-steps('--rt-tag-radius'
|
|
134
|
+
/* Шаг входа `radius` переназначает собственное свойство пилюли на хосте. */
|
|
135
|
+
@include kv.radius-steps('--rt-tag-radius');
|
|
116
136
|
}
|
|
117
137
|
}
|
|
@@ -24,6 +24,7 @@ this.#notifications.error('Не удалось сохранить', 'danger', {
|
|
|
24
24
|
| `duration` | `number \| string` (мс) | `4000` |
|
|
25
25
|
| `visibleToasts` | `number \| string` | `3` |
|
|
26
26
|
| `expand` | `boolean` | `false` |
|
|
27
|
+
| `mode` | `'stack' \| 'replace'` | `'stack'` |
|
|
27
28
|
|
|
28
29
|
## Главное, что нужно знать
|
|
29
30
|
|
|
@@ -42,12 +43,19 @@ this.#notifications.error('Не удалось сохранить', 'danger', {
|
|
|
42
43
|
- `action` и `secondaryAction` рисуются кнопками внутри тоста и зовут переданные обработчики.
|
|
43
44
|
- `meta` — приписка над сообщением (номер заявки), `description` — вторая строка под ним.
|
|
44
45
|
- Положение раскладывается на два модификатора: `rt-toaster--y--bottom` и `rt-toaster--x--right`.
|
|
46
|
+
- `duration` у самого тоста важнее срока тостера; `duration: null` держит тост до крестика.
|
|
47
|
+
- `progress: true` рисует полосу срока; она встаёт тем же признаком `rt-toast--paused`, что и таймер.
|
|
48
|
+
- `icon` у тоста важнее карты `RT_TOAST_SEVERITY_ICONS`; `icon: null` снимает значок.
|
|
49
|
+
- `mode="replace"` помечает прежние тосты вытесненными, и они уходят той же анимацией, что по крестику.
|
|
45
50
|
|
|
46
51
|
## Края
|
|
47
52
|
|
|
48
53
|
- **Нулевая длительность не значит «висит, пока не закроют».** `duration: 0` — это таймер на
|
|
49
54
|
ноль миллисекунд: тост гасит себя сразу после первой отрисовки. Держать его открытым умеет
|
|
50
55
|
только пауза таймера — признак `interacting` либо развёрнутая стопка.
|
|
56
|
+
Тост «до крестика» задаётся `duration: null`.
|
|
57
|
+
- **Значок красится стилем, а не входом `color` значка.** Вход пишет цвет прямо в разметку, и
|
|
58
|
+
ручке `--rt-toast-icon-color` перебить его было бы нечем.
|
|
51
59
|
- **В матрице каждому тосту ставится `[interacting]="true"`.** Иначе ячейки гаснут одна за
|
|
52
60
|
другой, пока смотришь на показ, и кадр снимается с пустой сетки.
|
|
53
61
|
|