@sberbusiness/triplex-next-mcp-server 1.44.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.
Files changed (76) hide show
  1. package/README.md +7 -6
  2. package/bundle/components/AlertContext.md +11 -8
  3. package/bundle/components/AlertProcess.md +13 -10
  4. package/bundle/components/Badge.md +6 -3
  5. package/bundle/components/Button.md +46 -43
  6. package/bundle/components/ButtonDropdownExtended.md +3 -2
  7. package/bundle/components/ButtonIcon.md +7 -4
  8. package/bundle/components/Calendar.md +62 -59
  9. package/bundle/components/Caption.md +26 -23
  10. package/bundle/components/Checkbox.md +32 -29
  11. package/bundle/components/CheckboxTreeExtended.md +9 -5
  12. package/bundle/components/Chip.md +44 -41
  13. package/bundle/components/CodeText.md +26 -23
  14. package/bundle/components/Col.md +1 -2
  15. package/bundle/components/CollapsibleTree.md +8 -5
  16. package/bundle/components/Dropdown.md +33 -28
  17. package/bundle/components/EmptyView.md +12 -5
  18. package/bundle/components/FooterPage.md +6 -2
  19. package/bundle/components/FormField.md +44 -41
  20. package/bundle/components/FormGroup.md +192 -52
  21. package/bundle/components/Header.md +491 -211
  22. package/bundle/components/HeaderPage.md +6 -2
  23. package/bundle/components/ImageGallery.md +33 -34
  24. package/bundle/components/ImageGalleryExtended.md +33 -34
  25. package/bundle/components/Island.md +16 -13
  26. package/bundle/components/LightBox.md +14 -12
  27. package/bundle/components/Link.md +211 -96
  28. package/bundle/components/ListActionItem.md +7 -4
  29. package/bundle/components/ListItem.md +11 -8
  30. package/bundle/components/ListItemControlsButton.md +16 -13
  31. package/bundle/components/ListItemControlsButtonDropdown.md +9 -6
  32. package/bundle/components/ListItemSelectable.md +7 -4
  33. package/bundle/components/ListMasterFooter.md +8 -5
  34. package/bundle/components/ListMasterHeader.md +8 -5
  35. package/bundle/components/ListSortableItem.md +11 -8
  36. package/bundle/components/ListTableItem.md +7 -4
  37. package/bundle/components/LoaderMiddle.md +7 -4
  38. package/bundle/components/LoaderScreen.md +11 -8
  39. package/bundle/components/LoaderSmall.md +7 -4
  40. package/bundle/components/Marker.md +184 -69
  41. package/bundle/components/MarkerStatus.md +206 -88
  42. package/bundle/components/MaskedField.md +2 -4
  43. package/bundle/components/MasterTable.md +602 -0
  44. package/bundle/components/ModalWindow.md +7 -4
  45. package/bundle/components/MultiselectField.md +2183 -132
  46. package/bundle/components/Notification.md +12 -9
  47. package/bundle/components/Overlay.md +9 -4
  48. package/bundle/components/Page.md +2 -2
  49. package/bundle/components/Pagination.md +15 -8
  50. package/bundle/components/Row.md +1 -1
  51. package/bundle/components/SelectExtendedField.md +3 -3
  52. package/bundle/components/SelectField.md +466 -148
  53. package/bundle/components/SliderExtended.md +39 -36
  54. package/bundle/components/SmallInput.md +194 -51
  55. package/bundle/components/Suggest.md +535 -99
  56. package/bundle/components/SwipeableArea.md +428 -79
  57. package/bundle/components/TableBasic.md +19 -11
  58. package/bundle/components/TabsExtended.md +24 -21
  59. package/bundle/components/Tag.md +6 -2
  60. package/bundle/components/Text.md +28 -25
  61. package/bundle/components/TextField.md +3 -4
  62. package/bundle/components/ThemeProvider.md +50 -1
  63. package/bundle/components/Title.md +26 -23
  64. package/bundle/components/Tooltip.md +24 -21
  65. package/bundle/components/TopOverlay.md +7 -4
  66. package/bundle/guides/codestyle.md +3 -0
  67. package/bundle/guides/context.md +84 -12
  68. package/bundle/guides/guidelines.md +321 -0
  69. package/bundle/guides/template.md +22 -12
  70. package/bundle/manifest.json +31 -14
  71. package/bundle/release-notes/1.45.0.mdx +117 -0
  72. package/bundle/release-notes/1.46.0.mdx +7 -0
  73. package/bundle/tokens.json +6362 -0
  74. package/dist/index.js +177 -28
  75. package/dist/index.js.map +1 -1
  76. package/package.json +1 -1
@@ -1,13 +1,12 @@
1
1
  ---
2
2
  component: Link
3
- category: Navigation
4
- figma-node: ""
5
- figma-file: ""
6
- related: [Button, IconWrapper, Typography]
3
+ category: Link
4
+ related: [IconWrapper]
7
5
  tokens:
8
- - --triplex-next-Link-Color
9
- - --triplex-next-Link-Color-Hover
10
- - --triplex-next-Link-Color-Active
6
+ - Link.Text_Color_Default
7
+ - Link.Text_Color_Hover
8
+ - Link.Text_Color_Active
9
+ - Link.BorderColor_Focus
11
10
  stories: stories/Link/Link.stories.tsx
12
11
  version: "1.0"
13
12
  ---
@@ -16,141 +15,184 @@ version: "1.0"
16
15
 
17
16
  ## Назначение
18
17
 
19
- Инлайновая ссылка — `<a>` с дизайн-цветами бренда и поддержкой
20
- **leading/trailing-контента** (иконки). Вставляет zero-width space
21
- для корректного выравнивания иконки с текстом и умеет **привязывать
22
- иконку к первому/последнему слову** многословной ссылки, чтобы иконка
23
- не "отлетала" на новую строку при переносе.
18
+ Гиперссылка — инлайновый `<a>` с типографикой и состояниями дизайн-системы. Помимо обычного
19
+ текста умеет принимать сопутствующий контент (обычно иконку) до и после тела ссылки, следя
20
+ за тем, чтобы этот контент не оторвался от текста при переносе строки.
24
21
 
25
- Используй когда: нужна стандартная текстовая ссылка (в тексте, в списке).
26
- Для стилизованной кнопки-CTA — `Button` с `type="link"`.
22
+ Используй когда: нужен переход по адресу — навигация внутри приложения или ссылка наружу.
23
+ Не используй когда: элемент выполняет действие, а не переход (отправка формы, открытие модалки) —
24
+ это `Button`, в том числе с темой `EButtonTheme.LINK`, которая выглядит как ссылка, но остаётся
25
+ кнопкой по семантике и клавиатурному поведению.
27
26
 
28
- ---
29
-
30
- ## Файловая структура
31
-
32
- ```text
33
- src/components/Link/
34
- ├── Link.tsx # forwardRef<HTMLAnchorElement>
35
- ├── index.ts # Barrel
36
- ├── styles/Link.module.less
37
- └── __tests__/Link.test.tsx
38
- ```
27
+ Собственных размеров и типографики у компонента нет: размер и цвет текста наследуются от
28
+ контекста. В stories и в проде ссылку оборачивают в `Text` с нужными `size` и `type`.
39
29
 
40
30
  ---
41
31
 
42
32
  ## Варианты и props
43
33
 
44
- ### `ILinkCommonProps extends AnchorHTMLAttributes<HTMLAnchorElement>`
34
+ Интерфейс `ILinkCommonProps extends React.AnchorHTMLAttributes<HTMLAnchorElement>` — все
35
+ стандартные атрибуты `<a>` поддерживаются. Большинство (`href`, `onClick`, `onBlur`,
36
+ `onMouseDown`, `download`, …) уходит на корневой элемент как есть, через `...rest`.
45
37
 
46
- | Prop | Тип | Обязателен | Описание |
47
- |---|---|---|---|
48
- | `children` | `ReactNode` | Да | Текст или node. Для строк включается логика "иконка + первое/последнее слово". |
49
- | `contentBefore` | `() => ReactElement` | Нет | Рендер-функция leading-контента (обычно иконка). |
50
- | `contentAfter` | `() => ReactElement` | Нет | Рендер-функция trailing-контента. |
51
- | `href`, `target`, `rel`, `onClick`, … | стандартные `<a>`-атрибуты | — | Передаются на `<a>`. |
38
+ Три атрибута компонент обрабатывает сам — положить их в объект и разложить спредом
39
+ не то же самое, что «прокинуть напрямую»:
52
40
 
53
- **`contentBefore` / `contentAfter` — render-props**, не `ReactNode`. Функции вызываются каждый раз при рендере.
41
+ | Prop | Что делает компонент |
42
+ |---|---|
43
+ | `rel` | Пропускает через `getSafeRel(target, rel)` — см. «Безопасность внешних ссылок» |
44
+ | `target` | Выставляет явно после спреда; участвует в вычислении `rel` |
45
+ | `className` | Мерджит с `styles.link` через `clsx`, собственный класс не затирается |
54
46
 
55
- ---
47
+ ### Обязательные props
56
48
 
57
- ## Ключевые особенности реализации
49
+ | Prop | Тип | Описание |
50
+ |---|---|---|
51
+ | `children` | `React.ReactNode` | Тело гиперссылки. Строка и не-строка обрабатываются по-разному — см. «Сшивка контента со словами» |
58
52
 
59
- ### Zero-width space перед leading-контентом
53
+ ### Опциональные props
60
54
 
61
- ```tsx
62
- const renderContentBefore = () =>
63
- contentBefore ? <>{"\u200B"}{contentBefore()}</> : null;
64
- ```
55
+ | Prop | Тип | По умолчанию | Описание |
56
+ |---|---|---|---|
57
+ | `contentBefore` | `() => React.ReactElement` | — | Рендер-функция контента перед телом ссылки. Типичное содержимое — иконка |
58
+ | `contentAfter` | `() => React.ReactElement` | — | Рендер-функция контента после тела ссылки |
65
59
 
66
- - `"\u200B"` (ZWSP) — невидимый символ, используется для корректного **выравнивания по baseline**. Без него иконка "прыгает" относительно текста.
67
- - Аналогичного для `contentAfter` нет — баланс достигается CSS-стилями.
60
+ `contentBefore` / `contentAfter` — именно **функции**, а не узлы: компонент вызывает их сам,
61
+ по одному разу за рендер, и сам решает, в какое место вёрстки поставить результат
62
+ (см. таблицу ниже). Возвращать нужно один элемент — тип `React.ReactElement`,
63
+ не `ReactNode`: строка, массив или `null` не подойдут.
68
64
 
69
- ### Привязка иконки к первому/последнему слову
65
+ ### Сшивка контента со словами
70
66
 
71
- ```tsx
72
- if (words.length < 2 || (words.length < 3 && contentBefore && contentAfter)) {
73
- return <span>{before}{text}{after}</span>; // всё в одном span
74
- }
75
- // Иначе: первый + оставшиеся + последний слово как отдельные узлы
76
- return <>{firstNode} {restWords} {lastNode}</>;
77
- ```
67
+ Главная неочевидность компонента. Если `contentBefore` / `contentAfter` не переданы, `children`
68
+ рендерятся как есть. Если переданы — поведение зависит от типа `children`:
78
69
 
79
- - Для строковых `children` Link парсит текст по пробелам и **оборачивает первое/последнее слово** в `<span>` вместе с `contentBefore`/`contentAfter`.
80
- - Это гарантирует, что иконка не разорвётся с соседним словом при word-wrap.
81
- - Для нестроковых `children` — простая конкатенация: `{before}{node}{after}`.
82
- - Edge case: `words.length < 2` (одно слово) или `< 3` при обоих before+after → всё в одном `<span>` (иначе нечего "разделять").
70
+ **`children` — строка.** Строка режется по пробелам, и контент «приклеивается» к крайним словам,
71
+ чтобы иконка никогда не осталась на строке одна:
83
72
 
84
- ### `IconWrapper displayContents`
73
+ | Слов в строке | Что получается |
74
+ |---|---|
75
+ | 1 | Одно слово вместе с обоими контентами — один неразрывный блок |
76
+ | 2 + оба контента | Всё ещё один неразрывный блок: развести контенты по разным словам нельзя, иначе при переносе строки они разъедутся |
77
+ | 2 + один контент | Разбивается на первое и последнее слово, контент клеится к своему краю |
78
+ | 3 и больше | Первое слово + `contentBefore` — один блок, последнее слово + `contentAfter` — другой, середина между ними обычным текстом |
85
79
 
86
- ```tsx
87
- <a>
88
- <IconWrapper displayContents>{content}</IconWrapper>
89
- </a>
90
- ```
80
+ Известный артефакт ветки «2 слова + один контент»: середина строки пуста, и в разметку
81
+ попадают два пробела подряд между словами. В HTML они схлопываются в один, визуально
82
+ это незаметно, но в `textContent` видны — тесты потребителей должны сравнивать текст
83
+ с нормализацией пробелов, а не побайтово.
91
84
 
92
- - Оборачивает **весь контент** в `IconWrapper` с `display: contents`, чтобы включить `hoverable`-класс для иконок в `contentBefore`/`contentAfter` (меняет `fill` при hover).
93
- - `displayContents` нужен, чтобы обёртка не создавала свой box и не ломала inline-поток.
85
+ Неразрывный блок — `<span>` с классом `wordWithContent` (`white-space: nowrap`,
86
+ `display: inline-flex`). Перед `contentBefore` вставляется zero-width space (`U+200B`) — он
87
+ нужен для правильного вертикального выравнивания внутри inline-flex.
94
88
 
95
- ### `data-tx={process.env.npm_package_version}` atribute
89
+ Асимметрия намеренная: ZWSP ставится только перед `contentBefore` и не ставится после
90
+ `contentAfter`. В `after`-блоке первым идёт текст слова и он же задаёт базовую линию;
91
+ в `before`-блоке первым шёл бы элемент контента, и ZWSP подставляет перед ним текстовый
92
+ бокс. Не «доводи до симметрии», добавляя ZWSP в конец, — это сдвинет выравнивание.
96
93
 
97
- Версия библиотеки пишется в DOM — для дебага на production (можно узнать версию, просмотрев разметку). Этот атрибут стоит сохранить при изменениях.
94
+ **`children` — не строка** (элемент, фрагмент, массив). Резать по словам нечего, поэтому
95
+ контенты просто ставятся по краям, без обёрток `wordWithContent` и без zero-width space.
96
+ Следствие: перенос строки может оторвать иконку от текста — за неразрывность в этом случае
97
+ отвечает потребитель.
98
98
 
99
- ### `role="link"` на `<a>`
99
+ ### Безопасность внешних ссылок
100
100
 
101
- **Избыточно** — `<a href>` по умолчанию имеет role="link". Но без `href` роль теряется → `role="link"` делает компонент семантически корректным и для "кнопкоподобных" ссылок без href'а. Не удалять без рефакторинга.
101
+ При `target="_blank"` компонент сам подставляет `rel="noopener"` (утилита `getSafeRel`) —
102
+ защита от reverse tabnabbing. Явно переданный непустой `rel` потребителя сохраняется как есть;
103
+ пустая строка защиту не отключает. Без `target="_blank"` атрибут `rel` не добавляется.
102
104
 
103
- ### `onBlur` / `onMouseDown` прокидываются отдельно
105
+ ---
104
106
 
105
- Остальные handler'ы идут через `...rest`, но эти два — отдельно. **Легаси** — можно убрать, упростив до `...rest`. При рефакторинге проверять storybook-примеры.
107
+ ## Дизайн-токены
106
108
 
107
- ---
109
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
110
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Link.ts`.
108
111
 
109
- ## Инварианты
112
+ ```text
113
+ Link.Text_Color_Default
114
+ Link.Text_Color_Hover
115
+ Link.Text_Color_Active
116
+ Link.BorderColor_Focus
117
+ ```
118
+
119
+ Только цвет текста по состояниям и кольцо фокуса. `Link.BorderColor_Focus` подставляется
120
+ в `box-shadow` (не в `border-color`) — имя токена историческое, менять его нельзя.
110
121
 
111
- - **`<a>` с `role="link"`** — не менять тег на `<span>`/`<button>` (нарушит screen reader'ов).
112
- - **`contentBefore` / `contentAfter` — функции**, не nodes. Публичный API.
113
- - **ZWSP перед leading-контентом** — не убирать без визуальной регрессии.
114
- - **Строковые children обрабатываются специально** (первое/последнее слово). Не все потребители это знают; при рефакторинге поддерживать логику разрыва слов.
115
- - **`IconWrapper displayContents`** — обязателен, обеспечивает `hoverable` для иконок внутри.
116
- - **`data-tx` атрибут** — продакшн-маркер версии, не трогать.
117
- - **`forwardRef<HTMLAnchorElement>`** — не `HTMLElement`.
122
+ Размер и начертание текста компонент не задаёт вовсе — их даёт родительский `Text`
123
+ или окружающая типографика. Отступ 2px между словом и контентом задан литералом
124
+ в `styles/Link.module.less`.
118
125
 
119
126
  ---
120
127
 
121
- ## Accessibility
128
+ ## Инварианты
122
129
 
123
- - `<a>` с `href` — полная клавиатурная навигация (Tab, Enter).
124
- - `role="link"` — дублирующая роль, но нужна для `<a>` без href (interactive span-like ссылки).
125
- - Иконки в `contentBefore`/`contentAfter` не имеют `aria-label` — потребитель должен передать нужные атрибуты через `contentBefore={() => <Icon aria-hidden="true" />}` (если декоративная) или осмысленный `aria-label` у иконки (если несёт смысл).
126
- - `disabled`-состояние у `<a>` невозможно; для блокировки — `tabIndex={-1}` + CSS (нет в компоненте).
130
+ - `forwardRef<HTMLAnchorElement>` — не убирать. Ref всегда указывает на корневой `<a>`.
131
+ - Корневой элемент — `<a>`. Менять нельзя: от него зависят нативная навигация,
132
+ клавиатурная семантика и стили `:hover` / `:active` / `:focus-visible`.
133
+ - `displayName` — `"Link"`. Не менять.
134
+ - Имя интерфейса `ILinkCommonProps` и имена props (`children`, `contentBefore`, `contentAfter`) —
135
+ публичный API, переименование ломает потребителей.
136
+ - `role="link"` рендерится **до** `{...rest}`, то есть потребитель может его переопределить.
137
+ Порядок сложился исторически; трогать его — изменение публичного поведения.
138
+ - Автоподстановка `rel="noopener"` при `target="_blank"` — контракт безопасности,
139
+ не убирать. Логика вынесена в `src/utils/html/anchorSecurity.ts` и переиспользуется
140
+ другими компонентами.
141
+ - Zero-width space перед `contentBefore` — не «мусорный символ», а выравнивание.
142
+ Он попадает в `textContent`, это нужно учитывать в тестах потребителей.
143
+ - Классы `wordWithContent`, `before`, `after` из `styles/Link.module.less` завязаны на
144
+ логику разбиения в `Link.tsx` — переименовывать только синхронно с TSX и тестами.
145
+ - `.before :first-child` и `.after :last-child` — селекторы **потомка**, а не прямого
146
+ ребёнка. Отступ 2px получает каждый первый (последний) потомок на любом уровне
147
+ вложенности: если `contentBefore` возвращает иконку в обёртке, 2px достаются и обёртке,
148
+ и иконке. Замена на `> :first-child` изменит рендер и потребует пересъёмки
149
+ baseline-скриншотов — не менять походя.
150
+ - Barrel `src/components/Link/index.ts` реэкспортирует всё из `Link.tsx` — сохранять.
127
151
 
128
152
  ---
129
153
 
130
- ## Дизайн-токены
131
-
132
- ```
133
- --triplex-next-Link-Color # основной цвет
134
- --triplex-next-Link-Color-Hover # hover
135
- --triplex-next-Link-Color-Active # active
136
- ```
154
+ ## Accessibility
137
155
 
138
- (Названия могут отличаться — проверь `styles/Link.module.less`.)
156
+ - Роль: `<a>` с явным `role="link"`. Доступное имя берётся из текстового содержимого,
157
+ поэтому осмысленный текст ссылки — ответственность потребителя. Компонент не хардкодит
158
+ строк: библиотека мультиязычная.
159
+ - Иконка в `contentBefore` / `contentAfter` декоративная — она не должна добавлять доступное
160
+ имя. Если иконка несёт смысл (например, «откроется в новой вкладке»), потребитель обязан
161
+ сам задать `aria-label` на ссылке или скрытый текст.
162
+ - `href` компонент не подставляет. Без `href` элемент выпадает из порядка фокуса и с клавиатуры
163
+ недоступен — для действия без адреса бери `Button` с темой `EButtonTheme.LINK`.
164
+ - Клавиатура: собственных обработчиков нет, работает нативное поведение `<a href>`
165
+ (Tab, Enter).
166
+ - Кольцо фокуса — через `:focus-visible`, то есть только при клавиатурной навигации;
167
+ `outline` снят намеренно и заменён на `box-shadow` из токена.
168
+ - При `target="_blank"` о переходе в новую вкладку скринридер сам не предупреждает —
169
+ если это важно, текст предупреждения даёт потребитель.
139
170
 
140
171
  ---
141
172
 
142
173
  ## Связанные компоненты
143
174
 
144
- - `IconWrapper` — обёртка для `hoverable`-стилей иконок (используется внутри).
145
- - `Button` с `type="link"` — кнопка, стилизованная как ссылка.
146
- - `Typography` — для текста без ссылочной функции.
175
+ - `Button` — другой класс задач при похожей визуальной подаче: тема `EButtonTheme.LINK`
176
+ рисует кнопку как ссылку. Выбор между ними по семантике, а не по виду: переход по адресу —
177
+ `Link`, действие на странице — `Button`. Поэтому `Button` намеренно не попал в `related`:
178
+ это отвод в соседнюю задачу, а не взаимозаменяемый вариант.
179
+ - `IconWrapper` — рендерится внутри с `displayContents`, поэтому не создаёт своего блока
180
+ в вёрстке. Ставит глобальный класс `hoverable`, по которому иконки в `contentBefore` /
181
+ `contentAfter` перекрашиваются вместе со ссылкой на hover и active. Размер иконки он
182
+ не задаёт — его задаёт сама иконка (`...Icon16` / `...Icon20` / `...Icon24`).
147
183
 
148
184
  ---
149
185
 
150
186
  ## Stories
151
187
 
152
- `stories/Link/Link.stories.tsx`
153
- Примеры: `stories/Link/examples/`
188
+ Основные истории: `stories/Link/Link.stories.tsx`
189
+ Файлы примеров: `stories/Link/examples/`
190
+
191
+ | Story | Example file | Что демонстрирует |
192
+ |---|---|---|
193
+ | `Playground` | — | Интерактивный контроль текста ссылки: `parameters.controls.include` оставляет в панели только `children`, поэтому объявленные в `argTypes` `href` и `target` туда не попадают, а `onClick` — action, а не контрол. Рендерится инлайново, без отдельного example-файла |
194
+ | `Default` | `DefaultExample.tsx` | Минимальная ссылка внутри `Text` |
195
+ | `Examples` | `ExamplesExample.tsx` | Иконка через `contentAfter`, `contentBefore` и оба сразу |
154
196
 
155
197
  ---
156
198
 
@@ -158,4 +200,77 @@ return <>{firstNode} {restWords} {lastNode}</>;
158
200
 
159
201
  | Дата | Изменение |
160
202
  |---|---|
161
- | 2026-04-18 | Создан документ |
203
+ | 2026-08-31 | Создан документ. AI-рефакторинг: снята ручная проброска `onBlur` / `onMouseDown` вместе с их деструктуризацией — теперь они едут в составе `...rest`; устранено затенение `className` и `children` во внутренних функциях; условие разбиения вынесено в `isSingleBlock`; JSDoc на props и на логику сшивки. Unit-тесты расширены. |
204
+
205
+ ---
206
+
207
+ ## Примеры использования
208
+
209
+ ### Default
210
+
211
+ `stories/Link/examples/DefaultExample.tsx`
212
+
213
+ ```tsx
214
+ import React from "react";
215
+ import { Link, Text, ETextSize, EFontType } from "@sberbusiness/triplex-next";
216
+
217
+ export const DefaultExample = () => (
218
+ <Text size={ETextSize.B3} type={EFontType.PRIMARY}>
219
+ <Link href="#" onClick={(event) => event.preventDefault()}>
220
+ Link text
221
+ </Link>
222
+ </Text>
223
+ );
224
+ ```
225
+
226
+ ### Examples
227
+
228
+ `stories/Link/examples/ExamplesExample.tsx`
229
+
230
+ ```tsx
231
+ import React from "react";
232
+ import { Link, Text, Gap, ETextSize, EFontType } from "@sberbusiness/triplex-next";
233
+ import { LinkStrokeSrvIcon16 } from "@sberbusiness/icons-next";
234
+
235
+ export const ExamplesExample = () => {
236
+ const renderContentAfter = () => (
237
+ <div style={{ paddingTop: "6px" }}>
238
+ <LinkStrokeSrvIcon16 paletteIndex={0} />
239
+ </div>
240
+ );
241
+
242
+ const renderContentBefore = () => (
243
+ <div style={{ paddingTop: "4px" }}>
244
+ <LinkStrokeSrvIcon16 paletteIndex={0} />
245
+ </div>
246
+ );
247
+
248
+ return (
249
+ <div>
250
+ <Text size={ETextSize.B3} type={EFontType.PRIMARY}>
251
+ <Link href="#" contentAfter={renderContentAfter} onClick={(event) => event.preventDefault()}>
252
+ External link with content after
253
+ </Link>
254
+ </Text>
255
+ <Gap size={16} />
256
+ <Text size={ETextSize.B3} type={EFontType.PRIMARY}>
257
+ <Link href="#" contentBefore={renderContentBefore} onClick={(event) => event.preventDefault()}>
258
+ External link with content before
259
+ </Link>
260
+ </Text>
261
+ <Gap size={16} />
262
+ <Text size={ETextSize.B3} type={EFontType.PRIMARY}>
263
+ <Link
264
+ href="#"
265
+ contentBefore={renderContentBefore}
266
+ contentAfter={renderContentAfter}
267
+ onClick={(event) => event.preventDefault()}
268
+ >
269
+ External link with content before and after
270
+ </Link>
271
+ </Text>
272
+ </div>
273
+ );
274
+ };
275
+ ```
276
+
@@ -3,8 +3,8 @@ component: ListActionItem
3
3
  category: List
4
4
  related: [ListItem, ListItemContent, ListSortableItem]
5
5
  tokens:
6
- - --triplex-next-ListItem-Background_Hover
7
- - --triplex-next-ListItem-BorderColor_Focus
6
+ - ListItem.Background_Hover
7
+ - ListItem.BorderColor_Focus
8
8
  stories: stories/List/ListItem.stories.tsx
9
9
  version: "1.0"
10
10
  ---
@@ -70,9 +70,12 @@ hover-подсветку, focus-обводку по Tab и активацию п
70
70
 
71
71
  ## Дизайн-токены
72
72
 
73
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
74
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/ListItem.ts`.
75
+
73
76
  ```text
74
- --triplex-next-ListItem-Background_Hover // фон при hover (desktop)
75
- --triplex-next-ListItem-BorderColor_Focus // цвет focus-обводки (:focus-visible)
77
+ ListItem.Background_Hover // фон при hover (desktop)
78
+ ListItem.BorderColor_Focus // цвет focus-обводки (:focus-visible)
76
79
  ```
77
80
 
78
81
  Класс `styles.listActionItem` навешивается на сам `ListItemContent`, поэтому весь
@@ -3,10 +3,10 @@ component: ListItem
3
3
  category: List
4
4
  related: [List, ListItemContent, ListActionItem, ListItemSelectable, ListTableItem, ListSortableItem]
5
5
  tokens:
6
- - --triplex-next-ListItem-Background
7
- - --triplex-next-ListItem-Background_Selected
8
- - --triplex-next-ListItem-Background_Hover
9
- - --triplex-next-ListItem-BorderColor_Focus
6
+ - ListItem.Background
7
+ - ListItem.Background_Selected
8
+ - ListItem.Background_Hover
9
+ - ListItem.BorderColor_Focus
10
10
  stories: stories/List/ListItem.stories.tsx
11
11
  version: "1.0"
12
12
  ---
@@ -41,14 +41,17 @@ swipe-actions и selectable.
41
41
 
42
42
  ## Дизайн-токены
43
43
 
44
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
45
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/ListItem.ts`.
46
+
44
47
  Сами стили `ListItem.tsx` пустые — токены применяются в подкомпонентах
45
48
  (`ListItemContent`, `ListItemSelectable`, `ListActionItem`):
46
49
 
47
50
  ```text
48
- --triplex-next-ListItem-Background // фон по умолчанию (ListItemContent)
49
- --triplex-next-ListItem-Background_Selected // фон, когда selected=true (ListItemContent)
50
- --triplex-next-ListItem-Background_Hover // фон при hover на desktop (ListActionItem на ListItemContent)
51
- --triplex-next-ListItem-BorderColor_Focus // цвет focus-обводки на desktop (ListActionItem)
51
+ ListItem.Background // фон по умолчанию (ListItemContent)
52
+ ListItem.Background_Selected // фон, когда selected=true (ListItemContent)
53
+ ListItem.Background_Hover // фон при hover на desktop (ListActionItem на ListItemContent)
54
+ ListItem.BorderColor_Focus // цвет focus-обводки на desktop (ListActionItem)
52
55
  ```
53
56
 
54
57
  ---
@@ -3,12 +3,12 @@ component: ListItemControlsButton
3
3
  category: List
4
4
  related: [ListItemControls, ListItemControlsButtonDropdown, IconWrapper]
5
5
  tokens:
6
- - --triplex-next-ListItemControlsButton-Background_Default
7
- - --triplex-next-ListItemControlsButton-Background_Hover
8
- - --triplex-next-ListItemControlsButton-Background_Active
9
- - --triplex-next-ListItemControlsButton-Color_Default
10
- - --triplex-next-ListItemControlsButton-Color_Hover
11
- - --triplex-next-ListItemControlsButton-Color_Active
6
+ - ListItemControlsButton.Background_Default
7
+ - ListItemControlsButton.Background_Hover
8
+ - ListItemControlsButton.Background_Active
9
+ - ListItemControlsButton.Color_Default
10
+ - ListItemControlsButton.Color_Hover
11
+ - ListItemControlsButton.Color_Active
12
12
  stories: stories/List/ListItemControls.stories.tsx
13
13
  version: "1.0"
14
14
  ---
@@ -43,15 +43,18 @@ version: "1.0"
43
43
 
44
44
  ## Дизайн-токены
45
45
 
46
- Паттерн: `--triplex-next-ListItemControlsButton-{Property}_{State}`
46
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
47
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/ListItemControlsButton.ts`.
48
+
49
+ Паттерн: `ListItemControlsButton.{Property}_{State}`
47
50
 
48
51
  ```text
49
- --triplex-next-ListItemControlsButton-Background_Default
50
- --triplex-next-ListItemControlsButton-Background_Hover
51
- --triplex-next-ListItemControlsButton-Background_Active // применяется при :active или классе .expanded (если выставлен снаружи)
52
- --triplex-next-ListItemControlsButton-Color_Default
53
- --triplex-next-ListItemControlsButton-Color_Hover
54
- --triplex-next-ListItemControlsButton-Color_Active
52
+ ListItemControlsButton.Background_Default
53
+ ListItemControlsButton.Background_Hover
54
+ ListItemControlsButton.Background_Active // применяется при :active или классе .expanded (если выставлен снаружи)
55
+ ListItemControlsButton.Color_Default
56
+ ListItemControlsButton.Color_Hover
57
+ ListItemControlsButton.Color_Active
55
58
  ```
56
59
 
57
60
  Цвет лейбла переопределяет токен `Color_*` через `!important`, потому что
@@ -3,12 +3,12 @@ component: ListItemControlsButtonDropdown
3
3
  category: List
4
4
  related: [ListItemControlsButton, ButtonDropdownExtended, Dropdown]
5
5
  tokens:
6
- - --triplex-next-ListItemControlsButton-Background_Default
7
- - --triplex-next-ListItemControlsButton-Background_Hover
8
- - --triplex-next-ListItemControlsButton-Background_Active
9
- - --triplex-next-ListItemControlsButton-Color_Default
10
- - --triplex-next-ListItemControlsButton-Color_Hover
11
- - --triplex-next-ListItemControlsButton-Color_Active
6
+ - ListItemControlsButton.Background_Default
7
+ - ListItemControlsButton.Background_Hover
8
+ - ListItemControlsButton.Background_Active
9
+ - ListItemControlsButton.Color_Default
10
+ - ListItemControlsButton.Color_Hover
11
+ - ListItemControlsButton.Color_Active
12
12
  stories: stories/List/ListItemControls.stories.tsx
13
13
  version: "1.0"
14
14
  ---
@@ -52,6 +52,9 @@ dropdown.
52
52
 
53
53
  ## Дизайн-токены
54
54
 
55
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
56
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/ListItemControlsButton.ts`.
57
+
55
58
  Использует те же токены, что и `ListItemControlsButton`. Дополнительно — стиль
56
59
  `.buttonDropdownMenuItem` для опций dropdown (ellipsis для длинных лейблов).
57
60
 
@@ -3,8 +3,8 @@ component: ListItemSelectable
3
3
  category: List
4
4
  related: [ListItem, ListItemContent, Checkbox]
5
5
  tokens:
6
- - --triplex-next-ListItem-Background
7
- - --triplex-next-ListItem-Background_Selected
6
+ - ListItem.Background
7
+ - ListItem.Background_Selected
8
8
  stories: stories/List/ListItem.stories.tsx
9
9
  version: "1.0"
10
10
  ---
@@ -45,9 +45,12 @@ version: "1.0"
45
45
 
46
46
  ## Дизайн-токены
47
47
 
48
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
49
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/ListItem.ts`.
50
+
48
51
  ```text
49
- --triplex-next-ListItem-Background // фон по умолчанию
50
- --triplex-next-ListItem-Background_Selected // фон, когда selected=true
52
+ ListItem.Background // фон по умолчанию
53
+ ListItem.Background_Selected // фон, когда selected=true
51
54
  ```
52
55
 
53
56
  ---
@@ -3,8 +3,8 @@ component: ListMasterFooter
3
3
  category: List
4
4
  related: [ListMaster, ListMasterFooterDescription, ListMasterFooterControls]
5
5
  tokens:
6
- - --triplex-next-ListMaster-Footer_Background
7
- - --triplex-next-ListMaster-Footer_Shadow
6
+ - ListMaster.Footer_Background
7
+ - ListMaster.Footer_Shadow
8
8
  stories: stories/ListMaster/ListMaster.stories.tsx
9
9
  version: "1.0"
10
10
  ---
@@ -37,9 +37,12 @@ align-items: center` — слева текст (`FooterDescription`), справ
37
37
 
38
38
  ## Дизайн-токены
39
39
 
40
- ```
41
- --triplex-next-ListMaster-Footer_Background // фон футера
42
- --triplex-next-ListMaster-Footer_Shadow // тень сверху
40
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
41
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/ListMaster.ts`.
42
+
43
+ ```text
44
+ ListMaster.Footer_Background // фон футера
45
+ ListMaster.Footer_Shadow // тень сверху
43
46
  ```
44
47
 
45
48
  ---
@@ -3,8 +3,8 @@ component: ListMasterHeader
3
3
  category: List
4
4
  related: [ListMaster, SelectionControls]
5
5
  tokens:
6
- - --triplex-next-ListMaster-Header_Background
7
- - --triplex-next-ListMaster-Header_Shadow
6
+ - ListMaster.Header_Background
7
+ - ListMaster.Header_Shadow
8
8
  stories: stories/ListMaster/ListMaster.stories.tsx
9
9
  version: "1.0"
10
10
  ---
@@ -37,9 +37,12 @@ Sticky-шапка `ListMaster`. Показывается обычно при в
37
37
 
38
38
  ## Дизайн-токены
39
39
 
40
- ```
41
- --triplex-next-ListMaster-Header_Background // фон шапки
42
- --triplex-next-ListMaster-Header_Shadow // тень снизу
40
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
41
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/ListMaster.ts`.
42
+
43
+ ```text
44
+ ListMaster.Header_Background // фон шапки
45
+ ListMaster.Header_Shadow // тень снизу
43
46
  ```
44
47
 
45
48
  ---