@sberbusiness/triplex-next-mcp-server 0.24.0-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +124 -0
- package/bundle/.gitkeep +0 -0
- package/bundle/components/AbstractTree.md +198 -0
- package/bundle/components/AccordionBase.md +227 -0
- package/bundle/components/Alert.md +317 -0
- package/bundle/components/Amount.md +225 -0
- package/bundle/components/AmountField.md +289 -0
- package/bundle/components/Avatar.md +209 -0
- package/bundle/components/Badge.md +277 -0
- package/bundle/components/Body.md +167 -0
- package/bundle/components/Button.md +230 -0
- package/bundle/components/ButtonDropdown.md +159 -0
- package/bundle/components/ButtonIcon.md +122 -0
- package/bundle/components/Calendar.md +445 -0
- package/bundle/components/Card.md +374 -0
- package/bundle/components/CarouselExtended.md +250 -0
- package/bundle/components/Checkbox.md +126 -0
- package/bundle/components/CheckboxTree.md +280 -0
- package/bundle/components/CheckboxTreeExtended.md +321 -0
- package/bundle/components/CheckboxXGroup.md +68 -0
- package/bundle/components/CheckboxYGroup.md +67 -0
- package/bundle/components/Chip.md +404 -0
- package/bundle/components/ChipGroup.md +179 -0
- package/bundle/components/Col.md +221 -0
- package/bundle/components/CollapsableTree.md +255 -0
- package/bundle/components/Confirm.md +343 -0
- package/bundle/components/DateField.md +371 -0
- package/bundle/components/DatePickerExtended.md +342 -0
- package/bundle/components/DateRange.md +275 -0
- package/bundle/components/DesignTokens.md +385 -0
- package/bundle/components/Divider.md +196 -0
- package/bundle/components/DocumentNumberEdit.md +280 -0
- package/bundle/components/Dropdown.md +433 -0
- package/bundle/components/Ellipsis.md +208 -0
- package/bundle/components/EmptyView.md +99 -0
- package/bundle/components/ExpandAnimation.md +281 -0
- package/bundle/components/Footer.md +339 -0
- package/bundle/components/FormField.md +326 -0
- package/bundle/components/FormGroup.md +99 -0
- package/bundle/components/Gap.md +113 -0
- package/bundle/components/Header.md +280 -0
- package/bundle/components/HelpBox.md +154 -0
- package/bundle/components/IconWrapper.md +145 -0
- package/bundle/components/Island.md +197 -0
- package/bundle/components/IslandAccordion.md +230 -0
- package/bundle/components/IslandWidget.md +233 -0
- package/bundle/components/KeyDownListener.md +157 -0
- package/bundle/components/LightBox.md +322 -0
- package/bundle/components/Link.md +161 -0
- package/bundle/components/List.md +247 -0
- package/bundle/components/ListMaster.md +204 -0
- package/bundle/components/Loader.md +161 -0
- package/bundle/components/LoaderScreen.md +134 -0
- package/bundle/components/Marker.md +127 -0
- package/bundle/components/MarkerStatus.md +148 -0
- package/bundle/components/MediaWidth.md +169 -0
- package/bundle/components/MobileView.md +120 -0
- package/bundle/components/ModalWindow.md +308 -0
- package/bundle/components/MonthYearField.md +168 -0
- package/bundle/components/MultiselectField.md +213 -0
- package/bundle/components/Notification.md +233 -0
- package/bundle/components/NumberField.md +178 -0
- package/bundle/components/OrderedList.md +169 -0
- package/bundle/components/Overlay.md +237 -0
- package/bundle/components/Page.md +246 -0
- package/bundle/components/Pagination.md +298 -0
- package/bundle/components/Portal.md +119 -0
- package/bundle/components/Radio.md +174 -0
- package/bundle/components/Row.md +125 -0
- package/bundle/components/SMSField.md +160 -0
- package/bundle/components/SegmentedControl.md +235 -0
- package/bundle/components/SelectExtendedField.md +322 -0
- package/bundle/components/SelectField.md +213 -0
- package/bundle/components/Skeleton.md +129 -0
- package/bundle/components/Slider.md +157 -0
- package/bundle/components/SliderExtended.md +210 -0
- package/bundle/components/SliderRange.md +160 -0
- package/bundle/components/SmallInput.md +101 -0
- package/bundle/components/Spoiler.md +121 -0
- package/bundle/components/StatusTracker.md +151 -0
- package/bundle/components/Step.md +121 -0
- package/bundle/components/Stepper.md +163 -0
- package/bundle/components/Suggest.md +160 -0
- package/bundle/components/SuggestField.md +157 -0
- package/bundle/components/SwipeableArea.md +144 -0
- package/bundle/components/Table.md +199 -0
- package/bundle/components/Tabs.md +152 -0
- package/bundle/components/TabsExtended.md +273 -0
- package/bundle/components/TabsLine.md +189 -0
- package/bundle/components/Tag.md +135 -0
- package/bundle/components/TagColor.md +121 -0
- package/bundle/components/TagGroup.md +100 -0
- package/bundle/components/TextField.md +152 -0
- package/bundle/components/TextareaField.md +124 -0
- package/bundle/components/ThemeProvider.md +181 -0
- package/bundle/components/Tooltip.md +254 -0
- package/bundle/components/TopOverlay.md +145 -0
- package/bundle/components/TreeView.md +224 -0
- package/bundle/components/Triggers.md +121 -0
- package/bundle/guides/codestyle.md +205 -0
- package/bundle/guides/commits.md +166 -0
- package/bundle/guides/context.md +277 -0
- package/bundle/guides/stories.md +618 -0
- package/bundle/guides/template.md +154 -0
- package/bundle/guides/tests.md +301 -0
- package/bundle/icons.json +4156 -0
- package/bundle/manifest.json +796 -0
- package/bundle/release-notes/1.1.0.mdx +26 -0
- package/bundle/release-notes/1.1.1.mdx +14 -0
- package/bundle/release-notes/1.10.0.mdx +43 -0
- package/bundle/release-notes/1.11.0.mdx +19 -0
- package/bundle/release-notes/1.12.0.mdx +21 -0
- package/bundle/release-notes/1.13.0.mdx +43 -0
- package/bundle/release-notes/1.14.0.mdx +29 -0
- package/bundle/release-notes/1.15.0.mdx +56 -0
- package/bundle/release-notes/1.16.0.mdx +55 -0
- package/bundle/release-notes/1.17.0.mdx +15 -0
- package/bundle/release-notes/1.18.0.mdx +24 -0
- package/bundle/release-notes/1.19.0.mdx +48 -0
- package/bundle/release-notes/1.19.1.mdx +9 -0
- package/bundle/release-notes/1.2.0.mdx +80 -0
- package/bundle/release-notes/1.20.0.mdx +48 -0
- package/bundle/release-notes/1.21.0.mdx +66 -0
- package/bundle/release-notes/1.22.0.mdx +75 -0
- package/bundle/release-notes/1.23.0.mdx +50 -0
- package/bundle/release-notes/1.24.0.mdx +59 -0
- package/bundle/release-notes/1.25.0.mdx +52 -0
- package/bundle/release-notes/1.26.0.mdx +11 -0
- package/bundle/release-notes/1.3.0.mdx +21 -0
- package/bundle/release-notes/1.4.0.mdx +37 -0
- package/bundle/release-notes/1.5.0.mdx +24 -0
- package/bundle/release-notes/1.6.0.mdx +37 -0
- package/bundle/release-notes/1.6.1.mdx +11 -0
- package/bundle/release-notes/1.7.0.mdx +29 -0
- package/bundle/release-notes/1.8.0.mdx +38 -0
- package/bundle/release-notes/1.9.0.mdx +28 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +324 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Коммиты и ветки — Triplex-Next
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Именование веток
|
|
6
|
+
|
|
7
|
+
**Формат:** `TRIPLEX-XXX-короткое-описание`
|
|
8
|
+
|
|
9
|
+
- Строчные буквы, слова через дефис.
|
|
10
|
+
- Всегда начинается с номера тикета.
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
TRIPLEX-844-ai-ready-design-system
|
|
14
|
+
TRIPLEX-901-add-badge-component
|
|
15
|
+
TRIPLEX-912-fix-button-focus-style
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Исключения:**
|
|
19
|
+
- Релизная ветка: `prepare-release-XX` (например, `prepare-release-2`)
|
|
20
|
+
- Перелитие main → release-0: выполняется мейнтейнерами, формат произвольный
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Структура веток и релизов
|
|
25
|
+
|
|
26
|
+
| Ветка | React | Версии пакета | Описание |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| `main` | React 18 | `1.xx` | Основная ветка разработки |
|
|
29
|
+
| `release-0` | React 17 | `0.xx` | Поддержка React 17, синхронизируется с main |
|
|
30
|
+
|
|
31
|
+
**Правило:** все фича-ветки создаются от `main`. Изменения попадают в `release-0` через перелитие — вручную мейнтейнерами. Агент не должен создавать ветки от `release-0` и не должен мерджить в неё напрямую.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Формат коммитов
|
|
36
|
+
|
|
37
|
+
**Формат:** `TRIPLEX-XXX Краткое описание`
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
TRIPLEX-844 Добавить AI-Ready документацию для компонентов
|
|
41
|
+
TRIPLEX-901 Добавить компонент Badge с темами и размерами
|
|
42
|
+
TRIPLEX-912 Исправить стиль фокуса для Button в теме Link
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Если нужно уточнение — добавляй через двоеточие:
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
TRIPLEX-844 AI-Ready Design System: фундамент и пилот Button
|
|
49
|
+
TRIPLEX-901 Badge: добавить тему DANGER и размер SM
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Правила:**
|
|
53
|
+
- Все коммиты в ветке начинаются с одного номера тикета.
|
|
54
|
+
- Первая строка — не длиннее 72 символов.
|
|
55
|
+
- Тело коммита опционально (для сложных изменений).
|
|
56
|
+
- Язык: русский или английский — не смешивать в одном коммите.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Когда запускать линтер
|
|
61
|
+
|
|
62
|
+
**Вручную запускать не нужно.** Линтер запускается автоматически при `git commit`:
|
|
63
|
+
|
|
64
|
+
1. `husky` перехватывает коммит.
|
|
65
|
+
2. `lint-staged` запускает на staged-файлах:
|
|
66
|
+
- `eslint --fix` — автоисправление ESLint-ошибок
|
|
67
|
+
- `prettier --write` — форматирование кода
|
|
68
|
+
3. Исправленные файлы добавляются обратно в staging.
|
|
69
|
+
|
|
70
|
+
**Если `lint-staged` упал:**
|
|
71
|
+
- Прочитай ошибку — это ESLint-нарушение, которое нельзя автофиксировать.
|
|
72
|
+
- Исправь вручную.
|
|
73
|
+
- Пере-stage: `git add <files>`.
|
|
74
|
+
- Повтори коммит.
|
|
75
|
+
|
|
76
|
+
**Ручной запуск (если нужно проверить до коммита):**
|
|
77
|
+
```bash
|
|
78
|
+
npx eslint --fix src/components/Button/Button.tsx
|
|
79
|
+
npx prettier --write src/components/Button/Button.tsx
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Что не коммитить
|
|
85
|
+
|
|
86
|
+
| Файл/папка | Причина |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `__screenshots__/` | Только из Docker/CI. Если нужно — подтвердить в pre-commit hook |
|
|
89
|
+
| `.mcp.json` | Персональный токен Figma — в `.gitignore` |
|
|
90
|
+
| `.env.local` | Секреты — в `.gitignore` |
|
|
91
|
+
| `node_modules/`, `dist/`, `storybook-static/` | В `.gitignore` |
|
|
92
|
+
|
|
93
|
+
Если в ходе работы появились новые локальные, временные, генерируемые или
|
|
94
|
+
машино-специфичные файлы:
|
|
95
|
+
- проверь `git status`, не попали ли они в untracked/staged
|
|
96
|
+
- если такие файлы не должны храниться в репозитории, добавь подходящее правило в `.gitignore`
|
|
97
|
+
- не коммить подобные файлы "на всякий случай"
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Когда коммитить и пушить
|
|
102
|
+
|
|
103
|
+
**Агент не создаёт коммиты самостоятельно.** После завершения задачи — остановиться и показать результат разработчику. Коммит делается только по явной просьбе.
|
|
104
|
+
|
|
105
|
+
**Агент не пушит ветку самостоятельно.** Пуш — только по явной просьбе разработчика.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## PR-воркфлоу
|
|
110
|
+
|
|
111
|
+
**Агент пушит ветку — разработчик создаёт PR.**
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
git push -u origin TRIPLEX-XXX-feature-name
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
После пуша разработчик сам открывает PR через GitHub UI или `gh pr create`.
|
|
118
|
+
|
|
119
|
+
**Исключение:** если разработчик явно просит агента создать PR, используй:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
gh pr create \
|
|
123
|
+
--title "TRIPLEX-XXX Краткое описание" \
|
|
124
|
+
--body "## Что сделано\n- ...\n\n## Как проверить\n- ..."
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Release notes
|
|
130
|
+
|
|
131
|
+
При добавлении или изменении публичного поведения компонента — обнови файл release notes текущей версии:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
stories/release-notes/v1/<текущая версия>.mdx
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Что писать:**
|
|
138
|
+
|
|
139
|
+
- Новый prop: «Добавлено свойство `X` для ...»
|
|
140
|
+
- Изменение поведения: «Изменён/Исправлен ...»
|
|
141
|
+
- Удалённый prop (breaking change): выноси в секцию `<Heading>Ломающие изменения</Heading>`
|
|
142
|
+
|
|
143
|
+
**Формат записи:**
|
|
144
|
+
|
|
145
|
+
```mdx
|
|
146
|
+
**ComponentName**
|
|
147
|
+
|
|
148
|
+
- Добавлено свойство `propName` для описания.
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Компоненты внутри секции — в алфавитном порядке.
|
|
152
|
+
|
|
153
|
+
Не нужно добавлять release notes для:
|
|
154
|
+
- изменений только в stories/тестах/документации
|
|
155
|
+
- рефакторинга без изменения публичного API
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Чек-лист перед пушем
|
|
160
|
+
|
|
161
|
+
- [ ] Линтер проходит (автоматически при коммите)
|
|
162
|
+
- [ ] Unit-тесты проходят: `npm run test-unit`
|
|
163
|
+
- [ ] Нет случайно добавленных файлов (`git status`)
|
|
164
|
+
- [ ] Для новых локальных/временных/генерируемых файлов проверено, не нужно ли добавить правило в `.gitignore`
|
|
165
|
+
- [ ] Нет скриншотов из macOS в `__screenshots__/`
|
|
166
|
+
- [ ] Release notes обновлены (если изменился публичный API компонента)
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# Triplex-Next: Контекст для AI-агентов
|
|
2
|
+
|
|
3
|
+
Этот файл — главная точка входа в контекст дизайн-системы для любого AI-агента.
|
|
4
|
+
Читай его полностью перед тем, как вносить изменения в компоненты.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Что такое Triplex-Next
|
|
9
|
+
|
|
10
|
+
React-библиотека компонентов дизайн-системы.
|
|
11
|
+
Пакет: `@sberbusiness/triplex-next`.
|
|
12
|
+
Основная линия разработки: `main` → v1.x на React 18 + TypeScript strict.
|
|
13
|
+
Поддерживаемая legacy-линия: `release-0` → v0.x на React 17, синхронизируется мейнтейнерами.
|
|
14
|
+
|
|
15
|
+
**Основной сценарий работы агента:** добавить новый prop или вариант к существующему компоненту по описанию и/или макету из Figma.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Стек
|
|
20
|
+
|
|
21
|
+
| Слой | Технология |
|
|
22
|
+
|---|---|
|
|
23
|
+
| Компоненты | React 18/17, TypeScript 5 (strict) |
|
|
24
|
+
| Стили | LESS CSS Modules (`.module.less`) |
|
|
25
|
+
| Дизайн-токены | CSS-переменные, генерируются в `src/generated/` |
|
|
26
|
+
| Сборка | Vite, ES-модули only |
|
|
27
|
+
| Документация | Storybook 9 |
|
|
28
|
+
| Unit-тесты | Vitest + Testing Library |
|
|
29
|
+
| Visual regression | Storybook test-runner + jest-image-snapshot |
|
|
30
|
+
| E2E | Playwright |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Структура компонента
|
|
35
|
+
|
|
36
|
+
Каждый компонент живёт в `src/components/{ComponentName}/` и обычно содержит:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
src/components/Button/
|
|
40
|
+
├── Button.tsx # Основной компонент
|
|
41
|
+
├── ButtonBase.tsx # Базовый элемент (опционально)
|
|
42
|
+
├── ButtonIcon.tsx # Субкомпонент (опционально)
|
|
43
|
+
├── enums.ts # Enum'ы, специфичные для компонента
|
|
44
|
+
├── index.ts # Barrel export — ОБЯЗАТЕЛЕН
|
|
45
|
+
├── types.ts # Часто есть, если типы вынесены отдельно
|
|
46
|
+
├── styles/
|
|
47
|
+
│ ├── Button.module.less # Базовые стили
|
|
48
|
+
│ └── ButtonGeneral.module.less # Стили по теме/варианту
|
|
49
|
+
├── __tests__/
|
|
50
|
+
│ └── Button.test.tsx # Unit-тесты
|
|
51
|
+
└── Button-AI.md # Документация для AI-агентов (если компонент уже задокументирован)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Истории (stories) хранятся отдельно. В репозитории встречаются как flat-path файлы
|
|
55
|
+
(`stories/Badge.stories.tsx`), так и сгруппированные (`stories/Buttons/Button.stories.tsx`).
|
|
56
|
+
Для новых или существенно переписанных stories используй modern pattern из
|
|
57
|
+
`docs/ai/stories-guide.md`.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Соглашения по именованию
|
|
62
|
+
|
|
63
|
+
| Сущность | Префикс | Пример |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| Интерфейс | `I` | `IButtonGeneralProps` |
|
|
66
|
+
| Union type | `T` | `TButtonProps` |
|
|
67
|
+
| Enum | `E` | `EButtonTheme` |
|
|
68
|
+
| Enum в файле | `enums.ts` в папке компонента | `Button/enums.ts` |
|
|
69
|
+
| LESS класс | camelCase | `styles.secondaryLight` |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Дизайн-токены (CSS-переменные)
|
|
74
|
+
|
|
75
|
+
Паттерн именования:
|
|
76
|
+
```
|
|
77
|
+
--triplex-next-{Component}-{Variant}_{Property}_{State}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Примеры:
|
|
81
|
+
```
|
|
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
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Состояния:** `Default`, `Hover`, `Active`, `Focus`, `Disabled`
|
|
89
|
+
**Свойства:** `Background`, `Color`, `Shadow`, `Border`
|
|
90
|
+
|
|
91
|
+
Токены генерируются в `src/generated/themesCssVariables.css`. Не редактируй этот файл вручную.
|
|
92
|
+
|
|
93
|
+
Если добавляешь новое визуальное состояние — нужен новый токен. Имя токена согласуй с дизайнером в Figma.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Документация конвенций
|
|
98
|
+
|
|
99
|
+
Детальные правила вынесены в отдельные файлы:
|
|
100
|
+
|
|
101
|
+
| Тема | Файл |
|
|
102
|
+
|---|---|
|
|
103
|
+
| Codestyle (TypeScript, React, LESS, принципы) | `docs/ai/codestyle.md` |
|
|
104
|
+
| Тестирование (unit, visual, e2e) | `docs/ai/tests.md` |
|
|
105
|
+
| Stories (структура, примеры, чек-лист) | `docs/ai/stories-guide.md` |
|
|
106
|
+
| Коммиты, ветки, PR-воркфлоу | `docs/ai/commits.md` |
|
|
107
|
+
|
|
108
|
+
`docs/ai/codestyle.md` — краткий канонический список обязательных правил.
|
|
109
|
+
Если формулировки в entrypoint-файлах расходятся, ориентируйся на него и на
|
|
110
|
+
профильный подробный гайд.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Приоритет источников
|
|
115
|
+
|
|
116
|
+
Если инструкции расходятся, ориентируйся на них в таком порядке:
|
|
117
|
+
|
|
118
|
+
1. `src/components/{ComponentName}/{ComponentName}-AI.md` для конкретного компонента, если файл существует
|
|
119
|
+
2. `docs/ai/codestyle.md`
|
|
120
|
+
3. Профильный подробный гайд по зоне изменений (`codestyle.md`, `tests.md`, `stories-guide.md`, `commits.md`)
|
|
121
|
+
4. Этот файл (`docs/ai/CONTEXT.md`)
|
|
122
|
+
5. Локальный паттерн исходников компонента, stories и тестов
|
|
123
|
+
|
|
124
|
+
Не предполагай, что у каждого компонента уже есть AI-документация. Если файла
|
|
125
|
+
`{ComponentName}-AI.md` нет, ориентируйся на код, stories, тесты и общие правила
|
|
126
|
+
репозитория.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Как добавить новый prop к существующему компоненту
|
|
131
|
+
|
|
132
|
+
### 1. Определи, в каком интерфейсе добавлять
|
|
133
|
+
|
|
134
|
+
- Если prop нужен только для одной темы — добавь в соответствующий интерфейс (`IButtonGeneralProps`)
|
|
135
|
+
- Если для всех тем — добавь в каждый интерфейс темы и в базовый интерфейс
|
|
136
|
+
- Обнови union type (`TButtonProps`) при необходимости
|
|
137
|
+
|
|
138
|
+
### 2. Добавь prop в TypeScript-интерфейс
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
export interface IButtonGeneralProps extends IButtonBaseProps {
|
|
142
|
+
theme: EButtonTheme.GENERAL;
|
|
143
|
+
size: EComponentSize;
|
|
144
|
+
// ... existing props
|
|
145
|
+
newProp?: string; // добавь JSDoc если поведение нетривиально
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 3. Используй prop в компоненте
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// Деструктурируй из пропсов:
|
|
153
|
+
const { theme, size, newProp, className, ...rest } = props;
|
|
154
|
+
|
|
155
|
+
// Применяй через clsx:
|
|
156
|
+
<button
|
|
157
|
+
className={clsx(styles.button, styles[size], { [styles.newVariant]: newProp === 'variant' }, className)}
|
|
158
|
+
{...rest}
|
|
159
|
+
>
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 4. Добавь стили в LESS-модуль
|
|
163
|
+
|
|
164
|
+
```less
|
|
165
|
+
// В Button.module.less или в новый файл для варианта:
|
|
166
|
+
.button {
|
|
167
|
+
&.newVariant {
|
|
168
|
+
// используй существующие CSS-переменные или новые токены
|
|
169
|
+
background: var(--triplex-next-Button-General_Background_NewVariant);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 5. Обнови Storybook story
|
|
175
|
+
|
|
176
|
+
В существующем story-файле компонента:
|
|
177
|
+
- Добавь prop в `args` и `argTypes` Playground-стори
|
|
178
|
+
- Если prop имеет визуальные варианты — добавь named story (`Sizes`, `Themes` и т.д.)
|
|
179
|
+
- Если story уже использует `examples/` + `?raw`, сохрани этот modern pattern
|
|
180
|
+
- Если story legacy, не рефакторь весь файл только ради миграции структуры без отдельной задачи
|
|
181
|
+
- Подробно: `docs/ai/stories-guide.md` → раздел "Что обновлять при добавлении нового prop"
|
|
182
|
+
|
|
183
|
+
### 6. Обнови тесты
|
|
184
|
+
|
|
185
|
+
В `src/components/{ComponentName}/__tests__/{ComponentName}.test.tsx`:
|
|
186
|
+
- Добавь тест-кейс на рендеринг нового prop
|
|
187
|
+
- Проверь CSS-класс, атрибут или текст
|
|
188
|
+
- Следуй существующему паттерну тестов в файле
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Инварианты — что НЕЛЬЗЯ менять без обсуждения
|
|
193
|
+
|
|
194
|
+
1. **`forwardRef`** — обязателен на всех компонентах. Не убирай.
|
|
195
|
+
2. **Публичный API** — имена props, их типы, enum-значения. Это breaking change → мажорная версия.
|
|
196
|
+
3. **`index.ts` barrel exports** — всё, что было экспортировано, должно остаться экспортированным.
|
|
197
|
+
4. **CSS-переменные токенов** — переименование ломает темизацию у потребителей библиотеки.
|
|
198
|
+
5. **Имена LESS-классов**, которые могут использоваться снаружи — согласуй перед изменением.
|
|
199
|
+
6. **Корневой DOM-элемент, ref-target и accessibility-контракт** публичного компонента — не менять без причины и проверки.
|
|
200
|
+
7. **Story ids**, на которые опираются e2e/visual тесты, не переименовывать без синхронного обновления тестов.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Как читать существующий код
|
|
205
|
+
|
|
206
|
+
**Стили:** LESS-классы импортируются как объект `styles`:
|
|
207
|
+
```typescript
|
|
208
|
+
import styles from './styles/Button.module.less';
|
|
209
|
+
// Использование:
|
|
210
|
+
className={styles.button}
|
|
211
|
+
className={clsx(styles.button, styles.general, { [styles.loading]: loading })}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Утилиты:**
|
|
215
|
+
- `clsx` — объединение className с условиями
|
|
216
|
+
- `React.useId()` — уникальные ID для aria-атрибутов (предпочтительно в React 18, корректно работает с SSR)
|
|
217
|
+
- `lodash-es/uniqueId` — генерация уникальных ID вне компонентного контекста (когда `useId` недоступен)
|
|
218
|
+
|
|
219
|
+
**Паттерн миграции:**
|
|
220
|
+
- В репозитории сосуществуют legacy и modern stories/tests.
|
|
221
|
+
- Для небольших правок следуй локальному паттерну файла.
|
|
222
|
+
- Для новых компонентов и больших переписок используй modern conventions из `stories-guide.md` и `tests.md`.
|
|
223
|
+
|
|
224
|
+
**Стандартные зависимости компонентов:**
|
|
225
|
+
- `src/enums/EComponentSize` — размеры SM | MD | LG (общий для всех компонентов)
|
|
226
|
+
- `src/components/Loader` — спиннер загрузки
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Figma и MCP
|
|
231
|
+
|
|
232
|
+
Не у каждого компонента уже есть `{ComponentName}-AI.md`. Если компонент
|
|
233
|
+
задокументирован, Figma-метаданные лежат в frontmatter этого файла.
|
|
234
|
+
|
|
235
|
+
Формат frontmatter:
|
|
236
|
+
- `figma-node` — значение параметра `node-id` из URL Figma (например, `1-328`)
|
|
237
|
+
- `figma-file` — URL файла / design-ссылка на Figma-файл
|
|
238
|
+
|
|
239
|
+
Если в вашем окружении настроен Figma MCP или другой интеграционный инструмент:
|
|
240
|
+
1. Возьми `figma-node` из frontmatter компонента
|
|
241
|
+
2. Возьми `figma-file` из frontmatter компонента, если инструменту нужен file key или URL
|
|
242
|
+
3. Используй их для получения дизайн-спецификации
|
|
243
|
+
4. Сравни с текущим кодом и внеси нужные изменения
|
|
244
|
+
|
|
245
|
+
Если Figma-метаданные для компонента отсутствуют, не выдумывай их: попроси
|
|
246
|
+
ссылку у разработчика или работай по текстовому описанию/скриншоту.
|
|
247
|
+
|
|
248
|
+
Настройка MCP: см. `docs/ai/ROADMAP.md` → секция "Figma MCP Setup".
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Минимальная проверка перед завершением задачи
|
|
253
|
+
|
|
254
|
+
- Правки документации и конфигов: проверь ссылки, команды, примеры кода и согласованность между файлами.
|
|
255
|
+
- Правки компонентов и логики: запусти `npx tsc --noEmit` для проверки типов затронутых файлов и по возможности запусти focused unit test, если затронуто публичное поведение.
|
|
256
|
+
- Правки stories с визуальным эффектом: проверь, что состояние покрыто существующей story или новой `Visual tests` story.
|
|
257
|
+
- Правки accessibility, focus management, keyboard navigation и overlay-поведения: добавь или обнови точечный автотест, если это уместно.
|
|
258
|
+
- Если релевантная проверка не запускалась, явно сообщи об этом в финальном отчёте.
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Навигация по документации компонентов
|
|
263
|
+
|
|
264
|
+
Если компонент уже задокументирован, его AI-документация лежит в:
|
|
265
|
+
`src/components/{ComponentName}/{ComponentName}-AI.md`
|
|
266
|
+
|
|
267
|
+
Пример: `src/components/Button/Button-AI.md`
|
|
268
|
+
|
|
269
|
+
Шаблон для новых компонентов: `docs/ai/template-AI.md`
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Внешние ресурсы
|
|
274
|
+
|
|
275
|
+
- Документация для разработчиков и дизайнеров: https://triplex-design.ru/next/ru/Web/Components
|
|
276
|
+
- Storybook (локально): `npm run storybook` → http://localhost:6006
|
|
277
|
+
- Истории: `stories/` в корне репозитория
|