@sberbusiness/triplex-next-mcp-server 1.44.0-beta → 1.46.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/CardAction.md +615 -0
- package/bundle/components/Checkbox.md +32 -29
- package/bundle/components/CheckboxTreeExtended.md +9 -5
- package/bundle/components/Chip.md +51 -47
- package/bundle/components/ChipMonthYearPicker.md +344 -0
- package/bundle/components/ChipMultiselect.md +1251 -0
- package/bundle/components/ChipOptions.md +329 -0
- package/bundle/components/ChipSort.md +333 -0
- package/bundle/components/ChipSuggest.md +587 -0
- package/bundle/components/CodeText.md +26 -23
- package/bundle/components/Col.md +1 -2
- package/bundle/components/CollapsibleTree.md +8 -5
- package/bundle/components/DateField.md +222 -303
- package/bundle/components/DatePickerExtended.md +3 -1
- 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 +47 -42
- package/bundle/components/FormGroup.md +192 -52
- package/bundle/components/Header.md +491 -211
- package/bundle/components/HeaderPage.md +6 -2
- package/bundle/components/HelpBox.md +7 -1
- package/bundle/components/ImageGallery.md +33 -34
- package/bundle/components/ImageGalleryExtended.md +33 -34
- package/bundle/components/Island.md +16 -13
- package/bundle/components/IslandAccordion.md +443 -152
- package/bundle/components/IslandWidget.md +622 -157
- 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 +4 -5
- package/bundle/components/MasterTable.md +602 -0
- package/bundle/components/ModalWindow.md +7 -4
- package/bundle/components/MonthYearField.md +3 -1
- 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 +75 -17
- package/bundle/release-notes/1.45.0.mdx +117 -0
- package/bundle/release-notes/1.46.0.mdx +66 -0
- package/bundle/release-notes/1.47.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,11 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: Header
|
|
3
|
-
category:
|
|
4
|
-
|
|
5
|
-
figma-file: ""
|
|
6
|
-
related: [Page, Footer, Tabs, Button]
|
|
3
|
+
category: Header
|
|
4
|
+
related: [HeaderPage]
|
|
7
5
|
tokens: []
|
|
8
|
-
stories: stories/
|
|
6
|
+
stories: stories/Header/Header.stories.tsx
|
|
9
7
|
version: "1.0"
|
|
10
8
|
---
|
|
11
9
|
|
|
@@ -13,268 +11,550 @@ version: "1.0"
|
|
|
13
11
|
|
|
14
12
|
## Назначение
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
layout-слот `Header.LayoutSidebar` для размещения контента рядом с сайдбаром.
|
|
14
|
+
Контейнер верхнего блока — заголовок, табы и подзаголовочный контент вверху карточки,
|
|
15
|
+
страницы или произвольного блока. Собственной визуальной оболочки не имеет: не рисует фон,
|
|
16
|
+
рамку и отступы, только даёт разметку и раскладку через составные части.
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
и действиями (паттерн "Title + Controls" + "Tabs + Controls" + Subheader).
|
|
23
|
-
Корневой `Header` не задаёт стилей — только прокидывает `data-tx` на корневой
|
|
24
|
-
`<div>`; вся вёрстка приходит от уровней.
|
|
18
|
+
Наполнение строится уровнями, которые вкладываются в `Header` в нужном порядке:
|
|
25
19
|
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
- `Header.Title` — первый уровень: заголовок, подзаголовок и кнопки действий
|
|
21
|
+
(`Header.Title.Content` и `Header.Title.Controls`);
|
|
22
|
+
- `Header.Tabs` — второй уровень: табы и кнопки действий
|
|
23
|
+
(`Header.Tabs.Content` и `Header.Tabs.Controls`), с отступом сверху 8px;
|
|
24
|
+
- `Header.Subhead` — третий уровень: произвольный контент с вертикальными отступами 24px;
|
|
25
|
+
- `Header.LayoutSidebar` — необязательная раскладка в две колонки
|
|
26
|
+
(`Header.LayoutSidebar.Content` и `Header.LayoutSidebar.Sidebar`), в которую
|
|
27
|
+
оборачиваются уровни, если справа нужна боковая колонка.
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
## Файловая структура
|
|
32
|
-
|
|
33
|
-
```text
|
|
34
|
-
src/components/Header/
|
|
35
|
-
├── Header.tsx # Корень compound, Object.assign уровней
|
|
36
|
-
├── index.ts # Barrel: Header + все под-компоненты
|
|
37
|
-
├── components/
|
|
38
|
-
│ ├── HeaderTitle/
|
|
39
|
-
│ │ ├── HeaderTitle.tsx # Object.assign → Content/Controls
|
|
40
|
-
│ │ ├── HeaderTitleContent.tsx
|
|
41
|
-
│ │ └── HeaderTitleControls.tsx
|
|
42
|
-
│ ├── HeaderTabs/
|
|
43
|
-
│ │ ├── HeaderTabs.tsx # Object.assign → Content/Controls
|
|
44
|
-
│ │ ├── HeaderTabsContent.tsx
|
|
45
|
-
│ │ └── HeaderTabsControls.tsx
|
|
46
|
-
│ ├── HeaderSubheader/
|
|
47
|
-
│ │ └── HeaderSubheader.tsx # withoutPaddings prop
|
|
48
|
-
│ └── HeaderLayoutSidebar/
|
|
49
|
-
│ ├── HeaderLayoutSidebar.tsx # Object.assign → Content/Sidebar
|
|
50
|
-
│ ├── HeaderLayoutSidebarContent.tsx
|
|
51
|
-
│ └── HeaderLayoutSidebarSidebar.tsx
|
|
52
|
-
└── styles/
|
|
53
|
-
├── HeaderTitle.module.less
|
|
54
|
-
├── HeaderTabs.module.less
|
|
55
|
-
├── HeaderSubheader.module.less
|
|
56
|
-
└── HeaderLayoutSidebar.module.less
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Нет собственных `__tests__` в репозитории (проверяется через visual tests
|
|
60
|
-
Page/Header). Нет собственных stories — демонстрация в `stories/Page/HeaderPage.stories.tsx`.
|
|
29
|
+
Ни один уровень не обязателен, порядок задаёт потребитель — сам `Header` рендерит только
|
|
30
|
+
`<div>` с `children`.
|
|
61
31
|
|
|
62
|
-
|
|
32
|
+
Используй когда: нужен верхний блок с заголовком, действиями и табами внутри своего
|
|
33
|
+
контейнера (`Island`, карточка, произвольный блок), и оформление задаёт этот контейнер.
|
|
34
|
+
Не используй когда: нужен заголовок страницы — там `Page.Header` (`HeaderPage`), который в
|
|
35
|
+
зависимости от обязательного `type` либо оборачивает заголовок в карточку (`Island`) и умеет прилипать
|
|
36
|
+
к верхней границе экрана (`EHeaderPageType.FIRST`), либо рендерит голый `Header`
|
|
37
|
+
(`EHeaderPageType.SECOND`).
|
|
63
38
|
|
|
64
39
|
---
|
|
65
40
|
|
|
66
|
-
##
|
|
67
|
-
|
|
68
|
-
```tsx
|
|
69
|
-
<Header>
|
|
70
|
-
<Header.Title>
|
|
71
|
-
<Header.Title.Content>Название страницы</Header.Title.Content>
|
|
72
|
-
<Header.Title.Controls>
|
|
73
|
-
<Button>Действие</Button>
|
|
74
|
-
</Header.Title.Controls>
|
|
75
|
-
</Header.Title>
|
|
76
|
-
|
|
77
|
-
<Header.Tabs>
|
|
78
|
-
<Header.Tabs.Content>
|
|
79
|
-
<TabsLine ... />
|
|
80
|
-
</Header.Tabs.Content>
|
|
81
|
-
<Header.Tabs.Controls>
|
|
82
|
-
<Button>Кнопка у табов</Button>
|
|
83
|
-
</Header.Tabs.Controls>
|
|
84
|
-
</Header.Tabs>
|
|
85
|
-
|
|
86
|
-
<Header.Subhead>Любой произвольный контент</Header.Subhead>
|
|
87
|
-
</Header>
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**Альтернативный layout с сайдбаром:**
|
|
41
|
+
## Варианты и props
|
|
91
42
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
<Header.Tabs>...</Header.Tabs>
|
|
98
|
-
</Header.LayoutSidebar.Content>
|
|
99
|
-
<Header.LayoutSidebar.Sidebar>
|
|
100
|
-
{/* десктоп-only сайдбар */}
|
|
101
|
-
</Header.LayoutSidebar.Sidebar>
|
|
102
|
-
</Header.LayoutSidebar>
|
|
103
|
-
</Header>
|
|
104
|
-
```
|
|
43
|
+
Собственных props у `Header` нет. `IHeaderProps` расширяет `React.HTMLAttributes<HTMLDivElement>`:
|
|
44
|
+
принимаются `children`, `className` и любые HTML-атрибуты div, всё уходит на корневой элемент
|
|
45
|
+
через `...rest`. То же верно для `HeaderTitle`, `HeaderTitleContent`, `HeaderTitleControls`,
|
|
46
|
+
`HeaderTabs`, `HeaderTabsContent`, `HeaderTabsControls`, `HeaderLayoutSidebar`,
|
|
47
|
+
`HeaderLayoutSidebarContent` и `HeaderLayoutSidebarSidebar`.
|
|
105
48
|
|
|
106
|
-
|
|
107
|
-
(`HeaderTitle`, `HeaderTabs`, `HeaderSubheader`, `HeaderLayoutSidebar` и их
|
|
108
|
-
под-компоненты). Обычно предпочтительна запись через точку (`Header.Title.Content`).
|
|
49
|
+
Единственный собственный prop во всём семействе — `withoutPaddings` у `HeaderSubheader`.
|
|
109
50
|
|
|
110
|
-
|
|
51
|
+
### Обязательные props
|
|
111
52
|
|
|
112
|
-
|
|
53
|
+
Обязательных props нет.
|
|
113
54
|
|
|
114
|
-
###
|
|
55
|
+
### Опциональные props
|
|
115
56
|
|
|
116
|
-
| Prop | Тип |
|
|
57
|
+
| Prop | Тип | По умолчанию | Описание |
|
|
117
58
|
|---|---|---|---|
|
|
118
|
-
| `children` | `ReactNode` | — | Обычно `Header.Title
|
|
119
|
-
| `className`, `style`, `...HTMLDivAttributes` | — | — | Стандартные. |
|
|
59
|
+
| `children` | `React.ReactNode` | — | Содержимое заголовка. Обычно составные `Header.Title`, `Header.Tabs` и `Header.Subhead`. |
|
|
120
60
|
|
|
121
|
-
|
|
61
|
+
`HeaderSubheader` (`Header.Subhead`) дополнительно принимает:
|
|
122
62
|
|
|
123
|
-
|
|
63
|
+
| Prop | Тип | По умолчанию | Описание |
|
|
64
|
+
|---|---|---|---|
|
|
65
|
+
| `withoutPaddings` | `boolean` | `false` | Снимает вертикальные отступы 24px. |
|
|
66
|
+
|
|
67
|
+
### Ограничения
|
|
68
|
+
|
|
69
|
+
- Корневой `<div>` у `Header` не получает собственного класса — фон, рамку и внешние отступы
|
|
70
|
+
задаёт контейнер-родитель либо переданный `className`.
|
|
71
|
+
- `Header.LayoutSidebar.Sidebar` не задаёт себе горизонтального отступа от контента: расстояние
|
|
72
|
+
между колонками добавляет потребитель (`className` или `style`). Сама раскладка —
|
|
73
|
+
`display: flex` + `justify-content: space-between` у родителя, `flex-grow: 1` и
|
|
74
|
+
`min-width: 1px` у `Content`.
|
|
75
|
+
- Кнопки действий внутри `Header.Title.Controls` на мобильных отступают от левого края через
|
|
76
|
+
отрицательный `margin-left: -16px` у контейнера и `margin-left: 16px` у прямых потомков
|
|
77
|
+
`> button` и `> [class*="buttonDropdown"]`. Другие обёртки вокруг кнопок этот отступ не получат.
|
|
78
|
+
- `Header.Tabs.Controls` на мобильных обнуляет `margin-left` у прямых `> button` через
|
|
79
|
+
`!important` — переопределить отступ между соседними кнопками снаружи не выйдет.
|
|
124
80
|
|
|
125
|
-
|
|
81
|
+
---
|
|
126
82
|
|
|
127
|
-
|
|
83
|
+
## Дизайн-токены
|
|
128
84
|
|
|
129
|
-
|
|
130
|
-
(
|
|
85
|
+
Компонент не использует CSS-переменные дизайн-токенов: цвета и типографику задают вложенные
|
|
86
|
+
компоненты (`Title`, `Text`, `Button`, `Tabs`) и контейнер-родитель.
|
|
131
87
|
|
|
132
|
-
|
|
88
|
+
Раскладка задаётся литеральными значениями в `styles/`: `margin-top: 8px` у `HeaderTabs`,
|
|
89
|
+
`padding: 24px 0` у `HeaderSubheader`, `padding-left: 24px` у обоих блоков `Controls`
|
|
90
|
+
на десктопе и компенсирующие отступы 16px между кнопками при переносе на мобильных.
|
|
91
|
+
На мобильных (до `@screen-sm-max`) у `HeaderTabs` другие значения: `margin-top: 16px`
|
|
92
|
+
и `gap: 16px`.
|
|
133
93
|
|
|
134
|
-
|
|
135
|
-
+ `.global-HeaderTitleControls { min-width: 0; }`
|
|
94
|
+
---
|
|
136
95
|
|
|
137
|
-
|
|
96
|
+
## Инварианты
|
|
138
97
|
|
|
139
|
-
|
|
140
|
-
|
|
98
|
+
- `forwardRef<HTMLDivElement>` на всех одиннадцати компонентах семейства — не убирать. Ref всегда
|
|
99
|
+
указывает на корневой `<div>`.
|
|
100
|
+
- Корневой элемент — `<div>`; у `Header` он без собственного класса, у остальных — с классами
|
|
101
|
+
из соответствующего `styles/*.module.less` плюс `className` потребителя через `clsx`.
|
|
102
|
+
`className` всегда идёт последним аргументом `clsx` и никогда не затирает собственные классы.
|
|
103
|
+
- `Header` собран через `Object.assign(forwardRef(...), { LayoutSidebar, Subhead, Tabs, Title })`,
|
|
104
|
+
`HeaderTitle` — `{ Content, Controls }`, `HeaderTabs` — `{ Content, Controls }`,
|
|
105
|
+
`HeaderLayoutSidebar` — `{ Content, Sidebar }`. Статические свойства сохранять: на них
|
|
106
|
+
опирается `HeaderPage` (`Page.Header.Title`, `Page.Header.Tabs`, `Page.Header.Subhead`,
|
|
107
|
+
`Page.Header.LayoutSidebar`).
|
|
108
|
+
- `data-tx={process.env.npm_package_version}` на корневом элементе `Header` — маркер версии
|
|
109
|
+
библиотеки, ставится после `...rest`, чтобы потребитель его не перетирал.
|
|
110
|
+
- Классы `global-HeaderTitleContent` и `global-HeaderTitleControls` (оба — `min-width: 0`)
|
|
111
|
+
выставляются в дополнение к основным классам на `HeaderTitleContent` и `HeaderTitleControls`.
|
|
112
|
+
Не удалять: они гасят `min-width: auto` у flex-элементов, без них длинный заголовок
|
|
113
|
+
перестаёт сжиматься и ломает строку.
|
|
114
|
+
- `min-width: 1px` у `.headerTabsContent` и `.headerLayoutSidebarContent` — тот же обход
|
|
115
|
+
`min-width: auto` у flex-элементов. Не удалять: у `.headerTabsContent` это ещё и фикс бага
|
|
116
|
+
с компонентом `Tabs` внутри `HeaderTabs`.
|
|
117
|
+
- `displayName` — `"Header"`, `"HeaderTitle"`, `"HeaderTitleContent"`, `"HeaderTitleControls"`,
|
|
118
|
+
`"HeaderTabs"`, `"HeaderTabsContent"`, `"HeaderTabsControls"`, `"HeaderSubheader"`,
|
|
119
|
+
`"HeaderLayoutSidebar"`, `"HeaderLayoutSidebarContent"`, `"HeaderLayoutSidebarSidebar"`.
|
|
120
|
+
Не менять.
|
|
121
|
+
- Все одиннадцать компонентов и их интерфейсы props идут в barrel `src/components/Header/index.ts` —
|
|
122
|
+
экспорты сохранять. Имя `IHeaderLayoutSidebarSidebarProps` выглядит удвоенным, но это
|
|
123
|
+
публичный API: переименование — breaking change.
|
|
124
|
+
- Имя prop `withoutPaddings` у `HeaderSubheader` — публичный API, не переименовывать.
|
|
125
|
+
- Адаптивное поведение на ширине экрана до `@screen-sm-max` (767px) — часть визуального
|
|
126
|
+
контракта, покрыто скриншотами на viewport `xs`: кнопки `Title.Controls` и `Tabs.Controls`
|
|
127
|
+
переносятся под контент, `HeaderTitle.Content` растягивается на всю ширину,
|
|
128
|
+
`HeaderLayoutSidebar.Sidebar` скрывается (`display: none`).
|
|
141
129
|
|
|
142
|
-
|
|
130
|
+
---
|
|
143
131
|
|
|
144
|
-
|
|
145
|
-
|---|---|---|---|
|
|
146
|
-
| `withoutPaddings` | `boolean` | `false` | Убирает `padding: 24px 0`. |
|
|
132
|
+
## Accessibility
|
|
147
133
|
|
|
148
|
-
|
|
134
|
+
Структурный контейнер без собственного интерактивного поведения и ARIA-ролей. Семантику задаёт
|
|
135
|
+
потребитель через проброшенные атрибуты (`role="banner"`, `aria-label` и т.п.) и через уровень
|
|
136
|
+
заголовка вложенного `Title` (`tag="h1"`). Интерактивность обеспечивают вложенные кнопки, табы
|
|
137
|
+
и ссылки — порядок фокуса совпадает с порядком в DOM.
|
|
149
138
|
|
|
150
|
-
|
|
151
|
-
|
|
139
|
+
Важно: `Header.LayoutSidebar.Sidebar` скрывается на мобильных через `display: none`, поэтому
|
|
140
|
+
её содержимое пропадает и из дерева доступности. Дублируй в `Content` то, что должно оставаться
|
|
141
|
+
доступным на узких экранах.
|
|
152
142
|
|
|
153
143
|
---
|
|
154
144
|
|
|
155
|
-
##
|
|
156
|
-
|
|
157
|
-
### Mobile wrap (Title и Tabs)
|
|
158
|
-
|
|
159
|
-
```less
|
|
160
|
-
@media (max-width: @screen-sm-max) {
|
|
161
|
-
.headerTitle { flex-wrap: wrap; }
|
|
162
|
-
.headerTitleContent { width: 100%; }
|
|
163
|
-
.headerTitleControls {
|
|
164
|
-
padding-left: 0;
|
|
165
|
-
white-space: normal;
|
|
166
|
-
flex-shrink: initial;
|
|
167
|
-
margin-left: -16px; // компенсация Button margin
|
|
168
|
-
> button, > [class*="buttonDropdown"] {
|
|
169
|
-
margin-left: 16px;
|
|
170
|
-
margin-top: 16px;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
Controls переносится на новую строку, отступы между кнопками задаются
|
|
177
|
-
через `margin: 16px` на `<button>` + компенсация `-16px` на контейнере.
|
|
178
|
-
Этот же паттерн использован в `Footer`. Не менять без обновления Button'а.
|
|
145
|
+
## Связанные компоненты
|
|
179
146
|
|
|
180
|
-
|
|
147
|
+
- `HeaderPage` — заголовок страницы (`Page.Header`); рендерит `Header` внутри себя, наследует
|
|
148
|
+
`IHeaderProps` и реэкспортирует статические свойства `Header` как `Page.Header.Title`,
|
|
149
|
+
`Page.Header.Tabs`, `Page.Header.Subhead`, `Page.Header.LayoutSidebar`.
|
|
150
|
+
- `HeaderTitle` (`Header.Title`) — первый уровень: строка с заголовком и кнопками,
|
|
151
|
+
`justify-content: space-between`. Тривиальная обёртка (className + spread + ref),
|
|
152
|
+
отдельного AI.md нет.
|
|
153
|
+
- `HeaderTitleContent` (`Header.Title.Content`) — заголовок и подзаголовок, занимает свободное
|
|
154
|
+
место. Тривиальная обёртка, отдельного AI.md нет.
|
|
155
|
+
- `HeaderTitleControls` (`Header.Title.Controls`) — кнопки действий первого уровня, прижаты
|
|
156
|
+
вправо. Тривиальная обёртка, отдельного AI.md нет.
|
|
157
|
+
- `HeaderTabs` (`Header.Tabs`) — второй уровень: строка с табами и кнопками. Тривиальная
|
|
158
|
+
обёртка, отдельного AI.md нет.
|
|
159
|
+
- `HeaderTabsContent` (`Header.Tabs.Content`) — контейнер табов, `flex-grow: 1`. Тривиальная
|
|
160
|
+
обёртка, отдельного AI.md нет.
|
|
161
|
+
- `HeaderTabsControls` (`Header.Tabs.Controls`) — кнопки действий второго уровня. Тривиальная
|
|
162
|
+
обёртка, отдельного AI.md нет.
|
|
163
|
+
- `HeaderSubheader` (`Header.Subhead`) — третий уровень с произвольным контентом; единственный
|
|
164
|
+
в семействе имеет собственный prop `withoutPaddings`. Отдельного AI.md нет, prop описан выше.
|
|
165
|
+
- `HeaderLayoutSidebar` (`Header.LayoutSidebar`) — раскладка в две колонки. Тривиальная
|
|
166
|
+
обёртка, отдельного AI.md нет.
|
|
167
|
+
- `HeaderLayoutSidebarContent` (`Header.LayoutSidebar.Content`) — основная колонка,
|
|
168
|
+
`flex-grow: 1`. Тривиальная обёртка, отдельного AI.md нет.
|
|
169
|
+
- `HeaderLayoutSidebarSidebar` (`Header.LayoutSidebar.Sidebar`) — боковая колонка, скрыта на
|
|
170
|
+
мобильных. Тривиальная обёртка, отдельного AI.md нет.
|
|
181
171
|
|
|
182
|
-
|
|
183
|
-
.global-HeaderTitleContent { min-width: 0; }
|
|
184
|
-
.global-HeaderTitleControls { min-width: 0; }
|
|
185
|
-
```
|
|
172
|
+
---
|
|
186
173
|
|
|
187
|
-
|
|
188
|
-
префиксом `global-` — это CSS-Modules escape hatch, класс не переименовывается
|
|
189
|
-
при компиляции. Используется для того, чтобы **потребитель мог
|
|
190
|
-
перекрыть стили через глобальный селектор**. Не удалять.
|
|
174
|
+
## Stories
|
|
191
175
|
|
|
192
|
-
|
|
176
|
+
Основные истории: `stories/Header/Header.stories.tsx`
|
|
177
|
+
Файлы примеров: `stories/Header/examples/`
|
|
193
178
|
|
|
194
|
-
|
|
195
|
-
в самом компоненте не используется. Legacy, затачивался под кейс, где
|
|
196
|
-
над Title стоит ссылка "назад". Если встретится — удалять только после
|
|
197
|
-
поиска потребителей.
|
|
179
|
+
Playground не создаётся — у компонента нет настраиваемых props.
|
|
198
180
|
|
|
199
|
-
|
|
181
|
+
| Story | Example file | Что демонстрирует |
|
|
182
|
+
|---|---|---|
|
|
183
|
+
| `Default` | `Default.tsx` | Минимальный заголовок: `Title.Content` с заголовком и подзаголовком плюс две кнопки в `Title.Controls` |
|
|
184
|
+
| `WithTabs` | `WithTabs.tsx` | Два уровня: заголовок и `Tabs` с табами и кнопками действий |
|
|
185
|
+
| `WithSubhead` | `WithSubhead.tsx` | Третий уровень `Subhead` с произвольным контентом под заголовком |
|
|
186
|
+
| `WithoutPaddings` | `WithoutPaddings.tsx` | Сравнение `Subhead` с отступами по умолчанию и с `withoutPaddings` |
|
|
187
|
+
| `WithLayoutSidebar` | `WithLayoutSidebar.tsx` | Раскладка в две колонки: заголовок слева, остаток по счёту в боковой колонке |
|
|
188
|
+
| `Example` | `Example.tsx` | Production-like композиция: все уровни внутри `Island` |
|
|
189
|
+
| `VisualTests` | — | Краевые состояния для скриншотов: заголовок без кнопок, длинный заголовок с тремя кнопками, два `Subhead` рядом, боковая колонка |
|
|
200
190
|
|
|
201
|
-
|
|
202
|
-
`display: none`. Это осознанное решение (сайдбар редко влезает на мобиле).
|
|
203
|
-
Потребителю нужно учитывать это при дублировании контента сайдбара в
|
|
204
|
-
`HeaderSubhead` для mobile.
|
|
191
|
+
---
|
|
205
192
|
|
|
206
|
-
|
|
193
|
+
## История изменений
|
|
207
194
|
|
|
208
|
-
|
|
195
|
+
| Дата | Изменение |
|
|
196
|
+
|---|---|
|
|
197
|
+
| 2026-08-28 | Создан документ. AI-рефакторинг (JSDoc на `children` и `withoutPaddings`, выровнен порядок аргументов `clsx`, удалён мёртвый CSS-селектор `.headerLink` и пустое правило `.headerTitleContent`), unit-тесты на все одиннадцать компонентов, stories по modern pattern. |
|
|
209
198
|
|
|
210
199
|
---
|
|
211
200
|
|
|
212
|
-
##
|
|
201
|
+
## Примеры использования
|
|
213
202
|
|
|
214
|
-
|
|
215
|
-
добавлять padding — это сломает существующие интеграции, где padding
|
|
216
|
-
задаётся Page/Subhead.
|
|
217
|
-
- **Compound через `Object.assign`** — `Header.Title.Content`,
|
|
218
|
-
`Header.Tabs.Controls`, `Header.LayoutSidebar.Sidebar`. Не заменять на children-API.
|
|
219
|
-
- **Barrel `index.ts`** экспортирует все под-компоненты отдельно. Не удалять
|
|
220
|
-
прямые экспорты (`HeaderTitleContent` и т.д.) — ими пользуются потребители.
|
|
221
|
-
- **Имена `global-HeaderTitle*`** — CSS-Modules escape hatch. Не переименовывать.
|
|
222
|
-
- **Mobile wrap стили** ожидают `<button>` с `margin: 16px`. Не менять
|
|
223
|
-
селекторы `> button` и компенсацию `-16px` без согласования с Button.
|
|
224
|
-
- **Sidebar `display: none` на mobile** — контракт с потребителем. Нельзя
|
|
225
|
-
автоматически дублировать контент сайдбара; решение оставлено за консьюмером.
|
|
226
|
-
- **`forwardRef`** на всех уровнях.
|
|
203
|
+
### Default
|
|
227
204
|
|
|
228
|
-
|
|
205
|
+
`stories/Header/examples/Default.tsx`
|
|
229
206
|
|
|
230
|
-
|
|
207
|
+
```tsx
|
|
208
|
+
import React from "react";
|
|
209
|
+
import {
|
|
210
|
+
Header,
|
|
211
|
+
Button,
|
|
212
|
+
EButtonTheme,
|
|
213
|
+
EComponentSize,
|
|
214
|
+
Title,
|
|
215
|
+
ETitleSize,
|
|
216
|
+
Text,
|
|
217
|
+
ETextSize,
|
|
218
|
+
EFontType,
|
|
219
|
+
Gap,
|
|
220
|
+
} from "@sberbusiness/triplex-next";
|
|
221
|
+
|
|
222
|
+
export const Default = () => (
|
|
223
|
+
<Header>
|
|
224
|
+
<Header.Title>
|
|
225
|
+
<Header.Title.Content>
|
|
226
|
+
<Title tag="h1" size={ETitleSize.H1}>
|
|
227
|
+
Заголовок страницы
|
|
228
|
+
</Title>
|
|
229
|
+
<Gap size={8} />
|
|
230
|
+
<Text tag="div" size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
231
|
+
Дополнительное описание страницы
|
|
232
|
+
</Text>
|
|
233
|
+
</Header.Title.Content>
|
|
234
|
+
<Header.Title.Controls>
|
|
235
|
+
<Button size={EComponentSize.MD} theme={EButtonTheme.SECONDARY}>
|
|
236
|
+
Отмена
|
|
237
|
+
</Button>
|
|
238
|
+
<Button size={EComponentSize.MD} theme={EButtonTheme.GENERAL}>
|
|
239
|
+
Сохранить
|
|
240
|
+
</Button>
|
|
241
|
+
</Header.Title.Controls>
|
|
242
|
+
</Header.Title>
|
|
243
|
+
</Header>
|
|
244
|
+
);
|
|
245
|
+
```
|
|
231
246
|
|
|
232
|
-
|
|
233
|
-
потребитель сам оборачивает или передаёт `role="banner"` на корневой Header.
|
|
234
|
-
- `HeaderTitleContent` не рендерит `<h1>`/`<h2>` — потребитель передаёт
|
|
235
|
-
нужный заголовок внутрь. Это осознанно: уровень заголовка зависит от контекста.
|
|
236
|
-
- `HeaderTabsContent` обычно содержит `TabsLine`/`Tabs` — они сами управляют ARIA.
|
|
237
|
-
- Tab-навигация — через интерактивные потомки (Buttons/Tabs). Сам Header не focusable.
|
|
247
|
+
### WithTabs
|
|
238
248
|
|
|
239
|
-
|
|
249
|
+
`stories/Header/examples/WithTabs.tsx`
|
|
240
250
|
|
|
241
|
-
|
|
251
|
+
```tsx
|
|
252
|
+
import React, { useState } from "react";
|
|
253
|
+
import {
|
|
254
|
+
Header,
|
|
255
|
+
Button,
|
|
256
|
+
EButtonTheme,
|
|
257
|
+
EComponentSize,
|
|
258
|
+
Tabs,
|
|
259
|
+
Title,
|
|
260
|
+
ETitleSize,
|
|
261
|
+
Text,
|
|
262
|
+
ETextSize,
|
|
263
|
+
EFontType,
|
|
264
|
+
Gap,
|
|
265
|
+
} from "@sberbusiness/triplex-next";
|
|
266
|
+
|
|
267
|
+
const tabs = [
|
|
268
|
+
{ id: "header-tab-overview", label: "Обзор" },
|
|
269
|
+
{ id: "header-tab-operations", label: "Операции" },
|
|
270
|
+
{ id: "header-tab-documents", label: "Документы" },
|
|
271
|
+
];
|
|
272
|
+
|
|
273
|
+
export const WithTabs = () => {
|
|
274
|
+
const [selectedTabId, setSelectedTabId] = useState("header-tab-overview");
|
|
275
|
+
|
|
276
|
+
return (
|
|
277
|
+
<Header>
|
|
278
|
+
<Header.Title>
|
|
279
|
+
<Header.Title.Content>
|
|
280
|
+
<Title tag="h1" size={ETitleSize.H1}>
|
|
281
|
+
Расчётный счёт
|
|
282
|
+
</Title>
|
|
283
|
+
<Gap size={8} />
|
|
284
|
+
<Text tag="div" size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
285
|
+
40702810300000012345 · Рубли РФ
|
|
286
|
+
</Text>
|
|
287
|
+
</Header.Title.Content>
|
|
288
|
+
</Header.Title>
|
|
289
|
+
|
|
290
|
+
<Header.Tabs>
|
|
291
|
+
<Header.Tabs.Content>
|
|
292
|
+
<Tabs
|
|
293
|
+
tabs={tabs}
|
|
294
|
+
selectedId={selectedTabId}
|
|
295
|
+
onSelectTab={setSelectedTabId}
|
|
296
|
+
size={EComponentSize.MD}
|
|
297
|
+
buttonDropdownAttributes={{ "aria-label": "Другие вкладки" }}
|
|
298
|
+
/>
|
|
299
|
+
</Header.Tabs.Content>
|
|
300
|
+
<Header.Tabs.Controls>
|
|
301
|
+
<Button size={EComponentSize.MD} theme={EButtonTheme.SECONDARY}>
|
|
302
|
+
Реквизиты
|
|
303
|
+
</Button>
|
|
304
|
+
<Button size={EComponentSize.MD} theme={EButtonTheme.GENERAL}>
|
|
305
|
+
Создать платёж
|
|
306
|
+
</Button>
|
|
307
|
+
</Header.Tabs.Controls>
|
|
308
|
+
</Header.Tabs>
|
|
309
|
+
</Header>
|
|
310
|
+
);
|
|
311
|
+
};
|
|
312
|
+
```
|
|
242
313
|
|
|
243
|
-
|
|
244
|
-
(`Button`, `TabsLine`, `Typography`).
|
|
314
|
+
### WithSubhead
|
|
245
315
|
|
|
246
|
-
|
|
316
|
+
`stories/Header/examples/WithSubhead.tsx`
|
|
247
317
|
|
|
248
|
-
|
|
318
|
+
```tsx
|
|
319
|
+
import React from "react";
|
|
320
|
+
import {
|
|
321
|
+
Header,
|
|
322
|
+
Button,
|
|
323
|
+
EButtonTheme,
|
|
324
|
+
EComponentSize,
|
|
325
|
+
Title,
|
|
326
|
+
ETitleSize,
|
|
327
|
+
Text,
|
|
328
|
+
ETextSize,
|
|
329
|
+
EFontType,
|
|
330
|
+
} from "@sberbusiness/triplex-next";
|
|
331
|
+
|
|
332
|
+
export const WithSubhead = () => (
|
|
333
|
+
<Header>
|
|
334
|
+
<Header.Title>
|
|
335
|
+
<Header.Title.Content>
|
|
336
|
+
<Title tag="h1" size={ETitleSize.H1}>
|
|
337
|
+
Платёжное поручение № 145
|
|
338
|
+
</Title>
|
|
339
|
+
</Header.Title.Content>
|
|
340
|
+
<Header.Title.Controls>
|
|
341
|
+
<Button size={EComponentSize.MD} theme={EButtonTheme.GENERAL}>
|
|
342
|
+
Подписать
|
|
343
|
+
</Button>
|
|
344
|
+
</Header.Title.Controls>
|
|
345
|
+
</Header.Title>
|
|
346
|
+
|
|
347
|
+
<Header.Subhead>
|
|
348
|
+
<Text tag="div" size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
349
|
+
Документ создан 12.05.2026 · Ожидает подписи
|
|
350
|
+
</Text>
|
|
351
|
+
</Header.Subhead>
|
|
352
|
+
</Header>
|
|
353
|
+
);
|
|
354
|
+
```
|
|
249
355
|
|
|
250
|
-
|
|
251
|
-
- `Footer` — парный элемент, такая же mobile wrap-логика в `Controls`.
|
|
252
|
-
- `TabsLine` / `Tabs` — типичный контент `HeaderTabsContent`.
|
|
253
|
-
- `Button` / `ButtonDropdown` — ожидаемые дети `Controls` (mobile стили
|
|
254
|
-
рассчитаны на их margin).
|
|
255
|
-
- `DocumentNumberEdit` — используется в `Header.Title.Content` для кейсов с
|
|
256
|
-
редактируемым номером документа.
|
|
356
|
+
### WithoutPaddings
|
|
257
357
|
|
|
258
|
-
|
|
358
|
+
`stories/Header/examples/WithoutPaddings.tsx`
|
|
259
359
|
|
|
260
|
-
|
|
360
|
+
```tsx
|
|
361
|
+
import React from "react";
|
|
362
|
+
import { Header, Title, ETitleSize, Text, ETextSize, EFontType } from "@sberbusiness/triplex-next";
|
|
363
|
+
|
|
364
|
+
export const WithoutPaddings = () => (
|
|
365
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
|
|
366
|
+
<div>
|
|
367
|
+
<div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: 700 }}>
|
|
368
|
+
По умолчанию — вертикальные отступы 24px
|
|
369
|
+
</div>
|
|
370
|
+
<Header>
|
|
371
|
+
<Header.Title>
|
|
372
|
+
<Header.Title.Content>
|
|
373
|
+
<Title tag="h2" size={ETitleSize.H2}>
|
|
374
|
+
Заголовок
|
|
375
|
+
</Title>
|
|
376
|
+
</Header.Title.Content>
|
|
377
|
+
</Header.Title>
|
|
378
|
+
{/* Пунктир на обёртке — только для наглядности границ отступов. */}
|
|
379
|
+
<div style={{ outline: "1px dashed currentColor" }}>
|
|
380
|
+
<Header.Subhead>
|
|
381
|
+
<Text tag="div" size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
382
|
+
Произвольный контент третьего уровня
|
|
383
|
+
</Text>
|
|
384
|
+
</Header.Subhead>
|
|
385
|
+
</div>
|
|
386
|
+
</Header>
|
|
387
|
+
</div>
|
|
388
|
+
<div>
|
|
389
|
+
<div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: 700 }}>
|
|
390
|
+
withoutPaddings — отступы сняты
|
|
391
|
+
</div>
|
|
392
|
+
<Header>
|
|
393
|
+
<Header.Title>
|
|
394
|
+
<Header.Title.Content>
|
|
395
|
+
<Title tag="h2" size={ETitleSize.H2}>
|
|
396
|
+
Заголовок
|
|
397
|
+
</Title>
|
|
398
|
+
</Header.Title.Content>
|
|
399
|
+
</Header.Title>
|
|
400
|
+
{/* Пунктир на обёртке — только для наглядности границ отступов. */}
|
|
401
|
+
<div style={{ outline: "1px dashed currentColor" }}>
|
|
402
|
+
<Header.Subhead withoutPaddings>
|
|
403
|
+
<Text tag="div" size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
404
|
+
Произвольный контент третьего уровня
|
|
405
|
+
</Text>
|
|
406
|
+
</Header.Subhead>
|
|
407
|
+
</div>
|
|
408
|
+
</Header>
|
|
409
|
+
</div>
|
|
410
|
+
</div>
|
|
411
|
+
);
|
|
412
|
+
```
|
|
261
413
|
|
|
262
|
-
|
|
263
|
-
`stories/Page/HeaderPage.stories.tsx` (регистрируется как
|
|
264
|
-
`Components/HeaderPage`):
|
|
414
|
+
### WithLayoutSidebar
|
|
265
415
|
|
|
266
|
-
|
|
267
|
-
- `TypeSecond` — альтернативная раскладка.
|
|
268
|
-
- `WithLinkInTitle` — ссылка "назад" над заголовком.
|
|
269
|
-
- `DocumentNumberEdit` — редактируемый номер документа в Title.
|
|
270
|
-
- `WithTabsAndControls` — Title + Tabs + Controls.
|
|
271
|
-
- `WithSubheader` — с Subhead.
|
|
272
|
-
- `LayoutWithSidebar` — `HeaderLayoutSidebar`.
|
|
416
|
+
`stories/Header/examples/WithLayoutSidebar.tsx`
|
|
273
417
|
|
|
274
|
-
|
|
418
|
+
```tsx
|
|
419
|
+
import React from "react";
|
|
420
|
+
import {
|
|
421
|
+
Header,
|
|
422
|
+
Button,
|
|
423
|
+
EButtonTheme,
|
|
424
|
+
EComponentSize,
|
|
425
|
+
Title,
|
|
426
|
+
ETitleSize,
|
|
427
|
+
Text,
|
|
428
|
+
ETextSize,
|
|
429
|
+
EFontType,
|
|
430
|
+
Gap,
|
|
431
|
+
} from "@sberbusiness/triplex-next";
|
|
432
|
+
|
|
433
|
+
export const WithLayoutSidebar = () => (
|
|
434
|
+
<Header>
|
|
435
|
+
<Header.LayoutSidebar>
|
|
436
|
+
<Header.LayoutSidebar.Content>
|
|
437
|
+
<Header.Title>
|
|
438
|
+
<Header.Title.Content>
|
|
439
|
+
<Title tag="h1" size={ETitleSize.H1}>
|
|
440
|
+
Расчётный счёт
|
|
441
|
+
</Title>
|
|
442
|
+
<Gap size={8} />
|
|
443
|
+
<Text tag="div" size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
444
|
+
40702810300000012345 · Рубли РФ
|
|
445
|
+
</Text>
|
|
446
|
+
</Header.Title.Content>
|
|
447
|
+
<Header.Title.Controls>
|
|
448
|
+
<Button size={EComponentSize.MD} theme={EButtonTheme.GENERAL}>
|
|
449
|
+
Создать платёж
|
|
450
|
+
</Button>
|
|
451
|
+
</Header.Title.Controls>
|
|
452
|
+
</Header.Title>
|
|
453
|
+
</Header.LayoutSidebar.Content>
|
|
454
|
+
|
|
455
|
+
{/* Отступ от контента задаёт потребитель — своя раскладка у Sidebar отсутствует. */}
|
|
456
|
+
<Header.LayoutSidebar.Sidebar style={{ paddingLeft: "24px" }}>
|
|
457
|
+
<Text tag="div" size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
458
|
+
Остаток на счёте
|
|
459
|
+
</Text>
|
|
460
|
+
<Gap size={4} />
|
|
461
|
+
<Title tag="div" size={ETitleSize.H3}>
|
|
462
|
+
1 250 300,45 ₽
|
|
463
|
+
</Title>
|
|
464
|
+
</Header.LayoutSidebar.Sidebar>
|
|
465
|
+
</Header.LayoutSidebar>
|
|
466
|
+
</Header>
|
|
467
|
+
);
|
|
468
|
+
```
|
|
275
469
|
|
|
276
|
-
|
|
470
|
+
### Example
|
|
471
|
+
|
|
472
|
+
`stories/Header/examples/Example.tsx`
|
|
473
|
+
|
|
474
|
+
```tsx
|
|
475
|
+
import React, { useState } from "react";
|
|
476
|
+
import {
|
|
477
|
+
Header,
|
|
478
|
+
Island,
|
|
479
|
+
EIslandType,
|
|
480
|
+
Button,
|
|
481
|
+
EButtonTheme,
|
|
482
|
+
EComponentSize,
|
|
483
|
+
Tabs,
|
|
484
|
+
Title,
|
|
485
|
+
ETitleSize,
|
|
486
|
+
Text,
|
|
487
|
+
ETextSize,
|
|
488
|
+
EFontType,
|
|
489
|
+
Gap,
|
|
490
|
+
} from "@sberbusiness/triplex-next";
|
|
491
|
+
|
|
492
|
+
const tabs = [
|
|
493
|
+
{ id: "account-tab-operations", label: "Операции" },
|
|
494
|
+
{ id: "account-tab-statements", label: "Выписки" },
|
|
495
|
+
{ id: "account-tab-requisites", label: "Реквизиты" },
|
|
496
|
+
];
|
|
497
|
+
|
|
498
|
+
export const Example = () => {
|
|
499
|
+
const [selectedTabId, setSelectedTabId] = useState("account-tab-operations");
|
|
500
|
+
|
|
501
|
+
return (
|
|
502
|
+
<Island type={EIslandType.TYPE_1} size={EComponentSize.MD}>
|
|
503
|
+
<Header>
|
|
504
|
+
<Header.LayoutSidebar>
|
|
505
|
+
<Header.LayoutSidebar.Content>
|
|
506
|
+
<Header.Title>
|
|
507
|
+
<Header.Title.Content>
|
|
508
|
+
<Title tag="h1" size={ETitleSize.H1}>
|
|
509
|
+
Расчётный счёт
|
|
510
|
+
</Title>
|
|
511
|
+
<Gap size={8} />
|
|
512
|
+
<Text tag="div" size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
513
|
+
40702810300000012345 · Рубли РФ
|
|
514
|
+
</Text>
|
|
515
|
+
</Header.Title.Content>
|
|
516
|
+
<Header.Title.Controls>
|
|
517
|
+
<Button size={EComponentSize.MD} theme={EButtonTheme.SECONDARY}>
|
|
518
|
+
Выписка
|
|
519
|
+
</Button>
|
|
520
|
+
<Button size={EComponentSize.MD} theme={EButtonTheme.GENERAL}>
|
|
521
|
+
Создать платёж
|
|
522
|
+
</Button>
|
|
523
|
+
</Header.Title.Controls>
|
|
524
|
+
</Header.Title>
|
|
525
|
+
</Header.LayoutSidebar.Content>
|
|
526
|
+
|
|
527
|
+
<Header.LayoutSidebar.Sidebar style={{ paddingLeft: "24px" }}>
|
|
528
|
+
<Text tag="div" size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
529
|
+
Остаток на счёте
|
|
530
|
+
</Text>
|
|
531
|
+
<Gap size={4} />
|
|
532
|
+
<Title tag="div" size={ETitleSize.H3}>
|
|
533
|
+
1 250 300,45 ₽
|
|
534
|
+
</Title>
|
|
535
|
+
</Header.LayoutSidebar.Sidebar>
|
|
536
|
+
</Header.LayoutSidebar>
|
|
537
|
+
|
|
538
|
+
<Header.Tabs>
|
|
539
|
+
<Header.Tabs.Content>
|
|
540
|
+
<Tabs
|
|
541
|
+
tabs={tabs}
|
|
542
|
+
selectedId={selectedTabId}
|
|
543
|
+
onSelectTab={setSelectedTabId}
|
|
544
|
+
size={EComponentSize.MD}
|
|
545
|
+
buttonDropdownAttributes={{ "aria-label": "Другие вкладки" }}
|
|
546
|
+
/>
|
|
547
|
+
</Header.Tabs.Content>
|
|
548
|
+
</Header.Tabs>
|
|
549
|
+
|
|
550
|
+
<Header.Subhead>
|
|
551
|
+
<Text tag="div" size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
552
|
+
Показаны операции за последние 30 дней
|
|
553
|
+
</Text>
|
|
554
|
+
</Header.Subhead>
|
|
555
|
+
</Header>
|
|
556
|
+
</Island>
|
|
557
|
+
);
|
|
558
|
+
};
|
|
559
|
+
```
|
|
277
560
|
|
|
278
|
-
| Дата | Изменение |
|
|
279
|
-
|---|---|
|
|
280
|
-
| 2026-04-18 | Создан документ |
|