@sberbusiness/triplex-next-mcp-server 1.42.0-beta → 1.44.0-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/bundle/components/AlertProcess.md +3 -2
  2. package/bundle/components/BodyPage.md +72 -4
  3. package/bundle/components/Button.md +1 -0
  4. package/bundle/components/Checkbox.md +7 -1
  5. package/bundle/components/CheckboxTreeExtended.md +149 -248
  6. package/bundle/components/CheckboxXGroup.md +2 -0
  7. package/bundle/components/CheckboxYGroup.md +7 -2
  8. package/bundle/components/ChipGroup.md +195 -126
  9. package/bundle/components/CollapsibleTreeExtended.md +6 -1
  10. package/bundle/components/DatePickerExtended.md +409 -262
  11. package/bundle/components/ExpandAnimation.md +263 -218
  12. package/bundle/components/Footer.md +235 -278
  13. package/bundle/components/Island.md +36 -1
  14. package/bundle/components/LightBox.md +14 -3
  15. package/bundle/components/MediaWidth.md +7 -1
  16. package/bundle/components/Notification.md +21 -3
  17. package/bundle/components/Overlay.md +24 -1
  18. package/bundle/components/Pagination.md +12 -13
  19. package/bundle/components/SliderExtended.md +358 -222
  20. package/bundle/components/TableBasic.md +2294 -0
  21. package/bundle/components/TabsExtended.md +380 -194
  22. package/bundle/components/Tag.md +259 -78
  23. package/bundle/components/TopOverlay.md +366 -90
  24. package/bundle/components/TreeView.md +343 -166
  25. package/bundle/components/TreeViewNode.md +436 -0
  26. package/bundle/components/UnorderedList.md +254 -0
  27. package/bundle/components/UnorderedListExtended.md +255 -0
  28. package/bundle/components/WindowResizeListener.md +249 -0
  29. package/bundle/guides/commits.md +121 -15
  30. package/bundle/guides/stories.md +1 -1
  31. package/bundle/manifest.json +46 -20
  32. package/bundle/release-notes/1.43.0.mdx +87 -0
  33. package/bundle/release-notes/1.44.0.mdx +120 -0
  34. package/bundle/release-notes/1.45.0.mdx +7 -0
  35. package/package.json +1 -1
@@ -1,9 +1,7 @@
1
1
  ---
2
2
  component: ChipGroup
3
3
  category: Chips
4
- figma-node: ""
5
- figma-file: ""
6
- related: [Chip, TagGroup]
4
+ related: [Chip]
7
5
  tokens: []
8
6
  stories: stories/Chips/ChipGroup.stories.tsx
9
7
  version: "1.0"
@@ -13,162 +11,120 @@ version: "1.0"
13
11
 
14
12
  ## Назначение
15
13
 
16
- Контейнер для набора `Chip` (и любых `Chip*`-вариантов). Управляет
17
- расстоянием между чипами (`gap` по size), способом переноса (`flex-wrap`)
18
- или горизонтальным скроллом (`oneLine`), и скрывает скроллбар.
14
+ Контейнер-раскладка для чипсов: расставляет `Chip` и его варианты во flex-строку
15
+ с одинаковым отступом и решает, переносятся они на новые строки или выстраиваются
16
+ в одну строку с горизонтальной прокруткой.
19
17
 
20
- Это **layout-only** обёртка: не передаёт `size` детям, не синхронизирует
21
- disabled/selected — только стайлит контейнер. Размер чипов потребитель
22
- задаёт на каждом Chip индивидуально (но обычно ставит тот же, что в
23
- ChipGroup).
24
-
25
- Используй когда: есть 2+ чипа в одной строке или блоке фильтров.
26
- Не используй когда: один чип (без обёртки он тоже валиден); нужен вертикальный
27
- список (ChipGroup только горизонтальный); нужны теги-метки — бери `TagGroup`.
18
+ Используй когда: на экране идёт ряд однотипных чипсов-фильтров или тегов-действий —
19
+ `ChipGroup` рекомендуемая обёртка для любого члена семейства Chip*.
20
+ Не используй когда: нужен контейнер общего назначения с отступами — бери собственную
21
+ вёрстку (`Gap` для этого не годится: он принимает `Omit<..., "children">` и рендерит
22
+ пустой разделитель фиксированной высоты), или группируются `Tag` — у них своя группа
23
+ `TagGroup`.
28
24
 
29
25
  ---
30
26
 
31
- ## Файловая структура
32
-
33
- ```text
34
- src/components/ChipGroup/
35
- ├── ChipGroup.tsx # React.forwardRef
36
- ├── index.ts # Barrel
37
- └── styles/ChipGroup.module.less # flex + oneLine (hidden scrollbar) / multiLine (wrap)
38
- ```
39
-
40
- Особенности:
41
- - **Нет `__tests__`**, нет subcomponents — компонент максимально тонкий.
42
- - **`size` — prop, но НЕ форвардится детям**. Влияет только на `gap`.
43
- Размер чипов — ответственность потребителя.
27
+ ## Варианты и props
44
28
 
45
- ---
29
+ ### Обязательные props
46
30
 
47
- ## Варианты и props
31
+ Обязательных props нет — `ChipGroup` работает без единого аргумента.
48
32
 
49
- ### `IChipGroupProps extends React.HTMLAttributes<HTMLDivElement>`
33
+ ### Опциональные props
50
34
 
51
- | Prop | Тип | Default | Описание |
35
+ | Prop | Тип | По умолчанию | Описание |
52
36
  |---|---|---|---|
53
- | `oneLine` | `boolean` | `false` | `true` → `flex` + `overflow: auto` (горизонтальный скролл, скроллбар скрыт). `false` → `flex-wrap: wrap` (многострочный). |
54
- | `size` | `EComponentSize` | `MD` | Управляет gap: SM=8px, MD=8px, LG=12px. **Не передаётся в Chip.** |
55
- | `children` | `ReactNode` | — | Обычно набор Chip/ChipIcon/ChipSelect etc. |
56
- | `className` | `string` | — | Dop class через `clsx`. |
57
- | `...HTMLDivAttributes` | — | — | Все стандартные. |
37
+ | `size` | `EComponentSize` | `MD` | Отступ между чипсами: `LG` — 12px, `MD` и `SM` — 8px |
38
+ | `oneLine` | `boolean` | `false` | Одна строка с горизонтальной прокруткой вместо переноса |
39
+ | `children` | `React.ReactNode` | — | Обычно набор `Chip`, `ChipIcon`, `ChipSelect` и других членов семейства |
40
+ | `...HTMLDivAttributes` | `React.HTMLAttributes<HTMLDivElement>` | — | Все атрибуты `<div>`, включая `style`, `role`, `aria-*`, `data-*` |
41
+
42
+ ### Ограничения использования
43
+
44
+ - **`size` не пробрасывается в чипсы.** Он задаёт только `gap` контейнера; размер
45
+ самих чипсов потребитель выставляет на каждом `Chip` отдельно (так сделано во всех
46
+ примерах stories). Рассинхрон `size` группы и `size` чипсов ничем не подсвечивается.
47
+ - **`SM` и `MD` дают одинаковый отступ 8px** — визуально различимы только `LG` и остальные.
48
+ - **`oneLine` прячет полосу прокрутки** (`scrollbar-width: none`, `-ms-overflow-style: none`,
49
+ `::-webkit-scrollbar { display: none }`), сама прокрутка остаётся. Пользователю нужен
50
+ другой аффорданс — жест, стрелки-кнопки или обрезка контента по краю.
51
+ - **В режиме `oneLine` дети не должны сжиматься.** `flex-shrink: 0` задан только классом
52
+ `.chip`, то есть гарантирован у `Chip` и его прямых обёрток `ChipIcon` и `ChipOptions` —
53
+ они уезжают за границу и прокручиваются. У остальных членов семейства (`ChipSelect`,
54
+ `ChipMultiselect`, `ChipSort`, `ChipSuggest`, `ChipDatePicker`) корневой элемент несёт
55
+ только `.chipGroupItem` без `flex-shrink`, как и произвольный ребёнок, — такой элемент
56
+ сожмётся вместо прокрутки.
57
+ - **Ширину контейнер не ограничивает.** В `oneLine` прокрутка появится, только если ширину
58
+ задал потребитель или родитель (в stories это `style={{ maxWidth: 360 }}`).
59
+ - **`data-tx` выставляется после `{...rest}`** — версию библиотеки в этом атрибуте
60
+ переопределить нельзя, в отличие от остальных атрибутов.
58
61
 
59
62
  ---
60
63
 
61
- ## Ключевые особенности реализации
62
-
63
- ### `oneLine` → горизонтальный скролл со скрытым скроллбаром
64
-
65
- ```less
66
- &.oneLine {
67
- overflow: auto;
68
- scrollbar-width: none;
69
- -ms-overflow-style: none;
70
- &::-webkit-scrollbar { display: none; }
71
- }
72
- ```
73
-
74
- Скроллбар скрыт во всех браузерах. Пользователь скроллит свайпом (touch)
75
- или shift+wheel. **Без отдельной кнопки "стрелка"** — в отличие от
76
- `CarouselExtended`. Если нужны стрелки — оборачивай ChipGroup в
77
- `CarouselExtended`.
78
-
79
- ### `multiLine` по умолчанию
80
-
81
- ```less
82
- &.multiLine { flex-wrap: wrap; }
83
- ```
84
-
85
- Без wrap — инлайновые чипы проталкивали бы родителя в overflow. Multi-line
86
- — стандартное поведение фильтров.
87
-
88
- ### `gap` зависит от size
89
-
90
- - SM / MD: 8px
91
- - LG: 12px
92
-
93
- SM и MD одинаковы — это дизайн-решение. **Не объединять** в `& { gap: 8px }`
94
- и `&.lg { gap: 12px }` — поменяет интенсивность спецификации, может
95
- сломать override'ы потребителей.
96
-
97
- ### `createSizeToClassNameMap(styles)` — тот же паттерн
98
-
99
- Тот же `classNameMaps.ts` утилита, что в Badge / Chip / многих других.
100
- Если добавить XS/XL в EComponentSize — нужно обновить и mapping, и LESS.
101
-
102
- ### `data-tx={process.env.npm_package_version}` — есть
103
-
104
- Стандарт библиотеки. Не удалять.
105
-
106
- ### size не передаётся детям
64
+ ## Дизайн-токены
107
65
 
108
- **Это отличие от многих других групповых компонентов** (CheckboxXGroup/YGroup
109
- передают size через контекст). ChipGroup намеренно не передаёт — потребители
110
- могут иметь чипы разных размеров в одной группе (например, ChipIcon LG +
111
- Chip MD — визуально смотрится как отдельная подсвеченная кнопка).
66
+ Компонент не использует собственных CSS-переменных: в стилях только раскладка
67
+ (`display: flex`, `flex-wrap`, `gap`, `overflow`). Цвета и размеры приходят от вложенных
68
+ чипсов.
112
69
 
113
70
  ---
114
71
 
115
72
  ## Инварианты
116
73
 
117
- - **`forwardRef`** — обязателен.
118
- - **`display: flex`** на root — не менять на grid. Потребители могут
119
- полагаться на flex-item поведение чипов (`styles.chipGroupItem`
120
- декларирует `display: inline-block`).
121
- - **Скрытый скроллбар в `oneLine`** — три вендор-префикса, не удалять.
122
- - **`gap` только на root-класе `.chipGroup`** — дети (чипы) не должны
123
- иметь собственных margin'ов.
124
- - **`size` не прокидывается детям** — осознанное решение. Не добавлять
125
- контекст "для консистентности".
126
- - **`data-tx`** — не удалять.
74
+ - **`forwardRef`** — обязателен, `ref` указывает на корневой `<div>`. Не убирать.
75
+ - **Корневой элемент — `<div>` без собственной роли.** Роль и ARIA-подписи — зона
76
+ ответственности потребителя, компонент их не навязывает.
77
+ - **`className` и `{...rest}` уходят на тот же корневой `<div>`, что и `ref`.** `className`
78
+ добавляется последним аргументом `clsx` и собственные классы не затирает.
79
+ - **Классы `.oneLine` и `.multiLine` взаимоисключающие** — ровно один из них есть всегда.
80
+ На это опираются unit-тесты `__tests__/ChipGroup.test.tsx`.
81
+ - **Публичный API** — `ChipGroup`, `IChipGroupProps` через `src/components/ChipGroup/index.ts`
82
+ и общий barrel `src/components/index.ts`. Сохранять.
83
+ - **`EComponentSize`** — общий enum из `src/enums/EComponentSize`, локального аналога не заводить.
84
+ - **Story ids `chips-chipgroup--*`** завязаны на baseline-скриншоты в `__screenshots__/` —
85
+ переименование story требует синхронного обновления baseline.
127
86
 
128
87
  ---
129
88
 
130
89
  ## Accessibility
131
90
 
132
- - **Нет ARIA-ролей** — ChipGroup семантически нейтрален. Если это набор
133
- фильтров — потребитель может обернуть в `<fieldset>` с `<legend>` или
134
- добавить `role="group"` + `aria-label`.
135
- - **Клавиатурная навигация** — **не реализована**. Tab перемещается
136
- линейно через tabbable-чипы внутри. Arrow keys не поддерживаются. Если
137
- нужен roving-tabindex с arrow keys — это задача потребителя (или бери
138
- `RadioGroup`/`TabsLine`-семейства).
139
- - **Скроллбар в oneLine скрыт визуально**, но работает клавиатурой (можно
140
- кликнуть в ChipGroup и использовать arrow-left/right для скролла). Screen
141
- reader-ы обычно читают содержимое независимо от видимости скроллбара.
142
-
143
- ---
144
-
145
- ## Дизайн-токены
146
-
147
- Нет. Компонент структурный — gap'ы жёстко в LESS.
91
+ - Компонент — чисто визуальный контейнер: не задаёт роль, не перехватывает клавиатуру
92
+ и не управляет фокусом. Семантика остаётся на вложенных чипсах (`<span role="button">`).
93
+ - Если ряд чипсов логически является группой контролов, потребитель сам передаёт
94
+ `role="group"` (или `role="toolbar"`) и `aria-label` / `aria-labelledby` через `...rest` —
95
+ библиотека мультиязычная, текст внутри не хардкодится.
96
+ - **Режим `oneLine` создаёт прокручиваемую область без видимой полосы.** Чтобы контент
97
+ оставался доступным с клавиатуры, потребителю стоит либо оставить чипсы фокусируемыми
98
+ (по умолчанию так и есть — прокрутка следует за фокусом), либо сделать сам контейнер
99
+ фокусируемым (`tabIndex={0}` с ролью и подписью).
148
100
 
149
101
  ---
150
102
 
151
103
  ## Связанные компоненты
152
104
 
153
- - `Chip` и все `Chip*` варианты (`src/components/Chip`) — типичные дети.
154
- - `TagGroup` (`src/components/Tag`) — аналогичный контейнер для тегов
155
- (разная стилистика и семантика).
156
- - `CarouselExtended` — может обёртывать ChipGroup для добавления стрелок
157
- prev/next при `oneLine` overflow.
158
- - `EComponentSize`, `createSizeToClassNameMap` — общий паттерн.
105
+ - `Chip` (`src/components/Chip`) — основной ребёнок группы; вместе с ним внутрь кладут
106
+ `ChipIcon`, `ChipOptions`, `ChipSort`, `ChipSelect`, `ChipMultiselect`, `ChipSuggest`,
107
+ `ChipDatePicker` — элемент верхнего уровня у каждого из них помечен классом
108
+ `.chipGroupItem` (у `ChipIcon` и `ChipOptions` — через вложенный `Chip`)
109
+ - `ListMaster.ChipGroup` (`src/components/ListMaster/components/ListMasterChipGroup.tsx`) —
110
+ обёртка над `ChipGroup` с фиксированным `oneLine` и горизонтальными отступами страницы;
111
+ собственного AI.md не имеет, описана в `ListMaster-ai.md`
112
+ - `TagGroup` — аналогичный контейнер для `Tag`; отличается ролью `role="group"` и
113
+ обязательным `size`
159
114
 
160
115
  ---
161
116
 
162
117
  ## Stories
163
118
 
164
- `stories/Chips/ChipGroup.stories.tsx`
165
- Примеры: `stories/Chips/examples/ChipGroup/`
119
+ Основные истории: `stories/Chips/ChipGroup.stories.tsx`
120
+ Файлы примеров: `stories/Chips/examples/ChipGroup/`
166
121
 
167
- Типовые stories:
168
- - `Default` — многострочный набор чипов
169
- - `OneLine` — горизонтальный скролл
170
- - `Sizes` — MD vs LG gap
171
- - `Playground` — интерактивный контроль `oneLine` и `size`
122
+ | Story | Example file | Что демонстрирует |
123
+ |---|---|---|
124
+ | `Playground` | `PlaygroundExample.tsx` | Интерактивный контроль `size` и `oneLine` |
125
+ | `Default` | `DefaultExample.tsx` | Перенос чипсов по строкам при ограниченной ширине |
126
+ | `Sizes` | `SizesExample.tsx` | Отступы для размеров SM / MD / LG |
127
+ | `OneLine` | `OneLineExample.tsx` | Одна строка с горизонтальной прокруткой |
172
128
 
173
129
  ---
174
130
 
@@ -176,4 +132,117 @@ Chip MD — визуально смотрится как отдельная по
176
132
 
177
133
  | Дата | Изменение |
178
134
  |---|---|
179
- | 2026-04-18 | Создан документ |
135
+ | 2026-08-19 | Создан документ (TRI-27, AI-Ready Phase 1) |
136
+ | 2026-08-19 | AI-рефакторинг (TRI-27): JSDoc на props и компоненте, маппинг размеров в UPPER_SNAKE_CASE, эквивалентное упрощение `clsx`, добавлены unit-тесты `__tests__/ChipGroup.test.tsx`. Публичный API, DOM и внешний вид не изменены |
137
+
138
+ ---
139
+
140
+ ## Примеры использования
141
+
142
+ ### Default
143
+
144
+ `stories/Chips/examples/ChipGroup/DefaultExample.tsx`
145
+
146
+ ```tsx
147
+ import React, { useState } from "react";
148
+ import { Chip, ChipGroup } from "@sberbusiness/triplex-next";
149
+
150
+ export const DefaultExample = () => {
151
+ const [selected, setSelected] = useState<number | null>(null);
152
+ const chips = ["Alpha", "Beta", "Gamma", "Delta"];
153
+ return (
154
+ <ChipGroup style={{ maxWidth: 360 }}>
155
+ {chips.map((label, index) => (
156
+ <Chip key={label} selected={selected === index} onClick={() => setSelected(index)}>
157
+ {label}
158
+ </Chip>
159
+ ))}
160
+ </ChipGroup>
161
+ );
162
+ };
163
+ ```
164
+
165
+ ### Sizes
166
+
167
+ `stories/Chips/examples/ChipGroup/SizesExample.tsx`
168
+
169
+ ```tsx
170
+ import React, { useState } from "react";
171
+ import { Chip, ChipGroup, EComponentSize } from "@sberbusiness/triplex-next";
172
+
173
+ type SizeItemProps = {
174
+ size: EComponentSize;
175
+ label: string;
176
+ };
177
+
178
+ type SizeItemChipProps = Pick<SizeItemProps, "size"> & {
179
+ name: string;
180
+ };
181
+
182
+ const SizeItemChip = ({ size, name }: SizeItemChipProps) => {
183
+ const [selected, setSelected] = useState(false);
184
+
185
+ const handleClick = () => setSelected((prevSelected) => !prevSelected);
186
+
187
+ return (
188
+ <Chip size={size} selected={selected} onClick={handleClick}>
189
+ {name}
190
+ </Chip>
191
+ );
192
+ };
193
+
194
+ const NAMES = ["Alpha", "Beta", "Gamma", "Delta"];
195
+
196
+ const SizeItem = ({ size, label }: SizeItemProps) => (
197
+ <div>
198
+ <div style={{ marginBottom: 8, fontSize: 16, fontWeight: 700 }}>{label}</div>
199
+ <ChipGroup size={size}>
200
+ {NAMES.map((name) => (
201
+ <SizeItemChip key={name} size={size} name={name} />
202
+ ))}
203
+ </ChipGroup>
204
+ </div>
205
+ );
206
+
207
+ const sizeOptions = Object.values(EComponentSize).map((size) => ({
208
+ value: size,
209
+ label: size.toUpperCase(),
210
+ }));
211
+
212
+ export const SizesExample = () => (
213
+ <div style={{ display: "flex", flexDirection: "column", gap: 12 }}>
214
+ {sizeOptions.map(({ value, label }) => (
215
+ <SizeItem key={value} size={value} label={label} />
216
+ ))}
217
+ </div>
218
+ );
219
+ ```
220
+
221
+ ### OneLine
222
+
223
+ `stories/Chips/examples/ChipGroup/OneLineExample.tsx`
224
+
225
+ ```tsx
226
+ import React, { useState } from "react";
227
+ import { Chip, ChipGroup, EComponentSize } from "@sberbusiness/triplex-next";
228
+
229
+ export const OneLineExample = () => {
230
+ const [selected, setSelected] = useState<number | null>(null);
231
+ const chips = Array.from({ length: 20 }, (_, i) => `Item ${i + 1}`);
232
+ return (
233
+ <ChipGroup oneLine style={{ maxWidth: 360 }}>
234
+ {chips.map((label, index) => (
235
+ <Chip
236
+ key={label}
237
+ size={EComponentSize.MD}
238
+ selected={selected === index}
239
+ onClick={() => setSelected(index)}
240
+ >
241
+ {label}
242
+ </Chip>
243
+ ))}
244
+ </ChipGroup>
245
+ );
246
+ };
247
+ ```
248
+
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: CollapsibleTreeExtended
3
3
  category: CollapsibleTree
4
- related: [CollapsibleTree, TreeView, AccordionBase]
4
+ related: [CollapsibleTree, TreeView, TreeViewNode, AccordionBase]
5
5
  tokens: []
6
6
  stories: stories/CollapsibleTreeExtended/CollapsibleTreeExtended.stories.tsx
7
7
  version: "1.0"
@@ -161,6 +161,10 @@ FC-обёртка над `TreeView` без собственных props.
161
161
  нестандартный UI узла не нужен — используй её.
162
162
  - `TreeView` (`src/components/TreeView`) — нижний слой: семантика дерева,
163
163
  абстрактное дерево нод, фокус, активная нода, клавиатурная навигация.
164
+ - `TreeViewNode` (`TreeView.Node`) — узел, который оборачивает каждая нода
165
+ `CollapsibleTreeExtended`: `ICollapsibleTreeExtendedNodeProps` наследует
166
+ `Omit<ITreeViewNodeProps, "children">`, поэтому `id`, `opened`, `prevNodeId`,
167
+ `nextNodeId` и остальные props узла работают здесь так же, как у голой ноды.
164
168
  - `AccordionBase` (`src/components/AccordionBase`) — анимация раскрытия и
165
169
  `onToggle` после завершения анимации. Используется внутри каждой ноды.
166
170
 
@@ -187,6 +191,7 @@ FC-обёртка над `TreeView` без собственных props.
187
191
  | 2026-05-15 | Создан документ. Зафиксирован фикс controlled-инварианта (режим вычисляется на каждом рендере) и пополнение stories (`Playground`, `VisualTests`) |
188
192
  | 2026-07-06 | В story-примерах шеврон открытого узла теперь указывает вверх (`rotate(-90deg)`), а не вниз — синхронно с `CollapsibleTree` |
189
193
  | 2026-07-14 | В story-примерах на кнопку заголовка добавлены глобальные классы icons-next: `hoverable` всегда и `active` при `opened` — цвет иконки раскрытия, синхронно с `CollapsibleTreeNodeHeader` |
194
+ | 2026-08-26 | В `related` добавлен `TreeViewNode` — у узла появился собственный AI.md, и он точный адресат наследования `ICollapsibleTreeExtendedNodeProps` |
190
195
 
191
196
  ---
192
197