@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,385 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: DesignTokens
|
|
3
|
+
category: Infrastructure
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [ThemeProvider, All components]
|
|
7
|
+
tokens: []
|
|
8
|
+
stories: stories/DesignTokens/DesignTokens.stories.tsx
|
|
9
|
+
version: "1.0"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# DesignTokens
|
|
13
|
+
|
|
14
|
+
## Назначение
|
|
15
|
+
|
|
16
|
+
Это **не визуальный компонент**, а инфраструктурный модуль: единственный
|
|
17
|
+
источник истины для **дизайн-токенов** библиотеки. Определяет:
|
|
18
|
+
|
|
19
|
+
1. **Core-токены** — общая палитра (ColorBrand, ColorNeutral, ColorError,
|
|
20
|
+
ColorInfo, ColorSuccess, ColorSystem, ColorWarning, ColorDarkNeutral,
|
|
21
|
+
ColorNeutralAlpha, ColorDarkNeutralAlpha).
|
|
22
|
+
2. **Component-токены** — специфические токены на каждый компонент
|
|
23
|
+
(Button, Chip, Calendar, Card, Checkbox, FormField, Island, …).
|
|
24
|
+
3. **Тёмная тема** — параллельные объекты `*ThemeDark` с теми же
|
|
25
|
+
ключами, но другими значениями.
|
|
26
|
+
4. **Утилиты** — `DesignTokenUtils` (`getStyle`, `getCSSVariableByTokenGroup`,
|
|
27
|
+
`getTokenValue`, `getComponentTokens`, `getStyleByTokens`) для сборки
|
|
28
|
+
CSS-переменных и разрешения ref'ов.
|
|
29
|
+
|
|
30
|
+
`ThemeProvider` использует этот модуль, чтобы вставить `<style>` с
|
|
31
|
+
CSS-переменными (по текущей теме) в DOM. Компоненты читают переменные
|
|
32
|
+
через `var(--triplex-next-{group}-{token}-{version})`.
|
|
33
|
+
|
|
34
|
+
Используй когда: нужно расширить / кастомизировать токены; узнать
|
|
35
|
+
точный список токенов какого-то компонента; понять разрешение ref'а
|
|
36
|
+
(`{ref: "ColorBrand.60"}` → финальное значение).
|
|
37
|
+
Не используй как: обычный React-компонент — это TS-объекты и утилиты,
|
|
38
|
+
не JSX.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Файловая структура
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
src/components/DesignTokens/
|
|
46
|
+
├── DesignTokensCore.ts # Light-тема core-токенов (общая палитра)
|
|
47
|
+
├── DesignTokensCoreThemeDark.ts # Dark-тема core-токенов
|
|
48
|
+
├── DesignTokensComponents.ts # Light-тема component-токенов (сбор всех компонентов)
|
|
49
|
+
├── DesignTokensComponentsThemeDark.ts # Dark-тема component-токенов
|
|
50
|
+
├── DesignTokenUtils.ts # Утилиты: getStyle, getTokenValue, getCSSVariableByTokenGroup…
|
|
51
|
+
├── GetTokensValueByTheme.ts # Хелпер: выбор { value | ref } по теме из [light, dark]
|
|
52
|
+
├── index.ts # Barrel: 4 объекта токенов
|
|
53
|
+
├── components/ # По файлу на компонент: keys + types + base-токены
|
|
54
|
+
│ ├── Button.ts, Chip.ts, Calendar.ts,
|
|
55
|
+
│ └── … (~54 файла, по одному на компонент)
|
|
56
|
+
├── types/
|
|
57
|
+
│ ├── DesignTokenTypes.ts # IDesignTokenValueString, IDesignTokenValueRef, TDesignTokenValues
|
|
58
|
+
│ └── DesignTokensTypes.ts # TDesignTokensCore, TDesignTokensComponents, TDesignTokens*
|
|
59
|
+
└── __tests__/
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Особенности:
|
|
63
|
+
- **`__tests__` есть** — проверяют, что токены разрешаются корректно
|
|
64
|
+
и что тёмная тема покрывает все ключи светлой.
|
|
65
|
+
- **~54 файла в `components/`** — по файлу на компонент. Каждый
|
|
66
|
+
определяет `designTokensComponents{Name}Keys` (as const) + типы +
|
|
67
|
+
базовые значения.
|
|
68
|
+
- **Публичный API через `index.ts`**: 4 объекта — `DesignTokensCore`,
|
|
69
|
+
`DesignTokensCoreThemeDark`, `DesignTokensComponents`,
|
|
70
|
+
`DesignTokensComponentsThemeDark`. Утилиты импортируются отдельно.
|
|
71
|
+
- **Генерация типов**: `src/generated/refTokenTypes.ts` содержит
|
|
72
|
+
`designTokensRefs` — union всех валидных путей ref'а (авто-генерация).
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Core API
|
|
77
|
+
|
|
78
|
+
### `TDesignTokenValue`
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
interface IDesignTokenValueString {
|
|
82
|
+
ref?: undefined;
|
|
83
|
+
value: string; // "#fff", "16px", "rgba(...)"
|
|
84
|
+
}
|
|
85
|
+
interface IDesignTokenValueRef {
|
|
86
|
+
value?: undefined;
|
|
87
|
+
ref: (typeof designTokensRefs)[number]; // "ColorBrand.60" и т. п.
|
|
88
|
+
}
|
|
89
|
+
type TDesignTokenValue = IDesignTokenValueString | IDesignTokenValueRef;
|
|
90
|
+
type TDesignTokenValues = [TDesignTokenValue, TDesignTokenValue]; // [light, dark]
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Инвариант типа:** либо `value` либо `ref`, не оба. Это через
|
|
94
|
+
`?: undefined` гарантировано на уровне типа (дискриминированный union).
|
|
95
|
+
|
|
96
|
+
### Core-группы (`DesignTokensCore`)
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
TDesignTokensCore = ColorBrand &
|
|
100
|
+
ColorDarkNeutralAlpha & ColorDarkNeutral &
|
|
101
|
+
ColorError & ColorInfo &
|
|
102
|
+
ColorNeutralAlpha & ColorNeutral &
|
|
103
|
+
ColorSuccess & ColorSystem & ColorWarning;
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Keys** у каждой группы — `"0" | "10" | ... | "100"` (шаг 10),
|
|
107
|
+
у `ColorBrand` и `ColorSystem` дополнительно `"95"`. Это палитра
|
|
108
|
+
оттенков — 0 = чёрный конец, 100 = светлый конец.
|
|
109
|
+
|
|
110
|
+
**Пример:**
|
|
111
|
+
```ts
|
|
112
|
+
ColorBrand: {
|
|
113
|
+
60: { value: "#19BDB0" }, // "основной" брендовый
|
|
114
|
+
50: { value: "#21A19A" },
|
|
115
|
+
...
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Core-токены **всегда `{value: "..."}`**, не `ref`. Ref используется
|
|
120
|
+
только в component-токенах, которые ссылаются на core.
|
|
121
|
+
|
|
122
|
+
### Component-токены
|
|
123
|
+
|
|
124
|
+
Каждый компонент в `components/*.ts`:
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
export const designTokensComponentsButtonKeys = [
|
|
128
|
+
"General_Background_Active",
|
|
129
|
+
"General_Background_Default",
|
|
130
|
+
"General_Background_Disabled",
|
|
131
|
+
"General_Background_Hover",
|
|
132
|
+
"General_Color_Active",
|
|
133
|
+
"General_Color_Default",
|
|
134
|
+
...
|
|
135
|
+
] as const;
|
|
136
|
+
|
|
137
|
+
export type TDesignTokensComponentsButtonKeys = (typeof designTokensComponentsButtonKeys)[number];
|
|
138
|
+
export type TDesignTokensComponentsButtonValue = Record<TDesignTokensComponentsButtonKeys, TDesignTokenValue>;
|
|
139
|
+
export type TDesignTokensComponentsButtonValues = Record<TDesignTokensComponentsButtonKeys, TDesignTokenValues>;
|
|
140
|
+
export type TDesignTokensComponentsButton = { Button: TDesignTokensComponentsButtonValue };
|
|
141
|
+
|
|
142
|
+
// Базовые токены (раскрываются через GetTokensValueByTheme):
|
|
143
|
+
export const Button_Tokens: TDesignTokensComponentsButtonValues = {
|
|
144
|
+
General_Background_Default: [
|
|
145
|
+
{ ref: "ColorBrand.60" }, // light
|
|
146
|
+
{ ref: "ColorBrand.50" }, // dark
|
|
147
|
+
],
|
|
148
|
+
...
|
|
149
|
+
};
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Naming convention для токенов компонента
|
|
153
|
+
|
|
154
|
+
Имена токенов — **`{Variant}_{Property}_{State}`** (snake-case
|
|
155
|
+
подлиннее):
|
|
156
|
+
- `General_Background_Default`
|
|
157
|
+
- `Secondary_Color_Hover`
|
|
158
|
+
- `Danger_Shadow_Focus`
|
|
159
|
+
- `SecondaryLight_Background_Active`
|
|
160
|
+
- `Link_Color_Disabled`
|
|
161
|
+
|
|
162
|
+
Paттерн — variant (General/Primary/Secondary/Danger/Link/Icon/…),
|
|
163
|
+
свойство (Background/Color/Shadow/Border), состояние
|
|
164
|
+
(Default/Hover/Active/Focus/Disabled).
|
|
165
|
+
|
|
166
|
+
Не все компоненты имеют одну и ту же структуру — например, у Chip или
|
|
167
|
+
FormField другие variants/states, см. соответствующие `components/*.ts`.
|
|
168
|
+
|
|
169
|
+
### CSS-переменные имеют версионный суффикс
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
// DesignTokenUtils.getCSSVariableByTokenGroup:
|
|
173
|
+
let tokenVersion = process.env.npm_package_version;
|
|
174
|
+
tokenVersion = tokenVersion!.replace(/\./g, "-");
|
|
175
|
+
// → --triplex-next-Button-General_Background_Default-1-0-0: #19BDB0;
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**`process.env.npm_package_version` подставляется в CSS-переменные** и
|
|
179
|
+
**в `data-tx`** атрибуты компонентов. Позволяет держать несколько
|
|
180
|
+
версий библиотеки параллельно без конфликта переменных. **Не объединять
|
|
181
|
+
в одну строку** (`.replace` на `process.env.npm_package_version!`) —
|
|
182
|
+
rollup не заменяет в сложных выражениях, нужна отдельная строка
|
|
183
|
+
присвоения.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## `DesignTokenUtils` API
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
interface IDesignTokenUtils {
|
|
191
|
+
getCSSVariableByTokenGroup(tokenGroup, tokens): string
|
|
192
|
+
getComponentTokens(componentName): { core: string[]; components: string[] }
|
|
193
|
+
getStyle(theme, tokens): string
|
|
194
|
+
getStyleByTokens(tokens): string
|
|
195
|
+
getTokenValue(tokenValue, tokens): string
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### `getStyle(theme, tokens)` — главный entry для ThemeProvider
|
|
200
|
+
|
|
201
|
+
```ts
|
|
202
|
+
getStyle(ETriplexNextTheme.LIGHT, {}) →
|
|
203
|
+
"--triplex-next-ColorBrand-0-1-0-0: #1F3336;
|
|
204
|
+
--triplex-next-ColorBrand-10-1-0-0: #0B3A3C;
|
|
205
|
+
...
|
|
206
|
+
--triplex-next-Button-General_Background_Default-1-0-0: #19BDB0;"
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Реализация использует `defaultsDeep` из `lodash-es` для мерджа
|
|
210
|
+
переопределений потребителя с дефолтами библиотеки:
|
|
211
|
+
|
|
212
|
+
```ts
|
|
213
|
+
const nextTokens = defaultsDeep({}, tokens, DesignTokensCore, DesignTokensComponents);
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**Порядок важен:** `tokens` (переопределения) побеждают дефолты.
|
|
217
|
+
|
|
218
|
+
### `getTokenValue(tokenValue, tokens)` — разрешение ref'ов
|
|
219
|
+
|
|
220
|
+
```ts
|
|
221
|
+
{ref: "ColorBrand.60"} → "#19BDB0"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Рекурсивно: если `ref` ведёт на другой `ref`, идёт дальше. **Без
|
|
225
|
+
защиты от цикла** — если токен ссылается сам на себя или образует
|
|
226
|
+
цикл, будет бесконечная рекурсия. Инвариант:
|
|
227
|
+
`designTokensRefs` генерируется так, что циклов быть не должно.
|
|
228
|
+
|
|
229
|
+
### `GetTokensValueByTheme(theme, tokens)` — выбор [light, dark]
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
GetTokensValueByTheme(ETriplexNextTheme.DARK, {
|
|
233
|
+
Primary_Background: [{value: "white"}, {value: "black"}]
|
|
234
|
+
})
|
|
235
|
+
// → { Primary_Background: {value: "black"} }
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Преобразует `Record<Key, [light, dark]>` → `Record<Key, TDesignTokenValue>`,
|
|
239
|
+
выбирая значение по `theme`. Используется в `Button_Tokens` и т. п.
|
|
240
|
+
для компактного объявления обеих тем в одном файле.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Ключевые особенности реализации
|
|
245
|
+
|
|
246
|
+
### `process.env.npm_package_version` в CSS-переменных
|
|
247
|
+
|
|
248
|
+
Версия библиотеки встраивается в имя каждой CSS-переменной с
|
|
249
|
+
заменой `.` → `-`. Это позволяет **двум версиям библиотеки
|
|
250
|
+
сосуществовать** на одной странице (например, legacy + new). Цена —
|
|
251
|
+
все потребители `var(...)` должны использовать актуальный суффикс
|
|
252
|
+
версии.
|
|
253
|
+
|
|
254
|
+
LESS mixin'ы, использующие эти переменные, заменяют суффикс на лету
|
|
255
|
+
(через rollup-плагин). Потребители **не должны** хардкодить версию
|
|
256
|
+
в своих стилях.
|
|
257
|
+
|
|
258
|
+
### `defaultsDeep` (lodash-es) — мердж
|
|
259
|
+
|
|
260
|
+
```ts
|
|
261
|
+
defaultsDeep({}, tokens, DesignTokensCore, DesignTokensComponents)
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**`defaultsDeep` vs `merge`**: defaults НЕ переписывают уже заданные
|
|
265
|
+
ключи — они лишь **дозаполняют** отсутствующие. Поэтому порядок в
|
|
266
|
+
`defaultsDeep` — обратный от `merge` (правее = более дефолтное).
|
|
267
|
+
|
|
268
|
+
**Потребитель:** `tokens` (опциональные переопределения) — первый,
|
|
269
|
+
он "побеждает". Core и Components — последние дефолты.
|
|
270
|
+
|
|
271
|
+
### `getComponentTokens(componentName)` — возвращает список имён
|
|
272
|
+
|
|
273
|
+
```ts
|
|
274
|
+
getComponentTokens("Button") → {
|
|
275
|
+
components: ["Button.General_Background_Active", ...],
|
|
276
|
+
core: [],
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Используется в DocBlock'ах и туллингах. **Core сейчас всегда пустой**
|
|
281
|
+
(см. реализацию) — не сканирует core-токены, возвращает только
|
|
282
|
+
component-local. Если нужны core-зависимости — они выводятся из
|
|
283
|
+
`ref` в component-tokens, но этот util не разворачивает их.
|
|
284
|
+
|
|
285
|
+
### Ссылочные токены через `ref` — один уровень косвенности
|
|
286
|
+
|
|
287
|
+
```ts
|
|
288
|
+
// Button.ts:
|
|
289
|
+
General_Background_Default: [{ref: "ColorBrand.60"}, {ref: "ColorBrand.50"}]
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Переопределяя `ColorBrand.60` в темах, потребитель меняет **все**
|
|
293
|
+
компоненты, использующие этот ref. Это **главное преимущество**
|
|
294
|
+
архитектуры — центральный контроль палитры.
|
|
295
|
+
|
|
296
|
+
### `ThemeProvider` — единственный консумент
|
|
297
|
+
|
|
298
|
+
`DesignTokens` сам по себе **не подключается в DOM**. `ThemeProvider`
|
|
299
|
+
вызывает `DesignTokenUtils.getStyle(theme, userOverrides)` и вставляет
|
|
300
|
+
результат в `<style>` или использует via `:root { --... }`. Смотри
|
|
301
|
+
`ThemeProvider-AI.md` (ещё не создан).
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## Инварианты
|
|
306
|
+
|
|
307
|
+
- **`IDesignTokenValueString` и `IDesignTokenValueRef`** — discriminated
|
|
308
|
+
union, `ref?: undefined` / `value?: undefined` нужны для дискриминации.
|
|
309
|
+
Не удалять `?: undefined`.
|
|
310
|
+
- **Core-токены всегда `{value: "..."}`** — не используют `ref`. Если
|
|
311
|
+
нужно — будет циклическая ссылка.
|
|
312
|
+
- **`TDesignTokenValues = [light, dark]`** — кортеж ровно из двух
|
|
313
|
+
элементов. Третья тема потребует расширения типа.
|
|
314
|
+
- **CSS-переменные имеют суффикс `process.env.npm_package_version`** —
|
|
315
|
+
не удалять. Необходим для multi-version coexistence.
|
|
316
|
+
- **`defaultsDeep` порядок** — `tokens` первый, `Core`/`Components`
|
|
317
|
+
последние. Обратный порядок сломает override.
|
|
318
|
+
- **Naming convention `{Variant}_{Property}_{State}`** — менять только
|
|
319
|
+
с миграцией потребителей (CSS переменная — public API).
|
|
320
|
+
- **`designTokensComponents*Keys as const`** — обязателен `as const`
|
|
321
|
+
для точной типизации.
|
|
322
|
+
- **`DesignTokensComponentsThemeDark` должен покрывать те же ключи**,
|
|
323
|
+
что `DesignTokensComponents`. Тесты проверяют.
|
|
324
|
+
- **Утилиты не мутируют входные объекты** — `defaultsDeep({}, ...)`
|
|
325
|
+
с пустым первым аргументом.
|
|
326
|
+
- **`getTokenValue` не имеет cycle-detection** — структура токенов
|
|
327
|
+
должна быть ациклична.
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## Accessibility
|
|
332
|
+
|
|
333
|
+
N/A — это инфраструктура. Но именно через токены реализуется "contrast
|
|
334
|
+
themes" и tuning цветов для accessibility. Потребитель передаёт
|
|
335
|
+
переопределения в `ThemeProvider.tokens={...}`, получает новую палитру.
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## Дизайн-токены
|
|
340
|
+
|
|
341
|
+
Сам модуль **производит** все токены библиотеки. Список групп:
|
|
342
|
+
|
|
343
|
+
**Core:**
|
|
344
|
+
ColorBrand, ColorDarkNeutral, ColorDarkNeutralAlpha, ColorError,
|
|
345
|
+
ColorInfo, ColorNeutral, ColorNeutralAlpha, ColorSuccess, ColorSystem,
|
|
346
|
+
ColorWarning (по 11–12 оттенков каждая).
|
|
347
|
+
|
|
348
|
+
**Components (~54):**
|
|
349
|
+
AlertContext, AlertProcess, Avatar, Badge, Button, Calendar, Card,
|
|
350
|
+
Checkbox, Chip, Divider, Dropdown, DropdownList, DropdownMobile,
|
|
351
|
+
DropdownMobileList, FooterPage, FormField, HeaderPage, Island,
|
|
352
|
+
IslandAccordion, IslandWidget, LightBox, Link, ListItem,
|
|
353
|
+
ListItemControlsButton, ListMaster, Loader, LoaderScreen, Marker,
|
|
354
|
+
MarkerStatus, ModalWindow, MultiselectField, Notification, Overlay,
|
|
355
|
+
Pagination, Radio, SegmentedControl, SegmentedControlSegment, Skeleton,
|
|
356
|
+
Slider, SmallInput, SMSField, StatusTracker, Step, Stepper, TableBasic,
|
|
357
|
+
Tabs, TabsLine, Tag, TagColor, Tooltip, TopOverlay, Typography,
|
|
358
|
+
UploadZone.
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## Связанные компоненты
|
|
363
|
+
|
|
364
|
+
- `ThemeProvider` — единственный консумент. Ставит `<style>` с
|
|
365
|
+
`getStyle(theme, tokens)`.
|
|
366
|
+
- **Все визуальные компоненты** — используют
|
|
367
|
+
`var(--triplex-next-{group}-{token}-{version})` через LESS mixin'ы.
|
|
368
|
+
- `generated/refTokenTypes.ts` — сгенерированный union всех валидных
|
|
369
|
+
ref-путей.
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## Stories
|
|
374
|
+
|
|
375
|
+
`stories/DesignTokens/DesignTokens.stories.tsx`
|
|
376
|
+
|
|
377
|
+
Демонстрируют палитру core-токенов (визуальный шоукейс цветов).
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## История изменений
|
|
382
|
+
|
|
383
|
+
| Дата | Изменение |
|
|
384
|
+
|---|---|
|
|
385
|
+
| 2026-04-18 | Создан документ |
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: Divider
|
|
3
|
+
category: Layout
|
|
4
|
+
figma-node: ""
|
|
5
|
+
figma-file: ""
|
|
6
|
+
related: [Gap, Row, Col]
|
|
7
|
+
tokens: [Divider_Background]
|
|
8
|
+
stories: stories/Divider/Divider.stories.tsx
|
|
9
|
+
version: "1.0"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Divider
|
|
13
|
+
|
|
14
|
+
## Назначение
|
|
15
|
+
|
|
16
|
+
Горизонтальная линия-разделитель (`<hr>`) высотой 1px с токенизированным
|
|
17
|
+
фоном (`--triplex-next-Divider-Background`) и опциональными top/bottom
|
|
18
|
+
отступами из фиксированной шкалы 4/8/12/16/20/24/28/32 px.
|
|
19
|
+
|
|
20
|
+
Используется для визуального разделения секций внутри Card, Island,
|
|
21
|
+
формы и т. п.
|
|
22
|
+
|
|
23
|
+
Используй когда: нужна тонкая разделительная линия между блоками.
|
|
24
|
+
Не используй когда: нужен вертикальный разделитель (`Divider` только
|
|
25
|
+
горизонтальный); нужны только отступы без линии — бери `Gap`.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Файловая структура
|
|
30
|
+
|
|
31
|
+
```text
|
|
32
|
+
src/components/Divider/
|
|
33
|
+
├── Divider.tsx # FC, НЕ forwardRef
|
|
34
|
+
├── index.ts # Barrel
|
|
35
|
+
├── styles/Divider.module.less # background + each-loop для margin-top/bottom
|
|
36
|
+
└── __tests__/Divider.test.tsx
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Особенности:
|
|
40
|
+
- **НЕ `forwardRef`** — FC без ref-форвардинга. Известный debt. Не
|
|
41
|
+
добавлять точечно.
|
|
42
|
+
- **Рендерит семантичный `<hr>`** (не `<div>`). Это важно для a11y —
|
|
43
|
+
screen reader'ы объявят как разделитель.
|
|
44
|
+
- **Нет `data-tx`** — не ставит атрибут версии.
|
|
45
|
+
- **Тесты есть** — `Divider.test.tsx` проверяет классы по размерам.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Варианты и props
|
|
50
|
+
|
|
51
|
+
### `IDividerProps extends React.HTMLAttributes<HTMLHRElement>`
|
|
52
|
+
|
|
53
|
+
| Prop | Тип | Default | Описание |
|
|
54
|
+
|---|---|---|---|
|
|
55
|
+
| `marginTopSize` | `TDividerMarginSize` (4 \| 8 \| 12 \| 16 \| 20 \| 24 \| 28 \| 32) | — | Отступ сверху в px. Если не задан — 0. |
|
|
56
|
+
| `marginBottomSize` | `TDividerMarginSize` | — | Отступ снизу в px. Если не задан — 0. |
|
|
57
|
+
| `className` | `string` | — | Через `clsx`. |
|
|
58
|
+
| `...HTMLHRAttributes` | — | — | Стандартные атрибуты `<hr>`. |
|
|
59
|
+
|
|
60
|
+
### `TDividerMarginSize = 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32`
|
|
61
|
+
|
|
62
|
+
Литерально-числовой union. **Не `number`** — типизация закрывает
|
|
63
|
+
кастомные значения. Если нужно 0 — не передавать пропс. Если нужно 40 —
|
|
64
|
+
не поддерживается, разделитель не ставится туда, где нужен нестандартный
|
|
65
|
+
gap.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Ключевые особенности реализации
|
|
70
|
+
|
|
71
|
+
### CSS-классы по размеру через LESS `each` + shape
|
|
72
|
+
|
|
73
|
+
```less
|
|
74
|
+
@size: 4, 8, 12, 16, 20, 24, 28, 32;
|
|
75
|
+
each(@size, {
|
|
76
|
+
.marginTopSize-@{value} { margin-top: ~'@{value}px'; }
|
|
77
|
+
.marginBottomSize-@{value} { margin-bottom: ~'@{value}px'; }
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**LESS `each`** + **escape-строка** `~'@{value}px'` генерирует по два
|
|
82
|
+
класса на каждый размер (16 классов всего). Если нужен новый размер —
|
|
83
|
+
добавить в `@size` список и в `TDividerMarginSize` TS-литерал.
|
|
84
|
+
**TS-литерал — единственная связь между LESS и TS**: TS проверяет
|
|
85
|
+
что пропс в списке, LESS обеспечивает наличие класса. Если
|
|
86
|
+
рассинхронизировать — получишь `styles[undefined]`.
|
|
87
|
+
|
|
88
|
+
### Сборка `className` через `clsx`
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
const classNames = clsx(
|
|
92
|
+
styles.divider,
|
|
93
|
+
marginTopSize && styles[`marginTopSize-${marginTopSize}`],
|
|
94
|
+
marginBottomSize && styles[`marginBottomSize-${marginBottomSize}`],
|
|
95
|
+
className,
|
|
96
|
+
);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Дефолт `styles.divider`** задаёт фон + height 1px + `margin: 0` +
|
|
100
|
+
`border: none`. Без `border: none` браузерный `<hr>` имеет свою
|
|
101
|
+
border/margin.
|
|
102
|
+
|
|
103
|
+
**Если `marginTopSize` undefined/0 — класс не добавляется** (короткое
|
|
104
|
+
замыкание `&&`). 0 не поддерживается, но undefined — да.
|
|
105
|
+
|
|
106
|
+
### Токен `--triplex-next-Divider-Background`
|
|
107
|
+
|
|
108
|
+
```less
|
|
109
|
+
.divider {
|
|
110
|
+
height: 1px;
|
|
111
|
+
margin: 0;
|
|
112
|
+
background: var(--triplex-next-Divider-Background);
|
|
113
|
+
border: none;
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Цвет разделителя задаётся одним токеном (см. компонент Divider в
|
|
118
|
+
`DesignTokens/components/Divider.ts`). В тёмной теме меняется
|
|
119
|
+
автоматически через ThemeProvider.
|
|
120
|
+
|
|
121
|
+
### Override через `style` / `className`
|
|
122
|
+
|
|
123
|
+
Потребитель может:
|
|
124
|
+
1. Передать `className` — мержится через clsx.
|
|
125
|
+
2. Передать `style={{margin: ...}}` — перебьёт встроенные margin-классы.
|
|
126
|
+
3. Переопределить `--triplex-next-Divider-Background` в scope.
|
|
127
|
+
|
|
128
|
+
### `hr` — не `div`
|
|
129
|
+
|
|
130
|
+
Семантичность: screen reader'ы читают `<hr>` как разделитель
|
|
131
|
+
(`role="separator"` по умолчанию).
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Инварианты
|
|
136
|
+
|
|
137
|
+
- **Рендерит `<hr>`**, не `<div>`. Не менять — пострадает семантика.
|
|
138
|
+
- **`TDividerMarginSize` фиксирован 4/8/12/16/20/24/28/32** — не
|
|
139
|
+
расширять без выравнивания с дизайн-системой и LESS-списком.
|
|
140
|
+
- **LESS `@size` и TS-литерал должны совпадать** — иначе классы
|
|
141
|
+
не сгенерируются для нового размера.
|
|
142
|
+
- **`border: none; margin: 0;`** в base-классе — без них браузерный
|
|
143
|
+
`<hr>` ломает дизайн.
|
|
144
|
+
- **`--triplex-next-Divider-Background` токен** — единственный способ
|
|
145
|
+
поменять цвет. Не хардкодить hex.
|
|
146
|
+
- **НЕТ forwardRef** — известный debt.
|
|
147
|
+
- **НЕТ `data-tx`** — наследованный пропуск.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Accessibility
|
|
152
|
+
|
|
153
|
+
- **`<hr>`** — встроенная семантика разделителя (`role="separator"`).
|
|
154
|
+
Screen reader'ы читают как "separator" / "разделитель".
|
|
155
|
+
- **Не интерактивный** — tabindex не ставится, клавиатурой не
|
|
156
|
+
взаимодействует.
|
|
157
|
+
- **Если нужен "assistive"-разделитель внутри списка** — оборачивать
|
|
158
|
+
в `<li role="separator">`. Divider сам этого не делает.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Дизайн-токены
|
|
163
|
+
|
|
164
|
+
- `--triplex-next-Divider-Background` — цвет линии.
|
|
165
|
+
|
|
166
|
+
Определение в `src/components/DesignTokens/components/Divider.ts`.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Связанные компоненты
|
|
171
|
+
|
|
172
|
+
- `Gap` (`src/components/Gap`) — отступ без линии.
|
|
173
|
+
- `Row`/`Col` — grid-система (Divider часто между Row'ами).
|
|
174
|
+
- `Card`, `Island`, `Page` — типичные контейнеры с разделителями
|
|
175
|
+
внутри.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Stories
|
|
180
|
+
|
|
181
|
+
`stories/Divider/Divider.stories.tsx`
|
|
182
|
+
Примеры: `stories/Divider/examples/`
|
|
183
|
+
|
|
184
|
+
Типовые stories:
|
|
185
|
+
- `Default` — разделитель без отступов
|
|
186
|
+
- `WithMargins` — разделитель с margin-top/bottom
|
|
187
|
+
- `AllSizes` — таблица всех поддерживаемых размеров
|
|
188
|
+
- `Playground` — интерактив
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## История изменений
|
|
193
|
+
|
|
194
|
+
| Дата | Изменение |
|
|
195
|
+
|---|---|
|
|
196
|
+
| 2026-04-18 | Создан документ |
|