@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.
- package/README.md +7 -7
- package/bundle/components/Amount.md +2 -1
- package/bundle/components/AmountField.md +222 -323
- package/bundle/components/Avatar.md +138 -146
- package/bundle/components/Badge.md +2 -1
- package/bundle/components/BodyPage.md +2 -1
- package/bundle/components/Button.md +5 -1
- package/bundle/components/ButtonDropdownExtended.md +3 -1
- package/bundle/components/ButtonIcon.md +3 -1
- package/bundle/components/Calendar.md +3 -1
- package/bundle/components/CardAction.md +1 -0
- package/bundle/components/CardStatic.md +402 -0
- package/bundle/components/CheckboxTree.md +157 -215
- package/bundle/components/CheckboxTreeExtended.md +7 -7
- package/bundle/components/CheckboxXGroup.md +2 -1
- package/bundle/components/Chip.md +2 -1
- package/bundle/components/ChipGroup.md +1 -1
- package/bundle/components/ChipMonthYearPicker.md +6 -5
- package/bundle/components/ChipMultiselect.md +4 -1
- package/bundle/components/ChipOptions.md +2 -1
- package/bundle/components/ChipSort.md +4 -1
- package/bundle/components/ChipSuggest.md +7 -6
- package/bundle/components/CollapsibleTree.md +10 -5
- package/bundle/components/CollapsibleTreeExtended.md +8 -6
- package/bundle/components/ComposedKeyDownListener.md +4 -3
- package/bundle/components/Confirm.md +346 -281
- package/bundle/components/DateField.md +7 -1
- package/bundle/components/DateRange.md +351 -210
- package/bundle/components/Divider.md +85 -138
- package/bundle/components/DocumentNumberEdit.md +173 -214
- package/bundle/components/Dropdown.md +11 -1
- package/bundle/components/Ellipsis.md +131 -147
- package/bundle/components/FooterPage.md +4 -1
- package/bundle/components/FormField.md +13 -5
- package/bundle/components/FormGroup.md +3 -2
- package/bundle/components/Gap.md +1 -1
- package/bundle/components/Header.md +1 -0
- package/bundle/components/HeaderPage.md +3 -1
- package/bundle/components/HelpBox.md +2 -1
- package/bundle/components/IconWrapper.md +10 -6
- package/bundle/components/ImageGallery.md +2 -1
- package/bundle/components/ImageGalleryExtended.md +2 -1
- package/bundle/components/IslandAccordion.md +6 -1
- package/bundle/components/KeyDownListener.md +3 -2
- package/bundle/components/LightBox.md +15 -1
- package/bundle/components/List.md +2 -1
- package/bundle/components/ListActionItem.md +2 -1
- package/bundle/components/ListItem.md +3 -1
- package/bundle/components/ListItemControlsButton.md +2 -1
- package/bundle/components/ListItemSelectable.md +2 -1
- package/bundle/components/ListMaster.md +2 -2
- package/bundle/components/ListMasterFooter.md +2 -1
- package/bundle/components/ListMasterHeader.md +2 -1
- package/bundle/components/ListSortable.md +2 -1
- package/bundle/components/ListSortableItem.md +2 -1
- package/bundle/components/ListTableItem.md +10 -7
- package/bundle/components/LoaderMiddle.md +5 -1
- package/bundle/components/LoaderScreen.md +7 -1
- package/bundle/components/LoaderSmall.md +10 -4
- package/bundle/components/MaskedField.md +3 -1
- package/bundle/components/MediaWidth.md +2 -1
- package/bundle/components/MobileView.md +2 -1
- package/bundle/components/ModalWindow.md +4 -1
- package/bundle/components/MonthYearField.md +19 -5
- package/bundle/components/Notification.md +1 -0
- package/bundle/components/Overlay.md +7 -2
- package/bundle/components/Pagination.md +1 -7
- package/bundle/components/Radio.md +238 -115
- package/bundle/components/RadioXGroup.md +259 -0
- package/bundle/components/RadioYGroup.md +266 -0
- package/bundle/components/SegmentedControl.md +505 -158
- package/bundle/components/SelectExtendedField.md +2 -1
- package/bundle/components/SelectField.md +4 -1
- package/bundle/components/Skeleton.md +140 -69
- package/bundle/components/Slider.md +389 -97
- package/bundle/components/SliderRange.md +486 -105
- package/bundle/components/Spoiler.md +245 -63
- package/bundle/components/StatusTracker.md +386 -94
- package/bundle/components/Step.md +257 -68
- package/bundle/components/Stepper.md +355 -102
- package/bundle/components/StepperExtended.md +633 -0
- package/bundle/components/SuggestField.md +1061 -96
- package/bundle/components/SwipeableArea.md +7 -7
- package/bundle/components/Tabs.md +266 -92
- package/bundle/components/TabsExtended.md +18 -18
- package/bundle/components/TabsLine.md +302 -127
- package/bundle/components/TagColor.md +187 -66
- package/bundle/components/TagGroup.md +184 -48
- package/bundle/components/TextField.md +8 -4
- package/bundle/components/TextareaField.md +279 -70
- package/bundle/components/ThemeProvider.md +2 -1
- package/bundle/components/Tooltip.md +6 -3
- package/bundle/components/TopOverlay.md +17 -1
- package/bundle/components/TreeView.md +16 -7
- package/bundle/components/TriggerClickOnKeyDownEvent.md +277 -0
- package/bundle/components/UploadZone.md +318 -0
- package/bundle/guides/codestyle.md +16 -1
- package/bundle/guides/commits.md +47 -1
- package/bundle/guides/context.md +4 -1
- package/bundle/guides/tests.md +23 -2
- package/bundle/manifest.json +78 -29
- package/bundle/release-notes/1.47.0.mdx +115 -0
- package/bundle/release-notes/1.48.0.mdx +68 -0
- package/bundle/release-notes/1.49.0.mdx +85 -0
- package/bundle/release-notes/1.50.0.mdx +35 -0
- package/bundle/release-notes/1.51.0.mdx +7 -0
- package/bundle/tokens.json +163 -13
- package/dist/index.js +220 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: Avatar
|
|
3
|
-
category:
|
|
4
|
-
|
|
5
|
-
figma-file: ""
|
|
6
|
-
related: [Badge, IconWrapper]
|
|
3
|
+
category: Avatar
|
|
4
|
+
related: []
|
|
7
5
|
tokens:
|
|
8
|
-
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
рендерит — только обёртка со стилями; визуальное наполнение — через children.
|
|
15
|
+
Квадратный контейнер фиксированного размера со скруглением и фоном-подложкой —
|
|
16
|
+
визуальное представление пользователя, организации или сущности. Собственного
|
|
17
|
+
содержимого не рисует: изображение, инициалы или иконка передаются потребителем.
|
|
21
18
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
30
|
+
Оба собственных props — **обязательные**, значений по умолчанию нет: размер и
|
|
31
|
+
скругление всегда задаёт потребитель явно.
|
|
56
32
|
|
|
57
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
| Значение | Width/Height | Border-radius |
|
|
35
|
+
| Prop | Тип | Описание |
|
|
67
36
|
|---|---|---|
|
|
68
|
-
| `
|
|
69
|
-
| `
|
|
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
|
-
|
|
52
|
+
Ширина и высота равны — компонент всегда квадратный, содержимое центрируется
|
|
53
|
+
по обеим осям через `flex`.
|
|
86
54
|
|
|
87
|
-
|
|
88
|
-
.avatar {
|
|
89
|
-
display: flex;
|
|
90
|
-
align-items: center;
|
|
91
|
-
justify-content: center;
|
|
92
|
-
overflow: hidden;
|
|
93
|
-
}
|
|
94
|
-
```
|
|
55
|
+
### Радиус скругления (`TAvatarBorderRadius`)
|
|
95
56
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
57
|
+
Union числовых литералов `6 | 8 | 10 | 12 | 16`, а не enum: значение
|
|
58
|
+
передаётся числом (`borderRadius={12}`). Произвольные радиусы не поддерживаются —
|
|
59
|
+
каждому значению соответствует отдельный CSS-класс. Сочетание размера и радиуса
|
|
60
|
+
ничем не ограничено: любой `borderRadius` допустим с любым `size`.
|
|
100
61
|
|
|
101
|
-
###
|
|
62
|
+
### Остальные props
|
|
102
63
|
|
|
103
|
-
|
|
104
|
-
|
|
64
|
+
`IAvatarProps` расширяет `React.HTMLAttributes<HTMLDivElement>`: `className`,
|
|
65
|
+
`style`, `children`, `aria-*`, `data-*` и обработчики событий проходят на
|
|
66
|
+
корневой `<div>` как есть. Собственных обработчиков у компонента нет, поэтому
|
|
67
|
+
переданные ни с чем не конкурируют.
|
|
105
68
|
|
|
106
|
-
###
|
|
69
|
+
### Как задаётся содержимое
|
|
107
70
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
116
|
-
Record-тип на ключах). При добавлении нового размера — **обновлять обе точки**:
|
|
117
|
-
enum и map.
|
|
81
|
+
---
|
|
118
82
|
|
|
119
|
-
|
|
83
|
+
## Дизайн-токены
|
|
120
84
|
|
|
121
|
-
`
|
|
122
|
-
|
|
123
|
-
может переопределить через `style` или `className` (например, для цветных
|
|
124
|
-
avatar'ов с инициалами).
|
|
85
|
+
Переопределяются через `ThemeProvider` (prop `tokens`) — см. `ThemeProvider-ai.md` →
|
|
86
|
+
«Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/Avatar.ts`.
|
|
125
87
|
|
|
126
|
-
|
|
88
|
+
```text
|
|
89
|
+
Avatar.Background
|
|
90
|
+
```
|
|
127
91
|
|
|
128
|
-
|
|
129
|
-
|
|
92
|
+
Токен задаёт цвет подложки, видимой, пока содержимое не перекрывает её целиком
|
|
93
|
+
(например, под инициалами или иконкой). Собственного цвета текста у компонента
|
|
94
|
+
нет — его определяет вложенный типографический компонент.
|
|
130
95
|
|
|
131
96
|
---
|
|
132
97
|
|
|
133
98
|
## Инварианты
|
|
134
99
|
|
|
135
|
-
-
|
|
136
|
-
-
|
|
137
|
-
|
|
138
|
-
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
158
|
-
|
|
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
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
-
|
|
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` |
|
|
200
|
-
| `Sizes` | `SizesExample.tsx` | Все
|
|
201
|
-
| `
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|