@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.
Files changed (76) hide show
  1. package/README.md +7 -6
  2. package/bundle/components/AlertContext.md +11 -8
  3. package/bundle/components/AlertProcess.md +13 -10
  4. package/bundle/components/Badge.md +6 -3
  5. package/bundle/components/Button.md +46 -43
  6. package/bundle/components/ButtonDropdownExtended.md +3 -2
  7. package/bundle/components/ButtonIcon.md +7 -4
  8. package/bundle/components/Calendar.md +62 -59
  9. package/bundle/components/Caption.md +26 -23
  10. package/bundle/components/Checkbox.md +32 -29
  11. package/bundle/components/CheckboxTreeExtended.md +9 -5
  12. package/bundle/components/Chip.md +44 -41
  13. package/bundle/components/CodeText.md +26 -23
  14. package/bundle/components/Col.md +1 -2
  15. package/bundle/components/CollapsibleTree.md +8 -5
  16. package/bundle/components/Dropdown.md +33 -28
  17. package/bundle/components/EmptyView.md +12 -5
  18. package/bundle/components/FooterPage.md +6 -2
  19. package/bundle/components/FormField.md +44 -41
  20. package/bundle/components/FormGroup.md +192 -52
  21. package/bundle/components/Header.md +491 -211
  22. package/bundle/components/HeaderPage.md +6 -2
  23. package/bundle/components/ImageGallery.md +33 -34
  24. package/bundle/components/ImageGalleryExtended.md +33 -34
  25. package/bundle/components/Island.md +16 -13
  26. package/bundle/components/LightBox.md +14 -12
  27. package/bundle/components/Link.md +211 -96
  28. package/bundle/components/ListActionItem.md +7 -4
  29. package/bundle/components/ListItem.md +11 -8
  30. package/bundle/components/ListItemControlsButton.md +16 -13
  31. package/bundle/components/ListItemControlsButtonDropdown.md +9 -6
  32. package/bundle/components/ListItemSelectable.md +7 -4
  33. package/bundle/components/ListMasterFooter.md +8 -5
  34. package/bundle/components/ListMasterHeader.md +8 -5
  35. package/bundle/components/ListSortableItem.md +11 -8
  36. package/bundle/components/ListTableItem.md +7 -4
  37. package/bundle/components/LoaderMiddle.md +7 -4
  38. package/bundle/components/LoaderScreen.md +11 -8
  39. package/bundle/components/LoaderSmall.md +7 -4
  40. package/bundle/components/Marker.md +184 -69
  41. package/bundle/components/MarkerStatus.md +206 -88
  42. package/bundle/components/MaskedField.md +2 -4
  43. package/bundle/components/MasterTable.md +602 -0
  44. package/bundle/components/ModalWindow.md +7 -4
  45. package/bundle/components/MultiselectField.md +2183 -132
  46. package/bundle/components/Notification.md +12 -9
  47. package/bundle/components/Overlay.md +9 -4
  48. package/bundle/components/Page.md +2 -2
  49. package/bundle/components/Pagination.md +15 -8
  50. package/bundle/components/Row.md +1 -1
  51. package/bundle/components/SelectExtendedField.md +3 -3
  52. package/bundle/components/SelectField.md +466 -148
  53. package/bundle/components/SliderExtended.md +39 -36
  54. package/bundle/components/SmallInput.md +194 -51
  55. package/bundle/components/Suggest.md +535 -99
  56. package/bundle/components/SwipeableArea.md +428 -79
  57. package/bundle/components/TableBasic.md +19 -11
  58. package/bundle/components/TabsExtended.md +24 -21
  59. package/bundle/components/Tag.md +6 -2
  60. package/bundle/components/Text.md +28 -25
  61. package/bundle/components/TextField.md +3 -4
  62. package/bundle/components/ThemeProvider.md +50 -1
  63. package/bundle/components/Title.md +26 -23
  64. package/bundle/components/Tooltip.md +24 -21
  65. package/bundle/components/TopOverlay.md +7 -4
  66. package/bundle/guides/codestyle.md +3 -0
  67. package/bundle/guides/context.md +84 -12
  68. package/bundle/guides/guidelines.md +321 -0
  69. package/bundle/guides/template.md +22 -12
  70. package/bundle/manifest.json +31 -14
  71. package/bundle/release-notes/1.45.0.mdx +117 -0
  72. package/bundle/release-notes/1.46.0.mdx +7 -0
  73. package/bundle/tokens.json +6362 -0
  74. package/dist/index.js +177 -28
  75. package/dist/index.js.map +1 -1
  76. package/package.json +1 -1
@@ -1,11 +1,9 @@
1
1
  ---
2
2
  component: FormGroup
3
- category: Forms
4
- figma-node: ""
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
- Разметочная обёртка-`<div>` для группировки элементов формы (`FormField`,
17
- `HelpBox`, `Alert`, `Description`). Сама по себе **не добавляет стилей** —
18
- только прокидывает `ref` и все `HTMLDivAttributes`. Смысл — именованная
19
- точка в DOM для data-атрибутов и семантики формы.
14
+ Контейнер формы: объединяет поле ввода с относящимися к нему элементами — `FormField`,
15
+ `FormFieldDescription`, `HelpBox`, `AlertContext` — в один блок. Части передаются декларативно
16
+ через `children`, поэтому каждой можно задать свои props и data-атрибуты.
20
17
 
21
- Используй когда: нужно сгруппировать несколько полей логически (блок "контакты",
22
- "адрес") и иметь стабильный wrapper под `data-*`/`aria-*`.
23
- Не используй как: общий flex-контейнер — возьми `Row`/`Col`.
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
- ```text
30
- src/components/FormGroup/
31
- ├── FormGroup.tsx # forwardRef, <div>, passthrough props
32
- └── index.ts # export * from "./FormGroup"
33
- ```
32
+ Настраиваемых props у компонента нет: он принимает `children` и стандартные атрибуты `div`.
33
+ Внутренний `IFormGroupProps` расширяет `React.HTMLAttributes<HTMLDivElement>`:
34
+ все стандартные атрибуты `div` (включая `className`, `style`, `id`, `role`, `aria-*`, `data-*`
35
+ и обработчики событий) уходят через `...rest` на корневой элемент.
34
36
 
35
- Нет styles, нет tests, нет stories. Демонстрируется опосредованно через
36
- stories типовых полей, где `FormGroup` иногда обёрнут вокруг формы.
37
+ ### Опциональные props
37
38
 
38
- ---
39
+ | Prop | Тип | По умолчанию | Описание |
40
+ | ---------- | ----------------- | ------------ | -------------------------------------------------------------------------- |
41
+ | `children` | `React.ReactNode` | — | Части группы: поле ввода и относящиеся к нему подсказки и сообщения. |
39
42
 
40
- ## Варианты и props
43
+ Поскольку настраиваемых props нет, у компонента нет story `Playground`.
41
44
 
42
- ### `IFormGroupProps extends React.HTMLAttributes<HTMLDivElement>`
45
+ ---
43
46
 
44
- | Prop | Тип | Описание |
45
- |---|---|---|
46
- | `children` | `ReactNode` | Обычно несколько `FormField`/`Alert`/`HelpBox`. |
47
- | `className`, `style`, `...HTMLDivAttributes` | — | Стандартные. |
47
+ ## Дизайн-токены
48
48
 
49
- Интерфейс объявлен **локально, не экспортирован**. Если понадобится
50
- расширить props — сначала экспортировать интерфейс.
49
+ Собственных CSS-переменных нет — у компонента нет файла стилей. Внешний вид группы
50
+ целиком определяют вложенные компоненты.
51
51
 
52
52
  ---
53
53
 
54
54
  ## Инварианты
55
55
 
56
- - **`forwardRef`** — есть, не убирать.
57
- - **Без собственных классов/стилей** — осознанно. Если добавить flex/padding,
58
- сломается большинство существующих интеграций, где вёрстку задают потомки.
59
- - Все атрибуты прокидываются на корневой `<div>` через spread — включая
60
- `className`/`style`. Потребитель сам задаёт лейаут.
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
- - `<div>` без ARIA-роли. Если группа полей должна объявляться как
67
- `role="group"`/`role="radiogroup"` — потребитель передаёт `role` и
68
- `aria-labelledby`/`aria-label` через `...rest`.
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` — основной контент внутри FormGroup.
83
- - `HelpBox`, `Alert` — вспомогательные элементы формы.
84
- - `Row`, `Col`, `Gap` — предпочтительны, если нужен layout, а не именованная группа.
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
- Нет собственных stories. Используется в примерах `TextField`, `SelectField`,
91
- `SelectExtendedField`, `FormField`.
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-04-18 | Создан документ |
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
+