@sberbusiness/triplex-next-mcp-server 1.50.0-beta → 1.53.1
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 +1 -0
- package/bundle/components/AlertProcess.md +6 -3
- package/bundle/components/AlertProcessSpoiler.md +216 -0
- package/bundle/components/Badge.md +4 -3
- package/bundle/components/ButtonDropdown.md +5 -3
- package/bundle/components/Carousel.md +671 -0
- package/bundle/components/CarouselExtended.md +7 -5
- package/bundle/components/CarouselIndicators.md +666 -0
- package/bundle/components/CarouselItem.md +579 -0
- package/bundle/components/CarouselNextButton.md +633 -0
- package/bundle/components/CarouselPrevButton.md +633 -0
- package/bundle/components/CarouselViewport.md +631 -0
- package/bundle/components/CheckboxTreeExtended.md +21 -7
- package/bundle/components/CheckboxTreeExtendedCheckbox.md +591 -0
- package/bundle/components/CheckboxTreeExtendedNode.md +577 -0
- package/bundle/components/Chip.md +1 -0
- package/bundle/components/ChipDatePicker.md +332 -0
- package/bundle/components/ChipDatePickerTarget.md +316 -0
- package/bundle/components/ChipMonthYearPicker.md +4 -3
- package/bundle/components/ChipMonthYearPickerTarget.md +318 -0
- package/bundle/components/ChipMultiselect.md +63 -73
- package/bundle/components/ChipSelect.md +385 -0
- package/bundle/components/ChipSelectTarget.md +388 -0
- package/bundle/components/ChipSuggest.md +10 -16
- package/bundle/components/ChipSuggestTarget.md +506 -0
- package/bundle/components/CollapsibleTree.md +2 -1
- package/bundle/components/CollapsibleTreeExtended.md +2 -1
- package/bundle/components/DateField.md +4 -2
- package/bundle/components/DatePickerExtended.md +16 -14
- package/bundle/components/DateRange.md +17 -10
- package/bundle/components/Dropdown.md +36 -63
- package/bundle/components/EmptyView.md +9 -4
- package/bundle/components/ExpandAnimation.md +9 -5
- package/bundle/components/FormField.md +1 -1
- package/bundle/components/ImageGallery.md +19 -52
- package/bundle/components/ImageGalleryExtended.md +123 -139
- package/bundle/components/ListItemControlsButtonDropdown.md +3 -2
- package/bundle/components/LoaderSmall.md +5 -4
- package/bundle/components/MonthYearRange.md +334 -0
- package/bundle/components/MultiselectField.md +81 -143
- package/bundle/components/Notification.md +2 -1
- package/bundle/components/NotificationGrouped.md +174 -0
- package/bundle/components/NumberField.md +259 -116
- package/bundle/components/OrderedList.md +149 -112
- package/bundle/components/Overlay.md +3 -2
- package/bundle/components/PageIndicators.md +306 -0
- package/bundle/components/Pagination.md +81 -3
- package/bundle/components/PaginationExtended.md +160 -0
- package/bundle/components/Portal.md +5 -2
- package/bundle/components/Puller.md +375 -0
- package/bundle/components/SMSField.md +277 -102
- package/bundle/components/SelectExtendedField.md +11 -7
- package/bundle/components/SelectField.md +7 -4
- package/bundle/components/SmartSpot.md +259 -0
- package/bundle/components/Step.md +2 -1
- package/bundle/components/Stepper.md +7 -7
- package/bundle/components/Suggest.md +7 -6
- package/bundle/components/SuggestField.md +8 -6
- package/bundle/components/TableBasic.md +12 -14
- package/bundle/components/Tooltip.md +9 -8
- package/bundle/guides/commits.md +4 -1
- package/bundle/guides/context.md +5 -5
- package/bundle/guides/stories.md +29 -21
- package/bundle/manifest.json +145 -13
- package/bundle/release-notes/1.50.0.mdx +4 -0
- package/bundle/release-notes/1.51.0.mdx +57 -0
- package/bundle/release-notes/1.52.0.mdx +55 -0
- package/bundle/release-notes/1.53.0.mdx +60 -0
- package/bundle/release-notes/1.54.0.mdx +45 -0
- package/bundle/release-notes/1.55.0.mdx +7 -0
- package/bundle/tokens.json +377 -222
- package/dist/index.js +39 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,9 +10,6 @@ tokens:
|
|
|
10
10
|
- ImageGallery.Arrow_BorderColor_Default
|
|
11
11
|
- ImageGallery.Arrow_BorderColor_Hover
|
|
12
12
|
- ImageGallery.Arrow_BorderColor_Active
|
|
13
|
-
- ImageGallery.Dot_Background_Default
|
|
14
|
-
- ImageGallery.Dot_Background_Hover
|
|
15
|
-
- ImageGallery.Dot_Background_Active
|
|
16
13
|
- ImageGallery.Thumb_Mask_Background
|
|
17
14
|
stories: stories/ImageGallery/ImageGallery.stories.tsx
|
|
18
15
|
version: "1.0"
|
|
@@ -24,12 +21,12 @@ version: "1.0"
|
|
|
24
21
|
|
|
25
22
|
Готовый пресет галереи изображений поверх `ImageGalleryExtended`. Тонкая
|
|
26
23
|
обёртка: фиксирует стандартную раскладку (крупная картинка `.Main` со стрелками
|
|
27
|
-
навигации + лента миниатюр на десктопе /
|
|
24
|
+
навигации + лента миниатюр на десктопе / индикаторы страниц на мобильном
|
|
28
25
|
через `MobileView`) и добавляет uncontrolled-режим (`defaultId`), которого нет у
|
|
29
26
|
controlled-only контейнера `ImageGalleryExtended`. Изображения задаются массивом
|
|
30
27
|
`items`.
|
|
31
28
|
|
|
32
|
-
Используй когда: нужна типовая галерея «крупная картинка +
|
|
29
|
+
Используй когда: нужна типовая галерея «крупная картинка + миниатюры/индикаторы страниц» без
|
|
33
30
|
кастомизации раскладки — достаточно передать `items` и подписать стрелки.
|
|
34
31
|
Поддерживает и controlled (`selectedId` + `onChange`), и uncontrolled
|
|
35
32
|
(`defaultId`) режимы.
|
|
@@ -68,9 +65,9 @@ controlled-only контейнера `ImageGalleryExtended`. Изображен
|
|
|
68
65
|
| `height` | `'auto' \| number \| string` | `'auto'` | Высота крупной картинки. `'auto'` — фиксированные значения по breakpoint (504px / 264px); число → `px` |
|
|
69
66
|
| `withBlur` | `boolean` | `true` | Блюр-слой копии изображения по краям (для картинок уже вьюпорта) |
|
|
70
67
|
| `showThumbnails` | `boolean` | `true` | Показывать ленту миниатюр (десктоп) |
|
|
71
|
-
| `
|
|
68
|
+
| `showPageIndicators` | `boolean` | `true` | Показывать индикаторы страниц (мобильный) |
|
|
72
69
|
| `thumbnailsProps` | `TImageGalleryThumbnailsProps` | — | Свойства ленты миниатюр (пробрасываются в `.Thumbnails`). Допускают `data-*` |
|
|
73
|
-
| `
|
|
70
|
+
| `pageIndicatorsProps` | `TImageGalleryPageIndicatorsProps` | — | Свойства индикаторов страниц (пробрасываются в `.PageIndicators`). Допускают `data-*` |
|
|
74
71
|
| `...HTMLDivAttributes` | — | — | Пробрасываются на корневой контейнер. Кроме `onChange` (переопределён под смену изображения) |
|
|
75
72
|
|
|
76
73
|
### Controlled vs uncontrolled
|
|
@@ -91,7 +88,8 @@ controlled-only контейнера `ImageGalleryExtended`. Изображен
|
|
|
91
88
|
Собственных стилей и `.less`-файлов у `ImageGallery` нет — вся отрисовка
|
|
92
89
|
делегируется частям `ImageGalleryExtended`. Перечисленные токены принадлежат
|
|
93
90
|
семейству и используются через эти части — группа `ImageGallery` намеренно
|
|
94
|
-
делится обоими семействами.
|
|
91
|
+
делится обоими семействами. Индикаторы страниц на мобильном красятся токенами
|
|
92
|
+
группы `PageIndicators` (см. `PageIndicators-ai.md`).
|
|
95
93
|
|
|
96
94
|
```text
|
|
97
95
|
ImageGallery.Accent_Color
|
|
@@ -103,10 +101,6 @@ ImageGallery.Arrow_BorderColor_Default
|
|
|
103
101
|
ImageGallery.Arrow_BorderColor_Hover
|
|
104
102
|
ImageGallery.Arrow_BorderColor_Active
|
|
105
103
|
|
|
106
|
-
ImageGallery.Dot_Background_Default
|
|
107
|
-
ImageGallery.Dot_Background_Hover
|
|
108
|
-
ImageGallery.Dot_Background_Active
|
|
109
|
-
|
|
110
104
|
ImageGallery.Thumb_Mask_Background
|
|
111
105
|
```
|
|
112
106
|
|
|
@@ -129,10 +123,10 @@ Runtime CSS-переменная высоты крупной картинки
|
|
|
129
123
|
`ImageGalleryExtended` (клик по уже активному изображению не триггерит).
|
|
130
124
|
Потребители на это полагаются.
|
|
131
125
|
- **Публичный API** (имена и сигнатуры props, типы `TImageGalleryArrowProps` /
|
|
132
|
-
`TImageGalleryThumbnailsProps` / `
|
|
126
|
+
`TImageGalleryThumbnailsProps` / `TImageGalleryPageIndicatorsProps`, barrel-экспорты) —
|
|
133
127
|
breaking change при изменении.
|
|
134
|
-
- **Раскладка-пресет фиксирована.** Состав (`.Main` + стрелки +
|
|
135
|
-
через `MobileView`) — суть компонента. Нужна другая раскладка — это
|
|
128
|
+
- **Раскладка-пресет фиксирована.** Состав (`.Main` + стрелки + миниатюры/индикаторы
|
|
129
|
+
страниц через `MobileView`) — суть компонента. Нужна другая раскладка — это
|
|
136
130
|
`ImageGalleryExtended`, а не новый prop здесь.
|
|
137
131
|
|
|
138
132
|
---
|
|
@@ -147,8 +141,9 @@ Runtime CSS-переменная высоты крупной картинки
|
|
|
147
141
|
с клавиатуры); `disabled`-стрелка на границе диапазона не показывается вовсе.
|
|
148
142
|
- **Клавиатура:** `←` / `→` на корневом контейнере переключают активное
|
|
149
143
|
изображение (поведение унаследовано от `ImageGalleryExtended`).
|
|
150
|
-
- **`aria-current="true"`** — на активной
|
|
151
|
-
-
|
|
144
|
+
- **`aria-current="true"`** — на активной миниатюре.
|
|
145
|
+
- **Индикаторы страниц** (мобильный) — WAI-ARIA `tablist`, см. `PageIndicators-ai.md`.
|
|
146
|
+
- **Миниатюры и индикаторы страниц** берут доступное имя из `item.alt`.
|
|
152
147
|
- **Декоративный блюр-слой** (`withBlur`) помечен `aria-hidden="true"` с пустым
|
|
153
148
|
`alt`.
|
|
154
149
|
- **Мобильный свайп** крупного изображения перехватывает горизонтальный жест,
|
|
@@ -163,7 +158,7 @@ Runtime CSS-переменная высоты крупной картинки
|
|
|
163
158
|
и добавляет uncontrolled-режим. Используй Extended напрямую, если нужна
|
|
164
159
|
кастомная раскладка или поведение.
|
|
165
160
|
- `MobileView` — переключает ветку рендера: на десктопе показывает ленту
|
|
166
|
-
миниатюр (`.Thumbnails`), на мобильном —
|
|
161
|
+
миниатюр (`.Thumbnails`), на мобильном — индикаторы страниц (`.PageIndicators`).
|
|
167
162
|
- `LightBox` — типовой сценарий: `onImageClick` открывает изображение в
|
|
168
163
|
лайтбоксе (см. story `InsideLightBox`).
|
|
169
164
|
|
|
@@ -180,11 +175,10 @@ Runtime CSS-переменная высоты крупной картинки
|
|
|
180
175
|
| `Default` | `Default.tsx` | Стандартный пресет: крупная картинка со стрелками + лента миниатюр |
|
|
181
176
|
| `FixedHeight` | `FixedHeight.tsx` | Фиксированная высота крупной картинки (`height={number}`) |
|
|
182
177
|
| `WithoutThumbnails` | `WithoutThumbnails.tsx` | Скрытая лента миниатюр (`showThumbnails={false}`) |
|
|
183
|
-
| `
|
|
184
|
-
| `PropsForwarding` | `PropsForwarding.tsx` | Проброс свойств (включая `data-*`) в стрелки, миниатюры и тики |
|
|
178
|
+
| `PropsForwarding` | `PropsForwarding.tsx` | Проброс свойств (включая `data-*`) в стрелки, миниатюры и индикаторы страниц |
|
|
185
179
|
| `WithoutBlur` | `WithoutBlur.tsx` | Отключённый блюр-слой по краям (`withBlur={false}`) |
|
|
186
180
|
| `InsideLightBox` | `InsideLightBox.tsx` | Открытие активного изображения в `LightBox` по клику (`onImageClick`) |
|
|
187
|
-
| `VisualTests` | `VisualTests.tsx` | Скриншот-регрессия: встроенные стрелки на границах (disabled) +
|
|
181
|
+
| `VisualTests` | `VisualTests.tsx` | Скриншот-регрессия: встроенные стрелки на границах (disabled) + блюр |
|
|
188
182
|
|
|
189
183
|
---
|
|
190
184
|
|
|
@@ -195,6 +189,7 @@ Runtime CSS-переменная высоты крупной картинки
|
|
|
195
189
|
| 2026-05-28 | Создан документ |
|
|
196
190
|
| 2026-08-31 | Удалены неиспользуемые токены `Arrow_Background_Disabled` и `Arrow_BorderColor_Disabled`: неактивная стрелка скрывается (`display: none`), красить нечем |
|
|
197
191
|
| 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны несимметричные имена (`LightBox`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
|
|
192
|
+
| 2026-10-07 | **Breaking:** `showDots`/`dotsProps` → `showPageIndicators`/`pageIndicatorsProps`, мобильные тики заменены индикаторами страниц, удалены токены `Dot_Background_*` |
|
|
198
193
|
|
|
199
194
|
---
|
|
200
195
|
|
|
@@ -271,34 +266,6 @@ export const WithoutThumbnails = () => (
|
|
|
271
266
|
);
|
|
272
267
|
```
|
|
273
268
|
|
|
274
|
-
### WithDots
|
|
275
|
-
|
|
276
|
-
`stories/ImageGallery/examples/WithDots.tsx`
|
|
277
|
-
|
|
278
|
-
```tsx
|
|
279
|
-
import React from "react";
|
|
280
|
-
import { ImageGallery } from "@sberbusiness/triplex-next";
|
|
281
|
-
|
|
282
|
-
const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
283
|
-
id: `photo-${i + 1}`,
|
|
284
|
-
src: `assets/images/imageGallery/0${i + 1}.jpg`,
|
|
285
|
-
alt: `Photo ${i + 1}`,
|
|
286
|
-
}));
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* На мобильном viewport (<768px) лента миниатюр заменяется кликабельными
|
|
290
|
-
* тиками-индикаторами. Максимум 4 тика; картинки распределяются по бакетам.
|
|
291
|
-
*/
|
|
292
|
-
export const WithDots = () => (
|
|
293
|
-
<ImageGallery
|
|
294
|
-
items={ITEMS}
|
|
295
|
-
showDots
|
|
296
|
-
prevArrowProps={{ "aria-label": "Предыдущее изображение" }}
|
|
297
|
-
nextArrowProps={{ "aria-label": "Следующее изображение" }}
|
|
298
|
-
/>
|
|
299
|
-
);
|
|
300
|
-
```
|
|
301
|
-
|
|
302
269
|
### PropsForwarding
|
|
303
270
|
|
|
304
271
|
`stories/ImageGallery/examples/PropsForwarding.tsx`
|
|
@@ -322,9 +289,9 @@ export const PropsForwarding = () => (
|
|
|
322
289
|
id: "image-gallery-thumbnails",
|
|
323
290
|
"data-test-id": "image-gallery-thumbnails",
|
|
324
291
|
}}
|
|
325
|
-
|
|
326
|
-
id: "image-gallery-
|
|
327
|
-
"data-test-id": "image-gallery-
|
|
292
|
+
pageIndicatorsProps={{
|
|
293
|
+
id: "image-gallery-page-indicators",
|
|
294
|
+
"data-test-id": "image-gallery-page-indicators",
|
|
328
295
|
}}
|
|
329
296
|
/>
|
|
330
297
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: ImageGalleryExtended
|
|
3
3
|
category: ImageGalleryExtended
|
|
4
|
-
related: [ImageGallery, MobileView]
|
|
4
|
+
related: [ImageGallery, MobileView, PageIndicators]
|
|
5
5
|
tokens:
|
|
6
6
|
- ImageGallery.Accent_Color
|
|
7
7
|
- ImageGallery.Arrow_Background_Default
|
|
@@ -10,9 +10,6 @@ tokens:
|
|
|
10
10
|
- ImageGallery.Arrow_BorderColor_Default
|
|
11
11
|
- ImageGallery.Arrow_BorderColor_Hover
|
|
12
12
|
- ImageGallery.Arrow_BorderColor_Active
|
|
13
|
-
- ImageGallery.Dot_Background_Default
|
|
14
|
-
- ImageGallery.Dot_Background_Hover
|
|
15
|
-
- ImageGallery.Dot_Background_Active
|
|
16
13
|
- ImageGallery.Thumb_Mask_Background
|
|
17
14
|
stories: stories/ImageGalleryExtended/ImageGalleryExtended.stories.tsx
|
|
18
15
|
version: "1.0"
|
|
@@ -26,14 +23,14 @@ version: "1.0"
|
|
|
26
23
|
массивом `items`, контейнер хранит активный индекс, обрабатывает стрелочную
|
|
27
24
|
навигацию с клавиатуры и раздаёт данные составным частям через React-контекст.
|
|
28
25
|
Раскладка задаётся декларативно — потребитель сам собирает нужные части
|
|
29
|
-
(`.Main`, `.Thumbnails`, `.
|
|
26
|
+
(`.Main`, `.Thumbnails`, `.PageIndicators`, `.Nav`, `.Arrow`, `.Thumb`) в любом порядке.
|
|
30
27
|
|
|
31
28
|
Используй `ImageGalleryExtended` когда: нужен полный контроль над раскладкой и
|
|
32
29
|
поведением галереи (нестандартный порядок частей, кастомные стрелки или
|
|
33
30
|
миниатюры через render-функции, собственное управление активным изображением).
|
|
34
31
|
|
|
35
32
|
Не используй когда: достаточно стандартного пресета «крупная картинка + лента
|
|
36
|
-
миниатюр (десктоп) /
|
|
33
|
+
миниатюр (десктоп) / индикаторы страниц (мобильный)» с uncontrolled-режимом — для этого есть
|
|
37
34
|
готовая обёртка `ImageGallery`.
|
|
38
35
|
|
|
39
36
|
---
|
|
@@ -56,6 +53,10 @@ version: "1.0"
|
|
|
56
53
|
Контейнер controlled-only: своего состояния активного изображения не держит.
|
|
57
54
|
Uncontrolled-режим (`defaultId`) добавляет обёртка `ImageGallery`.
|
|
58
55
|
|
|
56
|
+
Части идут колонкой без `gap`: `.Thumbnails` отделяется `margin-top: 16px`,
|
|
57
|
+
`.PageIndicators` прилегает вплотную (отступ до полоски даёт кнопка-индикатор).
|
|
58
|
+
Отступ своей разметке задаёт потребитель.
|
|
59
|
+
|
|
59
60
|
### `ImageGalleryExtended.Main`
|
|
60
61
|
|
|
61
62
|
Крупное изображение: вьюпорт + накладываемый поверх `children` (обычно `.Nav` со
|
|
@@ -96,6 +97,10 @@ child `.Main`, чтобы стрелки позиционировались по
|
|
|
96
97
|
Горизонтальная лента миниатюр с нативным скроллом и автоцентровкой активной.
|
|
97
98
|
`children` — опциональная **render-функция** миниатюры; по умолчанию рисует
|
|
98
99
|
`.Thumb`. Состояние render-функции: `{ item, index, isActive, ariaLabel, onSelect, ref }`.
|
|
100
|
+
|
|
101
|
+
По дизайну на узком экране (< MD) лента миниатюр заменяется индикаторами
|
|
102
|
+
страниц. Сама часть не переключается — оберни её в `MobileView` с
|
|
103
|
+
`.PageIndicators` в мобильной ветке, как в пресете `ImageGallery` и stories.
|
|
99
104
|
Чтобы автоцентровка работала, проброс `ref` на корневой `<button>` обязателен.
|
|
100
105
|
|
|
101
106
|
### `ImageGalleryExtended.Thumb`
|
|
@@ -110,11 +115,17 @@ child `.Main`, чтобы стрелки позиционировались по
|
|
|
110
115
|
| `item` | `IImageGalleryItemProps` | да | Изображение миниатюры (использует `thumbSrc ?? src`) |
|
|
111
116
|
| `isActive` | `boolean` | да | Активна ли миниатюра (рамка + `aria-current`) |
|
|
112
117
|
|
|
113
|
-
### `ImageGalleryExtended.
|
|
118
|
+
### `ImageGalleryExtended.PageIndicators`
|
|
119
|
+
|
|
120
|
+
Индикаторы страниц (мобильный preset) — обёртка над `PageIndicators`: индикатор
|
|
121
|
+
на каждое изображение, видимо окно из 5. `count`/`activeIndex`/`onChange` берутся
|
|
122
|
+
из контекста, ориентация всегда горизонтальная. При `items.length <= 1` ничего не
|
|
123
|
+
рендерит.
|
|
114
124
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
125
|
+
| Prop | Тип | Обязательный | Описание |
|
|
126
|
+
|---|---|---|---|
|
|
127
|
+
| `indicatorProps` | `TPageIndicatorProps \| TPageIndicatorPropsFactory` | нет | Свойства кнопок-индикаторов. По умолчанию `aria-label` = `item.alt`; значения из `indicatorProps` имеют приоритет |
|
|
128
|
+
| `...HTMLDivAttributes` | — | — | Пробрасываются на корневой `<div role="tablist">` |
|
|
118
129
|
|
|
119
130
|
---
|
|
120
131
|
|
|
@@ -124,7 +135,8 @@ child `.Main`, чтобы стрелки позиционировались по
|
|
|
124
135
|
«Как переопределять токены». Значения по умолчанию — `src/components/DesignTokens/components/ImageGallery.ts`.
|
|
125
136
|
|
|
126
137
|
Токены живут в общей с `ImageGallery` группе `ImageGallery`
|
|
127
|
-
(семейства делят визуальный язык).
|
|
138
|
+
(семейства делят визуальный язык). `.PageIndicators` красится токенами группы
|
|
139
|
+
`PageIndicators` (см. `PageIndicators-ai.md`).
|
|
128
140
|
|
|
129
141
|
```text
|
|
130
142
|
ImageGallery.Accent_Color
|
|
@@ -136,10 +148,6 @@ ImageGallery.Arrow_BorderColor_Default
|
|
|
136
148
|
ImageGallery.Arrow_BorderColor_Hover
|
|
137
149
|
ImageGallery.Arrow_BorderColor_Active
|
|
138
150
|
|
|
139
|
-
ImageGallery.Dot_Background_Default
|
|
140
|
-
ImageGallery.Dot_Background_Hover
|
|
141
|
-
ImageGallery.Dot_Background_Active
|
|
142
|
-
|
|
143
151
|
ImageGallery.Thumb_Mask_Background
|
|
144
152
|
```
|
|
145
153
|
|
|
@@ -157,8 +165,8 @@ Runtime CSS-переменные (задаются компонентом чер
|
|
|
157
165
|
## Инварианты
|
|
158
166
|
|
|
159
167
|
- **`forwardRef`** обязателен на всех публичных частях (`Root`, `.Main`, `.Arrow`,
|
|
160
|
-
`.Thumbnails`, `.Thumb`, `.
|
|
161
|
-
(`<div>` для контейнера/Main/Thumbnails/
|
|
168
|
+
`.Thumbnails`, `.Thumb`, `.PageIndicators`). Target — корневой DOM-элемент части
|
|
169
|
+
(`<div>` для контейнера/Main/Thumbnails/PageIndicators, `<button>` для Arrow/Thumb).
|
|
162
170
|
`.Thumbnails` пробрасывает ref через `useImperativeHandle` на внутренний
|
|
163
171
|
`carouselRef` — это нужно для автоцентровки; не заменять на прямой ref.
|
|
164
172
|
- **Контейнер controlled-only.** Не добавлять внутреннее состояние активного
|
|
@@ -185,10 +193,11 @@ Runtime CSS-переменные (задаются компонентом чер
|
|
|
185
193
|
При навигации стрелками фокус переносится с прежней миниатюры на активную —
|
|
186
194
|
иначе кольцо `:focus-visible` осталось бы на старой одновременно с рамкой
|
|
187
195
|
`.active` новой.
|
|
188
|
-
- **`aria-current`:** активная миниатюра (`.Thumb`)
|
|
189
|
-
|
|
196
|
+
- **`aria-current`:** активная миниатюра (`.Thumb`) получает `aria-current="true"`.
|
|
197
|
+
- **Индикаторы страниц (`.PageIndicators`):** WAI-ARIA `tablist`, см.
|
|
198
|
+
`PageIndicators-ai.md`. Корневой обработчик стрелок их клавиатуру не дублирует.
|
|
190
199
|
- **`aria-label` — обязанность потребителя.** `.Arrow` требует `aria-label`
|
|
191
|
-
явным props; компонент не хардкодит язык. `.Thumb`/`.
|
|
200
|
+
явным props; компонент не хардкодит язык. `.Thumb`/`.PageIndicators` берут доступное имя
|
|
192
201
|
из `item.alt`.
|
|
193
202
|
- **Декоративные изображения** (блюр-слой) помечены `aria-hidden="true"` с пустым
|
|
194
203
|
`alt`.
|
|
@@ -202,11 +211,14 @@ Runtime CSS-переменные (задаются компонентом чер
|
|
|
202
211
|
## Связанные компоненты
|
|
203
212
|
|
|
204
213
|
- `ImageGallery` — тонкая обёртка-пресет над `ImageGalleryExtended`: задаёт
|
|
205
|
-
стандартную раскладку (`.Main` + стрелки +
|
|
214
|
+
стандартную раскладку (`.Main` + стрелки + миниатюры/индикаторы страниц через `MobileView`) и
|
|
206
215
|
добавляет uncontrolled-режим (`defaultId`). Используй её, если кастомная
|
|
207
216
|
раскладка не нужна.
|
|
217
|
+
- `PageIndicators` — рендерится внутри `.PageIndicators`; его props
|
|
218
|
+
(`IPageIndicatorsProps` без `count`/`activeIndex`/`onChange`/`orientation`)
|
|
219
|
+
составляют API части.
|
|
208
220
|
- `MobileView` — переключает десктопную/мобильную ветку рендера внутри `.Main`
|
|
209
|
-
(лента свайпа) и в пресете `ImageGallery` (миниатюры ↔
|
|
221
|
+
(лента свайпа) и в пресете `ImageGallery` (миниатюры ↔ индикаторы страниц).
|
|
210
222
|
- `LightBox` — типовой сценарий: `onImageClick` открывает изображение в лайтбоксе
|
|
211
223
|
(см. story `OpenFromAvatar`).
|
|
212
224
|
|
|
@@ -231,13 +243,12 @@ API (экспортируются из barrel ради композиции, н
|
|
|
231
243
|
| Story | Example file | Что демонстрирует |
|
|
232
244
|
|---|---|---|
|
|
233
245
|
| `Playground` | `Playground.tsx` | Интерактивный контроль `withBlur` / `height` |
|
|
234
|
-
| `Default` | `Default.tsx` | Полный
|
|
235
|
-
| `MainOnly` | `MainOnly.tsx` | Только крупная картинка со стрелками (без
|
|
236
|
-
| `
|
|
237
|
-
| `CustomLayout` | `CustomLayout.tsx` | Произвольный порядок частей + кастомные стрелки и миниатюры через render-функции |
|
|
246
|
+
| `Default` | `Default.tsx` | Полный состав: крупная картинка со стрелками + лента миниатюр (на мобильном — индикаторы через `MobileView`) |
|
|
247
|
+
| `MainOnly` | `MainOnly.tsx` | Только крупная картинка со стрелками (без миниатюр/индикаторов), с блюром |
|
|
248
|
+
| `CustomLayout` | `CustomLayout.tsx` | Render-функции: панель навигации через `.Nav` вместо стрелок, миниатюры с собственным `aria-label` через `.Thumbnails` |
|
|
238
249
|
| `ManyThumbnails` | `ManyThumbnails.tsx` | Большой набор (20 изображений): горизонтальный скролл и автоцентровка ленты миниатюр |
|
|
239
250
|
| `OpenFromAvatar` | `OpenFromAvatar.tsx` | Открытие изображения в `LightBox` по клику (интеграция `onImageClick`) |
|
|
240
|
-
| `VisualTests` | `VisualTests.tsx` | Скриншот-регрессия: стрелки на границах диапазона (disabled)
|
|
251
|
+
| `VisualTests` | `VisualTests.tsx` | Скриншот-регрессия: стрелки на границах диапазона (disabled) |
|
|
241
252
|
|
|
242
253
|
---
|
|
243
254
|
|
|
@@ -248,6 +259,7 @@ API (экспортируются из barrel ради композиции, н
|
|
|
248
259
|
| 2026-05-28 | Создан документ |
|
|
249
260
|
| 2026-08-31 | Удалены неиспользуемые токены `Arrow_Background_Disabled` и `Arrow_BorderColor_Disabled`: неактивная стрелка скрывается (`display: none`), красить нечем |
|
|
250
261
|
| 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны несимметричные имена (`LightBox`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
|
|
262
|
+
| 2026-10-07 | **Breaking:** `.Dots` → `.PageIndicators`, удалены токены `Dot_Background_*`, `gap` корня заменён отступом у `.Thumbnails` |
|
|
251
263
|
|
|
252
264
|
---
|
|
253
265
|
|
|
@@ -258,8 +270,8 @@ API (экспортируются из barrel ради композиции, н
|
|
|
258
270
|
`stories/ImageGalleryExtended/examples/Default.tsx`
|
|
259
271
|
|
|
260
272
|
```tsx
|
|
261
|
-
import React from "react";
|
|
262
|
-
import { ImageGalleryExtended, EImageGalleryArrowDirection } from "@sberbusiness/triplex-next";
|
|
273
|
+
import React, { useState } from "react";
|
|
274
|
+
import { ImageGalleryExtended, EImageGalleryArrowDirection, MobileView } from "@sberbusiness/triplex-next";
|
|
263
275
|
|
|
264
276
|
const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
265
277
|
id: `photo-${i + 1}`,
|
|
@@ -268,11 +280,12 @@ const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
|
268
280
|
}));
|
|
269
281
|
|
|
270
282
|
/**
|
|
271
|
-
* Полный
|
|
283
|
+
* Полный состав: крупная картинка со стрелками + лента миниатюр на десктопе,
|
|
284
|
+
* на мобильном (<768px) лента заменяется индикаторами страниц через `MobileView`.
|
|
272
285
|
* Активный id хранится в состоянии (компонент controlled-only).
|
|
273
286
|
*/
|
|
274
287
|
export const Default = () => {
|
|
275
|
-
const [selectedId, setSelectedId] =
|
|
288
|
+
const [selectedId, setSelectedId] = useState("photo-1");
|
|
276
289
|
|
|
277
290
|
return (
|
|
278
291
|
<ImageGalleryExtended items={ITEMS} selectedId={selectedId} onChange={setSelectedId}>
|
|
@@ -298,7 +311,9 @@ export const Default = () => {
|
|
|
298
311
|
)}
|
|
299
312
|
</ImageGalleryExtended.Nav>
|
|
300
313
|
</ImageGalleryExtended.Main>
|
|
301
|
-
<ImageGalleryExtended.Thumbnails />
|
|
314
|
+
<MobileView fallback={<ImageGalleryExtended.Thumbnails />}>
|
|
315
|
+
<ImageGalleryExtended.PageIndicators />
|
|
316
|
+
</MobileView>
|
|
302
317
|
</ImageGalleryExtended>
|
|
303
318
|
);
|
|
304
319
|
};
|
|
@@ -309,7 +324,7 @@ export const Default = () => {
|
|
|
309
324
|
`stories/ImageGalleryExtended/examples/MainOnly.tsx`
|
|
310
325
|
|
|
311
326
|
```tsx
|
|
312
|
-
import React from "react";
|
|
327
|
+
import React, { useState } from "react";
|
|
313
328
|
import { ImageGalleryExtended, EImageGalleryArrowDirection } from "@sberbusiness/triplex-next";
|
|
314
329
|
|
|
315
330
|
const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
@@ -319,11 +334,11 @@ const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
|
319
334
|
}));
|
|
320
335
|
|
|
321
336
|
/**
|
|
322
|
-
* Только крупная картинка со стрелками — без миниатюр и
|
|
337
|
+
* Только крупная картинка со стрелками — без миниатюр и индикаторов страниц.
|
|
323
338
|
* Навигация доступна стрелками и клавишами `←` / `→`.
|
|
324
339
|
*/
|
|
325
340
|
export const MainOnly = () => {
|
|
326
|
-
const [selectedId, setSelectedId] =
|
|
341
|
+
const [selectedId, setSelectedId] = useState("photo-1");
|
|
327
342
|
|
|
328
343
|
return (
|
|
329
344
|
<ImageGalleryExtended items={ITEMS} selectedId={selectedId} onChange={setSelectedId}>
|
|
@@ -354,43 +369,22 @@ export const MainOnly = () => {
|
|
|
354
369
|
};
|
|
355
370
|
```
|
|
356
371
|
|
|
357
|
-
### WithDots
|
|
358
|
-
|
|
359
|
-
`stories/ImageGalleryExtended/examples/WithDots.tsx`
|
|
360
|
-
|
|
361
|
-
```tsx
|
|
362
|
-
import React from "react";
|
|
363
|
-
import { ImageGalleryExtended } from "@sberbusiness/triplex-next";
|
|
364
|
-
|
|
365
|
-
const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
366
|
-
id: `photo-${i + 1}`,
|
|
367
|
-
src: `assets/images/imageGallery/0${i + 1}.jpg`,
|
|
368
|
-
alt: `Photo ${i + 1}`,
|
|
369
|
-
}));
|
|
370
|
-
|
|
371
|
-
/**
|
|
372
|
-
* Мобильный preset: крупная картинка + ряд тиков-индикаторов вместо ленты
|
|
373
|
-
* миниатюр. Состав частей собирается вручную из примитивов Extended.
|
|
374
|
-
*/
|
|
375
|
-
export const WithDots = () => {
|
|
376
|
-
const [selectedId, setSelectedId] = React.useState("photo-1");
|
|
377
|
-
|
|
378
|
-
return (
|
|
379
|
-
<ImageGalleryExtended items={ITEMS} selectedId={selectedId} onChange={setSelectedId}>
|
|
380
|
-
<ImageGalleryExtended.Main withBlur />
|
|
381
|
-
<ImageGalleryExtended.Dots />
|
|
382
|
-
</ImageGalleryExtended>
|
|
383
|
-
);
|
|
384
|
-
};
|
|
385
|
-
```
|
|
386
|
-
|
|
387
372
|
### CustomLayout
|
|
388
373
|
|
|
389
374
|
`stories/ImageGalleryExtended/examples/CustomLayout.tsx`
|
|
390
375
|
|
|
391
376
|
```tsx
|
|
392
|
-
import React from "react";
|
|
393
|
-
import {
|
|
377
|
+
import React, { useState } from "react";
|
|
378
|
+
import {
|
|
379
|
+
ImageGalleryExtended,
|
|
380
|
+
MobileView,
|
|
381
|
+
Button,
|
|
382
|
+
EButtonTheme,
|
|
383
|
+
EComponentSize,
|
|
384
|
+
Text,
|
|
385
|
+
ETextSize,
|
|
386
|
+
EFontType,
|
|
387
|
+
} from "@sberbusiness/triplex-next";
|
|
394
388
|
|
|
395
389
|
const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
396
390
|
id: `photo-${i + 1}`,
|
|
@@ -399,80 +393,67 @@ const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
|
399
393
|
}));
|
|
400
394
|
|
|
401
395
|
/**
|
|
402
|
-
*
|
|
403
|
-
*
|
|
404
|
-
*
|
|
405
|
-
* проброс `ref`
|
|
406
|
-
*
|
|
396
|
+
* Кастомизация через render-функции: `Nav` отдаёт состояние навигации в панель
|
|
397
|
+
* «Назад · N / Total · Вперёд» под картинкой вместо стрелок поверх неё, а
|
|
398
|
+
* `Thumbnails` рисует стандартные миниатюры с собственным доступным именем
|
|
399
|
+
* (проброс `ref` сохраняет автоцентровку). На мобильном (<768px) лента миниатюр
|
|
400
|
+
* заменяется индикаторами страниц через `MobileView`.
|
|
407
401
|
*/
|
|
408
402
|
export const CustomLayout = () => {
|
|
409
|
-
const [selectedId, setSelectedId] =
|
|
403
|
+
const [selectedId, setSelectedId] = useState("photo-1");
|
|
410
404
|
|
|
411
405
|
return (
|
|
412
406
|
<ImageGalleryExtended items={ITEMS} selectedId={selectedId} onChange={setSelectedId}>
|
|
413
|
-
<ImageGalleryExtended.
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
gap: 12,
|
|
430
|
-
padding: "6px 14px",
|
|
431
|
-
borderRadius: 20,
|
|
432
|
-
transform: "translateX(-50%)",
|
|
433
|
-
background: "rgba(0, 0, 0, 0.5)",
|
|
434
|
-
color: "#fff",
|
|
435
|
-
}}
|
|
407
|
+
<ImageGalleryExtended.Main withBlur height={400} />
|
|
408
|
+
<ImageGalleryExtended.Nav>
|
|
409
|
+
{({ onPrev, onNext, isFirst, isLast, selectedIndex, itemsCount }) => (
|
|
410
|
+
<div
|
|
411
|
+
style={{
|
|
412
|
+
display: "flex",
|
|
413
|
+
alignItems: "center",
|
|
414
|
+
justifyContent: "space-between",
|
|
415
|
+
marginTop: 16,
|
|
416
|
+
}}
|
|
417
|
+
>
|
|
418
|
+
<Button
|
|
419
|
+
theme={EButtonTheme.SECONDARY}
|
|
420
|
+
size={EComponentSize.SM}
|
|
421
|
+
disabled={isFirst}
|
|
422
|
+
onClick={onPrev}
|
|
436
423
|
>
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
›
|
|
471
|
-
</button>
|
|
472
|
-
</div>
|
|
473
|
-
)}
|
|
474
|
-
</ImageGalleryExtended.Nav>
|
|
475
|
-
</ImageGalleryExtended.Main>
|
|
424
|
+
Назад
|
|
425
|
+
</Button>
|
|
426
|
+
<Text size={ETextSize.B3} type={EFontType.SECONDARY}>
|
|
427
|
+
{selectedIndex + 1} / {itemsCount}
|
|
428
|
+
</Text>
|
|
429
|
+
<Button
|
|
430
|
+
theme={EButtonTheme.SECONDARY}
|
|
431
|
+
size={EComponentSize.SM}
|
|
432
|
+
disabled={isLast}
|
|
433
|
+
onClick={onNext}
|
|
434
|
+
>
|
|
435
|
+
Вперёд
|
|
436
|
+
</Button>
|
|
437
|
+
</div>
|
|
438
|
+
)}
|
|
439
|
+
</ImageGalleryExtended.Nav>
|
|
440
|
+
<MobileView
|
|
441
|
+
fallback={
|
|
442
|
+
<ImageGalleryExtended.Thumbnails>
|
|
443
|
+
{({ item, index, isActive, onSelect, ref }) => (
|
|
444
|
+
<ImageGalleryExtended.Thumb
|
|
445
|
+
ref={ref}
|
|
446
|
+
item={item}
|
|
447
|
+
isActive={isActive}
|
|
448
|
+
aria-label={`Фото ${index + 1} из ${ITEMS.length}`}
|
|
449
|
+
onClick={onSelect}
|
|
450
|
+
/>
|
|
451
|
+
)}
|
|
452
|
+
</ImageGalleryExtended.Thumbnails>
|
|
453
|
+
}
|
|
454
|
+
>
|
|
455
|
+
<ImageGalleryExtended.PageIndicators />
|
|
456
|
+
</MobileView>
|
|
476
457
|
</ImageGalleryExtended>
|
|
477
458
|
);
|
|
478
459
|
};
|
|
@@ -483,8 +464,8 @@ export const CustomLayout = () => {
|
|
|
483
464
|
`stories/ImageGalleryExtended/examples/ManyThumbnails.tsx`
|
|
484
465
|
|
|
485
466
|
```tsx
|
|
486
|
-
import React from "react";
|
|
487
|
-
import { ImageGalleryExtended, EImageGalleryArrowDirection } from "@sberbusiness/triplex-next";
|
|
467
|
+
import React, { useState } from "react";
|
|
468
|
+
import { ImageGalleryExtended, EImageGalleryArrowDirection, MobileView } from "@sberbusiness/triplex-next";
|
|
488
469
|
|
|
489
470
|
/** Доступных файлов-картинок всего 9, поэтому в большом наборе они повторяются по кругу. */
|
|
490
471
|
const IMAGE_COUNT = 9;
|
|
@@ -502,9 +483,10 @@ const ITEMS = Array.from({ length: 20 }, (_, i) => {
|
|
|
502
483
|
/**
|
|
503
484
|
* Большой набор (20 изображений) — проверяет горизонтальный скролл ленты миниатюр
|
|
504
485
|
* и автоцентровку активной миниатюры, когда они не помещаются в видимую область.
|
|
486
|
+
* На мобильном (<768px) лента заменяется индикаторами страниц через `MobileView`.
|
|
505
487
|
*/
|
|
506
488
|
export const ManyThumbnails = () => {
|
|
507
|
-
const [selectedId, setSelectedId] =
|
|
489
|
+
const [selectedId, setSelectedId] = useState("photo-1");
|
|
508
490
|
|
|
509
491
|
return (
|
|
510
492
|
<ImageGalleryExtended items={ITEMS} selectedId={selectedId} onChange={setSelectedId}>
|
|
@@ -530,7 +512,9 @@ export const ManyThumbnails = () => {
|
|
|
530
512
|
)}
|
|
531
513
|
</ImageGalleryExtended.Nav>
|
|
532
514
|
</ImageGalleryExtended.Main>
|
|
533
|
-
<ImageGalleryExtended.Thumbnails />
|
|
515
|
+
<MobileView fallback={<ImageGalleryExtended.Thumbnails />}>
|
|
516
|
+
<ImageGalleryExtended.PageIndicators />
|
|
517
|
+
</MobileView>
|
|
534
518
|
</ImageGalleryExtended>
|
|
535
519
|
);
|
|
536
520
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: ListItemControlsButtonDropdown
|
|
3
3
|
category: List
|
|
4
|
-
related: [ListItemControlsButton, ButtonDropdownExtended, Dropdown]
|
|
4
|
+
related: [ListItemControlsButton, ButtonDropdownExtended, Dropdown, Puller]
|
|
5
5
|
tokens:
|
|
6
6
|
- ListItemControlsButton.Background_Default
|
|
7
7
|
- ListItemControlsButton.Background_Hover
|
|
@@ -87,7 +87,7 @@ dropdown.
|
|
|
87
87
|
- `ListItemControlsButton` — используется как сама кнопка-триггер.
|
|
88
88
|
- `ButtonDropdownExtended` — обвязка для кастомных кнопок + dropdown.
|
|
89
89
|
- `Dropdown`, `DropdownList` (desktop) — выпадающий список на десктопе.
|
|
90
|
-
- `
|
|
90
|
+
- `Puller` (`PullerBody`, `PullerList`, `PullerListItem`, `PullerHeader`, `PullerClose`) — bottom-sheet на мобильном.
|
|
91
91
|
- `DropdownListContext` — управление `activeDescendant`.
|
|
92
92
|
|
|
93
93
|
---
|
|
@@ -108,3 +108,4 @@ dropdown.
|
|
|
108
108
|
| Дата | Изменение |
|
|
109
109
|
|---|---|
|
|
110
110
|
| 2026-04-29 | Создан документ |
|
|
111
|
+
| 2026-10-21 | Переход на `Puller` (TRIPLEX-961): мобильная версия собрана из частей `Puller` (бывший `DropdownMobile*`). |
|