@rt-tools/ui-kit-v2 0.37.0 → 0.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +43 -5
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +5 -2
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +4 -2
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +22 -6
- package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +9 -5
- package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +4 -3
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +3 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +342 -17
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/components/aside/CONTEXT.md +4 -1
- package/src/lib/components/aside/header/rt-aside-header.component.scss +4 -1
- package/src/lib/components/popover/CONTEXT.md +3 -0
- package/src/lib/components/profile-menu/CONTEXT.md +4 -0
- package/src/lib/components/profile-menu/rt-profile-menu.component.scss +11 -0
- package/src/lib/components/tabs/CONTEXT.md +1 -0
- package/src/lib/components/tabs/rt-tabs.component.scss +10 -5
- package/src/lib/components/thread-list/rt-thread-list-messenger.scss +3 -1
- package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +2 -1
- package/src/lib/components/toolbar/CONTEXT.md +21 -4
- package/src/lib/components/toolbar/filters-aside/rt-toolbar-filters-aside.component.scss +22 -0
- package/src/lib/components/toolbar/rt-toolbar.component.scss +12 -0
- package/src/lib/components/workspace/rt-workspace.component.scss +12 -8
- package/src/lib/components/workspace-details/rt-workspace-details.component.scss +2 -1
- package/src/rich-editor/lib/components/chat/rt-chat-messenger.scss +16 -8
- package/types/rt-tools-ui-kit-v2-aside.d.ts +21 -2
- package/types/rt-tools-ui-kit-v2-core.d.ts +1 -0
- package/types/rt-tools-ui-kit-v2-page-header.d.ts +5 -0
- package/types/rt-tools-ui-kit-v2-popover.d.ts +3 -1
- package/types/rt-tools-ui-kit-v2-profile-menu.d.ts +6 -1
- package/types/rt-tools-ui-kit-v2-toolbar.d.ts +79 -2
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
**Панель рисует само меню.** У поповера кита оформления нет, и голые пункты меню в попапе шапки
|
|
24
24
|
легли бы прямо поверх страницы. Стили без инкапсуляции: попап живёт в перекрытии у конца `<body>`.
|
|
25
25
|
|
|
26
|
+
**В панели поповера меню не выше свободного места и прокручивается.** На низком экране — телефон
|
|
27
|
+
боком, невысокое окно — нижние пункты уходили за край. Шапка открывает меню с подгонкой под окно, а
|
|
28
|
+
меню в панели ужимается до её высоты; вне панели оно рисуется во весь рост.
|
|
29
|
+
|
|
26
30
|
**Тему переключает `ThemeService`**, как у `rt-theme-toggle`: значок показывает тему, к которой
|
|
27
31
|
переведёт нажатие.
|
|
28
32
|
|
|
@@ -16,6 +16,17 @@
|
|
|
16
16
|
box-shadow: var(--rt-profile-menu-shadow);
|
|
17
17
|
gap: var(--rt-space-2);
|
|
18
18
|
|
|
19
|
+
/* В панели поповера меню ужимается до свободного места под именем, а пункты прокручиваются
|
|
20
|
+
внутри него: на низком экране — телефон боком, невысокое окно — нижние пункты уходили за
|
|
21
|
+
край экрана, и до «Выйти» было не дотянуться. Вне панели меню рисуется как раньше.
|
|
22
|
+
По горизонтали прокрутки нет: строки выступают в поле отступа, и прокручиваемый блок
|
|
23
|
+
прибавлял к ним правый отступ — меню ездило вбок на 8 точек. */
|
|
24
|
+
.rt-popover-panel > & {
|
|
25
|
+
overflow: hidden auto;
|
|
26
|
+
min-height: 0;
|
|
27
|
+
max-height: 100%;
|
|
28
|
+
}
|
|
29
|
+
|
|
19
30
|
&__user {
|
|
20
31
|
display: flex;
|
|
21
32
|
flex-direction: column;
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
| `scrollStep` | `'fixed' \| 'page' \| 'third'` | `'fixed'` |
|
|
26
26
|
| `animationDuration` | `string \| number \| null` | `null` |
|
|
27
27
|
| `preserveContent` | `boolean` | `false` |
|
|
28
|
+
| `dense` | `boolean` | `false` |
|
|
28
29
|
|
|
29
30
|
Выходы: `activeIdChange: IRtTabs.Id`, `tabClose: IRtTabs.Id` — просьба закрыть вкладку с `closable`.
|
|
30
31
|
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
.rt-tabs {
|
|
3
3
|
--rt-tabs-border-width: var(--rt-border-width-thin);
|
|
4
4
|
--rt-tabs-transition-duration: var(--rt-duration-fast);
|
|
5
|
+
--rt-tabs-list-align: stretch;
|
|
6
|
+
--rt-tabs-list-border-color: var(--rt-color-border-default);
|
|
7
|
+
--rt-tabs-list-min-height: auto;
|
|
8
|
+
--rt-tabs-list-padding-inline: 0;
|
|
9
|
+
--rt-tabs-content-padding-top: var(--rt-space-md);
|
|
5
10
|
|
|
6
11
|
display: flex;
|
|
7
12
|
-webkit-tap-highlight-color: transparent;
|
|
@@ -40,13 +45,13 @@
|
|
|
40
45
|
position: relative;
|
|
41
46
|
display: flex;
|
|
42
47
|
box-sizing: border-box;
|
|
43
|
-
align-items: var(--rt-tabs-list-align
|
|
44
|
-
border-bottom: var(--rt-tabs-border-width) solid var(--rt-tabs-list-border-color
|
|
48
|
+
align-items: var(--rt-tabs-list-align);
|
|
49
|
+
border-bottom: var(--rt-tabs-border-width) solid var(--rt-tabs-list-border-color);
|
|
45
50
|
margin: 0;
|
|
46
|
-
min-block-size: var(--rt-tabs-list-min-height
|
|
51
|
+
min-block-size: var(--rt-tabs-list-min-height);
|
|
47
52
|
-ms-overflow-style: none;
|
|
48
53
|
overflow-x: auto;
|
|
49
|
-
padding-inline: var(--rt-tabs-list-padding-inline
|
|
54
|
+
padding-inline: var(--rt-tabs-list-padding-inline);
|
|
50
55
|
scrollbar-width: none;
|
|
51
56
|
white-space: nowrap;
|
|
52
57
|
|
|
@@ -185,7 +190,7 @@
|
|
|
185
190
|
min-height: 0;
|
|
186
191
|
flex: 1 1 auto;
|
|
187
192
|
flex-direction: column;
|
|
188
|
-
padding-top: var(--rt-tabs-content-padding-top
|
|
193
|
+
padding-top: var(--rt-tabs-content-padding-top);
|
|
189
194
|
gap: var(--rt-space-md);
|
|
190
195
|
line-height: var(--rt-leading-relaxed);
|
|
191
196
|
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// Лежит отдельно от стилей списка, чтобы оба файла уместились в предел длины.
|
|
3
3
|
@layer rt-kit.components {
|
|
4
4
|
.rt-thread-list--messenger {
|
|
5
|
+
--rt-thread-list-row-radius: var(--rt-radius-lg);
|
|
6
|
+
|
|
5
7
|
padding: calc(var(--rt-space-1) * 1.5) var(--rt-space-2) 0;
|
|
6
8
|
gap: var(--rt-space-0-5);
|
|
7
9
|
|
|
@@ -24,7 +26,7 @@
|
|
|
24
26
|
// Выбор и непрочитанное видны по фону и по счётчику шаблона: левой полосы и точки нет
|
|
25
27
|
.rt-thread-list__row {
|
|
26
28
|
padding: calc(var(--rt-space-2) + var(--rt-space-0-5)) calc(var(--rt-space-2) + var(--rt-space-1));
|
|
27
|
-
border-radius: var(--rt-radius
|
|
29
|
+
border-radius: var(--rt-thread-list-row-radius);
|
|
28
30
|
border-inline-start: none;
|
|
29
31
|
gap: calc(var(--rt-space-2) + var(--rt-space-1));
|
|
30
32
|
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
rt-toggle-button-group {
|
|
20
20
|
--rt-toggle-button-group-track-bg: var(--rt-color-bg-surface-subtle);
|
|
21
21
|
--rt-toggle-button-group-active-bg: var(--rt-color-bg-surface);
|
|
22
|
+
--rt-toggle-button-group-active-shadow: var(--rt-shadow-sm);
|
|
22
23
|
--rt-toggle-button-group-height: 30px;
|
|
23
24
|
--rt-toggle-button-group-transition-duration: var(--rt-duration-fast);
|
|
24
25
|
--rt-toggle-button-group-focus-shadow: var(--rt-shadow-focus-ring);
|
|
@@ -88,7 +89,7 @@
|
|
|
88
89
|
// Выбранный сегмент — плашка над дорожкой: тень RT/Shadow/sm, как в макете сегмента
|
|
89
90
|
&--active {
|
|
90
91
|
background-color: var(--rt-toggle-button-group-active-bg);
|
|
91
|
-
box-shadow: var(--rt-shadow
|
|
92
|
+
box-shadow: var(--rt-toggle-button-group-active-shadow);
|
|
92
93
|
color: var(--rt-color-text-primary);
|
|
93
94
|
}
|
|
94
95
|
|
|
@@ -10,11 +10,15 @@
|
|
|
10
10
|
</rt-toolbar>
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
| вход
|
|
14
|
-
|
|
|
15
|
-
| `dense`
|
|
13
|
+
| вход | тип | умолчание |
|
|
14
|
+
| --------------- | --------- | --------- |
|
|
15
|
+
| `dense` | `boolean` | `false` |
|
|
16
|
+
| `filtersActive` | `boolean` | `false` |
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
| выход | когда |
|
|
19
|
+
| -------------- | ---------------------------------------------- |
|
|
20
|
+
| `filtersApply` | нажата «Применить» панели отборов, она закрыта |
|
|
21
|
+
| `filtersReset` | нажата «Сбросить» панели отборов, она открыта |
|
|
18
22
|
|
|
19
23
|
## Главное, что нужно знать
|
|
20
24
|
|
|
@@ -37,3 +41,16 @@
|
|
|
37
41
|
**Плотная полоса остаётся строкой на любой ширине, и её левая часть сжимается.** Длинный
|
|
38
42
|
заголовок в ней переносится по словам и не выходит за правый край. Кнопки справа держат свою
|
|
39
43
|
ширину. Обычная полоса левую часть не сжимает: на узком экране она стекает в колонку.
|
|
44
|
+
|
|
45
|
+
**Отборы списка объявляются слотом `rtToolbarFilters`, и на узком месте они уходят за кнопку.** На
|
|
46
|
+
широком месте слот стоит в левой части после её содержимого. На узком месте
|
|
47
|
+
(`BreakpointsService.narrow`) вместо полей рисуется кнопка фильтров, первой в ряду кнопок правой
|
|
48
|
+
части; ниже 768 этот ряд начинается от левого края. Вход `filtersActive` ставит точку в угол значка.
|
|
49
|
+
Кнопка открывает панель `RtToolbarFiltersAsideComponent` службой боковых панелей. «Сбросить»
|
|
50
|
+
сообщает `filtersReset`, и панель остаётся открытой; «Применить» сообщает `filtersApply` и
|
|
51
|
+
закрывает её. Контекст шаблона — место, где он нарисован: `bar` или `panel`. Хозяин панели —
|
|
52
|
+
инжектор полосы: уничтожение полосы закрывает панель, и расширение места тоже — иначе поля отборов
|
|
53
|
+
стояли бы в полосе и в панели сразу; фокус из закрытой так панели уходит в левую секцию полосы.
|
|
54
|
+
Второе нажатие кнопки, пока панель открыта, ничего не открывает. Панель держит фокус
|
|
55
|
+
(`trapFocus`) и объявлена модальным диалогом (`modal`), а имя кнопки при `filtersActive` говорит
|
|
56
|
+
скринридеру, что отбор включён.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* rt-toolbar-filters-aside — панель отборов полосы на узком экране. ViewEncapsulation.None. */
|
|
3
|
+
.rt-toolbar-filters-aside {
|
|
4
|
+
--rt-toolbar-filters-aside-gap: var(--rt-space-md);
|
|
5
|
+
|
|
6
|
+
/* Поля отборов — одно под другим во всю ширину тела панели. */
|
|
7
|
+
&__fields {
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
gap: var(--rt-toolbar-filters-aside-gap);
|
|
11
|
+
|
|
12
|
+
// Блок получает начальный фокус панели как место, а не как элемент управления: рамки нет
|
|
13
|
+
&:focus {
|
|
14
|
+
outline: none;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
> * {
|
|
18
|
+
width: 100%;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -83,6 +83,12 @@
|
|
|
83
83
|
gap: var(--rt-space-sm);
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
+
|
|
87
|
+
/* Кнопка фильтров узкого места — первая в ряду кнопок и не сжимается: точка включённого
|
|
88
|
+
отбора выступает за её угол, и полоса её не режет — у секций нет своего overflow. */
|
|
89
|
+
&__filters-trigger {
|
|
90
|
+
flex-shrink: 0;
|
|
91
|
+
}
|
|
86
92
|
}
|
|
87
93
|
|
|
88
94
|
// Плотная полоса не стекает в колонку, и длинный заголовок левой зоны ей некуда деть: зона
|
|
@@ -119,5 +125,11 @@
|
|
|
119
125
|
margin-left: 0;
|
|
120
126
|
}
|
|
121
127
|
}
|
|
128
|
+
|
|
129
|
+
// Отборы ушли за кнопку: она открывает ряд кнопок полосы у левого края, как в макете
|
|
130
|
+
// «Телефон · Toolbar · фильтры за кнопкой».
|
|
131
|
+
.rt-toolbar--filters-collapsed:not(.rt-toolbar--dense) .rt-toolbar__bar--right {
|
|
132
|
+
justify-content: flex-start;
|
|
133
|
+
}
|
|
122
134
|
}
|
|
123
135
|
}
|
|
@@ -36,18 +36,21 @@
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
&__aside {
|
|
39
|
-
// Вкладки панели прижаты к своей линии того же цвета, низ полки вровень с низом шапки переписки
|
|
40
|
-
--rt-tabs-list-min-height: calc(56px + var(--rt-space-2) + var(--rt-space-1) + var(--rt-border-width-thin));
|
|
41
|
-
--rt-tabs-list-align: flex-end;
|
|
42
|
-
--rt-tabs-list-padding-inline: var(--rt-space-1);
|
|
43
|
-
--rt-tabs-list-border-color: var(--rt-color-border-strong);
|
|
44
|
-
--rt-tabs-content-padding-top: 0;
|
|
45
|
-
|
|
46
39
|
display: flex;
|
|
47
40
|
flex: 0 0 var(--rt-workspace-aside-size, 360px);
|
|
48
41
|
flex-direction: column;
|
|
49
42
|
border-inline-start: var(--rt-workspace-border-width) solid var(--rt-color-border-strong);
|
|
50
43
|
min-inline-size: 0;
|
|
44
|
+
|
|
45
|
+
// Вкладки панели прижаты к своей линии того же цвета, низ полки вровень с низом шапки переписки.
|
|
46
|
+
// Значения ставятся на сами вкладки: у них свои по умолчанию, и наследование их не перебьёт
|
|
47
|
+
.rt-tabs {
|
|
48
|
+
--rt-tabs-list-min-height: calc(56px + var(--rt-space-2) + var(--rt-space-1) + var(--rt-border-width-thin));
|
|
49
|
+
--rt-tabs-list-align: flex-end;
|
|
50
|
+
--rt-tabs-list-padding-inline: var(--rt-space-1);
|
|
51
|
+
--rt-tabs-list-border-color: var(--rt-color-border-strong);
|
|
52
|
+
--rt-tabs-content-padding-top: 0;
|
|
53
|
+
}
|
|
51
54
|
}
|
|
52
55
|
|
|
53
56
|
&__handle {
|
|
@@ -174,6 +177,7 @@
|
|
|
174
177
|
// Карточки: у каждой колонки своя рамка и скругление, зазор между ними держит ручка
|
|
175
178
|
&--cards {
|
|
176
179
|
--rt-workspace-card-gap: var(--rt-space-4);
|
|
180
|
+
--rt-workspace-card-radius: var(--rt-radius-xl);
|
|
177
181
|
|
|
178
182
|
gap: 0;
|
|
179
183
|
|
|
@@ -182,7 +186,7 @@
|
|
|
182
186
|
.rt-workspace__aside {
|
|
183
187
|
overflow: hidden;
|
|
184
188
|
border: var(--rt-workspace-border-width) solid var(--rt-color-border-subtle);
|
|
185
|
-
border-radius: var(--rt-radius
|
|
189
|
+
border-radius: var(--rt-workspace-card-radius);
|
|
186
190
|
background: var(--rt-color-bg-surface);
|
|
187
191
|
}
|
|
188
192
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
@layer rt-kit.components {
|
|
2
2
|
.rt-workspace-details {
|
|
3
3
|
--rt-workspace-details-border-width: var(--rt-border-width-thin);
|
|
4
|
+
--rt-workspace-details-tabs-height: calc(56px + var(--rt-space-2) + var(--rt-space-1) + var(--rt-border-width-thin));
|
|
4
5
|
|
|
5
6
|
display: flex;
|
|
6
7
|
flex-direction: column;
|
|
@@ -29,7 +30,7 @@
|
|
|
29
30
|
// Низ полки вкладок стоит на одной линии с низом шапки переписки
|
|
30
31
|
.rt-tabs__header {
|
|
31
32
|
align-items: flex-end;
|
|
32
|
-
block-size:
|
|
33
|
+
block-size: var(--rt-workspace-details-tabs-height);
|
|
33
34
|
border-block-end: var(--rt-workspace-details-border-width) solid var(--rt-color-border-strong);
|
|
34
35
|
padding-inline: var(--rt-space-lg);
|
|
35
36
|
}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// Лежит отдельно от стилей чата, чтобы оба файла уместились в предел длины.
|
|
3
3
|
@layer rt-kit.components {
|
|
4
4
|
.rt-chat {
|
|
5
|
+
--rt-chat-day-label-radius: var(--rt-radius-full);
|
|
6
|
+
|
|
5
7
|
&__day[hidden] {
|
|
6
8
|
display: none;
|
|
7
9
|
}
|
|
@@ -19,7 +21,7 @@
|
|
|
19
21
|
|
|
20
22
|
&__day-label {
|
|
21
23
|
padding: var(--rt-space-1) calc(var(--rt-space-2) + var(--rt-space-1));
|
|
22
|
-
border-radius: var(--rt-radius
|
|
24
|
+
border-radius: var(--rt-chat-day-label-radius);
|
|
23
25
|
background: var(--rt-color-bg-surface);
|
|
24
26
|
color: var(--rt-color-text-muted);
|
|
25
27
|
font-size: var(--rt-text-xs);
|
|
@@ -34,6 +36,10 @@
|
|
|
34
36
|
// время и знак доставки справа внизу
|
|
35
37
|
&--messenger {
|
|
36
38
|
--rt-chat-bubble-radius: var(--rt-radius-xl);
|
|
39
|
+
--rt-chat-bubble-corner-radius: var(--rt-radius-sm);
|
|
40
|
+
--rt-chat-messenger-border-width: var(--rt-border-width-thin);
|
|
41
|
+
--rt-chat-messenger-panel-radius: var(--rt-radius-lg);
|
|
42
|
+
--rt-chat-messenger-actions-shadow: var(--rt-shadow-sm);
|
|
37
43
|
--rt-chat-bubble-own-bg: var(--rt-color-action-primary);
|
|
38
44
|
--rt-chat-bubble-in-bg: var(--rt-color-bg-subtle);
|
|
39
45
|
|
|
@@ -46,7 +52,7 @@
|
|
|
46
52
|
--rt-toolbar-padding-top: 0;
|
|
47
53
|
--rt-toolbar-padding-bottom: calc(var(--rt-space-2) + var(--rt-space-1));
|
|
48
54
|
|
|
49
|
-
border-block-end: var(--rt-border-width
|
|
55
|
+
border-block-end: var(--rt-chat-messenger-border-width) solid var(--rt-color-border-subtle);
|
|
50
56
|
|
|
51
57
|
.rt-toolbar__bar--left {
|
|
52
58
|
gap: calc(var(--rt-space-2) + var(--rt-space-1));
|
|
@@ -56,7 +62,7 @@
|
|
|
56
62
|
// Реплики прижаты к низу ленты, к полю ответа: короткий разговор не висит под шапкой
|
|
57
63
|
.rt-chat__thread {
|
|
58
64
|
padding: var(--rt-space-5) var(--rt-space-6);
|
|
59
|
-
border-radius: var(--rt-radius
|
|
65
|
+
border-radius: var(--rt-chat-messenger-panel-radius);
|
|
60
66
|
background: var(--rt-color-bg-surface);
|
|
61
67
|
gap: var(--rt-space-1);
|
|
62
68
|
|
|
@@ -67,7 +73,8 @@
|
|
|
67
73
|
|
|
68
74
|
.rt-chat__message {
|
|
69
75
|
padding: var(--rt-space-2) calc(var(--rt-space-2) + var(--rt-space-1)) var(--rt-space-1);
|
|
70
|
-
border-radius: var(--rt-chat-bubble-radius) var(--rt-chat-bubble-radius) var(--rt-chat-bubble-radius)
|
|
76
|
+
border-radius: var(--rt-chat-bubble-radius) var(--rt-chat-bubble-radius) var(--rt-chat-bubble-radius)
|
|
77
|
+
var(--rt-chat-bubble-corner-radius);
|
|
71
78
|
gap: var(--rt-space-0-5);
|
|
72
79
|
}
|
|
73
80
|
|
|
@@ -79,7 +86,8 @@
|
|
|
79
86
|
}
|
|
80
87
|
|
|
81
88
|
.rt-chat__message--own {
|
|
82
|
-
border-radius: var(--rt-chat-bubble-radius) var(--rt-chat-bubble-radius) var(--rt-
|
|
89
|
+
border-radius: var(--rt-chat-bubble-radius) var(--rt-chat-bubble-radius) var(--rt-chat-bubble-corner-radius)
|
|
90
|
+
var(--rt-chat-bubble-radius);
|
|
83
91
|
box-shadow: none;
|
|
84
92
|
}
|
|
85
93
|
|
|
@@ -122,10 +130,10 @@
|
|
|
122
130
|
display: flex;
|
|
123
131
|
align-items: center;
|
|
124
132
|
padding: var(--rt-space-0-5);
|
|
125
|
-
border: var(--rt-border-width
|
|
126
|
-
border-radius: var(--rt-radius
|
|
133
|
+
border: var(--rt-chat-messenger-border-width) solid var(--rt-color-border-subtle);
|
|
134
|
+
border-radius: var(--rt-chat-messenger-panel-radius);
|
|
127
135
|
background: var(--rt-color-bg-surface);
|
|
128
|
-
box-shadow: var(--rt-shadow
|
|
136
|
+
box-shadow: var(--rt-chat-messenger-actions-shadow);
|
|
129
137
|
gap: var(--rt-space-0-5);
|
|
130
138
|
}
|
|
131
139
|
|
|
@@ -35,7 +35,8 @@ export type TRtAsideContentLayout = 'default' | 'tabs';
|
|
|
35
35
|
* обводка фокуса поля срезалась краем такого мини-скроллера.
|
|
36
36
|
*
|
|
37
37
|
* Семантика — `role="complementary"` (mirror rt-dialog имеет `role="dialog"`,
|
|
38
|
-
* aside — другая роль, side-sheet не обязательно блокирующий).
|
|
38
|
+
* aside — другая роль, side-sheet не обязательно блокирующий). Панель, которая блокирует
|
|
39
|
+
* страницу и держит фокус, включает вход `modal`: рамка объявлена `role="dialog"` с `aria-modal`.
|
|
39
40
|
*
|
|
40
41
|
* `ViewEncapsulation.None` — стили префиксованы `.rt-aside`, чтобы соседние
|
|
41
42
|
* rt-aside-header / rt-aside-footer работали с одним BEM-блоком без
|
|
@@ -59,6 +60,8 @@ export declare class RtAsideComponent {
|
|
|
59
60
|
* элемент под Tab, а когда панель уходит или вход гаснет, возвращается туда, где стоял.
|
|
60
61
|
*/
|
|
61
62
|
readonly trapFocus: InputSignalWithTransform<boolean, BooleanInput>;
|
|
63
|
+
/** Панель блокирует страницу: рамка объявлена скринридеру модальным диалогом. */
|
|
64
|
+
readonly modal: InputSignalWithTransform<boolean, BooleanInput>;
|
|
62
65
|
/** Идёт запрос: панель накрыта слоем с крутилкой и помечена занятой. */
|
|
63
66
|
readonly pending: InputSignalWithTransform<boolean, BooleanInput>;
|
|
64
67
|
constructor();
|
|
@@ -94,6 +97,11 @@ export declare class RtAsideComponent {
|
|
|
94
97
|
"required": false;
|
|
95
98
|
"isSignal": true;
|
|
96
99
|
};
|
|
100
|
+
"modal": {
|
|
101
|
+
"alias": "modal";
|
|
102
|
+
"required": false;
|
|
103
|
+
"isSignal": true;
|
|
104
|
+
};
|
|
97
105
|
"pending": {
|
|
98
106
|
"alias": "pending";
|
|
99
107
|
"required": false;
|
|
@@ -429,9 +437,20 @@ export declare class RtAsideFooterComponent {
|
|
|
429
437
|
#private;
|
|
430
438
|
protected readonly buttons: Signal<readonly RtButtonDirective[]>;
|
|
431
439
|
protected readonly hosts: Signal<readonly ElementRef<HTMLElement>[]>;
|
|
440
|
+
/**
|
|
441
|
+
* На телефоне кнопка слота `[asideDismiss]` читается «Закрыть»: так она названа у всех панелей.
|
|
442
|
+
* `false` оставляет подпись потребителя — у панели фильтров эта кнопка «Сбросить», а не выход.
|
|
443
|
+
*/
|
|
444
|
+
readonly phoneCloseLabel: InputSignalWithTransform<boolean, boolean | string>;
|
|
432
445
|
constructor();
|
|
433
446
|
static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideFooterComponent, never>;
|
|
434
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideFooterComponent, "rt-aside-footer", never, {
|
|
447
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideFooterComponent, "rt-aside-footer", never, {
|
|
448
|
+
"phoneCloseLabel": {
|
|
449
|
+
"alias": "phoneCloseLabel";
|
|
450
|
+
"required": false;
|
|
451
|
+
"isSignal": true;
|
|
452
|
+
};
|
|
453
|
+
}, {}, ["buttons", "hosts"], ["[asideDismiss]", "[asidePrimary]"], true, never>;
|
|
435
454
|
}
|
|
436
455
|
/**
|
|
437
456
|
* Блок ошибки запроса боковой панели: надпись и кнопка, которая кладёт в буфер обмена время и
|
|
@@ -670,6 +670,7 @@ export declare const RT_KIT_LABELS_EN: {
|
|
|
670
670
|
readonly uiFilterStartsWith: "Starts with";
|
|
671
671
|
readonly uiFilterValue: "Filter value";
|
|
672
672
|
readonly uiFilters: "Filters";
|
|
673
|
+
readonly uiFiltersActive: "Filters, applied";
|
|
673
674
|
readonly uiForward: "Forward";
|
|
674
675
|
readonly uiHide: "Hide";
|
|
675
676
|
readonly uiHideColumn: "Hide column";
|
|
@@ -215,6 +215,11 @@ export declare class RtPageHeaderComponent {
|
|
|
215
215
|
protected readonly userAvatar: Signal<string>;
|
|
216
216
|
/** Узкий вьюпорт (≤1080px): инлайн-навигация прячется, показывается гамбургер. */
|
|
217
217
|
protected readonly isNarrow: Signal<boolean>;
|
|
218
|
+
/**
|
|
219
|
+
* Подложка меню профиля: на узком экране та же, что у меню разделов из бургера, на широком её
|
|
220
|
+
* нет — меню там открывается наведением. Поповер читает класс при первом открытии.
|
|
221
|
+
*/
|
|
222
|
+
protected readonly userMenuBackdropClass: Signal<string>;
|
|
218
223
|
/**
|
|
219
224
|
* id раскрытых разделов-аккордеонов в мобильной панели. Ключ — только раздел:
|
|
220
225
|
* группы внутри раскрытого раздела показаны сразу, и совпасть идентификаторам
|
|
@@ -26,7 +26,8 @@ export declare namespace IRtPopover {
|
|
|
26
26
|
* Триггеры:
|
|
27
27
|
* - `click` (default) — toggle по клику на host; outside-click закрывает.
|
|
28
28
|
* - `hover` — открытие на `mouseenter`, закрытие с grace-периодом на `mouseleave`
|
|
29
|
-
* (наведение на панель удерживает её открытой).
|
|
29
|
+
* (наведение на панель удерживает её открытой). Наведение судится только мышиное:
|
|
30
|
+
* касание и перо открывают панель нажатием.
|
|
30
31
|
* - `manual` — авто-listener'ы не вешаются; host сам зовёт `open()/close()`.
|
|
31
32
|
* Используется form-control'ами с собственным жестом (autocomplete — открытие
|
|
32
33
|
* по набору текста).
|
|
@@ -80,6 +81,7 @@ export declare class RtPopoverDirective implements OnDestroy {
|
|
|
80
81
|
close(): void;
|
|
81
82
|
toggle(): void;
|
|
82
83
|
protected onHostClick(): void;
|
|
84
|
+
protected onHostPointerEnter(event: PointerEvent): void;
|
|
83
85
|
protected onHostMouseEnter(): void;
|
|
84
86
|
protected onHostMouseLeave(event: MouseEvent): void;
|
|
85
87
|
static ɵfac: i0.ɵɵFactoryDeclaration<RtPopoverDirective, never>;
|
|
@@ -2,6 +2,7 @@ import { BooleanInput } from "@angular/cdk/coercion";
|
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import { InputSignal, InputSignalWithTransform, OutputEmitterRef, Signal } from "@angular/core";
|
|
4
4
|
import { IRtIcon, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
|
|
5
|
+
import * as i1 from "@angular/cdk/scrolling";
|
|
5
6
|
/**
|
|
6
7
|
* Модель `<rt-profile-menu>`: один корневой неймспейс с префиксом `I`.
|
|
7
8
|
*/
|
|
@@ -99,5 +100,9 @@ export declare class RtProfileMenuComponent {
|
|
|
99
100
|
"changePassword": "changePassword";
|
|
100
101
|
"localeChange": "localeChange";
|
|
101
102
|
"signOut": "signOut";
|
|
102
|
-
}, never, never, true,
|
|
103
|
+
}, never, never, true, [{
|
|
104
|
+
directive: typeof i1.CdkScrollable;
|
|
105
|
+
inputs: {};
|
|
106
|
+
outputs: {};
|
|
107
|
+
}]>;
|
|
103
108
|
}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
-
import { InputSignalWithTransform, Signal, TemplateRef } from "@angular/core";
|
|
2
|
+
import { InputSignalWithTransform, OutputEmitterRef, Signal, TemplateRef } from "@angular/core";
|
|
3
|
+
export declare namespace IRtToolbar {
|
|
4
|
+
/** Где нарисован слот отборов: в полосе широкого экрана или в панели узкого. */
|
|
5
|
+
type TFiltersPlace = 'bar' | 'panel';
|
|
6
|
+
/** Контекст шаблона `rtToolbarFilters`: полю в панели нужна подпись над ним, полю в полосе — нет. */
|
|
7
|
+
interface IFiltersContext {
|
|
8
|
+
$implicit: TFiltersPlace;
|
|
9
|
+
}
|
|
10
|
+
/** Данные панели отборов: шаблон слота и два нажатия подвала. */
|
|
11
|
+
interface IFiltersPanelData {
|
|
12
|
+
template: TemplateRef<IFiltersContext>;
|
|
13
|
+
reset: () => void;
|
|
14
|
+
apply: () => void;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
3
17
|
/**
|
|
4
18
|
* Маркер-директива для контента в левой секции тулбара.
|
|
5
19
|
*
|
|
@@ -48,7 +62,35 @@ export declare class RtToolbarRightDirective {
|
|
|
48
62
|
static ɵfac: i0.ɵɵFactoryDeclaration<RtToolbarRightDirective, never>;
|
|
49
63
|
static ɵdir: i0.ɵɵDirectiveDeclaration<RtToolbarRightDirective, "[rtToolbarRight]", never, {}, {}, never, never, true, never>;
|
|
50
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Маркер-директива для отборов списка. На широком экране они стоят в левой секции после её
|
|
67
|
+
* содержимого, на узком — за кнопкой фильтров, которая открывает панель отборов. Контекст шаблона
|
|
68
|
+
* — место, где он нарисован: `bar` или `panel`.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```html
|
|
72
|
+
* <rt-toolbar [filtersActive]="hasFilter()" (filtersReset)="reset()">
|
|
73
|
+
* <ng-template rtToolbarFilters let-place>
|
|
74
|
+
* <rt-select [label]="place === 'panel' ? 'Статус' : null" … />
|
|
75
|
+
* </ng-template>
|
|
76
|
+
* </rt-toolbar>
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare class RtToolbarFiltersDirective {
|
|
80
|
+
static ngTemplateContextGuard(_directive: RtToolbarFiltersDirective, context: unknown): context is IRtToolbar.IFiltersContext;
|
|
81
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtToolbarFiltersDirective, never>;
|
|
82
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<RtToolbarFiltersDirective, "[rtToolbarFilters]", never, {}, {}, never, never, true, never>;
|
|
83
|
+
}
|
|
51
84
|
export declare class RtToolbarComponent {
|
|
85
|
+
#private;
|
|
86
|
+
protected readonly filtersLabel: Signal<string>;
|
|
87
|
+
/** Имя кнопки для скринридера: точку в углу он не видит, и включённый отбор назван словами. */
|
|
88
|
+
protected readonly filtersAriaLabel: Signal<string>;
|
|
89
|
+
protected readonly filtersTpl: Signal<TemplateRef<IRtToolbar.IFiltersContext> | undefined>;
|
|
90
|
+
/** Отборы ушли за кнопку: они объявлены, а место узкое. */
|
|
91
|
+
protected readonly collapsed: Signal<boolean>;
|
|
92
|
+
/** Отборы стоят в левой секции: они объявлены, а место широкое. */
|
|
93
|
+
protected readonly filtersInBar: Signal<boolean>;
|
|
52
94
|
protected readonly leftTpl: Signal<TemplateRef<unknown> | undefined>;
|
|
53
95
|
protected readonly centerTpl: Signal<TemplateRef<unknown> | undefined>;
|
|
54
96
|
protected readonly rightTpl: Signal<TemplateRef<unknown> | undefined>;
|
|
@@ -58,6 +100,14 @@ export declare class RtToolbarComponent {
|
|
|
58
100
|
* ≤768px, что для узкой шапки (напр. rt-chat) неверно.
|
|
59
101
|
*/
|
|
60
102
|
readonly dense: InputSignalWithTransform<boolean, boolean | string>;
|
|
103
|
+
/** Включён хотя бы один отбор: кнопка фильтров узкого экрана несёт точку в углу значка. */
|
|
104
|
+
readonly filtersActive: InputSignalWithTransform<boolean, boolean | string>;
|
|
105
|
+
/** Нажата «Применить» панели отборов; панель после этого закрыта. */
|
|
106
|
+
readonly filtersApply: OutputEmitterRef<void>;
|
|
107
|
+
/** Нажата «Сбросить» панели отборов; панель остаётся открытой. */
|
|
108
|
+
readonly filtersReset: OutputEmitterRef<void>;
|
|
109
|
+
constructor();
|
|
110
|
+
protected openFilters(): void;
|
|
61
111
|
static ɵfac: i0.ɵɵFactoryDeclaration<RtToolbarComponent, never>;
|
|
62
112
|
static ɵcmp: i0.ɵɵComponentDeclaration<RtToolbarComponent, "rt-toolbar", never, {
|
|
63
113
|
"dense": {
|
|
@@ -65,5 +115,32 @@ export declare class RtToolbarComponent {
|
|
|
65
115
|
"required": false;
|
|
66
116
|
"isSignal": true;
|
|
67
117
|
};
|
|
68
|
-
|
|
118
|
+
"filtersActive": {
|
|
119
|
+
"alias": "filtersActive";
|
|
120
|
+
"required": false;
|
|
121
|
+
"isSignal": true;
|
|
122
|
+
};
|
|
123
|
+
}, {
|
|
124
|
+
"filtersApply": "filtersApply";
|
|
125
|
+
"filtersReset": "filtersReset";
|
|
126
|
+
}, ["filtersTpl", "leftTpl", "centerTpl", "rightTpl"], never, true, never>;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Панель отборов полосы `rt-toolbar` на узком экране.
|
|
130
|
+
*
|
|
131
|
+
* Её поднимает кнопка фильтров полосы службой боковых панелей кита. В теле — слот
|
|
132
|
+
* `rtToolbarFilters` с контекстом `panel`; шапка — заголовок «Фильтры» и стрелка возврата, без
|
|
133
|
+
* надзаголовка и действий; подвал — «Сбросить» и «Применить» по краям. «Сбросить» сообщает о себе
|
|
134
|
+
* и оставляет панель открытой, «Применить» сообщает и закрывает, стрелка закрывает молча.
|
|
135
|
+
*/
|
|
136
|
+
export declare class RtToolbarFiltersAsideComponent {
|
|
137
|
+
#private;
|
|
138
|
+
protected readonly data: IRtToolbar.IFiltersPanelData;
|
|
139
|
+
protected readonly title: Signal<string>;
|
|
140
|
+
protected readonly resetLabel: Signal<string>;
|
|
141
|
+
protected readonly applyLabel: Signal<string>;
|
|
142
|
+
protected onReset(): void;
|
|
143
|
+
protected onApply(): void;
|
|
144
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtToolbarFiltersAsideComponent, never>;
|
|
145
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtToolbarFiltersAsideComponent, "rt-toolbar-filters-aside", never, {}, {}, never, never, true, never>;
|
|
69
146
|
}
|