@sberbusiness/triplex-next-mcp-server 0.36.0-beta0 → 1.40.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/bundle/components/AlertContext.md +268 -0
- package/bundle/components/Button.md +5 -2
- package/bundle/components/ButtonDropdown.md +9 -1
- package/bundle/components/ButtonDropdownExtended.md +422 -0
- package/bundle/components/ButtonIcon.md +7 -1
- package/bundle/components/Caption.md +291 -0
- package/bundle/components/CodeText.md +197 -0
- package/bundle/components/Col.md +311 -162
- package/bundle/components/CollapsibleTree.md +6 -3
- package/bundle/components/CollapsibleTreeExtended.md +6 -2
- package/bundle/components/Dropdown.md +748 -346
- package/bundle/components/LightBox.md +2252 -233
- package/bundle/components/List.md +26 -1
- package/bundle/components/ListActionItem.md +157 -0
- package/bundle/components/ListItem.md +34 -9
- package/bundle/components/ListItemSelectable.md +2 -2
- package/bundle/components/ListMaster.md +4 -5
- package/bundle/components/ListTableItem.md +391 -0
- package/bundle/components/Notification.md +21 -21
- package/bundle/components/Page.md +1 -0
- package/bundle/components/Portal.md +131 -67
- package/bundle/components/Row.md +171 -69
- package/bundle/components/Text.md +320 -0
- package/bundle/components/TextField.md +364 -97
- package/bundle/components/Title.md +296 -0
- package/bundle/guides/commits.md +118 -24
- package/bundle/guides/context.md +1 -1
- package/bundle/guides/tests.md +42 -0
- package/bundle/manifest.json +89 -14
- package/bundle/release-notes/1.37.0.mdx +42 -1
- package/bundle/release-notes/1.38.0.mdx +36 -0
- package/bundle/release-notes/1.39.0.mdx +66 -0
- package/bundle/release-notes/1.40.0.mdx +27 -0
- package/bundle/release-notes/1.41.0.mdx +7 -0
- package/package.json +1 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: Caption
|
|
3
|
+
category: Typography
|
|
4
|
+
related: [Text, Title, CodeText]
|
|
5
|
+
tokens:
|
|
6
|
+
- --triplex-next-Typography-Primary_Color
|
|
7
|
+
- --triplex-next-Typography-PrimaryInvert_Color
|
|
8
|
+
- --triplex-next-Typography-Complementary_Color
|
|
9
|
+
- --triplex-next-Typography-ComplementaryInvert_Color
|
|
10
|
+
- --triplex-next-Typography-Secondary_Color
|
|
11
|
+
- --triplex-next-Typography-SecondaryInvert_Color
|
|
12
|
+
- --triplex-next-Typography-Tertiary_Color
|
|
13
|
+
- --triplex-next-Typography-TertiaryInvert_Color
|
|
14
|
+
- --triplex-next-Typography-Disabled_Color
|
|
15
|
+
- --triplex-next-Typography-DisabledInvert_Color
|
|
16
|
+
- --triplex-next-Typography-Brand_Color
|
|
17
|
+
- --triplex-next-Typography-BrandInvert_Color
|
|
18
|
+
- --triplex-next-Typography-Info_Color
|
|
19
|
+
- --triplex-next-Typography-InfoInvert_Color
|
|
20
|
+
- --triplex-next-Typography-Success_Color
|
|
21
|
+
- --triplex-next-Typography-SuccessInvert_Color
|
|
22
|
+
- --triplex-next-Typography-Warning_Color
|
|
23
|
+
- --triplex-next-Typography-WarningInvert_Color
|
|
24
|
+
- --triplex-next-Typography-Error_Color
|
|
25
|
+
- --triplex-next-Typography-ErrorInvert_Color
|
|
26
|
+
- --triplex-next-Typography-System_Color
|
|
27
|
+
- --triplex-next-Typography-SystemInvert_Color
|
|
28
|
+
stories: stories/Typography/Caption.stories.tsx
|
|
29
|
+
version: "1.0"
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Caption
|
|
33
|
+
|
|
34
|
+
## Назначение
|
|
35
|
+
|
|
36
|
+
Подпись (типографика). Рендерит инлайновый `<span>` (тег настраивается через `tag`) для крайних значений типографической шкалы: очень мелкие подписи `C1` (10px) и `C2` (8px) либо крупный акцентный показатель `D1` (32px, шрифт SBSansDisplay).
|
|
37
|
+
|
|
38
|
+
Используй когда: нужна сверхмелкая техническая подпись (сноска, копирайт, метка) или крупная цифра/показатель, не являющаяся заголовком (сумма на дашборде, KPI).
|
|
39
|
+
|
|
40
|
+
Не используй когда:
|
|
41
|
+
- Нужен обычный текст 12–18px — используй `Text` (B1–B4).
|
|
42
|
+
- Крупный текст является заголовком секции — используй `Title` (семантические `h1`–`h3`).
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Варианты и props
|
|
47
|
+
|
|
48
|
+
### Обязательные props
|
|
49
|
+
|
|
50
|
+
| Prop | Тип | Описание |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `size` | `ECaptionSize` | Размер: `C1` (10/12px), `C2` (8/10px), `D1` (32/40px). В скобках — font-size/line-height. |
|
|
53
|
+
|
|
54
|
+
### Опциональные props
|
|
55
|
+
|
|
56
|
+
| Prop | Тип | По умолчанию | Описание |
|
|
57
|
+
|---|---|---|---|
|
|
58
|
+
| `weight` | `EFontWeightCaption` | `REGULAR` | Начертание: `REGULAR` или `SEMIBOLD` (600). Для `C1`/`C2` — семейство SBSansText*, для `D1` — SBSansDisplay*. |
|
|
59
|
+
| `type` | `EFontType` | `PRIMARY` | Цвет текста из общей палитры типографики (11 базовых + 11 `*_INVERT`). |
|
|
60
|
+
| `underline` | `boolean` | — | Подчёркивание. Совместим со `strikethrough` (оба сразу — `underline line-through`). |
|
|
61
|
+
| `strikethrough` | `boolean` | — | Зачёркивание. |
|
|
62
|
+
| `tag` | `string` | `"span"` | HTML-тег корневого элемента. |
|
|
63
|
+
|
|
64
|
+
Компонент типизирован как `TCaptionProps<T extends keyof JSX.IntrinsicElements>` и принимает все атрибуты соответствующего HTML-элемента через spread.
|
|
65
|
+
|
|
66
|
+
### Ограничения
|
|
67
|
+
|
|
68
|
+
- Внешний тип `forwardRef<HTMLElement, TCaptionProps<keyof JSX.IntrinsicElements>>` «растворяет» дженерик: TypeScript не сужает атрибуты под конкретный `tag`. Известное ограничение публичного API, не исправлять без обсуждения (breaking).
|
|
69
|
+
- `EFontWeightCaption` дублирует значения `EFontWeightText` — это два независимых публичных enum, объединять нельзя (breaking).
|
|
70
|
+
- `EFontType.BRAND` дополнительно задаёт `user-select: none` (особенность стилей `Typography.module.less`).
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Дизайн-токены
|
|
75
|
+
|
|
76
|
+
Цвета — общие CSS-переменные семейства Typography (см. frontmatter): `--triplex-next-Typography-{Type}_Color` и `--triplex-next-Typography-{Type}Invert_Color`.
|
|
77
|
+
|
|
78
|
+
Размеры шрифта и line-height — фиксированные пиксельные значения в `styles/Caption.module.less` (токенов для них нет).
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Инварианты
|
|
83
|
+
|
|
84
|
+
- **`forwardRef`** — обязателен, `ref` пробрасывается на корневой элемент.
|
|
85
|
+
- **Значения enum** `ECaptionSize`, `EFontWeightCaption`, `EFontType` — публичный API из barrel. Изменение — breaking change.
|
|
86
|
+
- **`TCaptionProps`**, **`ITypographyProps`** — публичные типы.
|
|
87
|
+
- **`displayName = "Caption"`** — не убирать.
|
|
88
|
+
- `D1` переключает семейство шрифта на SBSansDisplay* — контракт стилей: крупный показатель визуально согласован с заголовками.
|
|
89
|
+
- Классы собираются только через `clsx`.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Accessibility
|
|
94
|
+
|
|
95
|
+
- Компонент не интерактивный: focus management и keyboard navigation не применимы.
|
|
96
|
+
- Семантика определяется через `tag` (по умолчанию нейтральный `<span>`).
|
|
97
|
+
- Размеры `C1`/`C2` (10/8px) ниже комфортного порога читаемости — используй только для второстепенной информации, не для основного контента.
|
|
98
|
+
- Цвет (`type`) не передаёт семантику для screen reader'ов.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Связанные компоненты
|
|
103
|
+
|
|
104
|
+
- `Text` — основной текст интерфейса (B1–B4).
|
|
105
|
+
- `Title` — заголовки `h1`–`h3`.
|
|
106
|
+
- `CodeText` — моноширинный текст.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Stories
|
|
111
|
+
|
|
112
|
+
Основные истории: `stories/Typography/Caption.stories.tsx`
|
|
113
|
+
Файлы примеров: `stories/Typography/examples/Caption/`
|
|
114
|
+
|
|
115
|
+
| Story | Example file | Что демонстрирует |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `Playground` | `Playground.tsx` | Интерактивный контроль props `size`, `weight`, `type`, `tag`, `underline`, `strikethrough` |
|
|
118
|
+
| `Default` | `Default.tsx` | Минимальное использование |
|
|
119
|
+
| `Sizes` | `Sizes.tsx` | Размеры C1 / C2 / D1 |
|
|
120
|
+
| `Weights` | `Weights.tsx` | Начертания REGULAR / SEMIBOLD |
|
|
121
|
+
| `Types` | `Types.tsx` | Все значения `EFontType`: базовые + инвертированные на тёмной подложке |
|
|
122
|
+
| `Decorations` | `Decorations.tsx` | `underline`, `strikethrough` и их комбинация |
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## История изменений
|
|
127
|
+
|
|
128
|
+
| Дата | Изменение |
|
|
129
|
+
|---|---|
|
|
130
|
+
| 2026-07-20 | Создан документ. AI-рефакторинг: decoration-логика вынесена во внутренний хелпер `getTextDecorationClassName` (`utils.ts`), комментарии переведены в JSDoc, unit-тесты расширены (все значения `ECaptionSize`/`EFontWeightCaption`, дефолты). Stories переведены на modern pattern (`examples/Caption/`). |
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Примеры использования
|
|
135
|
+
|
|
136
|
+
### Default
|
|
137
|
+
|
|
138
|
+
`stories/Typography/examples/Caption/Default.tsx`
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
import React from "react";
|
|
142
|
+
import { Caption, ECaptionSize } from "@sberbusiness/triplex-next";
|
|
143
|
+
|
|
144
|
+
export const Default = () => <Caption size={ECaptionSize.C1}>Вспомогательная подпись</Caption>;
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Sizes
|
|
148
|
+
|
|
149
|
+
`stories/Typography/examples/Caption/Sizes.tsx`
|
|
150
|
+
|
|
151
|
+
```tsx
|
|
152
|
+
import React from "react";
|
|
153
|
+
import { Caption, ECaptionSize } from "@sberbusiness/triplex-next";
|
|
154
|
+
|
|
155
|
+
export const Sizes = () => (
|
|
156
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
157
|
+
<Caption size={ECaptionSize.C1}>C1 - Подпись малого размера (10px)</Caption>
|
|
158
|
+
<Caption size={ECaptionSize.C2}>C2 - Подпись очень малого размера (8px)</Caption>
|
|
159
|
+
<Caption size={ECaptionSize.D1}>D1 - Подпись большого размера (32px)</Caption>
|
|
160
|
+
</div>
|
|
161
|
+
);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Weights
|
|
165
|
+
|
|
166
|
+
`stories/Typography/examples/Caption/Weights.tsx`
|
|
167
|
+
|
|
168
|
+
```tsx
|
|
169
|
+
import React from "react";
|
|
170
|
+
import { Caption, ECaptionSize, EFontWeightCaption } from "@sberbusiness/triplex-next";
|
|
171
|
+
|
|
172
|
+
export const Weights = () => (
|
|
173
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
174
|
+
<Caption size={ECaptionSize.C1} weight={EFontWeightCaption.REGULAR}>
|
|
175
|
+
Regular - Обычный вес подписи
|
|
176
|
+
</Caption>
|
|
177
|
+
<Caption size={ECaptionSize.C1} weight={EFontWeightCaption.SEMIBOLD}>
|
|
178
|
+
Semibold - Полужирная подпись
|
|
179
|
+
</Caption>
|
|
180
|
+
</div>
|
|
181
|
+
);
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Types
|
|
185
|
+
|
|
186
|
+
`stories/Typography/examples/Caption/Types.tsx`
|
|
187
|
+
|
|
188
|
+
```tsx
|
|
189
|
+
import React from "react";
|
|
190
|
+
import { Caption, ECaptionSize, EFontType } from "@sberbusiness/triplex-next";
|
|
191
|
+
|
|
192
|
+
export const Types = () => (
|
|
193
|
+
<div style={{ display: "flex", gap: "16px" }}>
|
|
194
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
195
|
+
<Caption size={ECaptionSize.C1} type={EFontType.PRIMARY}>
|
|
196
|
+
Primary
|
|
197
|
+
</Caption>
|
|
198
|
+
<Caption size={ECaptionSize.C1} type={EFontType.COMPLEMENTARY}>
|
|
199
|
+
Complementary
|
|
200
|
+
</Caption>
|
|
201
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SECONDARY}>
|
|
202
|
+
Secondary
|
|
203
|
+
</Caption>
|
|
204
|
+
<Caption size={ECaptionSize.C1} type={EFontType.TERTIARY}>
|
|
205
|
+
Tertiary
|
|
206
|
+
</Caption>
|
|
207
|
+
<Caption size={ECaptionSize.C1} type={EFontType.BRAND}>
|
|
208
|
+
Brand
|
|
209
|
+
</Caption>
|
|
210
|
+
<Caption size={ECaptionSize.C1} type={EFontType.INFO}>
|
|
211
|
+
Info
|
|
212
|
+
</Caption>
|
|
213
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SUCCESS}>
|
|
214
|
+
Success
|
|
215
|
+
</Caption>
|
|
216
|
+
<Caption size={ECaptionSize.C1} type={EFontType.WARNING}>
|
|
217
|
+
Warning
|
|
218
|
+
</Caption>
|
|
219
|
+
<Caption size={ECaptionSize.C1} type={EFontType.ERROR}>
|
|
220
|
+
Error
|
|
221
|
+
</Caption>
|
|
222
|
+
<Caption size={ECaptionSize.C1} type={EFontType.DISABLED}>
|
|
223
|
+
Disabled
|
|
224
|
+
</Caption>
|
|
225
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SYSTEM}>
|
|
226
|
+
System
|
|
227
|
+
</Caption>
|
|
228
|
+
</div>
|
|
229
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", backgroundColor: "#1F1F22" }}>
|
|
230
|
+
<Caption size={ECaptionSize.C1} type={EFontType.PRIMARY_INVERT}>
|
|
231
|
+
Primary Invert
|
|
232
|
+
</Caption>
|
|
233
|
+
<Caption size={ECaptionSize.C1} type={EFontType.COMPLEMENTARY_INVERT}>
|
|
234
|
+
Complementary Invert
|
|
235
|
+
</Caption>
|
|
236
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SECONDARY_INVERT}>
|
|
237
|
+
Secondary Invert
|
|
238
|
+
</Caption>
|
|
239
|
+
<Caption size={ECaptionSize.C1} type={EFontType.TERTIARY_INVERT}>
|
|
240
|
+
Tertiary Invert
|
|
241
|
+
</Caption>
|
|
242
|
+
<Caption size={ECaptionSize.C1} type={EFontType.BRAND_INVERT}>
|
|
243
|
+
Brand Invert
|
|
244
|
+
</Caption>
|
|
245
|
+
<Caption size={ECaptionSize.C1} type={EFontType.INFO_INVERT}>
|
|
246
|
+
Info Invert
|
|
247
|
+
</Caption>
|
|
248
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SUCCESS_INVERT}>
|
|
249
|
+
Success Invert
|
|
250
|
+
</Caption>
|
|
251
|
+
<Caption size={ECaptionSize.C1} type={EFontType.WARNING_INVERT}>
|
|
252
|
+
Warning Invert
|
|
253
|
+
</Caption>
|
|
254
|
+
<Caption size={ECaptionSize.C1} type={EFontType.ERROR_INVERT}>
|
|
255
|
+
Error Invert
|
|
256
|
+
</Caption>
|
|
257
|
+
<Caption size={ECaptionSize.C1} type={EFontType.DISABLED_INVERT}>
|
|
258
|
+
Disabled Invert
|
|
259
|
+
</Caption>
|
|
260
|
+
<Caption size={ECaptionSize.C1} type={EFontType.SYSTEM_INVERT}>
|
|
261
|
+
System Invert
|
|
262
|
+
</Caption>
|
|
263
|
+
</div>
|
|
264
|
+
</div>
|
|
265
|
+
);
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Decorations
|
|
269
|
+
|
|
270
|
+
`stories/Typography/examples/Caption/Decorations.tsx`
|
|
271
|
+
|
|
272
|
+
```tsx
|
|
273
|
+
import React from "react";
|
|
274
|
+
import { Caption, ECaptionSize } from "@sberbusiness/triplex-next";
|
|
275
|
+
|
|
276
|
+
export const Decorations = () => (
|
|
277
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
278
|
+
<Caption size={ECaptionSize.C1}>Подпись без декораций</Caption>
|
|
279
|
+
<Caption size={ECaptionSize.C1} underline>
|
|
280
|
+
Подпись с подчеркиванием
|
|
281
|
+
</Caption>
|
|
282
|
+
<Caption size={ECaptionSize.C1} strikethrough>
|
|
283
|
+
Подпись с зачеркиванием
|
|
284
|
+
</Caption>
|
|
285
|
+
<Caption size={ECaptionSize.C1} underline strikethrough>
|
|
286
|
+
Подпись с подчеркиванием и зачеркиванием
|
|
287
|
+
</Caption>
|
|
288
|
+
</div>
|
|
289
|
+
);
|
|
290
|
+
```
|
|
291
|
+
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: CodeText
|
|
3
|
+
category: Typography
|
|
4
|
+
related: [Text, Title, Caption]
|
|
5
|
+
tokens:
|
|
6
|
+
- --triplex-next-Typography-Primary_Color
|
|
7
|
+
- --triplex-next-Typography-PrimaryInvert_Color
|
|
8
|
+
- --triplex-next-Typography-Complementary_Color
|
|
9
|
+
- --triplex-next-Typography-ComplementaryInvert_Color
|
|
10
|
+
- --triplex-next-Typography-Secondary_Color
|
|
11
|
+
- --triplex-next-Typography-SecondaryInvert_Color
|
|
12
|
+
- --triplex-next-Typography-Tertiary_Color
|
|
13
|
+
- --triplex-next-Typography-TertiaryInvert_Color
|
|
14
|
+
- --triplex-next-Typography-Disabled_Color
|
|
15
|
+
- --triplex-next-Typography-DisabledInvert_Color
|
|
16
|
+
- --triplex-next-Typography-Brand_Color
|
|
17
|
+
- --triplex-next-Typography-BrandInvert_Color
|
|
18
|
+
- --triplex-next-Typography-Info_Color
|
|
19
|
+
- --triplex-next-Typography-InfoInvert_Color
|
|
20
|
+
- --triplex-next-Typography-Success_Color
|
|
21
|
+
- --triplex-next-Typography-SuccessInvert_Color
|
|
22
|
+
- --triplex-next-Typography-Warning_Color
|
|
23
|
+
- --triplex-next-Typography-WarningInvert_Color
|
|
24
|
+
- --triplex-next-Typography-Error_Color
|
|
25
|
+
- --triplex-next-Typography-ErrorInvert_Color
|
|
26
|
+
- --triplex-next-Typography-System_Color
|
|
27
|
+
- --triplex-next-Typography-SystemInvert_Color
|
|
28
|
+
stories: stories/Typography/CodeText.stories.tsx
|
|
29
|
+
version: "1.0"
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# CodeText
|
|
33
|
+
|
|
34
|
+
## Назначение
|
|
35
|
+
|
|
36
|
+
Моноширинный текст (типографика). Рендерит инлайновый `<span>` (тег настраивается через `tag`) со шрифтом SBSansTextMono и фиксированной типографикой 14/20px (font-weight 400). Размер и начертание не настраиваются — в отличие от остальных компонентов семейства.
|
|
37
|
+
|
|
38
|
+
Используй когда: нужно выровнять символы по ширине — фрагменты кода, номера счетов/договоров, ИНН/БИК, суммы в таблицах, технические идентификаторы.
|
|
39
|
+
|
|
40
|
+
Не используй когда:
|
|
41
|
+
- Нужен обычный пропорциональный текст — используй `Text`.
|
|
42
|
+
- Нужен другой размер моноширинного текста — в семействе его нет; не задавай `font-size` через `style`/`className`, обсуди расширение API с командой.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Варианты и props
|
|
47
|
+
|
|
48
|
+
Собственных обязательных props нет. Компонент принимает только общие props типографики (`ITypographyProps`).
|
|
49
|
+
|
|
50
|
+
### Опциональные props
|
|
51
|
+
|
|
52
|
+
| Prop | Тип | По умолчанию | Описание |
|
|
53
|
+
|---|---|---|---|
|
|
54
|
+
| `type` | `EFontType` | `PRIMARY` | Цвет текста из общей палитры типографики (11 базовых + 11 `*_INVERT`). |
|
|
55
|
+
| `underline` | `boolean` | — | Подчёркивание. Совместим со `strikethrough` (оба сразу — `underline line-through`). |
|
|
56
|
+
| `strikethrough` | `boolean` | — | Зачёркивание. |
|
|
57
|
+
| `tag` | `string` | `"span"` | HTML-тег корневого элемента (например, `code` для семантики фрагмента кода). |
|
|
58
|
+
|
|
59
|
+
Компонент типизирован как `TCodeTextProps<T extends keyof JSX.IntrinsicElements>` и принимает все атрибуты соответствующего HTML-элемента через spread.
|
|
60
|
+
|
|
61
|
+
### Ограничения
|
|
62
|
+
|
|
63
|
+
- Props `size`, `weight`, `line` отсутствуют намеренно: типографика фиксирована (SBSansTextMono, 14/20px, 400).
|
|
64
|
+
- Внешний тип `forwardRef<HTMLElement, TCodeTextProps<keyof JSX.IntrinsicElements>>` «растворяет» дженерик: TypeScript не сужает атрибуты под конкретный `tag`. Известное ограничение публичного API, не исправлять без обсуждения (breaking).
|
|
65
|
+
- `EFontType.BRAND` дополнительно задаёт `user-select: none` (особенность стилей `Typography.module.less`).
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Дизайн-токены
|
|
70
|
+
|
|
71
|
+
Цвета — общие CSS-переменные семейства Typography (см. frontmatter): `--triplex-next-Typography-{Type}_Color` и `--triplex-next-Typography-{Type}Invert_Color`.
|
|
72
|
+
|
|
73
|
+
Шрифт и размер — фиксированные значения в `styles/CodeText.module.less` (токенов для них нет).
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Инварианты
|
|
78
|
+
|
|
79
|
+
- **`forwardRef`** — обязателен, `ref` пробрасывается на корневой элемент.
|
|
80
|
+
- **`TCodeTextProps`**, **`ITypographyProps`**, значения **`EFontType`** — публичный API из barrel. Изменение — breaking change.
|
|
81
|
+
- **`displayName = "CodeText"`** — не убирать.
|
|
82
|
+
- Фиксированная типографика (SBSansTextMono, 14/20px) — контракт компонента; добавление `size`/`weight` — расширение публичного API, требует обсуждения.
|
|
83
|
+
- Классы собираются только через `clsx`.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Accessibility
|
|
88
|
+
|
|
89
|
+
- Компонент не интерактивный: focus management и keyboard navigation не применимы.
|
|
90
|
+
- По умолчанию рендерится нейтральный `<span>`; для семантики фрагмента кода передай `tag="code"`.
|
|
91
|
+
- Цвет (`type`) не передаёт семантику для screen reader'ов.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Связанные компоненты
|
|
96
|
+
|
|
97
|
+
- `Text` — основной пропорциональный текст интерфейса (B1–B4).
|
|
98
|
+
- `Title` — заголовки `h1`–`h3`.
|
|
99
|
+
- `Caption` — мелкие подписи и крупный показатель D1.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Stories
|
|
104
|
+
|
|
105
|
+
Основные истории: `stories/Typography/CodeText.stories.tsx`
|
|
106
|
+
Файлы примеров: `stories/Typography/examples/CodeText/`
|
|
107
|
+
|
|
108
|
+
| Story | Example file | Что демонстрирует |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| `Playground` | `Playground.tsx` | Интерактивный контроль props `type`, `tag`, `underline`, `strikethrough` |
|
|
111
|
+
| `Default` | `Default.tsx` | Минимальное использование |
|
|
112
|
+
| `Types` | `Types.tsx` | Все значения `EFontType`: базовые + инвертированные на тёмной подложке |
|
|
113
|
+
| `Decorations` | `Decorations.tsx` | `underline`, `strikethrough` и их комбинация |
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## История изменений
|
|
118
|
+
|
|
119
|
+
| Дата | Изменение |
|
|
120
|
+
|---|---|
|
|
121
|
+
| 2026-07-20 | Создан документ. AI-рефакторинг: decoration-логика вынесена во внутренний хелпер `getTextDecorationClassName` (`utils.ts`), unit-тесты дополнены (дефолтный `type`, класс `brand`). Stories переведены на modern pattern (`examples/CodeText/`). |
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Примеры использования
|
|
126
|
+
|
|
127
|
+
### Default
|
|
128
|
+
|
|
129
|
+
`stories/Typography/examples/CodeText/Default.tsx`
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
import React from "react";
|
|
133
|
+
import { CodeText } from "@sberbusiness/triplex-next";
|
|
134
|
+
|
|
135
|
+
export const Default = () => <CodeText>const greeting = "Hello, World!";</CodeText>;
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Types
|
|
139
|
+
|
|
140
|
+
`stories/Typography/examples/CodeText/Types.tsx`
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
import React from "react";
|
|
144
|
+
import { CodeText, EFontType } from "@sberbusiness/triplex-next";
|
|
145
|
+
|
|
146
|
+
export const Types = () => (
|
|
147
|
+
<div style={{ display: "flex", gap: "16px" }}>
|
|
148
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
149
|
+
<CodeText type={EFontType.PRIMARY}>Primary</CodeText>
|
|
150
|
+
<CodeText type={EFontType.COMPLEMENTARY}>Complementary</CodeText>
|
|
151
|
+
<CodeText type={EFontType.SECONDARY}>Secondary</CodeText>
|
|
152
|
+
<CodeText type={EFontType.TERTIARY}>Tertiary</CodeText>
|
|
153
|
+
<CodeText type={EFontType.BRAND}>Brand</CodeText>
|
|
154
|
+
<CodeText type={EFontType.INFO}>Info</CodeText>
|
|
155
|
+
<CodeText type={EFontType.SUCCESS}>Success</CodeText>
|
|
156
|
+
<CodeText type={EFontType.WARNING}>Warning</CodeText>
|
|
157
|
+
<CodeText type={EFontType.ERROR}>Error</CodeText>
|
|
158
|
+
<CodeText type={EFontType.DISABLED}>Disabled</CodeText>
|
|
159
|
+
<CodeText type={EFontType.SYSTEM}>System</CodeText>
|
|
160
|
+
</div>
|
|
161
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", backgroundColor: "#1F1F22" }}>
|
|
162
|
+
<CodeText type={EFontType.PRIMARY_INVERT}>Primary Invert</CodeText>
|
|
163
|
+
<CodeText type={EFontType.COMPLEMENTARY_INVERT}>Complementary Invert</CodeText>
|
|
164
|
+
<CodeText type={EFontType.SECONDARY_INVERT}>Secondary Invert</CodeText>
|
|
165
|
+
<CodeText type={EFontType.TERTIARY_INVERT}>Tertiary Invert</CodeText>
|
|
166
|
+
<CodeText type={EFontType.BRAND_INVERT}>Brand Invert</CodeText>
|
|
167
|
+
<CodeText type={EFontType.INFO_INVERT}>Info Invert</CodeText>
|
|
168
|
+
<CodeText type={EFontType.SUCCESS_INVERT}>Success Invert</CodeText>
|
|
169
|
+
<CodeText type={EFontType.WARNING_INVERT}>Warning Invert</CodeText>
|
|
170
|
+
<CodeText type={EFontType.ERROR_INVERT}>Error Invert</CodeText>
|
|
171
|
+
<CodeText type={EFontType.DISABLED_INVERT}>Disabled Invert</CodeText>
|
|
172
|
+
<CodeText type={EFontType.SYSTEM_INVERT}>System Invert</CodeText>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
);
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Decorations
|
|
179
|
+
|
|
180
|
+
`stories/Typography/examples/CodeText/Decorations.tsx`
|
|
181
|
+
|
|
182
|
+
```tsx
|
|
183
|
+
import React from "react";
|
|
184
|
+
import { CodeText } from "@sberbusiness/triplex-next";
|
|
185
|
+
|
|
186
|
+
export const Decorations = () => (
|
|
187
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
188
|
+
<CodeText>const x = 42;</CodeText>
|
|
189
|
+
<CodeText underline>const x = 42; // с подчеркиванием</CodeText>
|
|
190
|
+
<CodeText strikethrough>const x = 42; // с зачеркиванием</CodeText>
|
|
191
|
+
<CodeText underline strikethrough>
|
|
192
|
+
const x = 42; // с подчеркиванием и зачеркиванием
|
|
193
|
+
</CodeText>
|
|
194
|
+
</div>
|
|
195
|
+
);
|
|
196
|
+
```
|
|
197
|
+
|