@sberbusiness/triplex-next-mcp-server 1.40.0-beta → 1.42.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.
- package/bundle/components/AlertProcess.md +460 -0
- package/bundle/components/Amount.md +145 -169
- package/bundle/components/Badge.md +155 -219
- package/bundle/components/Body.md +108 -116
- package/bundle/components/Calendar.md +183 -368
- package/bundle/components/CarouselExtended.md +355 -194
- package/bundle/components/Chip.md +310 -314
- package/bundle/components/ComposedKeyDownListener.md +323 -0
- package/bundle/components/FooterPage.md +2 -1
- package/bundle/components/FormField.md +468 -232
- package/bundle/components/HeaderPage.md +2 -1
- package/bundle/components/IconWrapper.md +142 -89
- package/bundle/components/Island.md +303 -123
- package/bundle/components/KeyDownListener.md +152 -100
- package/bundle/components/LoaderMiddle.md +265 -0
- package/bundle/components/LoaderScreen.md +178 -81
- package/bundle/components/LoaderSmall.md +230 -0
- package/bundle/components/MaskedField.md +481 -0
- package/bundle/components/MediaWidth.md +246 -108
- package/bundle/components/MobileView.md +192 -68
- package/bundle/components/ModalWindow.md +3 -1
- package/bundle/components/Page.md +3 -1
- package/bundle/components/Pagination.md +20 -0
- package/bundle/components/SelectExtendedField.md +691 -236
- package/bundle/components/ThemeProvider.md +305 -117
- package/bundle/components/Tooltip.md +421 -181
- package/bundle/guides/commits.md +54 -9
- package/bundle/guides/context.md +26 -0
- package/bundle/guides/stories.md +2 -0
- package/bundle/guides/template.md +1 -1
- package/bundle/manifest.json +63 -18
- package/bundle/release-notes/1.41.0.mdx +76 -0
- package/bundle/release-notes/1.41.1.mdx +18 -0
- package/bundle/release-notes/1.42.0.mdx +88 -0
- package/bundle/release-notes/1.43.0.mdx +7 -0
- package/package.json +1 -1
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: Badge
|
|
3
|
-
category:
|
|
4
|
-
|
|
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
|
-
|
|
19
|
-
|
|
15
|
+
Небольшой inline-индикатор статуса или уведомления: подпись на цветной подложке
|
|
16
|
+
(`Badge`) либо просто цветная точка (`Badge.Dot`). Собственного состояния и логики нет —
|
|
17
|
+
компонент только собирает разметку из трёх необязательных частей (`prefix` → `children` →
|
|
18
|
+
`postfix`) и раздаёт классы по размеру.
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
Используй когда: нужно пометить объект коротким статусом («Новинка», «Нет данных»),
|
|
21
|
+
показать счётчик уведомлений или поставить точку-индикатор рядом с элементом списка,
|
|
22
|
+
чипсом, пунктом меню.
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
+
### Badge — опциональные props
|
|
93
48
|
|
|
94
|
-
|
|
|
49
|
+
| Prop | Тип | По умолчанию | Описание |
|
|
95
50
|
|---|---|---|---|
|
|
96
|
-
| `
|
|
97
|
-
| `
|
|
98
|
-
| `
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
55
|
+
`prefix` перекрывает одноимённый RDFa-атрибут `prefix?: string` из
|
|
56
|
+
`React.HTMLAttributes`, поэтому вырезан из базового типа через `Omit`. Атрибута
|
|
57
|
+
`postfix` в `React.HTMLAttributes` нет — он попал в `Omit<..., "prefix" | "postfix">`
|
|
58
|
+
для симметрии и фактически ничего не убирает.
|
|
121
59
|
|
|
122
|
-
|
|
123
|
-
`
|
|
124
|
-
|
|
125
|
-
ключ.
|
|
60
|
+
Отступ содержимого снимается со стороны, где стоит иконка: при `prefix` контент получает
|
|
61
|
+
класс `noPaddingLeft`, при `postfix` — `noPaddingRight`. Логика целиком декларативная,
|
|
62
|
+
считается от факта наличия props (`Boolean(prefix)` / `Boolean(postfix)`).
|
|
126
63
|
|
|
127
|
-
###
|
|
64
|
+
### Badge.Dot — props
|
|
128
65
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
142
|
-
вообще нет, но в DOM он есть. Это позволяет:
|
|
143
|
-
- Применять семантический класс для тестов.
|
|
144
|
-
- Не нарушать flex-лейаут родителя.
|
|
145
|
-
- Не добавлять лишних паддингов.
|
|
71
|
+
### Falsy-значения не рендерят части
|
|
146
72
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
73
|
+
Части рендерятся по truthy-проверке (`children ? ... : null`). Поэтому
|
|
74
|
+
`children={0}`, `children=""`, `prefix={false}` не выводят ни содержимого, ни обёртки.
|
|
75
|
+
Для счётчика с нулём передавай строку (`"0"`) или не рендери `Badge` вовсе. Это
|
|
76
|
+
исторически сложившееся поведение; менять его — задача с записью в release notes.
|
|
150
77
|
|
|
151
|
-
###
|
|
78
|
+
### Цвет и текст
|
|
152
79
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
162
|
-
пишешь новый subcomponent внутри Badge — следуй этому паттерну (не добавляй
|
|
163
|
-
горизонтальные паддинги на subcomponent-уровне, только на BadgeContent).
|
|
89
|
+
---
|
|
164
90
|
|
|
165
|
-
|
|
91
|
+
## Дизайн-токены
|
|
166
92
|
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
React.forwardRef<HTMLSpanElement, IBadgeProps>(...),
|
|
170
|
-
{ Dot: BadgeDot },
|
|
171
|
-
);
|
|
93
|
+
```text
|
|
94
|
+
--triplex-next-Badge-Background
|
|
172
95
|
```
|
|
173
96
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
|
190
|
-
|
|
191
|
-
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
- `
|
|
244
|
-
|
|
245
|
-
- `Chip` (`src/components/Chip`) —
|
|
246
|
-
|
|
247
|
-
- `
|
|
248
|
-
|
|
249
|
-
- `
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
- `
|
|
253
|
-
|
|
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` | Интерактивный
|
|
265
|
-
| `Default` | `DefaultExample.tsx` |
|
|
266
|
-
| `Sizes` | `SizesExample.tsx` |
|
|
267
|
-
| `WithPrefixAndPostfix` | `WithPrefixAndPostfixExample.tsx` |
|
|
268
|
-
| `DotSizes` | `DotSizesExample.tsx` |
|
|
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-
|
|
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={
|
|
376
|
-
postfix={<PercentsmallStrokeSrvIcon16 paletteIndex={
|
|
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={
|
|
385
|
-
postfix={<PercentsmallStrokeSrvIcon20 paletteIndex={
|
|
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={
|
|
394
|
-
postfix={<PercentsmallStrokeSrvIcon24 paletteIndex={
|
|
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={
|
|
438
|
-
<Badge size={EComponentSize.MD} prefix={<PercentsmallStrokeSrvIcon20 paletteIndex={
|
|
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={
|
|
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={
|
|
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}>
|