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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -251,9 +251,46 @@ stories/release-notes/v1/<текущая версия>.mdx
251
251
 
252
252
  Компоненты внутри секции — в алфавитном порядке.
253
253
 
254
- Не нужно добавлять release notes для:
255
- - изменений только в stories/тестах/документации
256
- - рефакторинга без изменения публичного API
254
+ ### Главное правило: пиши только то, что стало новым для потребителя
255
+
256
+ Release notes читает потребитель библиотеки, а не разработчик репозитория.
257
+ Запись отвечает на один вопрос: **что изменилось для того, кто подключает
258
+ компонент**. Всё остальное — лишнее.
259
+
260
+ **Не попадает в release notes:**
261
+
262
+ - внутренняя кухня репозитория: количество unit-тестов, созданные `*-ai.md`,
263
+ обновлённые stories и `ROADMAP.md`, JSDoc, переименования внутренних констант,
264
+ порядок импортов, чистка LESS;
265
+ - перечисление того, что **не** изменилось: списки прежних props, значений
266
+ enum'ов, barrel-экспортов, границ диапазонов. Если поведение не изменилось,
267
+ достаточно сказать это одной фразой — без инвентаризации;
268
+ - обоснования и подробности реализации, интересные только ревьюеру. Им место
269
+ в описании PR и в `{Component}-ai.md`.
270
+
271
+ **Рефакторинг без изменений для потребителя — одна короткая строка:**
272
+
273
+ ```mdx
274
+ **ComponentName**
275
+
276
+ - Проведён AI-рефакторинг.
277
+ ```
278
+
279
+ Если рефакторинг всё же дал потребителю что-то наблюдаемое (например
280
+ `displayName`, видимый в React DevTools) — назови только это:
281
+
282
+ ```mdx
283
+ **MediaWidth**
284
+
285
+ - Проведён AI-рефакторинг, добавлен `displayName`.
286
+ ```
287
+
288
+ Ориентир по объёму: запись про изменение поведения — 1–3 предложения, запись
289
+ про рефакторинг — одна строка. Если запись разрослась до абзаца, скорее всего
290
+ в неё попала внутренняя кухня — вычеркни её.
291
+
292
+ Не нужно добавлять release notes для изменений только в stories, тестах или
293
+ документации.
257
294
 
258
295
  ---
259
296
 
@@ -274,6 +274,32 @@ AI-агента.
274
274
 
275
275
  ---
276
276
 
277
+ ## Как заполнять `related` в AI.md
278
+
279
+ Индекс переходов для агента, а не «похожие компоненты»: только имена, пояснения —
280
+ в разделе «Связанные компоненты». Имя обязано быть адресатом: компонентом из
281
+ таблицы `docs/ai/ROADMAP.md`, у которого AI.md есть или запланирован. Связь с
282
+ обёрткой вне таблицы записывается на её родителя (`IDropdownMobileMaskedInputProps
283
+ extends IFormFieldMaskedInputProps` → `FormField`).
284
+
285
+ Адресат попадает в `related`, только если подходит под одну из четырёх категорий:
286
+
287
+ | # | Категория | Критерий | Направление |
288
+ |---|---|---|---|
289
+ | 1 | Семья | Родитель ↔ часть со своим AI.md | обе стороны |
290
+ | 2 | Альтернатива | Решает ту же задачу другим компромиссом — реально спутают (`Island` → `IslandAccordion`). Отвод в другой класс задач («нужен отступ — возьми `Gap`») остаётся прозой в «Не используй когда» | обе стороны |
291
+ | 3 | Контракт по рендеру | Импортирует и рендерит внутри себя (`Island` → `LoaderScreen`) | к зависимости |
292
+ | 4 | Контракт по типам | Наследует чужой интерфейс props, в т.ч. `Pick<>` / `Omit<>` (`IConfirmProps extends IIslandProps` → у `Confirm` пишем `Island`). Наследование от React и от внутренних базовых интерфейсов не считается | от наследника к базе |
293
+
294
+ Потребители не включаются — ссылка стоит с их стороны; исключение только для
295
+ потребителя, который опирается на хрупкую деталь.
296
+
297
+ Категории 1 и 2 симметричны, 3 и 4 односторонние. Порядок — семья → альтернативы
298
+ → контракты, ориентир 2–5 имён. Каждое имя из `related` должно быть объяснено в
299
+ разделе «Связанные компоненты»; обратное не требуется.
300
+
301
+ ---
302
+
277
303
  ## Внешние ресурсы
278
304
 
279
305
  - Документация для разработчиков и дизайнеров: https://triplex-design.ru/next/ru/Web/Components
@@ -332,6 +332,7 @@ import { action } from "storybook/actions";
332
332
  **Исключаются при необходимости:**
333
333
 
334
334
  - Стори, дублирующие отображение другой стори. Если две стори рендерят визуально одно и то же — для теста оставьте одну, вторую исключите через `testRunner: { skip: true }`. Не нужно генерировать идентичные скриншоты.
335
+ - **Компоненты без визуального интерфейса** — `KeyDownListener`, `ComposedKeyDownListener` и подобные обёртки, которые не рендерят собственной разметки (слушатели событий, провайдеры контекста). На скриншот попадает только обвязка примеров, поэтому регрессию компонента такой тест поймать не может, а перегенерации требует от любой правки примера. Набор исключается **целиком**: `testRunner: { skip: true }` ставится в `parameters` у `meta`, отдельные стори параметр не дублируют, стори `VisualTests` не создаётся, файлов в `__screenshots__/` быть не должно. Поведение таких компонентов покрывается unit-тестами.
335
336
 
336
337
  ### Когда создавать Visual tests
337
338
 
@@ -664,6 +665,7 @@ export { default as SizesSource } from "./Sizes?raw";
664
665
 
665
666
  Скриншот-тесты обязательны для UI-компонентов. Без baseline-файлов в `__screenshots__/` регрессию не поймать.
666
667
 
668
+ - [ ] Компонент действительно рендерит собственную разметку. Если нет (слушатель событий, провайдер) — весь набор исключён через `testRunner: { skip: true }` в `meta`, `VisualTests` нет, baseline-файлов нет; остальные пункты этого раздела не применяются
667
669
  - [ ] Playground исключён из скриншот-тестов (`testRunner: { skip: true }`)
668
670
  - [ ] Нет дублирующих скриншотов — визуально идентичные стори исключены через `testRunner: { skip: true }`
669
671
  - [ ] Все ключевые визуальные состояния покрыты (размеры, статусы, заполненные поля, фокус)
@@ -18,7 +18,7 @@ version: "1.0"
18
18
 
19
19
  Frontmatter:
20
20
  - tokens: список CSS-переменных, которые компонент использует
21
- - related: список связанных компонентов (строки, имена)
21
+ - related: индекс переходов для агента. Полное правило: docs/ai/CONTEXT.md → «Как заполнять related в AI.md».
22
22
 
23
23
  Таблица Stories: колонка `Example file` обязательна — её читает сборщик
24
24
  mcp-data.json, чтобы инлайнить код примера. См. раздел Stories ниже.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "triplexVersion": "1.41.0",
4
- "generatedAt": "2026-08-07T11:02:25.745Z",
3
+ "triplexVersion": "1.42.0",
4
+ "generatedAt": "2026-08-14T12:59:51.290Z",
5
5
  "components": [
6
6
  {
7
7
  "name": "AbstractTree",
@@ -27,9 +27,15 @@
27
27
  "file": "components/AlertContext.md",
28
28
  "ai_ready": true
29
29
  },
30
+ {
31
+ "name": "AlertProcess",
32
+ "path": "src/components/Alert/AlertProcess-ai.md",
33
+ "file": "components/AlertProcess.md",
34
+ "ai_ready": true
35
+ },
30
36
  {
31
37
  "name": "Amount",
32
- "path": "src/components/Amount/Amount-AI.md",
38
+ "path": "src/components/Amount/Amount-ai.md",
33
39
  "file": "components/Amount.md",
34
40
  "ai_ready": true
35
41
  },
@@ -47,13 +53,13 @@
47
53
  },
48
54
  {
49
55
  "name": "Badge",
50
- "path": "src/components/Badge/Badge-AI.md",
56
+ "path": "src/components/Badge/Badge-ai.md",
51
57
  "file": "components/Badge.md",
52
58
  "ai_ready": true
53
59
  },
54
60
  {
55
61
  "name": "Body",
56
- "path": "src/components/Body/Body-AI.md",
62
+ "path": "src/components/Body/Body-ai.md",
57
63
  "file": "components/Body.md",
58
64
  "ai_ready": true
59
65
  },
@@ -114,7 +120,7 @@
114
120
  },
115
121
  {
116
122
  "name": "CarouselExtended",
117
- "path": "src/components/CarouselExtended/CarouselExtended-AI.md",
123
+ "path": "src/components/CarouselExtended/CarouselExtended-ai.md",
118
124
  "file": "components/CarouselExtended.md",
119
125
  "ai_ready": true
120
126
  },
@@ -184,6 +190,12 @@
184
190
  "file": "components/CollapsibleTreeExtended.md",
185
191
  "ai_ready": true
186
192
  },
193
+ {
194
+ "name": "ComposedKeyDownListener",
195
+ "path": "src/components/KeyDownListener/ComposedKeyDownListener-ai.md",
196
+ "file": "components/ComposedKeyDownListener.md",
197
+ "ai_ready": true
198
+ },
187
199
  {
188
200
  "name": "Confirm",
189
201
  "path": "src/components/Confirm/Confirm-AI.md",
@@ -449,6 +461,12 @@
449
461
  "file": "components/LoaderScreen.md",
450
462
  "ai_ready": true
451
463
  },
464
+ {
465
+ "name": "LoaderSmall",
466
+ "path": "src/components/Loader/LoaderSmall-ai.md",
467
+ "file": "components/LoaderSmall.md",
468
+ "ai_ready": true
469
+ },
452
470
  {
453
471
  "name": "Marker",
454
472
  "path": "src/components/Marker/Marker-AI.md",
@@ -461,15 +479,21 @@
461
479
  "file": "components/MarkerStatus.md",
462
480
  "ai_ready": true
463
481
  },
482
+ {
483
+ "name": "MaskedField",
484
+ "path": "src/components/TextField/MaskedField-ai.md",
485
+ "file": "components/MaskedField.md",
486
+ "ai_ready": true
487
+ },
464
488
  {
465
489
  "name": "MediaWidth",
466
- "path": "src/components/MediaWidth/MediaWidth-AI.md",
490
+ "path": "src/components/MediaWidth/MediaWidth-ai.md",
467
491
  "file": "components/MediaWidth.md",
468
492
  "ai_ready": true
469
493
  },
470
494
  {
471
495
  "name": "MobileView",
472
- "path": "src/components/MobileView/MobileView-AI.md",
496
+ "path": "src/components/MobileView/MobileView-ai.md",
473
497
  "file": "components/MobileView.md",
474
498
  "ai_ready": true
475
499
  },
@@ -560,7 +584,7 @@
560
584
  },
561
585
  {
562
586
  "name": "SelectExtendedField",
563
- "path": "src/components/SelectExtendedField/SelectExtendedField-AI.md",
587
+ "path": "src/components/SelectExtendedField/SelectExtendedField-ai.md",
564
588
  "file": "components/SelectExtendedField.md",
565
589
  "ai_ready": true
566
590
  },
@@ -1013,11 +1037,21 @@
1013
1037
  "file": "release-notes/1.41.0.mdx",
1014
1038
  "path": "stories/release-notes/v1/1.41.0.mdx"
1015
1039
  },
1040
+ {
1041
+ "version": "1.41.1",
1042
+ "file": "release-notes/1.41.1.mdx",
1043
+ "path": "stories/release-notes/v1/1.41.1.mdx"
1044
+ },
1016
1045
  {
1017
1046
  "version": "1.42.0",
1018
1047
  "file": "release-notes/1.42.0.mdx",
1019
1048
  "path": "stories/release-notes/v1/1.42.0.mdx"
1020
1049
  },
1050
+ {
1051
+ "version": "1.43.0",
1052
+ "file": "release-notes/1.43.0.mdx",
1053
+ "path": "stories/release-notes/v1/1.43.0.mdx"
1054
+ },
1021
1055
  {
1022
1056
  "version": "1.5.0",
1023
1057
  "file": "release-notes/1.5.0.mdx",
@@ -0,0 +1,18 @@
1
+ import { Meta, Title, Heading } from "@storybook/addon-docs/blocks";
2
+
3
+ <Meta title="release-notes/v1/1.41.1" />
4
+
5
+ <Title>v1.41.1</Title>
6
+
7
+ <Heading>Изменения</Heading>
8
+
9
+ **Page**
10
+
11
+ - `Page.Header` и `Page.Footer` со свойством `sticky` теперь прилипают и вне `LightBox` при ширине viewport от 992px. При высоте viewport до 800px включительно sticky-позиционирование не применяется.
12
+
13
+ **SelectExtendedField**
14
+
15
+ - Исправлено: `onOpen` / `onClose` ложно срабатывали при повторном маунте в React 18 StrictMode — эффект опирался на флаг «смонтирован». Теперь сравнивается предыдущее значение состояния открытости, поэтому колбэки вызываются только на реальную смену состояния и по-прежнему не вызываются на первом рендере.
16
+ - Исправлено: клик по кнопке очистки (`onClear`) в `SelectExtendedFieldTarget` заодно раскрывал выпадающий блок — событие всплывало до обработчика клика по полю. Теперь всплытие останавливается, как это уже сделано в `Chip.Select` и `Chip.DatePicker`. Затрагивает также `SelectField` и `MultiselectField`, использующие тот же `Target`.
17
+ - Исправлено: `SelectExtendedFieldTarget` подмешивал в атрибут `class` литерал `undefined` — в `clsx` попадали ключи `styles.loading`, `styles.placeholder` и `styles.label`, которых нет в LESS-модуле компонента. Стили этих классов никогда не существовали, поэтому визуально ничего не меняется. Затрагивает также `SelectField` и `MultiselectField.Target`, использующие тот же компонент.
18
+ - AI-рефакторинг: JSDoc на всех props и рендер-функциях, константы-маппинги размера приведены к общему стилю именования, коды клавиш открытия вынесены в константу модуля, слушатель `mousedown` на документе навешивается только пока выпадающий блок открыт, callback-ref корневого элемента стабилизирован, в `SelectExtendedFieldTarget` убрана неиспользуемая внутренняя ссылка (ref по-прежнему указывает на элемент значения), в `SelectExtendedFieldDropdownDefault` дедуплицирован список опций десктопной и мобильной версий, у `SelectExtendedFieldDropdown` и `SelectExtendedFieldDropdownDefault` добавлен `displayName`. Unit-тесты разбиты по субкомпонентам и расширены с 42 до 69 кейсов, stories переведены на modern pattern, создан `SelectExtendedField-ai.md`. Публичный API не изменён (props, их типы, barrel-экспорты, `forwardRef` — как были).
@@ -4,4 +4,85 @@ import { Meta, Title, Heading } from "@storybook/addon-docs/blocks";
4
4
 
5
5
  <Title>v1.42.0</Title>
6
6
 
7
+ <Heading>Ломающие изменения</Heading>
8
+
9
+ **FormFieldMaskedInput**
10
+
11
+ - Prop `defaultValue` исключён из `IFormFieldMaskedInputProps` — поле контролируемое, начальное значение задаётся через `value`. Затрагивает также `MaskedField.maskedInputProps` и `DropdownMobileMaskedInput`.
12
+
13
+ **MaskedField**
14
+
15
+ - Тип `maskedInputProps.ref` изменён с `React.RefObject<HTMLInputElement>` на `React.RefObject<HTMLDivElement>` — ref указывает на `<div>`-обёртку поля. Для ссылки на `<input>` используйте `maskedInputProps.forwardedRef`.
16
+
7
17
  <Heading>Изменения</Heading>
18
+
19
+ **AlertProcess**
20
+
21
+ - Исправлено: `className`, переданный в `AlertProcess.Spoiler`, больше не затирает собственные классы элемента — раньше вместе с пользовательским классом пропадала анимация раскрытия.
22
+ - Исправлено: `AlertProcess.Spoiler` пробрасывает `ref` — на элемент раскрываемого контента, то есть на тот же элемент, что получает `...rest`.
23
+ - Изменено: из разметки `AlertProcess.Spoiler` убрана пустая обёртка-`<div>`, корневым элементом стал элемент раскрываемого контента. Визуально ничего не изменилось, но код, опиравшийся на лишний уровень вложенности в CSS-селекторах или в поиске по DOM, нужно поправить.
24
+ - Добавлено: на кнопке раскрытия `AlertProcess.Spoiler` выставляется `aria-expanded` — состояние раскрытия доступно скринридерам.
25
+ - Проведён AI-рефакторинг.
26
+
27
+ **Amount**
28
+
29
+ - Добавлено: `Amount` пробрасывает `ref` — компонент был объявлен как `React.FC`. Теперь это `forwardRef`, ref указывает на корневой `<span>`, то есть на тот же элемент, что получает `className` и `...rest`. Изменение аддитивное: форма `IAmountProps` не поменялась.
30
+ - Проведён AI-рефакторинг.
31
+
32
+ **Badge**
33
+
34
+ - Проведён AI-рефакторинг.
35
+
36
+ **Body**
37
+
38
+ - Проведён AI-рефакторинг. Публичный API, разметка и внешний вид не изменились.
39
+
40
+ **CarouselExtended**
41
+
42
+ - Проведён AI-рефакторинг. Стабильный колбэк-`ref` больше не вызывается заново (с `null` и снова с узлом) при каждом ре-рендере.
43
+
44
+ **ComposedKeyDownListener**
45
+
46
+ - Исправлено: смена набора горячих клавиш перемонтировала содержимое — `children` пересоздавались вместе с DOM-узлами и теряли введённые значения инпутов, фокус и текущие анимации. Теперь структура React-дерева не зависит от длины и порядка `keyDownListeners`, содержимое остаётся смонтированным.
47
+ - Изменился относительный порядок подписок на `window`: слушатели композитора монтируются раньше `children`, а не после них. Если внутри `children` есть собственный глобальный `keydown`-обработчик той же клавиши, `onMatch` сработает раньше него, а не позже — важно для кода, который полагается на этот порядок или на `stopImmediatePropagation`. Итоговый DOM и порядок вызова `onMatch` внутри `keyDownListeners` прежние.
48
+
49
+ **FormFieldMaskedInput**
50
+
51
+ - Исправлено: поле перестало писать в консоль предупреждение React «input contains both value and defaultValue props».
52
+
53
+ **Island**
54
+
55
+ - Расширение API: свойства `loading` и `loaderScreenProps`. При `loading` поверх контента карточки показывается `LoaderScreen` типа `middle`, настраиваемый через `loaderScreenProps`.
56
+
57
+ **DateField / MonthYearField**
58
+
59
+ - Добавлено ограничение по минимальной ширине.
60
+
61
+ **LoaderSmall**
62
+
63
+ - Проведён AI-рефакторинг; экспортируемый `ELoaderSmallSize` помечен как legacy — размер задаётся `EComponentSize`.
64
+
65
+ **MaskedField**
66
+
67
+ - Проведён AI-рефакторинг. Поведение и разметка не изменились, изменения типов — см. «Ломающие изменения».
68
+
69
+ **MediaWidth**
70
+
71
+ - Проведён AI-рефакторинг, добавлен `displayName`.
72
+
73
+ **FormFieldMaskedInput**
74
+
75
+ - Исправлен выход подложки-плейсхолдера за границы контейнера при нехватке свободного места.
76
+
77
+ **MobileView**
78
+
79
+ - Проведён AI-рефакторинг, добавлен `displayName`.
80
+
81
+ **Pagination**
82
+
83
+ - Внутри `MasterTable` в состоянии `loading` элементы пагинации становятся неактивными - кнопки навигации и номера страниц получают `disabled`, селект количества строк не открывается.
84
+ - Исправлена обработка `status` в `PaginationSelect`.
85
+
86
+ **SuggestField**
87
+
88
+ - Исправлен баг, при котором свойства `prefix`/`postfix`/`description`/`counter` не прокидывались в адаптивном режиме.
@@ -0,0 +1,7 @@
1
+ import { Meta, Title, Heading } from "@storybook/addon-docs/blocks";
2
+
3
+ <Meta title="release-notes/v1/1.43.0" />
4
+
5
+ <Title>v1.43.0</Title>
6
+
7
+ <Heading>Изменения</Heading>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sberbusiness/triplex-next-mcp-server",
3
- "version": "1.41.0-beta",
3
+ "version": "1.42.0-beta",
4
4
  "description": "MCP-сервер для дизайн-системы Triplex. Предоставляет AI-агентам документацию компонентов, дизайн-токены и примеры использования.",
5
5
  "author": "СберБизнес",
6
6
  "license": "MIT",