@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.
Files changed (89) 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/CardAction.md +615 -0
  11. package/bundle/components/Checkbox.md +32 -29
  12. package/bundle/components/CheckboxTreeExtended.md +9 -5
  13. package/bundle/components/Chip.md +51 -47
  14. package/bundle/components/ChipMonthYearPicker.md +344 -0
  15. package/bundle/components/ChipMultiselect.md +1251 -0
  16. package/bundle/components/ChipOptions.md +329 -0
  17. package/bundle/components/ChipSort.md +333 -0
  18. package/bundle/components/ChipSuggest.md +587 -0
  19. package/bundle/components/CodeText.md +26 -23
  20. package/bundle/components/Col.md +1 -2
  21. package/bundle/components/CollapsibleTree.md +8 -5
  22. package/bundle/components/DateField.md +222 -303
  23. package/bundle/components/DatePickerExtended.md +3 -1
  24. package/bundle/components/Dropdown.md +33 -28
  25. package/bundle/components/EmptyView.md +12 -5
  26. package/bundle/components/FooterPage.md +6 -2
  27. package/bundle/components/FormField.md +47 -42
  28. package/bundle/components/FormGroup.md +192 -52
  29. package/bundle/components/Header.md +491 -211
  30. package/bundle/components/HeaderPage.md +6 -2
  31. package/bundle/components/HelpBox.md +7 -1
  32. package/bundle/components/ImageGallery.md +33 -34
  33. package/bundle/components/ImageGalleryExtended.md +33 -34
  34. package/bundle/components/Island.md +16 -13
  35. package/bundle/components/IslandAccordion.md +443 -152
  36. package/bundle/components/IslandWidget.md +622 -157
  37. package/bundle/components/LightBox.md +14 -12
  38. package/bundle/components/Link.md +211 -96
  39. package/bundle/components/ListActionItem.md +7 -4
  40. package/bundle/components/ListItem.md +11 -8
  41. package/bundle/components/ListItemControlsButton.md +16 -13
  42. package/bundle/components/ListItemControlsButtonDropdown.md +9 -6
  43. package/bundle/components/ListItemSelectable.md +7 -4
  44. package/bundle/components/ListMasterFooter.md +8 -5
  45. package/bundle/components/ListMasterHeader.md +8 -5
  46. package/bundle/components/ListSortableItem.md +11 -8
  47. package/bundle/components/ListTableItem.md +7 -4
  48. package/bundle/components/LoaderMiddle.md +7 -4
  49. package/bundle/components/LoaderScreen.md +11 -8
  50. package/bundle/components/LoaderSmall.md +7 -4
  51. package/bundle/components/Marker.md +184 -69
  52. package/bundle/components/MarkerStatus.md +206 -88
  53. package/bundle/components/MaskedField.md +4 -5
  54. package/bundle/components/MasterTable.md +602 -0
  55. package/bundle/components/ModalWindow.md +7 -4
  56. package/bundle/components/MonthYearField.md +3 -1
  57. package/bundle/components/MultiselectField.md +2183 -132
  58. package/bundle/components/Notification.md +12 -9
  59. package/bundle/components/Overlay.md +9 -4
  60. package/bundle/components/Page.md +2 -2
  61. package/bundle/components/Pagination.md +15 -8
  62. package/bundle/components/Row.md +1 -1
  63. package/bundle/components/SelectExtendedField.md +3 -3
  64. package/bundle/components/SelectField.md +466 -148
  65. package/bundle/components/SliderExtended.md +39 -36
  66. package/bundle/components/SmallInput.md +194 -51
  67. package/bundle/components/Suggest.md +535 -99
  68. package/bundle/components/SwipeableArea.md +428 -79
  69. package/bundle/components/TableBasic.md +19 -11
  70. package/bundle/components/TabsExtended.md +24 -21
  71. package/bundle/components/Tag.md +6 -2
  72. package/bundle/components/Text.md +28 -25
  73. package/bundle/components/TextField.md +3 -4
  74. package/bundle/components/ThemeProvider.md +50 -1
  75. package/bundle/components/Title.md +26 -23
  76. package/bundle/components/Tooltip.md +24 -21
  77. package/bundle/components/TopOverlay.md +7 -4
  78. package/bundle/guides/codestyle.md +3 -0
  79. package/bundle/guides/context.md +84 -12
  80. package/bundle/guides/guidelines.md +321 -0
  81. package/bundle/guides/template.md +22 -12
  82. package/bundle/manifest.json +75 -17
  83. package/bundle/release-notes/1.45.0.mdx +117 -0
  84. package/bundle/release-notes/1.46.0.mdx +66 -0
  85. package/bundle/release-notes/1.47.0.mdx +7 -0
  86. package/bundle/tokens.json +6362 -0
  87. package/dist/index.js +177 -28
  88. package/dist/index.js.map +1 -1
  89. package/package.json +1 -1
@@ -1,11 +1,9 @@
1
1
  ---
2
2
  component: Header
3
- category: Layout
4
- figma-node: ""
5
- figma-file: ""
6
- related: [Page, Footer, Tabs, Button]
3
+ category: Header
4
+ related: [HeaderPage]
7
5
  tokens: []
8
- stories: stories/Page/HeaderPage.stories.tsx
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
- Разметочный заголовок страницы/контейнера. **Compound с тремя уровнями
17
- композиции:** `Header.Title` (заголовок + действия), `Header.Tabs` (вкладки +
18
- действия) и `Header.Subhead` (произвольный подзаголовок). Плюс отдельный
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
- Не используй как: универсальный `<header>`-тег. Потребитель сам решает,
27
- оборачивать ли во внешний semantic-элемент.
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
- Экспорт в `Page`: `Page.Header` = этот же `Header`.
32
+ Используй когда: нужен верхний блок с заголовком, действиями и табами внутри своего
33
+ контейнера (`Island`, карточка, произвольный блок), и оформление задаёт этот контейнер.
34
+ Не используй когда: нужен заголовок страницы — там `Page.Header` (`HeaderPage`), который в
35
+ зависимости от обязательного `type` либо оборачивает заголовок в карточку (`Island`) и умеет прилипать
36
+ к верхней границе экрана (`EHeaderPageType.FIRST`), либо рендерит голый `Header`
37
+ (`EHeaderPageType.SECOND`).
63
38
 
64
39
  ---
65
40
 
66
- ## Compound-структура
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
- ```tsx
93
- <Header>
94
- <Header.LayoutSidebar>
95
- <Header.LayoutSidebar.Content>
96
- <Header.Title>...</Header.Title>
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
- Все компоненты compound'а также **экспортируются напрямую через barrel**
107
- (`HeaderTitle`, `HeaderTabs`, `HeaderSubheader`, `HeaderLayoutSidebar` и их
108
- под-компоненты). Обычно предпочтительна запись через точку (`Header.Title.Content`).
49
+ Единственный собственный prop во всём семействе — `withoutPaddings` у `HeaderSubheader`.
109
50
 
110
- ---
51
+ ### Обязательные props
111
52
 
112
- ## Варианты и props
53
+ Обязательных props нет.
113
54
 
114
- ### Header — `IHeaderProps extends HTMLAttributes<HTMLDivElement>`
55
+ ### Опциональные props
115
56
 
116
- | Prop | Тип | Default | Описание |
57
+ | Prop | Тип | По умолчанию | Описание |
117
58
  |---|---|---|---|
118
- | `children` | `ReactNode` | — | Обычно `Header.Title`/`Tabs`/`Subhead` или `Header.LayoutSidebar`. |
119
- | `className`, `style`, `...HTMLDivAttributes` | — | — | Стандартные. |
59
+ | `children` | `React.ReactNode` | — | Содержимое заголовка. Обычно составные `Header.Title`, `Header.Tabs` и `Header.Subhead`. |
120
60
 
121
- Корневой `Header` — "прозрачный" `<div>` с `data-tx`. Без собственных CSS-классов.
61
+ `HeaderSubheader` (`Header.Subhead`) дополнительно принимает:
122
62
 
123
- ### Header.Title — `IHeaderTitleProps extends HTMLAttributes<HTMLDivElement>`
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
- `.headerTitle`: `display: flex; justify-content: space-between;`
81
+ ---
126
82
 
127
- ### Header.Title.Content — `IHeaderTitleContentProps`
83
+ ## Дизайн-токены
128
84
 
129
- Имеет два класса: `.headerTitleContent` (локальный) и `.global-HeaderTitleContent`
130
- (глобальный селектор `min-width: 0` для корректного переноса контента внутри flex).
85
+ Компонент не использует CSS-переменные дизайн-токенов: цвета и типографику задают вложенные
86
+ компоненты (`Title`, `Text`, `Button`, `Tabs`) и контейнер-родитель.
131
87
 
132
- ### Header.Title.Controls — `IHeaderTitleControlsProps`
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
- `.headerTitleControls`: `flex-shrink: 0; white-space: nowrap; padding-left: 24px;`
135
- + `.global-HeaderTitleControls { min-width: 0; }`
94
+ ---
136
95
 
137
- ### Header.Tabs / Tabs.Content / Tabs.Controls
96
+ ## Инварианты
138
97
 
139
- Симметрично Title: flex space-between, Content растягивается (`flex-grow: 1`),
140
- Controls — фикс. Аналогичный mobile wrap.
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
- ### Header.Subhead — `IHeaderSubheaderProps`
130
+ ---
143
131
 
144
- | Prop | Тип | Default | Описание |
145
- |---|---|---|---|
146
- | `withoutPaddings` | `boolean` | `false` | Убирает `padding: 24px 0`. |
132
+ ## Accessibility
147
133
 
148
- ### Header.LayoutSidebar / .Content / .Sidebar
134
+ Структурный контейнер без собственного интерактивного поведения и ARIA-ролей. Семантику задаёт
135
+ потребитель через проброшенные атрибуты (`role="banner"`, `aria-label` и т.п.) и через уровень
136
+ заголовка вложенного `Title` (`tag="h1"`). Интерактивность обеспечивают вложенные кнопки, табы
137
+ и ссылки — порядок фокуса совпадает с порядком в DOM.
149
138
 
150
- `.headerLayoutSidebar`: `display: flex; justify-content: space-between;`.
151
- `Content` — `flex-grow: 1; min-width: 1px`. **`Sidebar` на mobile (`max-width: @screen-sm-max`) скрывается** (`display: none`).
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
- ### Глобальные классы `global-HeaderTitleContent` / `global-HeaderTitleControls`
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
- ```less
183
- .global-HeaderTitleContent { min-width: 0; }
184
- .global-HeaderTitleControls { min-width: 0; }
185
- ```
172
+ ---
186
173
 
187
- Необходимы, чтобы внутренние flex-дети корректно сжимались. Имена с
188
- префиксом `global-` — это CSS-Modules escape hatch, класс не переименовывается
189
- при компиляции. Используется для того, чтобы **потребитель мог
190
- перекрыть стили через глобальный селектор**. Не удалять.
174
+ ## Stories
191
175
 
192
- ### `.headerLink + .headerTitle { padding-top: 0 }` — orphan-селектор
176
+ Основные истории: `stories/Header/Header.stories.tsx`
177
+ Файлы примеров: `stories/Header/examples/`
193
178
 
194
- Селектор присутствует в `HeaderTitle.module.less`, но класс `headerLink`
195
- в самом компоненте не используется. Legacy, затачивался под кейс, где
196
- над Title стоит ссылка "назад". Если встретится — удалять только после
197
- поиска потребителей.
179
+ Playground не создаётся — у компонента нет настраиваемых props.
198
180
 
199
- ### Sidebar скрыт на mobile
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
- `HeaderLayoutSidebarSidebar` на `max-width: @screen-sm-max` получает
202
- `display: none`. Это осознанное решение (сайдбар редко влезает на мобиле).
203
- Потребителю нужно учитывать это при дублировании контента сайдбара в
204
- `HeaderSubhead` для mobile.
191
+ ---
205
192
 
206
- ### Все компоненты — `forwardRef`
193
+ ## История изменений
207
194
 
208
- Включая уровни. Ref идёт на корневой `<div>` каждого слоя.
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
- - **Corневой `Header` минимален**: `<div>` + `data-tx`, без стилей. Не
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
- ## Accessibility
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
- - Все уровни — `<div>` без ARIA-ролей. **Нет автосемантики `<header>`**;
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
- - `Page` — типовой контейнер страницы, экспортирует `Page.Header` = этот `Header`.
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
- ## Stories
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
- **Нет собственных stories.** Демонстрация через
263
- `stories/Page/HeaderPage.stories.tsx` (регистрируется как
264
- `Components/HeaderPage`):
414
+ ### WithLayoutSidebar
265
415
 
266
- - `Basic` — базовое использование.
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 | Создан документ |