@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.
Files changed (55) hide show
  1. package/README.md +10 -0
  2. package/bundle/components/BodyPage.md +186 -0
  3. package/bundle/components/Button.md +90 -85
  4. package/bundle/components/ButtonDropdown.md +28 -70
  5. package/bundle/components/ButtonIcon.md +35 -48
  6. package/bundle/components/Checkbox.md +43 -122
  7. package/bundle/components/CheckboxXGroup.md +109 -46
  8. package/bundle/components/CheckboxYGroup.md +77 -49
  9. package/bundle/components/CollapsibleTree.md +581 -0
  10. package/bundle/components/CollapsibleTreeExtended.md +418 -0
  11. package/bundle/components/EmptyView.md +14 -15
  12. package/bundle/components/FooterPage.md +203 -0
  13. package/bundle/components/Gap.md +115 -57
  14. package/bundle/components/HeaderPage.md +226 -0
  15. package/bundle/components/HelpBox.md +45 -84
  16. package/bundle/components/ImageGallery.md +423 -0
  17. package/bundle/components/ImageGalleryExtended.md +606 -0
  18. package/bundle/components/List.md +194 -186
  19. package/bundle/components/ListItem.md +251 -0
  20. package/bundle/components/ListItemControlsButton.md +103 -0
  21. package/bundle/components/ListItemControlsButtonDropdown.md +107 -0
  22. package/bundle/components/ListItemSelectable.md +99 -0
  23. package/bundle/components/ListItemTable.md +390 -0
  24. package/bundle/components/ListMaster.md +877 -156
  25. package/bundle/components/ListMasterFooter.md +80 -0
  26. package/bundle/components/ListMasterHeader.md +86 -0
  27. package/bundle/components/ListSortable.md +153 -0
  28. package/bundle/components/ListSortableItem.md +175 -0
  29. package/bundle/components/ModalWindow.md +427 -237
  30. package/bundle/components/MonthYearField.md +145 -109
  31. package/bundle/components/Notification.md +625 -155
  32. package/bundle/components/Overlay.md +271 -170
  33. package/bundle/components/Page.md +283 -186
  34. package/bundle/components/Pagination.md +206 -229
  35. package/bundle/guides/codestyle.md +38 -11
  36. package/bundle/guides/commits.md +1 -2
  37. package/bundle/guides/context.md +34 -30
  38. package/bundle/guides/stories.md +110 -40
  39. package/bundle/guides/template.md +3 -7
  40. package/bundle/guides/tests.md +6 -2
  41. package/bundle/manifest.json +194 -24
  42. package/bundle/release-notes/1.26.0.mdx +33 -2
  43. package/bundle/release-notes/1.27.0.mdx +43 -0
  44. package/bundle/release-notes/1.28.0.mdx +25 -0
  45. package/bundle/release-notes/1.29.0.mdx +47 -0
  46. package/bundle/release-notes/1.30.0.mdx +56 -0
  47. package/bundle/release-notes/1.31.0.mdx +52 -0
  48. package/bundle/release-notes/1.32.0.mdx +35 -0
  49. package/bundle/release-notes/1.33.0.mdx +61 -0
  50. package/bundle/release-notes/1.34.0.mdx +35 -0
  51. package/bundle/release-notes/1.35.0.mdx +21 -0
  52. package/bundle/release-notes/1.35.1.mdx +11 -0
  53. package/bundle/release-notes/1.36.0.mdx +21 -0
  54. package/bundle/release-notes/1.37.0.mdx +30 -0
  55. 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` - используй `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-элемент всегда `button`, `type` по умолчанию принудительно установлен в `button`.
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`) - текстовая/универсальная кнопка, используемая вместо `ButtonIcon` когда нужен label.
100
- - `ButtonDropdown` (`src/components/Button/ButtonDropdown.tsx`) - использует иконочный паттерн для dots-варианта trigger.
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
- | `Disabled` | `DisabledExample.tsx` | Неактивное состояние |
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
- ### Disabled
151
+ ### States
177
152
 
178
- `stories/Buttons/examples/ButtonIcon/DisabledExample.tsx`
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 DisabledExample = () => (
186
- <ButtonIcon shape={EButtonIconShape.SQUIRCLE} disabled>
187
- <DefaulticonStrokePrdIcon32 paletteIndex={5} />
188
- </ButtonIcon>
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
- Нативный чекбокс в обертке `<label>`, который поддерживает визуальные состояния (default/checked/disabled/focus) и режим частичного выбора через `bulk`.
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-иконка), при этом видимость checkmark всё равно определяется состоянием `checked`. |
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" | "size">` | — | Все стандартные атрибуты `<input type="checkbox">` (включая `name`, `onChange`, `aria-label` и т.д.). |
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
- ### Структура DOM
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
- ## Accessibility
68
- Компонент использует нативный `<input type="checkbox">`, поэтому поддерживает стандартную клавиатурную навигацию (Tab + Space) и семантику формы.
61
+ ## Дизайн-токены
69
62
 
70
- Библиотека мультиязычная: текст `aria-label`/`title` не захардкожен в компоненте. При необходимости потребитель передаёт `aria-*` через `...inputAttributes`.
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
- Компонент использует CSS-переменные:
83
- `--triplex-next-Checkbox-Background_Default`,
84
- `--triplex-next-Checkbox-BorderColor_Default`,
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` — декларативное дерево чекбоксов (обертка над `CheckboxTreeExtended`), поддерживает bulk-логику и распространение состояния checked по родителям/детям.
104
- - `CheckboxTreeExtended` — расширенное дерево чекбоксов на базе `CollapsableTree` с Node/Checkbox подкомпонентами (использует нативный `Checkbox` внутри для каждого узла).
101
+ - `CheckboxTree` — декларативное дерево чекбоксов (обёртка над `CheckboxTreeExtended`), поддерживает bulk-логику и распространение состояния checked по родителям/детям.
102
+ - `CheckboxTreeExtended` — расширенное дерево чекбоксов на базе `CollapsibleTreeExtended` с `Node` / `Checkbox` подкомпонентами (использует нативный `Checkbox` внутри для каждого узла).
105
103
 
106
104
  ---
107
105
 
108
106
  ## Stories
109
- `stories/Checkbox/Checkbox.stories.tsx`
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/Checkbox/Checkbox.stories.tsx
6
+ stories: stories/CheckboxXGroup/CheckboxXGroup.stories.tsx
9
7
  version: "1.0"
10
8
  ---
11
9
 
12
10
  # CheckboxXGroup
13
11
 
14
12
  ## Назначение
15
- Компонент-группа для компоновки чекбоксов с направлением по оси `X`.
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
- - Корневой элемент: `<div role="group">`.
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
- ## Accessibility
38
- - `role="group"` описывает группу взаимосвязанных контролов.
39
- - Семантика чекбоксов остается нативной на уровне `Checkbox` внутри группы.
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
- `stories/Checkbox/Checkbox.stories.tsx`
56
- Файлы примеров: `stories/Checkbox/examples/`
70
+
71
+ Основные истории: `stories/CheckboxXGroup/CheckboxXGroup.stories.tsx`
72
+ Файлы примеров: `stories/CheckboxXGroup/examples/`
57
73
 
58
74
  | Story | Example file | Что демонстрирует |
59
75
  |---|---|---|
60
- | `XGroup` | `XGroupExample.tsx` | Группа по оси X |
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
- ### XGroup
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/Checkbox/examples/XGroupExample.tsx`
147
+ `stories/CheckboxXGroup/examples/IndentsExample.tsx`
76
148
 
77
149
  ```tsx
78
150
  import React from "react";
79
- import { Checkbox, CheckboxXGroup, EComponentSize, Gap } from "@sberbusiness/triplex-next";
80
-
81
- export const XGroupExample = () => (
82
- <>
83
- <CheckboxXGroup indent={16}>
84
- {[1, 2, 3].map((value) => (
85
- <Checkbox key={value} name="checkbox-x-group" value={value} size={EComponentSize.SM}>
86
- Checkbox text
87
- </Checkbox>
88
- ))}
89
- </CheckboxXGroup>
90
- <Gap size={16} />
91
- <CheckboxXGroup indent={16}>
92
- {[1, 2, 3].map((value) => (
93
- <Checkbox key={value} name="checkbox-x-group" value={value}>
94
- Checkbox text
95
- </Checkbox>
96
- ))}
97
- </CheckboxXGroup>
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