@sberbusiness/triplex-next-mcp-server 1.44.0-beta → 1.45.0-beta
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 +7 -6
- package/bundle/components/AlertContext.md +11 -8
- package/bundle/components/AlertProcess.md +13 -10
- package/bundle/components/Badge.md +6 -3
- package/bundle/components/Button.md +46 -43
- package/bundle/components/ButtonDropdownExtended.md +3 -2
- package/bundle/components/ButtonIcon.md +7 -4
- package/bundle/components/Calendar.md +62 -59
- package/bundle/components/Caption.md +26 -23
- package/bundle/components/Checkbox.md +32 -29
- package/bundle/components/CheckboxTreeExtended.md +9 -5
- package/bundle/components/Chip.md +44 -41
- package/bundle/components/CodeText.md +26 -23
- package/bundle/components/Col.md +1 -2
- package/bundle/components/CollapsibleTree.md +8 -5
- package/bundle/components/Dropdown.md +33 -28
- package/bundle/components/EmptyView.md +12 -5
- package/bundle/components/FooterPage.md +6 -2
- package/bundle/components/FormField.md +44 -41
- package/bundle/components/FormGroup.md +192 -52
- package/bundle/components/Header.md +491 -211
- package/bundle/components/HeaderPage.md +6 -2
- package/bundle/components/ImageGallery.md +33 -34
- package/bundle/components/ImageGalleryExtended.md +33 -34
- package/bundle/components/Island.md +16 -13
- package/bundle/components/LightBox.md +14 -12
- package/bundle/components/Link.md +211 -96
- package/bundle/components/ListActionItem.md +7 -4
- package/bundle/components/ListItem.md +11 -8
- package/bundle/components/ListItemControlsButton.md +16 -13
- package/bundle/components/ListItemControlsButtonDropdown.md +9 -6
- package/bundle/components/ListItemSelectable.md +7 -4
- package/bundle/components/ListMasterFooter.md +8 -5
- package/bundle/components/ListMasterHeader.md +8 -5
- package/bundle/components/ListSortableItem.md +11 -8
- package/bundle/components/ListTableItem.md +7 -4
- package/bundle/components/LoaderMiddle.md +7 -4
- package/bundle/components/LoaderScreen.md +11 -8
- package/bundle/components/LoaderSmall.md +7 -4
- package/bundle/components/Marker.md +184 -69
- package/bundle/components/MarkerStatus.md +206 -88
- package/bundle/components/MaskedField.md +2 -4
- package/bundle/components/MasterTable.md +602 -0
- package/bundle/components/ModalWindow.md +7 -4
- package/bundle/components/MultiselectField.md +2183 -132
- package/bundle/components/Notification.md +12 -9
- package/bundle/components/Overlay.md +9 -4
- package/bundle/components/Page.md +2 -2
- package/bundle/components/Pagination.md +15 -8
- package/bundle/components/Row.md +1 -1
- package/bundle/components/SelectExtendedField.md +3 -3
- package/bundle/components/SelectField.md +466 -148
- package/bundle/components/SliderExtended.md +39 -36
- package/bundle/components/SmallInput.md +194 -51
- package/bundle/components/Suggest.md +535 -99
- package/bundle/components/SwipeableArea.md +428 -79
- package/bundle/components/TableBasic.md +19 -11
- package/bundle/components/TabsExtended.md +24 -21
- package/bundle/components/Tag.md +6 -2
- package/bundle/components/Text.md +28 -25
- package/bundle/components/TextField.md +3 -4
- package/bundle/components/ThemeProvider.md +50 -1
- package/bundle/components/Title.md +26 -23
- package/bundle/components/Tooltip.md +24 -21
- package/bundle/components/TopOverlay.md +7 -4
- package/bundle/guides/codestyle.md +3 -0
- package/bundle/guides/context.md +84 -12
- package/bundle/guides/guidelines.md +321 -0
- package/bundle/guides/template.md +22 -12
- package/bundle/manifest.json +31 -14
- package/bundle/release-notes/1.45.0.mdx +117 -0
- package/bundle/release-notes/1.46.0.mdx +7 -0
- package/bundle/tokens.json +6362 -0
- package/dist/index.js +177 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: FormGroup
|
|
3
|
-
category:
|
|
4
|
-
|
|
5
|
-
figma-file: ""
|
|
6
|
-
related: [FormField, TextField, SelectField, HelpBox, Alert]
|
|
3
|
+
category: FormField
|
|
4
|
+
related: [FormField, TextField, MaskedField]
|
|
7
5
|
tokens: []
|
|
8
|
-
stories:
|
|
6
|
+
stories: stories/FormGroup/FormGroup.stories.tsx
|
|
9
7
|
version: "1.0"
|
|
10
8
|
---
|
|
11
9
|
|
|
@@ -13,87 +11,229 @@ version: "1.0"
|
|
|
13
11
|
|
|
14
12
|
## Назначение
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
`
|
|
18
|
-
|
|
19
|
-
точка в DOM для data-атрибутов и семантики формы.
|
|
14
|
+
Контейнер формы: объединяет поле ввода с относящимися к нему элементами — `FormField`,
|
|
15
|
+
`FormFieldDescription`, `HelpBox`, `AlertContext` — в один блок. Части передаются декларативно
|
|
16
|
+
через `children`, поэтому каждой можно задать свои props и data-атрибуты.
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
Рендерит один `div` без собственных классов, стилей и отступов: расстояния между частями
|
|
19
|
+
задают сами части (`FormFieldDescription`, `Gap`), а не группа.
|
|
20
|
+
|
|
21
|
+
Используй когда: поле нужно показать вместе с описанием, счётчиком, текстом ошибки,
|
|
22
|
+
подсказкой или сообщением `AlertContext`, и эти элементы должны читаться как одна логическая
|
|
23
|
+
группа формы.
|
|
24
|
+
Не используй когда: достаточно готовой обёртки над полем — `TextField`, `TextareaField`,
|
|
25
|
+
`MaskedField`, `AmountField` уже собирают `FormGroup` + `FormField` внутри себя, и снаружи
|
|
26
|
+
их в `FormGroup` заворачивать не нужно.
|
|
24
27
|
|
|
25
28
|
---
|
|
26
29
|
|
|
27
|
-
##
|
|
30
|
+
## Варианты и props
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
```
|
|
32
|
+
Настраиваемых props у компонента нет: он принимает `children` и стандартные атрибуты `div`.
|
|
33
|
+
Внутренний `IFormGroupProps` расширяет `React.HTMLAttributes<HTMLDivElement>`:
|
|
34
|
+
все стандартные атрибуты `div` (включая `className`, `style`, `id`, `role`, `aria-*`, `data-*`
|
|
35
|
+
и обработчики событий) уходят через `...rest` на корневой элемент.
|
|
34
36
|
|
|
35
|
-
|
|
36
|
-
stories типовых полей, где `FormGroup` иногда обёрнут вокруг формы.
|
|
37
|
+
### Опциональные props
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
| Prop | Тип | По умолчанию | Описание |
|
|
40
|
+
| ---------- | ----------------- | ------------ | -------------------------------------------------------------------------- |
|
|
41
|
+
| `children` | `React.ReactNode` | — | Части группы: поле ввода и относящиеся к нему подсказки и сообщения. |
|
|
39
42
|
|
|
40
|
-
|
|
43
|
+
Поскольку настраиваемых props нет, у компонента нет story `Playground`.
|
|
41
44
|
|
|
42
|
-
|
|
45
|
+
---
|
|
43
46
|
|
|
44
|
-
|
|
45
|
-
|---|---|---|
|
|
46
|
-
| `children` | `ReactNode` | Обычно несколько `FormField`/`Alert`/`HelpBox`. |
|
|
47
|
-
| `className`, `style`, `...HTMLDivAttributes` | — | Стандартные. |
|
|
47
|
+
## Дизайн-токены
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
Собственных CSS-переменных нет — у компонента нет файла стилей. Внешний вид группы
|
|
50
|
+
целиком определяют вложенные компоненты.
|
|
51
51
|
|
|
52
52
|
---
|
|
53
53
|
|
|
54
54
|
## Инварианты
|
|
55
55
|
|
|
56
|
-
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
- `forwardRef<HTMLDivElement>` — не убирать. Ref указывает на корневой `div` — тот же
|
|
57
|
+
элемент, который получает `className` и `...rest`.
|
|
58
|
+
- Корневой элемент — ровно один `div`, а `children` рендерятся в него напрямую, без
|
|
59
|
+
промежуточных обёрток. Уровень вложенности виден потребителям в DOM и в их CSS-селекторах,
|
|
60
|
+
поэтому добавление обёртки — наблюдаемое изменение и требует записи в release notes.
|
|
61
|
+
- Компонент не задаёт собственных классов и отступов. Появление здесь `margin`/`gap`
|
|
62
|
+
сдвинет вёрстку всех форм в библиотеке и у потребителей: `FormGroup` используется внутри
|
|
63
|
+
`TextFieldBase` (а через него — во всех полях, построенных на нём: `TextField`,
|
|
64
|
+
`MaskedField`, `TextareaField`, `AmountField`, `NumberField`, `SuggestField`) и в
|
|
65
|
+
`SMSFieldInput`.
|
|
66
|
+
- `displayName = "FormGroup"` — не менять.
|
|
67
|
+
- Экспорт `FormGroup` идёт в barrel `src/components/FormGroup/index.ts` и далее в корневой
|
|
68
|
+
`src/components/index.ts` — сохранять. `IFormGroupProps` наружу не экспортируется; добавление
|
|
69
|
+
этого экспорта — расширение публичного API, отдельное решение владельца.
|
|
61
70
|
|
|
62
71
|
---
|
|
63
72
|
|
|
64
73
|
## Accessibility
|
|
65
74
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
- Fieldset-семантика (`<fieldset>` + `<legend>`) не используется;
|
|
70
|
-
FormGroup не пытается её эмулировать.
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Дизайн-токены
|
|
75
|
+
Собственного a11y-поведения нет: это структурный контейнер без роли и без интерактивности.
|
|
76
|
+
Семантику задаёт потребитель через проброшенные атрибуты — например `role="group"` вместе с
|
|
77
|
+
`aria-labelledby`, если группа должна объявляться скринридером как единое целое.
|
|
75
78
|
|
|
76
|
-
|
|
79
|
+
Лейбл связывается с полем внутри `FormField`: `FormFieldLabel` берёт `htmlFor` из `targetId`
|
|
80
|
+
в `FormFieldContext`. Описание автоматически не связывается — `aria-describedby` на элементе
|
|
81
|
+
ввода (как и `aria-invalid` для ошибки) задаёт потребитель, см. `FormField-ai.md`. `FormGroup`
|
|
82
|
+
не участвует ни в том, ни в другом.
|
|
77
83
|
|
|
78
84
|
---
|
|
79
85
|
|
|
80
86
|
## Связанные компоненты
|
|
81
87
|
|
|
82
|
-
- `FormField` — основной
|
|
83
|
-
|
|
84
|
-
- `
|
|
88
|
+
- `FormField` — само поле ввода; основной ребёнок группы. О `FormGroup` не знает и на нём
|
|
89
|
+
не построен: это `FormField` кладут внутрь группы, а не наоборот.
|
|
90
|
+
- `FormFieldDescription` (часть семейства `FormField`) — описание, текст ошибки и счётчик
|
|
91
|
+
под полем; второй типичный ребёнок группы, отступ от поля задаёт сам (`padding-top`).
|
|
92
|
+
- `TextField`, `MaskedField` — готовые однострочные поля; компактная альтернатива ручной
|
|
93
|
+
сборке `FormGroup` + `FormField`. Внутри они уже используют `FormGroup` (через
|
|
94
|
+
`TextFieldBase`), поэтому оборачивать их в него ещё раз не нужно.
|
|
95
|
+
- `HelpBox`, `AlertContext` — подсказка и сообщение, которые кладут в группу рядом с полем.
|
|
85
96
|
|
|
86
97
|
---
|
|
87
98
|
|
|
88
99
|
## Stories
|
|
89
100
|
|
|
90
|
-
|
|
91
|
-
|
|
101
|
+
Основные истории: `stories/FormGroup/FormGroup.stories.tsx`
|
|
102
|
+
Файлы примеров: `stories/FormGroup/examples/`
|
|
103
|
+
|
|
104
|
+
| Story | Example file | Что демонстрирует |
|
|
105
|
+
| ------------- | ----------------- | ------------------------------------------------------------------------------------- |
|
|
106
|
+
| `Default` | `Default.tsx` | Минимальная группа: поле с лейблом и описанием под ним |
|
|
107
|
+
| `Example` | `Example.tsx` | Production-like форма: поле с описанием и поле с ошибкой плюс `AlertContext` в группе |
|
|
108
|
+
| `VisualTests` | `VisualTests.tsx` | Варианты наполнения: только поле, поле с описанием, ошибка, группа с `AlertContext`, поле с `HelpBox` |
|
|
109
|
+
|
|
110
|
+
### Почему stories участвуют в скриншот-тестах
|
|
111
|
+
|
|
112
|
+
Своей разметки у `FormGroup` нет, поэтому baseline'ы (`__screenshots__/formgroup--*`)
|
|
113
|
+
фиксируют не саму группу, а композицию её частей: `FormField`, `FormFieldDescription`,
|
|
114
|
+
`AlertContext`, `HelpBox`. Формально это близко к случаю «компонент без визуального
|
|
115
|
+
интерфейса» из `stories-guide.md` § «Скриншот-тесты», где набор исключают целиком через
|
|
116
|
+
`testRunner: { skip: true }`. Здесь решено baseline'ы держать: они страхуют типовые
|
|
117
|
+
композиции форм, которые потребители копируют из примеров. Обратная сторона — перекраска
|
|
118
|
+
`FormField` или `AlertContext` роняет визуальные тесты `FormGroup` и требует перегенерации;
|
|
119
|
+
это ожидаемо, а не регрессия группы. Отсутствие лишней обёртки вокруг `children` проверяет
|
|
120
|
+
unit-тест, а не скриншот.
|
|
92
121
|
|
|
93
122
|
---
|
|
94
123
|
|
|
95
124
|
## История изменений
|
|
96
125
|
|
|
97
|
-
| Дата
|
|
98
|
-
|
|
99
|
-
| 2026-
|
|
126
|
+
| Дата | Изменение |
|
|
127
|
+
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
128
|
+
| 2026-08-28 | Создан документ. AI-рефакторинг (уточнён JSDoc компонента, `children` задокументирован явно), добавлены unit-тесты и stories в modern pattern. Публичный API не менялся. |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Примеры использования
|
|
133
|
+
|
|
134
|
+
### Default
|
|
135
|
+
|
|
136
|
+
`stories/FormGroup/examples/Default.tsx`
|
|
137
|
+
|
|
138
|
+
```tsx
|
|
139
|
+
import React, { useState } from "react";
|
|
140
|
+
import {
|
|
141
|
+
EFontType,
|
|
142
|
+
ETextSize,
|
|
143
|
+
FormField,
|
|
144
|
+
FormFieldDescription,
|
|
145
|
+
FormFieldInput,
|
|
146
|
+
FormFieldLabel,
|
|
147
|
+
FormGroup,
|
|
148
|
+
Text,
|
|
149
|
+
} from "@sberbusiness/triplex-next";
|
|
150
|
+
|
|
151
|
+
export const Default = () => {
|
|
152
|
+
const [value, setValue] = useState("");
|
|
153
|
+
|
|
154
|
+
return (
|
|
155
|
+
<div style={{ maxWidth: "300px" }}>
|
|
156
|
+
<FormGroup>
|
|
157
|
+
<FormField>
|
|
158
|
+
<FormFieldLabel>Название поля</FormFieldLabel>
|
|
159
|
+
<FormFieldInput value={value} onChange={(event) => setValue(event.target.value)} />
|
|
160
|
+
</FormField>
|
|
161
|
+
<FormFieldDescription>
|
|
162
|
+
<Text tag="div" size={ETextSize.B4} type={EFontType.SECONDARY}>
|
|
163
|
+
Описание поля
|
|
164
|
+
</Text>
|
|
165
|
+
</FormFieldDescription>
|
|
166
|
+
</FormGroup>
|
|
167
|
+
</div>
|
|
168
|
+
);
|
|
169
|
+
};
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Example
|
|
173
|
+
|
|
174
|
+
`stories/FormGroup/examples/Example.tsx`
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
import React, { useState } from "react";
|
|
178
|
+
import {
|
|
179
|
+
AlertContext,
|
|
180
|
+
EAlertType,
|
|
181
|
+
EFontType,
|
|
182
|
+
EFormFieldStatus,
|
|
183
|
+
ETextSize,
|
|
184
|
+
FormField,
|
|
185
|
+
FormFieldDescription,
|
|
186
|
+
FormFieldInput,
|
|
187
|
+
FormFieldLabel,
|
|
188
|
+
FormGroup,
|
|
189
|
+
Gap,
|
|
190
|
+
Text,
|
|
191
|
+
} from "@sberbusiness/triplex-next";
|
|
192
|
+
|
|
193
|
+
export const Example = () => {
|
|
194
|
+
const [account, setAccount] = useState("40702810400000012345");
|
|
195
|
+
const [amount, setAmount] = useState("");
|
|
196
|
+
|
|
197
|
+
return (
|
|
198
|
+
<div style={{ maxWidth: "360px" }}>
|
|
199
|
+
<FormGroup>
|
|
200
|
+
<FormField>
|
|
201
|
+
<FormFieldLabel>Счёт списания</FormFieldLabel>
|
|
202
|
+
<FormFieldInput value={account} onChange={(event) => setAccount(event.target.value)} />
|
|
203
|
+
</FormField>
|
|
204
|
+
<FormFieldDescription>
|
|
205
|
+
<Text tag="div" size={ETextSize.B4} type={EFontType.SECONDARY}>
|
|
206
|
+
Доступно 125 000,00 ₽
|
|
207
|
+
</Text>
|
|
208
|
+
</FormFieldDescription>
|
|
209
|
+
</FormGroup>
|
|
210
|
+
|
|
211
|
+
<Gap size={24} />
|
|
212
|
+
|
|
213
|
+
<FormGroup>
|
|
214
|
+
<FormField status={EFormFieldStatus.ERROR}>
|
|
215
|
+
<FormFieldLabel>Сумма платежа</FormFieldLabel>
|
|
216
|
+
<FormFieldInput
|
|
217
|
+
value={amount}
|
|
218
|
+
onChange={(event) => setAmount(event.target.value)}
|
|
219
|
+
aria-invalid
|
|
220
|
+
aria-describedby="amount-error"
|
|
221
|
+
/>
|
|
222
|
+
</FormField>
|
|
223
|
+
<FormFieldDescription id="amount-error">
|
|
224
|
+
<Text tag="div" size={ETextSize.B4} type={EFontType.ERROR}>
|
|
225
|
+
Укажите сумму платежа
|
|
226
|
+
</Text>
|
|
227
|
+
</FormFieldDescription>
|
|
228
|
+
|
|
229
|
+
<Gap size={8} />
|
|
230
|
+
|
|
231
|
+
<AlertContext type={EAlertType.INFO}>
|
|
232
|
+
Платёж на сумму более 150 000 ₽ уходит в банк на подтверждение.
|
|
233
|
+
</AlertContext>
|
|
234
|
+
</FormGroup>
|
|
235
|
+
</div>
|
|
236
|
+
);
|
|
237
|
+
};
|
|
238
|
+
```
|
|
239
|
+
|