@sberbusiness/triplex-next-mcp-server 0.36.0-beta0 → 1.41.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 (46) hide show
  1. package/bundle/components/AlertContext.md +268 -0
  2. package/bundle/components/Button.md +5 -2
  3. package/bundle/components/ButtonDropdown.md +9 -1
  4. package/bundle/components/ButtonDropdownExtended.md +422 -0
  5. package/bundle/components/ButtonIcon.md +7 -1
  6. package/bundle/components/Calendar.md +183 -368
  7. package/bundle/components/Caption.md +291 -0
  8. package/bundle/components/Chip.md +310 -314
  9. package/bundle/components/CodeText.md +197 -0
  10. package/bundle/components/Col.md +311 -162
  11. package/bundle/components/CollapsibleTree.md +6 -3
  12. package/bundle/components/CollapsibleTreeExtended.md +6 -2
  13. package/bundle/components/Dropdown.md +748 -346
  14. package/bundle/components/FormField.md +468 -232
  15. package/bundle/components/IconWrapper.md +142 -89
  16. package/bundle/components/Island.md +221 -129
  17. package/bundle/components/KeyDownListener.md +215 -102
  18. package/bundle/components/LightBox.md +2252 -233
  19. package/bundle/components/List.md +26 -1
  20. package/bundle/components/ListActionItem.md +157 -0
  21. package/bundle/components/ListItem.md +34 -9
  22. package/bundle/components/ListItemSelectable.md +2 -2
  23. package/bundle/components/ListMaster.md +4 -5
  24. package/bundle/components/ListTableItem.md +391 -0
  25. package/bundle/components/LoaderMiddle.md +265 -0
  26. package/bundle/components/LoaderScreen.md +178 -81
  27. package/bundle/components/Notification.md +21 -21
  28. package/bundle/components/Page.md +1 -0
  29. package/bundle/components/Portal.md +131 -67
  30. package/bundle/components/Row.md +171 -69
  31. package/bundle/components/Text.md +320 -0
  32. package/bundle/components/TextField.md +364 -97
  33. package/bundle/components/ThemeProvider.md +305 -117
  34. package/bundle/components/Title.md +296 -0
  35. package/bundle/components/Tooltip.md +421 -181
  36. package/bundle/guides/commits.md +126 -24
  37. package/bundle/guides/context.md +1 -1
  38. package/bundle/guides/tests.md +42 -0
  39. package/bundle/manifest.json +109 -23
  40. package/bundle/release-notes/1.37.0.mdx +42 -1
  41. package/bundle/release-notes/1.38.0.mdx +36 -0
  42. package/bundle/release-notes/1.39.0.mdx +66 -0
  43. package/bundle/release-notes/1.40.0.mdx +27 -0
  44. package/bundle/release-notes/1.41.0.mdx +83 -0
  45. package/bundle/release-notes/1.42.0.mdx +7 -0
  46. package/package.json +1 -1
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  component: LoaderScreen
3
- category: Feedback
4
- figma-node: ""
5
- figma-file: ""
6
- related: [Loader, Skeleton, LightBox, List]
7
- tokens: []
8
- stories: stories/Loaders/LoaderScreen
3
+ category: Loaders
4
+ related: [LoaderSmall, LoaderMiddle, Gap, Text, ModalWindowContent, LightBoxContent, LightBoxSideOverlay, List, TableBasic, MultiselectField]
5
+ tokens:
6
+ - --triplex-next-LoaderScreen-Small_Backdrop_Default
7
+ - --triplex-next-LoaderScreen-Middle_Backdrop_Default
8
+ stories: stories/Loaders/LoaderScreen/LoaderScreen.stories.tsx
9
9
  version: "1.0"
10
10
  ---
11
11
 
@@ -13,117 +13,168 @@ version: "1.0"
13
13
 
14
14
  ## Назначение
15
15
 
16
- Контейнер-оверлей, рендерящий `LoaderSmall` или `LoaderMiddle` с полупрозрачным
17
- бэкдропом — поверх блока/экрана, пока идёт загрузка. Centered по `flexbox`
18
- внутри относительно расположенного родителя (наружный элемент должен иметь
19
- `position: relative` или быть самим "экраном").
20
-
21
- Используй когда: нужно закрыть контент оверлеем на время загрузки
22
- (в Island'е, Modal'е, Content-wrapper'е). Для inline-спиннера в кнопке —
23
- `LoaderSmall` напрямую. Для skeleton-загрузки известной структуры — `Skeleton`.
16
+ Виджет-загрузчик: абсолютно позиционированный `<div>`, который перекрывает область ближайшего
17
+ позиционированного родителя полупрозрачной подложкой и показывает по её центру лоадер
18
+ (`LoaderSmall` или `LoaderMiddle`), опциональное описание и опциональные кнопки.
19
+
20
+ Используй когда: нужно закрыть уже отрисованный блок на время загрузки — тело модального окна,
21
+ контент LightBox, список, таблицу, выпадающий список поля. Так пользователь видит, какая именно
22
+ часть интерфейса перезагружается, и не теряет контекст страницы.
23
+
24
+ Не используй когда:
25
+ - Нужен просто индикатор загрузки без перекрытия контента — возьми `LoaderSmall` или `LoaderMiddle`
26
+ напрямую.
27
+ - Нужен полноэкранный лоадер приложения — LoaderScreen перекрывает только своего позиционированного
28
+ родителя, а не вьюпорт.
29
+ - Нужно заблокировать взаимодействие со страницей — LoaderScreen не ловушка фокуса и не модальный
30
+ оверлей, см. «Accessibility». Для блокирующего сценария возьми `ModalWindowContent` или
31
+ `LightBoxContent` с их встроенным `isLoading` — prop объявлен именно на контентных
32
+ субкомпонентах, а не на корневых `ModalWindow` / `LightBox`. У `LightBox` есть свой `isLoading`,
33
+ но он только отключает focus trap (`active={!isLoading}`) и лоадер не рендерит.
24
34
 
25
35
  ---
26
36
 
27
- ## Файловая структура
28
-
29
- ```text
30
- src/components/LoaderScreen/
31
- ├── LoaderScreen.tsx # FC, <div> + lоадер
32
- ├── index.ts # Barrel
33
- ├── styles/LoaderScreen.module.less
34
- └── __tests__/LoaderScreen.test.tsx
35
- ```
37
+ ## Варианты и props
36
38
 
37
- ---
39
+ ### Обязательные props
38
40
 
39
- ## Варианты и props
41
+ | Prop | Тип | Описание |
42
+ |---|---|---|
43
+ | `type` | `"small" \| "middle"` | Какой лоадер рендерится внутри и какой токен подложки используется. `small` → `LoaderSmall` с темой `ELoaderSmallTheme.BRAND`, `middle` → `LoaderMiddle` |
40
44
 
41
- ### `ILoaderScreenProps extends HTMLAttributes<HTMLDivElement>`
45
+ ### Опциональные props
42
46
 
43
- | Prop | Тип | Default | Описание |
47
+ | Prop | Тип | По умолчанию | Описание |
44
48
  |---|---|---|---|
45
- | `type` | `"small" \| "middle"` | — (обязателен) | Тип лоадера внутри. `small` — LoaderSmall, `middle` — LoaderMiddle. |
46
- | `theme` | `ELoaderSmallTheme` | `BRAND` | Только для `type="small"`. Игнорируется для `middle`. |
47
- | `size` | `EComponentSize` | `MD` | Только для `type="small"`. Игнорируется для `middle`. |
48
- | `className`, `...HTMLDivAttributes` | — | — | Стандартные. |
49
-
50
- **`type` — строковый литерал**, не enum. Публичный API. Не смешивать с `ELoaderSmallTheme`.
49
+ | `size` | `EComponentSize` | `EComponentSize.MD` | Размер лоадера. **Учитывается только при `type="small"`** — `LoaderMiddle` размеров не имеет и prop молча игнорируется |
50
+ | `description` | `React.ReactNode` | — | Текст под лоадером. Оборачивается в `Text` (`tag="div"`, `size={ETextSize.B2}`) с выравниванием по центру |
51
+ | `controls` | `React.ReactNode` | — | Кнопки под лоадером (например, «Отмена»). Рендерятся в простом `<div>` без раскладки — flex/gap задаёт потребитель |
52
+
53
+ Компонент расширяет `React.HTMLAttributes<HTMLDivElement>` — все стандартные атрибуты `<div>`
54
+ (`className`, `style`, `role`, `aria-*`, `data-*`, обработчики событий) попадают на корневой элемент.
55
+
56
+ ### `ILoaderScreenMiddleProps`
57
+
58
+ `Omit<ILoaderScreenProps, "type" | "size">` — экспортируемый тип для компонентов, которые встраивают
59
+ LoaderScreen и сами фиксируют `type="middle"`. Потребителю остаются `description`, `controls`,
60
+ `className` и остальные атрибуты `<div>`. Используется в `ModalWindowContent`, `LightBoxContent`,
61
+ `LightBoxSideOverlay` как тип prop'а `loaderScreenProps`.
62
+
63
+ ### Ограничения раскладки
64
+
65
+ - **Родитель обязан быть позиционированным** (`position: relative` / `absolute` / `fixed`).
66
+ Сам LoaderScreen — `position: absolute` с `left/top/right/bottom: 0`; при статическом родителе он
67
+ растянется по ближайшему позиционированному предку выше или по initial containing block.
68
+ Во всех stories и примерах обёртка явно получает `position: relative`.
69
+ - **Ширина контента ограничена 380px** (`.loaderContent`), содержимое центрируется по обеим осям.
70
+ Длинное `description` переносится, а не расширяет блок.
71
+ - **Отступы фиксированы:** `Gap size={24}` между лоадером и описанием и между описанием и кнопками.
72
+ Настроить их через props нельзя.
73
+ - **`z-index: @z-index-loader-screen`** (10100 из `src/helpers/less/z-indexes.less`). Значение выше
74
+ тултипа; `ModalWindowClose` намеренно поднимается ещё выше (`@z-index-loader-screen + 50`), чтобы
75
+ крестик оставался кликабельным поверх лоадера.
76
+ В обратную сторону: потребители `List` (`List.module.less`) и `TableBasic`
77
+ (`TableBasic.module.less`) **понижают** `z-index` до `@z-index-step` через собственный класс
78
+ (`.list .listLoaderScreen`, `.tableBasic .spinnerWrapper .tableLoaderScreen`), чтобы лоадер
79
+ перекрывал только своё содержимое, а не `LightBox` / `ModalWindow`. Держится это на специфичности
80
+ вложенного селектора (0,2,0 и выше против 0,1,0 у `.loaderScreen`) — **не повышай специфичность правил
81
+ `.loaderScreen`** в `LoaderScreen.module.less`, иначе оба потребителя молча сломаются, и
82
+ unit-тесты этого не поймают (ловит только visual regression).
51
83
 
52
84
  ---
53
85
 
54
- ## Ключевые особенности реализации
55
-
56
- ### Два backdrop-класса по типу
86
+ ## Дизайн-токены
57
87
 
58
- ```tsx
59
- {
60
- [styles.loaderSmallBackdrop]: type === "small",
61
- [styles.loaderMiddleBackdrop]: type === "middle",
62
- }
63
88
  ```
64
-
65
- - **`loaderSmallBackdrop`** и **`loaderMiddleBackdrop`** задают разную прозрачность/цвет бэкдропа. Middle обычно более явный (полноценный overlay), Small — лёгкий полупрозрачный.
66
-
67
- ### Middle обёрнут в дополнительный `<div>`
68
-
69
- ```tsx
70
- <div className={styles.loaderMiddleBackground}>
71
- <LoaderMiddle />
72
- </div>
89
+ --triplex-next-LoaderScreen-Small_Backdrop_Default (подложка при type="small")
90
+ --triplex-next-LoaderScreen-Middle_Backdrop_Default (подложка при type="middle")
73
91
  ```
74
92
 
75
- Внутренний `background`-wrapper — для "карточки" вокруг точек LoaderMiddle.
76
- LoaderSmall — просто инлайн-элемент по центру.
77
-
78
- ### Игнорирование `theme`/`size` для `type="middle"`
93
+ Определены в `src/components/DesignTokens/components/LoaderScreen.ts`. Оба ссылаются на
94
+ `ColorNeutralAlpha.30` (в тёмной теме — `ColorDarkNeutralAlpha.30`), то есть визуально совпадают, но
95
+ разведены по типам намеренно — чтобы дизайн мог развести их независимо.
79
96
 
80
- `LoaderMiddle` API-less, так что `theme` и `size` принимаются, но не
81
- используются при `type === "middle"`. Не выкидывать их — потребители
82
- могут переключать `type` динамически без очистки props.
97
+ Там же объявлен третий токен `--triplex-next-LoaderScreen-Middle_Background_Default`, который стилями
98
+ LoaderScreen **не используется**: фон плашки `LoaderMiddle` берётся из
99
+ `--triplex-next-Loader-Middle_Background_Default`, а точки — из
100
+ `--triplex-next-Loader-Element_Background_Brand`. Токен остаётся в публичном наборе (его удаление —
101
+ breaking change для темизации), но опираться на него не нужно.
83
102
 
84
- ### Не forwardRef
85
-
86
- Компонент — `React.FC`, не `forwardRef`. Это отступление от общего правила
87
- библиотеки (`forwardRef обязателен`). Известный legacy-момент; для нового
88
- API-использования нужен ref — оборачивай снаружи.
103
+ Собственных цветов текста у компонента нет — они приходят из `Text` (`Typography`).
89
104
 
90
105
  ---
91
106
 
92
107
  ## Инварианты
93
108
 
94
- - **`type: "small" | "middle"`** — строковый литерал. Не заменять на enum без breaking-change.
95
- - **`theme` / `size` применяются только при `type="small"`** — не разворачивать на `middle` без изменения Loader.
96
- - **`FC`, без forwardRef** — технический долг. Исправлять — breaking (меняется тип).
97
- - **Centered через flex внутри оверлея** — родитель должен иметь `position: relative` (или LoaderScreen должен использоваться на фоне самостоятельного блока).
98
- - **Бэкдроп встроен в LoaderScreen** — отдельно менять прозрачность нельзя, только переопределением CSS-переменной/через `className`.
109
+ - **`forwardRef`** — обязателен, `ref` идёт на корневой `<div>` подложки (не на внутренний лоадер).
110
+ - **Публичный API:** `LoaderScreen`, `ILoaderScreenProps`, `ILoaderScreenMiddleProps` экспортируются
111
+ через `src/components/LoaderScreen/index.ts`. `type` — строковый union `"small" | "middle"`,
112
+ а не enum; замена на enum — breaking change.
113
+ - **`ILoaderScreenMiddleProps` не мёртвый тип** — на нём держатся `loaderScreenProps` в
114
+ `ModalWindowContent`, `LightBoxContent` и `LightBoxSideOverlay`. Удалять нельзя.
115
+ - **`type` управляет и лоадером, и подложкой одновременно.** Разделять их на два props без задачи
116
+ не нужно: `TYPE_TO_BACKDROP_CLASS_NAME_MAP` в `LoaderScreen.tsx` держит это соответствие в одном месте.
117
+ - **Тема `LoaderSmall` захардкожена как `ELoaderSmallTheme.BRAND`** — `NEUTRAL` через LoaderScreen
118
+ недоступна. Пробрасывание темы наружу — расширение публичного API.
119
+ - **CSS-классы `loaderScreen`, `loaderSmallBackdrop`, `loaderMiddleBackdrop`** проверяются в
120
+ unit-тестах — переименование поймается прогоном. `loaderContent` и `description` тестами не
121
+ покрыты: они задают раскладку (ограничение ширины 380px и центрирование текста, см.
122
+ «Ограничения раскладки»), их переименование безопасно, но требует синхронной правки
123
+ `LoaderScreen.module.less`. `className` потребителя добавляется последним и базовые классы
124
+ не затирает.
125
+ - **Корневой элемент — `<div>`**: смена тега ломает абсолютное позиционирование потребителей.
99
126
 
100
127
  ---
101
128
 
102
129
  ## Accessibility
103
130
 
104
- - `role="status"` и `aria-label="loading"` приходят от вложенных `LoaderSmall`/`LoaderMiddle` — LoaderScreen сам ARIA-атрибутов не добавляет.
105
- - `<div>`-оверлей **не блокирует клики** по контенту под ним — потребитель должен либо расположить LoaderScreen над блоком с `pointer-events`, либо использовать его в модалках/LightBox, где фокус и клики уже контролируются.
106
- - Для правильной семантики при глобальной загрузке — ставь `aria-busy="true"` на родительский контейнер.
107
-
108
- ---
109
-
110
- ## Дизайн-токены
111
-
112
- Нет публичных переменных — цвета бэкдропа в `styles/LoaderScreen.module.less`.
131
+ - **Роль `status` живёт на внутреннем лоадере**, а не на корневом `<div>`: `LoaderSmall` и
132
+ `LoaderMiddle` сами выставляют `role="status"` и `aria-label="loading"`. Корневая подложка —
133
+ презентационный контейнер без роли.
134
+ - **`aria-label="loading"` захардкожен в компонентах семейства Loader** — это отклонение от правила
135
+ «не хардкодь aria-текст» (`docs/ai/codestyle.md`). Локализовать его через LoaderScreen нельзя;
136
+ фикс относится к `src/components/Loader/`.
137
+ - **Фокус не перехватывается и не возвращается.** LoaderScreen не focus trap: элементы под подложкой
138
+ остаются в tab-порядке и доступны с клавиатуры, хотя визуально закрыты. Если взаимодействие нужно
139
+ запретить по-настоящему — делай это на уровне потребителя (`disabled`, `inert`, снятие контента
140
+ из DOM) или используй модальные компоненты.
141
+ - **Мышь блокируется, клавиатура — нет.** Подложка перекрывает клики по контенту под собой просто
142
+ потому, что лежит сверху и имеет фон.
143
+ - Потребитель может передать `role`, `aria-live`, `aria-busy` и другие атрибуты через spread на
144
+ корневой `<div>` — компонент их не переопределяет.
145
+ - Анимация лоадеров непрерывная; `prefers-reduced-motion` семейством Loader не обрабатывается.
113
146
 
114
147
  ---
115
148
 
116
149
  ## Связанные компоненты
117
150
 
118
- - `Loader` (`LoaderSmall`, `LoaderMiddle`) — вложенные компоненты.
119
- - `ELoaderSmallTheme`, `EComponentSize` — enum'ы пропсов.
120
- - `List`, `LightBox`, `ModalWindow` — типовые потребители (оверлей над контентом).
151
+ - `LoaderSmall` — рендерится при `type="small"` с темой `BRAND` и переданным `size`.
152
+ - `LoaderMiddle` — рендерится при `type="middle"`; своих props не имеет.
153
+ - `Gap` — фиксированные отступы 24px между лоадером, описанием и кнопками.
154
+ - `Text` (`Typography`) — обёртка `description` (`ETextSize.B2`, выравнивание по центру).
155
+ - `ModalWindowContent` — `isLoading` + `loaderScreenProps?: ILoaderScreenMiddleProps`.
156
+ - `LightBoxContent`, `LightBoxSideOverlay` — то же через свои `loaderScreenProps`.
157
+ - `List` — при `loading` кладёт `LoaderScreen type="middle"` поверх списка.
158
+ - `TableBasic` — лоадер поверх тела таблицы.
159
+ - `MultiselectField` — `LoaderScreen type="small"` внутри выпадающего списка.
121
160
 
122
161
  ---
123
162
 
124
163
  ## Stories
125
164
 
126
- `stories/Loaders/LoaderScreen/` — stories для обоих типов.
165
+ Основные истории: `stories/Loaders/LoaderScreen/LoaderScreen.stories.tsx`
166
+ Файлы примеров: `stories/Loaders/LoaderScreen/examples/`
167
+
168
+ | Story | Example file | Что демонстрирует |
169
+ |---|---|---|
170
+ | `Playground` | — | Интерактивный контроль `type`, `size`, `description` и наличия кнопок |
171
+ | `Default` | `DefaultExample.tsx` | Минимальный вариант: `type="small"`, `size="md"` в relative-обёртке |
172
+ | `Types` | `TypesExample.tsx` | `small` и `middle` рядом |
173
+ | `VisualTests` | — | Скриншот-состояния: `small` без текста, `middle` с описанием и кнопками, `middle` только с кнопками (анимации отключены) |
174
+
175
+ `VisualTests` помечена `tags: ["!autodocs", "!dev"]` — скрыта из docs и из сайдбара, как у
176
+ `LoaderMiddle` и `LoaderSmall`. Story ID (`loaders-loaderscreen--visual-tests`) при этом сохраняется,
177
+ скриншот-регрессия по ней продолжает прогоняться.
127
178
 
128
179
  ---
129
180
 
@@ -131,4 +182,50 @@ API-использования нужен ref — оборачивай снар
131
182
 
132
183
  | Дата | Изменение |
133
184
  |---|---|
134
- | 2026-04-18 | Создан документ |
185
+ | 2026-08-06 | Создан документ. AI-рефакторинг: порядок импортов по `codestyle.md`, JSDoc на компоненте, props и `ILoaderScreenMiddleProps` (включая значение по умолчанию для `size`), подложка вынесена в `TYPE_TO_BACKDROP_CLASS_NAME_MAP`, `className` в `clsx` перенесён в конец. Unit-тесты расширены: все значения `EComponentSize`, игнорирование `size` при `type="middle"`, класс подложки по типу, отсутствие `description` / `controls`, мердж `className`, spread rest-props, `forwardRef`. Публичный API, DOM и стили не изменены. |
186
+
187
+ ---
188
+
189
+ ## Примеры использования
190
+
191
+ ### Default
192
+
193
+ `stories/Loaders/LoaderScreen/examples/DefaultExample.tsx`
194
+
195
+ ```tsx
196
+ import React from "react";
197
+ import { LoaderScreen, EComponentSize } from "@sberbusiness/triplex-next";
198
+
199
+ export const DefaultExample = () => (
200
+ <div style={{ position: "relative", height: "200px", width: "300px" }}>
201
+ <LoaderScreen type="small" size={EComponentSize.MD} />
202
+ </div>
203
+ );
204
+ ```
205
+
206
+ ### Types
207
+
208
+ `stories/Loaders/LoaderScreen/examples/TypesExample.tsx`
209
+
210
+ ```tsx
211
+ import React from "react";
212
+ import { LoaderScreen, EComponentSize } from "@sberbusiness/triplex-next";
213
+
214
+ export const TypesExample = () => (
215
+ <div style={{ display: "flex", gap: "32px", flexWrap: "wrap" }}>
216
+ <div>
217
+ <div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>small</div>
218
+ <div style={{ position: "relative", height: "200px", width: "300px" }}>
219
+ <LoaderScreen type="small" size={EComponentSize.MD} />
220
+ </div>
221
+ </div>
222
+ <div>
223
+ <div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>middle</div>
224
+ <div style={{ position: "relative", height: "200px", width: "300px" }}>
225
+ <LoaderScreen type="middle" />
226
+ </div>
227
+ </div>
228
+ </div>
229
+ );
230
+ ```
231
+
@@ -429,7 +429,7 @@ import {
429
429
  ETextSize,
430
430
  Notification,
431
431
  Text,
432
- TextField,
432
+ TextareaField,
433
433
  } from "@sberbusiness/triplex-next";
434
434
  import { SuccessgradientStsIcon96 } from "@sberbusiness/icons-next";
435
435
 
@@ -438,35 +438,35 @@ export const FeedbackWithoutStars = () => {
438
438
  const [filledValue, setFilledValue] = useState("Нет возможности экспортировать данные из заказов");
439
439
  const [errorValue, setErrorValue] = useState("");
440
440
 
441
- const handleDefaultChange = (e: React.ChangeEvent<HTMLInputElement>) => {
442
- setDefaultValue(e.target.value);
441
+ const handleDefaultChange: React.ChangeEventHandler<HTMLTextAreaElement> = (event) => {
442
+ setDefaultValue(event.target.value);
443
443
  };
444
444
 
445
- const handleFilledChange = (e: React.ChangeEvent<HTMLInputElement>) => {
446
- setFilledValue(e.target.value);
445
+ const handleFilledChange: React.ChangeEventHandler<HTMLTextAreaElement> = (event) => {
446
+ setFilledValue(event.target.value);
447
447
  };
448
448
 
449
- const handleErrorChange = (e: React.ChangeEvent<HTMLInputElement>) => {
450
- setErrorValue(e.target.value);
449
+ const handleErrorChange: React.ChangeEventHandler<HTMLTextAreaElement> = (event) => {
450
+ setErrorValue(event.target.value);
451
451
  };
452
452
 
453
453
  return (
454
- <div style={{ display: "flex", flexDirection: "column", gap: "32px" }}>
454
+ <div style={{ display: "flex", flexDirection: "column", gap: 32 }}>
455
455
  <div>
456
- <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Default</h3>
456
+ <h3 style={{ marginBottom: 16, fontSize: 18, fontWeight: 600 }}>Default</h3>
457
457
  <Notification withExtraBottomPadding>
458
458
  <Notification.Body>
459
459
  <Notification.Body.Header>Предложите идею</Notification.Body.Header>
460
460
  <Notification.Body.Content>
461
461
  <div>Чего не хватает вам и что оценят другие пользователи?</div>
462
- <TextField
462
+ <TextareaField
463
463
  className="notificationBodyTextArea"
464
464
  status={EFormFieldStatus.DEFAULT}
465
- inputProps={{
465
+ textareaProps={{
466
466
  value: defaultValue,
467
467
  onChange: handleDefaultChange,
468
468
  }}
469
- label={"Как мы можем улучшить сервис?"}
469
+ label="Как мы можем улучшить сервис?"
470
470
  />
471
471
  </Notification.Body.Content>
472
472
  <Notification.Body.Footer>
@@ -480,20 +480,20 @@ export const FeedbackWithoutStars = () => {
480
480
  </div>
481
481
 
482
482
  <div>
483
- <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Filled</h3>
483
+ <h3 style={{ marginBottom: 16, fontSize: 18, fontWeight: 600 }}>Filled</h3>
484
484
  <Notification withExtraBottomPadding>
485
485
  <Notification.Body>
486
486
  <Notification.Body.Header>Предложите идею</Notification.Body.Header>
487
487
  <Notification.Body.Content>
488
488
  <div>Чего не хватает вам и что оценят другие пользователи?</div>
489
- <TextField
489
+ <TextareaField
490
490
  className="notificationBodyTextArea"
491
491
  status={EFormFieldStatus.DEFAULT}
492
- inputProps={{
492
+ textareaProps={{
493
493
  value: filledValue,
494
494
  onChange: handleFilledChange,
495
495
  }}
496
- label={undefined}
496
+ label="Как мы можем улучшить сервис?"
497
497
  />
498
498
  </Notification.Body.Content>
499
499
  <Notification.Body.Footer>
@@ -507,13 +507,13 @@ export const FeedbackWithoutStars = () => {
507
507
  </div>
508
508
 
509
509
  <div>
510
- <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Error</h3>
510
+ <h3 style={{ marginBottom: 16, fontSize: 18, fontWeight: 600 }}>Error</h3>
511
511
  <Notification withExtraBottomPadding>
512
512
  <Notification.Body>
513
513
  <Notification.Body.Header>Предложите идею</Notification.Body.Header>
514
514
  <Notification.Body.Content>
515
515
  <div>Чего не хватает вам и что оценят другие пользователи?</div>
516
- <TextField
516
+ <TextareaField
517
517
  className="notificationBodyTextArea"
518
518
  status={EFormFieldStatus.ERROR}
519
519
  description={
@@ -521,11 +521,11 @@ export const FeedbackWithoutStars = () => {
521
521
  Введите текст сообщения.
522
522
  </Text>
523
523
  }
524
- inputProps={{
524
+ textareaProps={{
525
525
  value: errorValue,
526
526
  onChange: handleErrorChange,
527
527
  }}
528
- label={"Как мы можем улучшить сервис?"}
528
+ label="Как мы можем улучшить сервис?"
529
529
  />
530
530
  </Notification.Body.Content>
531
531
  <Notification.Body.Footer>
@@ -539,7 +539,7 @@ export const FeedbackWithoutStars = () => {
539
539
  </div>
540
540
 
541
541
  <div>
542
- <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Success</h3>
542
+ <h3 style={{ marginBottom: 16, fontSize: 18, fontWeight: 600 }}>Success</h3>
543
543
  <Notification withExtraBottomPadding>
544
544
  <Notification.Body>
545
545
  <div className="finalStatus">
@@ -120,6 +120,7 @@ aria-атрибутов. Семантику задаёт потребитель
120
120
 
121
121
  | Дата | Изменение |
122
122
  |---|---|
123
+ | 2026-07-20 | Вертикальные padding изменены: 24px (было 32px) для desktop, 8px (было 16px) для mobile — через `@page-padding-desktop-y` / `@page-padding-mobile-y`. |
123
124
  | 2026-06-24 | Создан документ. AI-рефакторинг (JSDoc на компоненте и `IPageProps`), unit-тесты (className-merge, статические части), миграция stories на modern pattern. |
124
125
 
125
126
  ---