@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.
- package/README.md +7 -6
- package/bundle/components/AlertContext.md +11 -8
- package/bundle/components/AlertProcess.md +13 -10
- package/bundle/components/Badge.md +6 -3
- package/bundle/components/Button.md +46 -43
- package/bundle/components/ButtonDropdownExtended.md +3 -2
- package/bundle/components/ButtonIcon.md +7 -4
- package/bundle/components/Calendar.md +62 -59
- package/bundle/components/Caption.md +26 -23
- package/bundle/components/Checkbox.md +32 -29
- package/bundle/components/CheckboxTreeExtended.md +9 -5
- package/bundle/components/Chip.md +44 -41
- package/bundle/components/CodeText.md +26 -23
- package/bundle/components/Col.md +1 -2
- package/bundle/components/CollapsibleTree.md +8 -5
- package/bundle/components/Dropdown.md +33 -28
- package/bundle/components/EmptyView.md +12 -5
- package/bundle/components/FooterPage.md +6 -2
- package/bundle/components/FormField.md +44 -41
- package/bundle/components/FormGroup.md +192 -52
- package/bundle/components/Header.md +491 -211
- package/bundle/components/HeaderPage.md +6 -2
- package/bundle/components/ImageGallery.md +33 -34
- package/bundle/components/ImageGalleryExtended.md +33 -34
- package/bundle/components/Island.md +16 -13
- package/bundle/components/LightBox.md +14 -12
- package/bundle/components/Link.md +211 -96
- package/bundle/components/ListActionItem.md +7 -4
- package/bundle/components/ListItem.md +11 -8
- package/bundle/components/ListItemControlsButton.md +16 -13
- package/bundle/components/ListItemControlsButtonDropdown.md +9 -6
- package/bundle/components/ListItemSelectable.md +7 -4
- package/bundle/components/ListMasterFooter.md +8 -5
- package/bundle/components/ListMasterHeader.md +8 -5
- package/bundle/components/ListSortableItem.md +11 -8
- package/bundle/components/ListTableItem.md +7 -4
- package/bundle/components/LoaderMiddle.md +7 -4
- package/bundle/components/LoaderScreen.md +11 -8
- package/bundle/components/LoaderSmall.md +7 -4
- package/bundle/components/Marker.md +184 -69
- package/bundle/components/MarkerStatus.md +206 -88
- package/bundle/components/MaskedField.md +2 -4
- package/bundle/components/MasterTable.md +602 -0
- package/bundle/components/ModalWindow.md +7 -4
- package/bundle/components/MultiselectField.md +2183 -132
- package/bundle/components/Notification.md +12 -9
- package/bundle/components/Overlay.md +9 -4
- package/bundle/components/Page.md +2 -2
- package/bundle/components/Pagination.md +15 -8
- package/bundle/components/Row.md +1 -1
- package/bundle/components/SelectExtendedField.md +3 -3
- package/bundle/components/SelectField.md +466 -148
- package/bundle/components/SliderExtended.md +39 -36
- package/bundle/components/SmallInput.md +194 -51
- package/bundle/components/Suggest.md +535 -99
- package/bundle/components/SwipeableArea.md +428 -79
- package/bundle/components/TableBasic.md +19 -11
- package/bundle/components/TabsExtended.md +24 -21
- package/bundle/components/Tag.md +6 -2
- package/bundle/components/Text.md +28 -25
- package/bundle/components/TextField.md +3 -4
- package/bundle/components/ThemeProvider.md +50 -1
- package/bundle/components/Title.md +26 -23
- package/bundle/components/Tooltip.md +24 -21
- package/bundle/components/TopOverlay.md +7 -4
- package/bundle/guides/codestyle.md +3 -0
- package/bundle/guides/context.md +84 -12
- package/bundle/guides/guidelines.md +321 -0
- package/bundle/guides/template.md +22 -12
- package/bundle/manifest.json +31 -14
- package/bundle/release-notes/1.45.0.mdx +117 -0
- package/bundle/release-notes/1.46.0.mdx +7 -0
- package/bundle/tokens.json +6362 -0
- package/dist/index.js +177 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: Link
|
|
3
|
-
category:
|
|
4
|
-
|
|
5
|
-
figma-file: ""
|
|
6
|
-
related: [Button, IconWrapper, Typography]
|
|
3
|
+
category: Link
|
|
4
|
+
related: [IconWrapper]
|
|
7
5
|
tokens:
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
иконку к первому/последнему слову** многословной ссылки, чтобы иконка
|
|
23
|
-
не "отлетала" на новую строку при переносе.
|
|
18
|
+
Гиперссылка — инлайновый `<a>` с типографикой и состояниями дизайн-системы. Помимо обычного
|
|
19
|
+
текста умеет принимать сопутствующий контент (обычно иконку) до и после тела ссылки, следя
|
|
20
|
+
за тем, чтобы этот контент не оторвался от текста при переносе строки.
|
|
24
21
|
|
|
25
|
-
Используй когда:
|
|
26
|
-
|
|
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
|
-
|
|
34
|
+
Интерфейс `ILinkCommonProps extends React.AnchorHTMLAttributes<HTMLAnchorElement>` — все
|
|
35
|
+
стандартные атрибуты `<a>` поддерживаются. Большинство (`href`, `onClick`, `onBlur`,
|
|
36
|
+
`onMouseDown`, `download`, …) уходит на корневой элемент как есть, через `...rest`.
|
|
45
37
|
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
53
|
+
### Опциональные props
|
|
60
54
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
55
|
+
| Prop | Тип | По умолчанию | Описание |
|
|
56
|
+
|---|---|---|---|
|
|
57
|
+
| `contentBefore` | `() => React.ReactElement` | — | Рендер-функция контента перед телом ссылки. Типичное содержимое — иконка |
|
|
58
|
+
| `contentAfter` | `() => React.ReactElement` | — | Рендер-функция контента после тела ссылки |
|
|
65
59
|
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
`contentBefore` / `contentAfter` — именно **функции**, а не узлы: компонент вызывает их сам,
|
|
61
|
+
по одному разу за рендер, и сам решает, в какое место вёрстки поставить результат
|
|
62
|
+
(см. таблицу ниже). Возвращать нужно один элемент — тип `React.ReactElement`,
|
|
63
|
+
не `ReactNode`: строка, массив или `null` не подойдут.
|
|
68
64
|
|
|
69
|
-
###
|
|
65
|
+
### Сшивка контента со словами
|
|
70
66
|
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
- Для нестроковых `children` — простая конкатенация: `{before}{node}{after}`.
|
|
82
|
-
- Edge case: `words.length < 2` (одно слово) или `< 3` при обоих before+after → всё в одном `<span>` (иначе нечего "разделять").
|
|
70
|
+
**`children` — строка.** Строка режется по пробелам, и контент «приклеивается» к крайним словам,
|
|
71
|
+
чтобы иконка никогда не осталась на строке одна:
|
|
83
72
|
|
|
84
|
-
|
|
73
|
+
| Слов в строке | Что получается |
|
|
74
|
+
|---|---|
|
|
75
|
+
| 1 | Одно слово вместе с обоими контентами — один неразрывный блок |
|
|
76
|
+
| 2 + оба контента | Всё ещё один неразрывный блок: развести контенты по разным словам нельзя, иначе при переносе строки они разъедутся |
|
|
77
|
+
| 2 + один контент | Разбивается на первое и последнее слово, контент клеится к своему краю |
|
|
78
|
+
| 3 и больше | Первое слово + `contentBefore` — один блок, последнее слово + `contentAfter` — другой, середина между ними обычным текстом |
|
|
85
79
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
```
|
|
80
|
+
Известный артефакт ветки «2 слова + один контент»: середина строки пуста, и в разметку
|
|
81
|
+
попадают два пробела подряд между словами. В HTML они схлопываются в один, визуально
|
|
82
|
+
это незаметно, но в `textContent` видны — тесты потребителей должны сравнивать текст
|
|
83
|
+
с нормализацией пробелов, а не побайтово.
|
|
91
84
|
|
|
92
|
-
|
|
93
|
-
- `
|
|
85
|
+
Неразрывный блок — `<span>` с классом `wordWithContent` (`white-space: nowrap`,
|
|
86
|
+
`display: inline-flex`). Перед `contentBefore` вставляется zero-width space (`U+200B`) — он
|
|
87
|
+
нужен для правильного вертикального выравнивания внутри inline-flex.
|
|
94
88
|
|
|
95
|
-
|
|
89
|
+
Асимметрия намеренная: ZWSP ставится только перед `contentBefore` и не ставится после
|
|
90
|
+
`contentAfter`. В `after`-блоке первым идёт текст слова и он же задаёт базовую линию;
|
|
91
|
+
в `before`-блоке первым шёл бы элемент контента, и ZWSP подставляет перед ним текстовый
|
|
92
|
+
бокс. Не «доводи до симметрии», добавляя ZWSP в конец, — это сдвинет выравнивание.
|
|
96
93
|
|
|
97
|
-
|
|
94
|
+
**`children` — не строка** (элемент, фрагмент, массив). Резать по словам нечего, поэтому
|
|
95
|
+
контенты просто ставятся по краям, без обёрток `wordWithContent` и без zero-width space.
|
|
96
|
+
Следствие: перенос строки может оторвать иконку от текста — за неразрывность в этом случае
|
|
97
|
+
отвечает потребитель.
|
|
98
98
|
|
|
99
|
-
###
|
|
99
|
+
### Безопасность внешних ссылок
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
При `target="_blank"` компонент сам подставляет `rel="noopener"` (утилита `getSafeRel`) —
|
|
102
|
+
защита от reverse tabnabbing. Явно переданный непустой `rel` потребителя сохраняется как есть;
|
|
103
|
+
пустая строка защиту не отключает. Без `target="_blank"` атрибут `rel` не добавляется.
|
|
102
104
|
|
|
103
|
-
|
|
105
|
+
---
|
|
104
106
|
|
|
105
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
##
|
|
128
|
+
## Инварианты
|
|
122
129
|
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
|
|
126
|
-
- `
|
|
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
|
-
|
|
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
|
-
- `
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
-
-
|
|
7
|
-
-
|
|
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
|
-
|
|
75
|
-
|
|
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
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
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
|
-
-
|
|
7
|
-
-
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
-
|
|
7
|
-
-
|
|
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
|
-
|
|
42
|
-
|
|
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
|
-
-
|
|
7
|
-
-
|
|
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
|
-
|
|
42
|
-
|
|
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
|
---
|