@sberbusiness/triplex-next-mcp-server 1.41.0-beta → 1.43.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 (41) hide show
  1. package/bundle/components/AlertProcess.md +460 -0
  2. package/bundle/components/Amount.md +145 -169
  3. package/bundle/components/Badge.md +155 -219
  4. package/bundle/components/Body.md +108 -116
  5. package/bundle/components/Button.md +1 -0
  6. package/bundle/components/CarouselExtended.md +355 -194
  7. package/bundle/components/Checkbox.md +7 -1
  8. package/bundle/components/CheckboxTreeExtended.md +149 -248
  9. package/bundle/components/CheckboxXGroup.md +2 -0
  10. package/bundle/components/CheckboxYGroup.md +7 -2
  11. package/bundle/components/ChipGroup.md +195 -126
  12. package/bundle/components/ComposedKeyDownListener.md +323 -0
  13. package/bundle/components/FooterPage.md +2 -1
  14. package/bundle/components/HeaderPage.md +2 -1
  15. package/bundle/components/Island.md +100 -12
  16. package/bundle/components/KeyDownListener.md +11 -72
  17. package/bundle/components/LightBox.md +6 -0
  18. package/bundle/components/LoaderSmall.md +230 -0
  19. package/bundle/components/MaskedField.md +481 -0
  20. package/bundle/components/MediaWidth.md +252 -108
  21. package/bundle/components/MobileView.md +192 -68
  22. package/bundle/components/ModalWindow.md +3 -1
  23. package/bundle/components/Notification.md +21 -3
  24. package/bundle/components/Page.md +3 -1
  25. package/bundle/components/Pagination.md +20 -0
  26. package/bundle/components/SelectExtendedField.md +691 -236
  27. package/bundle/components/SliderExtended.md +358 -222
  28. package/bundle/components/TabsExtended.md +380 -194
  29. package/bundle/components/UnorderedList.md +254 -0
  30. package/bundle/components/UnorderedListExtended.md +255 -0
  31. package/bundle/components/WindowResizeListener.md +249 -0
  32. package/bundle/guides/commits.md +66 -3
  33. package/bundle/guides/context.md +26 -0
  34. package/bundle/guides/stories.md +3 -1
  35. package/bundle/guides/template.md +1 -1
  36. package/bundle/manifest.json +64 -21
  37. package/bundle/release-notes/1.41.1.mdx +18 -0
  38. package/bundle/release-notes/1.42.0.mdx +81 -0
  39. package/bundle/release-notes/1.43.0.mdx +94 -0
  40. package/bundle/release-notes/1.44.0.mdx +7 -0
  41. package/package.json +1 -1
@@ -1,9 +1,7 @@
1
1
  ---
2
2
  component: Badge
3
- category: Badges
4
- figma-node: ""
5
- figma-file: ""
6
- related: [Avatar, Chip, Tag, MarkerStatus]
3
+ category: Badge
4
+ related: [Marker, Chip, DropdownListItem, DropdownMobileListItem, TabsLineItem, TabsExtendedTabButton, Text, Caption]
7
5
  tokens:
8
6
  - --triplex-next-Badge-Background
9
7
  stories: stories/Badge/Badge.stories.tsx
@@ -14,259 +12,197 @@ version: "1.0"
14
12
 
15
13
  ## Назначение
16
14
 
17
- Индикатор статуса или уведомления в виде горизонтальной "таблетки" с опциональным
18
- префиксом, контентом и постфиксом. Имеет три размера (SM / MD / LG), которые
19
- соответствуют общей шкале компонентов библиотеки (`EComponentSize`).
15
+ Небольшой inline-индикатор статуса или уведомления: подпись на цветной подложке
16
+ (`Badge`) либо просто цветная точка (`Badge.Dot`). Собственного состояния и логики нет —
17
+ компонент только собирает разметку из трёх необязательных частей (`prefix` → `children` →
18
+ `postfix`) и раздаёт классы по размеру.
20
19
 
21
- Сопутствующий `Badge.Dot` — точечный вариант (круг) для минималистичных
22
- индикаторов (например, "есть непрочитанное"). Badge и BadgeDot — два независимых
23
- компонента под одним barrel-экспортом.
20
+ Используй когда: нужно пометить объект коротким статусом («Новинка», «Нет данных»),
21
+ показать счётчик уведомлений или поставить точку-индикатор рядом с элементом списка,
22
+ чипсом, пунктом меню.
24
23
 
25
- Используй `Badge` когда: нужна краткая метка статуса/счётчика с текстом или
26
- иконкой ("NEW", "12", "Beta").
27
- Используй `Badge.Dot` когда: нужен просто цветной кружок без текста.
28
- Не используй когда: нужен удаляемый тег с текстом (используй `Chip` или `Tag`);
29
- нужен большой статус-блок с описанием (используй `MarkerStatus`).
30
-
31
- ---
32
-
33
- ## Файловая структура
34
-
35
- ```text
36
- src/components/Badge/
37
- ├── Badge.tsx # React.forwardRef, compound: Badge + Badge.Dot
38
- ├── BadgeDot.tsx # React.forwardRef, отдельный компонент (не subcomponent)
39
- ├── types.ts # IBadgeProps, IBadgeDotProps, IBadgeContentProps
40
- ├── index.ts # Barrel: types + Badge (+ Badge.Dot через compound)
41
- ├── styles/
42
- │ ├── Badge.module.less # Root .badge (SM/MD/LG: height + border-radius)
43
- │ └── BadgeDot.module.less # Root .badgeDot (SM/MD/LG: width+height, border-radius 50%)
44
- ├── components/ # Внутренние subcomponents (не экспортируются)
45
- │ ├── BadgeContent.tsx # React.FC с паддингами по size
46
- │ ├── BadgePrefix.tsx # React.FC, display: contents (не создаёт DOM-слоя)
47
- │ ├── BadgePostfix.tsx # React.FC, display: contents
48
- │ └── styles/
49
- │ ├── BadgeContent.module.less # Паддинги SM=4px / MD=6px / LG=8px + noPaddingLeft/Right
50
- │ ├── BadgePrefix.module.less # display: contents
51
- │ └── BadgePostfix.module.less # display: contents
52
- └── tests/Badge.test.tsx
53
- ```
54
-
55
- Особенности:
56
- - **`Badge` + `Badge.Dot` через `Object.assign`** — compound-паттерн, как у
57
- `AlertProcess`. BadgeDot также экспортирован из `index.ts` (через `./Badge`),
58
- но рекомендуемый путь — через `Badge.Dot`.
59
- - **`prefix`/`postfix` через `display: contents`** — обёртки не добавляют визуального
60
- слоя, являются только семантическими якорями для DOM-тестов.
61
- - **`components/` папка** — прямо не экспортируется, subcomponents видны только Badge.
24
+ Не используй когда:
25
+ - Нужен интерактивный элемент (клик, фокус, клавиатура) — возьми `Chip` или `Button`;
26
+ `Badge` — неинтерактивный `<span>` без семантики и без обработки клавиатуры.
27
+ - Нужен статус со встроенной палитрой (успех / ошибка / предупреждение) — у `Badge`
28
+ один-единственный токен фона, цветовые статусы задаёт потребитель (см. «Цвет и текст»).
29
+ - Нужен индикатор состояния процесса в списке — посмотри `MarkerStatus`, он строится
30
+ на своих статусных токенах.
62
31
 
63
32
  ---
64
33
 
65
34
  ## Варианты и props
66
35
 
67
- ### `IBadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "prefix" | "postfix">`
68
-
69
- **Важно:** `prefix` и `postfix` НЕ стандартные HTML-атрибуты — они переопределены
70
- через `Omit` и изменяют семантику.
71
-
72
- | Prop | Тип | Обязателен | Описание |
73
- |---|---|---|---|
74
- | `size` | `EComponentSize` (`SM`, `MD`, `LG`) | Да | Определяет высоту (16/20/24px), border-radius и внутренние паддинги. |
75
- | `children` | `React.ReactNode` | Нет | Основной контент (текст/иконка/число). Если не передан — рендерится только prefix+postfix. |
76
- | `prefix` | `React.ReactNode` | Нет | Обычно иконка слева. При наличии — у BadgeContent убирается `padding-left`. |
77
- | `postfix` | `React.ReactNode` | Нет | Обычно иконка или мини-кнопка справа. При наличии — у BadgeContent убирается `padding-right`. |
78
- | `className` | `string` | Нет | Объединяется с `styles.badge + sizeClass`. |
79
- | `...HTMLSpanAttributes` | — | — | Всё остальное, кроме `prefix`/`postfix`. |
80
-
81
- ### `IBadgeDotProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "children">`
36
+ Оба компонента расширяют `React.HTMLAttributes<HTMLSpanElement>`: любой стандартный
37
+ атрибут `<span>` (`id`, `data-*`, `style`, обработчики) уходит на корневой элемент
38
+ через `...rest`. `className` объединяется с базовыми классами через `clsx`, а не
39
+ заменяет их.
82
40
 
83
- | Prop | Тип | Обязателен | Описание |
84
- |---|---|---|---|
85
- | `size` | `EComponentSize` | Да | Диаметр точки: SM=6px, MD=8px, LG=10px. |
86
- | `children` | `never` | — | Явно запрещено через `never` — точка без контента. |
87
- | `className` | `string` | Нет | Объединяется с `styles.badgeDot + sizeClass`. |
88
- | `...HTMLSpanAttributes` | — | — | Стандартные атрибуты `<span>`. |
41
+ ### Badge — обязательные props
89
42
 
90
- ### Размеры
43
+ | Prop | Тип | Описание |
44
+ |---|---|---|
45
+ | `size` | `EComponentSize` | `SM` — высота 16px, радиус 4px; `MD` — 20px / 6px; `LG` — 24px / 8px. Значения по умолчанию нет |
91
46
 
92
- **Badge (горизонтальная плашка):**
47
+ ### Badge — опциональные props
93
48
 
94
- | size | Height | Border-radius | Content padding-x |
49
+ | Prop | Тип | По умолчанию | Описание |
95
50
  |---|---|---|---|
96
- | `SM` | 16px | 4px | 4px |
97
- | `MD` | 20px | 6px | 6px |
98
- | `LG` | 24px | 8px | 8px |
99
-
100
- **Badge.Dot (круг):**
101
-
102
- | size | Diameter |
103
- |---|---|
104
- | `SM` | 6px |
105
- | `MD` | 8px |
106
- | `LG` | 10px |
107
-
108
- ---
109
-
110
- ## Ключевые особенности реализации
111
-
112
- ### `createSizeToClassNameMap` вместо локального маппинга
113
-
114
- ```ts
115
- const SIZE_TO_CLASS_NAME_MAP = createSizeToClassNameMap(styles);
116
- ```
51
+ | `children` | `React.ReactNode` | — | Содержимое. Оборачивается во внутренний `<span class="badgeContent">` с горизонтальными отступами 4 / 6 / 8px по размеру |
52
+ | `prefix` | `React.ReactNode` | — | Контент перед содержимым, обычно иконка. Обёртка `badgePrefix` имеет `display: contents` |
53
+ | `postfix` | `React.ReactNode` | — | Контент после содержимого, обычно иконка. Обёртка `badgePostfix` имеет `display: contents` |
117
54
 
118
- Утилита `src/utils/classNameMaps.ts` возвращает `{ [SM]: styles.sm, [MD]: styles.md, [LG]: styles.lg }`.
119
- Используется во всех Badge-файлах (`Badge.tsx`, `BadgeDot.tsx`, `BadgeContent.tsx`).
120
- Это единый паттерн — не дублировать маппинг локально.
55
+ `prefix` перекрывает одноимённый RDFa-атрибут `prefix?: string` из
56
+ `React.HTMLAttributes`, поэтому вырезан из базового типа через `Omit`. Атрибута
57
+ `postfix` в `React.HTMLAttributes` нет — он попал в `Omit<..., "prefix" | "postfix">`
58
+ для симметрии и фактически ничего не убирает.
121
59
 
122
- Если понадобится новый размер (XS, XL) — обновлять **и** `EComponentSize`, **и**
123
- `createSizeToClassNameMap`, **и** LESS-файлы. Помни: `createSizeToClassNameMap`
124
- типизирован как `Record<EComponentSize, string>` — TypeScript заставит добавить
125
- ключ.
60
+ Отступ содержимого снимается со стороны, где стоит иконка: при `prefix` контент получает
61
+ класс `noPaddingLeft`, при `postfix` — `noPaddingRight`. Логика целиком декларативная,
62
+ считается от факта наличия props (`Boolean(prefix)` / `Boolean(postfix)`).
126
63
 
127
- ### `Omit<HTMLAttributes, "prefix" | "postfix">` — реальная проблема
64
+ ### Badge.Dot — props
128
65
 
129
- HTML-атрибут `prefix` (устаревший, для RDFa) существует на некоторых тегах.
130
- TypeScript не распознаёт его на `<span>`, но React.HTMLAttributes включает его
131
- через dom-типы. Без `Omit` prop `prefix` компонента конфликтует с HTML-атрибутом
132
- в типах. Не удалять Omit.
133
-
134
- ### `BadgePrefix` / `BadgePostfix` — `display: contents`
135
-
136
- ```less
137
- .badgePrefix { display: contents; }
138
- .badgePostfix { display: contents; }
139
- ```
66
+ | Prop | Тип | Описание |
67
+ |---|---|---|
68
+ | `size` | `EComponentSize` | Диаметр круга: `SM` — 6px, `MD` — 8px, `LG` — 10px. Обязательный |
69
+ | `children` | `never` | Точка не имеет содержимого — тип запрещает передачу детей |
140
70
 
141
- Обёртка не создаёт box — её children рендерятся так, как будто `<span>`
142
- вообще нет, но в DOM он есть. Это позволяет:
143
- - Применять семантический класс для тестов.
144
- - Не нарушать flex-лейаут родителя.
145
- - Не добавлять лишних паддингов.
71
+ ### Falsy-значения не рендерят части
146
72
 
147
- **`display: contents` имеет a11y-баг в Safari <14** — он убирает роль элемента
148
- для screen reader. Для `<span>` без семантической роли это не проблема, но помни
149
- при расширении (не добавлять `role="button"` на BadgePrefix без тестирования).
73
+ Части рендерятся по truthy-проверке (`children ? ... : null`). Поэтому
74
+ `children={0}`, `children=""`, `prefix={false}` не выводят ни содержимого, ни обёртки.
75
+ Для счётчика с нулём передавай строку (`"0"`) или не рендери `Badge` вовсе. Это
76
+ исторически сложившееся поведение; менять его — задача с записью в release notes.
150
77
 
151
- ### `BadgeContent` убирает паддинги при наличии prefix/postfix
78
+ ### Цвет и текст
152
79
 
153
- ```tsx
154
- <BadgeContent
155
- size={size}
156
- noPaddingLeft={Boolean(prefix)}
157
- noPaddingRight={Boolean(postfix)}
158
- >
159
- ```
80
+ - Фон обоих компонентов — единственный токен `--triplex-next-Badge-Background`
81
+ (`ColorWarning.70` в обеих темах). Вариантов/статусов у компонента нет.
82
+ - Цвет и размер текста задаёт потребитель, вкладывая внутрь `Text` / `Caption`
83
+ с нужным `type` (в примерах — `EFontType.PRIMARY_INVERT`). Своей типографики
84
+ `Badge` не задаёт — только высоту, скругление и отступы.
85
+ - Нестандартный фон в продуктовых сценариях делают инлайновым `style`
86
+ (`ProductionExample.tsx`). Это осознанный обход: расширять API цветовыми
87
+ вариантами без задачи не нужно.
160
88
 
161
- Это делает `prefix/postfix` "приклеенными" к контенту без двойного отступа. Если
162
- пишешь новый subcomponent внутри Badge — следуй этому паттерну (не добавляй
163
- горизонтальные паддинги на subcomponent-уровне, только на BadgeContent).
89
+ ---
164
90
 
165
- ### Compound `Badge.Dot`
91
+ ## Дизайн-токены
166
92
 
167
- ```ts
168
- export const Badge = Object.assign(
169
- React.forwardRef<HTMLSpanElement, IBadgeProps>(...),
170
- { Dot: BadgeDot },
171
- );
93
+ ```text
94
+ --triplex-next-Badge-Background
172
95
  ```
173
96
 
174
- Тот же паттерн, что у `AlertProcess.Spoiler`. Одновременно `BadgeDot` экспортируется
175
- из `index.ts` через `./Badge` напрямую, но **рекомендуемое использование** —
176
- через `Badge.Dot` (единый API).
177
-
178
- ### Один цветовой токен на оба
179
-
180
- `--triplex-next-Badge-Background` используется и для Badge, и для BadgeDot. Нет
181
- отдельного токена для `BadgeDot-Background` — оба разделяют цвет. Если нужны
182
- разные цвета (например, зелёная точка при сером Badge) — потребитель
183
- переопределяет через `style`/`className`.
97
+ Один токен на всё семейство: фон `Badge` (`styles/Badge.module.less`) и цвет точки
98
+ `Badge.Dot` (`styles/BadgeDot.module.less`). Объявлен в
99
+ `src/components/DesignTokens/components/Badge.ts` (`ColorWarning.70` в светлой и тёмной
100
+ темах). Геометрия (высоты, радиусы, диаметры точки, горизонтальные отступы контента)
101
+ задана литералами в LESS и снаружи не настраивается.
184
102
 
185
103
  ---
186
104
 
187
105
  ## Инварианты
188
106
 
189
- - **`forwardRef`** — обязателен на Badge и BadgeDot. Не убирать.
190
- - **`size` обязателен** — без default value, чтобы потребитель явно выбирал масштаб.
191
- - **`EComponentSize`** — общий enum из `src/enums/EComponentSize`, не делай
192
- локальный аналог. Badge входит в семейство компонентов, использующих единый
193
- SM/MD/LG.
194
- - **`BadgeDot.children: never`** — не превращать в обычный slot. Компонент
195
- намеренно пустой.
196
- - **`Omit<HTMLAttributes, "prefix" | "postfix">`** — не убирать, конфликт типов.
197
- - **`display: contents` в BadgePrefix/BadgePostfix** — не менять на `inline-flex`.
198
- Меняет лейаут и ломает `noPaddingLeft/Right` логику в BadgeContent.
199
- - **`Badge.Dot` через Object.assign** — не убирать, потребители импортируют
200
- через compound.
201
- - **Background-токен един** для Badge и BadgeDot — не разделять без согласования
202
- с дизайнером.
203
- - **`white-space: nowrap`** на Badge — не убирать, иначе длинный контент ломается
204
- на несколько строк и разваливает высоту.
205
- - **BadgeContent/Prefix/Postfix — внутренние** — не экспортировать через barrel.
206
- Потребители используют только `prefix`/`postfix` props.
107
+ - **`forwardRef` на `Badge` и `BadgeDot`** — оба пробрасывают ref на корневой
108
+ `<span>`; не убирать.
109
+ - **Корневой элемент — `<span>`** у всех частей семейства. Смена тега ломает
110
+ инлайновое размещение внутри текста и чипсов.
111
+ - **`BadgeDot` доступен только как `Badge.Dot`.** Barrel (`src/components/Badge/index.ts`)
112
+ экспортирует `Badge` и типы; отдельного именованного экспорта `BadgeDot` нет — так его
113
+ и импортируют внутренние потребители: `Marker`, `Chip`, `DropdownListItem`,
114
+ `DropdownMobileListItem`, `TabsLineItem`, `TabsExtendedTabButton`.
115
+ Добавление именованного экспорта — расширение публичного API.
116
+ - **`IBadgeDotProps` — не только props точки.** `Marker` строит из него свой публичный
117
+ интерфейс: `IMarkerProps extends IBadgeDotProps` (`src/components/Marker/Marker.tsx:9`).
118
+ Любое изменение формы `IBadgeDotProps` автоматически меняет публичный API `Marker`.
119
+ - **`IBadgeContentProps` экспортируется из barrel, хотя `BadgeContent` — нет.**
120
+ Тип уже в публичном API (`export * from "./types"`), удалять или переименовывать
121
+ нельзя без release notes.
122
+ - **Класс `.badgeDot` проверяется в тестах соседнего компонента** —
123
+ `src/components/Chip/__tests__/Chip.test.tsx` ищет точку через
124
+ `container.querySelector(".badgeDot")`. Переименование класса ломает чужой тест.
125
+ - **Порядок частей в разметке — `prefix` → `children` → `postfix`**, ровно три
126
+ необязательных узла, без дополнительных обёрток. На порядок и на классы
127
+ `badgePrefix` / `badgeContent` / `badgePostfix` опираются unit-тесты.
128
+ - **`display: contents` у `badgePrefix` / `badgePostfix`** — обёртки намеренно не
129
+ создают бокса, иначе иконка получит лишний уровень выравнивания внутри inline-flex.
130
+ - **`displayName`** — `Badge`, `BadgeDot`, `BadgeContent`, `BadgePrefix`, `BadgePostfix`;
131
+ видны в React DevTools.
132
+ - **`size` обязателен у обоих компонентов** — дефолта нет, `<Badge />` не типизируется.
207
133
 
208
134
  ---
209
135
 
210
136
  ## Accessibility
211
137
 
212
- - **Никаких ARIA-ролей по умолчанию** — Badge семантически нейтрален. Если
213
- Badge отображает число непрочитанных сообщений — потребитель обязан обеспечить
214
- озвучку: `aria-label="5 непрочитанных сообщений"` или `role="status"`.
215
- - **Для статусного Badge** (например, "Online") — потребитель должен добавить
216
- `role="status"` и `aria-label` / `title`, иначе screen reader прочитает только
217
- визуальный текст, без контекста.
218
- - **BadgeDot** — чистая визуальная точка без текста. **Обязан** получать
219
- `aria-label` от потребителя, иначе не воспринимается screen reader'ом. Или,
220
- если это чисто декоративный индикатор рядом с другим текстом — `aria-hidden="true"`.
221
- - **`display: contents`** на prefix/postfix — в современных браузерах не ломает
222
- a11y, но в Safari <14 может. Если поддержка старого Safari критична, делай
223
- тесты.
224
-
225
- ---
226
-
227
- ## Дизайн-токены
228
-
229
- ```
230
- --triplex-next-Badge-Background # Фон Badge и BadgeDot (единый токен)
231
- ```
232
-
233
- Цвет текста внутри Badge определяется `color: inherit` от родителя (нет явного
234
- токена) — потребитель задаёт цвет через `Typography`-компоненты или `style`.
235
-
236
- Высоты, радиусы, паддинги, размеры точки — жёсткие значения в LESS, не токенизированы.
237
- Кандидат на рефакторинг при общей токенизации размеров.
138
+ - Компонент неинтерактивен: не получает фокус, не обрабатывает клавиатуру, ARIA-ролей
139
+ и атрибутов не выставляет. Корневой `<span>` для скринридера — обычный текст.
140
+ - Текстовый `Badge` доступен как есть: содержимое читается в потоке. Отдельная
141
+ подпись не нужна.
142
+ - **`Badge.Dot` не имеет доступного имени** — это чисто визуальный индикатор.
143
+ Корневой `<span>` без роли попадает в `generic`, а для него доступное имя
144
+ запрещено, поэтому одного `aria-label` недостаточно. Если точка несёт смысл
145
+ («есть непрочитанное»), потребитель обязан передать роль, поддерживающую имя,
146
+ вместе с текстом — например `role="img"` и `aria-label` (оба уйдут в `...rest`),
147
+ — либо продублировать смысл текстом рядом. Если точка декоративна и дублирует
148
+ видимый текст — передай `aria-hidden`.
149
+ **Внутри библиотеки этого пока нет:** `Chip`, `DropdownListItem`,
150
+ `DropdownMobileListItem`, `TabsLineItem` и `TabsExtendedTabButton` рендерят
151
+ `<Badge.Dot size={...} className={styles.notificationIcon} />` — без `aria-hidden`
152
+ и без роли с именем. Точка там означает «есть новые уведомления», и подписью
153
+ рядом этот смысл не дублируется, то есть для скринридера информация теряется.
154
+ Это известный пробел, а не образец для копирования.
155
+ - Строки на конкретном языке компонент не хардкодит — весь текст приходит от
156
+ потребителя.
238
157
 
239
158
  ---
240
159
 
241
160
  ## Связанные компоненты
242
161
 
243
- - `Avatar` (`src/components/Avatar`) — часто комбинируется с Badge: Badge на углу
244
- Avatar как индикатор статуса. Позиционирование — задача потребителя.
245
- - `Chip` (`src/components/Chip`) — "большой Badge" с возможностью закрытия и
246
- интерактивностью. Разная семантика: Badge = индикатор, Chip = тег.
247
- - `Tag` / `TagColor` / `TagGroup` (`src/components/Tag`) — ещё больший уровень:
248
- стилизованные метки категорий с цветами.
249
- - `MarkerStatus` (`src/components/MarkerStatus`) — крупный блок статуса с иконкой
250
- и текстом (тип сообщения).
251
- - `EComponentSize` (`src/enums/EComponentSize`) — общий enum трёх размеров.
252
- - `createSizeToClassNameMap` (`src/utils/classNameMaps.ts`) — утилита
253
- размер → class.
162
+ - `Marker` (`src/components/Marker/Marker.tsx`) — обёртка над `Badge.Dot` со статусными
163
+ цветами; наследует `IBadgeDotProps`.
164
+ - `Chip` (`src/components/Chip/Chip.tsx:108`) — рендерит `Badge.Dot` как значок
165
+ уведомления при `showNotificationIcon`.
166
+ - `DropdownListItem`, `DropdownMobileListItem` — то же самое для пунктов выпадающего
167
+ списка.
168
+ - `TabsLineItem` (`src/components/TabsLine/components/TabsLineItem.tsx:78`),
169
+ `TabsExtendedTabButton` (`src/components/TabsExtended/components/TabsExtendedTabButton.tsx:51`)
170
+ — то же самое для вкладок.
171
+ - `Text`, `Caption` — типографика содержимого: `B4`/`C1` для SM–MD, `B3` для LG,
172
+ `type={EFontType.PRIMARY_INVERT}` для читаемости на цветной подложке.
173
+ - `MarkerStatus`, `TagColor` — альтернативы, когда нужен статус с собственной палитрой.
174
+
175
+ ### Внутренние субкомпоненты (собственного AI.md не имеют)
176
+
177
+ - `BadgeContent` (`components/BadgeContent.tsx`) — обёртка содержимого; единственная
178
+ нетривиальная часть: горизонтальные отступы по размеру и их снятие флагами
179
+ `noPaddingLeft` / `noPaddingRight`.
180
+ - `BadgePrefix`, `BadgePostfix` (`components/`) — обёртки иконок, `display: contents`,
181
+ логики нет.
182
+
183
+ Все трое объявлены как `React.FC` без `forwardRef` — это допустимо, потому что наружу
184
+ они не экспортируются и ref в них не приходит.
254
185
 
255
186
  ---
256
187
 
257
188
  ## Stories
258
189
 
259
- `stories/Badge/Badge.stories.tsx`
190
+ Основные истории: `stories/Badge/Badge.stories.tsx`
260
191
  Файлы примеров: `stories/Badge/examples/`
261
192
 
262
193
  | Story | Example file | Что демонстрирует |
263
194
  |---|---|---|
264
- | `Playground` | `PlaygroundExample.tsx` | Интерактивный контроль `size` |
265
- | `Default` | `DefaultExample.tsx` | Базовое использование |
266
- | `Sizes` | `SizesExample.tsx` | Все три размера Badge |
267
- | `WithPrefixAndPostfix` | `WithPrefixAndPostfixExample.tsx` | Badge с иконкой слева и/или справа |
268
- | `DotSizes` | `DotSizesExample.tsx` | Три размера Badge.Dot |
269
- | `Example` | `ProductionExample.tsx` | Реальные кейсы композиции |
195
+ | `Playground` | `PlaygroundExample.tsx` | Интерактивный подбор `size` |
196
+ | `Default` | `DefaultExample.tsx` | Минимальный вызов: размер `MD` и `Text` внутри |
197
+ | `Sizes` | `SizesExample.tsx` | Размеры `SM` / `MD` / `LG` с подходящей типографикой |
198
+ | `WithPrefixAndPostfix` | `WithPrefixAndPostfixExample.tsx` | Иконки слева и справа во всех трёх размерах |
199
+ | `DotSizes` | `DotSizesExample.tsx` | Размеры `Badge.Dot` |
200
+ | `Example` | `ProductionExample.tsx` | Продуктовые сценарии: только иконка, иконка с текстом (`prefix` / `postfix`), цветные статусы через инлайновый `style` |
201
+
202
+ Скриншот-регрессия снимается со стори `Default`, `Sizes`, `WithPrefixAndPostfix`,
203
+ `DotSizes` (`__screenshots__/badge--*--xs|xl.png`). `Playground` и `Example` исключены
204
+ через `testRunner: { skip: true }`: первый — интерактивная песочница, второй содержит
205
+ подобранные вручную цвета и дублирует остальные состояния.
270
206
 
271
207
  ---
272
208
 
@@ -274,7 +210,7 @@ export const Badge = Object.assign(
274
210
 
275
211
  | Дата | Изменение |
276
212
  |---|---|
277
- | 2026-04-18 | Создан документ |
213
+ | 2026-08-12 | Создан документ. AI-рефакторинг: JSDoc на всех props `IBadgeProps` / `IBadgeDotProps` / `IBadgeContentProps` с указанием размеров в px, в `IBadgeProps` добавлен явный `children` (тип совпадает с унаследованным из `React.HTMLAttributes`), расширены JSDoc компонентов и внутренних обёрток. Unit-тесты расширены с 12 до 45 кейсов: `Badge.test.tsx` вырос с 12 до 23 кейсов, рядом добавлены `BadgeDot.test.tsx` (7), `BadgeContent.test.tsx` (9) и `BadgeAffixes.test.tsx` (6) — покрыты логика снятия отступов контента, нерендеринг частей с falsy-значением, порядок частей разметки, проброс `...rest` и `ref`. Публичный API, DOM-разметка и визуальное поведение не изменены. |
278
214
 
279
215
  ---
280
216
 
@@ -372,8 +308,8 @@ export const WithPrefixAndPostfixExample = () => (
372
308
  <div style={{ display: "flex", gap: "16px", alignItems: "center" }}>
373
309
  <Badge
374
310
  size={EComponentSize.SM}
375
- prefix={<PercentsmallStrokeSrvIcon16 paletteIndex={7} />}
376
- postfix={<PercentsmallStrokeSrvIcon16 paletteIndex={7} />}
311
+ prefix={<PercentsmallStrokeSrvIcon16 paletteIndex={10} />}
312
+ postfix={<PercentsmallStrokeSrvIcon16 paletteIndex={10} />}
377
313
  >
378
314
  <Caption size={ECaptionSize.C1} weight={EFontWeightCaption.REGULAR} type={EFontType.PRIMARY_INVERT}>
379
315
  Badge text SM
@@ -381,8 +317,8 @@ export const WithPrefixAndPostfixExample = () => (
381
317
  </Badge>
382
318
  <Badge
383
319
  size={EComponentSize.MD}
384
- prefix={<PercentsmallStrokeSrvIcon20 paletteIndex={7} />}
385
- postfix={<PercentsmallStrokeSrvIcon20 paletteIndex={7} />}
320
+ prefix={<PercentsmallStrokeSrvIcon20 paletteIndex={10} />}
321
+ postfix={<PercentsmallStrokeSrvIcon20 paletteIndex={10} />}
386
322
  >
387
323
  <Text size={ETextSize.B4} weight={EFontWeightText.REGULAR} type={EFontType.PRIMARY_INVERT}>
388
324
  Badge text MD
@@ -390,8 +326,8 @@ export const WithPrefixAndPostfixExample = () => (
390
326
  </Badge>
391
327
  <Badge
392
328
  size={EComponentSize.LG}
393
- prefix={<PercentsmallStrokeSrvIcon24 paletteIndex={7} />}
394
- postfix={<PercentsmallStrokeSrvIcon24 paletteIndex={7} />}
329
+ prefix={<PercentsmallStrokeSrvIcon24 paletteIndex={10} />}
330
+ postfix={<PercentsmallStrokeSrvIcon24 paletteIndex={10} />}
395
331
  >
396
332
  <Text size={ETextSize.B3} weight={EFontWeightText.REGULAR} type={EFontType.PRIMARY_INVERT}>
397
333
  Badge text LG
@@ -434,20 +370,20 @@ import { Badge, EComponentSize, EFontType, EFontWeightText, ETextSize, Text } fr
434
370
 
435
371
  export const ProductionExample = () => (
436
372
  <div style={{ display: "flex", gap: "16px" }}>
437
- <Badge size={EComponentSize.MD} prefix={<PercentsmallStrokeSrvIcon20 paletteIndex={7} />} />
438
- <Badge size={EComponentSize.MD} prefix={<PercentsmallStrokeSrvIcon20 paletteIndex={7} />}>
373
+ <Badge size={EComponentSize.MD} prefix={<PercentsmallStrokeSrvIcon20 paletteIndex={10} />} />
374
+ <Badge size={EComponentSize.MD} prefix={<PercentsmallStrokeSrvIcon20 paletteIndex={10} />}>
439
375
  <Text size={ETextSize.B4} weight={EFontWeightText.REGULAR} type={EFontType.PRIMARY_INVERT}>
440
376
  Badge text
441
377
  </Text>
442
378
  </Badge>
443
- <Badge size={EComponentSize.MD} postfix={<PercentsmallStrokeSrvIcon20 paletteIndex={7} />}>
379
+ <Badge size={EComponentSize.MD} postfix={<PercentsmallStrokeSrvIcon20 paletteIndex={10} />}>
444
380
  <Text size={ETextSize.B4} weight={EFontWeightText.REGULAR} type={EFontType.PRIMARY_INVERT}>
445
381
  Badge text
446
382
  </Text>
447
383
  </Badge>
448
384
  <Badge
449
385
  size={EComponentSize.MD}
450
- prefix={<NewsmallFilledSrvIcon20 paletteIndex={7} />}
386
+ prefix={<NewsmallFilledSrvIcon20 paletteIndex={10} />}
451
387
  style={{ backgroundColor: "#1297FE" }}
452
388
  >
453
389
  <Text size={ETextSize.B4} weight={EFontWeightText.REGULAR} type={EFontType.PRIMARY_INVERT}>