@rt-tools/ui-kit-v2 0.11.0 → 0.12.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 +110 -5
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +947 -0
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2.mjs +11327 -8086
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
- package/package.json +8 -1
- package/rt-tools-ui-kit-v2-0.12.0.tgz +0 -0
- package/src/assets/fonts/montserrat-cyrillic-ext-wght-italic.woff2 +0 -0
- package/src/assets/fonts/montserrat-cyrillic-ext-wght-normal.woff2 +0 -0
- package/src/assets/fonts/montserrat-cyrillic-wght-italic.woff2 +0 -0
- package/src/assets/fonts/montserrat-cyrillic-wght-normal.woff2 +0 -0
- package/src/assets/fonts/montserrat-latin-ext-wght-italic.woff2 +0 -0
- package/src/assets/fonts/montserrat-latin-ext-wght-normal.woff2 +0 -0
- package/src/assets/fonts/montserrat-latin-wght-italic.woff2 +0 -0
- package/src/assets/fonts/montserrat-latin-wght-normal.woff2 +0 -0
- package/src/assets/icons/arrows.svg +9 -0
- package/src/assets/icons/equals.svg +8 -0
- package/src/assets/icons/user-off.svg +16 -0
- package/src/assets/icons-material/NOTICE.md +6 -2
- package/src/assets/icons-material/arrow-left.fill.svg +3 -0
- package/src/assets/icons-material/arrow-left.svg +1 -1
- package/src/assets/icons-material/arrow-right.fill.svg +3 -0
- package/src/assets/icons-material/arrow-right.svg +3 -0
- package/src/assets/icons-material/arrows.fill.svg +5 -0
- package/src/assets/icons-material/arrows.svg +5 -0
- package/src/assets/icons-material/ban.fill.svg +5 -0
- package/src/assets/icons-material/ban.svg +1 -1
- package/src/assets/icons-material/bars.fill.svg +3 -0
- package/src/assets/icons-material/bars.svg +1 -1
- package/src/assets/icons-material/check.fill.svg +3 -0
- package/src/assets/icons-material/check.svg +1 -1
- package/src/assets/icons-material/chevron-down.fill.svg +3 -0
- package/src/assets/icons-material/chevron-down.svg +1 -1
- package/src/assets/icons-material/chevron-left.fill.svg +3 -0
- package/src/assets/icons-material/chevron-left.svg +1 -1
- package/src/assets/icons-material/chevron-right.fill.svg +3 -0
- package/src/assets/icons-material/chevron-right.svg +1 -1
- package/src/assets/icons-material/close.fill.svg +3 -0
- package/src/assets/icons-material/close.svg +1 -1
- package/src/assets/icons-material/cloud-upload.fill.svg +5 -0
- package/src/assets/icons-material/cloud-upload.svg +1 -1
- package/src/assets/icons-material/cog.fill.svg +5 -0
- package/src/assets/icons-material/cog.svg +1 -1
- package/src/assets/icons-material/copy.fill.svg +5 -0
- package/src/assets/icons-material/copy.svg +1 -1
- package/src/assets/icons-material/ellipsis-h.fill.svg +5 -0
- package/src/assets/icons-material/ellipsis-h.svg +1 -1
- package/src/assets/icons-material/ellipsis-v.fill.svg +5 -0
- package/src/assets/icons-material/ellipsis-v.svg +1 -1
- package/src/assets/icons-material/email.fill.svg +5 -0
- package/src/assets/icons-material/email.svg +5 -0
- package/src/assets/icons-material/equals.fill.svg +3 -0
- package/src/assets/icons-material/equals.svg +3 -0
- package/src/assets/icons-material/external-link.fill.svg +5 -0
- package/src/assets/icons-material/external-link.svg +1 -1
- package/src/assets/icons-material/eye-slash.fill.svg +5 -0
- package/src/assets/icons-material/eye-slash.svg +1 -1
- package/src/assets/icons-material/eye.fill.svg +5 -0
- package/src/assets/icons-material/eye.svg +1 -1
- package/src/assets/icons-material/ico-download.fill.svg +5 -0
- package/src/assets/icons-material/ico-download.svg +1 -1
- package/src/assets/icons-material/ico-plus.fill.svg +3 -0
- package/src/assets/icons-material/ico-plus.svg +1 -1
- package/src/assets/icons-material/info-circle.fill.svg +5 -0
- package/src/assets/icons-material/info-circle.svg +1 -1
- package/src/assets/icons-material/pencil.fill.svg +5 -0
- package/src/assets/icons-material/pencil.svg +1 -1
- package/src/assets/icons-material/refresh.fill.svg +5 -0
- package/src/assets/icons-material/refresh.svg +1 -1
- package/src/assets/icons-material/search.fill.svg +5 -0
- package/src/assets/icons-material/search.svg +1 -1
- package/src/assets/icons-material/star.fill.svg +3 -0
- package/src/assets/icons-material/star.svg +1 -1
- package/src/assets/icons-material/sync.fill.svg +5 -0
- package/src/assets/icons-material/sync.svg +1 -1
- package/src/assets/icons-material/table.fill.svg +5 -0
- package/src/assets/icons-material/table.svg +1 -1
- package/src/assets/icons-material/tag.fill.svg +5 -0
- package/src/assets/icons-material/tag.svg +1 -1
- package/src/assets/icons-material/trash.fill.svg +5 -0
- package/src/assets/icons-material/trash.svg +1 -1
- package/src/assets/icons-material/user-off.fill.svg +5 -0
- package/src/assets/icons-material/user-off.svg +5 -0
- package/src/assets/icons-material/user.fill.svg +5 -0
- package/src/assets/icons-material/user.svg +1 -1
- package/src/lib/components/CONTEXT.md +3 -0
- package/src/lib/components/action-bar/CONTEXT.md +53 -0
- package/src/lib/components/action-bar/rt-action-bar-holder.component.scss +70 -0
- package/src/lib/components/action-bar/rt-action-bar.component.scss +122 -0
- package/src/lib/components/aside/CONTEXT.md +5 -1
- package/src/lib/components/aside/_rt-aside-overlay.scss +9 -0
- package/src/lib/components/aside/header/rt-aside-header.component.scss +18 -2
- package/src/lib/components/aside/rt-aside.component.scss +5 -1
- package/src/lib/components/autocomplete/CONTEXT.md +2 -1
- package/src/lib/components/button/CONTEXT.md +11 -11
- package/src/lib/components/checkbox/rt-checkbox.component.scss +5 -1
- package/src/lib/components/data-list/CONTEXT.md +122 -0
- package/src/lib/components/data-list/rt-data-list.component.scss +57 -0
- package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +256 -0
- package/src/lib/components/data-list/toolbar/rt-data-list-toolbar.component.scss +128 -0
- package/src/lib/components/data-table/CONTEXT.md +102 -0
- package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +115 -0
- package/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.scss +51 -0
- package/src/lib/components/data-table/header-cell/rt-data-table-header-cell.component.scss +111 -0
- package/src/lib/components/data-table/rt-data-table.component.scss +263 -0
- package/src/lib/components/date-picker/rt-date-picker.component.scss +13 -0
- package/src/lib/components/delta-view/CONTEXT.md +1 -1
- package/src/lib/components/dialog/CONTEXT.md +4 -0
- package/src/lib/components/dynamic-list/CONTEXT.md +90 -0
- package/src/lib/components/dynamic-list/rt-dynamic-list.component.scss +123 -0
- package/src/lib/components/empty-state/CONTEXT.md +5 -0
- package/src/lib/components/empty-state/rt-empty-state.component.scss +19 -5
- package/src/lib/components/file-card/rt-file-card.component.scss +14 -0
- package/src/lib/components/file-drop/rt-file-drop.component.scss +44 -8
- package/src/lib/components/icon-button/rt-icon-button.component.scss +28 -4
- package/src/lib/components/input/rt-input.component.scss +25 -1
- package/src/lib/components/input-number/rt-input-number.component.scss +13 -0
- package/src/lib/components/menu/CONTEXT.md +10 -0
- package/src/lib/components/menu/rt-menu-item.component.scss +35 -3
- package/src/lib/components/menu/rt-menu.component.scss +15 -5
- package/src/lib/components/multiselect/CONTEXT.md +3 -0
- package/src/lib/components/multiselect/rt-multiselect.component.scss +58 -1
- package/src/lib/components/pagination/CONTEXT.md +4 -1
- package/src/lib/components/pagination/rt-pagination.component.scss +43 -13
- package/src/lib/components/radio-button/CONTEXT.md +42 -0
- package/src/lib/components/radio-button/rt-radio-button.component.scss +105 -0
- package/src/lib/components/scroll-area/CONTEXT.md +52 -0
- package/src/lib/components/scroll-area/rt-scroll-area.component.scss +69 -0
- package/src/lib/components/select/CONTEXT.md +8 -1
- package/src/lib/components/select/rt-select.component.scss +110 -7
- package/src/lib/components/table/CONTEXT.md +46 -1
- package/src/lib/components/table/filter-header/CONTEXT.md +64 -0
- package/src/lib/components/table/filter-header/rt-table-filter-header.component.scss +76 -0
- package/src/lib/components/table/rt-table.component.scss +32 -1
- package/src/lib/components/tag/CONTEXT.md +9 -0
- package/src/lib/components/tag/rt-tag.component.scss +38 -0
- package/src/lib/components/textarea/CONTEXT.md +1 -1
- package/src/lib/components/toolbar/CONTEXT.md +3 -0
- package/src/lib/components/toolbar/rt-toolbar.component.scss +9 -2
- package/src/lib/components/tooltip/CONTEXT.md +4 -4
- package/src/lib/components/tooltip/rt-tooltip.component.scss +2 -2
- package/src/{lib → rich-editor/lib}/components/chat/CONTEXT.md +1 -1
- package/src/{lib → rich-editor/lib}/components/message-composer/CONTEXT.md +5 -1
- package/src/{lib → rich-editor/lib}/components/message-composer/rt-message-composer.component.scss +9 -0
- package/src/{lib → rich-editor/lib}/components/rich-editor/CONTEXT.md +2 -2
- package/src/styles/_coarse-pointer.scss +15 -0
- package/src/styles/_coexist.scss +28 -0
- package/src/styles/_fonts.scss +99 -0
- package/src/styles/_index.scss +13 -0
- package/src/styles/_preset-material.scss +201 -26
- package/src/styles/_primitives.scss +41 -5
- package/src/styles/_scrollbar.scss +16 -12
- package/src/styles/_semantic-lists.scss +89 -0
- package/src/styles/_semantic.scss +80 -9
- package/src/styles/_theme-dark.scss +36 -0
- package/src/styles/_theme-scope.scss +111 -0
- package/src/styles/tokens.coexist.scss +3 -0
- package/src/styles/tokens.package.scss +6 -0
- package/styles/tokens.coexist.css +27 -0
- package/styles/tokens.css +5443 -43
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +529 -0
- package/types/rt-tools-ui-kit-v2.d.ts +2744 -1367
- package/rt-tools-ui-kit-v2-0.11.0.tgz +0 -0
- /package/src/{lib → rich-editor/lib}/components/chat/rt-chat.component.scss +0 -0
- /package/src/{lib → rich-editor/lib}/components/rich-editor/rt-rich-editor.component.scss +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
@layer rt-kit.components {
|
|
2
2
|
.rt-select {
|
|
3
|
+
--rt-select-fill-radius: var(--rt-radius-sm);
|
|
3
4
|
--rt-select-caret-transition-duration: var(--rt-duration-fast);
|
|
5
|
+
--rt-select-own-outline-width: var(--rt-border-width-medium);
|
|
4
6
|
|
|
5
7
|
position: relative;
|
|
6
8
|
display: block;
|
|
@@ -13,6 +15,17 @@
|
|
|
13
15
|
border-color: transparent;
|
|
14
16
|
}
|
|
15
17
|
|
|
18
|
+
/* Вид «fill» — залитое поле с чертой снизу, как у материального поля первого кита: скругление
|
|
19
|
+
у него своё и малое — скругление поля бывает «таблеткой», а у залитого поля низ прямой.
|
|
20
|
+
Объявлен до блоков состояний: фокус, ошибка и «только чтение» идут ниже и
|
|
21
|
+
перекрывают его рамку. */
|
|
22
|
+
&--appearance--fill &__trigger {
|
|
23
|
+
border-color: transparent;
|
|
24
|
+
border-radius: var(--rt-select-fill-radius) var(--rt-select-fill-radius) 0 0;
|
|
25
|
+
border-bottom-color: var(--rt-color-field-fill-underline);
|
|
26
|
+
background-color: var(--rt-color-bg-surface-subtle-2);
|
|
27
|
+
}
|
|
28
|
+
|
|
16
29
|
&__trigger {
|
|
17
30
|
display: flex;
|
|
18
31
|
width: 100%;
|
|
@@ -49,10 +62,48 @@
|
|
|
49
62
|
}
|
|
50
63
|
}
|
|
51
64
|
|
|
65
|
+
/* Свой указатель потребителя: полевой вид кнопки снимается — ground, рамка, высота и
|
|
66
|
+
отступы. Останется он — значок или метка потребителя окажутся внутри чужого поля, и
|
|
67
|
+
вход теряет смысл. Поведение при этом на кнопке, снимается только вид.
|
|
68
|
+
|
|
69
|
+
Ширина входит в полевой вид наравне с рамкой: поле берёт всю ширину хозяина, а разметка
|
|
70
|
+
потребителя уже. В покое этого не видно — фон и рамка сняты, — а на нажатии полевое
|
|
71
|
+
кольцо обводит кнопку, и она оказывается шире нарисованного: 240 точек против метки в
|
|
72
|
+
134. Поэтому кнопка меряется своим содержимым, а полевые состояния — кольцо на фокусе и
|
|
73
|
+
рамка открытого списка — на своём указателе не рисуются вовсе. Открытость потребитель
|
|
74
|
+
рисует сам: обстановка шаблона несёт её признаком. */
|
|
75
|
+
&__trigger--own {
|
|
76
|
+
width: auto;
|
|
77
|
+
min-height: 0;
|
|
78
|
+
padding: 0;
|
|
79
|
+
border-color: transparent;
|
|
80
|
+
background-color: transparent;
|
|
81
|
+
|
|
82
|
+
&:focus {
|
|
83
|
+
border-color: transparent;
|
|
84
|
+
box-shadow: none;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* Ход клавишами остаётся видимым: снять полевое кольцо значит снять единственную
|
|
88
|
+
примету фокуса. Обводка идёт по содержимому кнопки — кнопка теперь по нему и
|
|
89
|
+
меряется. :focus-visible, а не :focus: щелчку мышью примета не нужна, её даёт
|
|
90
|
+
разметка потребителя. */
|
|
91
|
+
&:focus-visible {
|
|
92
|
+
outline: var(--rt-select-own-outline-width) solid var(--rt-input-color-border-focus);
|
|
93
|
+
outline-offset: var(--rt-input-focus-outline-offset);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
52
97
|
&--open &__trigger {
|
|
53
98
|
border-color: var(--rt-input-color-border-focus);
|
|
54
99
|
}
|
|
55
100
|
|
|
101
|
+
/* Рамка открытого списка — тот же полевой вид, только приходит позже. Правило выше бьёт
|
|
102
|
+
объявление у --own по силе, поэтому снимается отдельной строкой. */
|
|
103
|
+
&--open &__trigger--own {
|
|
104
|
+
border-color: transparent;
|
|
105
|
+
}
|
|
106
|
+
|
|
56
107
|
&--invalid &__trigger {
|
|
57
108
|
border-color: var(--rt-input-color-border-error);
|
|
58
109
|
|
|
@@ -61,6 +112,16 @@
|
|
|
61
112
|
}
|
|
62
113
|
}
|
|
63
114
|
|
|
115
|
+
/* Рамка ошибки — тоже полевой вид. Неверность своего указателя потребитель показывает
|
|
116
|
+
своей разметкой: чужая красная рамка легла бы вокруг его метки. */
|
|
117
|
+
&--invalid &__trigger--own {
|
|
118
|
+
border-color: transparent;
|
|
119
|
+
|
|
120
|
+
&:focus {
|
|
121
|
+
box-shadow: none;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
64
125
|
&--disabled {
|
|
65
126
|
opacity: var(--rt-input-disabled-opacity);
|
|
66
127
|
}
|
|
@@ -118,18 +179,48 @@
|
|
|
118
179
|
transform: rotate(180deg);
|
|
119
180
|
}
|
|
120
181
|
|
|
182
|
+
/* Под материальным набором стрелка — залитый треугольник mat-select первого кита, 10 на 5 px,
|
|
183
|
+
и открытое поле его не переворачивает. Свой вид кита остаётся с шевроном. Размер значок
|
|
184
|
+
ставит себе встроенным стилем, поэтому треугольник задан пределами, а не шириной. */
|
|
185
|
+
:is(.rt-preset-material, [data-preset='material']) &__chevron {
|
|
186
|
+
max-width: 10px;
|
|
187
|
+
max-height: 5px;
|
|
188
|
+
background-color: currentcolor;
|
|
189
|
+
clip-path: polygon(0 0, 100% 0, 50% 100%);
|
|
190
|
+
transform: none;
|
|
191
|
+
|
|
192
|
+
svg {
|
|
193
|
+
display: none;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
121
197
|
/* Panel рендерится в CDK Overlay (body) — позиционирование на CDK,
|
|
122
198
|
здесь только chrome. Глобальный класс (ViewEncapsulation.None). */
|
|
123
199
|
&__panel {
|
|
124
200
|
/* Панель рисуется в CDK Overlay, вне поддерева блока: свойство
|
|
125
201
|
объявляется на ней самой — с корня блока оно бы не докатилось. */
|
|
126
|
-
--rt-select-panel-shadow: var(--rt-shadow
|
|
202
|
+
--rt-select-panel-shadow: var(--rt-overlay-select-shadow);
|
|
203
|
+
--rt-select-panel-radius: var(--rt-overlay-select-radius);
|
|
204
|
+
--rt-select-option-font-size: var(--rt-overlay-select-option-font-size);
|
|
205
|
+
--rt-select-selected-bg: var(--rt-overlay-select-selected-bg);
|
|
206
|
+
--rt-select-selected-weight: var(--rt-overlay-select-selected-weight);
|
|
207
|
+
--rt-select-check-display: var(--rt-overlay-select-check-display);
|
|
208
|
+
--rt-select-option-min-height: var(--rt-overlay-select-option-min-height);
|
|
209
|
+
--rt-select-panel-border-width: var(--rt-overlay-select-panel-border-width);
|
|
210
|
+
|
|
211
|
+
/* Предел высоты по умолчанию — предел кита: длинный список прокручивается внутри
|
|
212
|
+
панели, а не уходит за нижний край экрана. Вход `panelMaxHeight` ставит свой
|
|
213
|
+
предел на саму панель, а `none` снимает его для короткого списка. */
|
|
214
|
+
--rt-select-panel-max-height: var(--rt-input-panel-max-height);
|
|
127
215
|
|
|
216
|
+
/* Ширина берётся от коробки наложения: её нижнюю границу ставит указатель,
|
|
217
|
+
а выше она растёт по содержимому. Без этой строки панель мерилась бы
|
|
218
|
+
содержимым внутри коробки и не дотягивалась до ширины поля. */
|
|
128
219
|
width: 100%;
|
|
129
|
-
max-height: var(--rt-
|
|
220
|
+
max-height: var(--rt-select-panel-max-height);
|
|
130
221
|
box-sizing: border-box;
|
|
131
|
-
border: var(--rt-
|
|
132
|
-
border-radius: var(--rt-
|
|
222
|
+
border: var(--rt-select-panel-border-width) solid var(--rt-color-border-subtle);
|
|
223
|
+
border-radius: var(--rt-select-panel-radius);
|
|
133
224
|
background-color: var(--rt-color-bg-surface);
|
|
134
225
|
box-shadow: var(--rt-select-panel-shadow);
|
|
135
226
|
overflow-y: auto;
|
|
@@ -147,10 +238,16 @@
|
|
|
147
238
|
}
|
|
148
239
|
|
|
149
240
|
&__option {
|
|
241
|
+
display: flex;
|
|
242
|
+
min-height: var(--rt-select-option-min-height);
|
|
243
|
+
box-sizing: border-box;
|
|
244
|
+
align-items: center;
|
|
245
|
+
justify-content: space-between;
|
|
150
246
|
padding: var(--rt-space-sm) var(--rt-space-md);
|
|
151
247
|
color: var(--rt-color-text-primary);
|
|
152
248
|
cursor: pointer;
|
|
153
|
-
font-size: var(--rt-
|
|
249
|
+
font-size: var(--rt-select-option-font-size);
|
|
250
|
+
gap: var(--rt-space-sm);
|
|
154
251
|
|
|
155
252
|
&:hover,
|
|
156
253
|
&--active {
|
|
@@ -158,8 +255,8 @@
|
|
|
158
255
|
}
|
|
159
256
|
|
|
160
257
|
&--selected {
|
|
161
|
-
background-color: var(--rt-
|
|
162
|
-
font-weight: var(--rt-
|
|
258
|
+
background-color: var(--rt-select-selected-bg);
|
|
259
|
+
font-weight: var(--rt-select-selected-weight);
|
|
163
260
|
}
|
|
164
261
|
|
|
165
262
|
&--disabled {
|
|
@@ -172,6 +269,12 @@
|
|
|
172
269
|
}
|
|
173
270
|
}
|
|
174
271
|
|
|
272
|
+
/* Отметка выбранного пункта — у mat-select первого кита; свой вид её не рисует. */
|
|
273
|
+
&__check {
|
|
274
|
+
display: var(--rt-select-check-display);
|
|
275
|
+
flex-shrink: 0;
|
|
276
|
+
}
|
|
277
|
+
|
|
175
278
|
&__empty {
|
|
176
279
|
padding: var(--rt-space-sm) var(--rt-space-md);
|
|
177
280
|
color: var(--rt-input-color-text-placeholder);
|
|
@@ -14,6 +14,47 @@
|
|
|
14
14
|
</table>
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
+
## Колонка действий строки
|
|
18
|
+
|
|
19
|
+
Колонка «…» объявлена в разметке самой таблицы, а не приходит от потребителя, и в реестр
|
|
20
|
+
`CdkTable` она вносится вручную в `ngOnInit` — тем же приёмом, каким это делает `CdkTextColumn`
|
|
21
|
+
самого CDK. Запрос к разметке взят статическим намеренно: сигнальный резолвится после первой
|
|
22
|
+
отрисовки строк, а колонка обязана попасть в реестр до неё. Ячейки колонки получают своё
|
|
23
|
+
объявление тем же вызовом: без ручного присвоения CDK падает на разборе шаблона ячейки.
|
|
24
|
+
|
|
25
|
+
## Строка отбора
|
|
26
|
+
|
|
27
|
+
Ряд отбора рисует сама таблица, по полю `filter` в `columnsConfig`, и только когда его просят
|
|
28
|
+
входом `showFilters`. Ячейку рисует [`rt-table-filter-header`](./filter-header/CONTEXT.md), набор
|
|
29
|
+
ячеек собирает `filterCellsOf` — по списку показанных колонок, а не по тем, у кого есть отбор:
|
|
30
|
+
колонка без отбора держит своё место пустой ячейкой, иначе ячейки съехали бы под соседние колонки.
|
|
31
|
+
|
|
32
|
+
Ряд стоит строкой таблицы под шапкой, а не частью ячейки шапки: шапку колонки объявляет
|
|
33
|
+
потребитель разметкой колонки, и вставить туда свою ячейку таблице некуда.
|
|
34
|
+
|
|
35
|
+
**В карточном виде ряда нет.** Карточный вид гасит строки таблицы поимённо, и строка отбора
|
|
36
|
+
скрыта тем же правилом: столбцов там не остаётся вовсе. Чем отбирать на узком показе — работа
|
|
37
|
+
своя, она стоит открытым вопросом в `docs/specs/ui-kit-v2/table-filter/`.
|
|
38
|
+
|
|
39
|
+
Набор условий таблица у себя не держит: он приходит входом `filters` и уходит выходом
|
|
40
|
+
`filtersChange` целиком, а строки сужает потребитель.
|
|
41
|
+
|
|
42
|
+
## Состояния показа
|
|
43
|
+
|
|
44
|
+
Что таблица рисует, решают вместе `[loading]`, `[fetching]` и число строк источника.
|
|
45
|
+
|
|
46
|
+
| Состояние | Что на экране |
|
|
47
|
+
| -------------------------- | --------------------------------------------------------------------------- |
|
|
48
|
+
| первая загрузка, строк нет | шапка и N строк-заглушек по `[columns]` |
|
|
49
|
+
| догрузка, строки есть | прежние строки на месте, поверх них закреплённое наложение с бегунком |
|
|
50
|
+
| загрузки нет, строк нет | пустое место: шаблон `#rtTableEmpty` или `rt-empty-state` по входам подписи |
|
|
51
|
+
| загрузки нет, строки есть | обычный показ строк |
|
|
52
|
+
|
|
53
|
+
Наложение бегунка закреплено относительно ближайшего предка с прокруткой, поэтому бегунок виден
|
|
54
|
+
в середине окна, а не уезжает с таблицей. Строки-заглушки читают `[columns]` — тот же список имён,
|
|
55
|
+
что стоит в объявлении строки CDK: разбирать внутренности CDK ради их числа дороже, чем назвать
|
|
56
|
+
список входом.
|
|
57
|
+
|
|
17
58
|
| вход | тип | умолчание |
|
|
18
59
|
| ----------------------------------- | ----------------------------- | ------------- |
|
|
19
60
|
| `columns` | `ReadonlyArray<string>` | `[]` |
|
|
@@ -27,9 +68,11 @@
|
|
|
27
68
|
| `emptyMessage` / `emptyDescription` | `string` / `string \| null` | `''` / `null` |
|
|
28
69
|
| `emptyIcon` | `IRtIcon.Name \| null` | `'inbox'` |
|
|
29
70
|
| `showRowActions` | `boolean` | `false` |
|
|
71
|
+
| `showFilters` | `boolean` | `false` |
|
|
72
|
+
| `filters` | `ReadonlyArray<IFilterModel>` | `[]` |
|
|
30
73
|
| `sort` | `ISortModel<string> \| null` | `null` |
|
|
31
74
|
|
|
32
|
-
|
|
75
|
+
Выходы: `sortChange`, `filtersChange`.
|
|
33
76
|
|
|
34
77
|
## Главное, что нужно знать
|
|
35
78
|
|
|
@@ -50,4 +93,6 @@
|
|
|
50
93
|
- Пустой набор рисует заглушку с переведённым `uiNoData`; свой текст перебивает её.
|
|
51
94
|
- Колонка `rtRowActions` добавляется китом сама, когда включён `showRowActions`, и рисует
|
|
52
95
|
[`rt-menu`](../menu/CONTEXT.md) в строке.
|
|
96
|
+
- Отбор колонки объявляется полем `filter` в `columnsConfig`, и ряд отбора таблица рисует сама —
|
|
97
|
+
см. раздел выше. Колонка без `filter` не отбирает вовсе. Строк таблица не сужает.
|
|
53
98
|
- Спеки логики лежат рядом: сортировка и предикат действий строки проверены отдельно.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# `rt-table-filter-header`
|
|
2
|
+
|
|
3
|
+
Отбор в шапке столбца: вид сравнения слева, поле значения рядом, очистка — там, где есть что
|
|
4
|
+
очищать. Стоит в своей ячейке строки отбора, у того же ключа колонки, что в `cdkColumnDef` и в
|
|
5
|
+
`[columnsConfig]`.
|
|
6
|
+
|
|
7
|
+
**Зовёт его таблица, а не потребитель.** Строку отбора [`rt-table`](../CONTEXT.md) рисует сама по
|
|
8
|
+
полю `filter` в настройке колонок — руками в шапку колонки его писать не нужно. Разметка ниже
|
|
9
|
+
показывает, что таблица собирает в каждой ячейке той строки.
|
|
10
|
+
|
|
11
|
+
```html
|
|
12
|
+
<th rtElem="filter-cell">
|
|
13
|
+
<rt-table-filter-header propertyName="title" [filter]="config.filter" [filters]="filters()" (filtersChange)="filters.set($event)" />
|
|
14
|
+
</th>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
| вход | тип | умолчание |
|
|
18
|
+
| -------------- | --------------------------------- | ------------ |
|
|
19
|
+
| `propertyName` | `string` | обязательный |
|
|
20
|
+
| `filter` | `IRtTable.ColumnFilter \| null` | `null` |
|
|
21
|
+
| `filters` | `readonly IFilterModel<string>[]` | `[]` |
|
|
22
|
+
|
|
23
|
+
Выход: `filtersChange`.
|
|
24
|
+
|
|
25
|
+
## Главное, что нужно знать
|
|
26
|
+
|
|
27
|
+
**Вид отбора объявляет колонка, а не угадывает значение.** `kind` решает, какую готовую часть
|
|
28
|
+
кита позвать: `text` — [`rt-input`](../../input/CONTEXT.md), `number` —
|
|
29
|
+
[`rt-input-number`](../../input-number/CONTEXT.md), `select` —
|
|
30
|
+
[`rt-select`](../../select/CONTEXT.md) по набору `options`, `date` —
|
|
31
|
+
[`rt-date-picker`](../../date-picker/CONTEXT.md). Своих полей ячейка не рисует ни одного.
|
|
32
|
+
|
|
33
|
+
**Колонка без `filter` не отбирает вовсе** и не рисует ничего: вход необязателен, и обещание
|
|
34
|
+
держит кит, а не каждый потребитель по-своему.
|
|
35
|
+
|
|
36
|
+
**Наружу уходит весь набор условий, а не одно изменившееся.** Потребитель спрашивает сервер
|
|
37
|
+
набором; получив одно условие, он держал бы вторую копию набора — две копии расходятся молча.
|
|
38
|
+
|
|
39
|
+
**Строк ячейка не отбирает.** Она сообщает, чего от списка хотят; список принадлежит тому, кто
|
|
40
|
+
его держит.
|
|
41
|
+
|
|
42
|
+
**Набранное уходит наружу по уходу из поля и по Enter, выбранное — сразу.** Набор условий,
|
|
43
|
+
уходящий на каждый знак, спрашивает сервер по букве: ответы возвращаются вперемешку, и список
|
|
44
|
+
показывает ответ на значение, которое человек уже сменил. У выбора из списка и у даты
|
|
45
|
+
недописанного состояния нет вовсе, поэтому ждать у них нечего.
|
|
46
|
+
|
|
47
|
+
## Края
|
|
48
|
+
|
|
49
|
+
- Пустое поле несёт подсказку из словаря кита: `uiFilterValue` у текста и числа, `uiFilterChoose`
|
|
50
|
+
у списка. Поле даты подсказку не берёт — формат рисует сам браузер.
|
|
51
|
+
- Пустое значение снимает колонку с отбора и не едет наружу пустым условием.
|
|
52
|
+
- Повтор того же значения и смена вида сравнения без значения не сообщают ничего: прежний набор
|
|
53
|
+
приходит обратно тем же объектом, и по этому признаку видно, что менять было нечего.
|
|
54
|
+
- Дата хранится строкой и сверяется строкой: `Date` не равен строке никогда, и без приведения
|
|
55
|
+
повторный выбор той же даты каждый раз считался бы новым значением.
|
|
56
|
+
- Виды сравнения колонка сужает входом `operators` и называет начальный входом `startOperator`;
|
|
57
|
+
молчит — разрешены все семь, начальный «Равно».
|
|
58
|
+
- Ширину ячейка берёт от шапки колонки: меряйся она содержимым, пустой список в ней схлопнулся
|
|
59
|
+
бы до одной галочки.
|
|
60
|
+
|
|
61
|
+
## Рядом
|
|
62
|
+
|
|
63
|
+
- [`rt-table`](../CONTEXT.md) — таблица, чей `columnsConfig` объявляет отбор колонки.
|
|
64
|
+
- [`rt-table-sort-header`](../sort-header/CONTEXT.md) — соседний по шапке: порядок строк.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
@layer rt-kit.components {
|
|
2
|
+
/* rt-table-filter-header — ViewEncapsulation.None: правила таргетируют BEM-класс блока.
|
|
3
|
+
`.rt-table-filter-header` — сам хост (шаблон начинается с ng-container, класс ставит host). */
|
|
4
|
+
|
|
5
|
+
.rt-table-filter-header {
|
|
6
|
+
--rt-table-filter-header-radius: var(--rt-radius-sm);
|
|
7
|
+
--rt-table-filter-header-operator-color: var(--rt-color-text-muted);
|
|
8
|
+
--rt-table-filter-header-operator-color-set: var(--rt-color-text-primary);
|
|
9
|
+
--rt-table-filter-header-operator-bg-hover: var(--rt-color-bg-subtle);
|
|
10
|
+
--rt-table-filter-header-operator-focus-shadow: var(--rt-shadow-focus-ring);
|
|
11
|
+
|
|
12
|
+
// Ширина — от шапки колонки, а не от содержимого: ячейка, меряющая себя содержимым,
|
|
13
|
+
// отдаёт полю ровно столько, сколько поле попросило само, и выбор из списка с пустым
|
|
14
|
+
// значением схлопывается до одной галочки. Так же устроена та же ячейка первого кита.
|
|
15
|
+
display: flex;
|
|
16
|
+
width: 100%;
|
|
17
|
+
min-width: 0;
|
|
18
|
+
align-items: center;
|
|
19
|
+
gap: var(--rt-space-1);
|
|
20
|
+
|
|
21
|
+
// Кнопка вида сравнения — подпись словом, а не значком: значок сравнения читается
|
|
22
|
+
// догадкой, и семь догадок подряд человек не держит в голове.
|
|
23
|
+
&__operator {
|
|
24
|
+
padding: var(--rt-space-0-5) var(--rt-space-1);
|
|
25
|
+
border: 0;
|
|
26
|
+
border-radius: var(--rt-table-filter-header-radius);
|
|
27
|
+
background: transparent;
|
|
28
|
+
color: var(--rt-table-filter-header-operator-color);
|
|
29
|
+
cursor: pointer;
|
|
30
|
+
font-family: inherit;
|
|
31
|
+
font-size: var(--rt-text-xs);
|
|
32
|
+
white-space: nowrap;
|
|
33
|
+
|
|
34
|
+
&:hover {
|
|
35
|
+
background: var(--rt-table-filter-header-operator-bg-hover);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
&:focus-visible {
|
|
39
|
+
box-shadow: var(--rt-table-filter-header-operator-focus-shadow);
|
|
40
|
+
outline: none;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Заданный отбор виден по самой кнопке: колонка, которая сузила список, должна
|
|
44
|
+
// отличаться от той, которая не сужала, и без значения в поле тоже.
|
|
45
|
+
&--set {
|
|
46
|
+
color: var(--rt-table-filter-header-operator-color-set);
|
|
47
|
+
font-weight: var(--rt-font-weight-medium);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Поле берёт остаток места: шапка колонки у́же любого поля, и без этого поле выдавило бы
|
|
52
|
+
// кнопку вида сравнения за край ячейки.
|
|
53
|
+
&__value {
|
|
54
|
+
min-width: 0;
|
|
55
|
+
flex: 1 1 auto;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
&__clear {
|
|
59
|
+
flex: none;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Список рисуется в слое CDK, вне хоста: токены хоста туда не наследуются, поэтому
|
|
63
|
+
// ручки меню объявлены на самой панели списка.
|
|
64
|
+
&__operators {
|
|
65
|
+
--rt-table-filter-header-menu-radius: var(--rt-radius-md);
|
|
66
|
+
--rt-table-filter-header-menu-shadow: var(--rt-shadow-card);
|
|
67
|
+
|
|
68
|
+
display: flex;
|
|
69
|
+
flex-direction: column;
|
|
70
|
+
padding: var(--rt-space-1);
|
|
71
|
+
border-radius: var(--rt-table-filter-header-menu-radius);
|
|
72
|
+
background: var(--rt-color-bg-surface);
|
|
73
|
+
box-shadow: var(--rt-table-filter-header-menu-shadow);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
.cdk-header-cell,
|
|
17
17
|
.cdk-cell,
|
|
18
|
+
&__filter-cell,
|
|
18
19
|
&__skeleton-cell {
|
|
19
20
|
position: relative;
|
|
20
21
|
height: 50px;
|
|
@@ -44,6 +45,7 @@
|
|
|
44
45
|
/* Левый периметр не рисуем — первая колонка без левой грани. */
|
|
45
46
|
.cdk-header-cell:first-child,
|
|
46
47
|
.cdk-cell:first-child,
|
|
48
|
+
&__filter-cell:first-child,
|
|
47
49
|
&__skeleton-cell:first-child {
|
|
48
50
|
border-left: none;
|
|
49
51
|
}
|
|
@@ -65,6 +67,31 @@
|
|
|
65
67
|
(rtElem="table-scroll", overflow-x), без border/padding. Плавающая кнопка
|
|
66
68
|
не занимает места в раскладке — поэтому горизонтальный скролл не уводит её
|
|
67
69
|
из вьюпорта. Компаунд с .cdk-cell держит специфичность выше базовой ячейки. */
|
|
70
|
+
|
|
71
|
+
/* Ряд отбора — строка таблицы под шапкой. Своё правило нужно ему и затем, чтобы
|
|
72
|
+
карточный вид ниже было чем перебить: там столбцов нет вовсе. */
|
|
73
|
+
&__filter-row {
|
|
74
|
+
display: table-row;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* Строка отбора стоит второй строкой шапки и оформляется как шапка: иначе поля
|
|
78
|
+
отбора читаются как первая строка данных. Ячейка пустой колонки держит своё
|
|
79
|
+
место и не рисует ничего — её ширину задаёт колонка выше. */
|
|
80
|
+
&__filter-cell {
|
|
81
|
+
height: auto;
|
|
82
|
+
background: var(--rt-color-bg-surface);
|
|
83
|
+
padding-block: var(--rt-space-1);
|
|
84
|
+
vertical-align: middle;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* Ячейка колонки действий в строке отбора — нулевая, как её шапка: иначе поля и рамка
|
|
88
|
+
дали бы колонке ширину, а плавающая кнопка места в раскладке не занимает. */
|
|
89
|
+
&__filter-cell--actions {
|
|
90
|
+
width: 0;
|
|
91
|
+
padding: 0;
|
|
92
|
+
border: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
68
95
|
&__actions-header.cdk-header-cell {
|
|
69
96
|
width: 0;
|
|
70
97
|
padding: 0;
|
|
@@ -233,10 +260,14 @@
|
|
|
233
260
|
min-width: 0;
|
|
234
261
|
max-width: 100%;
|
|
235
262
|
|
|
263
|
+
/* Ряд отбора скрыт здесь же, где строки таблицы: в карточном виде столбцов нет
|
|
264
|
+
вовсе, и ряд ячеек над списком карточек читается обрывком другой разметки.
|
|
265
|
+
Отбор на узком показе — работа своя, она названа открытым вопросом описания. */
|
|
236
266
|
.cdk-header-row,
|
|
237
267
|
.cdk-row,
|
|
238
268
|
.rt-table__skeleton-row,
|
|
239
|
-
.rt-table__empty-row
|
|
269
|
+
.rt-table__empty-row,
|
|
270
|
+
.rt-table__filter-row {
|
|
240
271
|
display: none;
|
|
241
272
|
}
|
|
242
273
|
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
| ------------------ | -------------------------------------------------------------------------- | -------------- |
|
|
9
9
|
| `value` | `string` | **обязателен** |
|
|
10
10
|
| `severity` | `'info' \| 'success' \| 'warning' \| 'danger' \| 'secondary' \| 'neutral'` | `'neutral'` |
|
|
11
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` |
|
|
11
12
|
| `shape` | `'pill' \| 'square'` | `'pill'` |
|
|
12
13
|
| `appearance` | `'solid' \| 'outlined'` | `'solid'` |
|
|
13
14
|
| `radius` | `'none' \| 'sm' \| 'md' \| 'lg' \| 'full' \| null` | `null` |
|
|
@@ -28,6 +29,14 @@
|
|
|
28
29
|
|
|
29
30
|
## Как этим пользоваться
|
|
30
31
|
|
|
32
|
+
- **Подпись, которой не хватило места, урезается и получает подсказку с целым значением.** Своей
|
|
33
|
+
подсказки писать не надо: её ставит готовая директива кита. Подсказки нет, пока подпись влезает —
|
|
34
|
+
над целым значением она ничего не сказала бы.
|
|
35
|
+
|
|
36
|
+
- **`size` двигает отступы, кегль и значок разом.** Своего входа у значка нет: `sm` даёт значок
|
|
37
|
+
12 пикселей, `md` — 16, `lg` — 20. Кегль, названный отдельно, оставил бы отступы от другой
|
|
38
|
+
ступени, и ряд пилюль перестал бы выстраиваться.
|
|
39
|
+
|
|
31
40
|
- `radius` перебивает скругление, заданное формой. Без него класс скругления не выводится
|
|
32
41
|
вовсе — радиус берётся из `shape`.
|
|
33
42
|
- Палитра дублируется атрибутом `data-severity` — по нему тег находят проверки и внешние стили,
|
|
@@ -7,11 +7,17 @@
|
|
|
7
7
|
rt-tag {
|
|
8
8
|
display: inline-flex;
|
|
9
9
|
|
|
10
|
+
/* Предел стоит и на хосте, и на пилюле внутри. Вмещающий блок пилюли — сам хост, и без
|
|
11
|
+
предела на нём он растёт по содержимому: «сто процентов» пилюли считаются тогда от
|
|
12
|
+
разросшегося хоста, и метка вылезает за место, которое ей дали. */
|
|
13
|
+
max-width: 100%;
|
|
14
|
+
|
|
10
15
|
.rt-tag {
|
|
11
16
|
--rt-tag-radius: var(--rt-radius-md);
|
|
12
17
|
--rt-tag-border-width: var(--rt-border-width-thin);
|
|
13
18
|
|
|
14
19
|
display: inline-flex;
|
|
20
|
+
max-width: 100%;
|
|
15
21
|
align-items: center;
|
|
16
22
|
padding: var(--rt-space-1) var(--rt-space-2);
|
|
17
23
|
border-radius: var(--rt-tag-radius);
|
|
@@ -21,6 +27,27 @@
|
|
|
21
27
|
gap: var(--rt-space-1);
|
|
22
28
|
line-height: var(--rt-leading-tight);
|
|
23
29
|
|
|
30
|
+
/* Ступени размера: отступы, кегль и просвет между частями двигаются вместе. `md`
|
|
31
|
+
повторяет то, чем метка рисовалась до появления ступеней, и вид без входа не
|
|
32
|
+
меняется ни на пиксель. */
|
|
33
|
+
&--size--sm {
|
|
34
|
+
padding: var(--rt-space-0-5) var(--rt-space-1);
|
|
35
|
+
font-size: var(--rt-text-xs);
|
|
36
|
+
gap: var(--rt-space-0-5);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
&--size--md {
|
|
40
|
+
padding: var(--rt-space-1) var(--rt-space-2);
|
|
41
|
+
font-size: var(--rt-text-sm);
|
|
42
|
+
gap: var(--rt-space-1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
&--size--lg {
|
|
46
|
+
padding: var(--rt-space-2) var(--rt-space-4);
|
|
47
|
+
font-size: var(--rt-text-md);
|
|
48
|
+
gap: var(--rt-space-2);
|
|
49
|
+
}
|
|
50
|
+
|
|
24
51
|
&--shape--pill {
|
|
25
52
|
--rt-tag-radius: var(--rt-radius-full);
|
|
26
53
|
}
|
|
@@ -91,8 +118,19 @@
|
|
|
91
118
|
flex-shrink: 0;
|
|
92
119
|
}
|
|
93
120
|
|
|
121
|
+
/* Пилюля берёт ширину, которую даёт ей место, и не растёт за неё: подпись приходит
|
|
122
|
+
от потребителя, укоротить её он не может. Что не влезло — многоточие, и рядом с
|
|
123
|
+
ним подсказка: усечение без неё читается как целое значение. */
|
|
94
124
|
&__text {
|
|
125
|
+
overflow: hidden;
|
|
126
|
+
|
|
127
|
+
/* Без нулевого минимума ширины элемент гибкой раскладки не сжимается ниже своего
|
|
128
|
+
содержимого, и многоточие не появляется вовсе: пилюля просто вылезает за место.
|
|
129
|
+
Проверка этого не ловит — раскладки в ней нет, и переполнение в ней подменено. */
|
|
130
|
+
min-width: 0;
|
|
95
131
|
line-height: var(--rt-leading-none);
|
|
132
|
+
text-overflow: ellipsis;
|
|
133
|
+
white-space: nowrap;
|
|
96
134
|
}
|
|
97
135
|
|
|
98
136
|
&__close {
|
|
@@ -20,3 +20,6 @@
|
|
|
20
20
|
|
|
21
21
|
**Без единого слота панель не рисуется вовсе** — ни одного узла в DOM. Необъявленный слот тоже
|
|
22
22
|
не создаёт пустой полосы: пустая полоса занимала бы место и растягивала соседние.
|
|
23
|
+
|
|
24
|
+
**Отступ полосы сверху и снизу — свойства блока** `--rt-toolbar-padding-top` и
|
|
25
|
+
`--rt-toolbar-padding-bottom`, по умолчанию 8px. Список ставит им свои имена.
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
@layer rt-kit.components {
|
|
2
2
|
.rt-toolbar {
|
|
3
|
+
/* Отступ полосы сверху и снизу — свойства блока: обёртка переставляет их снаружи. */
|
|
4
|
+
--rt-toolbar-padding-top: var(--rt-space-2);
|
|
5
|
+
--rt-toolbar-padding-bottom: var(--rt-space-2);
|
|
6
|
+
|
|
3
7
|
display: block;
|
|
4
8
|
|
|
5
9
|
&__bars {
|
|
@@ -8,7 +12,7 @@
|
|
|
8
12
|
flex-direction: row;
|
|
9
13
|
align-items: center;
|
|
10
14
|
justify-content: space-between;
|
|
11
|
-
padding: var(--rt-
|
|
15
|
+
padding: var(--rt-toolbar-padding-top) 0 var(--rt-toolbar-padding-bottom);
|
|
12
16
|
gap: var(--rt-space-2);
|
|
13
17
|
}
|
|
14
18
|
|
|
@@ -40,7 +44,10 @@
|
|
|
40
44
|
&--right {
|
|
41
45
|
// Прижатие к правому краю даже когда right — единственный бар
|
|
42
46
|
// (нет left/center, которые бы вытолкнули его через space-between).
|
|
43
|
-
|
|
47
|
+
// Бар сжимается, когда места меньше, чем контента, но не уже своего наименьшего
|
|
48
|
+
// содержимого: не сжимаясь, он в узкой колонке выходил за край тулбара на соседей
|
|
49
|
+
// (поиск списка — на 197 px), а сжатый до нуля выталкивал за край кнопку.
|
|
50
|
+
flex: 0 1 auto;
|
|
44
51
|
margin-left: auto;
|
|
45
52
|
gap: var(--rt-space-sm);
|
|
46
53
|
}
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
<rt-icon-button icon="ico-trash" ariaLabel="Удалить" tooltip="Удалить" />
|
|
6
6
|
```
|
|
7
7
|
|
|
8
|
-
| вход | тип | умолчание
|
|
9
|
-
| -------------------- | ----------------------------- |
|
|
10
|
-
| `rtTooltip` | `string \| null \| undefined` | `''`
|
|
11
|
-
| `rtTooltipPlacement` | `'top' \| 'bottom'`
|
|
8
|
+
| вход | тип | умолчание |
|
|
9
|
+
| -------------------- | ----------------------------- | ----------------------------------------------- |
|
|
10
|
+
| `rtTooltip` | `string \| null \| undefined` | `''` |
|
|
11
|
+
| `rtTooltipPlacement` | `'top' \| 'bottom' \| null` | `null` — сверху, под материальным набором снизу |
|
|
12
12
|
|
|
13
13
|
Выходов нет. Панель — `rt-tooltip` в оверлее CDK, `role="tooltip"`.
|
|
14
14
|
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
Тёмная инверсная подложка (theme-aware пара bg-inverse / text-inverse). */
|
|
4
4
|
|
|
5
5
|
.rt-tooltip {
|
|
6
|
-
--rt-tooltip-radius: var(--rt-radius
|
|
7
|
-
--rt-tooltip-shadow: var(--rt-shadow
|
|
6
|
+
--rt-tooltip-radius: var(--rt-overlay-tooltip-radius);
|
|
7
|
+
--rt-tooltip-shadow: var(--rt-overlay-tooltip-shadow);
|
|
8
8
|
|
|
9
9
|
display: block;
|
|
10
10
|
max-width: 240px;
|
|
@@ -43,4 +43,4 @@ rtChatMessageActions let-message>` рисуется в меню «…» у ре
|
|
|
43
43
|
- Режим `formatting` подменяет простое поле [`rt-rich-editor`](../rich-editor/CONTEXT.md);
|
|
44
44
|
тот грузит Quill динамическим импортом.
|
|
45
45
|
- Неотправленное сообщение (`status: 'failed'`) получает кнопку повтора.
|
|
46
|
-
- Файлы можно бросать прямо в ленту — чат обёрнут в [`rt-file-drop`](
|
|
46
|
+
- Файлы можно бросать прямо в ленту — чат обёрнут в [`rt-file-drop`](../../../../lib/components/file-drop/CONTEXT.md).
|