@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.
- package/README.md +10 -0
- package/bundle/components/AlertContext.md +268 -0
- package/bundle/components/BodyPage.md +186 -0
- package/bundle/components/Button.md +93 -85
- package/bundle/components/ButtonDropdown.md +36 -70
- package/bundle/components/ButtonDropdownExtended.md +422 -0
- package/bundle/components/ButtonIcon.md +41 -48
- package/bundle/components/Caption.md +291 -0
- package/bundle/components/Checkbox.md +43 -122
- package/bundle/components/CheckboxXGroup.md +109 -46
- package/bundle/components/CheckboxYGroup.md +77 -49
- package/bundle/components/CodeText.md +197 -0
- package/bundle/components/Col.md +311 -162
- package/bundle/components/CollapsibleTree.md +584 -0
- package/bundle/components/CollapsibleTreeExtended.md +422 -0
- package/bundle/components/Dropdown.md +748 -346
- package/bundle/components/EmptyView.md +14 -15
- package/bundle/components/FooterPage.md +203 -0
- package/bundle/components/Gap.md +115 -57
- package/bundle/components/HeaderPage.md +226 -0
- package/bundle/components/HelpBox.md +45 -84
- package/bundle/components/ImageGallery.md +423 -0
- package/bundle/components/ImageGalleryExtended.md +606 -0
- package/bundle/components/LightBox.md +2252 -233
- package/bundle/components/List.md +216 -183
- package/bundle/components/ListActionItem.md +157 -0
- package/bundle/components/ListItem.md +276 -0
- package/bundle/components/ListItemControlsButton.md +103 -0
- package/bundle/components/ListItemControlsButtonDropdown.md +107 -0
- package/bundle/components/ListItemSelectable.md +99 -0
- package/bundle/components/ListItemTable.md +390 -0
- package/bundle/components/ListMaster.md +876 -156
- package/bundle/components/ListMasterFooter.md +80 -0
- package/bundle/components/ListMasterHeader.md +86 -0
- package/bundle/components/ListSortable.md +153 -0
- package/bundle/components/ListSortableItem.md +175 -0
- package/bundle/components/ListTableItem.md +391 -0
- package/bundle/components/ModalWindow.md +427 -237
- package/bundle/components/MonthYearField.md +145 -109
- package/bundle/components/Notification.md +625 -155
- package/bundle/components/Overlay.md +271 -170
- package/bundle/components/Page.md +284 -186
- package/bundle/components/Pagination.md +206 -229
- package/bundle/components/Portal.md +131 -67
- package/bundle/components/Row.md +171 -69
- package/bundle/components/Text.md +320 -0
- package/bundle/components/TextField.md +364 -97
- package/bundle/components/Title.md +296 -0
- package/bundle/guides/codestyle.md +38 -11
- package/bundle/guides/commits.md +119 -26
- package/bundle/guides/context.md +34 -30
- package/bundle/guides/stories.md +110 -40
- package/bundle/guides/template.md +3 -7
- package/bundle/guides/tests.md +48 -2
- package/bundle/manifest.json +275 -30
- package/bundle/release-notes/1.26.0.mdx +33 -2
- package/bundle/release-notes/1.27.0.mdx +43 -0
- package/bundle/release-notes/1.28.0.mdx +25 -0
- package/bundle/release-notes/1.29.0.mdx +47 -0
- package/bundle/release-notes/1.30.0.mdx +56 -0
- package/bundle/release-notes/1.31.0.mdx +52 -0
- package/bundle/release-notes/1.32.0.mdx +35 -0
- package/bundle/release-notes/1.33.0.mdx +61 -0
- package/bundle/release-notes/1.34.0.mdx +35 -0
- package/bundle/release-notes/1.35.0.mdx +21 -0
- package/bundle/release-notes/1.35.1.mdx +11 -0
- package/bundle/release-notes/1.36.0.mdx +21 -0
- package/bundle/release-notes/1.37.0.mdx +71 -0
- package/bundle/release-notes/1.38.0.mdx +36 -0
- package/bundle/release-notes/1.39.0.mdx +66 -0
- package/bundle/release-notes/1.40.0.mdx +27 -0
- package/bundle/release-notes/1.41.0.mdx +7 -0
- package/package.json +1 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: Caption
|
|
3
|
+
category: Typography
|
|
4
|
+
related: [Text, Title, CodeText]
|
|
5
|
+
tokens:
|
|
6
|
+
- --triplex-next-Typography-Primary_Color
|
|
7
|
+
- --triplex-next-Typography-PrimaryInvert_Color
|
|
8
|
+
- --triplex-next-Typography-Complementary_Color
|
|
9
|
+
- --triplex-next-Typography-ComplementaryInvert_Color
|
|
10
|
+
- --triplex-next-Typography-Secondary_Color
|
|
11
|
+
- --triplex-next-Typography-SecondaryInvert_Color
|
|
12
|
+
- --triplex-next-Typography-Tertiary_Color
|
|
13
|
+
- --triplex-next-Typography-TertiaryInvert_Color
|
|
14
|
+
- --triplex-next-Typography-Disabled_Color
|
|
15
|
+
- --triplex-next-Typography-DisabledInvert_Color
|
|
16
|
+
- --triplex-next-Typography-Brand_Color
|
|
17
|
+
- --triplex-next-Typography-BrandInvert_Color
|
|
18
|
+
- --triplex-next-Typography-Info_Color
|
|
19
|
+
- --triplex-next-Typography-InfoInvert_Color
|
|
20
|
+
- --triplex-next-Typography-Success_Color
|
|
21
|
+
- --triplex-next-Typography-SuccessInvert_Color
|
|
22
|
+
- --triplex-next-Typography-Warning_Color
|
|
23
|
+
- --triplex-next-Typography-WarningInvert_Color
|
|
24
|
+
- --triplex-next-Typography-Error_Color
|
|
25
|
+
- --triplex-next-Typography-ErrorInvert_Color
|
|
26
|
+
- --triplex-next-Typography-System_Color
|
|
27
|
+
- --triplex-next-Typography-SystemInvert_Color
|
|
28
|
+
stories: stories/Typography/Caption.stories.tsx
|
|
29
|
+
version: "1.0"
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Caption
|
|
33
|
+
|
|
34
|
+
## Назначение
|
|
35
|
+
|
|
36
|
+
Подпись (типографика). Рендерит инлайновый `<span>` (тег настраивается через `tag`) для крайних значений типографической шкалы: очень мелкие подписи `C1` (10px) и `C2` (8px) либо крупный акцентный показатель `D1` (32px, шрифт SBSansDisplay).
|
|
37
|
+
|
|
38
|
+
Используй когда: нужна сверхмелкая техническая подпись (сноска, копирайт, метка) или крупная цифра/показатель, не являющаяся заголовком (сумма на дашборде, KPI).
|
|
39
|
+
|
|
40
|
+
Не используй когда:
|
|
41
|
+
- Нужен обычный текст 12–18px — используй `Text` (B1–B4).
|
|
42
|
+
- Крупный текст является заголовком секции — используй `Title` (семантические `h1`–`h3`).
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Варианты и props
|
|
47
|
+
|
|
48
|
+
### Обязательные props
|
|
49
|
+
|
|
50
|
+
| Prop | Тип | Описание |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `size` | `ECaptionSize` | Размер: `C1` (10/12px), `C2` (8/10px), `D1` (32/40px). В скобках — font-size/line-height. |
|
|
53
|
+
|
|
54
|
+
### Опциональные props
|
|
55
|
+
|
|
56
|
+
| Prop | Тип | По умолчанию | Описание |
|
|
57
|
+
|---|---|---|---|
|
|
58
|
+
| `weight` | `EFontWeightCaption` | `REGULAR` | Начертание: `REGULAR` или `SEMIBOLD` (600). Для `C1`/`C2` — семейство SBSansText*, для `D1` — SBSansDisplay*. |
|
|
59
|
+
| `type` | `EFontType` | `PRIMARY` | Цвет текста из общей палитры типографики (11 базовых + 11 `*_INVERT`). |
|
|
60
|
+
| `underline` | `boolean` | — | Подчёркивание. Совместим со `strikethrough` (оба сразу — `underline line-through`). |
|
|
61
|
+
| `strikethrough` | `boolean` | — | Зачёркивание. |
|
|
62
|
+
| `tag` | `string` | `"span"` | HTML-тег корневого элемента. |
|
|
63
|
+
|
|
64
|
+
Компонент типизирован как `TCaptionProps<T extends keyof JSX.IntrinsicElements>` и принимает все атрибуты соответствующего HTML-элемента через spread.
|
|
65
|
+
|
|
66
|
+
### Ограничения
|
|
67
|
+
|
|
68
|
+
- Внешний тип `forwardRef<HTMLElement, TCaptionProps<keyof JSX.IntrinsicElements>>` «растворяет» дженерик: TypeScript не сужает атрибуты под конкретный `tag`. Известное ограничение публичного API, не исправлять без обсуждения (breaking).
|
|
69
|
+
- `EFontWeightCaption` дублирует значения `EFontWeightText` — это два независимых публичных enum, объединять нельзя (breaking).
|
|
70
|
+
- `EFontType.BRAND` дополнительно задаёт `user-select: none` (особенность стилей `Typography.module.less`).
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Дизайн-токены
|
|
75
|
+
|
|
76
|
+
Цвета — общие CSS-переменные семейства Typography (см. frontmatter): `--triplex-next-Typography-{Type}_Color` и `--triplex-next-Typography-{Type}Invert_Color`.
|
|
77
|
+
|
|
78
|
+
Размеры шрифта и line-height — фиксированные пиксельные значения в `styles/Caption.module.less` (токенов для них нет).
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Инварианты
|
|
83
|
+
|
|
84
|
+
- **`forwardRef`** — обязателен, `ref` пробрасывается на корневой элемент.
|
|
85
|
+
- **Значения enum** `ECaptionSize`, `EFontWeightCaption`, `EFontType` — публичный API из barrel. Изменение — breaking change.
|
|
86
|
+
- **`TCaptionProps`**, **`ITypographyProps`** — публичные типы.
|
|
87
|
+
- **`displayName = "Caption"`** — не убирать.
|
|
88
|
+
- `D1` переключает семейство шрифта на SBSansDisplay* — контракт стилей: крупный показатель визуально согласован с заголовками.
|
|
89
|
+
- Классы собираются только через `clsx`.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Accessibility
|
|
94
|
+
|
|
95
|
+
- Компонент не интерактивный: focus management и keyboard navigation не применимы.
|
|
96
|
+
- Семантика определяется через `tag` (по умолчанию нейтральный `<span>`).
|
|
97
|
+
- Размеры `C1`/`C2` (10/8px) ниже комфортного порога читаемости — используй только для второстепенной информации, не для основного контента.
|
|
98
|
+
- Цвет (`type`) не передаёт семантику для screen reader'ов.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Связанные компоненты
|
|
103
|
+
|
|
104
|
+
- `Text` — основной текст интерфейса (B1–B4).
|
|
105
|
+
- `Title` — заголовки `h1`–`h3`.
|
|
106
|
+
- `CodeText` — моноширинный текст.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Stories
|
|
111
|
+
|
|
112
|
+
Основные истории: `stories/Typography/Caption.stories.tsx`
|
|
113
|
+
Файлы примеров: `stories/Typography/examples/Caption/`
|
|
114
|
+
|
|
115
|
+
| Story | Example file | Что демонстрирует |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `Playground` | `Playground.tsx` | Интерактивный контроль props `size`, `weight`, `type`, `tag`, `underline`, `strikethrough` |
|
|
118
|
+
| `Default` | `Default.tsx` | Минимальное использование |
|
|
119
|
+
| `Sizes` | `Sizes.tsx` | Размеры C1 / C2 / D1 |
|
|
120
|
+
| `Weights` | `Weights.tsx` | Начертания REGULAR / SEMIBOLD |
|
|
121
|
+
| `Types` | `Types.tsx` | Все значения `EFontType`: базовые + инвертированные на тёмной подложке |
|
|
122
|
+
| `Decorations` | `Decorations.tsx` | `underline`, `strikethrough` и их комбинация |
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## История изменений
|
|
127
|
+
|
|
128
|
+
| Дата | Изменение |
|
|
129
|
+
|---|---|
|
|
130
|
+
| 2026-07-20 | Создан документ. AI-рефакторинг: decoration-логика вынесена во внутренний хелпер `getTextDecorationClassName` (`utils.ts`), комментарии переведены в JSDoc, unit-тесты расширены (все значения `ECaptionSize`/`EFontWeightCaption`, дефолты). Stories переведены на modern pattern (`examples/Caption/`). |
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Примеры использования
|
|
135
|
+
|
|
136
|
+
### Default
|
|
137
|
+
|
|
138
|
+
`stories/Typography/examples/Caption/Default.tsx`
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
import React from "react";
|
|
142
|
+
import { Caption, ECaptionSize } from "@sberbusiness/triplex-next";
|
|
143
|
+
|
|
144
|
+
export const Default = () => <Caption size={ECaptionSize.C1}>Вспомогательная подпись</Caption>;
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Sizes
|
|
148
|
+
|
|
149
|
+
`stories/Typography/examples/Caption/Sizes.tsx`
|
|
150
|
+
|
|
151
|
+
```tsx
|
|
152
|
+
import React from "react";
|
|
153
|
+
import { Caption, ECaptionSize } from "@sberbusiness/triplex-next";
|
|
154
|
+
|
|
155
|
+
export const Sizes = () => (
|
|
156
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
157
|
+
<Caption size={ECaptionSize.C1}>C1 - Подпись малого размера (10px)</Caption>
|
|
158
|
+
<Caption size={ECaptionSize.C2}>C2 - Подпись очень малого размера (8px)</Caption>
|
|
159
|
+
<Caption size={ECaptionSize.D1}>D1 - Подпись большого размера (32px)</Caption>
|
|
160
|
+
</div>
|
|
161
|
+
);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Weights
|
|
165
|
+
|
|
166
|
+
`stories/Typography/examples/Caption/Weights.tsx`
|
|
167
|
+
|
|
168
|
+
```tsx
|
|
169
|
+
import React from "react";
|
|
170
|
+
import { Caption, ECaptionSize, EFontWeightCaption } from "@sberbusiness/triplex-next";
|
|
171
|
+
|
|
172
|
+
export const Weights = () => (
|
|
173
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
174
|
+
<Caption size={ECaptionSize.C1} weight={EFontWeightCaption.REGULAR}>
|
|
175
|
+
Regular - Обычный вес подписи
|
|
176
|
+
</Caption>
|
|
177
|
+
<Caption size={ECaptionSize.C1} weight={EFontWeightCaption.SEMIBOLD}>
|
|
178
|
+
Semibold - Полужирная подпись
|
|
179
|
+
</Caption>
|
|
180
|
+
</div>
|
|
181
|
+
);
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Types
|
|
185
|
+
|
|
186
|
+
`stories/Typography/examples/Caption/Types.tsx`
|
|
187
|
+
|
|
188
|
+
```tsx
|
|
189
|
+
import React from "react";
|
|
190
|
+
import { Caption, ECaptionSize, EFontType } from "@sberbusiness/triplex-next";
|
|
191
|
+
|
|
192
|
+
export const Types = () => (
|
|
193
|
+
<div style={{ display: "flex", gap: "16px" }}>
|
|
194
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
195
|
+
<Caption size={ECaptionSize.C1} type={EFontType.PRIMARY}>
|
|
196
|
+
Primary
|
|
197
|
+
</Caption>
|
|
198
|
+
<Caption size={ECaptionSize.C1} type={EFontType.COMPLEMENTARY}>
|
|
199
|
+
Complementary
|
|
200
|
+
</Caption>
|
|
201
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SECONDARY}>
|
|
202
|
+
Secondary
|
|
203
|
+
</Caption>
|
|
204
|
+
<Caption size={ECaptionSize.C1} type={EFontType.TERTIARY}>
|
|
205
|
+
Tertiary
|
|
206
|
+
</Caption>
|
|
207
|
+
<Caption size={ECaptionSize.C1} type={EFontType.BRAND}>
|
|
208
|
+
Brand
|
|
209
|
+
</Caption>
|
|
210
|
+
<Caption size={ECaptionSize.C1} type={EFontType.INFO}>
|
|
211
|
+
Info
|
|
212
|
+
</Caption>
|
|
213
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SUCCESS}>
|
|
214
|
+
Success
|
|
215
|
+
</Caption>
|
|
216
|
+
<Caption size={ECaptionSize.C1} type={EFontType.WARNING}>
|
|
217
|
+
Warning
|
|
218
|
+
</Caption>
|
|
219
|
+
<Caption size={ECaptionSize.C1} type={EFontType.ERROR}>
|
|
220
|
+
Error
|
|
221
|
+
</Caption>
|
|
222
|
+
<Caption size={ECaptionSize.C1} type={EFontType.DISABLED}>
|
|
223
|
+
Disabled
|
|
224
|
+
</Caption>
|
|
225
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SYSTEM}>
|
|
226
|
+
System
|
|
227
|
+
</Caption>
|
|
228
|
+
</div>
|
|
229
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", backgroundColor: "#1F1F22" }}>
|
|
230
|
+
<Caption size={ECaptionSize.C1} type={EFontType.PRIMARY_INVERT}>
|
|
231
|
+
Primary Invert
|
|
232
|
+
</Caption>
|
|
233
|
+
<Caption size={ECaptionSize.C1} type={EFontType.COMPLEMENTARY_INVERT}>
|
|
234
|
+
Complementary Invert
|
|
235
|
+
</Caption>
|
|
236
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SECONDARY_INVERT}>
|
|
237
|
+
Secondary Invert
|
|
238
|
+
</Caption>
|
|
239
|
+
<Caption size={ECaptionSize.C1} type={EFontType.TERTIARY_INVERT}>
|
|
240
|
+
Tertiary Invert
|
|
241
|
+
</Caption>
|
|
242
|
+
<Caption size={ECaptionSize.C1} type={EFontType.BRAND_INVERT}>
|
|
243
|
+
Brand Invert
|
|
244
|
+
</Caption>
|
|
245
|
+
<Caption size={ECaptionSize.C1} type={EFontType.INFO_INVERT}>
|
|
246
|
+
Info Invert
|
|
247
|
+
</Caption>
|
|
248
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SUCCESS_INVERT}>
|
|
249
|
+
Success Invert
|
|
250
|
+
</Caption>
|
|
251
|
+
<Caption size={ECaptionSize.C1} type={EFontType.WARNING_INVERT}>
|
|
252
|
+
Warning Invert
|
|
253
|
+
</Caption>
|
|
254
|
+
<Caption size={ECaptionSize.C1} type={EFontType.ERROR_INVERT}>
|
|
255
|
+
Error Invert
|
|
256
|
+
</Caption>
|
|
257
|
+
<Caption size={ECaptionSize.C1} type={EFontType.DISABLED_INVERT}>
|
|
258
|
+
Disabled Invert
|
|
259
|
+
</Caption>
|
|
260
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SYSTEM_INVERT}>
|
|
261
|
+
System Invert
|
|
262
|
+
</Caption>
|
|
263
|
+
</div>
|
|
264
|
+
</div>
|
|
265
|
+
);
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Decorations
|
|
269
|
+
|
|
270
|
+
`stories/Typography/examples/Caption/Decorations.tsx`
|
|
271
|
+
|
|
272
|
+
```tsx
|
|
273
|
+
import React from "react";
|
|
274
|
+
import { Caption, ECaptionSize } from "@sberbusiness/triplex-next";
|
|
275
|
+
|
|
276
|
+
export const Decorations = () => (
|
|
277
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
278
|
+
<Caption size={ECaptionSize.C1}>Подпись без декораций</Caption>
|
|
279
|
+
<Caption size={ECaptionSize.C1} underline>
|
|
280
|
+
Подпись с подчеркиванием
|
|
281
|
+
</Caption>
|
|
282
|
+
<Caption size={ECaptionSize.C1} strikethrough>
|
|
283
|
+
Подпись с зачеркиванием
|
|
284
|
+
</Caption>
|
|
285
|
+
<Caption size={ECaptionSize.C1} underline strikethrough>
|
|
286
|
+
Подпись с подчеркиванием и зачеркиванием
|
|
287
|
+
</Caption>
|
|
288
|
+
</div>
|
|
289
|
+
);
|
|
290
|
+
```
|
|
291
|
+
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: Checkbox
|
|
3
3
|
category: Inputs
|
|
4
|
-
figma-node: ""
|
|
5
|
-
figma-file: ""
|
|
6
4
|
related: [CheckboxXGroup, CheckboxYGroup, CheckboxTree, CheckboxTreeExtended]
|
|
7
5
|
tokens:
|
|
8
6
|
- --triplex-next-Checkbox-Background_Default
|
|
@@ -26,7 +24,8 @@ version: "1.0"
|
|
|
26
24
|
# Checkbox
|
|
27
25
|
|
|
28
26
|
## Назначение
|
|
29
|
-
|
|
27
|
+
|
|
28
|
+
Нативный чекбокс в обёртке `<label>`, который поддерживает визуальные состояния (default / checked / disabled / focus) и режим частичного выбора через `bulk`.
|
|
30
29
|
|
|
31
30
|
Используй когда: нужен чекбокс с текстовой подписью (`children`) и стандартным поведением `<input type="checkbox">`.
|
|
32
31
|
Не используй когда: нужен сложный многошаговый выбор или компонент с нестандартной семантикой (тогда лучше другой control).
|
|
@@ -34,95 +33,95 @@ version: "1.0"
|
|
|
34
33
|
---
|
|
35
34
|
|
|
36
35
|
## Варианты и props
|
|
36
|
+
|
|
37
|
+
### Обязательные props
|
|
38
|
+
|
|
39
|
+
Обязательных custom-props нет.
|
|
40
|
+
|
|
37
41
|
### Опциональные props
|
|
42
|
+
|
|
38
43
|
| Prop | Тип | По умолчанию | Описание |
|
|
39
44
|
|---|---|---|---|
|
|
40
45
|
| `checked` | `boolean` | — | Состояние чекбокса (controlled). Передаётся через стандартные props `<input>`. |
|
|
41
46
|
| `defaultChecked` | `boolean` | — | Состояние чекбокса (uncontrolled). Передаётся через стандартные props `<input>`. |
|
|
42
47
|
| `disabled` | `boolean` | `false` | Блокирует взаимодействие и меняет визуальное состояние. |
|
|
43
|
-
| `bulk` | `boolean` | `false` | Влияет на отображаемую иконку (используется bulk-иконка)
|
|
48
|
+
| `bulk` | `boolean` | `false` | Влияет на отображаемую иконку (используется bulk-иконка). Видимость checkmark всё равно определяется состоянием `checked`. |
|
|
44
49
|
| `size` | `EComponentSize` | `EComponentSize.MD` | Размер: `SM` / `MD` / `LG`. |
|
|
45
50
|
| `children` | `React.ReactNode` | — | Контент лейбла рядом с чекбоксом. Если `children` нет — класс `.nonempty` не применяется. |
|
|
46
51
|
| `labelAttributes` | `React.LabelHTMLAttributes<HTMLLabelElement>` | — | Дополнительные HTML-атрибуты для корневого `<label>` (например, `className`, `onFocus`). |
|
|
47
|
-
| `...inputAttributes` | `Omit<React.InputHTMLAttributes<HTMLInputElement>, "type"
|
|
52
|
+
| `...inputAttributes` | `Omit<React.InputHTMLAttributes<HTMLInputElement>, "type" \| "size">` | — | Все стандартные атрибуты `<input type="checkbox">` (включая `name`, `onChange`, `aria-label` и т.д.). |
|
|
48
53
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
## Ключевые особенности реализации
|
|
52
|
-
### Ref forwarding
|
|
53
|
-
`ref` прокидывается на внутренний `<input type="checkbox">`.
|
|
54
|
-
|
|
55
|
-
### Иконка
|
|
56
|
-
- `bulk=false` — отрисовывается обычная checkmark-иконка.
|
|
57
|
-
- `bulk=true` — отрисовывается bulk-иконка.
|
|
54
|
+
### Ограничения использования
|
|
58
55
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
1. корневой `<label>`
|
|
62
|
-
2. `<input type="checkbox">`
|
|
63
|
-
3. декоративные `<span>`/`svg` для отрисовки фона и галочки
|
|
56
|
+
- DOM-структура фиксирована: корневой `<label>` → `<input type="checkbox">` → декоративные `<span>` / `<svg>` для отрисовки фона и галочки.
|
|
57
|
+
- `ref` прокидывается на внутренний `<input type="checkbox">`.
|
|
64
58
|
|
|
65
59
|
---
|
|
66
60
|
|
|
67
|
-
##
|
|
68
|
-
Компонент использует нативный `<input type="checkbox">`, поэтому поддерживает стандартную клавиатурную навигацию (Tab + Space) и семантику формы.
|
|
61
|
+
## Дизайн-токены
|
|
69
62
|
|
|
70
|
-
|
|
63
|
+
```
|
|
64
|
+
--triplex-next-Checkbox-Background_Default
|
|
65
|
+
--triplex-next-Checkbox-BorderColor_Default
|
|
66
|
+
--triplex-next-Checkbox-Checkmark_Fill_Default
|
|
67
|
+
--triplex-next-Checkbox-Background_Hover
|
|
68
|
+
--triplex-next-Checkbox-BorderColor_Hover
|
|
69
|
+
--triplex-next-Checkbox-Background_Checked_Default
|
|
70
|
+
--triplex-next-Checkbox-BorderColor_Checked_Default
|
|
71
|
+
--triplex-next-Checkbox-Background_Disabled
|
|
72
|
+
--triplex-next-Checkbox-BorderColor_Disabled
|
|
73
|
+
--triplex-next-Checkbox-Background_Checked_Disabled
|
|
74
|
+
--triplex-next-Checkbox-BorderColor_Checked_Disabled
|
|
75
|
+
--triplex-next-Checkbox-Checkmark_Fill_Disabled
|
|
76
|
+
--triplex-next-Checkbox-BorderColor_Focus
|
|
77
|
+
--triplex-next-Checkbox-Background_Checked_Hover
|
|
78
|
+
```
|
|
71
79
|
|
|
72
80
|
---
|
|
73
81
|
|
|
74
82
|
## Инварианты
|
|
83
|
+
|
|
75
84
|
- `forwardRef` на компоненте обязателен и должен указывать на `<input>`.
|
|
76
85
|
- Корневой DOM-элемент компонента — `<label>`, внутри которого находится `<input>`.
|
|
77
86
|
- `className` и `size` — публичные части внешнего контрактного API: не менять семантику без согласования.
|
|
78
87
|
|
|
79
88
|
---
|
|
80
89
|
|
|
81
|
-
##
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
`--triplex-next-Checkbox-Checkmark_Fill_Default`,
|
|
86
|
-
`--triplex-next-Checkbox-Background_Hover`,
|
|
87
|
-
`--triplex-next-Checkbox-BorderColor_Hover`,
|
|
88
|
-
`--triplex-next-Checkbox-Background_Checked_Default`,
|
|
89
|
-
`--triplex-next-Checkbox-BorderColor_Checked_Default`,
|
|
90
|
-
`--triplex-next-Checkbox-Background_Disabled`,
|
|
91
|
-
`--triplex-next-Checkbox-BorderColor_Disabled`,
|
|
92
|
-
`--triplex-next-Checkbox-Background_Checked_Disabled`,
|
|
93
|
-
`--triplex-next-Checkbox-BorderColor_Checked_Disabled`,
|
|
94
|
-
`--triplex-next-Checkbox-Checkmark_Fill_Disabled`,
|
|
95
|
-
`--triplex-next-Checkbox-BorderColor_Focus`,
|
|
96
|
-
`--triplex-next-Checkbox-Background_Checked_Hover`.
|
|
90
|
+
## Accessibility
|
|
91
|
+
|
|
92
|
+
- Компонент использует нативный `<input type="checkbox">`, поэтому поддерживает стандартную клавиатурную навигацию (Tab + Space) и семантику формы.
|
|
93
|
+
- Библиотека мультиязычная: текст `aria-label` / `title` не захардкожен в компоненте. При необходимости потребитель передаёт `aria-*` через `...inputAttributes`.
|
|
97
94
|
|
|
98
95
|
---
|
|
99
96
|
|
|
100
97
|
## Связанные компоненты
|
|
98
|
+
|
|
101
99
|
- `CheckboxXGroup` — группировка чекбоксов по оси X.
|
|
102
100
|
- `CheckboxYGroup` — группировка чекбоксов по оси Y.
|
|
103
|
-
- `CheckboxTree` — декларативное дерево чекбоксов (
|
|
104
|
-
- `CheckboxTreeExtended` — расширенное дерево чекбоксов на базе `
|
|
101
|
+
- `CheckboxTree` — декларативное дерево чекбоксов (обёртка над `CheckboxTreeExtended`), поддерживает bulk-логику и распространение состояния checked по родителям/детям.
|
|
102
|
+
- `CheckboxTreeExtended` — расширенное дерево чекбоксов на базе `CollapsibleTreeExtended` с `Node` / `Checkbox` подкомпонентами (использует нативный `Checkbox` внутри для каждого узла).
|
|
105
103
|
|
|
106
104
|
---
|
|
107
105
|
|
|
108
106
|
## Stories
|
|
109
|
-
|
|
107
|
+
|
|
108
|
+
Основные истории: `stories/Checkbox/Checkbox.stories.tsx`
|
|
110
109
|
Файлы примеров: `stories/Checkbox/examples/`
|
|
111
110
|
|
|
112
111
|
| Story | Example file | Что демонстрирует |
|
|
113
112
|
|---|---|---|
|
|
114
113
|
| `Playground` | `PlaygroundExample.tsx` | Интерактивный контроль основных props |
|
|
115
114
|
| `Default` | `DefaultExample.tsx` | Минимальное использование |
|
|
116
|
-
| `Sizes` | `SizesExample.tsx` | Размеры SM / MD / LG |
|
|
117
|
-
| `XGroup` | `XGroupExample.tsx` | Группа по оси X |
|
|
118
|
-
| `YGroup` | `YGroupExample.tsx` | Группа по оси Y |
|
|
115
|
+
| `Sizes` | `SizesExample.tsx` | Размеры `SM` / `MD` / `LG` |
|
|
119
116
|
|
|
120
117
|
---
|
|
121
118
|
|
|
122
119
|
## История изменений
|
|
120
|
+
|
|
123
121
|
| Дата | Изменение |
|
|
124
122
|
|---|---|
|
|
125
123
|
| 2026-04-16 | Приведение `Checkbox` к AI-ready: соблюдены правила `docs/ai/codestyle.md`, добавлена AI-документация и unit-тест на передачу `className` корневому `label`. |
|
|
124
|
+
| 2026-04-27 | Приведён в соответствие с `docs/ai/template-ai.md`: убрана секция «Ключевые особенности реализации» (содержимое перенесено в `Ограничения использования`), переставлены секции (Accessibility после Инвариантов), добавлена колонка `Example file`. |
|
|
126
125
|
|
|
127
126
|
---
|
|
128
127
|
|
|
@@ -158,81 +157,3 @@ export const SizesExample = () => (
|
|
|
158
157
|
);
|
|
159
158
|
```
|
|
160
159
|
|
|
161
|
-
### XGroup
|
|
162
|
-
|
|
163
|
-
`stories/Checkbox/examples/XGroupExample.tsx`
|
|
164
|
-
|
|
165
|
-
```tsx
|
|
166
|
-
import React from "react";
|
|
167
|
-
import { Checkbox, CheckboxXGroup, EComponentSize, Gap } from "@sberbusiness/triplex-next";
|
|
168
|
-
|
|
169
|
-
export const XGroupExample = () => (
|
|
170
|
-
<>
|
|
171
|
-
<CheckboxXGroup indent={16}>
|
|
172
|
-
{[1, 2, 3].map((value) => (
|
|
173
|
-
<Checkbox key={value} name="checkbox-x-group" value={value} size={EComponentSize.SM}>
|
|
174
|
-
Checkbox text
|
|
175
|
-
</Checkbox>
|
|
176
|
-
))}
|
|
177
|
-
</CheckboxXGroup>
|
|
178
|
-
<Gap size={16} />
|
|
179
|
-
<CheckboxXGroup indent={16}>
|
|
180
|
-
{[1, 2, 3].map((value) => (
|
|
181
|
-
<Checkbox key={value} name="checkbox-x-group" value={value}>
|
|
182
|
-
Checkbox text
|
|
183
|
-
</Checkbox>
|
|
184
|
-
))}
|
|
185
|
-
</CheckboxXGroup>
|
|
186
|
-
<Gap size={16} />
|
|
187
|
-
<CheckboxXGroup indent={20}>
|
|
188
|
-
{[1, 2, 3].map((value) => (
|
|
189
|
-
<Checkbox key={value} name="checkbox-x-group" value={value} size={EComponentSize.LG}>
|
|
190
|
-
Checkbox text
|
|
191
|
-
</Checkbox>
|
|
192
|
-
))}
|
|
193
|
-
</CheckboxXGroup>
|
|
194
|
-
</>
|
|
195
|
-
);
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
### YGroup
|
|
199
|
-
|
|
200
|
-
`stories/Checkbox/examples/YGroupExample.tsx`
|
|
201
|
-
|
|
202
|
-
```tsx
|
|
203
|
-
import React from "react";
|
|
204
|
-
import { Checkbox, CheckboxYGroup, Col, EComponentSize, Row } from "@sberbusiness/triplex-next";
|
|
205
|
-
|
|
206
|
-
export const YGroupExample = () => (
|
|
207
|
-
<Row>
|
|
208
|
-
<Col size={3}>
|
|
209
|
-
<CheckboxYGroup aria-labelledby="checkbox-y-group-label">
|
|
210
|
-
{[1, 2, 3, 4].map((value) => (
|
|
211
|
-
<Checkbox key={value} name="checkbox-y-group" value={value} size={EComponentSize.SM}>
|
|
212
|
-
Checkbox text
|
|
213
|
-
</Checkbox>
|
|
214
|
-
))}
|
|
215
|
-
</CheckboxYGroup>
|
|
216
|
-
</Col>
|
|
217
|
-
<Col size={3}>
|
|
218
|
-
<CheckboxYGroup aria-labelledby="checkbox-y-group-label">
|
|
219
|
-
{[1, 2, 3, 4].map((value) => (
|
|
220
|
-
<Checkbox key={value} name="checkbox-y-group" value={value}>
|
|
221
|
-
Checkbox text
|
|
222
|
-
</Checkbox>
|
|
223
|
-
))}
|
|
224
|
-
</CheckboxYGroup>
|
|
225
|
-
</Col>
|
|
226
|
-
<Col size={3}>
|
|
227
|
-
<CheckboxYGroup aria-labelledby="checkbox-y-group-label">
|
|
228
|
-
{[1, 2, 3, 4].map((value) => (
|
|
229
|
-
<Checkbox key={value} name="checkbox-y-group" value={value} size={EComponentSize.LG}>
|
|
230
|
-
Checkbox text
|
|
231
|
-
</Checkbox>
|
|
232
|
-
))}
|
|
233
|
-
</CheckboxYGroup>
|
|
234
|
-
</Col>
|
|
235
|
-
</Row>
|
|
236
|
-
);
|
|
237
|
-
```
|
|
238
|
-
|