@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,9 +1,7 @@
1
1
  ---
2
2
  component: MarkerStatus
3
- category: Feedback
4
- figma-node: ""
5
- figma-file: ""
6
- related: [Marker, Badge, Typography]
3
+ category: MarkerStatus
4
+ related: [TagColor, Marker, Text, Caption]
7
5
  tokens: []
8
6
  stories: stories/MarkerStatus/MarkerStatus.stories.tsx
9
7
  version: "1.0"
@@ -13,131 +11,178 @@ version: "1.0"
13
11
 
14
12
  ## Назначение
15
13
 
16
- Статус-блок: цветная точка (`Marker`) + заголовок (`children`) + опциональное
17
- описание. Окрашивает **текст заголовка/описания** цветом статуса через
18
- общий `statusToClassNameMap` (из `Marker/utils`). Два размера — MD / LG.
14
+ Неинтерактивная подпись состояния: цветная точка-маркер слева, наименование статуса
15
+ справа и необязательное описание под наименованием. Собственного состояния, логики и
16
+ обработчиков нет — компонент собирает разметку из трёх частей и раздаёт классы по
17
+ `size` и `status`.
19
18
 
20
- Используй когда: нужна компактная семантическая индикация состояния с
21
- подписью (успех операции, ошибка, pending). Для просто точки без текста —
22
- `Marker`. Для статуса-пилюли с фоном — `TagColor`.
19
+ Используй когда: нужно показать статус объекта в списке, таблице или карточке
20
+ («Исполнен», «Отклонён», «Ожидает подписи»), при необходимости с пояснением под
21
+ наименованием — датой, суммой, причиной отказа.
23
22
 
24
- ---
25
-
26
- ## Файловая структура
27
-
28
- ```text
29
- src/components/MarkerStatus/
30
- ├── MarkerStatus.tsx # FC, div + Marker + Text/Caption
31
- ├── index.ts # Barrel
32
- ├── styles/MarkerStatus.module.less # Цвета текста по статусу, размерные варианты
33
- └── __tests__/MarkerStatus.test.tsx
34
- ```
23
+ Не используй когда:
24
+ - Нужен интерактивный элемент (клик, фокус, клавиатура) — возьми `Chip` или `Button`.
25
+ - Нужна только точка без подписи — `Marker` (или `Badge.Dot`, если статусная палитра
26
+ не нужна).
27
+ - Нужен статус на цветной подложке — `TagColor` или `Badge`.
28
+ - Нужен многошаговый прогресс процесса — `StatusTracker`, он строит цепочку шагов и
29
+ использует `MarkerStatus` внутри (`StatusTracker.Body.Status`).
35
30
 
36
31
  ---
37
32
 
38
33
  ## Варианты и props
39
34
 
40
- ### `IMarkerStatusProps extends HTMLAttributes<HTMLDivElement>`
41
-
42
- | Prop | Тип | Default | Описание |
43
- |---|---|---|---|
44
- | `status` | `EMarkerStatus` (`SUCCESS`/`ERROR`/`WARNING`/`WAITING`) | — | Обязателен. Цвет точки и текста. |
45
- | `children` | `ReactNode` | — | Заголовок (основной текст статуса). Рендерится в `Text size=B4` (MD) / `B3` (LG). |
46
- | `description` | `ReactNode` | — | Доп. описание под заголовком. MD — `Caption C1 SECONDARY`; LG — `Text B4 SECONDARY`. |
47
- | `size` | `EComponentSize.MD \| EComponentSize.LG` | `MD` | **Ограниченный enum-subset** — нет `SM`. |
48
-
49
- ---
35
+ `IMarkerStatusProps extends React.HTMLAttributes<HTMLDivElement>`: любой стандартный
36
+ атрибут `<div>` (`id`, `role`, `aria-*`, `data-*`, `style`, обработчики) уходит на
37
+ корневой элемент через `...rest`. `className` объединяется с базовыми классами через
38
+ `clsx`, а не заменяет их.
50
39
 
51
- ## Ключевые особенности реализации
52
-
53
- ### Размер = `EComponentSize.MD | EComponentSize.LG`
54
-
55
- ```ts
56
- size?: EComponentSize.MD | EComponentSize.LG;
57
- ```
40
+ ### Обязательные props
58
41
 
59
- - **SM запрещён на уровне типа**. Если передать `SM` — TS ошибка. Для runtime-значения — визуал не определён.
60
- - Если появится требование SM — добавить маппинги `sizeToClassNameMap`, `markerStatusSizeToTextSizeMap` и LESS-стиль.
42
+ | Prop | Тип | Описание |
43
+ |---|---|---|
44
+ | `status` | `EMarkerStatus` | `SUCCESS` / `ERROR` / `WARNING` / `WAITING`. Задаёт цвет точки-маркера. Enum объявлен в `src/components/Marker/enums.ts` и экспортируется из barrel `Marker` |
61
45
 
62
- ### `size` пробрасывается в `Marker` (Badge.Dot)
46
+ ### Опциональные props
63
47
 
64
- ```tsx
65
- <Marker status={status} size={size} />
66
- ```
48
+ | Prop | Тип | По умолчанию | Описание |
49
+ |---|---|---|---|
50
+ | `size` | `EComponentSize.MD \| EComponentSize.LG` | `EComponentSize.MD` | Размер маркера, типографики и отступов. `EComponentSize.SM` не поддерживается — union сужен намеренно, класса `sm` в стилях нет |
51
+ | `children` | `React.ReactNode` | — | Наименование статуса. Всегда оборачивается в `Text` (`B4` для MD, `B3` для LG) — обёртка рендерится даже при пустом значении |
52
+ | `description` | `React.ReactNode` | — | Описание под наименованием. Для MD — `Caption` `C1`, для LG — `Text` `B4`; в обоих случаях `type={EFontType.SECONDARY}` |
67
53
 
68
- - Marker получает `size` через `...IBadgeDotProps` — `Badge.Dot` сам определяет, как размер влияет на диаметр точки.
54
+ ### Размеры
69
55
 
70
- ### Маппинг размера → typography-размер
56
+ | | MD | LG |
57
+ |---|---|---|
58
+ | Наименование | `Text` `B4` | `Text` `B3` |
59
+ | Описание | `Caption` `C1` | `Text` `B4` |
60
+ | Диаметр точки | 8px (`Badge.Dot` MD) | 10px (`Badge.Dot` LG) |
61
+ | Отступ маркер → текст | 4px | 6px |
62
+ | Отступ наименование → описание | 0 | 4px |
63
+ | Верхний отступ маркера | 4px | 5px |
71
64
 
72
- ```ts
73
- const markerStatusSizeToTextSizeMap = {
74
- [EComponentSize.MD]: ETextSize.B4,
75
- [EComponentSize.LG]: ETextSize.B3,
76
- };
77
- ```
65
+ Верхний отступ маркера — оптическое выравнивание точки по первой строке
66
+ наименования, значения подобраны под конкретные высоты строк типографики. При смене
67
+ размеров текста их нужно пересчитывать.
78
68
 
79
- - MD → B4, LG → B3. Публичный контракт (визуальная спецификация).
69
+ ### Falsy-значения `description`
80
70
 
81
- ### `description` — разный компонент по размеру
71
+ Описание рендерится по truthy-проверке (`description && ...`). Поэтому
72
+ `description=""` и `description={false}` не выводят ни текста, ни обёртки, а
73
+ `description={0}` выводит голый `0` мимо `Caption` / `Text` — без вторичного цвета и
74
+ размера. Для числовых значений передавай строку. Это исторически сложившееся
75
+ поведение; менять его — задача с записью в release notes.
82
76
 
83
- ```tsx
84
- size === EComponentSize.MD
85
- ? <Caption size={C1} type={SECONDARY}>{description}</Caption>
86
- : <Text size={B4} type={SECONDARY}>{description}</Text>
87
- ```
77
+ ---
88
78
 
89
- - **MD → Caption (C1)**, **LG → Text (B4 SECONDARY)**. Меньшая строка (Caption) в меньшем размере.
90
- - `type=SECONDARY` — приглушённый цвет.
79
+ ## Дизайн-токены
91
80
 
92
- ### Цвет текста — через `statusToClassNameMap` из Marker/utils
81
+ Собственных токенов в стилях компонента нет: `styles/MarkerStatus.module.less`
82
+ задаёт только раскладку (flex, отступы, выравнивание). Цвета приходят из вложенных
83
+ компонентов и переопределяются через их группы токенов — см. `ThemeProvider-ai.md` →
84
+ «Как переопределять токены».
93
85
 
94
- ```tsx
95
- <div className={clsx(styles.markerStatus, sizeToClassNameMap[size], statusToClassNameMap[status], className)}>
86
+ ```text
87
+ Marker.Background_Success
88
+ Marker.Background_Error
89
+ Marker.Background_Warning
90
+ Marker.Background_Waiting
91
+ Typography.Secondary_Color
96
92
  ```
97
93
 
98
- - **Переиспользование** CSS-Modules класса из `Marker/styles` — заложена **кросс-файловая зависимость**: `Marker/utils.ts` импортирует `Marker.module.less`. Если стили MarkerStatus переопределяют цвет текста, то они опираются на то, что корневой класс `.success/.error/...` уже задан.
94
+ - Цвет точки — токены группы `Marker` (`src/components/DesignTokens/components/Marker.ts`),
95
+ применяются внутри `Marker`.
96
+ - Цвет наименования — `Typography.Primary_Color` (дефолтный `EFontType.PRIMARY`),
97
+ цвет описания — `Typography.Secondary_Color` (`EFontType.SECONDARY`).
98
+
99
+ **Известное расхождение:** группа `MarkerStatus` в
100
+ `src/components/DesignTokens/components/MarkerStatus.ts` объявляет токен
101
+ `MarkerStatus.Description_Color`, но ни один LESS-файл его не читает — описание
102
+ красится через типографику. Токен остался от прежней реализации, его переопределение
103
+ через `ThemeProvider` ни на что не влияет. Удаление токена и его css-переменной —
104
+ изменение публичного API, делается отдельной задачей с записью в release notes
105
+ (прецедент — `ImageGallery.Arrow_*_Disabled` в 1.45.0). Поэтому во frontmatter
106
+ `tokens:` он не перечислен: список описывает токены, которые компонент реально
107
+ использует.
99
108
 
100
109
  ---
101
110
 
102
111
  ## Инварианты
103
112
 
104
- - **`status` обязателен** — без него семантика теряется.
105
- - **`size: MD | LG`** — тип-ограниченный subset `EComponentSize`. Расширение — breaking для потребителей, проверяющих тип.
106
- - **Маппинг размера → typography** (B4/B3 для заголовка; C1/B4 для описания) — зафиксирован в коде, публичная визуальная спецификация.
107
- - **Использует `Marker/utils.statusToClassNameMap`** — изменение shape в Marker сломает MarkerStatus.
108
- - **FC, не forwardRef** — ref вовне не прокидывается. Legacy.
109
- - **`data-tx={npm_package_version}`** — маркер версии. Сохранять.
113
+ - **`forwardRef`** — ref пробрасывается на корневой `<div>`; не убирать.
114
+ - **Корневой элемент — `<div>`** с классами `markerStatus` + размер + статус. Внутри
115
+ ровно две обёртки: `markerContainer` (точка) и `contentContainer` (наименование и
116
+ описание). На эту структуру опираются unit-тесты; `StatusTrackerStatus` дописывает
117
+ корневому элементу свой класс `statusTrackerStatus`.
118
+ - **Классы статуса на корне приходят из CSS-модуля `Marker`** —
119
+ `STATUS_TO_CLASS_NAME_MAP` импортируется из `src/components/Marker/utils.ts`, где
120
+ правила объявлены как `.marker.success` и т.п. На корне `MarkerStatus` эти классы
121
+ визуального эффекта не дают, но присутствуют в разметке и проверяются unit-тестами
122
+ (`toHaveClass("success")`). Не удалять без согласования: класс виден потребителю в
123
+ DOM.
124
+ - **`size` сужен до `MD | LG`.** Расширение до полного `EComponentSize` требует
125
+ класса `sm` в стилях, размеров типографики и верхнего отступа маркера — это новая
126
+ функциональность, а не рефакторинг.
127
+ - **`data-tx` ставится после `...restProps`** — потребитель не может переопределить
128
+ метку версии пакета. Порядок атрибутов в JSX менять нельзя, на это есть тест.
129
+ - **`displayName`** — `MarkerStatus`; виден в React DevTools.
130
+ - **`IMarkerStatusProps` — часть публичного API `StatusTracker`:**
131
+ `StatusTrackerStatus` типизирован как `React.FC<IMarkerStatusProps>`
132
+ (`src/components/StatusTracker/components/StatusTrackerStatus.tsx`). Любое изменение
133
+ формы интерфейса автоматически меняет публичный API `StatusTracker.Body.Status`.
110
134
 
111
135
  ---
112
136
 
113
137
  ## Accessibility
114
138
 
115
- - `<div>` — без ARIA-роли. Статус должен читаться скринридером через **текст в children**. Не полагайся только на цвет.
116
- - Если children тоже визуально отражает статус (например, "Ошибка"), и нужна дополнительная семантика — добавь `role="status"` через `...rest` или оборачивай MarkerStatus в live region.
117
- - Цвет текста — только как визуальный акцент. WCAG-контраст контролируется токенами `SECONDARY`/статус-цветами; при кастомных темах — проверить.
118
-
119
- ---
120
-
121
- ## Дизайн-токены
122
-
123
- Нет публичных переменных компонента; цвета текста статусов заданы в
124
- `styles/MarkerStatus.module.less`. Цвет точки — через `Marker`.
139
+ - Компонент неинтерактивен: не получает фокус, не обрабатывает клавиатуру, ролей и
140
+ aria-атрибутов не выставляет. Смысл статуса несёт текст в `children`, поэтому для
141
+ скринридера подпись читается как обычный текст.
142
+ - **Точка-маркер не имеет доступного имени** — это чисто визуальное дублирование
143
+ статуса, продублированное текстом рядом. Отдельная подпись ей не нужна.
144
+ - Если статус меняется динамически (например, документ переходит из «Ожидает» в
145
+ «Исполнен») и об этом нужно сообщить скринридеру — потребитель сам передаёт
146
+ `role="status"` или `aria-live` через `...rest`. Компонент их не выставляет.
147
+ - Строки на конкретном языке компонент не хардкодит — весь текст приходит от
148
+ потребителя.
125
149
 
126
150
  ---
127
151
 
128
152
  ## Связанные компоненты
129
153
 
130
- - `Marker` — цветная точка; то же `EMarkerStatus` и `statusToClassNameMap`.
131
- - `Badge.Dot` — база для Marker.
132
- - `Typography` (`Text`, `Caption`) — для заголовка и описания.
133
- - `TagColor` — альтернатива с фоном-пилюлей.
154
+ - `Marker` (`src/components/Marker/Marker.tsx`) — точка со статусной палитрой,
155
+ рендерится внутри `MarkerStatus`; из его CSS-модуля берётся и `STATUS_TO_CLASS_NAME_MAP`
156
+ для корневого элемента.
157
+ - `Text`, `Caption` — типографика наименования и описания; размеры и `EFontType`
158
+ выбираются по `size`.
159
+ - `Badge` — не альтернатива и не прямая зависимость `MarkerStatus`: он решает другой
160
+ класс задач (статус на цветной подложке, счётчик), а в цепочку рендера попадает
161
+ через `Marker`, который построен на `Badge.Dot`. Поэтому во `related` не вынесен.
162
+ - `TagColor` — альтернатива, когда статус показывается цветным тегом.
163
+ - `StatusTracker` — потребитель: `StatusTracker.Body.Status` (`StatusTrackerStatus`)
164
+ оборачивает `MarkerStatus`, добавляя свой класс, и переиспользует `IMarkerStatusProps`.
165
+ Обёртка объявлена как `React.FC`, то есть ref до `MarkerStatus` через неё не доходит.
134
166
 
135
167
  ---
136
168
 
137
169
  ## Stories
138
170
 
139
- `stories/MarkerStatus/MarkerStatus.stories.tsx`
140
- Примеры: `stories/MarkerStatus/examples/`
171
+ Основные истории: `stories/MarkerStatus/MarkerStatus.stories.tsx`
172
+ Файлы примеров: `stories/MarkerStatus/examples/`
173
+
174
+ | Story | Example file | Что демонстрирует |
175
+ |---|---|---|
176
+ | `Playground` | — | Интерактивный подбор `status`, `size`, `description` и текста |
177
+ | `Default` | `DefaultExample.tsx` | Минимальный вызов: `SUCCESS`, размер MD, описание |
178
+ | `Statuses` | `StatusesExample.tsx` | Все четыре статуса в размере MD |
179
+ | `Sizes` | `SizesExample.tsx` | Статусы в размерах MD и LG |
180
+
181
+ Скриншот-регрессия снимается со стори `Statuses` и `Sizes`
182
+ (`__screenshots__/markerstatus--statuses--xs|xl.png`,
183
+ `__screenshots__/markerstatus--sizes--xs|xl.png`). `Playground` и `Default` исключены
184
+ через `testRunner: { skip: true }`: первый — интерактивная песочница, второй полностью
185
+ покрыт стори `Sizes`.
141
186
 
142
187
  ---
143
188
 
@@ -145,4 +190,77 @@ size === EComponentSize.MD
145
190
 
146
191
  | Дата | Изменение |
147
192
  |---|---|
148
- | 2026-04-18 | Создан документ |
193
+ | 2026-09-01 | Создан документ. AI-рефакторинг: добавлен `displayName`, `data-tx` перенесён после `...restProps` (потребитель больше не может его переопределить), в `IMarkerStatusProps` добавлен явный `children` (тип совпадает с унаследованным из `React.HTMLAttributes`), JSDoc на props и компонент, модульные константы приведены к UPPER_SNAKE_CASE, порядок импортов — по `codestyle.md`. Unit-тесты расширены с 4 до 15 кейсов: типографика наименования и описания по размерам, отсутствие описания, `description` как узел, проброс `status` / `size` в `Marker`, мердж `className`, `...rest`, `data-tx`, `ref`, `displayName`. Публичный API, DOM-структура и визуальное поведение не изменены. |
194
+
195
+ ---
196
+
197
+ ## Примеры использования
198
+
199
+ ### Default
200
+
201
+ `stories/MarkerStatus/examples/DefaultExample.tsx`
202
+
203
+ ```tsx
204
+ import React from "react";
205
+ import { MarkerStatus, EMarkerStatus, EComponentSize } from "@sberbusiness/triplex-next";
206
+
207
+ export const DefaultExample = () => (
208
+ <MarkerStatus status={EMarkerStatus.SUCCESS} size={EComponentSize.MD} description="Description">
209
+ Status text
210
+ </MarkerStatus>
211
+ );
212
+ ```
213
+
214
+ ### Statuses
215
+
216
+ `stories/MarkerStatus/examples/StatusesExample.tsx`
217
+
218
+ ```tsx
219
+ import React from "react";
220
+ import { MarkerStatus, EMarkerStatus, EComponentSize } from "@sberbusiness/triplex-next";
221
+
222
+ const STATUSES = Object.values(EMarkerStatus);
223
+
224
+ export const StatusesExample = () => (
225
+ <div style={{ display: "flex", alignItems: "flex-start", gap: "32px", flexWrap: "wrap" }}>
226
+ {STATUSES.map((status) => (
227
+ <div key={status}>
228
+ <div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{status.toUpperCase()}</div>
229
+ <MarkerStatus status={status} size={EComponentSize.MD} description="Description">
230
+ Status text
231
+ </MarkerStatus>
232
+ </div>
233
+ ))}
234
+ </div>
235
+ );
236
+ ```
237
+
238
+ ### Sizes
239
+
240
+ `stories/MarkerStatus/examples/SizesExample.tsx`
241
+
242
+ ```tsx
243
+ import React from "react";
244
+ import { MarkerStatus, EMarkerStatus, EComponentSize } from "@sberbusiness/triplex-next";
245
+
246
+ const STATUSES = Object.values(EMarkerStatus);
247
+ const SIZES = [EComponentSize.MD, EComponentSize.LG] as const;
248
+
249
+ export const SizesExample = () => (
250
+ <div style={{ display: "flex", flexDirection: "column", gap: "32px" }}>
251
+ {SIZES.map((size) => (
252
+ <div key={size}>
253
+ <div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{size.toUpperCase()}</div>
254
+ <div style={{ display: "flex", alignItems: "flex-start", gap: "32px", flexWrap: "wrap" }}>
255
+ {STATUSES.map((status) => (
256
+ <MarkerStatus key={status} status={status} size={size} description="Description">
257
+ Status text
258
+ </MarkerStatus>
259
+ ))}
260
+ </div>
261
+ </div>
262
+ ))}
263
+ </div>
264
+ );
265
+ ```
266
+
@@ -57,7 +57,7 @@ version: "1.0"
57
57
 
58
58
  ## Дизайн-токены
59
59
 
60
- Собственных CSS-токенов и стилей у `MaskedField` нет — поэтому `tokens` во frontmatter пустой. Внешний вид наследуется от семейства `FormField`; слой подсказки маски рисует `FormFieldMaskedInput` своим токеном `--triplex-next-FormField-Placeholder_Color`.
60
+ Собственных CSS-токенов и стилей у `MaskedField` нет — поэтому `tokens` во frontmatter пустой. Внешний вид наследуется от семейства `FormField`; слой подсказки маски рисует `FormFieldMaskedInput` своим токеном `FormField.Placeholder_Color`.
61
61
 
62
62
  ---
63
63
 
@@ -65,7 +65,6 @@ version: "1.0"
65
65
 
66
66
  - `forwardRef` на `MaskedField` — не убирать. Внешний `ref` указывает на корневой `<div>` `FormField`.
67
67
  - Публичный API (`IMaskedFieldProps`: `maskedInputProps` + `label`/`prefix`/`postfix`/`description`/`counter` + унаследованные `size`/`status`/`active`) — изменение имён/типов/значений enum — breaking change.
68
- - Barrel `index.ts` экспортирует `TextField` и `MaskedField` — состав экспортов не менять. `TextFieldBase` намеренно НЕ экспортируется — приватная база.
69
68
  - Ссылка на элемент input передаётся только через `maskedInputProps.forwardedRef`. `maskedInputProps.ref` (`React.RefObject<HTMLDivElement>`) попадает на корневой `<div>` обёртки `FormFieldMaskedInput` — это ref самого `FormFieldMaskedInput`, а не поля ввода.
70
69
  - `maskedInputProps.value` обязателен: `FormFieldMaskedInput` — контролируемый компонент. `defaultValue` исключён из props (`Omit<MaskedInputProps, ... | "defaultValue">`) и не передаётся внутрь `<input>`: `react-text-mask` подставляет его равным `value`, а на контролируемом поле это даёт предупреждение React о смешении controlled и uncontrolled.
71
70
  - Маски и подсказки берутся из `FormFieldMaskedInput.presets` — состав пресетов и их значения часть публичного API.
@@ -85,8 +84,7 @@ version: "1.0"
85
84
 
86
85
  ## Связанные компоненты
87
86
 
88
- - `TextField` — сосед по папке: то же поле, но с обычным `FormFieldInput`. Документируется отдельно.
89
- - `TextFieldBase` (внутренний, не в barrel) — базовая раскладка `FormGroup`/`FormField` + слоты `prefix`/`children`/`label`/`postfix` и блок `description`/`counter`. На нём построены `TextField` и `MaskedField`. Описан в `TextField-ai.md`.
87
+ - `TextFieldBase` — базовая раскладка `FormGroup`/`FormField` + слоты `prefix`/`children`/`label`/`postfix` и блок `description`/`counter`.
90
88
  - `FormFieldMaskedInput` — сам элемент ввода с маской и статическим свойством `presets` (`masks`, `placeholderMasks`). Используется напрямую, когда нужна нестандартная композиция поля.
91
89
  - `FormFieldClear` — кнопка очистки, передаётся в `postfix`.
92
90
  - `FormGroup` / `FormField` — контейнеры раскладки поля и описания.