@rt-tools/ui-kit-v2 0.16.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 +1106 -451
- 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/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 +9 -1
- 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 +17 -1
- 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 +6 -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-upload/CONTEXT.md +20 -15
- package/src/lib/components/image-upload/rt-image-upload.component.scss +14 -2
- 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 +7 -2
- package/src/lib/components/spinner/CONTEXT.md +15 -8
- package/src/lib/components/spinner/rt-spinner.component.scss +108 -9
- 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 +5 -5
- 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/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 +371 -62
- package/rt-tools-ui-kit-v2-0.16.0.tgz +0 -0
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
Селектор bare `.rt-icon` (класс на host) — им же адресуются и программные
|
|
4
4
|
потребители sprite'а, рисующие иконку без компонента. */
|
|
5
5
|
.rt-icon {
|
|
6
|
+
--rt-icon-spin-duration: 1s;
|
|
7
|
+
--rt-icon-spin-duration-reduced: 4s;
|
|
8
|
+
|
|
6
9
|
display: inline-flex;
|
|
7
10
|
flex-shrink: 0;
|
|
8
11
|
line-height: 0;
|
|
@@ -14,7 +17,51 @@
|
|
|
14
17
|
fill: currentcolor;
|
|
15
18
|
}
|
|
16
19
|
|
|
20
|
+
/* Лигатура шрифта Material Symbols для глифа без пары. Шрифт подключает приложение,
|
|
21
|
+
семью можно переназначить свойством сверху. Размер шрифта — встроенным стилем, он равен
|
|
22
|
+
ширине значка. До готовности шрифтов лигатура скрыта: иначе на её месте видно слово. */
|
|
23
|
+
&__glyph {
|
|
24
|
+
display: block;
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
width: 100%;
|
|
27
|
+
font-family: var(--rt-icon-glyph-font, 'Material Symbols Outlined'), sans-serif;
|
|
28
|
+
font-feature-settings: 'liga';
|
|
29
|
+
font-style: normal;
|
|
30
|
+
font-variation-settings: 'FILL' 0;
|
|
31
|
+
font-weight: var(--rt-font-weight-regular);
|
|
32
|
+
letter-spacing: normal;
|
|
33
|
+
line-height: 1;
|
|
34
|
+
text-align: center;
|
|
35
|
+
text-transform: none;
|
|
36
|
+
white-space: nowrap;
|
|
37
|
+
|
|
38
|
+
&--filled {
|
|
39
|
+
font-variation-settings: 'FILL' 1;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
&--pending {
|
|
43
|
+
visibility: hidden;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* Вращение задаётся анимацией, и на её время она перекрывает поворот значка. */
|
|
48
|
+
&--spin {
|
|
49
|
+
animation: rt-icon-spin var(--rt-icon-spin-duration) linear infinite;
|
|
50
|
+
}
|
|
51
|
+
|
|
17
52
|
/* Набор рисунков стилями не выбирается: ссылку на символ спрайта CSS подменить нечем.
|
|
18
53
|
Признак набора компонент читает у разметки над собой — см. rt-icon.component.ts. */
|
|
19
54
|
}
|
|
55
|
+
|
|
56
|
+
@keyframes rt-icon-spin {
|
|
57
|
+
to {
|
|
58
|
+
transform: rotate(1turn);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@media (prefers-reduced-motion: reduce) {
|
|
63
|
+
.rt-icon--spin {
|
|
64
|
+
animation-duration: var(--rt-icon-spin-duration-reduced);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
20
67
|
}
|
|
@@ -4,19 +4,20 @@
|
|
|
4
4
|
<rt-icon-button icon="ico-trash" ariaLabel="Удалить" variant="danger" size="md" (clicked)="remove()" />
|
|
5
5
|
```
|
|
6
6
|
|
|
7
|
-
| вход | тип
|
|
8
|
-
| ----------------------------------------------- |
|
|
9
|
-
| `icon` | `IRtIcon.Name`
|
|
10
|
-
| `
|
|
11
|
-
| `
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
| `
|
|
15
|
-
| `
|
|
16
|
-
| `
|
|
17
|
-
| `
|
|
18
|
-
| `
|
|
19
|
-
| `
|
|
7
|
+
| вход | тип | умолчание |
|
|
8
|
+
| ----------------------------------------------- | ----------------------------------------------------------------------------- | ---------------------------- |
|
|
9
|
+
| `icon` | `IRtIcon.Name \| null` — нужен он или `glyph`; без обоих показывает вложенное | `null` |
|
|
10
|
+
| `glyph` | `string \| null` — имя Material, как `glyph` у `rt-icon` | `null` |
|
|
11
|
+
| `ariaLabel` | `string` | **обязателен** |
|
|
12
|
+
| `variant` | `'primary' \| 'secondary' \| 'ghost' \| 'danger' \| 'success' \| 'warning'` | `'ghost'` |
|
|
13
|
+
| `size` | `'2xs' \| 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl'` | `'md'` |
|
|
14
|
+
| `iconSize` | `IRtIcon.Size \| null` | `null` → от размера кнопки |
|
|
15
|
+
| `iconColor` | `IRtIcon.Color` | `'current'` |
|
|
16
|
+
| `radius` | `TRtRadius \| null` — шаг общей шкалы | `null` → `md` |
|
|
17
|
+
| `type` | `'button' \| 'submit'` | `'button'` |
|
|
18
|
+
| `tooltip` | `string` | `''` (пусто → подсказки нет) |
|
|
19
|
+
| `tabIndex` | `number` | `0` |
|
|
20
|
+
| `loading` / `disabled` / `active` / `indicator` | `boolean` | `false` |
|
|
20
21
|
|
|
21
22
|
| выход | тип |
|
|
22
23
|
| --------- | ------------ |
|
|
@@ -27,13 +28,19 @@
|
|
|
27
28
|
**`ariaLabel` обязателен.** У кнопки нет текста, и без подписи она для скринридера безымянна.
|
|
28
29
|
Это единственная причина, по которой вход помечен `required`.
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
**Нет ни `icon`, ни `glyph` — кнопка показывает вложенное.** Так в кнопку кита встаёт рисунок,
|
|
32
|
+
которого нет в наборе: размер, форма и состояния остаются кнопочными. Со значком вложенное не
|
|
33
|
+
рисуется.
|
|
34
|
+
|
|
35
|
+
**Кнопку компонент рисует внутри себя**, host остаётся обычным элементом. Модификаторы размера и
|
|
36
|
+
вида пишут частные шаги `--rt-icon-button-size-step` и `--rt-icon-button-bg-variant`, а кнопка
|
|
37
|
+
читает их под публичными `--rt-icon-button-size` и `--rt-icon-button-bg`. Публичные кнопка не
|
|
38
|
+
объявляет, поэтому значение на теге или выше доходит до неё; заливку под указателем задаёт
|
|
39
|
+
`--rt-icon-button-bg-hover`. Компоненты кита, которым нужен свой размер кнопки, пишут шаг, и
|
|
40
|
+
последнее слово остаётся за приложением. Диаметр берётся из общей шкалы высот контролов: иконочная
|
|
41
|
+
кнопка стоит в строке рядом с кнопкой и полем. Ступени — `2xs` 20px и `xs` 22px со значком 16px,
|
|
42
|
+
затем `sm`, `md`, `lg`, `xl`, `2xl` по шкале. У шкалы нет ступени 22px, поэтому `xs` записан на
|
|
43
|
+
месте.
|
|
37
44
|
|
|
38
45
|
## Как этим пользоваться
|
|
39
46
|
|
|
@@ -9,11 +9,6 @@
|
|
|
9
9
|
rt-icon-button {
|
|
10
10
|
display: inline-flex;
|
|
11
11
|
|
|
12
|
-
/* Дефолт = md; перезаписывается модификаторами sm/lg ниже либо inline стилем потребителя.
|
|
13
|
-
Ряд берётся из общей шкалы высот контролов: иконочная кнопка стоит в строке
|
|
14
|
-
рядом с кнопкой и полем и обязана совпадать с ними по высоте. */
|
|
15
|
-
--rt-icon-button-size: var(--rt-control-height-md);
|
|
16
|
-
|
|
17
12
|
/* Цвет иконки объявлен здесь, а не приходил бы запасным значением на месте
|
|
18
13
|
обращения: запасное переживает смену темы — переопределять нечего. Своё
|
|
19
14
|
свойство блока перебивает тот, кому нужен другой цвет: так делает просмотр
|
|
@@ -38,20 +33,26 @@
|
|
|
38
33
|
--rt-icon-button-color-hover: var(--rt-icon-button-color);
|
|
39
34
|
--rt-icon-button-transition-duration: var(--rt-duration-fast);
|
|
40
35
|
|
|
41
|
-
/*
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
/* Размер и заливка покоя — частные шаги: их пишут модификаторы размера и вида, а кнопка
|
|
37
|
+
читает их под публичными `--rt-icon-button-size` и `--rt-icon-button-bg`. Публичные
|
|
38
|
+
кнопка не объявляет, поэтому значение на теге `<rt-icon-button>` или выше доходит до
|
|
39
|
+
неё; раньше модификатор объявлял публичное свойство на самой кнопке и перебивал тег.
|
|
40
|
+
Компоненты кита, которым нужен свой размер кнопки, тоже пишут шаг, а не публичное
|
|
41
|
+
свойство: последнее слово остаётся за приложением.
|
|
42
|
+
Ряд размеров — из общей шкалы высот контролов: кнопка стоит в строке рядом с полем. */
|
|
43
|
+
--rt-icon-button-bg-variant: transparent;
|
|
44
|
+
--rt-icon-button-size-step: var(--rt-control-height-md);
|
|
44
45
|
|
|
45
46
|
position: relative;
|
|
46
47
|
display: inline-flex;
|
|
47
|
-
width: var(--rt-icon-button-size);
|
|
48
|
-
height: var(--rt-icon-button-size);
|
|
48
|
+
width: var(--rt-icon-button-size, var(--rt-icon-button-size-step));
|
|
49
|
+
height: var(--rt-icon-button-size, var(--rt-icon-button-size-step));
|
|
49
50
|
align-items: center;
|
|
50
51
|
justify-content: center;
|
|
51
52
|
padding: 0;
|
|
52
53
|
border: 0;
|
|
53
54
|
border-radius: var(--rt-icon-button-radius);
|
|
54
|
-
background-color: var(--rt-icon-button-bg);
|
|
55
|
+
background-color: var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant));
|
|
55
56
|
box-shadow: var(--rt-icon-button-shadow);
|
|
56
57
|
color: var(--rt-icon-button-color);
|
|
57
58
|
cursor: pointer;
|
|
@@ -59,24 +60,34 @@
|
|
|
59
60
|
background-color var(--rt-icon-button-transition-duration) ease,
|
|
60
61
|
box-shadow var(--rt-icon-button-transition-duration) ease;
|
|
61
62
|
|
|
63
|
+
/* Два шага меньше `sm` — для плотных строк. У шкалы нет ступени 22px, и ступень ради одной
|
|
64
|
+
кнопки легла бы мимо её сетки в 4px: шаг `xs` записан на месте. */
|
|
65
|
+
&--2xs {
|
|
66
|
+
--rt-icon-button-size-step: var(--rt-size-5);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
&--xs {
|
|
70
|
+
--rt-icon-button-size-step: 22px;
|
|
71
|
+
}
|
|
72
|
+
|
|
62
73
|
&--sm {
|
|
63
|
-
--rt-icon-button-size: var(--rt-control-height-sm);
|
|
74
|
+
--rt-icon-button-size-step: var(--rt-control-height-sm);
|
|
64
75
|
}
|
|
65
76
|
|
|
66
77
|
&--md {
|
|
67
|
-
--rt-icon-button-size: var(--rt-control-height-md);
|
|
78
|
+
--rt-icon-button-size-step: var(--rt-control-height-md);
|
|
68
79
|
}
|
|
69
80
|
|
|
70
81
|
&--lg {
|
|
71
|
-
--rt-icon-button-size: var(--rt-control-height-lg);
|
|
82
|
+
--rt-icon-button-size-step: var(--rt-control-height-lg);
|
|
72
83
|
}
|
|
73
84
|
|
|
74
85
|
&--xl {
|
|
75
|
-
--rt-icon-button-size: var(--rt-control-height-xl);
|
|
86
|
+
--rt-icon-button-size-step: var(--rt-control-height-xl);
|
|
76
87
|
}
|
|
77
88
|
|
|
78
89
|
&--2xl {
|
|
79
|
-
--rt-icon-button-size: var(--rt-control-height-2xl);
|
|
90
|
+
--rt-icon-button-size-step: var(--rt-control-height-2xl);
|
|
80
91
|
}
|
|
81
92
|
|
|
82
93
|
/* Подъём под указателем — ручка для потребителя, как тень покоя; по умолчанию равен
|
|
@@ -85,9 +96,11 @@
|
|
|
85
96
|
box-shadow: var(--rt-icon-button-shadow-hover);
|
|
86
97
|
}
|
|
87
98
|
|
|
99
|
+
/* Заливка под указателем читается под ручкой `--rt-icon-button-bg-hover`; без неё каждый
|
|
100
|
+
вид берёт свою, как прежде. */
|
|
88
101
|
&--ghost {
|
|
89
102
|
&:hover:not(:disabled) {
|
|
90
|
-
background-color: var(--rt-icon-button-color-bg-hover);
|
|
103
|
+
background-color: var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));
|
|
91
104
|
color: var(--rt-icon-button-color-hover);
|
|
92
105
|
}
|
|
93
106
|
|
|
@@ -97,22 +110,22 @@
|
|
|
97
110
|
}
|
|
98
111
|
|
|
99
112
|
&--primary {
|
|
100
|
-
--rt-icon-button-bg: var(--rt-color-action-primary);
|
|
113
|
+
--rt-icon-button-bg-variant: var(--rt-color-action-primary);
|
|
101
114
|
|
|
102
115
|
color: var(--rt-color-action-on-primary);
|
|
103
116
|
|
|
104
117
|
&:hover:not(:disabled) {
|
|
105
|
-
background-color: var(--rt-color-action-primary-hover);
|
|
118
|
+
background-color: var(--rt-icon-button-bg-hover, var(--rt-color-action-primary-hover));
|
|
106
119
|
}
|
|
107
120
|
}
|
|
108
121
|
|
|
109
122
|
&--secondary {
|
|
110
|
-
--rt-icon-button-bg: var(--rt-color-bg-surface-subtle);
|
|
123
|
+
--rt-icon-button-bg-variant: var(--rt-color-bg-surface-subtle);
|
|
111
124
|
|
|
112
125
|
color: var(--rt-color-text-primary);
|
|
113
126
|
|
|
114
127
|
&:hover:not(:disabled) {
|
|
115
|
-
background-color: var(--rt-icon-button-color-bg-hover);
|
|
128
|
+
background-color: var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));
|
|
116
129
|
}
|
|
117
130
|
}
|
|
118
131
|
|
|
@@ -120,7 +133,7 @@
|
|
|
120
133
|
color: var(--rt-color-state-danger);
|
|
121
134
|
|
|
122
135
|
&:hover:not(:disabled) {
|
|
123
|
-
background-color: var(--rt-icon-button-color-bg-hover);
|
|
136
|
+
background-color: var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));
|
|
124
137
|
}
|
|
125
138
|
|
|
126
139
|
&.rt-icon-button--active {
|
|
@@ -132,7 +145,7 @@
|
|
|
132
145
|
color: var(--rt-color-state-success);
|
|
133
146
|
|
|
134
147
|
&:hover:not(:disabled) {
|
|
135
|
-
background-color: var(--rt-icon-button-color-bg-hover);
|
|
148
|
+
background-color: var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));
|
|
136
149
|
}
|
|
137
150
|
|
|
138
151
|
&.rt-icon-button--active {
|
|
@@ -144,7 +157,7 @@
|
|
|
144
157
|
color: var(--rt-color-state-warning);
|
|
145
158
|
|
|
146
159
|
&:hover:not(:disabled) {
|
|
147
|
-
background-color: var(--rt-icon-button-color-bg-hover);
|
|
160
|
+
background-color: var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));
|
|
148
161
|
}
|
|
149
162
|
|
|
150
163
|
&.rt-icon-button--active {
|
|
@@ -157,7 +170,11 @@
|
|
|
157
170
|
встроенным стилем, и правилом его не перебить. Заливка остаётся долей заливки покоя: по умолчанию
|
|
158
171
|
вся, и свой вид прежний. */
|
|
159
172
|
&:disabled {
|
|
160
|
-
background-color: color-mix(
|
|
173
|
+
background-color: color-mix(
|
|
174
|
+
in srgb,
|
|
175
|
+
var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant)) var(--rt-icon-button-disabled-fill),
|
|
176
|
+
transparent
|
|
177
|
+
);
|
|
161
178
|
cursor: not-allowed;
|
|
162
179
|
opacity: var(--rt-icon-button-disabled-opacity);
|
|
163
180
|
|
|
@@ -172,6 +189,15 @@
|
|
|
172
189
|
outline-offset: 2px;
|
|
173
190
|
}
|
|
174
191
|
|
|
192
|
+
/* Своё содержимое вместо значка по имени: встаёт по центру и берёт цвет кнопки. */
|
|
193
|
+
&__content {
|
|
194
|
+
display: inline-flex;
|
|
195
|
+
align-items: center;
|
|
196
|
+
justify-content: center;
|
|
197
|
+
color: inherit;
|
|
198
|
+
line-height: 1;
|
|
199
|
+
}
|
|
200
|
+
|
|
175
201
|
&__spinner {
|
|
176
202
|
--rt-icon-button-spin-duration: 1s;
|
|
177
203
|
|
|
@@ -12,20 +12,23 @@
|
|
|
12
12
|
(imageChanged)="upload($event)" />
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
| вход
|
|
16
|
-
|
|
|
17
|
-
| `imageUrl`
|
|
18
|
-
| `fileName`
|
|
19
|
-
| `tooltip`
|
|
20
|
-
| `downloadable`
|
|
21
|
-
| `downloadShape`
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `
|
|
25
|
-
| `
|
|
26
|
-
| `
|
|
27
|
-
| `
|
|
28
|
-
| `
|
|
15
|
+
| вход | тип | умолчание |
|
|
16
|
+
| ------------------ | ------------------------------------------------------- | ---------------------------- |
|
|
17
|
+
| `imageUrl` | `string \| null` | `null` |
|
|
18
|
+
| `fileName` | `string` | `'image'` |
|
|
19
|
+
| `tooltip` | `string` | `''` → `uiImageUploadChange` |
|
|
20
|
+
| `downloadable` | `boolean` | `false` |
|
|
21
|
+
| `downloadShape` | `'circle' \| 'square'` | `'circle'` |
|
|
22
|
+
| `downloadIconSize` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl' \| null` | `null` → по размеру кнопки |
|
|
23
|
+
| `chooseAppearance` | `'filled' \| 'outlined' \| 'text'` | `'outlined'` |
|
|
24
|
+
| `chooseIcon` | `string \| null` | `'ico-upload'` |
|
|
25
|
+
| `autoApply` | `boolean` | `false` |
|
|
26
|
+
| `loading` | `boolean` | `false` |
|
|
27
|
+
| `disabled` | `boolean` | `false` |
|
|
28
|
+
| `ratio` | `number \| null` | `null` |
|
|
29
|
+
| `round` | `boolean` | `false` |
|
|
30
|
+
| `format` | `'png' \| 'jpeg' \| 'webp' \| null` | `null` |
|
|
31
|
+
| `quality` | `number` | `92` |
|
|
29
32
|
|
|
30
33
|
Выходы: `imageChanged` (`File`), `downloaded`.
|
|
31
34
|
|
|
@@ -48,7 +51,9 @@
|
|
|
48
51
|
Свойства блока: `--rt-image-upload-image-max-height`, `--rt-image-upload-image-radius`,
|
|
49
52
|
`--rt-image-upload-hover-opacity`, `--rt-image-upload-focus-shadow`,
|
|
50
53
|
`--rt-image-upload-download-overhang`, `--rt-image-upload-download-bg`,
|
|
51
|
-
`--rt-image-upload-download-radius
|
|
54
|
+
`--rt-image-upload-download-radius`, `--rt-image-upload-download-size` (размер кнопки скачивания,
|
|
55
|
+
по умолчанию шаг `--rt-control-height-md`), `--rt-image-upload-download-blur` (размытие под ней,
|
|
56
|
+
8px). Они объявлены на самом блоке, поэтому переопределяются
|
|
52
57
|
правилом на `.rt-image-upload`, а не на `:root`. Зона загрузки берёт свойства
|
|
53
58
|
`--rt-empty-state-frame-*`, обрезка — `--rt-image-cropper-*`.
|
|
54
59
|
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
--rt-image-upload-download-overhang: var(--rt-space-sm);
|
|
11
11
|
--rt-image-upload-download-bg: color-mix(in srgb, var(--rt-color-bg-surface) 75%, transparent);
|
|
12
12
|
--rt-image-upload-download-radius: var(--rt-radius-md);
|
|
13
|
+
--rt-image-upload-download-blur: 8px;
|
|
14
|
+
--rt-image-upload-download-size: var(--rt-control-height-md);
|
|
13
15
|
|
|
14
16
|
display: block;
|
|
15
17
|
width: 100%;
|
|
@@ -36,6 +38,9 @@
|
|
|
36
38
|
max-width: 100%;
|
|
37
39
|
box-sizing: border-box;
|
|
38
40
|
padding: var(--rt-image-upload-download-overhang);
|
|
41
|
+
|
|
42
|
+
/* На верх строки: на базовой линии под картинкой оставался зазор под нижние выносные. */
|
|
43
|
+
vertical-align: top;
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
&__download {
|
|
@@ -44,13 +49,20 @@
|
|
|
44
49
|
right: 0;
|
|
45
50
|
border-radius: var(--rt-image-upload-download-radius);
|
|
46
51
|
/* stylelint-disable-next-line property-no-vendor-prefix -- Safari < 18 */
|
|
47
|
-
-webkit-backdrop-filter: blur(
|
|
48
|
-
backdrop-filter: blur(
|
|
52
|
+
-webkit-backdrop-filter: blur(var(--rt-image-upload-download-blur));
|
|
53
|
+
backdrop-filter: blur(var(--rt-image-upload-download-blur));
|
|
49
54
|
background: var(--rt-image-upload-download-bg);
|
|
50
55
|
|
|
51
56
|
&--round {
|
|
52
57
|
--rt-image-upload-download-radius: var(--rt-radius-full);
|
|
53
58
|
}
|
|
59
|
+
|
|
60
|
+
/* Размер отдаётся кнопке её частным шагом, а не публичным `--rt-icon-button-size`: так
|
|
61
|
+
последнее слово остаётся за приложением. Шаг кнопка объявляет на корне своего
|
|
62
|
+
шаблона, а не на хосте, поэтому правило адресует тот же корень. */
|
|
63
|
+
.rt-icon-button {
|
|
64
|
+
--rt-icon-button-size-step: var(--rt-image-upload-download-size);
|
|
65
|
+
}
|
|
54
66
|
}
|
|
55
67
|
|
|
56
68
|
&__image {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
.rt-icon-button {
|
|
28
|
-
--rt-icon-button-size: var(--rt-pagination-arrow-size);
|
|
28
|
+
--rt-icon-button-size-step: var(--rt-pagination-arrow-size);
|
|
29
29
|
--rt-icon-button-radius: var(--rt-pagination-arrow-radius);
|
|
30
30
|
--rt-icon-button-shadow: var(--rt-pagination-arrow-shadow);
|
|
31
31
|
}
|
|
@@ -46,6 +46,8 @@
|
|
|
46
46
|
- Нажатие на значок уводит тело к самому низу и в содержимое под значком не уходит.
|
|
47
47
|
- Полоса не ловит указатель — нажатия по списку под ней проходят насквозь; значок ловит сам.
|
|
48
48
|
- Перекрасить растушёвку можно свойством `--rt-scroll-area-hint-color` на блоке.
|
|
49
|
+
- Отступы и фоны шапки, тела и подвала — свойства блока `--rt-scroll-area-*-padding` и
|
|
50
|
+
`--rt-scroll-area-*-bg`; фоны по умолчанию прозрачные.
|
|
49
51
|
|
|
50
52
|
## Договорённость
|
|
51
53
|
|
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
@layer rt-kit.components {
|
|
2
|
+
/* Фон хоста — с нулевой специфичностью. Хост области часто сам элемент чужого блока со своим
|
|
3
|
+
фоном (столбец бокового меню), и правило той же силы перебивало его порядком в файле:
|
|
4
|
+
столбец терял подложку. Под `:where` любое правило по классу сильнее. */
|
|
5
|
+
:where(.rt-scroll-area) {
|
|
6
|
+
background: var(--rt-scroll-area-bg);
|
|
7
|
+
}
|
|
8
|
+
|
|
2
9
|
.rt-scroll-area {
|
|
3
10
|
--rt-scroll-area-hint-height: var(--rt-space-10);
|
|
4
11
|
--rt-scroll-area-hint-color: var(--rt-color-bg-surface);
|
|
5
12
|
--rt-scroll-area-hint-radius: var(--rt-radius-full);
|
|
13
|
+
--rt-scroll-area-header-padding: var(--rt-space-2) var(--rt-space-4);
|
|
14
|
+
--rt-scroll-area-body-padding: var(--rt-space-4);
|
|
15
|
+
--rt-scroll-area-footer-padding: var(--rt-space-4);
|
|
16
|
+
--rt-scroll-area-bg: transparent;
|
|
17
|
+
--rt-scroll-area-header-bg: transparent;
|
|
18
|
+
--rt-scroll-area-body-bg: transparent;
|
|
19
|
+
--rt-scroll-area-footer-bg: transparent;
|
|
6
20
|
|
|
7
21
|
// Полоса растушёвки считает своё место от хоста: тело обрезает всё по своему краю, а
|
|
8
22
|
// полоса обязана дойти до содержимого подвала.
|
|
@@ -15,7 +29,8 @@
|
|
|
15
29
|
|
|
16
30
|
&__header {
|
|
17
31
|
flex: 0 0 auto;
|
|
18
|
-
padding: var(--rt-
|
|
32
|
+
padding: var(--rt-scroll-area-header-padding);
|
|
33
|
+
background: var(--rt-scroll-area-header-bg);
|
|
19
34
|
}
|
|
20
35
|
|
|
21
36
|
&__body {
|
|
@@ -23,13 +38,15 @@
|
|
|
23
38
|
overflow: auto;
|
|
24
39
|
flex: 1 1 auto;
|
|
25
40
|
flex-direction: column;
|
|
26
|
-
padding: var(--rt-
|
|
41
|
+
padding: var(--rt-scroll-area-body-padding);
|
|
42
|
+
background: var(--rt-scroll-area-body-bg);
|
|
27
43
|
min-block-size: 0;
|
|
28
44
|
}
|
|
29
45
|
|
|
30
46
|
&__footer {
|
|
31
47
|
flex: 0 0 auto;
|
|
32
|
-
padding: var(--rt-
|
|
48
|
+
padding: var(--rt-scroll-area-footer-padding);
|
|
49
|
+
background: var(--rt-scroll-area-footer-bg);
|
|
33
50
|
}
|
|
34
51
|
|
|
35
52
|
// Полоса стоит поверх стыка тела и подвала и не ловит указатель: под ней живой список,
|
|
@@ -17,10 +17,15 @@
|
|
|
17
17
|
|
|
18
18
|
**Режим и ширину подменю хранит сервис, а не меню.** `provideRtSideMenuSettings()` включает
|
|
19
19
|
хранение под номером меню; без провайдера меню ничего не помнит, и режим с шириной приходят
|
|
20
|
-
входами. Вход важнее сохранённого.
|
|
20
|
+
входами. Вход важнее сохранённого. `pinShown="false"` убирает кнопку закрепления, и сохранённое
|
|
21
|
+
закрепление тогда не читается: иначе человек не открепил бы меню.
|
|
22
|
+
|
|
23
|
+
**Подсказки строк подменю гасит `subMenuTooltipsShown="false"`.** Имена кнопок для чтения экрана
|
|
24
|
+
остаются.
|
|
21
25
|
|
|
22
26
|
**Значок вне набора — шаблон `rtSideMenuIcon`.** Имя Material первого кита меню переводит парой
|
|
23
|
-
из перечня кита, как `rt-menu`. Имя без пары берёт свой шаблон меню, один на все
|
|
27
|
+
из перечня кита, как `rt-menu`. Имя без пары берёт свой шаблон меню, один на все пункты и кнопки строк;
|
|
28
|
+
контекст — строка (`$implicit`), имя (`icon`) и место (`slot`: `'icon'` или `'iconButton'`). Без
|
|
24
29
|
шаблона на его месте пусто, а в режиме разработки консоль называет такое имя.
|
|
25
30
|
|
|
26
31
|
**Раздел и запрос меню держит само.** Их не задать входом: раздел открывает нажатие или наведение
|
|
@@ -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`, а не классом, — поэтому размер
|