@rt-tools/ui-kit-v2 0.40.0 → 0.41.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-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +13 -5
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +48 -24
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/components/data-table/CONTEXT.md +5 -0
- package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +15 -0
- package/src/lib/components/data-table/stories/component/test-data-table-matrix.component.scss +10 -0
- package/src/rich-editor/lib/components/chat/CONTEXT.md +13 -1
- package/src/rich-editor/lib/components/chat/rt-chat-messenger.scss +28 -14
- package/src/rich-editor/lib/components/chat/rt-chat.component.scss +21 -0
- package/types/rt-tools-ui-kit-v2-core.d.ts +7 -0
- package/types/rt-tools-ui-kit-v2-data-table.d.ts +11 -1
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +12 -1
package/package.json
CHANGED
|
@@ -80,6 +80,11 @@
|
|
|
80
80
|
глифом шрифта Material Symbols, как первый кит. Шрифт кит не везёт: глиф виден, где его подключило
|
|
81
81
|
приложение.
|
|
82
82
|
|
|
83
|
+
**Размер значка ячейки задаёт поле `icon.size` колонки:** `sm`, `md` или `lg`, без поля — `lg`;
|
|
84
|
+
значение не из списка, пришедшее из сохранённых настроек мимо типов, тоже рисуется как `lg`.
|
|
85
|
+
Ячейка сама ставит ступени значка `--rt-icon-step-*`, и глиф читает те же свойства: значок набора
|
|
86
|
+
и глиф в одной колонке одного размера, даже если предок сменил ступени для своих детей.
|
|
87
|
+
|
|
83
88
|
## Части семейства
|
|
84
89
|
|
|
85
90
|
| Часть | Что делает |
|
|
@@ -8,6 +8,12 @@
|
|
|
8
8
|
--rt-data-table-cell-transition-duration: var(--rt-duration-fast);
|
|
9
9
|
--rt-data-table-cell-glyph-size: var(--rt-size-6);
|
|
10
10
|
|
|
11
|
+
/* Значок набора в ячейке идёт теми же ступенями, что глиф: предок, сменивший ступень
|
|
12
|
+
значка для своих детей, иначе развёл бы их размеры в одной колонке. */
|
|
13
|
+
--rt-icon-step-sm: var(--rt-size-4);
|
|
14
|
+
--rt-icon-step-md: var(--rt-size-5);
|
|
15
|
+
--rt-icon-step-lg: var(--rt-size-6);
|
|
16
|
+
|
|
11
17
|
position: relative;
|
|
12
18
|
display: flex;
|
|
13
19
|
width: 100%;
|
|
@@ -34,6 +40,15 @@
|
|
|
34
40
|
&--filled {
|
|
35
41
|
font-variation-settings: 'FILL' 1;
|
|
36
42
|
}
|
|
43
|
+
|
|
44
|
+
/* Размер значка из описания колонки — те же ступени, что у значка кита в ячейке. */
|
|
45
|
+
&--sm {
|
|
46
|
+
--rt-data-table-cell-glyph-size: var(--rt-icon-step-sm);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
&--md {
|
|
50
|
+
--rt-data-table-cell-glyph-size: var(--rt-icon-step-md);
|
|
51
|
+
}
|
|
37
52
|
}
|
|
38
53
|
|
|
39
54
|
&__prefix,
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* Пояснение под матрицей: почему в колонке глифа видно начало слова, а не значок. Ширина —
|
|
3
|
+
две ступени по 400px, чтобы строка не тянулась на всю витрину. */
|
|
4
|
+
.app-data-table-matrix__note {
|
|
5
|
+
max-width: calc(var(--rt-size-100) * 2);
|
|
6
|
+
color: var(--rt-color-text-muted);
|
|
7
|
+
font-size: var(--rt-text-sm);
|
|
8
|
+
line-height: var(--rt-leading-relaxed);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -47,7 +47,19 @@ rtChatMessageActions let-message>` рисуется в меню «…» у ре
|
|
|
47
47
|
**Готовый текст подставляет метод `setDraft`.** Он заменяет черновик во всех трёх полях ответа и
|
|
48
48
|
ставит курсор в конец. Файлы остаются, сигнала набора нет, закрытое поле текст не принимает.
|
|
49
49
|
Работу метода показывает история `QuickReplies` страницы переписки: кнопка у поля ответа и
|
|
50
|
-
подсказка в боковой панели ставят текст в поле, гостю ничего не уходит.
|
|
50
|
+
подсказка в боковой панели ставят текст в поле, гостю ничего не уходит. Метод `draftText` читает
|
|
51
|
+
текст поля без разметки и файлы не трогает.
|
|
52
|
+
|
|
53
|
+
**Подпись на пузыре даёт приложение.** `dateLabel` стоит вместо времени, `dateIcon` на месте значка
|
|
54
|
+
статуса. Значки ошибки отправки и недоставки остаются: они предупреждают. Подписи дней считаются от
|
|
55
|
+
`createdAt`.
|
|
56
|
+
|
|
57
|
+
**Пузырь мессенджера не шире 85% ленты и не шире 320.** Предел стоит на пузыре, а не на строке:
|
|
58
|
+
кнопки у реплики лежат рядом и не отнимают его ширину. Значок статуса 16, подпись и значок на своём
|
|
59
|
+
пузыре без прозрачности, пузырь гостя белый с тенью. Боковой отступ чата 16, на узком месте 12.
|
|
60
|
+
|
|
61
|
+
**Слот `rtChatComposerBar` стоит над рамкой поля ответа** во всех видах поля. Пустой слот места не
|
|
62
|
+
занимает, а без поля слота нет.
|
|
51
63
|
|
|
52
64
|
**Удалённое сообщение остаётся в ленте** отдельной пометкой вместо текста: иначе непонятно, на
|
|
53
65
|
что отвечали соседние реплики.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// Вид мессенджера чата: метки дней, ряд кнопок под полем, пузыри мягкие, свой — цвета действия.
|
|
2
2
|
// Лежит отдельно от стилей чата, чтобы оба файла уместились в предел длины.
|
|
3
|
+
@use '../../../../styles/breakpoints' as bp;
|
|
4
|
+
|
|
3
5
|
@layer rt-kit.components {
|
|
4
6
|
.rt-chat {
|
|
5
7
|
--rt-chat-day-label-radius: var(--rt-radius-full);
|
|
@@ -32,20 +34,25 @@
|
|
|
32
34
|
}
|
|
33
35
|
}
|
|
34
36
|
|
|
35
|
-
// Вид мессенджера: пузырь мягкий, свой — цвета действия, пузырь гостя
|
|
36
|
-
// время и знак доставки справа внизу
|
|
37
|
+
// Вид мессенджера: пузырь мягкий, свой — цвета действия, пузырь гостя белый с тенью на белой
|
|
38
|
+
// ленте, время и знак доставки справа внизу
|
|
37
39
|
&--messenger {
|
|
38
40
|
--rt-chat-bubble-radius: var(--rt-radius-xl);
|
|
39
41
|
--rt-chat-bubble-corner-radius: var(--rt-radius-sm);
|
|
40
42
|
--rt-chat-messenger-border-width: var(--rt-border-width-thin);
|
|
41
43
|
--rt-chat-messenger-panel-radius: var(--rt-radius-lg);
|
|
42
44
|
--rt-chat-messenger-actions-shadow: var(--rt-shadow-sm);
|
|
45
|
+
--rt-chat-bubble-in-shadow: var(--rt-shadow-sm);
|
|
43
46
|
--rt-chat-bubble-own-bg: var(--rt-color-action-primary);
|
|
44
|
-
--rt-chat-bubble-in-bg: var(--rt-color-bg-
|
|
47
|
+
--rt-chat-bubble-in-bg: var(--rt-color-bg-surface);
|
|
45
48
|
|
|
46
49
|
box-sizing: border-box;
|
|
47
50
|
padding: var(--rt-space-4);
|
|
48
51
|
|
|
52
|
+
@include bp.place-max(bp.$rt-bp-md) {
|
|
53
|
+
padding: calc(var(--rt-space-2) + var(--rt-space-1));
|
|
54
|
+
}
|
|
55
|
+
|
|
49
56
|
// Высоту шапке дают имя и строка под ним, плотная полоса панели здесь не нужна
|
|
50
57
|
.rt-chat__header {
|
|
51
58
|
--rt-toolbar-height: auto;
|
|
@@ -69,12 +76,29 @@
|
|
|
69
76
|
> :first-child {
|
|
70
77
|
margin-block-start: auto;
|
|
71
78
|
}
|
|
79
|
+
|
|
80
|
+
@include bp.place-max(bp.$rt-bp-sm) {
|
|
81
|
+
padding-inline: calc(var(--rt-space-2) + var(--rt-space-1));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Строка занимает всю ленту: кнопки у реплики стоят рядом и не отнимают ширину пузыря
|
|
86
|
+
.rt-chat__message-row {
|
|
87
|
+
width: 100%;
|
|
88
|
+
max-width: 100%;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.rt-chat__message-row--own {
|
|
92
|
+
justify-content: flex-end;
|
|
72
93
|
}
|
|
73
94
|
|
|
74
95
|
.rt-chat__message {
|
|
96
|
+
max-width: round(min(85%, 320px), 1px);
|
|
97
|
+
box-sizing: border-box;
|
|
75
98
|
padding: var(--rt-space-2) calc(var(--rt-space-2) + var(--rt-space-1)) var(--rt-space-1);
|
|
76
99
|
border-radius: var(--rt-chat-bubble-radius) var(--rt-chat-bubble-radius) var(--rt-chat-bubble-radius)
|
|
77
100
|
var(--rt-chat-bubble-corner-radius);
|
|
101
|
+
box-shadow: var(--rt-chat-bubble-in-shadow);
|
|
78
102
|
gap: var(--rt-space-0-5);
|
|
79
103
|
}
|
|
80
104
|
|
|
@@ -103,7 +127,7 @@
|
|
|
103
127
|
|
|
104
128
|
.rt-chat__message-text {
|
|
105
129
|
font-size: var(--rt-text-sm);
|
|
106
|
-
line-height: round(1em * var(--rt-leading-
|
|
130
|
+
line-height: round(1em * var(--rt-leading-snug), 1px);
|
|
107
131
|
}
|
|
108
132
|
|
|
109
133
|
.rt-chat__message--own .rt-chat__message-text,
|
|
@@ -112,15 +136,6 @@
|
|
|
112
136
|
color: var(--rt-color-action-on-primary);
|
|
113
137
|
}
|
|
114
138
|
|
|
115
|
-
// На своём пузыре время и галочки тише текста: время прозрачнее, галочки чуть плотнее
|
|
116
|
-
.rt-chat__message--own .rt-chat__message-date {
|
|
117
|
-
opacity: 0.75;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
.rt-chat__message--own .rt-chat__message-status {
|
|
121
|
-
opacity: 0.85;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
139
|
.rt-chat__message-footer {
|
|
125
140
|
justify-content: flex-end;
|
|
126
141
|
}
|
|
@@ -143,7 +158,6 @@
|
|
|
143
158
|
|
|
144
159
|
.rt-chat__message-date {
|
|
145
160
|
font-size: var(--rt-text-2xs);
|
|
146
|
-
line-height: round(1em * var(--rt-leading-tight), 1px);
|
|
147
161
|
}
|
|
148
162
|
|
|
149
163
|
.rt-chat__message-author {
|
|
@@ -176,6 +176,24 @@
|
|
|
176
176
|
}
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
+
&__composer-bar {
|
|
180
|
+
display: flex;
|
|
181
|
+
flex: 0 0 auto;
|
|
182
|
+
flex-direction: column;
|
|
183
|
+
|
|
184
|
+
// Колонка держит шаг `--rt-space-4`, а полоса стоит вплотную к полю: 8px по кадру
|
|
185
|
+
margin-block-end: calc(var(--rt-space-2) - var(--rt-space-4));
|
|
186
|
+
|
|
187
|
+
&:empty {
|
|
188
|
+
display: none;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
&:not(:empty) + .rt-chat__composer,
|
|
192
|
+
&:not(:empty) + .rt-chat__composer-rich {
|
|
193
|
+
margin-top: 0;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
179
197
|
&__footer-slot {
|
|
180
198
|
display: flex;
|
|
181
199
|
flex-direction: column;
|
|
@@ -298,14 +316,17 @@
|
|
|
298
316
|
|
|
299
317
|
&__message-footer {
|
|
300
318
|
display: flex;
|
|
319
|
+
min-width: 0;
|
|
301
320
|
align-items: center;
|
|
302
321
|
gap: var(--rt-space-1);
|
|
303
322
|
}
|
|
304
323
|
|
|
305
324
|
&__message-date {
|
|
325
|
+
min-width: 0;
|
|
306
326
|
color: var(--rt-chat-bubble-date);
|
|
307
327
|
font-size: var(--rt-text-xs);
|
|
308
328
|
line-height: var(--rt-leading-none);
|
|
329
|
+
overflow-wrap: anywhere;
|
|
309
330
|
}
|
|
310
331
|
|
|
311
332
|
// Пер-месседж статус своего сообщения: часы / двойной чек / «!»+retry.
|
|
@@ -128,6 +128,8 @@ export declare namespace IRtDataTable {
|
|
|
128
128
|
tooltip?: string;
|
|
129
129
|
icon?: IRtDataTable.Icon;
|
|
130
130
|
}
|
|
131
|
+
/** Размер значка ячейки — ступень значка кита. */
|
|
132
|
+
type IconSize = 'sm' | 'md' | 'lg';
|
|
131
133
|
/**
|
|
132
134
|
* Значок колонки. Имя — имя первого кита; рисует его набор кита через перечень соответствий,
|
|
133
135
|
* а шаблон значка, отданный приложением, рисует его сам.
|
|
@@ -138,6 +140,11 @@ export declare namespace IRtDataTable {
|
|
|
138
140
|
tooltip?: string;
|
|
139
141
|
visible?: boolean;
|
|
140
142
|
placement?: 'left' | 'right';
|
|
143
|
+
/**
|
|
144
|
+
* Размер значка в ячейке: `sm` — 16px, `md` — 20px, `lg` — 24px. Без поля значок 24px, как
|
|
145
|
+
* был. Шапка колонки его не читает.
|
|
146
|
+
*/
|
|
147
|
+
size?: IRtDataTable.IconSize;
|
|
141
148
|
/**
|
|
142
149
|
* Контурный рисунок вместо залитого, как у первого кита: без признака значок колонки залит.
|
|
143
150
|
* Заливку рисует материальный набор; свой набор кита рисует значок одним рисунком.
|
|
@@ -172,7 +172,17 @@ export declare class RtDataTableCellComponent<T = Record<string, unknown>> {
|
|
|
172
172
|
* приложение, а без шрифта на месте значка стоит его имя.
|
|
173
173
|
*/
|
|
174
174
|
protected readonly glyph: Signal<string | null>;
|
|
175
|
-
/**
|
|
175
|
+
/**
|
|
176
|
+
* Размер значка из описания колонки; без него 24px, как было. Описание колонки приходит и из
|
|
177
|
+
* сохранённых настроек, мимо типов: размер не из списка тоже даёт 24px, иначе значок набора
|
|
178
|
+
* взял бы свою ступень, а глиф остался бы прежним.
|
|
179
|
+
*/
|
|
180
|
+
protected readonly iconSize: Signal<IRtDataTable.IconSize>;
|
|
181
|
+
/**
|
|
182
|
+
* Залитый глиф — как залитый значок набора: контурным его делает `outlined` колонки. Размер
|
|
183
|
+
* глифа идёт той же ступенью, что значок набора; 24px задаёт сам элемент, и для `lg` своего
|
|
184
|
+
* признака нет.
|
|
185
|
+
*/
|
|
176
186
|
protected readonly glyphMods: Signal<Record<string, boolean>>;
|
|
177
187
|
protected readonly iconContext: Signal<IRtDataTableIconContext<T> | null>;
|
|
178
188
|
/**
|
|
@@ -146,6 +146,8 @@ export declare class RtMessageComposerComponent {
|
|
|
146
146
|
focus(): void;
|
|
147
147
|
/** Заменяет черновик и ставит курсор в конец; выбранные файлы остаются. */
|
|
148
148
|
setDraft(text: string): void;
|
|
149
|
+
/** Текст поля без разметки: форматирование читается как обычный текст, файлы сюда не входят. */
|
|
150
|
+
draftText(): string;
|
|
149
151
|
protected onKeydown(event: KeyboardEvent): void;
|
|
150
152
|
protected stop(): void;
|
|
151
153
|
protected openPicker(): void;
|
|
@@ -291,6 +293,13 @@ export declare namespace IRtChat {
|
|
|
291
293
|
delta?: IQuillDelta | null;
|
|
292
294
|
/** ISO-дата создания. */
|
|
293
295
|
createdAt: string;
|
|
296
|
+
/** Готовая подпись вместо времени `createdAt`. Подписи дней считаются от `createdAt` и так. */
|
|
297
|
+
dateLabel?: string;
|
|
298
|
+
/**
|
|
299
|
+
* Значок на месте значка статуса, размером как он. Статусы «не ушло» и «не доставлено»
|
|
300
|
+
* сильнее: их значок предупреждает об ошибке.
|
|
301
|
+
*/
|
|
302
|
+
dateIcon?: IRtIcon.Name;
|
|
294
303
|
/** URL вложения (если есть) — наличие включает карточку файла. */
|
|
295
304
|
fileUrl?: string | null;
|
|
296
305
|
/** Имя вложения для отображения в карточке. */
|
|
@@ -534,6 +543,8 @@ export declare class RtChatComponent {
|
|
|
534
543
|
* текст. Выбранные файлы остаются, сигнала набора нет, закрытое поле не меняется.
|
|
535
544
|
*/
|
|
536
545
|
setDraft(text: string): void;
|
|
546
|
+
/** Текст поля ответа в виде, который сейчас на экране. Файлы сюда не входят, поля нет — пустая строка. */
|
|
547
|
+
draftText(): string;
|
|
537
548
|
protected onSubmit(): void;
|
|
538
549
|
protected onComposerKeydown(event: KeyboardEvent): void;
|
|
539
550
|
/** Релей submit'а от `rt-message-composer` (rich-режим) наружу как `send`. */
|
|
@@ -677,7 +688,7 @@ export declare class RtChatComponent {
|
|
|
677
688
|
"expandedChange": "expandedChange";
|
|
678
689
|
"deleteMessage": "deleteMessage";
|
|
679
690
|
"retryMessage": "retryMessage";
|
|
680
|
-
}, ["messageActions", "messageButtons"], ["[rtChatHeaderActions]", "[rtChatComposerTools]", "[rtChatFooter]"], true, never>;
|
|
691
|
+
}, ["messageActions", "messageButtons"], ["[rtChatHeaderActions]", "[rtChatComposerBar]", "[rtChatComposerTools]", "[rtChatFooter]"], true, never>;
|
|
681
692
|
}
|
|
682
693
|
/**
|
|
683
694
|
* Есть ли у реплики хотя бы одно доступное действие потребителя.
|