@sberbusiness/triplex-next-mcp-server 1.46.0-beta → 1.50.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 (110) hide show
  1. package/README.md +7 -7
  2. package/bundle/components/Amount.md +2 -1
  3. package/bundle/components/AmountField.md +222 -323
  4. package/bundle/components/Avatar.md +138 -146
  5. package/bundle/components/Badge.md +2 -1
  6. package/bundle/components/BodyPage.md +2 -1
  7. package/bundle/components/Button.md +5 -1
  8. package/bundle/components/ButtonDropdownExtended.md +3 -1
  9. package/bundle/components/ButtonIcon.md +3 -1
  10. package/bundle/components/Calendar.md +3 -1
  11. package/bundle/components/CardAction.md +1 -0
  12. package/bundle/components/CardStatic.md +402 -0
  13. package/bundle/components/CheckboxTree.md +157 -215
  14. package/bundle/components/CheckboxTreeExtended.md +7 -7
  15. package/bundle/components/CheckboxXGroup.md +2 -1
  16. package/bundle/components/Chip.md +2 -1
  17. package/bundle/components/ChipGroup.md +1 -1
  18. package/bundle/components/ChipMonthYearPicker.md +6 -5
  19. package/bundle/components/ChipMultiselect.md +4 -1
  20. package/bundle/components/ChipOptions.md +2 -1
  21. package/bundle/components/ChipSort.md +4 -1
  22. package/bundle/components/ChipSuggest.md +7 -6
  23. package/bundle/components/CollapsibleTree.md +10 -5
  24. package/bundle/components/CollapsibleTreeExtended.md +8 -6
  25. package/bundle/components/ComposedKeyDownListener.md +4 -3
  26. package/bundle/components/Confirm.md +346 -281
  27. package/bundle/components/DateField.md +7 -1
  28. package/bundle/components/DateRange.md +351 -210
  29. package/bundle/components/Divider.md +85 -138
  30. package/bundle/components/DocumentNumberEdit.md +173 -214
  31. package/bundle/components/Dropdown.md +11 -1
  32. package/bundle/components/Ellipsis.md +131 -147
  33. package/bundle/components/FooterPage.md +4 -1
  34. package/bundle/components/FormField.md +13 -5
  35. package/bundle/components/FormGroup.md +3 -2
  36. package/bundle/components/Gap.md +1 -1
  37. package/bundle/components/Header.md +1 -0
  38. package/bundle/components/HeaderPage.md +3 -1
  39. package/bundle/components/HelpBox.md +2 -1
  40. package/bundle/components/IconWrapper.md +10 -6
  41. package/bundle/components/ImageGallery.md +2 -1
  42. package/bundle/components/ImageGalleryExtended.md +2 -1
  43. package/bundle/components/IslandAccordion.md +6 -1
  44. package/bundle/components/KeyDownListener.md +3 -2
  45. package/bundle/components/LightBox.md +15 -1
  46. package/bundle/components/List.md +2 -1
  47. package/bundle/components/ListActionItem.md +2 -1
  48. package/bundle/components/ListItem.md +3 -1
  49. package/bundle/components/ListItemControlsButton.md +2 -1
  50. package/bundle/components/ListItemSelectable.md +2 -1
  51. package/bundle/components/ListMaster.md +2 -2
  52. package/bundle/components/ListMasterFooter.md +2 -1
  53. package/bundle/components/ListMasterHeader.md +2 -1
  54. package/bundle/components/ListSortable.md +2 -1
  55. package/bundle/components/ListSortableItem.md +2 -1
  56. package/bundle/components/ListTableItem.md +10 -7
  57. package/bundle/components/LoaderMiddle.md +5 -1
  58. package/bundle/components/LoaderScreen.md +7 -1
  59. package/bundle/components/LoaderSmall.md +10 -4
  60. package/bundle/components/MaskedField.md +3 -1
  61. package/bundle/components/MediaWidth.md +2 -1
  62. package/bundle/components/MobileView.md +2 -1
  63. package/bundle/components/ModalWindow.md +4 -1
  64. package/bundle/components/MonthYearField.md +19 -5
  65. package/bundle/components/Notification.md +1 -0
  66. package/bundle/components/Overlay.md +7 -2
  67. package/bundle/components/Pagination.md +1 -7
  68. package/bundle/components/Radio.md +238 -115
  69. package/bundle/components/RadioXGroup.md +259 -0
  70. package/bundle/components/RadioYGroup.md +266 -0
  71. package/bundle/components/SegmentedControl.md +505 -158
  72. package/bundle/components/SelectExtendedField.md +2 -1
  73. package/bundle/components/SelectField.md +4 -1
  74. package/bundle/components/Skeleton.md +140 -69
  75. package/bundle/components/Slider.md +389 -97
  76. package/bundle/components/SliderRange.md +486 -105
  77. package/bundle/components/Spoiler.md +245 -63
  78. package/bundle/components/StatusTracker.md +386 -94
  79. package/bundle/components/Step.md +257 -68
  80. package/bundle/components/Stepper.md +355 -102
  81. package/bundle/components/StepperExtended.md +633 -0
  82. package/bundle/components/SuggestField.md +1061 -96
  83. package/bundle/components/SwipeableArea.md +7 -7
  84. package/bundle/components/Tabs.md +266 -92
  85. package/bundle/components/TabsExtended.md +18 -18
  86. package/bundle/components/TabsLine.md +302 -127
  87. package/bundle/components/TagColor.md +187 -66
  88. package/bundle/components/TagGroup.md +184 -48
  89. package/bundle/components/TextField.md +8 -4
  90. package/bundle/components/TextareaField.md +279 -70
  91. package/bundle/components/ThemeProvider.md +2 -1
  92. package/bundle/components/Tooltip.md +6 -3
  93. package/bundle/components/TopOverlay.md +17 -1
  94. package/bundle/components/TreeView.md +16 -7
  95. package/bundle/components/TriggerClickOnKeyDownEvent.md +277 -0
  96. package/bundle/components/UploadZone.md +318 -0
  97. package/bundle/guides/codestyle.md +16 -1
  98. package/bundle/guides/commits.md +47 -1
  99. package/bundle/guides/context.md +4 -1
  100. package/bundle/guides/tests.md +23 -2
  101. package/bundle/manifest.json +78 -29
  102. package/bundle/release-notes/1.47.0.mdx +115 -0
  103. package/bundle/release-notes/1.48.0.mdx +68 -0
  104. package/bundle/release-notes/1.49.0.mdx +85 -0
  105. package/bundle/release-notes/1.50.0.mdx +35 -0
  106. package/bundle/release-notes/1.51.0.mdx +7 -0
  107. package/bundle/tokens.json +163 -13
  108. package/dist/index.js +220 -6
  109. package/dist/index.js.map +1 -1
  110. package/package.json +1 -1
@@ -1,11 +1,9 @@
1
1
  ---
2
2
  component: Avatar
3
- category: Avatars
4
- figma-node: ""
5
- figma-file: ""
6
- related: [Badge, IconWrapper]
3
+ category: Avatar
4
+ related: []
7
5
  tokens:
8
- - --triplex-next-Avatar-Background
6
+ - Avatar.Background
9
7
  stories: stories/Avatar/Avatar.stories.tsx
10
8
  version: "1.0"
11
9
  ---
@@ -14,191 +12,162 @@ version: "1.0"
14
12
 
15
13
  ## Назначение
16
14
 
17
- Контейнер-"плитка" для представления пользовательской идентичности: картинки
18
- профиля, инициалов, иконки или любого другого ReactNode. Задаёт квадратные
19
- размеры, скруглённые углы и фоновый цвет. Сам по себе никакого контента не
20
- рендерит — только обёртка со стилями; визуальное наполнение — через children.
15
+ Квадратный контейнер фиксированного размера со скруглением и фоном-подложкой —
16
+ визуальное представление пользователя, организации или сущности. Собственного
17
+ содержимого не рисует: изображение, инициалы или иконка передаются потребителем.
21
18
 
22
- Размер шкалы (XXS → XXL) покрывает от маленькой иконки в списке до большого
23
- hero-аватара в профиле.
24
-
25
- Используй когда: нужно представить пользователя/сущность в виде стандартного
26
- квадратного блока с картинкой или инициалами.
27
- Не используй когда: нужен только круглый avatar — в этой реализации формы
28
- фиксированы (squircle с разными radius), круг не предусмотрен. Если нужны
29
- инициалы с авто-генерацией — это задача потребителя, компонент не рендерит текст.
30
-
31
- ---
32
-
33
- ## Файловая структура
34
-
35
- ```text
36
- src/components/Avatar/
37
- ├── Avatar.tsx # React.forwardRef, минимальная обёртка
38
- ├── enums.ts # EAvatarSize (XXS, XS, SM, MD, LG, XL, XXL)
39
- ├── types.ts # IAvatarProps
40
- ├── index.ts # Barrel: enums + types + Avatar
41
- ├── styles/Avatar.module.less # Размеры + border-radius + фон
42
- └── __tests__/Avatar.test.tsx
43
- ```
44
-
45
- Особенности:
46
- - **Типы и enum вынесены в отдельные файлы** (`types.ts`, `enums.ts`) —
47
- это паттерн более крупных компонентов, здесь избыточен, но сохранён для
48
- единообразия. Не сводить в один файл без общего рефакторинга стайл-гайда.
49
- - **Нет helpers, нет subcomponents** — компонент максимально тонкий.
19
+ Используй когда: нужно показать изображение профиля, инициалы или иконку в
20
+ одном из семи типовых размеров — в шапке, в карточке, в списке, рядом с именем.
21
+ Не используй когда: нужен произвольный размер или неквадратная форма —
22
+ `Avatar` жёстко задаёт `width`/`height` и не тянется по содержимому;
23
+ нужна кликабельность или состояние выбора — оберни `Avatar` в интерактивный
24
+ компонент, сам он остаётся неинтерактивным `<div>`.
50
25
 
51
26
  ---
52
27
 
53
28
  ## Варианты и props
54
29
 
55
- ### `IAvatarProps extends React.HTMLAttributes<HTMLDivElement>`
30
+ Оба собственных props — **обязательные**, значений по умолчанию нет: размер и
31
+ скругление всегда задаёт потребитель явно.
56
32
 
57
- | Prop | Тип | Обязателен | Описание |
58
- |---|---|---|---|
59
- | `size` | `EAvatarSize` | **Да** | Размер + скругление углов. Нет значения по умолчанию — потребитель обязан указать. |
60
- | `children` | `React.ReactNode` | Нет | Содержимое (через `...HTMLAttributes`). Обычно `<img>`, `<svg>`, `<Text>` или их комбинация. Overflow скрывается (`overflow: hidden`) — контент обрезается по форме. |
61
- | `className` | `string` | Нет | Объединяется с `styles.avatar + sizeClass` через `clsx`. |
62
- | `...HTMLDivAttributes` | — | — | Все стандартные атрибуты `<div>`, включая `onClick`, `role`, `aria-*`, `style`. |
33
+ ### Обязательные props
63
34
 
64
- ### `EAvatarSize` — полная шкала
65
-
66
- | Значение | Width/Height | Border-radius |
35
+ | Prop | Тип | Описание |
67
36
  |---|---|---|
68
- | `XXS` | 28px | 6px |
69
- | `XS` | 32px | 8px |
70
- | `SM` | 40px | 10px |
71
- | `MD` | 56px | 16px |
72
- | `LG` | 80px | 20px |
73
- | `XL` | 96px | 24px |
74
- | `XXL` | 128px | 28px |
75
-
76
- Радиусы непропорциональны размеру (MD=56px с radius=16px ≈ 28%, XXL=128px с
77
- radius=28px ≈ 22%). Это **дизайн-решение**, а не формула — не пересчитывать.
78
- Уменьшение относительного радиуса на больших размерах даёт более "квадратный"
79
- squircle-вид на крупных аватарах.
37
+ | `size` | `EAvatarSize` | Размер стороны квадрата |
38
+ | `borderRadius` | `TAvatarBorderRadius` | Радиус скругления, px |
80
39
 
81
- ---
40
+ ### Размеры (`EAvatarSize`)
82
41
 
83
- ## Ключевые особенности реализации
42
+ | Значение | Сторона |
43
+ |---|---|
44
+ | `XXS` | 28px |
45
+ | `XS` | 32px |
46
+ | `SM` | 40px |
47
+ | `MD` | 56px |
48
+ | `LG` | 80px |
49
+ | `XL` | 96px |
50
+ | `XXL` | 128px |
84
51
 
85
- ### flex-центрирование контента
52
+ Ширина и высота равны — компонент всегда квадратный, содержимое центрируется
53
+ по обеим осям через `flex`.
86
54
 
87
- ```less
88
- .avatar {
89
- display: flex;
90
- align-items: center;
91
- justify-content: center;
92
- overflow: hidden;
93
- }
94
- ```
55
+ ### Радиус скругления (`TAvatarBorderRadius`)
95
56
 
96
- Любой children центрируется автоматически. Для `<img>` потребитель обычно задаёт
97
- `width: 100%; height: 100%; object-fit: cover;` чтобы заполнить всю область —
98
- compon компонент не делает этого сам, намеренно: потребитель может показать
99
- маленькую иконку по центру, а не растянутое изображение.
57
+ Union числовых литералов `6 | 8 | 10 | 12 | 16`, а не enum: значение
58
+ передаётся числом (`borderRadius={12}`). Произвольные радиусы не поддерживаются —
59
+ каждому значению соответствует отдельный CSS-класс. Сочетание размера и радиуса
60
+ ничем не ограничено: любой `borderRadius` допустим с любым `size`.
100
61
 
101
- ### `overflow: hidden` обрезает по форме
62
+ ### Остальные props
102
63
 
103
- Любой child обрезается по squircle-границам. Это ключевое свойство — картинка
104
- автоматически получает скруглённые углы без собственного `border-radius`.
64
+ `IAvatarProps` расширяет `React.HTMLAttributes<HTMLDivElement>`: `className`,
65
+ `style`, `children`, `aria-*`, `data-*` и обработчики событий проходят на
66
+ корневой `<div>` как есть. Собственных обработчиков у компонента нет, поэтому
67
+ переданные ни с чем не конкурируют.
105
68
 
106
- ### `sizeToClassNameMap` — прямой маппинг enum → className
69
+ ### Как задаётся содержимое
107
70
 
108
- ```ts
109
- const sizeToClassNameMap = {
110
- [EAvatarSize.XXS]: styles.xxs,
111
- // ...
112
- };
113
- ```
71
+ Компонент — только оболочка, способ наполнения выбирает потребитель:
72
+
73
+ - **Изображение** — фоном через `style`/`className`
74
+ (`backgroundImage` + `backgroundSize`), см. story `Example`. Корневой элемент
75
+ имеет `overflow: hidden`, поэтому содержимое обрезается по радиусу скругления.
76
+ - **Инициалы** — текстовым компонентом в `children` (в примере — `Title`).
77
+ - **Иконка** — иконкой из `@sberbusiness/icons-next` в `children`.
78
+
79
+ Своего состояния у компонента нет: вывод полностью определяется props.
114
80
 
115
- Объект, не функция. Полный охват всех значений enum (TypeScript проверяет через
116
- Record-тип на ключах). При добавлении нового размера — **обновлять обе точки**:
117
- enum и map.
81
+ ---
118
82
 
119
- ### Фон через CSS-переменную
83
+ ## Дизайн-токены
120
84
 
121
- `background: var(--triplex-next-Avatar-Background)` — единственный токен
122
- компонента. Фон виден, когда children прозрачен или меньше области. Потребитель
123
- может переопределить через `style` или `className` (например, для цветных
124
- avatar'ов с инициалами).
85
+ Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
86
+ «Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Avatar.ts`.
125
87
 
126
- ### `forwardRef` на `<div>`
88
+ ```text
89
+ Avatar.Background
90
+ ```
127
91
 
128
- Ref идёт на root div. Используется для анимаций, позиционирования Tooltip и т.д.
129
- Не убирать.
92
+ Токен задаёт цвет подложки, видимой, пока содержимое не перекрывает её целиком
93
+ (например, под инициалами или иконкой). Собственного цвета текста у компонента
94
+ нет — его определяет вложенный типографический компонент.
130
95
 
131
96
  ---
132
97
 
133
98
  ## Инварианты
134
99
 
135
- - **`forwardRef`** — обязателен. Не убирать.
136
- - **`size` обязателен** — не делать defaultValue, чтобы потребитель явно выбирал
137
- масштаб (избежать случайного использования мелких аватаров в hero-контексте).
138
- - **`EAvatarSize` значения** — публичное API, не переименовывать.
139
- - **Размеры и radius в LESS** — не менять без согласования с дизайнером.
140
- Значения подобраны под токены отступов сетки (28, 32, 40, 56, 80, 96, 128 —
141
- кратны 4/8).
142
- - **`overflow: hidden`** на root — не убирать, от этого зависит скругление
143
- контента.
144
- - **`background: var(--triplex-next-Avatar-Background)`** — единственный
145
- дизайн-токен, не хардкодить цвета.
146
- - **`flex` центрирование** — не менять на grid без согласования, это затрагивает
147
- все потребительские стили внутри Avatar.
148
- - **Компонент — тонкая обёртка, НЕ рендерит children-специфику** (например, не
149
- генерирует инициалы из имени). Всё — на стороне потребителя. Не усложнять.
150
- - **Типы в отдельном файле (`types.ts`)** — сохранять паттерн для консистентности
151
- с другими компонентами, даже если выглядит избыточным.
100
+ - `forwardRef` на компоненте — не убирать; ref всегда указывает на корневой `<div>`.
101
+ - `size` и `borderRadius` — обязательные props. Сделать любой из них
102
+ опциональным со значением по умолчанию — изменение публичного API.
103
+ - Значения `EAvatarSize` (`xxs`…`xxl`) — часть публичного API: строковые
104
+ значения enum видны потребителям, поэтому переименование любого из них —
105
+ ломающее изменение. Дополнительно на совпадение значений с именами
106
+ CSS-классов размеров опираются unit-тесты (`toHaveClass(size)`); сам
107
+ компонент от этого совпадения не зависит — `SIZE_TO_CLASS_NAME_MAP` в
108
+ `Avatar.tsx` сопоставляет их явно.
109
+ - `TAvatarBorderRadius` — именно union числовых литералов. Тип стирается при
110
+ компиляции, рантайм-источника правды у набора нет, поэтому расширение набора
111
+ синхронизируется вручную в шести местах: сам union в `enums.ts`, CSS-класс
112
+ `borderRadius{N}` в `styles/Avatar.module.less`,
113
+ `BORDER_RADIUS_TO_CLASS_NAME_MAP` в `Avatar.tsx`, `BORDER_RADIUSES` в
114
+ `__tests__/Avatar.test.tsx`, `argTypes.borderRadius.options` в
115
+ `stories/Avatar/Avatar.stories.tsx` и `BORDER_RADIUSES` в
116
+ `stories/Avatar/examples/BorderRadiusExample.tsx`. Последний особенно легко
117
+ пропустить: story `BorderRadius` рендерит радиусы по своему списку, поэтому
118
+ новый радиус в ней просто не появится, а visual-тест этого не заметит —
119
+ скриншот останется прежним. Набор перечислен ещё и прозой в
120
+ `docs.description` того же stories-файла — эту строку тоже нужно обновить.
121
+ - Корневой элемент — `<div>` с `overflow: hidden`; содержимое обрезается по
122
+ скруглению, на этом построен вариант с фоновым изображением.
152
123
 
153
124
  ---
154
125
 
155
126
  ## Accessibility
156
127
 
157
- - **Никаких ARIA-ролей по умолчанию** — `<div>` без роли. Если Avatar
158
- интерактивный (clickable), потребитель обязан:
159
- - Передать `role="button"` + `tabIndex={0}` + `onKeyDown` для клавиатуры.
160
- - Или обернуть в `<button>` / `<a>` (с учётом того, что Avatar — div, а div
161
- внутри button валиден, но button внутри div — нет).
162
- - **`<img>` внутри** — alt-текст задаёт потребитель. Avatar не добавляет
163
- `aria-label`, не озвучивает children.
164
- - **Инициалы как children (`<Text>`)** — screen reader прочитает их как текст.
165
- Для полного имени — потребитель может скрыть инициалы от screen reader
166
- (`aria-hidden`) и добавить `aria-label="Иван Иванов"` на Avatar.
167
-
168
- ---
169
-
170
- ## Дизайн-токены
128
+ Неинтерактивный контейнер: собственной роли, фокуса и клавиатурных обработчиков
129
+ у компонента нет, `<div>` остаётся семантически нейтральным.
171
130
 
172
- ```
173
- --triplex-next-Avatar-Background # Фон контейнера
174
- ```
131
+ Смысл содержимого описывает потребитель:
175
132
 
176
- Единственный токен. Цвет контента (иконки, текста) определяется самим
177
- контентом, не компонентом.
133
+ - Аватар несёт информацию (имя пользователя, организация) — одного `aria-label`
134
+ недостаточно: корневой `<div>` без роли попадает в `generic`, а для него
135
+ доступное имя запрещено и скринридером игнорируется. Передай роль,
136
+ поддерживающую имя, вместе с текстом — `role="img"` и `aria-label` (оба уйдут
137
+ в `...rest`) — либо продублируй смысл текстом рядом. Компонент не хардкодит
138
+ текст: библиотека мультиязычная.
139
+ - Аватар декоративен и дублирует находящийся рядом текст — скрой его от
140
+ скринридера через `aria-hidden`.
141
+ - Изображение задаётся фоном, а не `<img>`, поэтому альтернативного текста у него
142
+ нет по умолчанию — если картинка значима, подпись обязательна.
178
143
 
179
144
  ---
180
145
 
181
146
  ## Связанные компоненты
182
147
 
183
- - `Badge` (`src/components/Badge`) — часто комбинируется с Avatar (индикатор
184
- статуса / счётчика в углу). Позиционирование — задача потребителя.
185
- - `IconWrapper` (`src/components/IconWrapper`) — может быть использован внутри
186
- Avatar как children для показа иконки вместо фото.
187
- - `Text` / Typography — используется для рендера инициалов внутри Avatar.
148
+ Отдельного семейства и близких альтернатив у компонента нет — `related` пуст.
149
+
150
+ Типовые соседи в разметке (связь композиционная, не структурная): типографика
151
+ (`Title`, `Text`) для инициалов и подписи рядом с аватаром, иконки из
152
+ `@sberbusiness/icons-next` в качестве содержимого.
188
153
 
189
154
  ---
190
155
 
191
156
  ## Stories
192
157
 
193
- `stories/Avatar/Avatar.stories.tsx`
158
+ Основные истории: `stories/Avatar/Avatar.stories.tsx`
194
159
  Файлы примеров: `stories/Avatar/examples/`
195
160
 
196
161
  | Story | Example file | Что демонстрирует |
197
162
  |---|---|---|
198
- | `Playground` | `PlaygroundExample.tsx` | Интерактивный контроль `size` |
199
- | `Default` | `DefaultExample.tsx` | Базовое использование (XXL) |
200
- | `Sizes` | `SizesExample.tsx` | Все 7 размеров на одной шкале |
201
- | `Example` | `ExampleUsage.tsx` | Композиция с другими компонентами |
163
+ | `Playground` | `PlaygroundExample.tsx` | Интерактивный контроль `size` и `borderRadius` |
164
+ | `Default` | `DefaultExample.tsx` | Пустой аватар XXL со скруглением 12px — базовая подложка |
165
+ | `Sizes` | `SizesExample.tsx` | Все семь размеров от XXS до XXL с подписями |
166
+ | `BorderRadius` | `BorderRadiusExample.tsx` | Все допустимые радиусы скругления: 6 / 8 / 10 / 12 / 16 |
167
+ | `Example` | `ExampleUsage.tsx` | Три способа наполнения: фоновое изображение, инициалы через `Title`, иконка |
168
+
169
+ Имена файлов примеров (`DefaultExample.tsx`, `ExampleUsage.tsx`) — локальный
170
+ legacy-паттерн папки; новые примеры называются по имени story (`Sizes.tsx`).
202
171
 
203
172
  ---
204
173
 
@@ -206,7 +175,7 @@ Ref идёт на root div. Используется для анимаций, п
206
175
 
207
176
  | Дата | Изменение |
208
177
  |---|---|
209
- | 2026-04-18 | Создан документ |
178
+ | 2026-09-14 | Создан документ |
210
179
 
211
180
  ---
212
181
 
@@ -220,7 +189,7 @@ Ref идёт на root div. Используется для анимаций, п
220
189
  import React from "react";
221
190
  import { Avatar, EAvatarSize } from "@sberbusiness/triplex-next";
222
191
 
223
- export const DefaultExample = () => <Avatar size={EAvatarSize.XXL} />;
192
+ export const DefaultExample = () => <Avatar size={EAvatarSize.XXL} borderRadius={12} />;
224
193
  ```
225
194
 
226
195
  ### Sizes
@@ -238,7 +207,29 @@ export const SizesExample = () => (
238
207
  {SIZES.map((size) => (
239
208
  <div key={size} style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
240
209
  <div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{size.toUpperCase()}</div>
241
- <Avatar size={size} />
210
+ <Avatar size={size} borderRadius={12} />
211
+ </div>
212
+ ))}
213
+ </div>
214
+ );
215
+ ```
216
+
217
+ ### BorderRadius
218
+
219
+ `stories/Avatar/examples/BorderRadiusExample.tsx`
220
+
221
+ ```tsx
222
+ import React from "react";
223
+ import { Avatar, EAvatarSize, TAvatarBorderRadius } from "@sberbusiness/triplex-next";
224
+
225
+ const BORDER_RADIUSES: TAvatarBorderRadius[] = [6, 8, 10, 12, 16];
226
+
227
+ export const BorderRadiusExample = () => (
228
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
229
+ {BORDER_RADIUSES.map((borderRadius) => (
230
+ <div key={borderRadius} style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
231
+ <div style={{ marginBottom: "8px", fontSize: "16px", fontWeight: "700" }}>{borderRadius}</div>
232
+ <Avatar size={EAvatarSize.XXL} borderRadius={borderRadius} />
242
233
  </div>
243
234
  ))}
244
235
  </div>
@@ -265,14 +256,15 @@ export const ExampleUsage = () => (
265
256
  <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
266
257
  <Avatar
267
258
  size={EAvatarSize.XXL}
259
+ borderRadius={12}
268
260
  style={{ backgroundImage: "url(assets/images/avatar.png)", backgroundSize: "contain" }}
269
261
  />
270
- <Avatar size={EAvatarSize.XXL} style={{ backgroundColor: "#339FF1" }}>
262
+ <Avatar size={EAvatarSize.XXL} borderRadius={12} style={{ backgroundColor: "#339FF1" }}>
271
263
  <TypographyTitle size={ETitleSize.H1} weight={EFontWeightTitle.REGULAR} type={EFontType.PRIMARY_INVERT}>
272
264
  AA
273
265
  </TypographyTitle>
274
266
  </Avatar>
275
- <Avatar size={EAvatarSize.XXL} style={{ backgroundColor: "#339FF1" }}>
267
+ <Avatar size={EAvatarSize.XXL} borderRadius={12} style={{ backgroundColor: "#339FF1" }}>
276
268
  <DefaulticonStrokePrdIcon32 paletteIndex={7} />
277
269
  </Avatar>
278
270
  </div>
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: Badge
3
3
  category: Badge
4
- related: [Marker, Chip, DropdownListItem, DropdownMobileListItem, TabsLineItem, TabsExtendedTabButton, Text, Caption]
4
+ related: [Marker]
5
5
  tokens:
6
6
  - Badge.Background
7
7
  stories: stories/Badge/Badge.stories.tsx
@@ -214,6 +214,7 @@ Badge.Background
214
214
  | Дата | Изменение |
215
215
  |---|---|
216
216
  | 2026-08-12 | Создан документ. AI-рефакторинг: JSDoc на всех props `IBadgeProps` / `IBadgeDotProps` / `IBadgeContentProps` с указанием размеров в px, в `IBadgeProps` добавлен явный `children` (тип совпадает с унаследованным из `React.HTMLAttributes`), расширены JSDoc компонентов и внутренних обёрток. Unit-тесты расширены с 12 до 45 кейсов: `Badge.test.tsx` вырос с 12 до 23 кейсов, рядом добавлены `BadgeDot.test.tsx` (7), `BadgeContent.test.tsx` (9) и `BadgeAffixes.test.tsx` (6) — покрыты логика снятия отступов контента, нерендеринг частей с falsy-значением, порядок частей разметки, проброс `...rest` и `ref`. Публичный API, DOM-разметка и визуальное поведение не изменены. |
217
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`DropdownListItem`, `DropdownMobileListItem`, `TabsLineItem`, `TabsExtendedTabButton`); из `related` убраны несимметричные имена (`Text`, `Caption`) и потребитель `Chip` — он рендерит `Badge.Dot`, ссылка стоит с его стороны. Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
217
218
 
218
219
  ---
219
220
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: BodyPage
3
3
  category: Page
4
- related: [Page, HeaderPage, FooterPage, Body, Island, LightBox]
4
+ related: [Page, HeaderPage, FooterPage, Body, Island]
5
5
  tokens: []
6
6
  stories: stories/Page/BodyPage/BodyPage.stories.tsx
7
7
  version: "1.0"
@@ -134,6 +134,7 @@ type TBodyPageVerticalMargin = EBodyPageVerticalMargin | IBodyPageVerticalMargin
134
134
  |---|---|
135
135
  | 2026-06-18 | Создан документ. AI-рефакторинг (clsx order, JSDoc), unit-тесты, миграция stories на modern pattern. |
136
136
  | 2026-08-26 | TRI-121: добавлено `EBodyPageVerticalMargin.NONE`; `verticalMargin` принимает объект `{top, bottom}` (обе стороны обязательны) для независимых отступов сверху и снизу. LESS переразбит на односторонние классы. |
137
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны несимметричные имена (`LightBox`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
137
138
 
138
139
  ---
139
140
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: Button
3
3
  category: Buttons
4
- related: [ButtonIcon, ButtonDropdown, ButtonDropdownExtended]
4
+ related: [ButtonIcon, ButtonDropdown, ButtonDropdownExtended, LoaderSmall]
5
5
  tokens:
6
6
  - Button.General_Background_Default
7
7
  - Button.General_Color_Default
@@ -160,6 +160,7 @@ version: "1.0"
160
160
  - `ButtonDropdownExtended` — контейнер для кастомного dropdown с render-функциями
161
161
  - `Loader` (`src/components/Loader`) — используется внутри Button для состояния загрузки
162
162
  - `Dropdown` (`src/components/Dropdown`) — используется внутри ButtonDropdown
163
+ - `LoaderSmall` (`src/components/Loader`) — индикатор загрузки; `Button` рендерит его всегда и вне `loading` прячет обёртку классом
163
164
 
164
165
  ---
165
166
 
@@ -186,12 +187,15 @@ version: "1.0"
186
187
 
187
188
  | Дата | Изменение |
188
189
  |---|---|
190
+ | 2026-10-01 | В правило отступа между соседями (`& + .button, & + .buttonDropdown`) добавлен `& + .buttonDropdownExtended`: `ButtonDropdownExtended` после `Button` получает `@button-siblings-margin-left`. Обратный порядок описан в `ButtonDropdownExtended.module.less`. |
189
191
  | 2026-03-31 | Создан документ (пилот AI-Ready) |
190
192
  | 2026-04-27 | Приведён в соответствие с `docs/ai/template-ai.md`: убраны секции «Файловая структура» и «Ключевые особенности реализации», переструктурированы props, добавлена колонка `Example file` в таблице Stories |
191
193
  | 2026-07-15 | Добавлен `vertical-align: middle` корневому классу `.button` — icon-only кнопка (`icon` без `children`) смещалась по вертикали относительно соседней текстовой кнопки из-за baseline-выравнивания inline-элементов; `middle` также центрирует кнопку относительно строки инлайн-текста |
192
194
  | 2026-07-28 | AI-рефакторинг (TRI-13): codestyle-чистка `Button.tsx` (JSDoc компонента, поясняющие комментарии, эквивалентные упрощения в `clsx`), unit-тесты расширены с 10 до 24 кейсов; публичный API и поведение не изменены |
193
195
  | 2026-07-28 | Правки по ревью PR #481 (TRI-13): исправлена трактовка строкового `aria-expanded="false"` (больше не считается раскрытым состоянием); `size` стал опциональным с default `EComponentSize.MD` (типы приведены в соответствие с реализацией); `ButtonBase` убран из barrel-экспорта `index.ts` — импорт только по прямому пути `components/Button/ButtonBase` |
194
196
  | 2026-08-17 | Добавлен `justify-content: center` корневому классу `.button` — при коротком тексте кнопка растягивается до `min-width`, и содержимое прижималось к левому краю вместо центра |
197
+ | 2026-09-24 | Исправлен баг: иконка не перекрашивалась при наведении на паддинг кнопки (вне тесной обёртки icon+текст), т.к. классы `hoverable`/`active`/`disabled` пакета `@sberbusiness/icons-next` стояли на внутренней `.content`-обёртке вместо корневого `<button>`. Классы возвращены на `<button>` напрямую (без `IconWrapper` — по аналогии с `CollapsibleTreeNodeHeader`, см. `IconWrapper-ai.md` → «Связанные компоненты»): промежуточный вариант через `IconWrapper displayContents` ломал sibling-селектор `.button + .button` (отступ между соседними кнопками, `Button.module.less`) и DOM-контракт у потребителей, полагающихся на `Button` как на буквальный корневой `<button>`. Публичный API не изменён |
198
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): добавлен контракт по рендеру `LoaderSmall` — `Button` рендерит его всегда. `IconWrapper` в `related` не добавлен: `Button` его не использует, классы состояний стоят на корневом `<button>` напрямую (см. запись от 2026-09-24 и `IconWrapper-ai.md`). Публичный API и поведение не затронуты. |
195
199
 
196
200
  ---
197
201
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ButtonDropdownExtended
3
3
  category: Buttons
4
- related: [ButtonDropdown, Button, Dropdown, DropdownList]
4
+ related: [ButtonDropdown, Button, Dropdown]
5
5
  tokens: []
6
6
  stories: stories/Buttons/ButtonDropdownExtended.stories.tsx
7
7
  version: "1.0"
@@ -115,8 +115,10 @@ version: "1.0"
115
115
 
116
116
  | Дата | Изменение |
117
117
  |---|---|
118
+ | 2026-10-01 | Горизонтальный отступ `@button-siblings-margin-left` (12px) между соседними `ButtonDropdownExtended` и между `ButtonDropdownExtended` и `Button` в обоих порядках (`.buttonDropdownExtended + .button`, `+ .buttonDropdownExtended` здесь и `.button + .buttonDropdownExtended` в `Button.module.less`). У `ButtonDropdown` отступ работал и раньше: его корень — тот же `ButtonDropdownExtended`. Классы из соседнего модуля папки `Button` ссылаются по локальному имени: `generateScopedName` хеширует по папке и имени класса. |
118
119
  | 2026-08-31 | Компонент переведён с `React.FC` на `Object.assign(forwardRef(...), {...})` — теперь пробрасывает `ref` на корневой `<div>`, форвард мерджится с внутренним `containerRef`. Базовый тип `IButtonDropdownExtendedComponent` изменился с `React.FC` на `React.ForwardRefExoticComponent`; набор props, статики и DOM не изменились. Понадобилось для `TableBasicSettings`, который рендерит `ButtonDropdownExtended` корнем. |
119
120
  | 2026-07-29 | Создан документ AI-ready для `ButtonDropdownExtended`. AI-рефакторинг без изменения публичного API: режим управления переведён с ref на `useState` (устранены ошибки `react-hooks/refs`), убраны вырожденный тернарник в `useState` и мёртвые проверки `opened` внутри обработчиков, `setOpened && setOpened(...)` заменён на опциональный вызов, добавлены JSDoc. Добавлены unit-тесты и stories по modern pattern. |
121
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`DropdownList`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
120
122
 
121
123
  ---
122
124
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ButtonIcon
3
3
  category: Buttons
4
- related: [Button]
4
+ related: [Button, IconWrapper]
5
5
  tokens:
6
6
  - Button.Icon_Shadow_Focus
7
7
  stories: stories/Buttons/ButtonIcon.stories.tsx
@@ -76,6 +76,7 @@ Button.Icon_Shadow_Focus
76
76
 
77
77
  - `Button` (`src/components/Button/Button.tsx`) — текстовая/универсальная кнопка, используемая вместо `ButtonIcon` когда нужен label.
78
78
  - `ButtonDropdown` (`src/components/Button/ButtonDropdown.tsx`) — использует иконочный паттерн для dots-варианта trigger.
79
+ - `IconWrapper` (`src/components/IconWrapper`) — оборачивает `<button>` в режиме `displayContents`; через неё в иконку уходят состояния `active` / `disabled`.
79
80
 
80
81
  ---
81
82
 
@@ -104,6 +105,7 @@ Button.Icon_Shadow_Focus
104
105
  | 2026-07-08 | Актуализирована таблица Stories: story `Disabled` заменена на `States` (`StatesExample.tsx`). |
105
106
  | 2026-07-15 | `vertical-align: top` заменён на `middle` (синхронно с `Button`) — общая опорная точка для кнопок разной высоты и центрирование относительно строки инлайн-текста. |
106
107
  | 2026-07-30 | AI-рефакторинг: внутренние импорты переведены на относительные, `children` объявлен и задокументирован явно, JSDoc уточнён дефолтами; добавлены unit-тесты `__tests__/ButtonIcon.test.tsx`; в таблицу Stories добавлены отсутствовавшие `VisualTestsSquircle` и `VisualTestsCircle`. Публичный API не изменён. |
108
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): добавлены обратные ссылки (`IconWrapper`). Публичный API и поведение не затронуты. |
107
109
 
108
110
  ---
109
111
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: Calendar
3
3
  category: Date components
4
- related: [DatePickerExtended, DateField, DateRange, MonthYearField, MonthYearRange, ChipDatePicker]
4
+ related: [DatePickerExtended, DateField, MonthYearField, MonthYearRange, ChipDatePicker]
5
5
  tokens:
6
6
  - Calendar.Background
7
7
  - Calendar.View_Header_Color
@@ -202,6 +202,8 @@ Calendar.View_Item_Mark_Critical_Background_Selected_Hover
202
202
  |---|---|
203
203
  | 2026-07-30 | Создан документ. AI-рефакторинг: общие хелперы клавиатурной навигации и сдвига даты в `utils.ts`, чистка дублирования в `CalendarControls` и сетках, JSDoc на публичных типах, `displayName` у субкомпонентов; добавлены unit-тесты (`Calendar`, `CalendarViewItem`, `utils`) |
204
204
  | 2026-07-30 | Исправлены найденные при рефакторинге баги: выбор первой tabbable-ячейки перебирал кандидатов с накоплением шага (в виде годов — месяцами вместо лет; хелпер `getFirstEnabledDate`); заголовок при внешней смене `pickedDate` игнорировал формат вида (`MONTH_YEAR` показывал «March 1970» вместо «1970»); фокус после `PageUp`/`PageDown` не возвращался на tabbable-ячейку, если её позиция сетки не менялась; шаг страницы в `changeTabbableDate`/`changeFocusedDate` переведён на `NAVIGATION_STEPS.page`. Расширения API: `dateFrom`/`dateTo` в `IDateLimitRange` стали опциональными, функциональный `dayHtmlAttributes` допускает `data-*` (`TTdHTMLAttributesWithData`) |
205
+ | 2026-09-29 | Исправлена стилизация: скругление ячеек `MONTHS`- и `YEARS`-видов (`.unitMonth`, `.unitYear`) в обычном режиме приведено к `10px` (было `6px`), совпадает с адаптивным режимом. Разделитель диапазона лет в заголовке (`formatDate`) заменён с `" - "` на короткое тире `"–"` без пробелов (например, `1965–1976` вместо `1965 - 1976`) |
206
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убран `DateRange` — связь только по сценарию использования: `DateRange` рендерит поля выбора даты через render-props (`renderPickerFrom` / `renderPickerTo`) и сам не импортирует ни `Calendar`, ни `DateField`. Пояснение сохранено прозой в «Связанные компоненты». Публичный API и поведение не затронуты. |
205
207
 
206
208
  ---
207
209
 
@@ -228,6 +228,7 @@ Card.Shadow_Focus
228
228
  | Дата | Изменение |
229
229
  |---|---|
230
230
  | 2026-09-10 | Создан документ |
231
+ | 2026-09-28 | Токены `Card.Shadow_Default` и `Card.Shadow_Hover` ссылаются на `Shadow.03`/`Shadow.06` (светлая) и `DarkShadow.03`/`DarkShadow.06` (тёмная) вместо литералов; в тёмной теме теперь есть внешняя тень (раньше `none`). |
231
232
 
232
233
  ---
233
234