@sberbusiness/triplex-next-mcp-server 0.24.0-beta2 → 1.40.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 (73) hide show
  1. package/README.md +10 -0
  2. package/bundle/components/AlertContext.md +268 -0
  3. package/bundle/components/BodyPage.md +186 -0
  4. package/bundle/components/Button.md +93 -85
  5. package/bundle/components/ButtonDropdown.md +36 -70
  6. package/bundle/components/ButtonDropdownExtended.md +422 -0
  7. package/bundle/components/ButtonIcon.md +41 -48
  8. package/bundle/components/Caption.md +291 -0
  9. package/bundle/components/Checkbox.md +43 -122
  10. package/bundle/components/CheckboxXGroup.md +109 -46
  11. package/bundle/components/CheckboxYGroup.md +77 -49
  12. package/bundle/components/CodeText.md +197 -0
  13. package/bundle/components/Col.md +311 -162
  14. package/bundle/components/CollapsibleTree.md +584 -0
  15. package/bundle/components/CollapsibleTreeExtended.md +422 -0
  16. package/bundle/components/Dropdown.md +748 -346
  17. package/bundle/components/EmptyView.md +14 -15
  18. package/bundle/components/FooterPage.md +203 -0
  19. package/bundle/components/Gap.md +115 -57
  20. package/bundle/components/HeaderPage.md +226 -0
  21. package/bundle/components/HelpBox.md +45 -84
  22. package/bundle/components/ImageGallery.md +423 -0
  23. package/bundle/components/ImageGalleryExtended.md +606 -0
  24. package/bundle/components/LightBox.md +2252 -233
  25. package/bundle/components/List.md +216 -183
  26. package/bundle/components/ListActionItem.md +157 -0
  27. package/bundle/components/ListItem.md +276 -0
  28. package/bundle/components/ListItemControlsButton.md +103 -0
  29. package/bundle/components/ListItemControlsButtonDropdown.md +107 -0
  30. package/bundle/components/ListItemSelectable.md +99 -0
  31. package/bundle/components/ListItemTable.md +390 -0
  32. package/bundle/components/ListMaster.md +876 -156
  33. package/bundle/components/ListMasterFooter.md +80 -0
  34. package/bundle/components/ListMasterHeader.md +86 -0
  35. package/bundle/components/ListSortable.md +153 -0
  36. package/bundle/components/ListSortableItem.md +175 -0
  37. package/bundle/components/ListTableItem.md +391 -0
  38. package/bundle/components/ModalWindow.md +427 -237
  39. package/bundle/components/MonthYearField.md +145 -109
  40. package/bundle/components/Notification.md +625 -155
  41. package/bundle/components/Overlay.md +271 -170
  42. package/bundle/components/Page.md +284 -186
  43. package/bundle/components/Pagination.md +206 -229
  44. package/bundle/components/Portal.md +131 -67
  45. package/bundle/components/Row.md +171 -69
  46. package/bundle/components/Text.md +320 -0
  47. package/bundle/components/TextField.md +364 -97
  48. package/bundle/components/Title.md +296 -0
  49. package/bundle/guides/codestyle.md +38 -11
  50. package/bundle/guides/commits.md +119 -26
  51. package/bundle/guides/context.md +34 -30
  52. package/bundle/guides/stories.md +110 -40
  53. package/bundle/guides/template.md +3 -7
  54. package/bundle/guides/tests.md +48 -2
  55. package/bundle/manifest.json +275 -30
  56. package/bundle/release-notes/1.26.0.mdx +33 -2
  57. package/bundle/release-notes/1.27.0.mdx +43 -0
  58. package/bundle/release-notes/1.28.0.mdx +25 -0
  59. package/bundle/release-notes/1.29.0.mdx +47 -0
  60. package/bundle/release-notes/1.30.0.mdx +56 -0
  61. package/bundle/release-notes/1.31.0.mdx +52 -0
  62. package/bundle/release-notes/1.32.0.mdx +35 -0
  63. package/bundle/release-notes/1.33.0.mdx +61 -0
  64. package/bundle/release-notes/1.34.0.mdx +35 -0
  65. package/bundle/release-notes/1.35.0.mdx +21 -0
  66. package/bundle/release-notes/1.35.1.mdx +11 -0
  67. package/bundle/release-notes/1.36.0.mdx +21 -0
  68. package/bundle/release-notes/1.37.0.mdx +71 -0
  69. package/bundle/release-notes/1.38.0.mdx +36 -0
  70. package/bundle/release-notes/1.39.0.mdx +66 -0
  71. package/bundle/release-notes/1.40.0.mdx +27 -0
  72. package/bundle/release-notes/1.41.0.mdx +7 -0
  73. package/package.json +1 -1
@@ -1,10 +1,12 @@
1
1
  ---
2
2
  component: Notification
3
3
  category: Feedback
4
- figma-node: ""
5
- figma-file: ""
6
- related: [SideOverlay, Alert, UnorderedList, ButtonIcon, Typography]
7
- tokens: []
4
+ related: [NotificationGrouped, Button, AlertContext, UnorderedList]
5
+ tokens:
6
+ - --triplex-next-Notification-Background
7
+ - --triplex-next-Notification-Color
8
+ - --triplex-next-Notification-Shadow
9
+ - --triplex-next-Notification-TimeColor
8
10
  stories: stories/Notification/Notification.stories.tsx
9
11
  version: "1.0"
10
12
  ---
@@ -13,221 +15,689 @@ version: "1.0"
13
15
 
14
16
  ## Назначение
15
17
 
16
- Карточка уведомления — `<div role="alertdialog">` с фиксированной
17
- compound-структурой: `Icon` (опц.), `Body` (Header / Content / List /
18
- Footer), `Close` (опц.), `Time` (опц.). Содержательная часть собирается
19
- потребителем; компонент задаёт лэйаут, типографику и поведение close-by-
20
- hover для side-overlay.
18
+ Составной компонент уведомления для отображения сообщений об успехе, ошибке, предупреждении,
19
+ а также бизнес-уведомлений (mail-нотификации, формы обратной связи). Состоит из иконки,
20
+ тела (заголовок, текст, список, футер), кнопки закрытия и времени.
21
21
 
22
- `NotificationGrouped` — визуальная группировка (стопка) — оборачивает
23
- одну Notification и подкладывает два декоративных `<div>` снизу как
24
- эффект «стопки карточек» (без логики управления списком).
25
-
26
- Используй когда: показываешь информационное / системное сообщение
27
- (в SideOverlay, Alert, отдельной странице, history-list).
22
+ Используй когда: нужно показать уведомление в списке нотификаций, в side-overlay или как алерт.
23
+ Не используй когда: нужно инлайновое сообщение об ошибке формы (используй `Alert`) или
24
+ пустое состояние (используй `EmptyView`).
28
25
 
29
26
  ---
30
27
 
31
- ## Файловая структура
32
-
33
- ```text
34
- src/components/Notification/
35
- ├── Notification.tsx # FC (как INotificationSFC) + slots
36
- ├── NotificationGrouped.tsx # FC, обёртка + декоративный footer
37
- ├── components/
38
- │ ├── NotificationIcon.tsx # <div> wrapper для иконки
39
- │ ├── NotificationBody.tsx # FC (как INotificationBodySFC) + slots
40
- │ ├── NotificationHeader.tsx # <h3>
41
- │ ├── NotificationBodyContent.tsx # <Text size=B3 type=PRIMARY tag=div>
42
- │ ├── NotificationBodyList.tsx # <UnorderedList> + map по values[]
43
- │ ├── NotificationFooter.tsx # <div>
44
- │ ├── NotificationClose.tsx # <ButtonIcon> с CrossStrokeSrvIcon16
45
- │ ├── NotificationTime.tsx # <span> с временем
46
- │ └── NotificationGroupedFooter.tsx # 2 декоративных <div>
47
- ├── index.ts # Barrel: Notification + NotificationGrouped
48
- ├── styles/Notification.module.less
49
- └── __tests__/Notification.test.tsx
50
- ```
51
-
52
- ---
28
+ ## Структура (compound API)
53
29
 
54
- ## Compound-структура
30
+ Компонент собирается из статических подкомпонентов. Порядок дочерних элементов определяет вёрстку.
55
31
 
56
- ```tsx
57
- <Notification onClick={...} isShowCloseOnHover>
58
- <Notification.Icon><MailIcon /></Notification.Icon>
59
- <Notification.Body>
60
- <Notification.Body.Header>Заголовок</Notification.Body.Header>
61
- <Notification.Body.Content>Текст сообщения</Notification.Body.Content>
62
- <Notification.Body.List values={["Один", "Два"]} />
63
- <Notification.Body.Footer>
64
- <Button>Действие</Button>
65
- </Notification.Body.Footer>
66
- </Notification.Body>
67
- <Notification.Close onClick={handleClose} />
68
- <Notification.Time time="12:34" />
69
- </Notification>
70
-
71
- <NotificationGrouped>
72
- <Notification>...</Notification>
73
- </NotificationGrouped>
32
+ ```
33
+ Notification
34
+ ├── Notification.Icon — кастомная иконка (слева)
35
+ ├── Notification.Body — тело уведомления
36
+ │ ├── Notification.Body.Header — заголовок (<h3>)
37
+ │ ├── Notification.Body.Content — основной текст (Typography Text)
38
+ │ ├── Notification.Body.List — маркированный список (UnorderedList)
39
+ │ └── Notification.Body.Footer — футер (кнопки, Alert и т.д.)
40
+ ├── Notification.Close — кнопка закрытия (ButtonIcon)
41
+ └── Notification.Time — время уведомления
74
42
  ```
75
43
 
76
- Контракт компонента: «Может содержать только Icon, Body, Close, Time» — на
77
- уровне типов не ограничено (`children: ReactElement | ReactElement[]`),
78
- но стилизация рассчитана только на эти 4 слота.
44
+ `NotificationGrouped` — обёртка для отображения уведомления как «стопки» (визуальный эффект
45
+ нескольких карточек снизу). Принимает одно `Notification` в `children`.
79
46
 
80
47
  ---
81
48
 
82
49
  ## Варианты и props
83
50
 
84
- ### Notification — `INotificationProps extends React.ButtonHTMLAttributes<HTMLElement>`
51
+ ### Notification
85
52
 
86
- | Prop | Тип | Default | Описание |
53
+ | Prop | Тип | По умолчанию | Описание |
87
54
  |---|---|---|---|
88
- | `children` | `ReactElement \| ReactElement[]` | — | Только Icon/Body/Close/Time. |
89
- | `withExtraBottomPadding` | `boolean` | `false` | Дополнительный нижний padding (mail-варианты). |
90
- | `isShowCloseOnHover` | `boolean` | `false` | Close видим только при hover'е (для SideOverlay/Alert). |
91
- | `onClick` | `() => void` | — | Клик по карточке. |
92
- | `...HTMLAttributes` | `ButtonHTMLAttributes<HTMLElement>` | — | Прокидываются на корневой `<div>` (имя `Button*` — историческое). |
93
-
94
- - Корневой тег — **`<div role="alertdialog">`**, не `<button>` (несмотря на `ButtonHTMLAttributes`).
95
- - `data-tx={process.env.npm_package_version}` — версия пакета.
55
+ | `children` | `ReactElement \| ReactElement[]` | — | Только `Icon`, `Body`, `Close`, `Time` |
56
+ | `withExtraBottomPadding` | `boolean` | `false` | Увеличенный отступ снизу (тип mail) |
57
+ | `isShowCloseOnHover` | `boolean` | `false` | Кнопка закрытия появляется по ховеру (для side-overlay/алерта) |
58
+ | `onClick` | `() => void` | — | Обработчик клика по уведомлению |
96
59
 
97
- ### Notification.Body — `INotificationBodySFC` (slots: Header, Content, List, Footer)
60
+ Наследует `React.ButtonHTMLAttributes<HTMLElement>` (остальные атрибуты прокидываются на корневой `div`).
98
61
 
99
- - `children: ReactNode` — последовательность заголовка / контента / списка / футера.
100
- - Каждый слот — `React.FC` (без forwardRef).
62
+ ### Notification.Close
101
63
 
102
- ### Notification.Body.Header
64
+ | Prop | Тип | Описание |
65
+ |---|---|---|
66
+ | `onClick` | `() => void` | Обработчик закрытия (обязателен) |
103
67
 
104
- - `<h3>` с фиксированными стилями. `children: ReactNode`.
68
+ Наследует `IButtonIconProps` без `children` (`children?: never`).
105
69
 
106
- ### Notification.Body.Content
70
+ ### Notification.Time
107
71
 
108
- - `<Text tag="div" size=B3 type=PRIMARY>{children}</Text>` — типографика жёстко зашита.
72
+ | Prop | Тип | Описание |
73
+ |---|---|---|
74
+ | `time` | `ReactNode` | Значение времени уведомления |
109
75
 
110
- ### Notification.Body.List — `INotificationBodyListProps extends IUnorderedListProps`
76
+ ### Notification.Body.List
111
77
 
112
- - **`values: string[]`** — массив строк, рендерятся как `UnorderedList.Item`.
113
- - `...IUnorderedListProps` — пробрасывается. `className` мержится с локальным.
78
+ | Prop | Тип | Описание |
79
+ |---|---|---|
80
+ | `values` | `string[]` | Элементы списка |
114
81
 
115
- ### Notification.Body.Footer
82
+ Наследует `IUnorderedListProps`.
116
83
 
117
- - `<div>` с локальной стилизацией. `children: ReactNode`.
84
+ ### NotificationGrouped
118
85
 
119
- ### Notification.Close — `INotificationCloseProps extends Omit<IButtonIconProps, "children">`
86
+ | Prop | Тип | Описание |
87
+ |---|---|---|
88
+ | `children` | `ReactNode` | Вложенное уведомление |
120
89
 
121
- - **Иконка фиксирована**: `CrossStrokeSrvIcon16 paletteIndex={5}`.
122
- - `onClick: () => void` (обязателен).
123
- - `children?: never` — нельзя кастомизировать иконку.
124
- - Обёрнут в `<span>` для позиционирования.
125
-
126
- ### Notification.Icon — `INotificationIconProps`
90
+ ---
127
91
 
128
- - `children: ReactElement` — потребительская иконка. Обёрнута в `<div>` с фикс.размером (см. styles).
92
+ ## Дизайн-токены
129
93
 
130
- ### Notification.Time — `INotificationTimeProps`
94
+ ```
95
+ --triplex-next-Notification-Background (фон уведомления)
96
+ --triplex-next-Notification-Color (цвет текста)
97
+ --triplex-next-Notification-Shadow (тень карточки)
98
+ --triplex-next-Notification-TimeColor (цвет времени)
99
+ ```
131
100
 
132
- - `time: ReactText` (string|number) — рендерится в `<span>` без форматирования.
101
+ ---
133
102
 
134
- ### NotificationGrouped — `INotificationGroupedProps`
103
+ ## Инварианты
135
104
 
136
- - `children: ReactNode` — обычно одна `<Notification>`.
137
- - Добавляет **2 декоративных `<div>`** снизу (`NotificationGroupedFooter`) — визуальный эффект «стопки».
105
+ - `forwardRef` на `Notification`, `NotificationGrouped`, `NotificationBody` — не убирать. Ref ведёт на корневой `div`.
106
+ - Компонент собран паттерном `Object.assign(forwardRef(...), { ...статики })` — статики (`Icon`, `Body`, `Close`, `Time`; у `Body` — `Header`, `Content`, `List`, `Footer`) часть публичного API, переименовывать нельзя.
107
+ - Корневой элемент имеет `role="alertdialog"` — не менять.
108
+ - `children` корневого `Notification` ограничены типом `ReactElement` — допускаются только `Icon`/`Body`/`Close`/`Time`.
109
+ - CSS-классы `notification`, `notificationBody`, `notificationIcon`, `notificationClose`, `notificationGroupedWrapper`, `extraBottomPadding`, `showCloseOnHover` используются в тестах — не переименовывать.
138
110
 
139
111
  ---
140
112
 
141
- ## Ключевые особенности реализации
113
+ ## Accessibility
142
114
 
143
- ### `INotificationSFC` — slots через property assignment, не Object.assign
115
+ - Корневой элемент — `role="alertdialog"`.
116
+ - `Notification.Close` рендерит `ButtonIcon` с иконкой-крестиком; потребителю стоит передать `aria-label` для кнопки закрытия (библиотека мультиязычная, текст не хардкодится).
117
+ - Прочие aria-атрибуты прокидываются на корневой `div` через spread.
144
118
 
145
- ```tsx
146
- export const Notification: INotificationSFC = ((props) => {...}) as INotificationSFC;
147
- Notification.displayName = "Notification";
148
- Notification.Icon = NotificationIcon;
149
- // ...
150
- ```
119
+ ---
151
120
 
152
- То же — `INotificationBodySFC`. **Нет `forwardRef`** на корне.
121
+ ## Связанные компоненты
153
122
 
154
- ### `role="alertdialog"` на корневом `<div>`
123
+ - `NotificationGrouped` — обёртка для отображения уведомления стопкой.
124
+ - `Button` — типичное содержимое `Notification.Body.Footer`.
125
+ - `AlertContext` — может вкладываться в `Notification.Body.Footer`.
126
+ - `UnorderedList` — основа `Notification.Body.List`.
155
127
 
156
- - Семантика модального уведомления, требующего внимания. Несмотря на `ButtonHTMLAttributes` в типах — корень всегда `<div>`, поэтому атрибуты `<button>`-only (например `disabled`, `type="submit"`) не применятся.
128
+ ---
157
129
 
158
- ### `isShowCloseOnHover` — для SideOverlay/Alert
130
+ ## Stories
159
131
 
160
- - Класс `styles.showCloseOnHover` — включает CSS-правило, которое делает `Notification.Close` видимым только при hover'е на родителе. Используется в `Alert` и `SideOverlay` (по комментарию в коде).
132
+ Основные истории: `stories/Notification/Notification.stories.tsx`
133
+ Файлы примеров: `stories/Notification/examples/`
161
134
 
162
- ### `withExtraBottomPadding` — mail-вариант
135
+ | Story | Example file | Что демонстрирует |
136
+ |---|---|---|
137
+ | `Playground` | `Playground.tsx` | Интерактивный контроль наполнения уведомления |
138
+ | `Default` | `Default.tsx` | Минимальное уведомление: иконка, заголовок, текст, закрытие |
139
+ | `Status` | `Status.tsx` | Success / Warning / Error со списком |
140
+ | `Business` | `Business.tsx` | Бизнес-уведомления: текст, кнопка, вложенный Alert |
141
+ | `Business Stack` | `BusinessStack.tsx` | Уведомления в `NotificationGrouped` (стопка) |
142
+ | `Feedback Without Stars` | `FeedbackWithoutStars.tsx` | Форма обратной связи без оценки звёздами |
143
+ | `Feedback With Stars` | `FeedbackWithStars.tsx` | Форма обратной связи с оценкой звёздами |
163
144
 
164
- - Дополнительный нижний padding для случая mail-нотификации (где Footer часто содержит CTA-кнопки).
145
+ ---
165
146
 
166
- ### `Body.List` — только строки
147
+ ## История изменений
167
148
 
168
- - `values: string[]` — невозможно использовать ReactNode-элементы (ссылки, форматирование) внутри списка без рефакторинга. Известное ограничение API.
149
+ | Дата | Изменение |
150
+ |---|---|
151
+ | 2026-06-16 | Создан AI-документ. `Notification`, `NotificationGrouped`, `NotificationBody` переведены на `forwardRef` (паттерн `Object.assign`); удалены типы `INotificationSFC`/`INotificationBodySFC`; тип `Notification.Time.time` расширен с `React.ReactText` до `React.ReactNode`. Stories мигрированы на modern pattern. |
169
152
 
170
- ### `Close` — фиксированная иконка
153
+ ---
171
154
 
172
- - `CrossStrokeSrvIcon16 paletteIndex={5}` — нельзя заменить (`children: never`). Если нужно другое — потребитель кладёт собственный `ButtonIcon` мимо слота.
155
+ ## Примеры использования
173
156
 
174
- ### `Grouped` — только декорация
157
+ ### Default
175
158
 
176
- - `NotificationGrouped` не управляет stack'ом нескольких уведомлений; это чистый CSS-эффект «карточка из 3-х слоёв» вокруг одного `Notification`.
159
+ `stories/Notification/examples/Default.tsx`
177
160
 
178
- ---
161
+ ```tsx
162
+ import React from "react";
163
+ import { Notification } from "@sberbusiness/triplex-next";
164
+ import { SuccessStrokeStsIcon20 } from "@sberbusiness/icons-next";
165
+
166
+ export const Default = () => (
167
+ <div style={{ maxWidth: "600px" }}>
168
+ <Notification>
169
+ <Notification.Icon>
170
+ <SuccessStrokeStsIcon20 paletteIndex={0} />
171
+ </Notification.Icon>
172
+ <Notification.Body>
173
+ <Notification.Body.Header>Title text</Notification.Body.Header>
174
+ <Notification.Body.Content>
175
+ This message provides context or highlights important information to note.
176
+ </Notification.Body.Content>
177
+ </Notification.Body>
178
+ <Notification.Close onClick={() => {}} />
179
+ </Notification>
180
+ </div>
181
+ );
182
+ ```
179
183
 
180
- ## Инварианты
184
+ ### Status
181
185
 
182
- - **Корень — `<div role="alertdialog">`**, не интерактивный элемент. `ButtonHTMLAttributes` — историческое API (имя), не означает `<button>` рендера.
183
- - **`children` — только Icon / Body / Close / Time** (контракт документации; типы шире, но стили рассчитаны только на эти 4 слота).
184
- - **`Body` — Header / Content / List / Footer** в этом смысловом порядке (CSS закладывает spacing).
185
- - **`Close` иконка фиксирована**; `children: never`.
186
- - **`Body.List.values: string[]`** — не `ReactNode[]`. При расширении API — breaking.
187
- - **`Body.Content` типография зашита** (`B3 / PRIMARY`).
188
- - **`Body.Header` — `<h3>`**. Heading-уровень не настраивается — может конфликтовать с outline страницы (a11y).
189
- - **`isShowCloseOnHover` ↔ родитель** — работает только когда `Notification` — внутри SideOverlay/Alert (CSS `:hover` на родителе/самом элементе).
190
- - **FC, не forwardRef** на всех уровнях (legacy).
191
- - **`NotificationGrouped` — декорация**, не контейнер для списка.
192
- - **`data-tx`** — версия пакета на корне.
186
+ `stories/Notification/examples/Status.tsx`
193
187
 
194
- ---
195
-
196
- ## Accessibility
188
+ ```tsx
189
+ import React from "react";
190
+ import { Notification } from "@sberbusiness/triplex-next";
191
+ import { ErrorStrokeStsIcon20, SuccessStrokeStsIcon20, WarningStrokeStsIcon20 } from "@sberbusiness/icons-next";
192
+
193
+ export const Status = () => (
194
+ <div style={{ display: "flex", flexDirection: "column", gap: "32px" }}>
195
+ <div>
196
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Success</h3>
197
+ <Notification>
198
+ <Notification.Icon>
199
+ <SuccessStrokeStsIcon20 paletteIndex={0} />
200
+ </Notification.Icon>
201
+ <Notification.Body>
202
+ <Notification.Body.Content>
203
+ This message provides context or highlights important information to note.
204
+ </Notification.Body.Content>
205
+ <Notification.Body.List values={Array.from({ length: 3 }, () => "List item text;")} />
206
+ </Notification.Body>
207
+ <Notification.Close onClick={() => {}} />
208
+ </Notification>
209
+ </div>
210
+
211
+ <div>
212
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Warning</h3>
213
+ <Notification>
214
+ <Notification.Icon>
215
+ <WarningStrokeStsIcon20 paletteIndex={2} />
216
+ </Notification.Icon>
217
+ <Notification.Body>
218
+ <Notification.Body.Content>
219
+ This message provides context or highlights important information to note.
220
+ </Notification.Body.Content>
221
+ <Notification.Body.List values={Array.from({ length: 3 }, () => "List item text;")} />
222
+ </Notification.Body>
223
+ <Notification.Close onClick={() => {}} />
224
+ </Notification>
225
+ </div>
226
+
227
+ <div>
228
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Error</h3>
229
+ <Notification>
230
+ <Notification.Icon>
231
+ <ErrorStrokeStsIcon20 paletteIndex={1} />
232
+ </Notification.Icon>
233
+ <Notification.Body>
234
+ <Notification.Body.Content>
235
+ This message provides context or highlights important information to note.
236
+ </Notification.Body.Content>
237
+ <Notification.Body.List values={Array.from({ length: 3 }, () => "List item text;")} />
238
+ </Notification.Body>
239
+ <Notification.Close onClick={() => {}} />
240
+ </Notification>
241
+ </div>
242
+ </div>
243
+ );
244
+ ```
197
245
 
198
- - `role="alertdialog"` — корректный для модального уведомления, но контейнер не сам управляет `aria-labelledby` / `aria-describedby` — потребитель должен передать их через `...HTMLAttributes`.
199
- - `<h3>` в `Body.Header` — фиксированный heading-уровень. Для контекстов, где это нарушает outline (например, top-level Alert на странице без h1/h2), — возможен a11y-гэп.
200
- - `Close` — `<ButtonIcon>` с иконкой crossbar; **нет `aria-label`** в коде (передаётся через `...buttonProps`). Потребитель должен установить `aria-label="Закрыть уведомление"` при создании `<Notification.Close>`.
201
- - `isShowCloseOnHover` — close-кнопка не видна без hover'а ⇒ для keyboard-only пользователей может быть недоступна, если фокус-стили не показывают её. Проверить!
202
- - Корень — `<div>`, но `onClick` есть — без `keydown` Enter/Space обработчика. Если `onClick` критичен — клавиатура не работает.
246
+ ### Business
203
247
 
204
- ---
248
+ `stories/Notification/examples/Business.tsx`
205
249
 
206
- ## Дизайн-токены
250
+ ```tsx
251
+ import React from "react";
252
+ import {
253
+ AlertContext,
254
+ Button,
255
+ EAlertType,
256
+ EButtonTheme,
257
+ EComponentSize,
258
+ Notification,
259
+ } from "@sberbusiness/triplex-next";
260
+ import { DefaulticonStrokePrdIcon20 } from "@sberbusiness/icons-next";
261
+
262
+ export const Business = () => (
263
+ <div style={{ display: "flex", flexDirection: "column", gap: "32px" }}>
264
+ <div>
265
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Normal</h3>
266
+ <Notification withExtraBottomPadding>
267
+ <Notification.Icon>
268
+ <DefaulticonStrokePrdIcon20 paletteIndex={5} />
269
+ </Notification.Icon>
270
+ <Notification.Body>
271
+ <Notification.Body.Header>Title text</Notification.Body.Header>
272
+ <Notification.Body.Content>
273
+ This message provides context or highlights important information to note.
274
+ </Notification.Body.Content>
275
+ </Notification.Body>
276
+ <Notification.Close onClick={() => {}} />
277
+ <Notification.Time time="22:45" />
278
+ </Notification>
279
+ </div>
280
+
281
+ <div>
282
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Button</h3>
283
+ <Notification withExtraBottomPadding>
284
+ <Notification.Icon>
285
+ <DefaulticonStrokePrdIcon20 paletteIndex={5} />
286
+ </Notification.Icon>
287
+ <Notification.Body>
288
+ <Notification.Body.Header>Title text</Notification.Body.Header>
289
+ <Notification.Body.Content>
290
+ This message provides context or highlights important information to note.
291
+ </Notification.Body.Content>
292
+ <Notification.Body.Footer>
293
+ <Button theme={EButtonTheme.SECONDARY} size={EComponentSize.SM}>
294
+ Button text
295
+ </Button>
296
+ </Notification.Body.Footer>
297
+ </Notification.Body>
298
+ <Notification.Close onClick={() => {}} />
299
+ <Notification.Time time="22:45" />
300
+ </Notification>
301
+ </div>
302
+
303
+ <div>
304
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Alert</h3>
305
+ <Notification withExtraBottomPadding>
306
+ <Notification.Icon>
307
+ <DefaulticonStrokePrdIcon20 paletteIndex={5} />
308
+ </Notification.Icon>
309
+ <Notification.Body>
310
+ <Notification.Body.Header>Title text</Notification.Body.Header>
311
+ <Notification.Body.Content>
312
+ This message provides context or highlights important information to note.
313
+ </Notification.Body.Content>
314
+ <Notification.Body.Footer>
315
+ <AlertContext type={EAlertType.INFO}>
316
+ This message provides context or highlights important information to note.
317
+ </AlertContext>
318
+ </Notification.Body.Footer>
319
+ </Notification.Body>
320
+ <Notification.Close onClick={() => {}} />
321
+ <Notification.Time time="22:45" />
322
+ </Notification>
323
+ </div>
324
+ </div>
325
+ );
326
+ ```
207
327
 
208
- Нет собственных. Цвета/spacing — из глобальных токенов (см. `styles/Notification.module.less`). Иконка `CrossStrokeSrvIcon16` использует `paletteIndex={5}`.
328
+ ### Business Stack
209
329
 
210
- ---
330
+ `stories/Notification/examples/BusinessStack.tsx`
211
331
 
212
- ## Связанные компоненты
332
+ ```tsx
333
+ import React from "react";
334
+ import {
335
+ AlertContext,
336
+ Button,
337
+ EAlertType,
338
+ EButtonTheme,
339
+ EComponentSize,
340
+ Notification,
341
+ NotificationGrouped,
342
+ } from "@sberbusiness/triplex-next";
343
+ import { DefaulticonStrokePrdIcon20 } from "@sberbusiness/icons-next";
344
+
345
+ export const BusinessStack = () => (
346
+ <div style={{ display: "flex", flexDirection: "column", gap: "32px" }}>
347
+ <div>
348
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Normal</h3>
349
+ <NotificationGrouped>
350
+ <Notification withExtraBottomPadding>
351
+ <Notification.Icon>
352
+ <DefaulticonStrokePrdIcon20 paletteIndex={5} />
353
+ </Notification.Icon>
354
+ <Notification.Body>
355
+ <Notification.Body.Header>Title text</Notification.Body.Header>
356
+ <Notification.Body.Content>
357
+ This message provides context or highlights important information to note.
358
+ </Notification.Body.Content>
359
+ </Notification.Body>
360
+ <Notification.Close onClick={() => {}} />
361
+ <Notification.Time time="22:45" />
362
+ </Notification>
363
+ </NotificationGrouped>
364
+ </div>
365
+
366
+ <div>
367
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Button</h3>
368
+ <NotificationGrouped>
369
+ <Notification withExtraBottomPadding>
370
+ <Notification.Icon>
371
+ <DefaulticonStrokePrdIcon20 paletteIndex={5} />
372
+ </Notification.Icon>
373
+ <Notification.Body>
374
+ <Notification.Body.Header>Title text</Notification.Body.Header>
375
+ <Notification.Body.Content>
376
+ This message provides context or highlights important information to note.
377
+ </Notification.Body.Content>
378
+ <Notification.Body.Footer>
379
+ <Button theme={EButtonTheme.SECONDARY} size={EComponentSize.SM}>
380
+ Button text
381
+ </Button>
382
+ </Notification.Body.Footer>
383
+ </Notification.Body>
384
+ <Notification.Close onClick={() => {}} />
385
+ <Notification.Time time="22:45" />
386
+ </Notification>
387
+ </NotificationGrouped>
388
+ </div>
389
+
390
+ <div>
391
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Alert</h3>
392
+ <NotificationGrouped>
393
+ <Notification withExtraBottomPadding>
394
+ <Notification.Icon>
395
+ <DefaulticonStrokePrdIcon20 paletteIndex={5} />
396
+ </Notification.Icon>
397
+ <Notification.Body>
398
+ <Notification.Body.Header>Title text</Notification.Body.Header>
399
+ <Notification.Body.Content>
400
+ This message provides context or highlights important information to note.
401
+ </Notification.Body.Content>
402
+ <Notification.Body.Footer>
403
+ <AlertContext type={EAlertType.INFO}>
404
+ This message provides context or highlights important information to note.
405
+ </AlertContext>
406
+ </Notification.Body.Footer>
407
+ </Notification.Body>
408
+ <Notification.Close onClick={() => {}} />
409
+ <Notification.Time time="22:45" />
410
+ </Notification>
411
+ </NotificationGrouped>
412
+ </div>
413
+ </div>
414
+ );
415
+ ```
213
416
 
214
- - `SideOverlay` / `Alert` — типичные контейнеры (закрытие по hover).
215
- - `UnorderedList` — основа `Body.List`.
216
- - `Text` (Typography) — `Body.Content`.
217
- - `ButtonIcon` — `Close`.
218
- - `CrossStrokeSrvIcon16` — иконка close.
417
+ ### Feedback Without Stars
219
418
 
220
- ---
419
+ `stories/Notification/examples/FeedbackWithoutStars.tsx`
221
420
 
222
- ## Stories
421
+ ```tsx
422
+ import React, { useState } from "react";
423
+ import {
424
+ Button,
425
+ EButtonTheme,
426
+ EComponentSize,
427
+ EFontType,
428
+ EFormFieldStatus,
429
+ ETextSize,
430
+ Notification,
431
+ Text,
432
+ TextareaField,
433
+ } from "@sberbusiness/triplex-next";
434
+ import { SuccessgradientStsIcon96 } from "@sberbusiness/icons-next";
435
+
436
+ export const FeedbackWithoutStars = () => {
437
+ const [defaultValue, setDefaultValue] = useState("");
438
+ const [filledValue, setFilledValue] = useState("Нет возможности экспортировать данные из заказов");
439
+ const [errorValue, setErrorValue] = useState("");
440
+
441
+ const handleDefaultChange: React.ChangeEventHandler<HTMLTextAreaElement> = (event) => {
442
+ setDefaultValue(event.target.value);
443
+ };
444
+
445
+ const handleFilledChange: React.ChangeEventHandler<HTMLTextAreaElement> = (event) => {
446
+ setFilledValue(event.target.value);
447
+ };
448
+
449
+ const handleErrorChange: React.ChangeEventHandler<HTMLTextAreaElement> = (event) => {
450
+ setErrorValue(event.target.value);
451
+ };
452
+
453
+ return (
454
+ <div style={{ display: "flex", flexDirection: "column", gap: 32 }}>
455
+ <div>
456
+ <h3 style={{ marginBottom: 16, fontSize: 18, fontWeight: 600 }}>Default</h3>
457
+ <Notification withExtraBottomPadding>
458
+ <Notification.Body>
459
+ <Notification.Body.Header>Предложите идею</Notification.Body.Header>
460
+ <Notification.Body.Content>
461
+ <div>Чего не хватает вам и что оценят другие пользователи?</div>
462
+ <TextareaField
463
+ className="notificationBodyTextArea"
464
+ status={EFormFieldStatus.DEFAULT}
465
+ textareaProps={{
466
+ value: defaultValue,
467
+ onChange: handleDefaultChange,
468
+ }}
469
+ label="Как мы можем улучшить сервис?"
470
+ />
471
+ </Notification.Body.Content>
472
+ <Notification.Body.Footer>
473
+ <Button theme={EButtonTheme.SECONDARY} size={EComponentSize.SM}>
474
+ Отправить
475
+ </Button>
476
+ </Notification.Body.Footer>
477
+ </Notification.Body>
478
+ <Notification.Close onClick={() => {}} />
479
+ </Notification>
480
+ </div>
481
+
482
+ <div>
483
+ <h3 style={{ marginBottom: 16, fontSize: 18, fontWeight: 600 }}>Filled</h3>
484
+ <Notification withExtraBottomPadding>
485
+ <Notification.Body>
486
+ <Notification.Body.Header>Предложите идею</Notification.Body.Header>
487
+ <Notification.Body.Content>
488
+ <div>Чего не хватает вам и что оценят другие пользователи?</div>
489
+ <TextareaField
490
+ className="notificationBodyTextArea"
491
+ status={EFormFieldStatus.DEFAULT}
492
+ textareaProps={{
493
+ value: filledValue,
494
+ onChange: handleFilledChange,
495
+ }}
496
+ label="Как мы можем улучшить сервис?"
497
+ />
498
+ </Notification.Body.Content>
499
+ <Notification.Body.Footer>
500
+ <Button theme={EButtonTheme.SECONDARY} size={EComponentSize.SM}>
501
+ Отправить
502
+ </Button>
503
+ </Notification.Body.Footer>
504
+ </Notification.Body>
505
+ <Notification.Close onClick={() => {}} />
506
+ </Notification>
507
+ </div>
508
+
509
+ <div>
510
+ <h3 style={{ marginBottom: 16, fontSize: 18, fontWeight: 600 }}>Error</h3>
511
+ <Notification withExtraBottomPadding>
512
+ <Notification.Body>
513
+ <Notification.Body.Header>Предложите идею</Notification.Body.Header>
514
+ <Notification.Body.Content>
515
+ <div>Чего не хватает вам и что оценят другие пользователи?</div>
516
+ <TextareaField
517
+ className="notificationBodyTextArea"
518
+ status={EFormFieldStatus.ERROR}
519
+ description={
520
+ <Text tag="div" size={ETextSize.B4} type={EFontType.ERROR}>
521
+ Введите текст сообщения.
522
+ </Text>
523
+ }
524
+ textareaProps={{
525
+ value: errorValue,
526
+ onChange: handleErrorChange,
527
+ }}
528
+ label="Как мы можем улучшить сервис?"
529
+ />
530
+ </Notification.Body.Content>
531
+ <Notification.Body.Footer>
532
+ <Button theme={EButtonTheme.SECONDARY} size={EComponentSize.SM}>
533
+ Отправить
534
+ </Button>
535
+ </Notification.Body.Footer>
536
+ </Notification.Body>
537
+ <Notification.Close onClick={() => {}} />
538
+ </Notification>
539
+ </div>
540
+
541
+ <div>
542
+ <h3 style={{ marginBottom: 16, fontSize: 18, fontWeight: 600 }}>Success</h3>
543
+ <Notification withExtraBottomPadding>
544
+ <Notification.Body>
545
+ <div className="finalStatus">
546
+ <SuccessgradientStsIcon96 />
547
+ <Notification.Body.Header>Спасибо за оценку!</Notification.Body.Header>
548
+ <Notification.Body.Content>Ваши отзывы помогают нам стать лучше.</Notification.Body.Content>
549
+ </div>
550
+ </Notification.Body>
551
+ <Notification.Close onClick={() => {}} />
552
+ </Notification>
553
+ </div>
554
+ </div>
555
+ );
556
+ };
557
+ ```
223
558
 
224
- `stories/Notification/Notification.stories.tsx`
225
- Примеры: `stories/Notification/examples/`
559
+ ### Feedback With Stars
226
560
 
227
- ---
561
+ `stories/Notification/examples/FeedbackWithStars.tsx`
228
562
 
229
- ## История изменений
563
+ ```tsx
564
+ import React, { useState } from "react";
565
+ import {
566
+ Button,
567
+ Checkbox,
568
+ CheckboxYGroup,
569
+ EButtonTheme,
570
+ EComponentSize,
571
+ EFormFieldStatus,
572
+ Notification,
573
+ TextField,
574
+ } from "@sberbusiness/triplex-next";
575
+ import { StarStrokeSrvIcon32, SuccessgradientStsIcon96 } from "@sberbusiness/icons-next";
576
+
577
+ export const FeedbackWithStars = () => {
578
+ const [value, setValue] = useState("");
579
+ const checkboxes = [
580
+ "Встречается неточная информация",
581
+ "Уведомления приходят ночью",
582
+ "Не хватает данных в сообщении",
583
+ ];
584
+
585
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
586
+ setValue(e.target.value);
587
+ };
588
+
589
+ return (
590
+ <div style={{ display: "flex", flexDirection: "column", gap: "32px" }}>
591
+ <div>
592
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Default</h3>
593
+ <Notification withExtraBottomPadding>
594
+ <Notification.Body>
595
+ <Notification.Body.Header>Оцените оформление кредита</Notification.Body.Header>
596
+ <Notification.Body.Content>
597
+ <div>Оцените, насколько удобным был процесс оформления недавно полученого кредита.</div>
598
+ <div style={{ display: "flex", justifyContent: "center", marginTop: "16px" }}>
599
+ {Array.from({ length: 5 }).map((_, index) => (
600
+ <StarStrokeSrvIcon32
601
+ key={index}
602
+ paletteIndex={0}
603
+ style={{ marginLeft: index !== 0 ? "24px" : "0px" }}
604
+ />
605
+ ))}
606
+ </div>
607
+ </Notification.Body.Content>
608
+ </Notification.Body>
609
+ <Notification.Close onClick={() => {}} />
610
+ </Notification>
611
+ </div>
612
+
613
+ <div>
614
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Filled</h3>
615
+ <Notification withExtraBottomPadding>
616
+ <Notification.Body>
617
+ <Notification.Body.Header>Оцените оформление кредита</Notification.Body.Header>
618
+ <Notification.Body.Content>
619
+ <div>Оцените, насколько удобным был процесс оформления недавно полученого кредита.</div>
620
+ <div style={{ display: "flex", justifyContent: "center", marginTop: "16px" }}>
621
+ {Array.from({ length: 5 }).map((_, index) => (
622
+ <StarStrokeSrvIcon32
623
+ key={index}
624
+ paletteIndex={0}
625
+ style={{ marginLeft: index !== 0 ? "24px" : "0px" }}
626
+ />
627
+ ))}
628
+ </div>
629
+ <TextField
630
+ className="notificationBodyTextArea"
631
+ status={EFormFieldStatus.DEFAULT}
632
+ inputProps={{
633
+ value: value,
634
+ onChange: handleChange,
635
+ }}
636
+ label={"Как мы можем улучшить сервис?"}
637
+ />
638
+ </Notification.Body.Content>
639
+ <Notification.Body.Footer>
640
+ <Button theme={EButtonTheme.SECONDARY} size={EComponentSize.SM}>
641
+ Отправить
642
+ </Button>
643
+ </Notification.Body.Footer>
644
+ </Notification.Body>
645
+ <Notification.Close onClick={() => {}} />
646
+ </Notification>
647
+ </div>
648
+
649
+ <div>
650
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Error</h3>
651
+ <Notification withExtraBottomPadding>
652
+ <Notification.Body>
653
+ <Notification.Body.Header>Оцените оформление кредита</Notification.Body.Header>
654
+ <Notification.Body.Content>
655
+ <div>Оцените, насколько удобным был процесс оформления недавно полученого кредита.</div>
656
+ <div style={{ display: "flex", justifyContent: "center", marginTop: "16px" }}>
657
+ {Array.from({ length: 5 }).map((_, index) => (
658
+ <StarStrokeSrvIcon32
659
+ key={index}
660
+ paletteIndex={0}
661
+ style={{ marginLeft: index !== 0 ? "24px" : "0px" }}
662
+ />
663
+ ))}
664
+ </div>
665
+ <CheckboxYGroup
666
+ aria-label="Причины неудовлетворенности"
667
+ className="notificationBodyCheckbox"
668
+ >
669
+ {checkboxes.map((checkboxValue, index) => (
670
+ <Checkbox key={index} name="checkbox-y-group">
671
+ {checkboxValue}
672
+ </Checkbox>
673
+ ))}
674
+ </CheckboxYGroup>
675
+ </Notification.Body.Content>
676
+ <Notification.Body.Footer>
677
+ <Button theme={EButtonTheme.SECONDARY} size={EComponentSize.SM}>
678
+ Отправить
679
+ </Button>
680
+ </Notification.Body.Footer>
681
+ </Notification.Body>
682
+ <Notification.Close onClick={() => {}} />
683
+ </Notification>
684
+ </div>
685
+
686
+ <div>
687
+ <h3 style={{ marginBottom: "16px", fontSize: "18px", fontWeight: "600" }}>Success</h3>
688
+ <Notification withExtraBottomPadding>
689
+ <Notification.Body>
690
+ <div className="finalStatus">
691
+ <SuccessgradientStsIcon96 />
692
+ <Notification.Body.Header>Спасибо за оценку!</Notification.Body.Header>
693
+ <Notification.Body.Content>Ваши отзывы помогают нам стать лучше.</Notification.Body.Content>
694
+ </div>
695
+ </Notification.Body>
696
+ <Notification.Close onClick={() => {}} />
697
+ </Notification>
698
+ </div>
699
+ </div>
700
+ );
701
+ };
702
+ ```
230
703
 
231
- | Дата | Изменение |
232
- |---|---|
233
- | 2026-04-18 | Создан документ |