@sberbusiness/triplex-next-mcp-server 1.43.0-beta → 1.45.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 (85) hide show
  1. package/README.md +7 -6
  2. package/bundle/components/AlertContext.md +11 -8
  3. package/bundle/components/AlertProcess.md +16 -12
  4. package/bundle/components/Badge.md +6 -3
  5. package/bundle/components/BodyPage.md +72 -4
  6. package/bundle/components/Button.md +46 -43
  7. package/bundle/components/ButtonDropdownExtended.md +3 -2
  8. package/bundle/components/ButtonIcon.md +7 -4
  9. package/bundle/components/Calendar.md +62 -59
  10. package/bundle/components/Caption.md +26 -23
  11. package/bundle/components/Checkbox.md +32 -29
  12. package/bundle/components/CheckboxTreeExtended.md +9 -5
  13. package/bundle/components/Chip.md +44 -41
  14. package/bundle/components/CodeText.md +26 -23
  15. package/bundle/components/Col.md +1 -2
  16. package/bundle/components/CollapsibleTree.md +8 -5
  17. package/bundle/components/CollapsibleTreeExtended.md +6 -1
  18. package/bundle/components/DatePickerExtended.md +409 -262
  19. package/bundle/components/Dropdown.md +33 -28
  20. package/bundle/components/EmptyView.md +12 -5
  21. package/bundle/components/ExpandAnimation.md +263 -218
  22. package/bundle/components/Footer.md +235 -278
  23. package/bundle/components/FooterPage.md +6 -2
  24. package/bundle/components/FormField.md +44 -41
  25. package/bundle/components/FormGroup.md +192 -52
  26. package/bundle/components/Header.md +491 -211
  27. package/bundle/components/HeaderPage.md +6 -2
  28. package/bundle/components/ImageGallery.md +33 -34
  29. package/bundle/components/ImageGalleryExtended.md +33 -34
  30. package/bundle/components/Island.md +52 -14
  31. package/bundle/components/LightBox.md +25 -18
  32. package/bundle/components/Link.md +211 -96
  33. package/bundle/components/ListActionItem.md +7 -4
  34. package/bundle/components/ListItem.md +11 -8
  35. package/bundle/components/ListItemControlsButton.md +16 -13
  36. package/bundle/components/ListItemControlsButtonDropdown.md +9 -6
  37. package/bundle/components/ListItemSelectable.md +7 -4
  38. package/bundle/components/ListMasterFooter.md +8 -5
  39. package/bundle/components/ListMasterHeader.md +8 -5
  40. package/bundle/components/ListSortableItem.md +11 -8
  41. package/bundle/components/ListTableItem.md +7 -4
  42. package/bundle/components/LoaderMiddle.md +7 -4
  43. package/bundle/components/LoaderScreen.md +11 -8
  44. package/bundle/components/LoaderSmall.md +7 -4
  45. package/bundle/components/Marker.md +184 -69
  46. package/bundle/components/MarkerStatus.md +206 -88
  47. package/bundle/components/MaskedField.md +2 -4
  48. package/bundle/components/MasterTable.md +602 -0
  49. package/bundle/components/ModalWindow.md +7 -4
  50. package/bundle/components/MultiselectField.md +2183 -132
  51. package/bundle/components/Notification.md +12 -9
  52. package/bundle/components/Overlay.md +33 -5
  53. package/bundle/components/Page.md +2 -2
  54. package/bundle/components/Pagination.md +27 -21
  55. package/bundle/components/Row.md +1 -1
  56. package/bundle/components/SelectExtendedField.md +3 -3
  57. package/bundle/components/SelectField.md +466 -148
  58. package/bundle/components/SliderExtended.md +39 -36
  59. package/bundle/components/SmallInput.md +194 -51
  60. package/bundle/components/Suggest.md +535 -99
  61. package/bundle/components/SwipeableArea.md +428 -79
  62. package/bundle/components/TableBasic.md +2302 -0
  63. package/bundle/components/TabsExtended.md +24 -21
  64. package/bundle/components/Tag.md +263 -78
  65. package/bundle/components/Text.md +28 -25
  66. package/bundle/components/TextField.md +3 -4
  67. package/bundle/components/ThemeProvider.md +50 -1
  68. package/bundle/components/Title.md +26 -23
  69. package/bundle/components/Tooltip.md +24 -21
  70. package/bundle/components/TopOverlay.md +368 -89
  71. package/bundle/components/TreeView.md +343 -166
  72. package/bundle/components/TreeViewNode.md +436 -0
  73. package/bundle/guides/codestyle.md +3 -0
  74. package/bundle/guides/commits.md +106 -26
  75. package/bundle/guides/context.md +84 -12
  76. package/bundle/guides/guidelines.md +321 -0
  77. package/bundle/guides/template.md +22 -12
  78. package/bundle/manifest.json +54 -20
  79. package/bundle/release-notes/1.44.0.mdx +113 -0
  80. package/bundle/release-notes/1.45.0.mdx +124 -0
  81. package/bundle/release-notes/1.46.0.mdx +7 -0
  82. package/bundle/tokens.json +6362 -0
  83. package/dist/index.js +177 -28
  84. package/dist/index.js.map +1 -1
  85. package/package.json +1 -1
@@ -70,27 +70,99 @@ src/components/Button/
70
70
 
71
71
  ---
72
72
 
73
- ## Дизайн-токены (CSS-переменные)
73
+ ## Дизайн-токены
74
74
 
75
- Паттерн именования:
76
- ```
77
- --triplex-next-{Component}-{Variant}_{Property}_{State}
78
- ```
75
+ У токенов два слоя. Не путай их: в документации для потребителя описывается
76
+ только первый.
77
+
78
+ ### Публичный слой — токены в TypeScript
79
79
 
80
- Примеры:
80
+ Источник значений: `src/components/DesignTokens/DesignTokensCore.ts` (палитра,
81
+ 10 групп) и `src/components/DesignTokens/components/{Group}.ts` (токены
82
+ компонентов, 56 групп). Путь токена — `{Группа}.{Токен}`:
83
+
84
+ ```text
85
+ ColorBrand.50
86
+ Button.General_Background_Default
87
+ Calendar.View_Item_Background_Selected_Hover
81
88
  ```
82
- --triplex-next-Button-General_Background_Default
83
- --triplex-next-Button-General_Color_Hover
84
- --triplex-next-Button-Secondary_Shadow_Focus
85
- --triplex-next-Button-Danger_Background_Disabled
89
+
90
+ Ровно в этом виде токен переопределяется потребителем через `ThemeProvider`:
91
+
92
+ ```tsx
93
+ // tokens сравнивается по ссылке — объект выносится из рендера.
94
+ const TOKENS = {
95
+ ColorBrand: {50: {value: "blue"}},
96
+ Calendar: {Background: {ref: "ColorNeutral.100"}},
97
+ };
98
+
99
+ <ThemeProvider tokens={TOKENS} scopeRef={scopeRef}>…</ThemeProvider>
86
100
  ```
87
101
 
102
+ Правила слоя:
103
+
104
+ - объект токенов **плоский** — группы лежат на верхнем уровне
105
+ (`TDesignTokens = TDesignTokensCore & TDesignTokensComponents`). Вложенности
106
+ `core` / `components` в API нет, она есть только в раскладке исходников;
107
+ - значение токена — либо `{value: "<css>"}`, либо `{ref: "<Группа>.<Токен>"}`;
108
+ - `ref` указывает **только на core-токены**: тип `designTokensRefs` генерируется
109
+ из `DesignTokensCore` (`scripts/generateRefTokensTypes.ts`), ссылка на
110
+ компонентный токен не скомпилируется;
111
+ - у компонентного токена всегда пара значений — `[светлая, тёмная]` тема;
112
+ - имена core-групп и групп компонентов не должны пересекаться: в одном плоском
113
+ неймспейсе они схлопнутся. Проверяется гардом в `scripts/syncAiMdTokens.ts`.
114
+
88
115
  **Состояния:** `Default`, `Hover`, `Active`, `Focus`, `Disabled`
89
116
  **Свойства:** `Background`, `Color`, `Shadow`, `Border`
90
117
 
91
- Токены генерируются в `src/generated/themesCssVariables.css`. Не редактируй этот файл вручную.
118
+ Если добавляешь новое визуальное состояние — нужен новый токен. Имя токена
119
+ согласуй с дизайнером.
120
+
121
+ ### Внутренний слой — CSS-переменные
122
+
123
+ В LESS токен читается как css-переменная:
124
+
125
+ ```less
126
+ background: var(--triplex-next-Button-General_Background_Default);
127
+ ```
128
+
129
+ Это внутренняя реализация, а не публичное имя: на сборке
130
+ `scripts/replaceDesignTokenVersion.js` дописывает к переменной версию пакета,
131
+ и в опубликованном коде она выглядит как
132
+ `--triplex-next-{Группа}-{Токен}-{версия}`. Имя меняется каждый релиз, поэтому
133
+ потребитель не может на него опереться.
134
+
135
+ Отсюда правило: **в стилях библиотеки пиши `var(--triplex-next-...)`, а в
136
+ документации (`*-ai.md`, описания в Storybook) указывай путь токена
137
+ `{Группа}.{Токен}`.** Переименование css-переменной остаётся breaking change —
138
+ её видят потребители, дотянувшиеся до внутреннего слоя.
139
+
140
+ Полный набор переменных генерируется в `src/generated/themesCssVariables.css`.
141
+ Не редактируй этот файл вручную.
142
+
143
+ ### Токены в AI-документации
144
+
145
+ Frontmatter `{Component}-ai.md` перечисляет пути токенов:
146
+
147
+ ```yaml
148
+ tokens:
149
+ - Calendar.Background
150
+ - Calendar.View_Header_Color
151
+ ```
152
+
153
+ Этот список читает MCP-сервер (`get_tokens`), поэтому формат обязателен.
154
+ Проверяется и нормализуется скриптом:
155
+
156
+ ```bash
157
+ npm run syncAiMdTokens # нормализовать блоки tokens:
158
+ npm run syncAiMdTokens -- --check # проверить, ничего не записывая
159
+ npm run syncAiMdTokens -- --check src/components/Badge/Badge-ai.md # только эти файлы
160
+ ```
92
161
 
93
- Если добавляешь новое визуальное состояние — нужен новый токен. Имя токена согласуй с дизайнером.
162
+ Скрипт не определяет состав токенов за автора (в одной директории живёт
163
+ несколько компонентов с разными наборами) — он нормализует и проверяет то, что
164
+ перечислено, а расхождения с LESS показывает предупреждениями. Файл, по которому
165
+ нашлись ошибки, скрипт не переписывает — чинит автор.
94
166
 
95
167
  ---
96
168
 
@@ -0,0 +1,321 @@
1
+ # Guidelines кодогенерации на Triplex
2
+
3
+ Правила для ИИ-агентов, генерирующих React-код на дизайн-системе Triplex по
4
+ макетам. Документ отдаётся инструментом `get_guidelines` MCP-сервера
5
+ [`@sberbusiness/triplex-next-mcp-server`](https://github.com/SberBusiness/triplex-next-mcp-server)
6
+ и попадает туда через `mcp-data.json` (см. `scripts/generateMcpData.ts`).
7
+
8
+ Аудитория — потребители дизайн-системы (агенты и разработчики, пишущие код
9
+ *на* Triplex), а не контрибьюторы пакета: гайды для контрибьюторов живут в
10
+ `docs/ai/`.
11
+
12
+ Формат: каждое правило — секция со стабильным id `TPX-G-NN`. Id не
13
+ переиспользуются и не меняются; на них можно ссылаться в коде, ревью и
14
+ инструментах. Устаревшее правило помечается словом «отменено» с причиной,
15
+ но секция остаётся.
16
+
17
+ ---
18
+
19
+ ## TPX-G-01 — Тексты: только компоненты Typography
20
+
21
+ Для текстов из макета подбирается подходящий компонент Typography: `Title`
22
+ (H1 28px / H2 24px / H3 20px) или `Text` (B1 18px / B2 16px / B3 14px /
23
+ B4 12px); начертание `SEMIBOLD` — по шрифту в макете. Голые `span`/`div`
24
+ с текстом — дефект.
25
+
26
+ ## TPX-G-02 — Сетка: компоненты Row и Col
27
+
28
+ Горизонтальная раскладка контейнеров реализуется 12-колоночной сеткой
29
+ `Row`/`Col` (`size` из пропорций ширин), а не произвольными flex-обёртками.
30
+
31
+ ## TPX-G-03 — Скрытые слои не попадают в кодогенерацию
32
+
33
+ Узлы макета с `visible=false` и их поддеревья исключаются из дерева для
34
+ генерации кода.
35
+
36
+ ## TPX-G-04 — Иконки: только из @sberbusiness/icons-next
37
+
38
+ Имена иконок не угадываются — они подбираются через инструмент `list_icons`
39
+ MCP-сервера. Иконки импортируются ТОЛЬКО из пакета
40
+ `@sberbusiness/icons-next`, не из `@sberbusiness/triplex-next`.
41
+
42
+ ```tsx
43
+ import {CrossStrokeSrvIcon24, PlusStrokeSrvIcon16} from "@sberbusiness/icons-next";
44
+ // НЕВЕРНО: import {CrossStrokeSrvIcon24} from "@sberbusiness/triplex-next";
45
+ ```
46
+
47
+ ## TPX-G-05 — Хардкод цвета — дефект
48
+
49
+ Литералы цветов и значения, скопированные из стилей макета, в
50
+ сгенерированном коде недопустимы — цвета элементам дают сами компоненты
51
+ дизайн-системы и их темы.
52
+
53
+ Как устроены токены: они заводятся в TS-объекте пакета
54
+ (`src/components/DesignTokens/`), из него генерируются css-переменные,
55
+ которыми пользуются стили самой дизайн-системы — в исходниках less это
56
+ `color: var(--triplex-next-Link-Text_Color_Default)`, а при сборке
57
+ npm-пакета к имени дописывается версия
58
+ (`--triplex-next-Link-Text_Color_Default-1-44-0`).
59
+
60
+ Из-за версионного суффикса в сгенерированном коде приложения на эти
61
+ css-переменные не ссылаются — имя меняется каждый релиз (см.
62
+ `ThemeProvider-ai.md`). Вместо этого:
63
+
64
+ - значение токена в JS — хук `useToken` из `@sberbusiness/triplex-next`;
65
+ - переопределение оформления — prop `tokens` у `ThemeProvider` с путём
66
+ `Группа.Токен`; объект `tokens` выносить из рендера или мемоизировать,
67
+ иначе стили пересобираются на каждый рендер;
68
+ - список существующих токенов — `get_tokens` MCP-сервера.
69
+
70
+ ## TPX-G-06 — Перед использованием компонента — сверяться с документацией
71
+
72
+ Использовать компонент, для которого не смотрел документацию, ЗАПРЕЩЕНО:
73
+ перед КАЖДЫМ компонентом вызови `get_component` MCP-сервера и возьми оттуда
74
+ обязательные props и инварианты структуры — они не выводятся из имён.
75
+ Сгенерированный код обязан компилироваться: обязательные props без значения
76
+ заполняй заглушками из документации.
77
+
78
+ ## TPX-G-07 — Каркас содержимого страницы — Page
79
+
80
+ Внутри `LightBox.Content` (и вообще как каркас страницы) используется
81
+ `Page`, а в нём — только `Page.Header`, `Page.Body` и `Page.Footer`
82
+ (типы `FIRST`/`SECOND` задают наличие обёртки-Island).
83
+
84
+ ## TPX-G-08 — Обязательная обвязка приложения на Triplex
85
+
86
+ Приложение на Triplex подключает три обязательных куска; без любого из них
87
+ рендер тихо деградирует:
88
+
89
+ 1. стили дизайн-системы `@sberbusiness/triplex-next/styles/triplex-next.css`;
90
+ 2. стили иконок `@sberbusiness/icons-next/styles/icons.css` (fill-цвета и
91
+ состояния hoverable/active/disabled);
92
+ 3. `@font-face` для шрифтов SBSans* из
93
+ `@sberbusiness/triplex-next/assets/fonts` — пакет поставляет woff2,
94
+ но face объявляет потребитель (с `font-weight`/`font-style` по
95
+ инструкции).
96
+
97
+ Контент оборачивается в `ThemeProvider` со `scopeRef` на элемент-контейнер.
98
+ Базовый шрифт приложения задаётся явно:
99
+ `body { font-family: SBSansText, Arial, sans-serif; }` — текст вне
100
+ компонентов Typography не должен падать на системный шрифт.
101
+
102
+ Официальная инструкция подключения:
103
+ https://triplex-design.ru/storybook/main/?path=/docs/introduction--docs
104
+ (там же соответствие версий: 0.x — React 17, 1.x — React 18).
105
+
106
+ ```tsx
107
+ import {Button, Island, Page} from "@sberbusiness/triplex-next"; // компоненты и enum'ы — отсюда
108
+ import {CrossStrokeSrvIcon24} from "@sberbusiness/icons-next"; // иконки — только отсюда
109
+ import "@sberbusiness/triplex-next/styles/triplex-next.css";
110
+ import "@sberbusiness/icons-next/styles/icons.css";
111
+ ```
112
+
113
+ ## TPX-G-09 — Вертикальные внешние отступы — компонент Gap
114
+
115
+ Вертикальные отступы между блоками (айлендами, панелями, секциями) задаются
116
+ компонентом `Gap` с размером из шкалы, а не `margin` или пустыми
117
+ контейнерами.
118
+
119
+ ## TPX-G-10 — Конвенция имён слоёв макета
120
+
121
+ Имена слоёв несут семантику для чтения макета: префикс `_` — служебный
122
+ слой, игнорируется вместе с поддеревом (мишени прототипных переходов,
123
+ черновики); префикс `#` — слот шаблона (контейнер контента); префикс `@` —
124
+ иконка, подменяется иконкой из `@sberbusiness/icons-next`; суффиксы
125
+ `_text`/`_label`/`_placeholder` указывают, какому текстовому prop
126
+ компонента принадлежит текст ноды. Остальные имена — осмысленные; мусорные
127
+ имена (`Frame 427`, `Rectangle 12`) деградируют именной фолбэк маппинга.
128
+
129
+ ## TPX-G-11 — TableBasic: ячейка рендерится только при наличии fieldKey в rowData
130
+
131
+ Каждая колонка `TableBasic` обязана иметь соответствующий ключ в `rowData`
132
+ КАЖДОЙ строки — ячейку без ключа компонент молча пропускает. Колонкам, чей
133
+ контент даёт `renderCell` (кнопки, статусы, чекбоксы), в `rowData` кладётся
134
+ значение-заглушка. Таким колонкам также обязателен
135
+ `cellType: ECellType.COMPONENTS` (чекбоксам — `CHECKBOX`): при дефолтном
136
+ `TEXT` контент оборачивается в `Text B3`, ломая отступы и семантику.
137
+
138
+ ```tsx
139
+ // колонка: {fieldKey: "sign", cellType: ECellType.COMPONENTS, renderCell: () => <Button …>Подписать</Button>}
140
+ // строка: rowData: {…, sign: true} // без ключа sign ячейка не отрендерится
141
+ ```
142
+
143
+ ## TPX-G-12 — отменено
144
+
145
+ Id зарезервирован и отменён до публикации (конвенция оформления импортов —
146
+ стиль потребителя, на кодогенерацию из макета не влияет). Id не
147
+ переиспользуется.
148
+
149
+ ## TPX-G-13 — Вес Typography — из суффикса текст-стиля макета
150
+
151
+ Суффикс имени текст-стиля макета задаёт начертание. Для `Title`
152
+ (`EFontWeightTitle`: REGULAR / MEDIUM / SEMIBOLD / BOLD, дефолт —
153
+ semibold): `-M` (`Header/H3-M`) → `weight={EFontWeightTitle.MEDIUM}` —
154
+ без явного `weight` текст будет жирнее макета; `-S` (`Header/H1-S`) →
155
+ semibold, `weight` не пишется (дефолт). Для `Text` (`EFontWeightText`)
156
+ доступны только REGULAR (дефолт) и SEMIBOLD — веса MEDIUM у `Text` нет:
157
+ стили с суффиксом полужирного начертания (`-S`/`-Sb`) →
158
+ `weight={EFontWeightText.SEMIBOLD}`, прочие — дефолт REGULAR, `weight`
159
+ не пишется. Проверять текст-стиль узла макета, а не полагаться на
160
+ визуальную оценку.
161
+
162
+ ```tsx
163
+ <Title size={ETitleSize.H3} weight={EFontWeightTitle.MEDIUM}>…</Title> // стиль макета Header/H3-M
164
+ <Title tag="h1" size={ETitleSize.H1}>…</Title> // стиль Header/H1-S: semibold — дефолт
165
+ <Text size={ETextSize.B3} weight={EFontWeightText.SEMIBOLD}>…</Text> // полужирный Body-стиль
166
+ <Text size={ETextSize.B3}>…</Text> // обычный Body-стиль: REGULAR — дефолт
167
+ ```
168
+
169
+ ## TPX-G-14 — HelpBox и тултипы — без preferPlace
170
+
171
+ У `HelpBox` (и тултипов) `preferPlace`, как правило, не указывается — логики
172
+ компонента хватает, чтобы позиционировать тултип правильно; явный prop
173
+ ничего не ломает, но избыточен. Вариант `Position=Top/Left/…` из макета в
174
+ prop не переносится.
175
+
176
+ ```tsx
177
+ <HelpBox tooltipSize={ETooltipSize.SM}>Текст подсказки</HelpBox>
178
+ // НЕВЕРНО: <HelpBox tooltipSize={ETooltipSize.SM} preferPlace={ETooltipPreferPlace.ABOVE}>…</HelpBox>
179
+ ```
180
+
181
+ ## TPX-G-15 — Инлайн-стили в коде на компонентах ДС запрещены
182
+
183
+ В коде приложений на компонентах Triplex НИКОГДА не писать `style={{…}}`
184
+ для раскладки, отступов и выравнивания — их дают сами компоненты (`Gap`,
185
+ `Row`/`Col`, штатные подкомпоненты). Если базовый компонент не умеет
186
+ раскладку, которую рисует макет (пример: право-выровненный футер есть у
187
+ `IslandWidget`/`IslandAccordion`, у базового `Island` — нет), это ошибка
188
+ макета: контент кладётся в компонент как есть, расхождение фиксируется
189
+ диагностикой. Исключение — фреймы без компонентов ДС (absolute-витрины),
190
+ где штатной раскладки не существует.
191
+
192
+ ```tsx
193
+ // НЕВЕРНО: <Island.Footer style={{display: "flex", justifyContent: "flex-end", gap: 16}}>
194
+ <Island.Footer><Button …>Отмена</Button><Button …>Сохранить</Button></Island.Footer>
195
+ ```
196
+
197
+ ## TPX-G-16 — Описание и постфикс полевых компонентов — через targetProps
198
+
199
+ У полевых компонентов, чей `targetProps` наследует TextFieldBase
200
+ (`DateField` через MaskedField и т.п.), описание под полем и постфикс
201
+ (в т.ч. `HelpBox`) передаются через `targetProps.description` /
202
+ `targetProps.postfix` — постфикс НЕ перетирает встроенные иконки (календарь
203
+ `DateField`). У `SelectField` prop `description` отсутствует — там описание
204
+ строится паттерном `FormGroup` + `SelectField` + `FormFieldDescription`.
205
+ Перед выбором паттерна сверяться с примером `get_component`.
206
+
207
+ ```tsx
208
+ <DateField … targetProps={{postfix: <HelpBox tooltipSize={ETooltipSize.SM} />, description: <Text …>…</Text>}} />
209
+ <FormGroup><SelectField … /><FormFieldDescription>…</FormFieldDescription></FormGroup>
210
+ ```
211
+
212
+ ## TPX-G-17 — Композиция MasterTable: ChipPanel и порядок панелей
213
+
214
+ Чипы-фильтры таблицы кладутся в `MasterTable.ChipPanel` (`ChipGroup`
215
+ size SM `oneLine`), правая часть строки чипов — `MasterTable.ChipPanel.Links`
216
+ (туда же — `TableBasicSettings` со ссылкой настроек), а не в `FilterPanel`.
217
+ Порядок панелей: `ChipPanel` → `TableBasic` → `TableFooter` (появляется при
218
+ выборе строк) → `PaginationPanel`. Варианты чипов макета: `Chip/DatePicker` →
219
+ `ChipDatePicker`, `Chip/Select` → `ChipSelect`, `Chip/Multiselect` →
220
+ `ChipMultiselect`, `Chip/Suggest` → `ChipSuggest`; `Chip/MonthYearPicker`
221
+ аналога не имеет → `ChipSelect`.
222
+
223
+ ## TPX-G-18 — Кнопка-иконка: Button с icon vs ButtonIcon
224
+
225
+ Варианты кнопок макета `Type=Icon*` (`IconSecondary`, `IconSecondaryLight`,
226
+ …) — это `Button` с prop `icon` и соответствующей темой, БЕЗ children (плюс
227
+ `aria-label`). `ButtonIcon` — только для «голой» иконки-кнопки без подложки;
228
+ это нативный `<button>` без видимого текста, поэтому `aria-label` для него
229
+ обязателен так же, как для icon-`Button`.
230
+ В ячейках таблиц и шапках страниц кнопки с серой/светлой подложкой —
231
+ `Button` с `icon`. Размер иконки — из макета (MD-кнопка → 20, LG → 24).
232
+
233
+ ```tsx
234
+ <Button icon={<DefaulticonStrokePrdIcon20 paletteIndex={0} />} theme={EButtonTheme.SECONDARY} size={EComponentSize.MD} aria-label="Действие" />
235
+ ```
236
+
237
+ ## TPX-G-19 — columns TableBasic — стабильная ссылка
238
+
239
+ Массив `columns` для `TableBasic` должен быть стабильным по ссылке между
240
+ рендерами (`useMemo`/константа модуля): `TableBasic` пишет columns в
241
+ `MasterTableContext` через `useEffect` с проверкой `isEqual`, а `isEqual`
242
+ сравнивает функции (`renderCell`) по ссылке — пересоздаваемый каждый рендер
243
+ массив крутит бесконечную петлю записи в контекст. Симптомы: лишние
244
+ ре-рендеры, нестабильный список в `ColumnSettings`.
245
+
246
+ ```tsx
247
+ const columns = useMemo<ITableBasicColumn[]>(() => [...], [/* state, от которого зависят renderCell */]);
248
+ ```
249
+
250
+ ## TPX-G-20 — ColumnSettings.SortableList не строит пункты сам
251
+
252
+ У `ColumnSettings.SortableList` props `columns`/`onColumnsChange` — только
253
+ dnd-обвязка (порядок при перетаскивании); пункты списка рендерит потребитель
254
+ детьми: `ColumnSettings.SortableList.Item` с `id={fieldKey}` и контентом
255
+ (обычно `Checkbox` видимости колонки + label). Без детей меню настроек
256
+ открывается пустым.
257
+
258
+ ```tsx
259
+ <ColumnSettings.SortableList columns={cols} onColumnsChange={setCols}>
260
+ {cols.map((c) => (
261
+ <ColumnSettings.SortableList.Item key={c.fieldKey} id={c.fieldKey}>
262
+ <Checkbox checked={!c.hidden} onChange={…}>{c.label}</Checkbox>
263
+ </ColumnSettings.SortableList.Item>
264
+ ))}
265
+ </ColumnSettings.SortableList>
266
+ ```
267
+
268
+ ## TPX-G-21 — Компонент не найден в get_component: искать в типах пакета
269
+
270
+ Ответ `get_component` «Компонент не найден» не означает, что компонента нет
271
+ в пакете: документация MCP отстаёт от `@sberbusiness/triplex-next`, а
272
+ составные компоненты описаны под именем родителя — `MasterTable`,
273
+ `TableFooter`, `PaginationPanel` в `Table`/`TableBasic`; `ChipSelect`,
274
+ `ChipDatePicker`, `ChipMultiselect`, `ChipSuggest` в `Chip`/`ChipGroup`;
275
+ `FormFieldDescription` в `FormField`.
276
+
277
+ Порядок действий:
278
+
279
+ 1. вызвать `get_component` для родителя из `list_components` и искать
280
+ под-компонент в его примерах;
281
+ 2. если не нашёл — взять API из типов установленного пакета:
282
+ `node_modules/@sberbusiness/triplex-next/index.d.ts` и
283
+ `components/<Родитель>/*.d.ts` (имена экспортов, обязательные props,
284
+ `enum`'ы);
285
+ 3. компилировать `tsc` как обычно.
286
+
287
+ Придумывать имя компонента или props по памяти ЗАПРЕЩЕНО, как и заменять
288
+ недокументированный компонент html-тегом «раз документации нет».
289
+
290
+ ```tsx
291
+ // get_component('MasterTable') → «не найден» → get_component('Table') → пример MasterTable.TableBasic
292
+ // get_component('ChipSelect') → «не найден» → index.d.ts → components/Chip/ChipSelect.d.ts → props
293
+ ```
294
+
295
+ ## TPX-G-22 — Растры макета: ссылка по имени файла, байты передаются отдельно
296
+
297
+ Инструменты чтения макета байты изображений, как правило, не отдают: у
298
+ растровой заливки есть только hash содержимого, имя файла вида
299
+ `images/<hash>.png` и режим масштабирования (`FILL`/`FIT`). Правила для
300
+ кода:
301
+
302
+ 1. растр вставляется как `<img src="/assets/<hash>.<ext>">` (или в prop
303
+ компонента, принимающего `src`) с `alt` из имени слоя;
304
+ 2. режим масштабирования переносится в `object-fit`: `FILL` → `cover`,
305
+ `FIT` → `contain` — prop'ом или классом, не инлайн-стилем (TPX-G-15);
306
+ 3. файл с тем же именем кладётся в ассеты приложения отдельным шагом
307
+ передачи — экспортом из дизайн-инструмента или от дизайнера;
308
+ 4. выдумывать URL, встраивать base64 или подменять картинку заглушкой из
309
+ интернета ЗАПРЕЩЕНО;
310
+ 5. картинки-контент (фото в галерее, аватары, превью документов) — это
311
+ данные, а не UI: в компонент они передаются через props/items с теми же
312
+ `src`, а сам массив помечается как демо-данные.
313
+
314
+ Отсутствующий на диске файл — не ошибка генерации, а пункт передачи
315
+ ассетов: код ссылается на него по имени и остаётся рабочим, когда файл
316
+ положат.
317
+
318
+ ```tsx
319
+ <img src="/assets/ca92f04f46fa1c8c91a3d1406bc68b9ceffa7f86.png" alt="raster-fill" />
320
+ // демо-данные: [{src: "/assets/<hash>.png", alt: "…"}, …] — имя файла из макета, не выдуманное
321
+ ```
@@ -17,7 +17,10 @@ version: "1.0"
17
17
  Описывай намерения и ограничения, которые не видны из кода.
18
18
 
19
19
  Frontmatter:
20
- - tokens: список CSS-переменных, которые компонент использует
20
+ - tokens: пути дизайн-токенов, которые использует компонент, в формате
21
+ `{Группа}.{Токен}` (например `Button.General_Background_Default`).
22
+ Не css-переменные: они внутренние и версионируются на сборке.
23
+ Нормализуется и проверяется скриптом `npm run syncAiMdTokens`.
21
24
  - related: индекс переходов для агента. Полное правило: docs/ai/CONTEXT.md → «Как заполнять related в AI.md».
22
25
 
23
26
  Таблица Stories: колонка `Example file` обязательна — её читает сборщик
@@ -64,19 +67,26 @@ mcp-data.json, чтобы инлайнить код примера. См. раз
64
67
 
65
68
  ## Дизайн-токены
66
69
 
67
- <!-- Только те CSS-переменные, которые непосредственно используются в стилях компонента. -->
70
+ <!--
71
+ Только те токены, которые используются в стилях компонента. Путь токена —
72
+ `{Группа}.{Токен}`: ровно в этом виде он передаётся в ThemeProvider.
73
+ CSS-переменные `--triplex-next-*` здесь не пишем — это внутренний слой,
74
+ на сборке к ним дописывается версия пакета. См. docs/ai/CONTEXT.md → «Дизайн-токены».
75
+ -->
68
76
 
77
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
78
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/ComponentName.ts`.
79
+
80
+ ```text
81
+ ComponentName.Variant_Background_Default
82
+ ComponentName.Variant_Color_Hover
83
+ ComponentName.Variant_Shadow_Focus
69
84
  ```
70
- --triplex-next-ComponentName-Variant_Background_Default
71
- --triplex-next-ComponentName-Variant_Color_Default
72
- --triplex-next-ComponentName-Variant_Background_Hover
73
- --triplex-next-ComponentName-Variant_Color_Hover
74
- --triplex-next-ComponentName-Variant_Background_Active
75
- --triplex-next-ComponentName-Variant_Color_Active
76
- --triplex-next-ComponentName-Variant_Shadow_Focus
77
- --triplex-next-ComponentName-Variant_Background_Disabled
78
- --triplex-next-ComponentName-Variant_Color_Disabled
79
- ```
85
+
86
+ <!--
87
+ Пример кода с ThemeProvider здесь не дублируем — он живёт в ThemeProvider-ai.md,
88
+ иначе те же строки расползаются по всем AI.md и устаревают.
89
+ -->
80
90
 
81
91
  ---
82
92