@sberbusiness/triplex-next-mcp-server 0.24.0-beta2 → 1.40.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 +10 -0
- package/bundle/components/AlertContext.md +268 -0
- package/bundle/components/BodyPage.md +186 -0
- package/bundle/components/Button.md +93 -85
- package/bundle/components/ButtonDropdown.md +36 -70
- package/bundle/components/ButtonDropdownExtended.md +422 -0
- package/bundle/components/ButtonIcon.md +41 -48
- package/bundle/components/Caption.md +291 -0
- package/bundle/components/Checkbox.md +43 -122
- package/bundle/components/CheckboxXGroup.md +109 -46
- package/bundle/components/CheckboxYGroup.md +77 -49
- package/bundle/components/CodeText.md +197 -0
- package/bundle/components/Col.md +311 -162
- package/bundle/components/CollapsibleTree.md +584 -0
- package/bundle/components/CollapsibleTreeExtended.md +422 -0
- package/bundle/components/Dropdown.md +748 -346
- package/bundle/components/EmptyView.md +14 -15
- package/bundle/components/FooterPage.md +203 -0
- package/bundle/components/Gap.md +115 -57
- package/bundle/components/HeaderPage.md +226 -0
- package/bundle/components/HelpBox.md +45 -84
- package/bundle/components/ImageGallery.md +423 -0
- package/bundle/components/ImageGalleryExtended.md +606 -0
- package/bundle/components/LightBox.md +2252 -233
- package/bundle/components/List.md +216 -183
- package/bundle/components/ListActionItem.md +157 -0
- package/bundle/components/ListItem.md +276 -0
- package/bundle/components/ListItemControlsButton.md +103 -0
- package/bundle/components/ListItemControlsButtonDropdown.md +107 -0
- package/bundle/components/ListItemSelectable.md +99 -0
- package/bundle/components/ListItemTable.md +390 -0
- package/bundle/components/ListMaster.md +876 -156
- package/bundle/components/ListMasterFooter.md +80 -0
- package/bundle/components/ListMasterHeader.md +86 -0
- package/bundle/components/ListSortable.md +153 -0
- package/bundle/components/ListSortableItem.md +175 -0
- package/bundle/components/ListTableItem.md +391 -0
- package/bundle/components/ModalWindow.md +427 -237
- package/bundle/components/MonthYearField.md +145 -109
- package/bundle/components/Notification.md +625 -155
- package/bundle/components/Overlay.md +271 -170
- package/bundle/components/Page.md +284 -186
- package/bundle/components/Pagination.md +206 -229
- package/bundle/components/Portal.md +131 -67
- package/bundle/components/Row.md +171 -69
- package/bundle/components/Text.md +320 -0
- package/bundle/components/TextField.md +364 -97
- package/bundle/components/Title.md +296 -0
- package/bundle/guides/codestyle.md +38 -11
- package/bundle/guides/commits.md +119 -26
- package/bundle/guides/context.md +34 -30
- package/bundle/guides/stories.md +110 -40
- package/bundle/guides/template.md +3 -7
- package/bundle/guides/tests.md +48 -2
- package/bundle/manifest.json +275 -30
- package/bundle/release-notes/1.26.0.mdx +33 -2
- package/bundle/release-notes/1.27.0.mdx +43 -0
- package/bundle/release-notes/1.28.0.mdx +25 -0
- package/bundle/release-notes/1.29.0.mdx +47 -0
- package/bundle/release-notes/1.30.0.mdx +56 -0
- package/bundle/release-notes/1.31.0.mdx +52 -0
- package/bundle/release-notes/1.32.0.mdx +35 -0
- package/bundle/release-notes/1.33.0.mdx +61 -0
- package/bundle/release-notes/1.34.0.mdx +35 -0
- package/bundle/release-notes/1.35.0.mdx +21 -0
- package/bundle/release-notes/1.35.1.mdx +11 -0
- package/bundle/release-notes/1.36.0.mdx +21 -0
- package/bundle/release-notes/1.37.0.mdx +71 -0
- package/bundle/release-notes/1.38.0.mdx +36 -0
- package/bundle/release-notes/1.39.0.mdx +66 -0
- package/bundle/release-notes/1.40.0.mdx +27 -0
- package/bundle/release-notes/1.41.0.mdx +7 -0
- package/package.json +1 -1
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
---
|
|
2
|
+
component: ImageGallery
|
|
3
|
+
category: ImageGallery
|
|
4
|
+
related: [ImageGalleryExtended, MobileView, LightBox]
|
|
5
|
+
tokens: [
|
|
6
|
+
"--triplex-next-ImageGallery-Accent_Color",
|
|
7
|
+
"--triplex-next-ImageGallery-Arrow_Background_Default",
|
|
8
|
+
"--triplex-next-ImageGallery-Arrow_Background_Hover",
|
|
9
|
+
"--triplex-next-ImageGallery-Arrow_Background_Active",
|
|
10
|
+
"--triplex-next-ImageGallery-Arrow_Background_Disabled",
|
|
11
|
+
"--triplex-next-ImageGallery-Arrow_BorderColor_Default",
|
|
12
|
+
"--triplex-next-ImageGallery-Arrow_BorderColor_Hover",
|
|
13
|
+
"--triplex-next-ImageGallery-Arrow_BorderColor_Active",
|
|
14
|
+
"--triplex-next-ImageGallery-Arrow_BorderColor_Disabled",
|
|
15
|
+
"--triplex-next-ImageGallery-Dot_Background_Default",
|
|
16
|
+
"--triplex-next-ImageGallery-Dot_Background_Hover",
|
|
17
|
+
"--triplex-next-ImageGallery-Dot_Background_Active",
|
|
18
|
+
"--triplex-next-ImageGallery-Thumb_Mask_Background"
|
|
19
|
+
]
|
|
20
|
+
stories: stories/ImageGallery/ImageGallery.stories.tsx
|
|
21
|
+
version: "1.0"
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# ImageGallery
|
|
25
|
+
|
|
26
|
+
## Назначение
|
|
27
|
+
|
|
28
|
+
Готовый пресет галереи изображений поверх `ImageGalleryExtended`. Тонкая
|
|
29
|
+
обёртка: фиксирует стандартную раскладку (крупная картинка `.Main` со стрелками
|
|
30
|
+
навигации + лента миниатюр на десктопе / ряд тиков-индикаторов на мобильном
|
|
31
|
+
через `MobileView`) и добавляет uncontrolled-режим (`defaultId`), которого нет у
|
|
32
|
+
controlled-only контейнера `ImageGalleryExtended`. Изображения задаются массивом
|
|
33
|
+
`items`.
|
|
34
|
+
|
|
35
|
+
Используй когда: нужна типовая галерея «крупная картинка + миниатюры/тики» без
|
|
36
|
+
кастомизации раскладки — достаточно передать `items` и подписать стрелки.
|
|
37
|
+
Поддерживает и controlled (`selectedId` + `onChange`), и uncontrolled
|
|
38
|
+
(`defaultId`) режимы.
|
|
39
|
+
|
|
40
|
+
Не используй когда: нужен нестандартный порядок частей, кастомные стрелки или
|
|
41
|
+
миниатюры через render-функции, либо полный контроль над составом галереи — для
|
|
42
|
+
этого предназначен базовый `ImageGalleryExtended`.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Варианты и props
|
|
47
|
+
|
|
48
|
+
Компонент пробрасывает большинство props в соответствующие части
|
|
49
|
+
`ImageGalleryExtended` и не имеет собственного UI сверх его композиции.
|
|
50
|
+
|
|
51
|
+
### Обязательные props
|
|
52
|
+
|
|
53
|
+
| Prop | Тип | Описание |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `items` | `ReadonlyArray<IImageGalleryItemProps>` | Изображения: `{ id, src, alt?, thumbSrc? }`. `id` — ключ активного изображения, `thumbSrc` падает на `src`, если не задан |
|
|
56
|
+
| `prevArrowProps` | `TImageGalleryArrowProps` | Свойства кнопки «предыдущее». Обязателен ради `aria-label` (мультиязычность) — см. Инварианты. Допускает `data-*` |
|
|
57
|
+
| `nextArrowProps` | `TImageGalleryArrowProps` | Свойства кнопки «следующее». Обязателен ради `aria-label`. Допускает `data-*` |
|
|
58
|
+
|
|
59
|
+
`prevArrowProps`/`nextArrowProps` пробрасываются в `ImageGalleryExtended.Arrow`,
|
|
60
|
+
из них исключены управляемые обёрткой поля (`direction`, `onClick`, `disabled`,
|
|
61
|
+
`hidden`, `type`).
|
|
62
|
+
|
|
63
|
+
### Опциональные props
|
|
64
|
+
|
|
65
|
+
| Prop | Тип | По умолчанию | Описание |
|
|
66
|
+
|---|---|---|---|
|
|
67
|
+
| `selectedId` | `string` | — | Id активного изображения (controlled-режим). Если задан — компонент не держит внутренний state |
|
|
68
|
+
| `defaultId` | `string` | — | Id активного изображения по умолчанию (uncontrolled-режим). Если не задан — активен первый элемент |
|
|
69
|
+
| `onChange` | `(id: string) => void` | — | Смена активного изображения. Вызывается только при реальной смене id (см. Инварианты) |
|
|
70
|
+
| `onImageClick` | `(index: number) => void` | — | Клик по крупному изображению; получает индекс активного. Типовая точка интеграции с `LightBox` |
|
|
71
|
+
| `height` | `'auto' \| number \| string` | `'auto'` | Высота крупной картинки. `'auto'` — фиксированные значения по breakpoint (504px / 264px); число → `px` |
|
|
72
|
+
| `withBlur` | `boolean` | `true` | Блюр-слой копии изображения по краям (для картинок уже вьюпорта) |
|
|
73
|
+
| `showThumbnails` | `boolean` | `true` | Показывать ленту миниатюр (десктоп) |
|
|
74
|
+
| `showDots` | `boolean` | `true` | Показывать ряд тиков-индикаторов (мобильный) |
|
|
75
|
+
| `thumbnailsProps` | `TImageGalleryThumbnailsProps` | — | Свойства ленты миниатюр (пробрасываются в `.Thumbnails`). Допускают `data-*` |
|
|
76
|
+
| `dotsProps` | `TImageGalleryDotsProps` | — | Свойства ряда тиков (пробрасываются в `.Dots`). Допускают `data-*` |
|
|
77
|
+
| `...HTMLDivAttributes` | — | — | Пробрасываются на корневой контейнер. Кроме `onChange` (переопределён под смену изображения) |
|
|
78
|
+
|
|
79
|
+
### Controlled vs uncontrolled
|
|
80
|
+
|
|
81
|
+
- Режим определяется по `selectedId`: задан → controlled (внутренний state не
|
|
82
|
+
используется, активным управляет потребитель через `selectedId` + `onChange`);
|
|
83
|
+
не задан → uncontrolled (state живёт в обёртке, инициализируется `defaultId`).
|
|
84
|
+
- В uncontrolled-режиме `onChange` всё равно вызывается — как уведомление, в
|
|
85
|
+
дополнение к внутреннему обновлению state.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Дизайн-токены
|
|
90
|
+
|
|
91
|
+
Собственных стилей и `.less`-файлов у `ImageGallery` нет — вся отрисовка
|
|
92
|
+
делегируется частям `ImageGalleryExtended`. Перечисленные токены принадлежат
|
|
93
|
+
семейству и используются через эти части (общий префикс
|
|
94
|
+
`--triplex-next-ImageGallery-` намеренно делится обоими семействами).
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
--triplex-next-ImageGallery-Accent_Color
|
|
98
|
+
|
|
99
|
+
--triplex-next-ImageGallery-Arrow_Background_Default
|
|
100
|
+
--triplex-next-ImageGallery-Arrow_Background_Hover
|
|
101
|
+
--triplex-next-ImageGallery-Arrow_Background_Active
|
|
102
|
+
--triplex-next-ImageGallery-Arrow_Background_Disabled
|
|
103
|
+
--triplex-next-ImageGallery-Arrow_BorderColor_Default
|
|
104
|
+
--triplex-next-ImageGallery-Arrow_BorderColor_Hover
|
|
105
|
+
--triplex-next-ImageGallery-Arrow_BorderColor_Active
|
|
106
|
+
--triplex-next-ImageGallery-Arrow_BorderColor_Disabled
|
|
107
|
+
|
|
108
|
+
--triplex-next-ImageGallery-Dot_Background_Default
|
|
109
|
+
--triplex-next-ImageGallery-Dot_Background_Hover
|
|
110
|
+
--triplex-next-ImageGallery-Dot_Background_Active
|
|
111
|
+
|
|
112
|
+
--triplex-next-ImageGallery-Thumb_Mask_Background
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Runtime CSS-переменная высоты крупной картинки
|
|
116
|
+
(`--triplex-next-runtime-ImageGalleryExtended-Main_Height`) задаётся частью
|
|
117
|
+
`.Main`, а не самой обёрткой — см. `ImageGalleryExtended-ai.md`.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Инварианты
|
|
122
|
+
|
|
123
|
+
- **`forwardRef`** обязателен — ref пробрасывается на корневой контейнер
|
|
124
|
+
`ImageGalleryExtended` (`<div>`). Не убирать.
|
|
125
|
+
- **`prevArrowProps` / `nextArrowProps` — required.** Это сознательное
|
|
126
|
+
accessibility-решение: стрелки навигации зашиты в пресет, и потребитель обязан
|
|
127
|
+
передать им доступное имя (`aria-label`), потому что компонент не хардкодит
|
|
128
|
+
язык. Зеркалит обязательный `aria-label` у `ImageGalleryExtended.Arrow`. Не
|
|
129
|
+
делать опциональными.
|
|
130
|
+
- **`onChange` вызывается только при реальной смене id** — наследуется от
|
|
131
|
+
`ImageGalleryExtended` (клик по уже активному изображению не триггерит).
|
|
132
|
+
Потребители на это полагаются.
|
|
133
|
+
- **Публичный API** (имена и сигнатуры props, типы `TImageGalleryArrowProps` /
|
|
134
|
+
`TImageGalleryThumbnailsProps` / `TImageGalleryDotsProps`, barrel-экспорты) —
|
|
135
|
+
breaking change при изменении.
|
|
136
|
+
- **Раскладка-пресет фиксирована.** Состав (`.Main` + стрелки + миниатюры/тики
|
|
137
|
+
через `MobileView`) — суть компонента. Нужна другая раскладка — это
|
|
138
|
+
`ImageGalleryExtended`, а не новый prop здесь.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Accessibility
|
|
143
|
+
|
|
144
|
+
- **Стрелки навигации:** доступное имя задаёт потребитель через
|
|
145
|
+
`prevArrowProps['aria-label']` / `nextArrowProps['aria-label']` (required).
|
|
146
|
+
Стрелки скрываются при `items.length <= 1` (`hidden`) и получают `disabled` на
|
|
147
|
+
границах диапазона (первое изображение → «назад», последнее → «вперёд»).
|
|
148
|
+
Видимость: стрелки появляются при ховере на крупной картинке (либо при фокусе
|
|
149
|
+
с клавиатуры); `disabled`-стрелка на границе диапазона не показывается вовсе.
|
|
150
|
+
- **Клавиатура:** `←` / `→` на корневом контейнере переключают активное
|
|
151
|
+
изображение (поведение унаследовано от `ImageGalleryExtended`).
|
|
152
|
+
- **`aria-current="true"`** — на активной миниатюре и активном тике.
|
|
153
|
+
- **Миниатюры и тики** берут доступное имя из `item.alt`.
|
|
154
|
+
- **Декоративный блюр-слой** (`withBlur`) помечен `aria-hidden="true"` с пустым
|
|
155
|
+
`alt`.
|
|
156
|
+
- **Мобильный свайп** крупного изображения перехватывает горизонтальный жест,
|
|
157
|
+
вертикальный отдаёт скроллу страницы (детали — в `ImageGalleryExtended-ai.md`).
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Связанные компоненты
|
|
162
|
+
|
|
163
|
+
- `ImageGalleryExtended` — базовый controlled compound-компонент, над которым
|
|
164
|
+
построена обёртка. `ImageGallery` собирает из его частей стандартную раскладку
|
|
165
|
+
и добавляет uncontrolled-режим. Используй Extended напрямую, если нужна
|
|
166
|
+
кастомная раскладка или поведение.
|
|
167
|
+
- `MobileView` — переключает ветку рендера: на десктопе показывает ленту
|
|
168
|
+
миниатюр (`.Thumbnails`), на мобильном — ряд тиков (`.Dots`).
|
|
169
|
+
- `LightBox` — типовой сценарий: `onImageClick` открывает изображение в
|
|
170
|
+
лайтбоксе (см. story `InsideLightBox`).
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Stories
|
|
175
|
+
|
|
176
|
+
Основные истории: `stories/ImageGallery/ImageGallery.stories.tsx`
|
|
177
|
+
Файлы примеров: `stories/ImageGallery/examples/`
|
|
178
|
+
|
|
179
|
+
| Story | Example file | Что демонстрирует |
|
|
180
|
+
|---|---|---|
|
|
181
|
+
| `Playground` | `Playground.tsx` | Интерактивный контроль всех props |
|
|
182
|
+
| `Default` | `Default.tsx` | Стандартный пресет: крупная картинка со стрелками + лента миниатюр |
|
|
183
|
+
| `FixedHeight` | `FixedHeight.tsx` | Фиксированная высота крупной картинки (`height={number}`) |
|
|
184
|
+
| `WithoutThumbnails` | `WithoutThumbnails.tsx` | Скрытая лента миниатюр (`showThumbnails={false}`) |
|
|
185
|
+
| `WithDots` | `WithDots.tsx` | Мобильный preset (XS viewport): крупная картинка + тики-индикаторы |
|
|
186
|
+
| `PropsForwarding` | `PropsForwarding.tsx` | Проброс свойств (включая `data-*`) в стрелки, миниатюры и тики |
|
|
187
|
+
| `WithoutBlur` | `WithoutBlur.tsx` | Отключённый блюр-слой по краям (`withBlur={false}`) |
|
|
188
|
+
| `InsideLightBox` | `InsideLightBox.tsx` | Открытие активного изображения в `LightBox` по клику (`onImageClick`) |
|
|
189
|
+
| `VisualTests` | `VisualTests.tsx` | Скриншот-регрессия: встроенные стрелки на границах (disabled) + блюр; тики-индикаторы |
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## История изменений
|
|
194
|
+
|
|
195
|
+
| Дата | Изменение |
|
|
196
|
+
|---|---|
|
|
197
|
+
| 2026-05-28 | Создан документ |
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Примеры использования
|
|
202
|
+
|
|
203
|
+
### Default
|
|
204
|
+
|
|
205
|
+
`stories/ImageGallery/examples/Default.tsx`
|
|
206
|
+
|
|
207
|
+
```tsx
|
|
208
|
+
import React from "react";
|
|
209
|
+
import { ImageGallery } from "@sberbusiness/triplex-next";
|
|
210
|
+
|
|
211
|
+
const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
212
|
+
id: `photo-${i + 1}`,
|
|
213
|
+
src: `assets/images/imageGallery/0${i + 1}.jpg`,
|
|
214
|
+
alt: `Photo ${i + 1}`,
|
|
215
|
+
}));
|
|
216
|
+
|
|
217
|
+
export const Default = () => (
|
|
218
|
+
<ImageGallery
|
|
219
|
+
items={ITEMS}
|
|
220
|
+
prevArrowProps={{ "aria-label": "Предыдущее изображение" }}
|
|
221
|
+
nextArrowProps={{ "aria-label": "Следующее изображение" }}
|
|
222
|
+
/>
|
|
223
|
+
);
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### FixedHeight
|
|
227
|
+
|
|
228
|
+
`stories/ImageGallery/examples/FixedHeight.tsx`
|
|
229
|
+
|
|
230
|
+
```tsx
|
|
231
|
+
import React from "react";
|
|
232
|
+
import { ImageGallery } from "@sberbusiness/triplex-next";
|
|
233
|
+
|
|
234
|
+
const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
235
|
+
id: `photo-${i + 1}`,
|
|
236
|
+
src: `assets/images/imageGallery/0${i + 1}.jpg`,
|
|
237
|
+
alt: `Photo ${i + 1}`,
|
|
238
|
+
}));
|
|
239
|
+
|
|
240
|
+
export const FixedHeight = () => (
|
|
241
|
+
<ImageGallery
|
|
242
|
+
items={ITEMS}
|
|
243
|
+
height={400}
|
|
244
|
+
prevArrowProps={{ "aria-label": "Предыдущее изображение" }}
|
|
245
|
+
nextArrowProps={{ "aria-label": "Следующее изображение" }}
|
|
246
|
+
/>
|
|
247
|
+
);
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### WithoutThumbnails
|
|
251
|
+
|
|
252
|
+
`stories/ImageGallery/examples/WithoutThumbnails.tsx`
|
|
253
|
+
|
|
254
|
+
```tsx
|
|
255
|
+
import React from "react";
|
|
256
|
+
import { ImageGallery } from "@sberbusiness/triplex-next";
|
|
257
|
+
|
|
258
|
+
const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
259
|
+
id: `photo-${i + 1}`,
|
|
260
|
+
src: `assets/images/imageGallery/0${i + 1}.jpg`,
|
|
261
|
+
alt: `Photo ${i + 1}`,
|
|
262
|
+
}));
|
|
263
|
+
|
|
264
|
+
export const WithoutThumbnails = () => (
|
|
265
|
+
<ImageGallery
|
|
266
|
+
items={ITEMS}
|
|
267
|
+
showThumbnails={false}
|
|
268
|
+
prevArrowProps={{ "aria-label": "Предыдущее изображение" }}
|
|
269
|
+
nextArrowProps={{ "aria-label": "Следующее изображение" }}
|
|
270
|
+
/>
|
|
271
|
+
);
|
|
272
|
+
```
|
|
273
|
+
|
|
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
|
+
### PropsForwarding
|
|
303
|
+
|
|
304
|
+
`stories/ImageGallery/examples/PropsForwarding.tsx`
|
|
305
|
+
|
|
306
|
+
```tsx
|
|
307
|
+
import React from "react";
|
|
308
|
+
import { ImageGallery } from "@sberbusiness/triplex-next";
|
|
309
|
+
|
|
310
|
+
const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
311
|
+
id: `photo-${i + 1}`,
|
|
312
|
+
src: `assets/images/imageGallery/0${i + 1}.jpg`,
|
|
313
|
+
alt: `Photo ${i + 1}`,
|
|
314
|
+
}));
|
|
315
|
+
|
|
316
|
+
export const PropsForwarding = () => (
|
|
317
|
+
<ImageGallery
|
|
318
|
+
items={ITEMS}
|
|
319
|
+
prevArrowProps={{ "aria-label": "Предыдущее изображение", "data-test-id": "image-gallery-prev" }}
|
|
320
|
+
nextArrowProps={{ "aria-label": "Следующее изображение", "data-test-id": "image-gallery-next" }}
|
|
321
|
+
thumbnailsProps={{
|
|
322
|
+
id: "image-gallery-thumbnails",
|
|
323
|
+
"data-test-id": "image-gallery-thumbnails",
|
|
324
|
+
}}
|
|
325
|
+
dotsProps={{
|
|
326
|
+
id: "image-gallery-dots",
|
|
327
|
+
"data-test-id": "image-gallery-dots",
|
|
328
|
+
}}
|
|
329
|
+
/>
|
|
330
|
+
);
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### WithoutBlur
|
|
334
|
+
|
|
335
|
+
`stories/ImageGallery/examples/WithoutBlur.tsx`
|
|
336
|
+
|
|
337
|
+
```tsx
|
|
338
|
+
import React from "react";
|
|
339
|
+
import { ImageGallery } from "@sberbusiness/triplex-next";
|
|
340
|
+
|
|
341
|
+
const ITEMS = Array.from({ length: 9 }, (_, i) => ({
|
|
342
|
+
id: `photo-${i + 1}`,
|
|
343
|
+
src: `assets/images/imageGallery/0${i + 1}.jpg`,
|
|
344
|
+
alt: `Photo ${i + 1}`,
|
|
345
|
+
}));
|
|
346
|
+
|
|
347
|
+
export const WithoutBlur = () => (
|
|
348
|
+
<ImageGallery
|
|
349
|
+
items={ITEMS}
|
|
350
|
+
withBlur={false}
|
|
351
|
+
prevArrowProps={{ "aria-label": "Предыдущее изображение" }}
|
|
352
|
+
nextArrowProps={{ "aria-label": "Следующее изображение" }}
|
|
353
|
+
/>
|
|
354
|
+
);
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### InsideLightBox
|
|
358
|
+
|
|
359
|
+
`stories/ImageGallery/examples/InsideLightBox.tsx`
|
|
360
|
+
|
|
361
|
+
```tsx
|
|
362
|
+
import React, { useState } from "react";
|
|
363
|
+
import { ImageGallery, LightBox, Page, EBodyPageType } 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
|
+
* Клик по крупной картинке открывает LightBox, внутри которого `ImageGallery`
|
|
373
|
+
* рендерится повторно в `Page.Body` с увеличенной высотой и лентой миниатюр.
|
|
374
|
+
* Индекс синхронизируется между preview и lightbox-копией через controlled-режим.
|
|
375
|
+
*/
|
|
376
|
+
export const InsideLightBox = () => {
|
|
377
|
+
const [selectedId, setSelectedId] = useState("photo-1");
|
|
378
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
379
|
+
|
|
380
|
+
const handleOpen = () => setIsOpen(true);
|
|
381
|
+
const handleClose = () => setIsOpen(false);
|
|
382
|
+
|
|
383
|
+
return (
|
|
384
|
+
<>
|
|
385
|
+
<ImageGallery
|
|
386
|
+
items={ITEMS}
|
|
387
|
+
selectedId={selectedId}
|
|
388
|
+
onChange={setSelectedId}
|
|
389
|
+
onImageClick={handleOpen}
|
|
390
|
+
prevArrowProps={{ "aria-label": "Предыдущее изображение" }}
|
|
391
|
+
nextArrowProps={{ "aria-label": "Следующее изображение" }}
|
|
392
|
+
/>
|
|
393
|
+
|
|
394
|
+
{isOpen ? (
|
|
395
|
+
<LightBox isLoading={false} isSideOverlayOpened={false} isTopOverlayOpened={false}>
|
|
396
|
+
<LightBox.Content key="content" isLoading={false}>
|
|
397
|
+
<Page>
|
|
398
|
+
<Page.Body type={EBodyPageType.SECOND}>
|
|
399
|
+
<ImageGallery
|
|
400
|
+
items={ITEMS}
|
|
401
|
+
selectedId={selectedId}
|
|
402
|
+
onChange={setSelectedId}
|
|
403
|
+
height={592}
|
|
404
|
+
showThumbnails
|
|
405
|
+
prevArrowProps={{ "aria-label": "Предыдущее изображение" }}
|
|
406
|
+
nextArrowProps={{ "aria-label": "Следующее изображение" }}
|
|
407
|
+
/>
|
|
408
|
+
</Page.Body>
|
|
409
|
+
</Page>
|
|
410
|
+
</LightBox.Content>
|
|
411
|
+
|
|
412
|
+
<LightBox.Controls>
|
|
413
|
+
<LightBox.Controls.Close title="Закрыть" onClick={handleClose} />
|
|
414
|
+
</LightBox.Controls>
|
|
415
|
+
</LightBox>
|
|
416
|
+
) : (
|
|
417
|
+
<div style={{ marginTop: 16 }}>Кликните на большое изображение, чтобы открыть LightBox.</div>
|
|
418
|
+
)}
|
|
419
|
+
</>
|
|
420
|
+
);
|
|
421
|
+
};
|
|
422
|
+
```
|
|
423
|
+
|