@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.
Files changed (73) hide show
  1. package/README.md +10 -0
  2. package/bundle/components/AlertContext.md +268 -0
  3. package/bundle/components/BodyPage.md +186 -0
  4. package/bundle/components/Button.md +93 -85
  5. package/bundle/components/ButtonDropdown.md +36 -70
  6. package/bundle/components/ButtonDropdownExtended.md +422 -0
  7. package/bundle/components/ButtonIcon.md +41 -48
  8. package/bundle/components/Caption.md +291 -0
  9. package/bundle/components/Checkbox.md +43 -122
  10. package/bundle/components/CheckboxXGroup.md +109 -46
  11. package/bundle/components/CheckboxYGroup.md +77 -49
  12. package/bundle/components/CodeText.md +197 -0
  13. package/bundle/components/Col.md +311 -162
  14. package/bundle/components/CollapsibleTree.md +584 -0
  15. package/bundle/components/CollapsibleTreeExtended.md +422 -0
  16. package/bundle/components/Dropdown.md +748 -346
  17. package/bundle/components/EmptyView.md +14 -15
  18. package/bundle/components/FooterPage.md +203 -0
  19. package/bundle/components/Gap.md +115 -57
  20. package/bundle/components/HeaderPage.md +226 -0
  21. package/bundle/components/HelpBox.md +45 -84
  22. package/bundle/components/ImageGallery.md +423 -0
  23. package/bundle/components/ImageGalleryExtended.md +606 -0
  24. package/bundle/components/LightBox.md +2252 -233
  25. package/bundle/components/List.md +216 -183
  26. package/bundle/components/ListActionItem.md +157 -0
  27. package/bundle/components/ListItem.md +276 -0
  28. package/bundle/components/ListItemControlsButton.md +103 -0
  29. package/bundle/components/ListItemControlsButtonDropdown.md +107 -0
  30. package/bundle/components/ListItemSelectable.md +99 -0
  31. package/bundle/components/ListItemTable.md +390 -0
  32. package/bundle/components/ListMaster.md +876 -156
  33. package/bundle/components/ListMasterFooter.md +80 -0
  34. package/bundle/components/ListMasterHeader.md +86 -0
  35. package/bundle/components/ListSortable.md +153 -0
  36. package/bundle/components/ListSortableItem.md +175 -0
  37. package/bundle/components/ListTableItem.md +391 -0
  38. package/bundle/components/ModalWindow.md +427 -237
  39. package/bundle/components/MonthYearField.md +145 -109
  40. package/bundle/components/Notification.md +625 -155
  41. package/bundle/components/Overlay.md +271 -170
  42. package/bundle/components/Page.md +284 -186
  43. package/bundle/components/Pagination.md +206 -229
  44. package/bundle/components/Portal.md +131 -67
  45. package/bundle/components/Row.md +171 -69
  46. package/bundle/components/Text.md +320 -0
  47. package/bundle/components/TextField.md +364 -97
  48. package/bundle/components/Title.md +296 -0
  49. package/bundle/guides/codestyle.md +38 -11
  50. package/bundle/guides/commits.md +119 -26
  51. package/bundle/guides/context.md +34 -30
  52. package/bundle/guides/stories.md +110 -40
  53. package/bundle/guides/template.md +3 -7
  54. package/bundle/guides/tests.md +48 -2
  55. package/bundle/manifest.json +275 -30
  56. package/bundle/release-notes/1.26.0.mdx +33 -2
  57. package/bundle/release-notes/1.27.0.mdx +43 -0
  58. package/bundle/release-notes/1.28.0.mdx +25 -0
  59. package/bundle/release-notes/1.29.0.mdx +47 -0
  60. package/bundle/release-notes/1.30.0.mdx +56 -0
  61. package/bundle/release-notes/1.31.0.mdx +52 -0
  62. package/bundle/release-notes/1.32.0.mdx +35 -0
  63. package/bundle/release-notes/1.33.0.mdx +61 -0
  64. package/bundle/release-notes/1.34.0.mdx +35 -0
  65. package/bundle/release-notes/1.35.0.mdx +21 -0
  66. package/bundle/release-notes/1.35.1.mdx +11 -0
  67. package/bundle/release-notes/1.36.0.mdx +21 -0
  68. package/bundle/release-notes/1.37.0.mdx +71 -0
  69. package/bundle/release-notes/1.38.0.mdx +36 -0
  70. package/bundle/release-notes/1.39.0.mdx +66 -0
  71. package/bundle/release-notes/1.40.0.mdx +27 -0
  72. package/bundle/release-notes/1.41.0.mdx +7 -0
  73. 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
+