@rt-tools/ui-kit-v2 0.18.0 → 0.19.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 +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +14 -8
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +97 -0
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +10 -3
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +81 -0
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +98 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +5 -5
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +124 -25
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +3 -3
- package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +64 -27
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +46 -0
- package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +336 -12
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +3 -3
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +31 -5
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2.mjs +3 -0
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
- package/package.json +13 -1
- package/rt-tools-ui-kit-v2-0.19.0.tgz +0 -0
- package/src/assets/icons/sparkle.svg +9 -0
- package/src/assets/icons/thumb-down.svg +10 -0
- package/src/assets/icons/thumb-up.svg +9 -0
- package/src/assets/icons/trash-x.svg +7 -0
- package/src/assets/icons-material/sparkle.fill.svg +5 -0
- package/src/assets/icons-material/sparkle.svg +5 -0
- package/src/assets/icons-material/thumb-down.fill.svg +5 -0
- package/src/assets/icons-material/thumb-down.svg +5 -0
- package/src/assets/icons-material/thumb-up.fill.svg +5 -0
- package/src/assets/icons-material/thumb-up.svg +5 -0
- package/src/assets/icons-material/trash-x.fill.svg +5 -0
- package/src/assets/icons-material/trash-x.svg +5 -0
- package/src/lib/components/action-bar/CONTEXT.md +8 -2
- package/src/lib/components/action-bar/rt-action-bar-holder.component.scss +10 -7
- package/src/lib/components/action-bar/rt-action-bar.component.scss +82 -34
- package/src/lib/components/ai-run-status/CONTEXT.md +36 -0
- package/src/lib/components/ai-run-status/rt-ai-run-status.component.scss +119 -0
- package/src/lib/components/aside/CONTEXT.md +1 -0
- package/src/lib/components/aside/header/rt-aside-header.component.scss +27 -11
- package/src/lib/components/copy-value/CONTEXT.md +31 -0
- package/src/lib/components/copy-value/rt-copy-value.component.scss +39 -0
- package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +5 -5
- package/src/lib/components/dynamic-selector/CONTEXT.md +18 -0
- package/src/lib/components/dynamic-selector/list/rt-dynamic-selector-list.component.scss +29 -1
- package/src/lib/components/dynamic-selector/popup/rt-dynamic-selector-popup.component.scss +84 -25
- package/src/lib/components/empty-state/CONTEXT.md +2 -1
- package/src/lib/components/empty-state/rt-empty-state.component.scss +4 -2
- package/src/lib/components/icon/CONTEXT.md +16 -12
- package/src/lib/components/icon/rt-icon.component.scss +13 -3
- package/src/lib/components/prompt-suggestion/CONTEXT.md +29 -0
- package/src/lib/components/prompt-suggestion/rt-prompt-suggestion.component.scss +58 -0
- package/src/lib/components/thread-list/CONTEXT.md +4 -0
- package/src/lib/components/thread-list/rt-thread-list.component.scss +29 -0
- package/src/lib/components/toolbar/CONTEXT.md +4 -0
- package/src/lib/components/toolbar/rt-toolbar.component.scss +7 -0
- package/src/rich-editor/lib/components/ai-chat/CONTEXT.md +58 -0
- package/src/rich-editor/lib/components/ai-chat/answer/rt-ai-chat-answer.component.scss +12 -0
- package/src/rich-editor/lib/components/ai-chat/rt-ai-chat.component.scss +222 -0
- package/src/rich-editor/lib/components/rich-editor/rt-rich-editor.component.scss +3 -0
- package/src/styles/_scrollbar.scss +9 -0
- package/styles/tokens.css +3 -0
- package/types/rt-tools-ui-kit-v2-action-bar.d.ts +11 -2
- package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +49 -0
- package/types/rt-tools-ui-kit-v2-aside.d.ts +9 -1
- package/types/rt-tools-ui-kit-v2-copy-value.d.ts +29 -0
- package/types/rt-tools-ui-kit-v2-core.d.ts +93 -53
- package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +44 -5
- package/types/rt-tools-ui-kit-v2-icon.d.ts +12 -4
- package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +21 -0
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +186 -2
- package/types/rt-tools-ui-kit-v2-thread-list.d.ts +15 -2
- package/types/rt-tools-ui-kit-v2.d.ts +3 -0
- package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
|
@@ -4,42 +4,63 @@
|
|
|
4
4
|
/* rt-dynamic-selector-popup — панель выбора в CDK Overlay. ViewEncapsulation.None.
|
|
5
5
|
Размер и вид сняты с кадров первого кита: 20rem на 30rem, поверхность с рамкой и тенью. */
|
|
6
6
|
|
|
7
|
+
/* Свойства окна приложение задаёт на любом предке — на панели оверлея или на своём контейнере:
|
|
8
|
+
на самом окне объявлены только умолчания с приставкой `-default`, а читается свойство с
|
|
9
|
+
запасным значением. Объявленное на окне под публичным именем перебило бы правило предка. */
|
|
7
10
|
.rt-dynamic-selector-popup {
|
|
8
|
-
--rt-dynamic-selector-popup-width: calc(var(--rt-size-40) * 2);
|
|
9
|
-
--rt-dynamic-selector-popup-max-height: calc(var(--rt-size-100) + var(--rt-size-20));
|
|
10
|
-
--rt-dynamic-selector-popup-radius: var(--rt-radius-md);
|
|
11
|
-
--rt-dynamic-selector-popup-border-width: var(--rt-border-width-thin);
|
|
12
|
-
--rt-dynamic-selector-popup-shadow: var(--rt-shadow-lg);
|
|
11
|
+
--rt-dynamic-selector-popup-width-default: calc(var(--rt-size-40) * 2);
|
|
12
|
+
--rt-dynamic-selector-popup-max-height-default: calc(var(--rt-size-100) + var(--rt-size-20));
|
|
13
|
+
--rt-dynamic-selector-popup-radius-default: var(--rt-radius-md);
|
|
14
|
+
--rt-dynamic-selector-popup-border-width-default: var(--rt-border-width-thin);
|
|
15
|
+
--rt-dynamic-selector-popup-shadow-default: var(--rt-shadow-lg);
|
|
16
|
+
--rt-dynamic-selector-popup-bg-default: var(--rt-color-bg-surface);
|
|
17
|
+
--rt-dynamic-selector-popup-min-height-default: 0;
|
|
18
|
+
--rt-dynamic-selector-popup-padding-default: var(--rt-space-md);
|
|
19
|
+
--rt-dynamic-selector-popup-foot-border-width-default: var(
|
|
20
|
+
--rt-dynamic-selector-popup-border-width,
|
|
21
|
+
var(--rt-dynamic-selector-popup-border-width-default)
|
|
22
|
+
);
|
|
23
|
+
--rt-dynamic-selector-popup-nav-color-default: var(--rt-color-text-link);
|
|
24
|
+
|
|
25
|
+
/* Кнопки «Отмена» и «Применить» по умолчанию той же высоты и кегля, что кнопка кита среднего шага. */
|
|
26
|
+
--rt-dynamic-selector-popup-button-height-default: var(--rt-control-height-md);
|
|
27
|
+
--rt-dynamic-selector-popup-button-font-size-default: 0.95rem;
|
|
28
|
+
|
|
29
|
+
/* Заглушка «ничего не нашлось» по умолчанию повторяет свойства самой заглушки. */
|
|
30
|
+
--rt-dynamic-selector-popup-empty-icon-size-default: var(--rt-size-8);
|
|
31
|
+
--rt-dynamic-selector-popup-empty-icon-wrap-bg-default: var(--rt-color-bg-subtle);
|
|
32
|
+
--rt-dynamic-selector-popup-empty-text-size-default: var(--rt-text-md);
|
|
33
|
+
--rt-dynamic-selector-popup-empty-text-weight-default: var(--rt-font-weight-medium);
|
|
34
|
+
--rt-dynamic-selector-popup-empty-text-color-default: var(--rt-color-text-primary);
|
|
13
35
|
|
|
14
36
|
display: flex;
|
|
15
|
-
width: var(--rt-dynamic-selector-popup-width);
|
|
37
|
+
width: var(--rt-dynamic-selector-popup-width, var(--rt-dynamic-selector-popup-width-default));
|
|
16
38
|
max-width: calc(100vw - var(--rt-space-md) * 2);
|
|
17
|
-
|
|
39
|
+
min-height: var(--rt-dynamic-selector-popup-min-height, var(--rt-dynamic-selector-popup-min-height-default));
|
|
40
|
+
max-height: var(--rt-dynamic-selector-popup-max-height, var(--rt-dynamic-selector-popup-max-height-default));
|
|
18
41
|
box-sizing: border-box;
|
|
19
42
|
flex-direction: column;
|
|
20
|
-
border: var(--rt-dynamic-selector-popup-border-width
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
43
|
+
border: var(--rt-dynamic-selector-popup-border-width, var(--rt-dynamic-selector-popup-border-width-default)) solid
|
|
44
|
+
var(--rt-color-border-subtle);
|
|
45
|
+
border-radius: var(--rt-dynamic-selector-popup-radius, var(--rt-dynamic-selector-popup-radius-default));
|
|
46
|
+
background: var(--rt-dynamic-selector-popup-bg, var(--rt-dynamic-selector-popup-bg-default));
|
|
47
|
+
box-shadow: var(--rt-dynamic-selector-popup-shadow, var(--rt-dynamic-selector-popup-shadow-default));
|
|
24
48
|
color: var(--rt-color-text-primary);
|
|
25
49
|
gap: var(--rt-space-sm);
|
|
26
|
-
padding-block: var(--rt-
|
|
50
|
+
padding-block: var(--rt-dynamic-selector-popup-padding, var(--rt-dynamic-selector-popup-padding-default));
|
|
27
51
|
|
|
28
52
|
&__head {
|
|
29
53
|
display: flex;
|
|
30
54
|
flex-direction: column;
|
|
31
55
|
gap: var(--rt-space-sm);
|
|
32
|
-
padding-inline: var(--rt-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
&__search {
|
|
36
|
-
display: block;
|
|
56
|
+
padding-inline: var(--rt-dynamic-selector-popup-padding, var(--rt-dynamic-selector-popup-padding-default));
|
|
37
57
|
}
|
|
38
58
|
|
|
39
59
|
&__controls {
|
|
40
60
|
display: flex;
|
|
41
61
|
flex-direction: column;
|
|
42
|
-
border-bottom: var(--rt-dynamic-selector-popup-border-width
|
|
62
|
+
border-bottom: var(--rt-dynamic-selector-popup-border-width, var(--rt-dynamic-selector-popup-border-width-default)) solid
|
|
63
|
+
var(--rt-color-border-subtle);
|
|
43
64
|
|
|
44
65
|
/* Строка переключателя и «Выбрать все» — два разных решения; при зазоре 2xs флажок
|
|
45
66
|
прилипал к переключателю и читался его частью. */
|
|
@@ -84,8 +105,11 @@
|
|
|
84
105
|
display: block;
|
|
85
106
|
}
|
|
86
107
|
|
|
108
|
+
// Тело окна — загрузка, список или пустой результат — занимает высоту, которую оставили шапка и
|
|
109
|
+
// футер: при заданной наименьшей высоте окна футер стоит у нижней кромки, а не под коротким телом.
|
|
87
110
|
&__state {
|
|
88
111
|
display: flex;
|
|
112
|
+
flex: 1 1 auto;
|
|
89
113
|
align-items: center;
|
|
90
114
|
justify-content: center;
|
|
91
115
|
padding: var(--rt-space-md);
|
|
@@ -97,7 +121,7 @@
|
|
|
97
121
|
flex: 1 1 auto;
|
|
98
122
|
flex-direction: column;
|
|
99
123
|
overflow-y: auto;
|
|
100
|
-
padding-inline: var(--rt-
|
|
124
|
+
padding-inline: var(--rt-dynamic-selector-popup-padding, var(--rt-dynamic-selector-popup-padding-default));
|
|
101
125
|
}
|
|
102
126
|
|
|
103
127
|
// Шаг строки снят с первого кита: флажок и по отступу сверху и снизу — около 36px.
|
|
@@ -106,7 +130,8 @@
|
|
|
106
130
|
padding-block: var(--rt-space-sm);
|
|
107
131
|
|
|
108
132
|
&--separated {
|
|
109
|
-
border-bottom: var(--rt-dynamic-selector-popup-border-width
|
|
133
|
+
border-bottom: var(--rt-dynamic-selector-popup-border-width, var(--rt-dynamic-selector-popup-border-width-default)) solid
|
|
134
|
+
var(--rt-color-border-subtle);
|
|
110
135
|
margin-block-end: var(--rt-space-2xs);
|
|
111
136
|
padding-block-end: var(--rt-space-sm);
|
|
112
137
|
}
|
|
@@ -129,18 +154,44 @@
|
|
|
129
154
|
}
|
|
130
155
|
|
|
131
156
|
&__empty {
|
|
132
|
-
|
|
133
|
-
padding-inline: var(--rt-
|
|
157
|
+
flex: 1 1 auto;
|
|
158
|
+
padding-inline: var(--rt-dynamic-selector-popup-padding, var(--rt-dynamic-selector-popup-padding-default));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* Свойства заглушки переставляются правилом из двух классов: объявление самой заглушки
|
|
162
|
+
стоит на том же элементе, и одним классом его не перебить. */
|
|
163
|
+
&__empty.rt-empty-state {
|
|
164
|
+
--rt-empty-state-icon-size: var(
|
|
165
|
+
--rt-dynamic-selector-popup-empty-icon-size,
|
|
166
|
+
var(--rt-dynamic-selector-popup-empty-icon-size-default)
|
|
167
|
+
);
|
|
168
|
+
--rt-empty-state-icon-wrap-bg: var(
|
|
169
|
+
--rt-dynamic-selector-popup-empty-icon-wrap-bg,
|
|
170
|
+
var(--rt-dynamic-selector-popup-empty-icon-wrap-bg-default)
|
|
171
|
+
);
|
|
172
|
+
--rt-empty-state-title-size: var(
|
|
173
|
+
--rt-dynamic-selector-popup-empty-text-size,
|
|
174
|
+
var(--rt-dynamic-selector-popup-empty-text-size-default)
|
|
175
|
+
);
|
|
176
|
+
--rt-empty-state-title-weight: var(
|
|
177
|
+
--rt-dynamic-selector-popup-empty-text-weight,
|
|
178
|
+
var(--rt-dynamic-selector-popup-empty-text-weight-default)
|
|
179
|
+
);
|
|
180
|
+
--rt-empty-state-title-color: var(
|
|
181
|
+
--rt-dynamic-selector-popup-empty-text-color,
|
|
182
|
+
var(--rt-dynamic-selector-popup-empty-text-color-default)
|
|
183
|
+
);
|
|
134
184
|
}
|
|
135
185
|
|
|
136
186
|
&__foot {
|
|
137
187
|
display: flex;
|
|
138
188
|
align-items: center;
|
|
139
189
|
justify-content: flex-end;
|
|
140
|
-
border-top: var(--rt-dynamic-selector-popup-border-width
|
|
190
|
+
border-top: var(--rt-dynamic-selector-popup-foot-border-width, var(--rt-dynamic-selector-popup-foot-border-width-default)) solid
|
|
191
|
+
var(--rt-color-border-subtle);
|
|
141
192
|
gap: var(--rt-space-sm);
|
|
142
193
|
padding-block-start: var(--rt-space-sm);
|
|
143
|
-
padding-inline: var(--rt-
|
|
194
|
+
padding-inline: var(--rt-dynamic-selector-popup-padding, var(--rt-dynamic-selector-popup-padding-default));
|
|
144
195
|
|
|
145
196
|
&--nav {
|
|
146
197
|
justify-content: space-between;
|
|
@@ -151,7 +202,7 @@
|
|
|
151
202
|
&__nav {
|
|
152
203
|
overflow: hidden;
|
|
153
204
|
min-width: 0;
|
|
154
|
-
color: var(--rt-color-
|
|
205
|
+
color: var(--rt-dynamic-selector-popup-nav-color, var(--rt-dynamic-selector-popup-nav-color-default));
|
|
155
206
|
font-size: var(--rt-text-sm);
|
|
156
207
|
text-overflow: ellipsis;
|
|
157
208
|
white-space: nowrap;
|
|
@@ -166,5 +217,13 @@
|
|
|
166
217
|
flex: 0 0 auto;
|
|
167
218
|
gap: var(--rt-space-sm);
|
|
168
219
|
}
|
|
220
|
+
|
|
221
|
+
&__actions .rt-button {
|
|
222
|
+
--rt-btn-height: var(--rt-dynamic-selector-popup-button-height, var(--rt-dynamic-selector-popup-button-height-default));
|
|
223
|
+
--rt-btn-font-size: var(
|
|
224
|
+
--rt-dynamic-selector-popup-button-font-size,
|
|
225
|
+
var(--rt-dynamic-selector-popup-button-font-size-default)
|
|
226
|
+
);
|
|
227
|
+
}
|
|
169
228
|
}
|
|
170
229
|
}
|
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
- Слот действия существует всегда, даже пустым; прячет его `:empty` в стилях.
|
|
35
35
|
- Размеры и подложка — свойства блока: `--rt-empty-state-icon-wrap-size`,
|
|
36
36
|
`--rt-empty-state-icon-wrap-bg`, `--rt-empty-state-icon-size`, `--rt-empty-state-title-size`,
|
|
37
|
-
`--rt-empty-state-title-weight
|
|
37
|
+
`--rt-empty-state-title-weight`, `--rt-empty-state-title-color`,
|
|
38
|
+
`--rt-empty-state-description-size`. Список ставит им назначения `--rt-list-empty-*`. Под
|
|
38
39
|
материальным набором его заглушка рисуется как у первого кита: значок 48px без круга, заголовок
|
|
39
40
|
32px весом 400.
|
|
40
41
|
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
--rt-empty-state-icon-size: var(--rt-size-8);
|
|
14
14
|
--rt-empty-state-title-size: var(--rt-text-md);
|
|
15
15
|
--rt-empty-state-title-weight: var(--rt-font-weight-medium);
|
|
16
|
+
--rt-empty-state-title-color: var(--rt-color-text-primary);
|
|
17
|
+
--rt-empty-state-description-size: var(--rt-text-sm);
|
|
16
18
|
--rt-empty-state-frame-width: var(--rt-border-width-medium);
|
|
17
19
|
--rt-empty-state-frame-color: var(--rt-color-border-strong);
|
|
18
20
|
--rt-empty-state-frame-radius: var(--rt-radius-lg);
|
|
@@ -62,7 +64,7 @@
|
|
|
62
64
|
|
|
63
65
|
&__title {
|
|
64
66
|
margin: 0;
|
|
65
|
-
color: var(--rt-
|
|
67
|
+
color: var(--rt-empty-state-title-color);
|
|
66
68
|
font-size: var(--rt-empty-state-title-size);
|
|
67
69
|
font-weight: var(--rt-empty-state-title-weight);
|
|
68
70
|
}
|
|
@@ -71,7 +73,7 @@
|
|
|
71
73
|
max-width: 320px;
|
|
72
74
|
margin: 0;
|
|
73
75
|
color: var(--rt-color-text-muted);
|
|
74
|
-
font-size: var(--rt-
|
|
76
|
+
font-size: var(--rt-empty-state-description-size);
|
|
75
77
|
line-height: var(--rt-leading-normal);
|
|
76
78
|
}
|
|
77
79
|
|
|
@@ -4,19 +4,23 @@
|
|
|
4
4
|
<rt-icon name="check" size="md" color="current" [rotate]="null" />
|
|
5
5
|
```
|
|
6
6
|
|
|
7
|
-
| вход
|
|
8
|
-
|
|
|
9
|
-
| `name`
|
|
10
|
-
| `glyph`
|
|
11
|
-
| `
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
| `
|
|
15
|
-
| `
|
|
7
|
+
| вход | тип | умолчание |
|
|
8
|
+
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
|
|
9
|
+
| `name` | `IRtIcon.Name \| null` — литеральный union из `rt-icon-names.ts`; побеждает `glyph` | `null` |
|
|
10
|
+
| `glyph` | `string \| null` — имя Material: пара кита или лигатура шрифта | `null` |
|
|
11
|
+
| `glyphStrategy` | `'map-first' \| 'font' \| null` — способ рисовать `glyph` у этого значка; `null` — настройка `provideRtIcons` | `null` |
|
|
12
|
+
| `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl' \| '3xl' \| '4xl' \| number` — ступень берёт свойство `--rt-icon-step-*`, число — пиксели | `'md'` |
|
|
13
|
+
| `color` | `'current' \| 'primary' \| 'muted' \| 'disabled' \| 'info' \| 'success' \| 'warning' \| 'danger' \| 'inverse'` — кроме `current`, свойство `--rt-icon-color-*` | `'current'` |
|
|
14
|
+
| `rotate` | `number \| string \| null` | `null` |
|
|
15
|
+
| `fill` | `boolean` — залитый рисунок материального набора и заливка шрифта лигатуры | `false` |
|
|
16
|
+
| `spin` | `boolean` — вращение, медленнее при просьбе системы о меньшем движении | `false` |
|
|
16
17
|
|
|
17
|
-
Выходов нет. Размер и цвет едут инлайновым стилем host-а (`width`/`height`/`color`), не
|
|
18
|
-
`xs` 12px, `sm` 16px, `md` 20px,
|
|
19
|
-
|
|
18
|
+
Выходов нет. Размер и цвет едут инлайновым стилем host-а (`width`/`height`/`color`), не классом.
|
|
19
|
+
Ступень — свойство `--rt-icon-step-<ступень>`, по умолчанию `xs` 12px, `sm` 16px, `md` 20px,
|
|
20
|
+
`lg` 24px, `xl` 32px, `2xl` 40px, `3xl` 48px, `4xl` 64px; число — пиксели. Цвет, кроме `current`, —
|
|
21
|
+
свойство `--rt-icon-color-<цвет>` с ролью кита по умолчанию. Оси шрифта лигатуры — свойства
|
|
22
|
+
`--rt-icon-glyph-weight`, `-grade`, `-opsz`. Лигатура глифа скрыта, пока шрифты страницы не готовы:
|
|
23
|
+
её ждёт `RtIconFontService`.
|
|
20
24
|
|
|
21
25
|
## Главное, что нужно знать
|
|
22
26
|
|
|
@@ -19,15 +19,25 @@
|
|
|
19
19
|
|
|
20
20
|
/* Лигатура шрифта Material Symbols для глифа без пары. Шрифт подключает приложение,
|
|
21
21
|
семью можно переназначить свойством сверху. Размер шрифта — встроенным стилем, он равен
|
|
22
|
-
ширине значка. До готовности шрифтов лигатура скрыта: иначе на её месте видно слово.
|
|
22
|
+
ширине значка. До готовности шрифтов лигатура скрыта: иначе на её месте видно слово.
|
|
23
|
+
Оси шрифта — вес, градация и оптический размер — приложение задаёт свойствами сверху,
|
|
24
|
+
заливка идёт от входа `fill` и переставляется модификатором. Оптический размер по
|
|
25
|
+
умолчанию — сторона значка: её пишет компонент встроенным стилем, как делал браузер. */
|
|
23
26
|
&__glyph {
|
|
27
|
+
--rt-icon-glyph-fill: 0;
|
|
28
|
+
--rt-icon-glyph-opsz-auto: 24;
|
|
29
|
+
|
|
24
30
|
display: block;
|
|
25
31
|
overflow: hidden;
|
|
26
32
|
width: 100%;
|
|
27
33
|
font-family: var(--rt-icon-glyph-font, 'Material Symbols Outlined'), sans-serif;
|
|
28
34
|
font-feature-settings: 'liga';
|
|
29
35
|
font-style: normal;
|
|
30
|
-
font-variation-settings:
|
|
36
|
+
font-variation-settings:
|
|
37
|
+
'FILL' var(--rt-icon-glyph-fill),
|
|
38
|
+
'wght' var(--rt-icon-glyph-weight, 400),
|
|
39
|
+
'GRAD' var(--rt-icon-glyph-grade, 0),
|
|
40
|
+
'opsz' var(--rt-icon-glyph-opsz, var(--rt-icon-glyph-opsz-auto));
|
|
31
41
|
font-weight: var(--rt-font-weight-regular);
|
|
32
42
|
letter-spacing: normal;
|
|
33
43
|
line-height: 1;
|
|
@@ -36,7 +46,7 @@
|
|
|
36
46
|
white-space: nowrap;
|
|
37
47
|
|
|
38
48
|
&--filled {
|
|
39
|
-
|
|
49
|
+
--rt-icon-glyph-fill: 1;
|
|
40
50
|
}
|
|
41
51
|
|
|
42
52
|
&--pending {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# `rt-prompt-suggestion`
|
|
2
|
+
|
|
3
|
+
```html
|
|
4
|
+
@for (q of suggestions(); track q) {
|
|
5
|
+
<rt-prompt-suggestion [label]="q" (picked)="ask($event)" />
|
|
6
|
+
}
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
| вход | тип | умолчание |
|
|
10
|
+
| ---------- | --------- | ---------- |
|
|
11
|
+
| `label` | `string` | обязателен |
|
|
12
|
+
| `disabled` | `boolean` | `false` |
|
|
13
|
+
|
|
14
|
+
Выход: `picked` — текст вопроса.
|
|
15
|
+
|
|
16
|
+
Спек — `docs/specs/ui-kit-v2/prompt-suggestion/`; здесь только устройство папки.
|
|
17
|
+
|
|
18
|
+
## Главное, что нужно знать
|
|
19
|
+
|
|
20
|
+
**Карточка занимает всю ширину родителя**, стрелка прижата к правому краю. В столбце подсказок
|
|
21
|
+
разной длины стрелки стоят на одной вертикали.
|
|
22
|
+
|
|
23
|
+
## Края
|
|
24
|
+
|
|
25
|
+
- Класс блока висит и на хосте, и на кнопке: правила вложены в селектор хоста.
|
|
26
|
+
|
|
27
|
+
## Рядом
|
|
28
|
+
|
|
29
|
+
- [`rt-empty-state`](../empty-state/CONTEXT.md) — пустой экран, на котором стоят подсказки.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* rt-prompt-suggestion — карточка готового вопроса. ViewEncapsulation.None.
|
|
3
|
+
Класс блока висит и на хосте, и на кнопке шаблона, поэтому правила вложены в хост. */
|
|
4
|
+
|
|
5
|
+
rt-prompt-suggestion {
|
|
6
|
+
display: block;
|
|
7
|
+
|
|
8
|
+
.rt-prompt-suggestion {
|
|
9
|
+
--rt-prompt-suggestion-radius: var(--rt-radius-lg);
|
|
10
|
+
--rt-prompt-suggestion-focus-shadow: var(--rt-shadow-focus-ring);
|
|
11
|
+
--rt-prompt-suggestion-transition-duration: var(--rt-duration-fast);
|
|
12
|
+
|
|
13
|
+
display: flex;
|
|
14
|
+
box-sizing: border-box;
|
|
15
|
+
align-items: center;
|
|
16
|
+
justify-content: space-between;
|
|
17
|
+
padding: var(--rt-space-sm) var(--rt-space-md);
|
|
18
|
+
border: 0;
|
|
19
|
+
border-radius: var(--rt-prompt-suggestion-radius);
|
|
20
|
+
margin: 0;
|
|
21
|
+
background: var(--rt-color-bg-hover);
|
|
22
|
+
color: var(--rt-color-text-primary);
|
|
23
|
+
cursor: pointer;
|
|
24
|
+
font: inherit;
|
|
25
|
+
font-size: var(--rt-text-sm);
|
|
26
|
+
font-weight: var(--rt-font-weight-medium);
|
|
27
|
+
gap: var(--rt-space-sm);
|
|
28
|
+
inline-size: 100%;
|
|
29
|
+
line-height: var(--rt-leading-snug);
|
|
30
|
+
text-align: start;
|
|
31
|
+
transition: background-color var(--rt-prompt-suggestion-transition-duration) ease;
|
|
32
|
+
|
|
33
|
+
&:hover:not(:disabled) {
|
|
34
|
+
background: var(--rt-color-bg-subtle);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&:focus-visible {
|
|
38
|
+
box-shadow: var(--rt-prompt-suggestion-focus-shadow);
|
|
39
|
+
outline: 2px solid transparent;
|
|
40
|
+
outline-offset: 2px;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
&:disabled {
|
|
44
|
+
color: var(--rt-color-text-disabled);
|
|
45
|
+
cursor: default;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
&__label {
|
|
49
|
+
min-inline-size: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
&__arrow {
|
|
53
|
+
flex: none;
|
|
54
|
+
color: var(--rt-color-text-muted);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -28,6 +28,10 @@
|
|
|
28
28
|
Тот же массив строк передаётся входом `[rtThreadListRow]` в шаблон строки: из него выводится тип
|
|
29
29
|
`row`. Без этого входа строгая сборка приложения отказывает — атрибут без значения приходит строкой.
|
|
30
30
|
|
|
31
|
+
Действия строки — `<ng-template let-row [rtThreadListRowActions]="rows()">`: кнопки стоят поверх
|
|
32
|
+
правого края строки, рядом с её кнопкой, а не внутри: вложенная кнопка в `<button>` недопустима и
|
|
33
|
+
забирала бы клик выбора. Видны при наведении и фокусе. Без шаблона строка стоит без обёртки.
|
|
34
|
+
|
|
31
35
|
## Главное, что нужно знать
|
|
32
36
|
|
|
33
37
|
**Ctrl/Cmd+клик просит открыть в новой вкладке, а не выбирает строку.** Список — это навигация,
|
|
@@ -125,6 +125,35 @@
|
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
+
// Действия строки стоят поверх правого края строки, а не внутри её кнопки: вложенная
|
|
129
|
+
// кнопка в `<button>` недопустима. Подложка повторяет фон строки, чтобы закрыть время.
|
|
130
|
+
&__row-wrap {
|
|
131
|
+
position: relative;
|
|
132
|
+
|
|
133
|
+
&:hover .rt-thread-list__row-actions,
|
|
134
|
+
&:focus-within .rt-thread-list__row-actions {
|
|
135
|
+
opacity: 1;
|
|
136
|
+
pointer-events: auto;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
&__row-actions {
|
|
141
|
+
position: absolute;
|
|
142
|
+
display: flex;
|
|
143
|
+
align-items: center;
|
|
144
|
+
background: var(--rt-color-bg-subtle);
|
|
145
|
+
gap: var(--rt-space-1);
|
|
146
|
+
inset-block: 0;
|
|
147
|
+
inset-inline-end: 0;
|
|
148
|
+
opacity: 0;
|
|
149
|
+
padding-inline: var(--rt-space-2) var(--rt-space-4);
|
|
150
|
+
pointer-events: none;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
&__row--active + .rt-thread-list__row-actions {
|
|
154
|
+
background: var(--rt-color-state-info-bg);
|
|
155
|
+
}
|
|
156
|
+
|
|
128
157
|
&__row-body {
|
|
129
158
|
display: flex;
|
|
130
159
|
flex-direction: column;
|
|
@@ -23,3 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
**Отступ полосы сверху и снизу — свойства блока** `--rt-toolbar-padding-top` и
|
|
25
25
|
`--rt-toolbar-padding-bottom`, по умолчанию 8px. Список ставит им свои имена.
|
|
26
|
+
|
|
27
|
+
**Плотная полоса остаётся строкой на любой ширине, и её левая часть сжимается.** Длинный
|
|
28
|
+
заголовок в ней переносится по словам и не выходит за правый край. Кнопки справа держат свою
|
|
29
|
+
ширину. Обычная полоса левую часть не сжимает: на узком экране она стекает в колонку.
|
|
@@ -65,6 +65,13 @@
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
// Плотная полоса не стекает в колонку, и длинный заголовок левой зоны ей некуда деть: зона
|
|
69
|
+
// сжимается, а заголовок переносится по словам. Правая зона с кнопками держит свою ширину
|
|
70
|
+
.rt-toolbar--dense .rt-toolbar__bar--left {
|
|
71
|
+
min-width: 0;
|
|
72
|
+
flex: 0 1 auto;
|
|
73
|
+
}
|
|
74
|
+
|
|
68
75
|
// Мобилка: три зоны не влезают в строку — стекаем в колонку на всю ширину
|
|
69
76
|
// (фильтр → поиск → действия), поиск растягивается. `--dense` (компактная
|
|
70
77
|
// шапка вроде rt-chat) из стекинга исключён — остаётся в одну строку.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# `rt-ai-chat`
|
|
2
|
+
|
|
3
|
+
```html
|
|
4
|
+
<rt-ai-chat
|
|
5
|
+
title="Ava"
|
|
6
|
+
placeholder="Ask Ava…"
|
|
7
|
+
fullScreenable
|
|
8
|
+
[messages]="messages()"
|
|
9
|
+
[suggestions]="suggestions"
|
|
10
|
+
[sending]="running()"
|
|
11
|
+
[error]="runError()"
|
|
12
|
+
[threads]="threads()"
|
|
13
|
+
[activeThreadId]="threadId()"
|
|
14
|
+
[(fullScreen)]="fullScreen"
|
|
15
|
+
(send)="ask($event)"
|
|
16
|
+
(stop)="stop()"
|
|
17
|
+
(retry)="retry()"
|
|
18
|
+
(newThread)="newThread()"
|
|
19
|
+
(selectThread)="open($event)"
|
|
20
|
+
(deleteThread)="confirmDelete($event)"
|
|
21
|
+
(feedbackChange)="rate($event)"
|
|
22
|
+
(closed)="close()">
|
|
23
|
+
<ng-template let-message rtAiChatMessageExtra>…графики ответа…</ng-template>
|
|
24
|
+
</rt-ai-chat>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Спек — `docs/specs/ui-kit-v2/ai-chat/`; здесь только устройство папки.
|
|
28
|
+
|
|
29
|
+
## Главное, что нужно знать
|
|
30
|
+
|
|
31
|
+
**Организм презентационный.** Сообщения с ходом работы, беседы и ошибка приходят входами, действия
|
|
32
|
+
уходят выходами. Поток событий модели разбирает приложение и отдаёт готовый `IRtAiChat.Message[]`.
|
|
33
|
+
|
|
34
|
+
**Живёт во входе `rich-editor`**: держит `rt-message-composer`, а тот тянет quill.
|
|
35
|
+
|
|
36
|
+
**Высоту задаёт родитель.** Хост — колонка на `block-size: 100%`; без высоты у родителя лента
|
|
37
|
+
меряется по содержимому и не прокручивается.
|
|
38
|
+
|
|
39
|
+
## Края
|
|
40
|
+
|
|
41
|
+
- `fullScreen`, `threadsOpen`, `draft` — `model()`: атрибут без значения даёт пустую строку, то
|
|
42
|
+
есть ложь. Пишется `[fullScreen]="true"`.
|
|
43
|
+
- Фокус переводит сам организм: на «назад» при открытии бесед, в поле сообщения после выбора
|
|
44
|
+
беседы, новой беседы, «Стоп» и возврата к ленте. Приложению — `focusComposer()`.
|
|
45
|
+
- Открытые шаги хода работы — внутреннее состояние (`openRuns`), по id ответа.
|
|
46
|
+
- Лента держится у низа, пока человек внизу: `nextAtBottom` и `RT_CHAT_PIN_RETRY_DELAYS_MS` из
|
|
47
|
+
логики `rt-chat`. Отправка вопроса и выбор беседы прижимают ленту к низу всегда.
|
|
48
|
+
- Удаление беседы — действие строки `rt-thread-list` (`rtThreadListRowActions`), подтверждение —
|
|
49
|
+
на приложении.
|
|
50
|
+
- Подсветка совпадений поиска по беседам — `splitSideMenuTitle`.
|
|
51
|
+
- Ответ рисует внутренний `rt-ai-chat-answer` (папка `answer/`): без него шаблон организма
|
|
52
|
+
превышает предел цикломатической сложности.
|
|
53
|
+
|
|
54
|
+
## Рядом
|
|
55
|
+
|
|
56
|
+
- [`rt-chat`](../chat/CONTEXT.md) — переписка людей.
|
|
57
|
+
- [`rt-ai-run-status`](../../../../lib/components/ai-run-status/CONTEXT.md) — строка хода работы.
|
|
58
|
+
- [`rt-thread-list`](../../../../lib/components/thread-list/CONTEXT.md) — список бесед.
|