@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.
- package/README.md +7 -6
- package/bundle/components/AlertContext.md +11 -8
- package/bundle/components/AlertProcess.md +16 -12
- package/bundle/components/Badge.md +6 -3
- package/bundle/components/BodyPage.md +72 -4
- package/bundle/components/Button.md +46 -43
- package/bundle/components/ButtonDropdownExtended.md +3 -2
- package/bundle/components/ButtonIcon.md +7 -4
- package/bundle/components/Calendar.md +62 -59
- package/bundle/components/Caption.md +26 -23
- package/bundle/components/Checkbox.md +32 -29
- package/bundle/components/CheckboxTreeExtended.md +9 -5
- package/bundle/components/Chip.md +44 -41
- package/bundle/components/CodeText.md +26 -23
- package/bundle/components/Col.md +1 -2
- package/bundle/components/CollapsibleTree.md +8 -5
- package/bundle/components/CollapsibleTreeExtended.md +6 -1
- package/bundle/components/DatePickerExtended.md +409 -262
- package/bundle/components/Dropdown.md +33 -28
- package/bundle/components/EmptyView.md +12 -5
- package/bundle/components/ExpandAnimation.md +263 -218
- package/bundle/components/Footer.md +235 -278
- package/bundle/components/FooterPage.md +6 -2
- package/bundle/components/FormField.md +44 -41
- package/bundle/components/FormGroup.md +192 -52
- package/bundle/components/Header.md +491 -211
- package/bundle/components/HeaderPage.md +6 -2
- package/bundle/components/ImageGallery.md +33 -34
- package/bundle/components/ImageGalleryExtended.md +33 -34
- package/bundle/components/Island.md +52 -14
- package/bundle/components/LightBox.md +25 -18
- package/bundle/components/Link.md +211 -96
- package/bundle/components/ListActionItem.md +7 -4
- package/bundle/components/ListItem.md +11 -8
- package/bundle/components/ListItemControlsButton.md +16 -13
- package/bundle/components/ListItemControlsButtonDropdown.md +9 -6
- package/bundle/components/ListItemSelectable.md +7 -4
- package/bundle/components/ListMasterFooter.md +8 -5
- package/bundle/components/ListMasterHeader.md +8 -5
- package/bundle/components/ListSortableItem.md +11 -8
- package/bundle/components/ListTableItem.md +7 -4
- package/bundle/components/LoaderMiddle.md +7 -4
- package/bundle/components/LoaderScreen.md +11 -8
- package/bundle/components/LoaderSmall.md +7 -4
- package/bundle/components/Marker.md +184 -69
- package/bundle/components/MarkerStatus.md +206 -88
- package/bundle/components/MaskedField.md +2 -4
- package/bundle/components/MasterTable.md +602 -0
- package/bundle/components/ModalWindow.md +7 -4
- package/bundle/components/MultiselectField.md +2183 -132
- package/bundle/components/Notification.md +12 -9
- package/bundle/components/Overlay.md +33 -5
- package/bundle/components/Page.md +2 -2
- package/bundle/components/Pagination.md +27 -21
- package/bundle/components/Row.md +1 -1
- package/bundle/components/SelectExtendedField.md +3 -3
- package/bundle/components/SelectField.md +466 -148
- package/bundle/components/SliderExtended.md +39 -36
- package/bundle/components/SmallInput.md +194 -51
- package/bundle/components/Suggest.md +535 -99
- package/bundle/components/SwipeableArea.md +428 -79
- package/bundle/components/TableBasic.md +2302 -0
- package/bundle/components/TabsExtended.md +24 -21
- package/bundle/components/Tag.md +263 -78
- package/bundle/components/Text.md +28 -25
- package/bundle/components/TextField.md +3 -4
- package/bundle/components/ThemeProvider.md +50 -1
- package/bundle/components/Title.md +26 -23
- package/bundle/components/Tooltip.md +24 -21
- package/bundle/components/TopOverlay.md +368 -89
- package/bundle/components/TreeView.md +343 -166
- package/bundle/components/TreeViewNode.md +436 -0
- package/bundle/guides/codestyle.md +3 -0
- package/bundle/guides/commits.md +106 -26
- package/bundle/guides/context.md +84 -12
- package/bundle/guides/guidelines.md +321 -0
- package/bundle/guides/template.md +22 -12
- package/bundle/manifest.json +54 -20
- package/bundle/release-notes/1.44.0.mdx +113 -0
- package/bundle/release-notes/1.45.0.mdx +124 -0
- package/bundle/release-notes/1.46.0.mdx +7 -0
- package/bundle/tokens.json +6362 -0
- package/dist/index.js +177 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -38,12 +38,13 @@ MCP-сервер для дизайн-системы Triplex. Предостав
|
|
|
38
38
|
|
|
39
39
|
## Доступные tools
|
|
40
40
|
|
|
41
|
-
| Tool | Описание
|
|
42
|
-
| ----------------------------------- |
|
|
43
|
-
| `list_components` | Список всех компонентов с кратким описанием и флагом `ai_ready`
|
|
44
|
-
| `get_component(name)` | Полная документация компонента: props, токены, примеры, ограничения
|
|
45
|
-
| `get_tokens(component?)`
|
|
46
|
-
| `list_icons(query?, size?, limit?)` | Иконки из `@sberbusiness/icons-next` с фильтрами по подстроке в имени и размеру (защита от галлюцинаций имён)
|
|
41
|
+
| Tool | Описание |
|
|
42
|
+
| ----------------------------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
43
|
+
| `list_components` | Список всех компонентов с кратким описанием и флагом `ai_ready` |
|
|
44
|
+
| `get_component(name)` | Полная документация компонента: props, токены, примеры, ограничения |
|
|
45
|
+
| `get_tokens(component?, group?)` | Дизайн-токены: индекс групп, токены компонента или группа целиком — с путями `Группа.Токен` и значениями тем |
|
|
46
|
+
| `list_icons(query?, size?, limit?)` | Иконки из `@sberbusiness/icons-next` с фильтрами по подстроке в имени и размеру (защита от галлюцинаций имён) |
|
|
47
|
+
| `get_guidelines` | Гайдлайны кодогенерации на Triplex для ИИ-агентов (правила `TPX-G-NN` из `docs/mcp/guidelines.md` triplex-next) |
|
|
47
48
|
|
|
48
49
|
Флаг `ai_ready: true` означает, что у компонента есть полноценная AI-документация
|
|
49
50
|
(`*-AI.md` с frontmatter, секциями и примерами). Для остальных компонентов сервер
|
|
@@ -3,10 +3,10 @@ component: AlertContext
|
|
|
3
3
|
category: Alert
|
|
4
4
|
related: [AlertProcess]
|
|
5
5
|
tokens:
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
- AlertContext.Info_Color
|
|
7
|
+
- AlertContext.Warning_Color
|
|
8
|
+
- AlertContext.Error_Color
|
|
9
|
+
- AlertContext.System_Color
|
|
10
10
|
stories: stories/Alerts/AlertContext.stories.tsx
|
|
11
11
|
version: "1.0"
|
|
12
12
|
---
|
|
@@ -61,11 +61,14 @@ version: "1.0"
|
|
|
61
61
|
|
|
62
62
|
## Дизайн-токены
|
|
63
63
|
|
|
64
|
+
Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
|
|
65
|
+
«Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/AlertContext.ts`.
|
|
66
|
+
|
|
64
67
|
```text
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
AlertContext.Info_Color // цвет текста для type=INFO
|
|
69
|
+
AlertContext.Warning_Color // цвет текста для type=WARNING
|
|
70
|
+
AlertContext.Error_Color // цвет текста для type=ERROR
|
|
71
|
+
AlertContext.System_Color // цвет текста для type=SYSTEM
|
|
69
72
|
```
|
|
70
73
|
|
|
71
74
|
Значения — в `src/components/DesignTokens/components/AlertContext.ts`. Обрати
|
|
@@ -3,11 +3,11 @@ component: AlertProcess
|
|
|
3
3
|
category: Alert
|
|
4
4
|
related: [AlertContext]
|
|
5
5
|
tokens:
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
- AlertProcess.Info_Background
|
|
7
|
+
- AlertProcess.Warning_Background
|
|
8
|
+
- AlertProcess.Error_Background
|
|
9
|
+
- AlertProcess.System_Background
|
|
10
|
+
- AlertProcess.Feature_Background
|
|
11
11
|
stories: stories/Alerts/AlertProcess.stories.tsx
|
|
12
12
|
version: "1.0"
|
|
13
13
|
---
|
|
@@ -49,7 +49,7 @@ ARIA-роли не выставляет.
|
|
|
49
49
|
| `closable` | `boolean` | `false` | Показывает кнопку закрытия в правом верхнем углу |
|
|
50
50
|
| `onClose` | `() => void` | — | Вызывается **после** того, как компонент скрыл себя. Аргументов не принимает, отменить закрытие нельзя |
|
|
51
51
|
| `renderIcon` | `React.ReactNode` | иконка по `type` | Полностью заменяет иконку по умолчанию |
|
|
52
|
-
| `borderRadius` | `EAlertProcessBorderRadius` | `EAlertProcessBorderRadius.MD` | Скругление углов: `MD` (
|
|
52
|
+
| `borderRadius` | `EAlertProcessBorderRadius` | `EAlertProcessBorderRadius.MD` | Скругление углов: `MD` (16px) / `LG` (24px) |
|
|
53
53
|
| `children` | `React.ReactNode` | — | Контент. Типографику задаёт потребитель компонентами `Typography` — сам `AlertProcess` размер и цвет текста не задаёт |
|
|
54
54
|
| `...HTMLDivElementAttributes` | — | — | Все стандартные атрибуты `<div>` |
|
|
55
55
|
|
|
@@ -69,18 +69,21 @@ ARIA-роли не выставляет.
|
|
|
69
69
|
|
|
70
70
|
## Дизайн-токены
|
|
71
71
|
|
|
72
|
+
Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
|
|
73
|
+
«Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/AlertProcess.ts`.
|
|
74
|
+
|
|
72
75
|
```text
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
AlertProcess.Info_Background // фон для type=INFO
|
|
77
|
+
AlertProcess.Warning_Background // фон для type=WARNING
|
|
78
|
+
AlertProcess.Error_Background // фон для type=ERROR
|
|
79
|
+
AlertProcess.System_Background // фон для type=SYSTEM
|
|
80
|
+
AlertProcess.Feature_Background // фон для type=FEATURE
|
|
78
81
|
```
|
|
79
82
|
|
|
80
83
|
Значения — в `src/components/DesignTokens/components/AlertProcess.ts`. Компонент
|
|
81
84
|
задаёт **только фон**: цвет и размер текста — зона ответственности `Typography`
|
|
82
85
|
у потребителя, цвет иконок — `paletteIndex` соответствующей иконки. Скругления
|
|
83
|
-
(
|
|
86
|
+
(16px / 24px) и внутренние отступы (16px) заданы литералами в
|
|
84
87
|
`styles/AlertProcess.module.less` — токенов для них нет.
|
|
85
88
|
|
|
86
89
|
---
|
|
@@ -245,6 +248,7 @@ ARIA-роли не выставляет.
|
|
|
245
248
|
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
246
249
|
| 2026-08-10 | Создан документ. AI-рефакторинг: `AlertProcessSpoiler` переведён на `forwardRef` и перестал затирать `className` собственными классами; из него убрана ссылка на несуществующий CSS-класс `styles.spoiler`; в `AlertProcess` убрано дублирующее присваивание `AlertProcess.Spoiler`, `renderIcon` приведён к `\|\|` как в `AlertContext`, добавлены JSDoc на props с дефолтами и явный `children`; из LESS удалено мёртвое правило `.alertTypeFeature .themeIcon { padding-top: 0 }`. Unit-тесты разбиты на `AlertProcess.test.tsx`и`AlertProcessSpoiler.test.tsx`и расширены с 11 до 34 кейсов. Stories переведены на modern pattern — файлы примеров без суффикса`Example`. Публичный API не изменён. |
|
|
247
250
|
| 2026-08-11 | По ревью PR #520: из `AlertProcessSpoiler` убрана пустая обёртка-`<div>` — контент и кнопка раскрытия стали соседними элементами, корневым элементом компонента стал элемент контента (он и раньше получал `className` / `ref` / `...rest`). На кнопке раскрытия выставлен `aria-expanded`. Тесты дополнены до 37 кейсов. Публичный API не изменён. |
|
|
251
|
+
| 2026-08-28 | Скругление варианта `MD` увеличено с 12px до 16px в `styles/AlertProcess.module.less`. |
|
|
248
252
|
|
|
249
253
|
---
|
|
250
254
|
|
|
@@ -3,7 +3,7 @@ component: Badge
|
|
|
3
3
|
category: Badge
|
|
4
4
|
related: [Marker, Chip, DropdownListItem, DropdownMobileListItem, TabsLineItem, TabsExtendedTabButton, Text, Caption]
|
|
5
5
|
tokens:
|
|
6
|
-
-
|
|
6
|
+
- Badge.Background
|
|
7
7
|
stories: stories/Badge/Badge.stories.tsx
|
|
8
8
|
version: "1.0"
|
|
9
9
|
---
|
|
@@ -77,7 +77,7 @@ version: "1.0"
|
|
|
77
77
|
|
|
78
78
|
### Цвет и текст
|
|
79
79
|
|
|
80
|
-
- Фон обоих компонентов — единственный токен
|
|
80
|
+
- Фон обоих компонентов — единственный токен `Badge.Background`
|
|
81
81
|
(`ColorWarning.70` в обеих темах). Вариантов/статусов у компонента нет.
|
|
82
82
|
- Цвет и размер текста задаёт потребитель, вкладывая внутрь `Text` / `Caption`
|
|
83
83
|
с нужным `type` (в примерах — `EFontType.PRIMARY_INVERT`). Своей типографики
|
|
@@ -90,8 +90,11 @@ version: "1.0"
|
|
|
90
90
|
|
|
91
91
|
## Дизайн-токены
|
|
92
92
|
|
|
93
|
+
Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
|
|
94
|
+
«Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Badge.ts`.
|
|
95
|
+
|
|
93
96
|
```text
|
|
94
|
-
|
|
97
|
+
Badge.Background
|
|
95
98
|
```
|
|
96
99
|
|
|
97
100
|
Один токен на всё семейство: фон `Badge` (`styles/Badge.module.less`) и цвет точки
|
|
@@ -35,12 +35,37 @@ version: "1.0"
|
|
|
35
35
|
|
|
36
36
|
| Prop | Тип | По умолчанию | Описание |
|
|
37
37
|
|---|---|---|---|
|
|
38
|
-
| `verticalMargin` | `
|
|
38
|
+
| `verticalMargin` | `TBodyPageVerticalMargin` | `LARGE` | Вертикальные отступы: `LARGE` = 24px (16px на узких экранах), `SMALL` = 16px (8px на узких), `NONE` = 0. Одно значение задаёт обе стороны; объект `{top, bottom}` — каждую отдельно, обе стороны указываются явно. В LightBox используется `SMALL`. |
|
|
39
39
|
| `size` | `EComponentSize` | — | Размер острова (Island). **Доступен только для `type=FIRST`**; для `type=SECOND` типизирован как `never`. |
|
|
40
40
|
|
|
41
|
+
### Тип verticalMargin
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
interface IBodyPageVerticalMarginSides {
|
|
45
|
+
top: EBodyPageVerticalMargin;
|
|
46
|
+
bottom: EBodyPageVerticalMargin;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
type TBodyPageVerticalMargin = EBodyPageVerticalMargin | IBodyPageVerticalMarginSides;
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<Page.Body type={EBodyPageType.FIRST} verticalMargin={EBodyPageVerticalMargin.NONE}>…</Page.Body>
|
|
54
|
+
<Page.Body
|
|
55
|
+
type={EBodyPageType.FIRST}
|
|
56
|
+
verticalMargin={{top: EBodyPageVerticalMargin.NONE, bottom: EBodyPageVerticalMargin.LARGE}}
|
|
57
|
+
>…</Page.Body>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`top` и `bottom` в объектной форме обязательны: скрытого дефолта у стороны нет, отступ виден
|
|
61
|
+
прямо в месте вызова. Частичный объект (`{top}`) и пустой (`{}`) — ошибка компиляции.
|
|
62
|
+
|
|
41
63
|
### Ограничения по типам
|
|
42
64
|
|
|
43
65
|
- `size` доступен только при `type=FIRST` (в `SECOND` контент не оборачивается в Island, поэтому `size?: never`).
|
|
66
|
+
- Частичный объект в `verticalMargin` запрещён типом. Если он всё же придёт из нетипизированного кода,
|
|
67
|
+
сторона без значения не получит класс и даст 0 — дефолт `LARGE` намеренно не подставляется в рантайме,
|
|
68
|
+
иначе вернулся бы скрытый дефолт стороны.
|
|
44
69
|
|
|
45
70
|
---
|
|
46
71
|
|
|
@@ -48,7 +73,8 @@ version: "1.0"
|
|
|
48
73
|
|
|
49
74
|
Собственных CSS-переменных нет. Внешний вид карточки наследуется от `Island` (`EIslandType.TYPE_1`).
|
|
50
75
|
Вертикальные отступы заданы фиксированными значениями в `styles/BodyPage.module.less`
|
|
51
|
-
|
|
76
|
+
односторонними классами `marginTop{Large,Small,None}` / `marginBottom{Large,Small,None}`
|
|
77
|
+
(24/16/0px и адаптив 16/8/0px на `@screen-sm-max`).
|
|
52
78
|
|
|
53
79
|
---
|
|
54
80
|
|
|
@@ -59,9 +85,14 @@ version: "1.0"
|
|
|
59
85
|
- `displayName = "BodyPage"` — не менять.
|
|
60
86
|
- Discriminated union по `type` и значения `EBodyPageType` / `EBodyPageVerticalMargin` — часть
|
|
61
87
|
публичного API, менять нельзя.
|
|
62
|
-
- Экспорты `BodyPage`, `IBodyPageTypeFirstProps`, `IBodyPageTypeSecondProps
|
|
88
|
+
- Экспорты `BodyPage`, `IBodyPageTypeFirstProps`, `IBodyPageTypeSecondProps`,
|
|
89
|
+
`IBodyPageVerticalMarginSides`, `TBodyPageVerticalMargin` идут в barrel
|
|
63
90
|
`src/components/Page/index.ts` — сохранять.
|
|
64
91
|
- `verticalMargin` по умолчанию `LARGE` — менять дефолт нельзя без обсуждения.
|
|
92
|
+
- В объектной форме `top` и `bottom` обязательны — не делать их опциональными: дефолт стороны
|
|
93
|
+
вернул бы скрытое поведение, которого здесь сознательно нет.
|
|
94
|
+
- Скалярная форма `verticalMargin` должна и дальше работать как раньше — это обратная
|
|
95
|
+
совместимость публичного API.
|
|
65
96
|
|
|
66
97
|
---
|
|
67
98
|
|
|
@@ -92,7 +123,7 @@ version: "1.0"
|
|
|
92
123
|
| `Playground` | `Playground.tsx` | Интерактивный контроль `type` и `verticalMargin` |
|
|
93
124
|
| `Default` | `Default.tsx` | Минимальный пример (FIRST, контент в карточке) |
|
|
94
125
|
| `Types` | `Types.tsx` | Сравнение типов FIRST и SECOND |
|
|
95
|
-
| `VerticalMargins` | `VerticalMargins.tsx` | Отступы LARGE (24px)
|
|
126
|
+
| `VerticalMargins` | `VerticalMargins.tsx` | Отступы LARGE (24px), SMALL (16px), NONE (0) и асимметричные комбинации |
|
|
96
127
|
| `VisualTests` | `VisualTests.tsx` | Матрица type × verticalMargin для скриншот-регрессии |
|
|
97
128
|
|
|
98
129
|
---
|
|
@@ -102,6 +133,7 @@ version: "1.0"
|
|
|
102
133
|
| Дата | Изменение |
|
|
103
134
|
|---|---|
|
|
104
135
|
| 2026-06-18 | Создан документ. AI-рефакторинг (clsx order, JSDoc), unit-тесты, миграция stories на modern pattern. |
|
|
136
|
+
| 2026-08-26 | TRI-121: добавлено `EBodyPageVerticalMargin.NONE`; `verticalMargin` принимает объект `{top, bottom}` (обе стороны обязательны) для независимых отступов сверху и снизу. LESS переразбит на односторонние классы. |
|
|
105
137
|
|
|
106
138
|
---
|
|
107
139
|
|
|
@@ -180,6 +212,42 @@ export const VerticalMargins = () => (
|
|
|
180
212
|
</Text>
|
|
181
213
|
</Page.Body>
|
|
182
214
|
</div>
|
|
215
|
+
<div>
|
|
216
|
+
<div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: 700 }}>
|
|
217
|
+
NONE (0) — собственных отступов нет
|
|
218
|
+
</div>
|
|
219
|
+
<Page.Body type={EBodyPageType.FIRST} verticalMargin={EBodyPageVerticalMargin.NONE}>
|
|
220
|
+
<Text tag="div" size={ETextSize.B2} type={EFontType.PRIMARY}>
|
|
221
|
+
Без вертикальных отступов сверху и снизу.
|
|
222
|
+
</Text>
|
|
223
|
+
</Page.Body>
|
|
224
|
+
</div>
|
|
225
|
+
<div>
|
|
226
|
+
<div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: 700 }}>
|
|
227
|
+
{"{ top: NONE, bottom: LARGE }"}
|
|
228
|
+
</div>
|
|
229
|
+
<Page.Body
|
|
230
|
+
type={EBodyPageType.FIRST}
|
|
231
|
+
verticalMargin={{ top: EBodyPageVerticalMargin.NONE, bottom: EBodyPageVerticalMargin.LARGE }}
|
|
232
|
+
>
|
|
233
|
+
<Text tag="div" size={ETextSize.B2} type={EFontType.PRIMARY}>
|
|
234
|
+
Отступы задаются раздельно: сверху 0, снизу 24px.
|
|
235
|
+
</Text>
|
|
236
|
+
</Page.Body>
|
|
237
|
+
</div>
|
|
238
|
+
<div>
|
|
239
|
+
<div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: 700 }}>
|
|
240
|
+
{"{ top: SMALL, bottom: NONE }"}
|
|
241
|
+
</div>
|
|
242
|
+
<Page.Body
|
|
243
|
+
type={EBodyPageType.FIRST}
|
|
244
|
+
verticalMargin={{ top: EBodyPageVerticalMargin.SMALL, bottom: EBodyPageVerticalMargin.NONE }}
|
|
245
|
+
>
|
|
246
|
+
<Text tag="div" size={ETextSize.B2} type={EFontType.PRIMARY}>
|
|
247
|
+
Отступы задаются раздельно: сверху 16px, снизу 0.
|
|
248
|
+
</Text>
|
|
249
|
+
</Page.Body>
|
|
250
|
+
</div>
|
|
183
251
|
</div>
|
|
184
252
|
);
|
|
185
253
|
```
|
|
@@ -3,48 +3,48 @@ component: Button
|
|
|
3
3
|
category: Buttons
|
|
4
4
|
related: [ButtonIcon, ButtonDropdown, ButtonDropdownExtended]
|
|
5
5
|
tokens:
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
6
|
+
- Button.General_Background_Default
|
|
7
|
+
- Button.General_Color_Default
|
|
8
|
+
- Button.General_Background_Hover
|
|
9
|
+
- Button.General_Color_Hover
|
|
10
|
+
- Button.General_Background_Active
|
|
11
|
+
- Button.General_Color_Active
|
|
12
|
+
- Button.General_Shadow_Focus
|
|
13
|
+
- Button.General_Background_Disabled
|
|
14
|
+
- Button.General_Color_Disabled
|
|
15
|
+
- Button.Secondary_Background_Default
|
|
16
|
+
- Button.Secondary_Color_Default
|
|
17
|
+
- Button.Secondary_Background_Hover
|
|
18
|
+
- Button.Secondary_Color_Hover
|
|
19
|
+
- Button.Secondary_Background_Active
|
|
20
|
+
- Button.Secondary_Color_Active
|
|
21
|
+
- Button.Secondary_Shadow_Focus
|
|
22
|
+
- Button.Secondary_Background_Disabled
|
|
23
|
+
- Button.Secondary_Color_Disabled
|
|
24
|
+
- Button.SecondaryLight_Background_Default
|
|
25
|
+
- Button.SecondaryLight_Color_Default
|
|
26
|
+
- Button.SecondaryLight_Background_Hover
|
|
27
|
+
- Button.SecondaryLight_Color_Hover
|
|
28
|
+
- Button.SecondaryLight_Background_Active
|
|
29
|
+
- Button.SecondaryLight_Color_Active
|
|
30
|
+
- Button.SecondaryLight_Shadow_Focus
|
|
31
|
+
- Button.SecondaryLight_Background_Disabled
|
|
32
|
+
- Button.SecondaryLight_Color_Disabled
|
|
33
|
+
- Button.Danger_Background_Default
|
|
34
|
+
- Button.Danger_Color_Default
|
|
35
|
+
- Button.Danger_Background_Hover
|
|
36
|
+
- Button.Danger_Color_Hover
|
|
37
|
+
- Button.Danger_Background_Active
|
|
38
|
+
- Button.Danger_Color_Active
|
|
39
|
+
- Button.Danger_Shadow_Focus
|
|
40
|
+
- Button.Danger_Background_Disabled
|
|
41
|
+
- Button.Danger_Color_Disabled
|
|
42
|
+
- Button.Link_Color_Default
|
|
43
|
+
- Button.Link_Color_Hover
|
|
44
|
+
- Button.Link_Color_Active
|
|
45
|
+
- Button.Link_Shadow_Focus
|
|
46
|
+
- Button.Link_Color_Disabled
|
|
47
|
+
- Button.Icon_Shadow_Focus
|
|
48
48
|
stories: stories/Buttons/Button.stories.tsx
|
|
49
49
|
version: "1.0"
|
|
50
50
|
---
|
|
@@ -117,7 +117,10 @@ version: "1.0"
|
|
|
117
117
|
|
|
118
118
|
## Дизайн-токены
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
|
|
121
|
+
«Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Button.ts`.
|
|
122
|
+
|
|
123
|
+
Паттерн: `Button.{Theme}_{Property}_{State}`
|
|
121
124
|
|
|
122
125
|
Каждая тема (кроме `LINK`) имеет полный набор:
|
|
123
126
|
- `_Background_Default/Hover/Active/Disabled`
|
|
@@ -61,12 +61,12 @@ version: "1.0"
|
|
|
61
61
|
|
|
62
62
|
## Инварианты
|
|
63
63
|
|
|
64
|
-
-
|
|
64
|
+
- `forwardRef` на компоненте — не убирать. Ref идёт на корневой `<div>` (`HTMLDivElement`) и мерджится с внутренним `containerRef` через callback-ref: `containerRef` отвечает за определение «клик внутри триггера», поэтому подменять его форвардом нельзя — нужны оба.
|
|
65
65
|
- Публичные имена `ButtonDropdownExtended`, `IButtonDropdownExtendedProps`, `IButtonDropdownExtendedButtonProvideProps`, `IButtonDropdownExtendedDropdownProvideProps`, `IButtonDropdownExtendedComponent` экспортируются из `src/components/Button/index.ts` — сохранять.
|
|
66
66
|
- Статические свойства `Dropdown` и `DropdownList` — часть публичного API.
|
|
67
67
|
- Фиксация режима управления на монтировании — наблюдаемое поведение, на него опираются потребители. Менять только осознанно.
|
|
68
68
|
- `renderDropdown` обязан применить переданный `className` к выпадающему блоку. Но не считай, что на нём держится раскладка: стили этого класса объявлены вложенным селектором внутри `.buttonDropdownExtended` и при рендере блока в портале (штатный путь через `ButtonDropdownExtended.Dropdown`) не применяются — см. раздел «Дизайн-токены».
|
|
69
|
-
- Корневой DOM-элемент — `<div>` с классом `buttonDropdownExtended`; на нём же
|
|
69
|
+
- Корневой DOM-элемент — `<div>` с классом `buttonDropdownExtended`; на нём же живут `containerRef` и forwarded ref.
|
|
70
70
|
- Слушатели `keydown` / `mousedown` / `touchstart` вешаются на `document` только пока блок открыт.
|
|
71
71
|
|
|
72
72
|
---
|
|
@@ -115,6 +115,7 @@ version: "1.0"
|
|
|
115
115
|
|
|
116
116
|
| Дата | Изменение |
|
|
117
117
|
|---|---|
|
|
118
|
+
| 2026-08-31 | Компонент переведён с `React.FC` на `Object.assign(forwardRef(...), {...})` — теперь пробрасывает `ref` на корневой `<div>`, форвард мерджится с внутренним `containerRef`. Базовый тип `IButtonDropdownExtendedComponent` изменился с `React.FC` на `React.ForwardRefExoticComponent`; набор props, статики и DOM не изменились. Понадобилось для `TableBasicSettings`, который рендерит `ButtonDropdownExtended` корнем. |
|
|
118
119
|
| 2026-07-29 | Создан документ AI-ready для `ButtonDropdownExtended`. AI-рефакторинг без изменения публичного API: режим управления переведён с ref на `useState` (устранены ошибки `react-hooks/refs`), убраны вырожденный тернарник в `useState` и мёртвые проверки `opened` внутри обработчиков, `setOpened && setOpened(...)` заменён на опциональный вызов, добавлены JSDoc. Добавлены unit-тесты и stories по modern pattern. |
|
|
119
120
|
|
|
120
121
|
---
|
|
@@ -3,7 +3,7 @@ component: ButtonIcon
|
|
|
3
3
|
category: Buttons
|
|
4
4
|
related: [Button]
|
|
5
5
|
tokens:
|
|
6
|
-
-
|
|
6
|
+
- Button.Icon_Shadow_Focus
|
|
7
7
|
stories: stories/Buttons/ButtonIcon.stories.tsx
|
|
8
8
|
version: "1.0"
|
|
9
9
|
---
|
|
@@ -46,8 +46,11 @@ version: "1.0"
|
|
|
46
46
|
|
|
47
47
|
## Дизайн-токены
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
|
|
50
|
+
«Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Button.ts`.
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
Button.Icon_Shadow_Focus
|
|
51
54
|
```
|
|
52
55
|
|
|
53
56
|
---
|
|
@@ -65,7 +68,7 @@ version: "1.0"
|
|
|
65
68
|
|
|
66
69
|
- Компонент рендерит нативный `<button>`, поэтому базовая keyboard-навигация доступна из коробки.
|
|
67
70
|
- Компонент **не хардкодит** `aria-label` (библиотека мультиязычная). Для иконки без текста потребитель **обязан** передать `aria-label` через `...rest`.
|
|
68
|
-
- Фокусное состояние реализовано через `:focus-visible` и токен
|
|
71
|
+
- Фокусное состояние реализовано через `:focus-visible` и токен `Button.Icon_Shadow_Focus`.
|
|
69
72
|
|
|
70
73
|
---
|
|
71
74
|
|
|
@@ -3,35 +3,35 @@ component: Calendar
|
|
|
3
3
|
category: Date components
|
|
4
4
|
related: [DatePickerExtended, DateField, DateRange, MonthYearField, MonthYearRange, ChipDatePicker]
|
|
5
5
|
tokens:
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
6
|
+
- Calendar.Background
|
|
7
|
+
- Calendar.View_Header_Color
|
|
8
|
+
- Calendar.View_Item_Background_Default
|
|
9
|
+
- Calendar.View_Item_Background_Hover
|
|
10
|
+
- Calendar.View_Item_Background_Selected_Default
|
|
11
|
+
- Calendar.View_Item_Background_Selected_Hover
|
|
12
|
+
- Calendar.View_Item_Background_Selected_Muted_Default
|
|
13
|
+
- Calendar.View_Item_Background_Selected_Muted_Hover
|
|
14
|
+
- Calendar.View_Item_BorderColor_Default
|
|
15
|
+
- Calendar.View_Item_BorderColor_Focus
|
|
16
|
+
- Calendar.View_Item_Color_Default
|
|
17
|
+
- Calendar.View_Item_Color_Disabled
|
|
18
|
+
- Calendar.View_Item_Color_Hover
|
|
19
|
+
- Calendar.View_Item_Color_Muted
|
|
20
|
+
- Calendar.View_Item_Color_Selected
|
|
21
|
+
- Calendar.View_Item_Color_Selected_Muted_Default
|
|
22
|
+
- Calendar.View_Item_Color_Selected_Muted_Hover
|
|
23
|
+
- Calendar.View_Item_Mark_Basic_Background_Default
|
|
24
|
+
- Calendar.View_Item_Mark_Basic_Background_Selected_Default
|
|
25
|
+
- Calendar.View_Item_Mark_Basic_Background_Selected_Hover
|
|
26
|
+
- Calendar.View_Item_Mark_Standard_Background_Default
|
|
27
|
+
- Calendar.View_Item_Mark_Standard_Background_Selected_Default
|
|
28
|
+
- Calendar.View_Item_Mark_Standard_Background_Selected_Hover
|
|
29
|
+
- Calendar.View_Item_Mark_Attention_Background_Default
|
|
30
|
+
- Calendar.View_Item_Mark_Attention_Background_Selected_Default
|
|
31
|
+
- Calendar.View_Item_Mark_Attention_Background_Selected_Hover
|
|
32
|
+
- Calendar.View_Item_Mark_Critical_Background_Default
|
|
33
|
+
- Calendar.View_Item_Mark_Critical_Background_Selected_Default
|
|
34
|
+
- Calendar.View_Item_Mark_Critical_Background_Selected_Hover
|
|
35
35
|
stories: stories/Calendar/Calendar.stories.tsx
|
|
36
36
|
version: "1.0"
|
|
37
37
|
---
|
|
@@ -92,36 +92,39 @@ version: "1.0"
|
|
|
92
92
|
|
|
93
93
|
## Дизайн-токены
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
95
|
+
Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
|
|
96
|
+
«Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Calendar.ts`.
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
Calendar.Background
|
|
100
|
+
Calendar.View_Header_Color
|
|
101
|
+
Calendar.View_Item_Background_Default
|
|
102
|
+
Calendar.View_Item_Background_Hover
|
|
103
|
+
Calendar.View_Item_Background_Selected_Default
|
|
104
|
+
Calendar.View_Item_Background_Selected_Hover
|
|
105
|
+
Calendar.View_Item_Background_Selected_Muted_Default
|
|
106
|
+
Calendar.View_Item_Background_Selected_Muted_Hover
|
|
107
|
+
Calendar.View_Item_BorderColor_Default
|
|
108
|
+
Calendar.View_Item_BorderColor_Focus
|
|
109
|
+
Calendar.View_Item_Color_Default
|
|
110
|
+
Calendar.View_Item_Color_Disabled
|
|
111
|
+
Calendar.View_Item_Color_Hover
|
|
112
|
+
Calendar.View_Item_Color_Muted
|
|
113
|
+
Calendar.View_Item_Color_Selected
|
|
114
|
+
Calendar.View_Item_Color_Selected_Muted_Default
|
|
115
|
+
Calendar.View_Item_Color_Selected_Muted_Hover
|
|
116
|
+
Calendar.View_Item_Mark_Basic_Background_Default
|
|
117
|
+
Calendar.View_Item_Mark_Basic_Background_Selected_Default
|
|
118
|
+
Calendar.View_Item_Mark_Basic_Background_Selected_Hover
|
|
119
|
+
Calendar.View_Item_Mark_Standard_Background_Default
|
|
120
|
+
Calendar.View_Item_Mark_Standard_Background_Selected_Default
|
|
121
|
+
Calendar.View_Item_Mark_Standard_Background_Selected_Hover
|
|
122
|
+
Calendar.View_Item_Mark_Attention_Background_Default
|
|
123
|
+
Calendar.View_Item_Mark_Attention_Background_Selected_Default
|
|
124
|
+
Calendar.View_Item_Mark_Attention_Background_Selected_Hover
|
|
125
|
+
Calendar.View_Item_Mark_Critical_Background_Default
|
|
126
|
+
Calendar.View_Item_Mark_Critical_Background_Selected_Default
|
|
127
|
+
Calendar.View_Item_Mark_Critical_Background_Selected_Hover
|
|
125
128
|
```
|
|
126
129
|
|
|
127
130
|
Кнопки заголовка и футера используют токены `Button` / `ButtonIcon`.
|