@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,9 +1,7 @@
1
1
  ---
2
2
  component: MonthYearField
3
- category: Form Controls
4
- figma-node: ""
5
- figma-file: ""
6
- related: [DatePickerExtended, Calendar, TextField, DropdownMobileInput, FormField]
3
+ category: Date components
4
+ related: [DatePickerExtended, MonthYearRange, TextField, Calendar]
7
5
  tokens: []
8
6
  stories: stories/MonthYearField/MonthYearField.stories.tsx
9
7
  version: "1.0"
@@ -13,156 +11,194 @@ version: "1.0"
13
11
 
14
12
  ## Назначение
15
13
 
16
- Поле для выбора **месяца и года** (без числа дня). Built on top of
17
- `DatePickerExtended` c `pickType=monthYearPick`. Превращает строковое
18
- значение ISO-даты (YYYY-MM-DD) в отображение "Mar 2026" в `TextField`,
19
- показывает календарь по клику / Enter / Space, реализует clear-кнопку.
14
+ Поле для выбора месяца и года. Read-only текстовое поле (`TextField`) с иконкой календаря в постфиксе, по клику раскрывающее выпадающий календарь `DatePickerExtended` в режиме выбора месяца (`ECalendarPickType.MONTH_YEAR`). Выбранная дата форматируется и отображается в поле.
20
15
 
21
- Используй когда: нужен month-picker (отчётные периоды, выбор срока).
22
- Для полноценной даты — `DateField`. Для диапазона — `DateRange`/аналог.
16
+ Используй когда: нужно выбрать только месяц и год (без дня), а ввод с клавиатуры не требуется — значение задаётся через календарь.
23
17
 
24
- ---
25
-
26
- ## Файловая структура
27
-
28
- ```text
29
- src/components/MonthYearField/
30
- ├── MonthYearField.tsx # forwardRef, обёртка над DatePickerExtended
31
- ├── MonthYearFieldTarget.tsx # TextField с клик/keyboard → открытие dropdown
32
- ├── MonthYearFieldContext.tsx # { onChange } — для clear в Target
33
- ├── constants.ts # inputMonthYearFormat = "MMM YYYY"
34
- ├── types.ts # IMonthYearFieldProps
35
- ├── utils.ts # MonthYearPickerUtils: parse/validate даты
36
- ├── index.ts # Barrel
37
- └── __tests__/
38
- ```
18
+ Не используй когда: нужен полноценный ввод даты с клавиатуры (`DateField`), выбор диапазона месяцев (`MonthYearRange`) или произвольной даты с днём (`DatePickerExtended` напрямую).
39
19
 
40
20
  ---
41
21
 
42
22
  ## Варианты и props
43
23
 
44
- ### `IMonthYearFieldProps extends Omit<IDatePickerExtendedProps, "pickedDate" | "onDateChange" | "renderTarget" | "renderDropdownHeaderTarget">, Pick<ITextFieldProps, "size" | "status" | "label">`
24
+ `MonthYearField` — обёртка над `DatePickerExtended`, поэтому помимо собственных props принимает все props `DatePickerExtended`, кроме управляемых внутри (`pickedDate`, `onDateChange`, `renderTarget`, `renderDropdownHeaderTarget`), и часть props `TextField` (`size`, `status`, `label`). Остальные неперечисленные props пробрасываются в `DatePickerExtended`.
45
25
 
46
- | Prop | Тип | Default | Описание |
47
- |---|---|---|---|
48
- | `value` | `string` | — (обязателен) | ISO-дата (формата `format`), например `"2026-04-01"`. |
49
- | `onChange` | `(value: string) => void` | — (обязателен) | Вызывается при выборе нового месяца. Передаётся дата в `format`. |
50
- | `format` | `string` | `dateFormatYYYYMMDD` (`"YYYY-MM-DD"`) | moment-формат для `value`. |
51
- | `limitRange` | `IDateLimitRange` | `globalLimitRange` | Границы доступных дат. |
52
- | `placeholder` | `string` | — | Плейсхолдер input'а. |
53
- | `size` | `EComponentSize` | — | Пробрасывается в TextField. |
54
- | `status` | `EFormFieldStatus` | — | Пробрасывается в TextField (`DISABLED` → readOnly). |
55
- | `label` | `ReactNode` | — | Label TextField'а. |
56
- | `targetProps` | `ITextFieldProps` | — | Дополнительные props TextField. `inputProps` мержатся с внутренними. |
57
- | `...DatePickerExtended-props` | — | — | Все остальные, кроме исключённых. |
26
+ ### Обязательные props
58
27
 
59
- **Исключены из `IDatePickerExtendedProps`**: `pickedDate`, `onDateChange`, `renderTarget`, `renderDropdownHeaderTarget` — они управляются внутренне.
28
+ | Prop | Тип | Описание |
29
+ |---|---|---|
30
+ | `value` | `string` | Значение даты в формате `format`. Пустая строка — поле очищено. Невалидное значение или дата вне `limitRange` отображаются как пустое поле. |
31
+ | `onChange` | `(value: string) => void` | Вызывается при выборе даты в календаре. Аргумент — строка даты в формате `format`. |
60
32
 
61
- ### Внутренние формирующие константы
33
+ ### Опциональные props
62
34
 
63
- - `inputMonthYearFormat = "MMM YYYY"` — как показывается в TextField (moment-format).
64
- - `ECalendarPickType.monthYearPick` — `pickType` DatePickerExtended.
35
+ | Prop | Тип | По умолчанию | Описание |
36
+ |---|---|---|---|
37
+ | `size` | `EComponentSize` | `MD` (в target) | Размер поля: SM / MD / LG. Определяет и размер иконки календаря. |
38
+ | `status` | `EFormFieldStatus` | `default` | Статус поля: default / error / warning / disabled. `disabled` блокирует поле и кнопку календаря. |
39
+ | `label` | `ReactNode` | — | Лейбл поля (проброс в `TextField`). |
40
+ | `placeholder` | `string` | — | Текст подсказки, когда значение пустое. |
41
+ | `format` | `string` | `dateFormatYYYYMMDD` (`"YYYYMMDD"`) | Формат парсинга/сериализации `value`. На отображение НЕ влияет — в поле всегда показывается формат `"MMM YYYY"`. |
42
+ | `limitRange` | `IDateLimitRange` | `globalLimitRange` | Допустимый диапазон дат. Значение вне диапазона трактуется как пустое. |
43
+ | `onClear` | `MouseEventHandler<HTMLButtonElement>` | — | Если передан — в постфиксе появляется кнопка очистки. Реальную очистку значения выполняет потребитель. |
44
+ | `targetProps` | `ITextFieldProps` | — | Дополнительные props для внутреннего `TextField` (postfix, description, inputProps и т.д.). `inputProps.value`, `placeholder`, `readOnly` устанавливаются компонентом, но могут быть переопределены через `targetProps.inputProps`. |
65
45
 
66
- ---
46
+ ### Особенности отображения
67
47
 
68
- ## Ключевые особенности реализации
48
+ - Отображаемая строка в поле формируется по фиксированному формату `inputMonthYearFormat = "MMM YYYY"` (`constants.ts`), независимо от `format`. `format` управляет только парсингом `value` и аргументом `onChange`.
49
+ - Поле всегда `readOnly` — ввод значения возможен только выбором в календаре.
69
50
 
70
- ### Внутренний state `pickerValues`
51
+ ---
71
52
 
72
- ```ts
73
- const [pickerValues, setPickerValues] = useState(
74
- MonthYearPickerUtils.getPickerValues(value, format, limitRange)
75
- );
76
- ```
53
+ ## Дизайн-токены
77
54
 
78
- - `pickerValues = { inputString: "Mar 2026", calendarDate: moment }` — два представления одной даты.
79
- - Синхронизируется с `value` через `useEffect(() => { if (newInputString !== current) setPickerValues(...) })` — обновление только при реальном изменении строки.
55
+ Собственных CSS-токенов нет. Внешний вид наследуется от `TextField`, `ButtonIcon`, `FormFieldClear` и `Calendar`/`DatePickerExtended`.
80
56
 
81
- ### `MonthYearPickerUtils.getPickerValues`
57
+ ---
82
58
 
83
- ```ts
84
- if (value.length === 0) return { calendarDate: null, inputString: "" };
85
- const date = moment(value, format, true); // strict
86
- if (!valid || outsideRange) return { calendarDate: null, inputString: "" };
87
- return { calendarDate: date, inputString: date.format(inputMonthYearFormat) };
88
- ```
59
+ ## Инварианты
89
60
 
90
- - **Strict-парсинг** (третий аргумент `true`) — формат должен совпадать один-в-один.
91
- - Выход за `limitRange` → `null` calendar date + пустая строка в input'е. **Невалидное значение воспринимается как отсутствующее** — потребитель не получит обратный callback.
61
+ - `forwardRef` на компоненте — не убирать. Ref пробрасывается в `DatePickerExtended` (корневой DOM-элемент — элемент `DatePickerExtended`).
62
+ - Публичный API (`IMonthYearFieldProps`: `value`, `onChange`, `onClear`, `targetProps`, `placeholder` + унаследованные `size`/`status`/`label` и props `DatePickerExtended`) — изменение имён/типов/значений — breaking change.
63
+ - Поле read-only по контракту — не делать его редактируемым без обсуждения (компонент не имеет логики валидации клавиатурного ввода).
64
+ - Отображаемый формат `"MMM YYYY"` зафиксирован в `inputMonthYearFormat`; менять его — визуальный breaking change для потребителей.
65
+ - Sync-эффект в `MonthYearField.tsx` (`useEffect` по `[value, format, limitRange]` с `eslint-disable react-hooks/exhaustive-deps`) — намеренная синхронизация derived-стейта `pickerValues` с внешним `value`. Не переписывать без анализа поведения: сравнение идёт по `inputString`, чтобы не сбрасывать стейт при эквивалентных значениях.
66
+ - Внутренние символы `MonthYearPickerUtils` (`utils.ts`), `MonthYearFieldContext`, `MonthYearFieldTarget` не экспортируются через barrel — это приватные детали реализации.
92
67
 
93
- ### `MonthYearFieldContext` — только для `onChange`
68
+ ---
94
69
 
95
- Нужен, чтобы `FormFieldClear` (внутри Target'а) мог вызвать `onChange("")` без prop-drilling через `renderTarget`.
70
+ ## Accessibility
96
71
 
97
- ### `MonthYearFieldTarget` — Enter/Space → открыть dropdown
72
+ - Триггер — текстовое поле `TextField` с `readOnly`. Открытие/закрытие календаря по клику и по клавишам `Enter` / `Space` (с `preventDefault` для `Space`, чтобы не скроллить страницу). Обработчики в `MonthYearFieldTarget`.
73
+ - Кнопка иконки календаря — `ButtonIcon` с `role="presentation"` и `tabIndex={-1}`: она не попадает в таб-обход (фокус остаётся на поле), клик дублирует открытие календаря.
74
+ - Состояние `disabled` (`status === EFormFieldStatus.DISABLED`) блокирует и поле, и кнопку календаря.
75
+ - ARIA-роль выпадающего календаря (`dialog`) и навигация по нему — на стороне `DatePickerExtended` / `Calendar`.
98
76
 
99
- ```ts
100
- handleInputKeyDown: isKey(event.code, "ENTER") → toggleDropdown;
101
- isKey(event.code, "SPACE") → preventDefault + toggleDropdown;
102
- ```
77
+ ---
78
+
79
+ ## Связанные компоненты
103
80
 
104
- - Клик по input'у — тоже toggleDropdown.
105
- - Input всегда `readOnly` (выбор только через календарь).
106
- - В postfix'е — `FormFieldClear` + `ButtonIcon` с иконкой календаря. Иконка меняется по `size`: `CalendarStrokeSrvIcon16` (SM) / `CalendarStrokeSrvIcon20` (MD/LG).
81
+ - `DatePickerExtended` — родительский компонент выпадающего календаря; `MonthYearField` конфигурирует его в режим `MONTH_YEAR` через render-props.
82
+ - `MonthYearRange` — выбор диапазона месяцев; использует `MonthYearField` как поля «от» и «до».
83
+ - `TextField` — внутреннее поле-триггер.
84
+ - `MonthYearFieldTarget` (внутренний, не в barrel) — рендерит `TextField` с иконкой календаря и кнопкой очистки, обрабатывает клик/клавиатуру для открытия дропдауна. Описан здесь, отдельного AI.md не имеет.
85
+ - `MonthYearFieldContext` (внутренний, не в barrel) — прокидывает `onChange` в target; тривиальный контекст без своей логики.
86
+ - `MonthYearPickerUtils` (`utils.ts`, внутренний) — чистые функции парсинга/валидации даты (`getPickerValues`, `getCalendarDate`, `isAvailableDate`). Покрыты `__tests__/utils.test.tsx`.
107
87
 
108
- ### Fallback на `dateFormatYYYYMMDD` и `globalLimitRange`
88
+ ---
109
89
 
110
- Если потребитель не передал `format`/`limitRange`, используются глобальные из `consts/DateConst`. Ожидается, что сам проект задаёт эти константы.
90
+ ## Stories
111
91
 
112
- ### `DropdownMobileInput` как header-target для мобильного dropdown'а
92
+ Основные истории: `stories/MonthYearField/MonthYearField.stories.tsx`
93
+ Файлы примеров: `stories/MonthYearField/examples/`
113
94
 
114
- На mobile (в `DatePickerExtended`) вместо TextField'а рендерится упрощённый input.
95
+ | Story | Example file | Что демонстрирует |
96
+ |---|---|---|
97
+ | `Playground` | `PlaygroundExample.tsx` | Интерактивный контроль size / status / label / placeholder + настройки postfix и description |
98
+ | `Default` | `DefaultExample.tsx` | Минимальное поле с label и placeholder |
99
+ | `Sizes` | `SizesExample.tsx` | Размеры SM / MD / LG |
100
+ | `Statuses` | `StatusesExample.tsx` | Статусы default / disabled / error / warning |
101
+ | `Production` (`Example: production`) | `ProductionExample.tsx` | Production-композиция: postfix `HelpBox`, description со ссылкой, кнопка очистки и фокус на input |
102
+ | `VisualTests` | `VisualTestsExample.tsx` | Скриншот-регрессия: все размеры (пустые/заполненные), статусы, поле с очисткой и постфиксом |
103
+ | `VisualTestsOpen` | `VisualTestsOpenExample.tsx` | Скриншот-регрессия раскрытого состояния: dropdown с календарём открывается через `play` |
115
104
 
116
105
  ---
117
106
 
118
- ## Инварианты
107
+ ## История изменений
119
108
 
120
- - **`value: string` в `format`** — контракт. Не переключать на `Date`/`moment.Moment` без миграции.
121
- - **Strict moment-parsing** — пустая/невалидная строка → `""` в UI. Потребитель должен синхронизировать невалидные значения сам.
122
- - **`limitRange` — hard-clamp**: дата вне диапазона → пустое значение.
123
- - **`MonthYearFieldContext` shape** (`{ onChange }`) — публичная точка расширения, не менять.
124
- - **`inputMonthYearFormat = "MMM YYYY"`** — display-формат, не i18n-аизрован (moment уже локализован через global moment.locale, но формат-строка фиксирована).
125
- - **`pickType=monthYearPick`** — контракт с DatePickerExtended. Изменение — breaking.
126
- - **`targetProps.inputProps` мержатся** с внутренним `{ value, placeholder, readOnly }` — потребитель может переопределить.
127
- - **ForwardRef<HTMLDivElement>** на корневую node DatePickerExtended.
109
+ | Дата | Изменение |
110
+ |---|---|
111
+ | 2026-06-16 | Создан документ. AI-рефакторинг (JSDoc-фиксы), unit-тесты для `utils.ts`, story `VisualTests` и включение скриншот-тестов |
112
+ | 2026-06-16 | Добавлена story `VisualTestsOpen` — скриншот раскрытого dropdown с календарём (через `play`) |
128
113
 
129
114
  ---
130
115
 
131
- ## Accessibility
116
+ ## Примеры использования
132
117
 
133
- - Input `readOnly` — фокусируется, но не редактируется. Открытие: Enter / Space / click.
134
- - **`<button>` с иконкой** (ButtonIcon) — `role="presentation"` и `tabIndex={-1}` — **не в tab-последовательности** (основной target — input). Дизайн-решение, чтобы не дублировать Tab-остановки.
135
- - `FormFieldClear` — стандартная кнопка очистки (см. FormField-AI).
136
- - Нет `aria-label` на иконке календаря — потребитель должен добавить через `targetProps` при необходимости.
118
+ ### Default
137
119
 
138
- ---
120
+ `stories/MonthYearField/examples/DefaultExample.tsx`
139
121
 
140
- ## Дизайн-токены
122
+ ```tsx
123
+ import React, { useState } from "react";
124
+ import { MonthYearField } from "@sberbusiness/triplex-next";
141
125
 
142
- Нет собственных — наследуются от `TextField` и `Calendar`.
126
+ export const DefaultExample = () => {
127
+ const [value, setValue] = useState("");
143
128
 
144
- ---
129
+ return (
130
+ <div style={{ maxWidth: 300 }}>
131
+ <MonthYearField value={value} placeholder="мм.гггг" label="Label" onChange={setValue} />
132
+ </div>
133
+ );
134
+ };
135
+ ```
145
136
 
146
- ## Связанные компоненты
137
+ ### Sizes
147
138
 
148
- - `DatePickerExtended` — основа логики (dropdown, popup, mobile-variant).
149
- - `Calendar` — сам календарь (`pickType=monthYearPick` — режим месяца).
150
- - `TextField` — визуальный target.
151
- - `FormField.Clear` — кнопка очистки.
152
- - `ButtonIcon` — кнопка календаря в postfix.
153
- - `moment.js` — парсинг/форматирование (peerDependency в библиотеке).
139
+ `stories/MonthYearField/examples/SizesExample.tsx`
154
140
 
155
- ---
141
+ ```tsx
142
+ import React, { useState } from "react";
143
+ import { MonthYearField, EComponentSize } from "@sberbusiness/triplex-next";
156
144
 
157
- ## Stories
145
+ interface ISizeItemProps {
146
+ size: EComponentSize;
147
+ }
158
148
 
159
- `stories/MonthYearField/MonthYearField.stories.tsx`
160
- Примеры: `stories/MonthYearField/examples/`
149
+ const SizeItem = ({ size }: ISizeItemProps) => {
150
+ const [value, setValue] = useState<string>("");
161
151
 
162
- ---
152
+ return (
153
+ <div style={{ maxWidth: 300 }}>
154
+ <div style={{ marginBottom: 8, fontSize: 16, fontWeight: 700 }}>{size.toUpperCase()}</div>
155
+ <MonthYearField size={size} value={value} label="Label" placeholder="мм.гггг" onChange={setValue} />
156
+ </div>
157
+ );
158
+ };
163
159
 
164
- ## История изменений
160
+ const SIZES = Object.values(EComponentSize);
161
+
162
+ export const SizesExample = () => (
163
+ <div style={{ display: "flex", flexDirection: "column", gap: 16 }}>
164
+ {SIZES.map((size) => (
165
+ <SizeItem key={size} size={size} />
166
+ ))}
167
+ </div>
168
+ );
169
+ ```
170
+
171
+ ### Statuses
172
+
173
+ `stories/MonthYearField/examples/StatusesExample.tsx`
174
+
175
+ ```tsx
176
+ import React, { useState } from "react";
177
+ import { MonthYearField, EFormFieldStatus } from "@sberbusiness/triplex-next";
178
+
179
+ interface IStatusItemProps {
180
+ status: EFormFieldStatus;
181
+ }
182
+
183
+ const StatusItem = ({ status }: IStatusItemProps) => {
184
+ const [value, setValue] = useState<string>("");
185
+
186
+ return (
187
+ <div style={{ maxWidth: 300 }}>
188
+ <div style={{ marginBottom: 8, fontSize: 16, fontWeight: 700 }}>{status.toUpperCase()}</div>
189
+ <MonthYearField status={status} value={value} label="Label" placeholder="мм.гггг" onChange={setValue} />
190
+ </div>
191
+ );
192
+ };
193
+
194
+ const STATUSES = Object.values(EFormFieldStatus);
195
+
196
+ export const StatusesExample = () => (
197
+ <div style={{ display: "flex", flexDirection: "column", gap: 16 }}>
198
+ {STATUSES.map((status) => (
199
+ <StatusItem key={status} status={status} />
200
+ ))}
201
+ </div>
202
+ );
203
+ ```
165
204
 
166
- | Дата | Изменение |
167
- |---|---|
168
- | 2026-04-18 | Создан документ |