@sberbusiness/triplex-next-mcp-server 0.24.0-beta2 → 0.36.0-beta0
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/BodyPage.md +186 -0
- package/bundle/components/Button.md +90 -85
- package/bundle/components/ButtonDropdown.md +28 -70
- package/bundle/components/ButtonIcon.md +35 -48
- package/bundle/components/Checkbox.md +43 -122
- package/bundle/components/CheckboxXGroup.md +109 -46
- package/bundle/components/CheckboxYGroup.md +77 -49
- package/bundle/components/CollapsibleTree.md +581 -0
- package/bundle/components/CollapsibleTreeExtended.md +418 -0
- 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/List.md +194 -186
- package/bundle/components/ListItem.md +251 -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 +877 -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/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 +283 -186
- package/bundle/components/Pagination.md +206 -229
- package/bundle/guides/codestyle.md +38 -11
- package/bundle/guides/commits.md +1 -2
- 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 +6 -2
- package/bundle/manifest.json +194 -24
- 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 +30 -0
- package/package.json +1 -1
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: ButtonIcon
|
|
3
3
|
category: Buttons
|
|
4
|
-
figma-node: ""
|
|
5
|
-
figma-file: ""
|
|
6
4
|
related: [Button]
|
|
7
5
|
tokens:
|
|
8
6
|
- --triplex-next-Button-Icon_Shadow_Focus
|
|
@@ -17,19 +15,7 @@ version: "1.0"
|
|
|
17
15
|
Кнопка только с иконкой без текстового контента. Используется как компактный trigger для локальных действий (например, открыть меню, удалить, закрыть).
|
|
18
16
|
|
|
19
17
|
Используй когда: действие можно однозначно распознать по иконке и есть корректный `aria-label`.
|
|
20
|
-
Не используй когда: нужен текстовый CTA или несколько визуальных тем с размерами как у `Button`
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Файловая структура
|
|
25
|
-
|
|
26
|
-
```text
|
|
27
|
-
src/components/Button/
|
|
28
|
-
├── ButtonIcon.tsx # Компонент (forwardRef, native button)
|
|
29
|
-
├── enums.ts # EButtonIconShape (SQUIRCLE / CIRCLE)
|
|
30
|
-
└── styles/
|
|
31
|
-
└── ButtonIcon.module.less # Геометрия, focus-visible, базовые состояния
|
|
32
|
-
```
|
|
18
|
+
Не используй когда: нужен текстовый CTA или несколько визуальных тем с размерами как у `Button` — используй `Button`.
|
|
33
19
|
|
|
34
20
|
---
|
|
35
21
|
|
|
@@ -51,29 +37,8 @@ src/components/Button/
|
|
|
51
37
|
### Ограничения использования
|
|
52
38
|
|
|
53
39
|
- Размер `ButtonIcon` задаётся размером переданной иконки; у компонента нет собственного prop `size`.
|
|
54
|
-
- Корневой DOM-элемент всегда
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Ключевые особенности реализации
|
|
59
|
-
|
|
60
|
-
### Маппинг формы через enum
|
|
61
|
-
|
|
62
|
-
- `shape` маппится в CSS-класс через `Record<EButtonIconShape, string>`.
|
|
63
|
-
- При расширении `EButtonIconShape` нужно добавить класс в маппинг и в `ButtonIcon.module.less`.
|
|
64
|
-
|
|
65
|
-
### Визуальные состояния
|
|
66
|
-
|
|
67
|
-
- `active` и `disabled` добавляются как глобальные CSS-классы (`active`, `disabled`) для совместимости с иконками.
|
|
68
|
-
- Дополнительно всегда добавляется класс `hoverable`.
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## Accessibility
|
|
73
|
-
|
|
74
|
-
- Компонент рендерит нативный `<button>`, поэтому базовая keyboard-навигация доступна из коробки.
|
|
75
|
-
- Компонент **не хардкодит** `aria-label` (библиотека мультиязычная). Для иконки без текста потребитель обязан передать `aria-label` через `...rest`.
|
|
76
|
-
- Фокусное состояние реализовано через `:focus-visible` и токен `--triplex-next-Button-Icon_Shadow_Focus`.
|
|
40
|
+
- Корневой DOM-элемент всегда `<button>`, `type` по умолчанию принудительно установлен в `button`.
|
|
41
|
+
- При расширении `EButtonIconShape` необходимо добавить класс в маппинг `Record<EButtonIconShape, string>` и в `ButtonIcon.module.less`.
|
|
77
42
|
|
|
78
43
|
---
|
|
79
44
|
|
|
@@ -94,16 +59,24 @@ src/components/Button/
|
|
|
94
59
|
|
|
95
60
|
---
|
|
96
61
|
|
|
62
|
+
## Accessibility
|
|
63
|
+
|
|
64
|
+
- Компонент рендерит нативный `<button>`, поэтому базовая keyboard-навигация доступна из коробки.
|
|
65
|
+
- Компонент **не хардкодит** `aria-label` (библиотека мультиязычная). Для иконки без текста потребитель **обязан** передать `aria-label` через `...rest`.
|
|
66
|
+
- Фокусное состояние реализовано через `:focus-visible` и токен `--triplex-next-Button-Icon_Shadow_Focus`.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
97
70
|
## Связанные компоненты
|
|
98
71
|
|
|
99
|
-
- `Button` (`src/components/Button/Button.tsx`)
|
|
100
|
-
- `ButtonDropdown` (`src/components/Button/ButtonDropdown.tsx`)
|
|
72
|
+
- `Button` (`src/components/Button/Button.tsx`) — текстовая/универсальная кнопка, используемая вместо `ButtonIcon` когда нужен label.
|
|
73
|
+
- `ButtonDropdown` (`src/components/Button/ButtonDropdown.tsx`) — использует иконочный паттерн для dots-варианта trigger.
|
|
101
74
|
|
|
102
75
|
---
|
|
103
76
|
|
|
104
77
|
## Stories
|
|
105
78
|
|
|
106
|
-
`stories/Buttons/ButtonIcon.stories.tsx`
|
|
79
|
+
Основные истории: `stories/Buttons/ButtonIcon.stories.tsx`
|
|
107
80
|
Файлы примеров: `stories/Buttons/examples/ButtonIcon/`
|
|
108
81
|
|
|
109
82
|
| Story | Example file | Что демонстрирует |
|
|
@@ -111,7 +84,7 @@ src/components/Button/
|
|
|
111
84
|
| `Playground` | `PlaygroundExample.tsx` | Интерактивный контроль `shape`, `active`, `disabled` |
|
|
112
85
|
| `Default` | `DefaultExample.tsx` | Базовый сценарий использования |
|
|
113
86
|
| `Sizes` | `SizesExample.tsx` | Разные размеры через размер иконки (16/20/24/32) |
|
|
114
|
-
| `
|
|
87
|
+
| `States` | `StatesExample.tsx` | Состояния `active` и `disabled` |
|
|
115
88
|
|
|
116
89
|
---
|
|
117
90
|
|
|
@@ -120,6 +93,8 @@ src/components/Button/
|
|
|
120
93
|
| Дата | Изменение |
|
|
121
94
|
|---|---|
|
|
122
95
|
| 2026-04-15 | Создан документ AI-ready для `ButtonIcon`. |
|
|
96
|
+
| 2026-04-27 | Приведён в соответствие с `docs/ai/template-ai.md`: убрана секция «Файловая структура», содержимое «Ключевых особенностей реализации» перенесено в `Ограничения использования`, добавлена колонка `Example file`. |
|
|
97
|
+
| 2026-07-08 | Актуализирована таблица Stories: story `Disabled` заменена на `States` (`StatesExample.tsx`). |
|
|
123
98
|
|
|
124
99
|
---
|
|
125
100
|
|
|
@@ -173,19 +148,31 @@ export const SizesExample = () => (
|
|
|
173
148
|
);
|
|
174
149
|
```
|
|
175
150
|
|
|
176
|
-
###
|
|
151
|
+
### States
|
|
177
152
|
|
|
178
|
-
`stories/Buttons/examples/ButtonIcon/
|
|
153
|
+
`stories/Buttons/examples/ButtonIcon/StatesExample.tsx`
|
|
179
154
|
|
|
180
155
|
```tsx
|
|
181
156
|
import React from "react";
|
|
182
157
|
import { DefaulticonStrokePrdIcon32 } from "@sberbusiness/icons-next";
|
|
183
158
|
import { ButtonIcon, EButtonIconShape } from "@sberbusiness/triplex-next";
|
|
184
159
|
|
|
185
|
-
export const
|
|
186
|
-
<
|
|
187
|
-
<
|
|
188
|
-
|
|
160
|
+
export const StatesExample = () => (
|
|
161
|
+
<div style={{ display: "flex", flexDirection: "column", gap: 16 }}>
|
|
162
|
+
<div style={{ display: "flex", flexDirection: "column", alignItems: "start", gap: "8px" }}>
|
|
163
|
+
<div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>Active</div>
|
|
164
|
+
<ButtonIcon shape={EButtonIconShape.SQUIRCLE} active>
|
|
165
|
+
<DefaulticonStrokePrdIcon32 paletteIndex={5} />
|
|
166
|
+
</ButtonIcon>
|
|
167
|
+
</div>
|
|
168
|
+
|
|
169
|
+
<div style={{ display: "flex", flexDirection: "column", alignItems: "start", gap: "8px" }}>
|
|
170
|
+
<div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>Disabled</div>
|
|
171
|
+
<ButtonIcon shape={EButtonIconShape.SQUIRCLE} disabled>
|
|
172
|
+
<DefaulticonStrokePrdIcon32 paletteIndex={5} />
|
|
173
|
+
</ButtonIcon>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
189
176
|
);
|
|
190
177
|
```
|
|
191
178
|
|
|
@@ -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
|
-
|
|
@@ -1,109 +1,172 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: CheckboxXGroup
|
|
3
3
|
category: Inputs
|
|
4
|
-
figma-node: ""
|
|
5
|
-
figma-file: ""
|
|
6
4
|
related: [Checkbox]
|
|
7
5
|
tokens: []
|
|
8
|
-
stories: stories/
|
|
6
|
+
stories: stories/CheckboxXGroup/CheckboxXGroup.stories.tsx
|
|
9
7
|
version: "1.0"
|
|
10
8
|
---
|
|
11
9
|
|
|
12
10
|
# CheckboxXGroup
|
|
13
11
|
|
|
14
12
|
## Назначение
|
|
15
|
-
|
|
16
|
-
Используется как контейнер для нескольких `Checkbox`, когда нужно разложить их в строку с переносами.
|
|
13
|
+
|
|
14
|
+
Компонент-группа для компоновки чекбоксов с направлением по оси `X`. Используется как контейнер для нескольких `Checkbox`, когда нужно разложить их в строку с переносами.
|
|
15
|
+
|
|
16
|
+
Используй когда: несколько связанных чекбоксов нужно разместить в строку.
|
|
17
|
+
Не используй когда: чекбоксы должны идти вертикально — используй `CheckboxYGroup`.
|
|
17
18
|
|
|
18
19
|
---
|
|
19
20
|
|
|
20
21
|
## Варианты и props
|
|
22
|
+
|
|
23
|
+
### Обязательные props
|
|
24
|
+
|
|
25
|
+
Обязательных custom-props нет.
|
|
26
|
+
|
|
21
27
|
### Опциональные props
|
|
28
|
+
|
|
22
29
|
| Prop | Тип | По умолчанию | Описание |
|
|
23
30
|
|---|---|---|---|
|
|
24
31
|
| `indent` | `TIndentSize` | `12` | Отступы/зазоры между чекбоксами в группе. Возможные значения: `12, 16, 20, 24, 28, 32`. |
|
|
25
32
|
| `children` | `React.ReactNode` | — | Внутри обычно рендерятся `Checkbox`. |
|
|
26
33
|
| `...divAttributes` | `React.HTMLAttributes<HTMLDivElement>` | — | Все стандартные HTML-атрибуты для корневого элемента. |
|
|
27
34
|
|
|
28
|
-
|
|
35
|
+
### Ограничения использования
|
|
29
36
|
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
- Разметка: `inline-flex` и `flex-flow: row wrap`.
|
|
33
|
-
- `indent` управляет применением LESS-класса `indent-{n}` и задает отрицательные/положительные маргины для выравнивания сетки.
|
|
37
|
+
- Корневой элемент — `<div role="group">`, разметка построена на `inline-flex` и `flex-flow: row wrap`.
|
|
38
|
+
- `indent` управляет применением LESS-класса `indent-{n}` и задаёт отрицательные/положительные маргины для выравнивания сетки.
|
|
34
39
|
|
|
35
40
|
---
|
|
36
41
|
|
|
37
|
-
##
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
## Дизайн-токены
|
|
43
|
+
|
|
44
|
+
Компонент не использует собственных CSS-переменных. Все визуальные стили наследуются от `Checkbox`.
|
|
40
45
|
|
|
41
46
|
---
|
|
42
47
|
|
|
43
48
|
## Инварианты
|
|
49
|
+
|
|
44
50
|
- `forwardRef` обязателен и должен указывать на корневой `<div>`.
|
|
45
51
|
- Корневой DOM-элемент компонента — `<div>`, роль зафиксирована как `role="group"`.
|
|
46
52
|
|
|
47
53
|
---
|
|
48
54
|
|
|
55
|
+
## Accessibility
|
|
56
|
+
|
|
57
|
+
- `role="group"` описывает группу взаимосвязанных контролов.
|
|
58
|
+
- Семантика чекбоксов остаётся нативной на уровне `Checkbox` внутри группы.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
49
62
|
## Связанные компоненты
|
|
63
|
+
|
|
50
64
|
- `Checkbox` — базовый чекбокс, обычно используется внутри `CheckboxXGroup`.
|
|
65
|
+
- `CheckboxYGroup` — аналогичная группа, но с направлением по оси `Y`.
|
|
51
66
|
|
|
52
67
|
---
|
|
53
68
|
|
|
54
69
|
## Stories
|
|
55
|
-
|
|
56
|
-
|
|
70
|
+
|
|
71
|
+
Основные истории: `stories/CheckboxXGroup/CheckboxXGroup.stories.tsx`
|
|
72
|
+
Файлы примеров: `stories/CheckboxXGroup/examples/`
|
|
57
73
|
|
|
58
74
|
| Story | Example file | Что демонстрирует |
|
|
59
75
|
|---|---|---|
|
|
60
|
-
| `
|
|
76
|
+
| `Playground` | `PlaygroundExample.tsx` | Интерактивный контроль `indent` |
|
|
77
|
+
| `Default` | `DefaultExample.tsx` | Группа по оси X |
|
|
78
|
+
| `CheckboxSizes` | `SizesExample.tsx` | Группа чекбоксов разных размеров |
|
|
79
|
+
| `Indents` | `IndentsExample.tsx` | Различные значения отступа |
|
|
61
80
|
|
|
62
81
|
---
|
|
63
82
|
|
|
64
83
|
## История изменений
|
|
84
|
+
|
|
65
85
|
| Дата | Изменение |
|
|
66
86
|
|---|---|
|
|
67
87
|
| 2026-04-16 | Приведение `CheckboxXGroup` к AI-ready: добавлен `forwardRef`, типизирован `children`, созданы AI-документ и инварианты. |
|
|
88
|
+
| 2026-04-27 | Приведён в соответствие с `docs/ai/template-ai.md`: убрана секция «Ключевые особенности реализации» (содержимое перенесено в `Ограничения использования`), переставлены секции, добавлена колонка `Example file` и пустой раздел `Дизайн-токены`. |
|
|
68
89
|
|
|
69
90
|
---
|
|
70
91
|
|
|
71
92
|
## Примеры использования
|
|
72
93
|
|
|
73
|
-
###
|
|
94
|
+
### Default
|
|
95
|
+
|
|
96
|
+
`stories/CheckboxXGroup/examples/DefaultExample.tsx`
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
import React from "react";
|
|
100
|
+
import { Checkbox, CheckboxXGroup } from "@sberbusiness/triplex-next";
|
|
101
|
+
|
|
102
|
+
export const DefaultExample = () => (
|
|
103
|
+
<CheckboxXGroup>
|
|
104
|
+
{[1, 2, 3].map((value) => (
|
|
105
|
+
<Checkbox key={value} name="checkbox-x-group" value={value}>
|
|
106
|
+
Checkbox text
|
|
107
|
+
</Checkbox>
|
|
108
|
+
))}
|
|
109
|
+
</CheckboxXGroup>
|
|
110
|
+
);
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### CheckboxSizes
|
|
114
|
+
|
|
115
|
+
`stories/CheckboxXGroup/examples/SizesExample.tsx`
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
import React from "react";
|
|
119
|
+
import { Checkbox, CheckboxXGroup, EComponentSize } from "@sberbusiness/triplex-next";
|
|
120
|
+
|
|
121
|
+
const sizes = [
|
|
122
|
+
{ label: "SM", size: EComponentSize.SM },
|
|
123
|
+
{ label: "MD", size: EComponentSize.MD },
|
|
124
|
+
{ label: "LG", size: EComponentSize.LG },
|
|
125
|
+
] as const;
|
|
126
|
+
|
|
127
|
+
export const SizesExample = () => (
|
|
128
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
|
|
129
|
+
{sizes.map(({ label, size }) => (
|
|
130
|
+
<div key={label}>
|
|
131
|
+
<div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{label}</div>
|
|
132
|
+
<CheckboxXGroup>
|
|
133
|
+
{[1, 2, 3].map((value) => (
|
|
134
|
+
<Checkbox key={value} name={`checkbox-x-group-${label}`} value={value} size={size}>
|
|
135
|
+
Checkbox text
|
|
136
|
+
</Checkbox>
|
|
137
|
+
))}
|
|
138
|
+
</CheckboxXGroup>
|
|
139
|
+
</div>
|
|
140
|
+
))}
|
|
141
|
+
</div>
|
|
142
|
+
);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Indents
|
|
74
146
|
|
|
75
|
-
`stories/
|
|
147
|
+
`stories/CheckboxXGroup/examples/IndentsExample.tsx`
|
|
76
148
|
|
|
77
149
|
```tsx
|
|
78
150
|
import React from "react";
|
|
79
|
-
import { Checkbox, CheckboxXGroup
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
</
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
<Gap size={16} />
|
|
99
|
-
<CheckboxXGroup indent={20}>
|
|
100
|
-
{[1, 2, 3].map((value) => (
|
|
101
|
-
<Checkbox key={value} name="checkbox-x-group" value={value} size={EComponentSize.LG}>
|
|
102
|
-
Checkbox text
|
|
103
|
-
</Checkbox>
|
|
104
|
-
))}
|
|
105
|
-
</CheckboxXGroup>
|
|
106
|
-
</>
|
|
151
|
+
import { Checkbox, CheckboxXGroup } from "@sberbusiness/triplex-next";
|
|
152
|
+
|
|
153
|
+
const indents = [12, 16, 20, 24, 28, 32] as const;
|
|
154
|
+
|
|
155
|
+
export const IndentsExample = () => (
|
|
156
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
|
|
157
|
+
{indents.map((indent) => (
|
|
158
|
+
<div key={indent}>
|
|
159
|
+
<div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{indent}px</div>
|
|
160
|
+
<CheckboxXGroup indent={indent}>
|
|
161
|
+
{[1, 2, 3, 4].map((value) => (
|
|
162
|
+
<Checkbox key={value} name={`checkbox-x-group-${indent}`} value={value}>
|
|
163
|
+
Checkbox text
|
|
164
|
+
</Checkbox>
|
|
165
|
+
))}
|
|
166
|
+
</CheckboxXGroup>
|
|
167
|
+
</div>
|
|
168
|
+
))}
|
|
169
|
+
</div>
|
|
107
170
|
);
|
|
108
171
|
```
|
|
109
172
|
|