@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.
Files changed (140) hide show
  1. package/README.md +124 -0
  2. package/bundle/.gitkeep +0 -0
  3. package/bundle/components/AbstractTree.md +198 -0
  4. package/bundle/components/AccordionBase.md +227 -0
  5. package/bundle/components/Alert.md +317 -0
  6. package/bundle/components/Amount.md +225 -0
  7. package/bundle/components/AmountField.md +289 -0
  8. package/bundle/components/Avatar.md +209 -0
  9. package/bundle/components/Badge.md +277 -0
  10. package/bundle/components/Body.md +167 -0
  11. package/bundle/components/Button.md +230 -0
  12. package/bundle/components/ButtonDropdown.md +159 -0
  13. package/bundle/components/ButtonIcon.md +122 -0
  14. package/bundle/components/Calendar.md +445 -0
  15. package/bundle/components/Card.md +374 -0
  16. package/bundle/components/CarouselExtended.md +250 -0
  17. package/bundle/components/Checkbox.md +126 -0
  18. package/bundle/components/CheckboxTree.md +280 -0
  19. package/bundle/components/CheckboxTreeExtended.md +321 -0
  20. package/bundle/components/CheckboxXGroup.md +68 -0
  21. package/bundle/components/CheckboxYGroup.md +67 -0
  22. package/bundle/components/Chip.md +404 -0
  23. package/bundle/components/ChipGroup.md +179 -0
  24. package/bundle/components/Col.md +221 -0
  25. package/bundle/components/CollapsableTree.md +255 -0
  26. package/bundle/components/Confirm.md +343 -0
  27. package/bundle/components/DateField.md +371 -0
  28. package/bundle/components/DatePickerExtended.md +342 -0
  29. package/bundle/components/DateRange.md +275 -0
  30. package/bundle/components/DesignTokens.md +385 -0
  31. package/bundle/components/Divider.md +196 -0
  32. package/bundle/components/DocumentNumberEdit.md +280 -0
  33. package/bundle/components/Dropdown.md +433 -0
  34. package/bundle/components/Ellipsis.md +208 -0
  35. package/bundle/components/EmptyView.md +99 -0
  36. package/bundle/components/ExpandAnimation.md +281 -0
  37. package/bundle/components/Footer.md +339 -0
  38. package/bundle/components/FormField.md +326 -0
  39. package/bundle/components/FormGroup.md +99 -0
  40. package/bundle/components/Gap.md +113 -0
  41. package/bundle/components/Header.md +280 -0
  42. package/bundle/components/HelpBox.md +154 -0
  43. package/bundle/components/IconWrapper.md +145 -0
  44. package/bundle/components/Island.md +197 -0
  45. package/bundle/components/IslandAccordion.md +230 -0
  46. package/bundle/components/IslandWidget.md +233 -0
  47. package/bundle/components/KeyDownListener.md +157 -0
  48. package/bundle/components/LightBox.md +322 -0
  49. package/bundle/components/Link.md +161 -0
  50. package/bundle/components/List.md +247 -0
  51. package/bundle/components/ListMaster.md +204 -0
  52. package/bundle/components/Loader.md +161 -0
  53. package/bundle/components/LoaderScreen.md +134 -0
  54. package/bundle/components/Marker.md +127 -0
  55. package/bundle/components/MarkerStatus.md +148 -0
  56. package/bundle/components/MediaWidth.md +169 -0
  57. package/bundle/components/MobileView.md +120 -0
  58. package/bundle/components/ModalWindow.md +308 -0
  59. package/bundle/components/MonthYearField.md +168 -0
  60. package/bundle/components/MultiselectField.md +213 -0
  61. package/bundle/components/Notification.md +233 -0
  62. package/bundle/components/NumberField.md +178 -0
  63. package/bundle/components/OrderedList.md +169 -0
  64. package/bundle/components/Overlay.md +237 -0
  65. package/bundle/components/Page.md +246 -0
  66. package/bundle/components/Pagination.md +298 -0
  67. package/bundle/components/Portal.md +119 -0
  68. package/bundle/components/Radio.md +174 -0
  69. package/bundle/components/Row.md +125 -0
  70. package/bundle/components/SMSField.md +160 -0
  71. package/bundle/components/SegmentedControl.md +235 -0
  72. package/bundle/components/SelectExtendedField.md +322 -0
  73. package/bundle/components/SelectField.md +213 -0
  74. package/bundle/components/Skeleton.md +129 -0
  75. package/bundle/components/Slider.md +157 -0
  76. package/bundle/components/SliderExtended.md +210 -0
  77. package/bundle/components/SliderRange.md +160 -0
  78. package/bundle/components/SmallInput.md +101 -0
  79. package/bundle/components/Spoiler.md +121 -0
  80. package/bundle/components/StatusTracker.md +151 -0
  81. package/bundle/components/Step.md +121 -0
  82. package/bundle/components/Stepper.md +163 -0
  83. package/bundle/components/Suggest.md +160 -0
  84. package/bundle/components/SuggestField.md +157 -0
  85. package/bundle/components/SwipeableArea.md +144 -0
  86. package/bundle/components/Table.md +199 -0
  87. package/bundle/components/Tabs.md +152 -0
  88. package/bundle/components/TabsExtended.md +273 -0
  89. package/bundle/components/TabsLine.md +189 -0
  90. package/bundle/components/Tag.md +135 -0
  91. package/bundle/components/TagColor.md +121 -0
  92. package/bundle/components/TagGroup.md +100 -0
  93. package/bundle/components/TextField.md +152 -0
  94. package/bundle/components/TextareaField.md +124 -0
  95. package/bundle/components/ThemeProvider.md +181 -0
  96. package/bundle/components/Tooltip.md +254 -0
  97. package/bundle/components/TopOverlay.md +145 -0
  98. package/bundle/components/TreeView.md +224 -0
  99. package/bundle/components/Triggers.md +121 -0
  100. package/bundle/guides/codestyle.md +205 -0
  101. package/bundle/guides/commits.md +166 -0
  102. package/bundle/guides/context.md +277 -0
  103. package/bundle/guides/stories.md +618 -0
  104. package/bundle/guides/template.md +154 -0
  105. package/bundle/guides/tests.md +301 -0
  106. package/bundle/icons.json +4156 -0
  107. package/bundle/manifest.json +796 -0
  108. package/bundle/release-notes/1.1.0.mdx +26 -0
  109. package/bundle/release-notes/1.1.1.mdx +14 -0
  110. package/bundle/release-notes/1.10.0.mdx +43 -0
  111. package/bundle/release-notes/1.11.0.mdx +19 -0
  112. package/bundle/release-notes/1.12.0.mdx +21 -0
  113. package/bundle/release-notes/1.13.0.mdx +43 -0
  114. package/bundle/release-notes/1.14.0.mdx +29 -0
  115. package/bundle/release-notes/1.15.0.mdx +56 -0
  116. package/bundle/release-notes/1.16.0.mdx +55 -0
  117. package/bundle/release-notes/1.17.0.mdx +15 -0
  118. package/bundle/release-notes/1.18.0.mdx +24 -0
  119. package/bundle/release-notes/1.19.0.mdx +48 -0
  120. package/bundle/release-notes/1.19.1.mdx +9 -0
  121. package/bundle/release-notes/1.2.0.mdx +80 -0
  122. package/bundle/release-notes/1.20.0.mdx +48 -0
  123. package/bundle/release-notes/1.21.0.mdx +66 -0
  124. package/bundle/release-notes/1.22.0.mdx +75 -0
  125. package/bundle/release-notes/1.23.0.mdx +50 -0
  126. package/bundle/release-notes/1.24.0.mdx +59 -0
  127. package/bundle/release-notes/1.25.0.mdx +52 -0
  128. package/bundle/release-notes/1.26.0.mdx +11 -0
  129. package/bundle/release-notes/1.3.0.mdx +21 -0
  130. package/bundle/release-notes/1.4.0.mdx +37 -0
  131. package/bundle/release-notes/1.5.0.mdx +24 -0
  132. package/bundle/release-notes/1.6.0.mdx +37 -0
  133. package/bundle/release-notes/1.6.1.mdx +11 -0
  134. package/bundle/release-notes/1.7.0.mdx +29 -0
  135. package/bundle/release-notes/1.8.0.mdx +38 -0
  136. package/bundle/release-notes/1.9.0.mdx +28 -0
  137. package/dist/index.d.ts +2 -0
  138. package/dist/index.js +324 -0
  139. package/dist/index.js.map +1 -0
  140. 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 | Создан документ |