@rt-tools/ui-kit-v2 0.35.1 → 0.37.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-action-bar.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +6 -4
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +22 -2
- package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +163 -22
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +23 -2
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +32 -6
- 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-workspace-details.mjs +29 -4
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +23 -2
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/components/ai-prompt-input/rt-ai-prompt-input.component.scss +2 -1
- package/src/lib/components/detail-list/rt-detail-row.component.scss +2 -0
- package/src/lib/components/page-header/rt-page-header-mobile.scss +6 -0
- package/src/lib/components/popover/CONTEXT.md +4 -0
- package/src/lib/components/tabs/rt-tabs.component.scss +19 -2
- package/src/lib/components/thread-list/rt-thread-list-messenger.scss +45 -0
- package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +9 -0
- package/src/lib/components/workspace/rt-workspace.component.scss +40 -0
- package/src/lib/components/workspace-details/rt-workspace-details.component.scss +26 -1
- package/src/rich-editor/lib/components/chat/rt-chat-messenger.scss +146 -0
- package/src/rich-editor/lib/components/chat/rt-chat.component.scss +6 -1
- package/src/rich-editor/lib/components/message-composer/rt-message-composer.component.scss +7 -2
- package/types/rt-tools-ui-kit-v2-ai-prompt-input.d.ts +14 -1
- package/types/rt-tools-ui-kit-v2-popover.d.ts +11 -0
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +40 -21
- package/types/rt-tools-ui-kit-v2-tabs.d.ts +7 -0
- package/types/rt-tools-ui-kit-v2-thread-list.d.ts +7 -0
- package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +14 -0
- package/types/rt-tools-ui-kit-v2-workspace.d.ts +7 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// Вид мессенджера чата: метки дней, ряд кнопок под полем, пузыри мягкие, свой — цвета действия.
|
|
2
|
+
// Лежит отдельно от стилей чата, чтобы оба файла уместились в предел длины.
|
|
3
|
+
@layer rt-kit.components {
|
|
4
|
+
.rt-chat {
|
|
5
|
+
&__day[hidden] {
|
|
6
|
+
display: none;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// Поле ответа мессенджера — рамка кита с рядом действий внутри, по ширине колонки
|
|
10
|
+
&__composer-prompt {
|
|
11
|
+
flex: 0 0 auto;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
&__day {
|
|
15
|
+
display: flex;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
padding-block-end: var(--rt-space-2);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
&__day-label {
|
|
21
|
+
padding: var(--rt-space-1) calc(var(--rt-space-2) + var(--rt-space-1));
|
|
22
|
+
border-radius: var(--rt-radius-full);
|
|
23
|
+
background: var(--rt-color-bg-surface);
|
|
24
|
+
color: var(--rt-color-text-muted);
|
|
25
|
+
font-size: var(--rt-text-xs);
|
|
26
|
+
font-weight: var(--rt-font-weight-medium);
|
|
27
|
+
|
|
28
|
+
&:first-letter {
|
|
29
|
+
text-transform: uppercase;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Вид мессенджера: пузырь мягкий, свой — цвета действия, пузырь гостя серый на белой ленте,
|
|
34
|
+
// время и знак доставки справа внизу
|
|
35
|
+
&--messenger {
|
|
36
|
+
--rt-chat-bubble-radius: var(--rt-radius-xl);
|
|
37
|
+
--rt-chat-bubble-own-bg: var(--rt-color-action-primary);
|
|
38
|
+
--rt-chat-bubble-in-bg: var(--rt-color-bg-subtle);
|
|
39
|
+
|
|
40
|
+
box-sizing: border-box;
|
|
41
|
+
padding: var(--rt-space-4);
|
|
42
|
+
|
|
43
|
+
// Высоту шапке дают имя и строка под ним, плотная полоса панели здесь не нужна
|
|
44
|
+
.rt-chat__header {
|
|
45
|
+
--rt-toolbar-height: auto;
|
|
46
|
+
--rt-toolbar-padding-top: 0;
|
|
47
|
+
--rt-toolbar-padding-bottom: calc(var(--rt-space-2) + var(--rt-space-1));
|
|
48
|
+
|
|
49
|
+
border-block-end: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
|
|
50
|
+
|
|
51
|
+
.rt-toolbar__bar--left {
|
|
52
|
+
gap: calc(var(--rt-space-2) + var(--rt-space-1));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Реплики прижаты к низу ленты, к полю ответа: короткий разговор не висит под шапкой
|
|
57
|
+
.rt-chat__thread {
|
|
58
|
+
padding: var(--rt-space-5) var(--rt-space-6);
|
|
59
|
+
border-radius: var(--rt-radius-lg);
|
|
60
|
+
background: var(--rt-color-bg-surface);
|
|
61
|
+
gap: var(--rt-space-1);
|
|
62
|
+
|
|
63
|
+
> :first-child {
|
|
64
|
+
margin-block-start: auto;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.rt-chat__message {
|
|
69
|
+
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) var(--rt-radius-sm);
|
|
71
|
+
gap: var(--rt-space-0-5);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Смена стороны отбита сильнее, чем реплики одного автора подряд. Между репликами
|
|
75
|
+
// стоит скрытая метка дня, поэтому сосед ищется через неё
|
|
76
|
+
.rt-chat__message-row--own + .rt-chat__day[hidden] + .rt-chat__message-row:not(.rt-chat__message-row--own),
|
|
77
|
+
.rt-chat__message-row:not(.rt-chat__message-row--own) + .rt-chat__day[hidden] + .rt-chat__message-row--own {
|
|
78
|
+
margin-block-start: calc(var(--rt-space-2) + var(--rt-space-1));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.rt-chat__message--own {
|
|
82
|
+
border-radius: var(--rt-chat-bubble-radius) var(--rt-chat-bubble-radius) var(--rt-radius-sm) var(--rt-chat-bubble-radius);
|
|
83
|
+
box-shadow: none;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.rt-chat__title {
|
|
87
|
+
line-height: var(--rt-leading-normal);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Высота строки округлена до целого пикселя, как у текстового блока макета: иначе дробные
|
|
91
|
+
// доли копятся от строки к строке и сдвигают всё ниже
|
|
92
|
+
.rt-chat__subtitle {
|
|
93
|
+
line-height: round(1em * var(--rt-leading-tight), 1px);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.rt-chat__message-text {
|
|
97
|
+
font-size: var(--rt-text-sm);
|
|
98
|
+
line-height: round(1em * var(--rt-leading-tight), 1px);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.rt-chat__message--own .rt-chat__message-text,
|
|
102
|
+
.rt-chat__message--own .rt-chat__message-date,
|
|
103
|
+
.rt-chat__message--own .rt-chat__message-status {
|
|
104
|
+
color: var(--rt-color-action-on-primary);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// На своём пузыре время и галочки тише текста: время прозрачнее, галочки чуть плотнее
|
|
108
|
+
.rt-chat__message--own .rt-chat__message-date {
|
|
109
|
+
opacity: 0.75;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.rt-chat__message--own .rt-chat__message-status {
|
|
113
|
+
opacity: 0.85;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.rt-chat__message-footer {
|
|
117
|
+
justify-content: flex-end;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Кнопки у реплики стоят одной панелью: у входящей справа от пузыря, у своей слева
|
|
121
|
+
.rt-chat__message-actions {
|
|
122
|
+
display: flex;
|
|
123
|
+
align-items: center;
|
|
124
|
+
padding: var(--rt-space-0-5);
|
|
125
|
+
border: var(--rt-border-width-thin) solid var(--rt-color-border-subtle);
|
|
126
|
+
border-radius: var(--rt-radius-lg);
|
|
127
|
+
background: var(--rt-color-bg-surface);
|
|
128
|
+
box-shadow: var(--rt-shadow-sm);
|
|
129
|
+
gap: var(--rt-space-0-5);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.rt-chat__message-row:not(.rt-chat__message-row--own) .rt-chat__message-actions {
|
|
133
|
+
order: 1;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.rt-chat__message-date {
|
|
137
|
+
font-size: var(--rt-text-2xs);
|
|
138
|
+
line-height: round(1em * var(--rt-leading-tight), 1px);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.rt-chat__message-author {
|
|
142
|
+
display: none;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -72,12 +72,15 @@
|
|
|
72
72
|
max-height: none;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
// Знак канала стоит перед заголовком и не
|
|
75
|
+
// Знак канала стоит перед заголовком и не сжимается рядом с длинным заголовком.
|
|
76
76
|
&__sign {
|
|
77
77
|
flex: none;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
// Шапка — плотная полоса постоянной высоты: перенесённый заголовок вышел бы из неё вверх
|
|
81
|
+
// и вниз, поэтому длинный режется многоточием, а целиком виден в подсказке
|
|
80
82
|
&__title {
|
|
83
|
+
overflow: hidden;
|
|
81
84
|
margin: 0;
|
|
82
85
|
color: var(--rt-color-text-primary);
|
|
83
86
|
font-family: var(--rt-font-family-sans);
|
|
@@ -85,6 +88,8 @@
|
|
|
85
88
|
font-weight: var(--rt-font-weight-bold);
|
|
86
89
|
letter-spacing: var(--rt-letter-spacing-wide);
|
|
87
90
|
line-height: var(--rt-leading-snug);
|
|
91
|
+
text-overflow: ellipsis;
|
|
92
|
+
white-space: nowrap;
|
|
88
93
|
}
|
|
89
94
|
|
|
90
95
|
// Заголовок и строка под ним стоят столбцом; длинный контакт режется многоточием,
|
|
@@ -80,8 +80,13 @@
|
|
|
80
80
|
min-inline-size: 0;
|
|
81
81
|
outline: 0;
|
|
82
82
|
|
|
83
|
-
/*
|
|
84
|
-
|
|
83
|
+
/* Отступ 7 сверху и снизу, как в компоненте Message Composer дизайн-системы: поле в одну
|
|
84
|
+
строку ниже кнопки и прижато к низу строки, текст стоит ниже середины кнопки. */
|
|
85
|
+
padding-block: 7px;
|
|
86
|
+
|
|
87
|
+
/* Боковой отступ браузера у textarea снят: текст стоит на внешнем отступе, как в макете,
|
|
88
|
+
и замер автовысоты видит ту же ширину, что и экран. */
|
|
89
|
+
padding-inline: 0;
|
|
85
90
|
resize: none;
|
|
86
91
|
|
|
87
92
|
/* Место под ползунок держится всегда, и на замере автовысоты тоже: иначе появившийся
|
|
@@ -25,6 +25,19 @@ export declare function rtPromptCanSend(text: string, files: number, busy: boole
|
|
|
25
25
|
* элемент ряда включается своим входом: без значения его нет. Что открывает нажатие на модель,
|
|
26
26
|
* усилие и режим, решает приложение: поле сообщает, какую кнопку нажали.
|
|
27
27
|
*
|
|
28
|
+
* Свои элементы ряда приложение кладёт проекцией: с меткой `rtPromptInputStart` они встают слева
|
|
29
|
+
* после «+», с меткой `rtPromptInputEnd` справа перед моделью и отправкой. Подходит любой
|
|
30
|
+
* элемент высотой с кнопку sm: кнопка-иконка, кнопка с текстом, выпадающий список.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```html
|
|
34
|
+
* <rt-ai-prompt-input attachments>
|
|
35
|
+
* <rt-icon-button rtPromptInputStart icon="bolt" variant="ghost" size="sm" ariaLabel="Быстрые ответы" />
|
|
36
|
+
* <button rtButton rtPromptInputStart appearance="text" size="sm" label="Отправить позже"></button>
|
|
37
|
+
* <rt-icon-button rtPromptInputEnd icon="mic" variant="ghost" size="sm" ariaLabel="Голос" />
|
|
38
|
+
* </rt-ai-prompt-input>
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
28
41
|
* Подсказка стоит отдельной строкой под полем или над ним, в ряд действий она не входит.
|
|
29
42
|
*
|
|
30
43
|
* Отправка — `Enter` без Shift или кнопка со стрелкой; `Shift+Enter` переносит строку. Со
|
|
@@ -189,5 +202,5 @@ export declare class RtAiPromptInputComponent {
|
|
|
189
202
|
"submitted": "submitted";
|
|
190
203
|
"stopped": "stopped";
|
|
191
204
|
"controlPicked": "controlPicked";
|
|
192
|
-
}, never,
|
|
205
|
+
}, never, ["[rtPromptInputStart]", "[rtPromptInputEnd]"], true, never>;
|
|
193
206
|
}
|
|
@@ -57,6 +57,12 @@ export declare class RtPopoverDirective implements OnDestroy {
|
|
|
57
57
|
readonly fitViewport: InputSignalWithTransform<boolean, BooleanInput>;
|
|
58
58
|
readonly context: InputSignal<unknown>;
|
|
59
59
|
readonly panelClass: InputSignal<string>;
|
|
60
|
+
/**
|
|
61
|
+
* Класс подложки под панелью. Пусто — подложки нет, и страница рядом с панелью остаётся
|
|
62
|
+
* открытой. Заданный ставит подложку на весь экран: её вид задаёт класс, а нажатие по ней
|
|
63
|
+
* закрывает панель так же, как нажатие снаружи. Читается при первом открытии.
|
|
64
|
+
*/
|
|
65
|
+
readonly backdropClass: InputSignal<string>;
|
|
60
66
|
readonly disabled: InputSignalWithTransform<boolean, BooleanInput>;
|
|
61
67
|
readonly offsetY: InputSignalWithTransform<number, NumberInput>;
|
|
62
68
|
readonly offsetX: InputSignalWithTransform<number, NumberInput>;
|
|
@@ -113,6 +119,11 @@ export declare class RtPopoverDirective implements OnDestroy {
|
|
|
113
119
|
"required": false;
|
|
114
120
|
"isSignal": true;
|
|
115
121
|
};
|
|
122
|
+
"backdropClass": {
|
|
123
|
+
"alias": "rtPopoverBackdropClass";
|
|
124
|
+
"required": false;
|
|
125
|
+
"isSignal": true;
|
|
126
|
+
};
|
|
116
127
|
"disabled": {
|
|
117
128
|
"alias": "rtPopoverDisabled";
|
|
118
129
|
"required": false;
|
|
@@ -357,6 +357,27 @@ export declare class RtChatMessageActionsDirective {
|
|
|
357
357
|
static ɵfac: i0.ɵɵFactoryDeclaration<RtChatMessageActionsDirective, never>;
|
|
358
358
|
static ɵdir: i0.ɵɵDirectiveDeclaration<RtChatMessageActionsDirective, "ng-template[rtChatMessageActions]", never, {}, {}, never, never, true, never>;
|
|
359
359
|
}
|
|
360
|
+
/**
|
|
361
|
+
* Захватывает `<ng-template rtChatMessageButtons let-message>` — кнопки у реплики перед «…»-меню.
|
|
362
|
+
* Частое действие, например «ответить», стоит кнопкой и не прячется в меню. В виде мессенджера
|
|
363
|
+
* кнопки и меню стоят одной панелью у пузыря.
|
|
364
|
+
*
|
|
365
|
+
* @example
|
|
366
|
+
* ```html
|
|
367
|
+
* <rt-chat messenger [messages]="messages()">
|
|
368
|
+
* <ng-template rtChatMessageButtons let-message>
|
|
369
|
+
* <rt-icon-button icon="reply" variant="ghost" size="sm" ariaLabel="Ответить" (clicked)="reply(message)" />
|
|
370
|
+
* </ng-template>
|
|
371
|
+
* </rt-chat>
|
|
372
|
+
* ```
|
|
373
|
+
*/
|
|
374
|
+
export declare class RtChatMessageButtonsDirective {
|
|
375
|
+
readonly template: TemplateRef<IRtChatMessageActionsContext>;
|
|
376
|
+
/** Type-guard: сужает контекст шаблона до реплики при проверке шаблонов. */
|
|
377
|
+
static ngTemplateContextGuard(_directive: RtChatMessageButtonsDirective, context: unknown): context is IRtChatMessageActionsContext;
|
|
378
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtChatMessageButtonsDirective, never>;
|
|
379
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<RtChatMessageButtonsDirective, "ng-template[rtChatMessageButtons]", never, {}, {}, never, never, true, never>;
|
|
380
|
+
}
|
|
360
381
|
/**
|
|
361
382
|
* Общий презентационный чат: тред сообщений + композер. История приходит готовым массивом
|
|
362
383
|
* `IRtChat.Message[]`, отправка, обновление, скачивание и набор текста уходят наружу выходами;
|
|
@@ -396,36 +417,24 @@ export declare class RtChatComponent {
|
|
|
396
417
|
}>;
|
|
397
418
|
/** Композер заблокирован при загрузке/рефреше треда или отправке in-flight. */
|
|
398
419
|
protected readonly composerDisabled: Signal<boolean>;
|
|
399
|
-
/**
|
|
400
|
-
* Можно ли отправить: композер активен и есть содержимое — непустой текст или
|
|
401
|
-
* (при включённых вложениях) хотя бы один файл. Сообщение само по себе не
|
|
402
|
-
* бывает «невалидным» — пустоту гасим дизейблом кнопки, а не подсветкой поля.
|
|
403
|
-
*/
|
|
420
|
+
/** Можно ли отправить: пустоту гасит выключенная кнопка, поле не подсвечивается ошибкой */
|
|
404
421
|
protected readonly canSend: Signal<boolean>;
|
|
422
|
+
/** Подписи дней над первым сообщением каждого дня — только в виде мессенджера */
|
|
423
|
+
protected readonly dayLabels: Signal<ReadonlyMap<number | string, string>>;
|
|
405
424
|
/** Показывать ли шапку: только когда включена хотя бы одна иконка. */
|
|
406
425
|
protected readonly showHeader: Signal<boolean>;
|
|
407
426
|
/** Подпись кнопки fullscreen: тернарник в шаблоне переводом не покрыть. */
|
|
408
427
|
protected readonly expandLabel: Signal<string>;
|
|
409
428
|
/** Выбранные, но ещё не отправленные файлы — карточки над полем ввода. */
|
|
410
429
|
protected readonly selectedFiles: Signal<File[]>;
|
|
411
|
-
/**
|
|
412
|
-
* Drop-зона активна только когда вложения включены, ответ доступен и композер
|
|
413
|
-
* не занят (загрузка/рефреш/отправка). Иначе обёртка `rt-file-drop` просто
|
|
414
|
-
* пропускает контент без оверлея.
|
|
415
|
-
*/
|
|
430
|
+
/** Drop-зона активна при включённых вложениях, доступном ответе и свободном композере */
|
|
416
431
|
protected readonly dropDisabled: Signal<boolean>;
|
|
417
|
-
/**
|
|
418
|
-
* Файл из drag-n-drop для rich-композера: каждый drop кладёт новый `File`,
|
|
419
|
-
* пробрасывается в `rt-message-composer` через input. Классический композер
|
|
420
|
-
* принимает drop напрямую в свой `replyForm`.
|
|
421
|
-
*/
|
|
432
|
+
/** Файлы drop для rich-композера; классический композер принимает drop в свой `replyForm` */
|
|
422
433
|
protected readonly droppedFiles: WritableSignal<File[] | null>;
|
|
423
|
-
/**
|
|
424
|
-
* Шаблон действий у реплики: `<ng-template rtChatMessageActions let-message>`.
|
|
425
|
-
*
|
|
426
|
-
* Не объявлен — разметка реплики прежняя, и лишней кнопки у неё не появляется.
|
|
427
|
-
*/
|
|
434
|
+
/** Шаблон действий у реплики `<ng-template rtChatMessageActions>`; не объявлен — кнопки нет */
|
|
428
435
|
protected readonly messageActions: Signal<RtChatMessageActionsDirective | undefined>;
|
|
436
|
+
/** Кнопки у реплики перед меню `<ng-template rtChatMessageButtons>`; не объявлены — кнопок нет */
|
|
437
|
+
protected readonly messageButtons: Signal<RtChatMessageButtonsDirective | undefined>;
|
|
429
438
|
/** История сообщений (consumer уже смаппил из доменной модели). */
|
|
430
439
|
readonly messages: InputSignal<readonly IRtChat.Message[]>;
|
|
431
440
|
/** Первичная загрузка — скелетоны вместо треда. */
|
|
@@ -480,6 +489,11 @@ export declare class RtChatComponent {
|
|
|
480
489
|
*/
|
|
481
490
|
readonly fill: InputSignalWithTransform<boolean, BooleanInput>;
|
|
482
491
|
/** Показать иконку refresh в шапке. */
|
|
492
|
+
/**
|
|
493
|
+
* Вид мессенджера: без подписи автора, свой пузырь цвета действия, время без даты, над
|
|
494
|
+
* сообщениями дня — его подпись, поле ответа в одну строку с рядом кнопок под ним.
|
|
495
|
+
*/
|
|
496
|
+
readonly messenger: InputSignalWithTransform<boolean, BooleanInput>;
|
|
483
497
|
readonly showRefresh: InputSignalWithTransform<boolean, BooleanInput>;
|
|
484
498
|
/** Показать иконку expand (fullscreen) в шапке. */
|
|
485
499
|
readonly showExpand: InputSignalWithTransform<boolean, BooleanInput>;
|
|
@@ -617,6 +631,11 @@ export declare class RtChatComponent {
|
|
|
617
631
|
"required": false;
|
|
618
632
|
"isSignal": true;
|
|
619
633
|
};
|
|
634
|
+
"messenger": {
|
|
635
|
+
"alias": "messenger";
|
|
636
|
+
"required": false;
|
|
637
|
+
"isSignal": true;
|
|
638
|
+
};
|
|
620
639
|
"showRefresh": {
|
|
621
640
|
"alias": "showRefresh";
|
|
622
641
|
"required": false;
|
|
@@ -646,7 +665,7 @@ export declare class RtChatComponent {
|
|
|
646
665
|
"expandedChange": "expandedChange";
|
|
647
666
|
"deleteMessage": "deleteMessage";
|
|
648
667
|
"retryMessage": "retryMessage";
|
|
649
|
-
}, ["messageActions"], ["[rtChatHeaderActions]", "[rtChatFooter]"], true, never>;
|
|
668
|
+
}, ["messageActions", "messageButtons"], ["[rtChatHeaderActions]", "[rtChatComposerTools]", "[rtChatFooter]"], true, never>;
|
|
650
669
|
}
|
|
651
670
|
/**
|
|
652
671
|
* Есть ли у реплики хотя бы одно доступное действие потребителя.
|
|
@@ -454,6 +454,8 @@ export declare class RtTabsComponent {
|
|
|
454
454
|
readonly direction: InputSignal<IRtTabs.Direction>;
|
|
455
455
|
/** Растягивать вкладки на всю ширину полосы. */
|
|
456
456
|
readonly stretch: InputSignalWithTransform<boolean, BooleanInput>;
|
|
457
|
+
/** Плотные вкладки: отступ 8 по бокам, чтобы в узкую панель влезло больше вкладок */
|
|
458
|
+
readonly dense: InputSignalWithTransform<boolean, BooleanInput>;
|
|
457
459
|
/** Скроллить область контента при переполнении. */
|
|
458
460
|
readonly contentScrollable: InputSignalWithTransform<boolean, BooleanInput>;
|
|
459
461
|
/**
|
|
@@ -519,6 +521,11 @@ export declare class RtTabsComponent {
|
|
|
519
521
|
"required": false;
|
|
520
522
|
"isSignal": true;
|
|
521
523
|
};
|
|
524
|
+
"dense": {
|
|
525
|
+
"alias": "dense";
|
|
526
|
+
"required": false;
|
|
527
|
+
"isSignal": true;
|
|
528
|
+
};
|
|
522
529
|
"contentScrollable": {
|
|
523
530
|
"alias": "contentScrollable";
|
|
524
531
|
"required": false;
|
|
@@ -130,6 +130,8 @@ export declare class RtThreadListComponent<TRow extends IRtThreadList.Row> imple
|
|
|
130
130
|
readonly fetching: InputSignalWithTransform<boolean, boolean | string>;
|
|
131
131
|
readonly hasMore: InputSignalWithTransform<boolean, boolean | string>;
|
|
132
132
|
readonly filtersActive: InputSignalWithTransform<boolean, boolean | string>;
|
|
133
|
+
/** Вид мессенджера: колонка с полями, строки карточками со скруглением, без левой полосы */
|
|
134
|
+
readonly messenger: InputSignalWithTransform<boolean, boolean | string>;
|
|
133
135
|
readonly selectRow: OutputEmitterRef<IRtThreadList.TRowId>;
|
|
134
136
|
readonly openInNewTab: OutputEmitterRef<IRtThreadList.TRowId>;
|
|
135
137
|
readonly searchChange: OutputEmitterRef<string>;
|
|
@@ -184,6 +186,11 @@ export declare class RtThreadListComponent<TRow extends IRtThreadList.Row> imple
|
|
|
184
186
|
"required": false;
|
|
185
187
|
"isSignal": true;
|
|
186
188
|
};
|
|
189
|
+
"messenger": {
|
|
190
|
+
"alias": "messenger";
|
|
191
|
+
"required": false;
|
|
192
|
+
"isSignal": true;
|
|
193
|
+
};
|
|
187
194
|
}, {
|
|
188
195
|
"selectRow": "selectRow";
|
|
189
196
|
"openInNewTab": "openInNewTab";
|
|
@@ -5,8 +5,15 @@ import { FormControl, FormGroup } from "@angular/forms";
|
|
|
5
5
|
import { IButton, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
|
|
6
6
|
import { IRtConfirmPopover } from "@rt-tools/ui-kit-v2/confirm-popover";
|
|
7
7
|
import { IRtSelect } from "@rt-tools/ui-kit-v2/select";
|
|
8
|
+
import { IRtServiceLogo } from "@rt-tools/ui-kit-v2/service-logo";
|
|
8
9
|
import { IRtTimeline } from "@rt-tools/ui-kit-v2/timeline";
|
|
9
10
|
export declare namespace IRtWorkspaceDetails {
|
|
11
|
+
/** Верх сведений о человеке: знак канала, имя и контакт по центру над строками */
|
|
12
|
+
interface Profile {
|
|
13
|
+
sign: IRtServiceLogo.Item | null;
|
|
14
|
+
name: string;
|
|
15
|
+
contact: string;
|
|
16
|
+
}
|
|
10
17
|
interface Row {
|
|
11
18
|
label: string;
|
|
12
19
|
value: string;
|
|
@@ -95,6 +102,8 @@ export declare class RtWorkspaceDetailsComponent {
|
|
|
95
102
|
readonly loading: InputSignalWithTransform<boolean, BooleanInput>;
|
|
96
103
|
readonly busy: InputSignalWithTransform<boolean, BooleanInput>;
|
|
97
104
|
readonly rows: InputSignal<readonly IRtWorkspaceDetails.Row[]>;
|
|
105
|
+
/** Верх сведений о человеке над строками: без него сведения начинаются со строк */
|
|
106
|
+
readonly profile: InputSignal<IRtWorkspaceDetails.Profile | null>;
|
|
98
107
|
readonly agentEdit: InputSignal<IRtWorkspaceDetails.AgentEdit | null>;
|
|
99
108
|
readonly money: InputSignal<readonly IRtWorkspaceDetails.MoneyRow[]>;
|
|
100
109
|
readonly toggles: InputSignal<readonly IRtWorkspaceDetails.Toggle[]>;
|
|
@@ -146,6 +155,11 @@ export declare class RtWorkspaceDetailsComponent {
|
|
|
146
155
|
"required": false;
|
|
147
156
|
"isSignal": true;
|
|
148
157
|
};
|
|
158
|
+
"profile": {
|
|
159
|
+
"alias": "profile";
|
|
160
|
+
"required": false;
|
|
161
|
+
"isSignal": true;
|
|
162
|
+
};
|
|
149
163
|
"agentEdit": {
|
|
150
164
|
"alias": "agentEdit";
|
|
151
165
|
"required": false;
|
|
@@ -53,6 +53,8 @@ export declare class RtWorkspaceComponent implements IRtWorkspace.PanelApi {
|
|
|
53
53
|
protected readonly slotContext: IRtWorkspace.SlotContext;
|
|
54
54
|
readonly storageKey: InputSignal<string | null>;
|
|
55
55
|
readonly hasActive: InputSignalWithTransform<boolean, BooleanInput>;
|
|
56
|
+
/** Колонки стоят отдельными карточками с зазором, без линий между ними */
|
|
57
|
+
readonly cards: InputSignalWithTransform<boolean, BooleanInput>;
|
|
56
58
|
readonly listMinWidth: InputSignalWithTransform<number, number | string>;
|
|
57
59
|
readonly listMaxWidth: InputSignalWithTransform<number, number | string>;
|
|
58
60
|
readonly listDefaultWidth: InputSignalWithTransform<number, number | string>;
|
|
@@ -86,6 +88,11 @@ export declare class RtWorkspaceComponent implements IRtWorkspace.PanelApi {
|
|
|
86
88
|
"required": false;
|
|
87
89
|
"isSignal": true;
|
|
88
90
|
};
|
|
91
|
+
"cards": {
|
|
92
|
+
"alias": "cards";
|
|
93
|
+
"required": false;
|
|
94
|
+
"isSignal": true;
|
|
95
|
+
};
|
|
89
96
|
"listMinWidth": {
|
|
90
97
|
"alias": "listMinWidth";
|
|
91
98
|
"required": false;
|