@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.
Files changed (74) hide show
  1. package/README.md +1 -0
  2. package/bundle/components/AlertProcess.md +6 -3
  3. package/bundle/components/AlertProcessSpoiler.md +216 -0
  4. package/bundle/components/Badge.md +4 -3
  5. package/bundle/components/ButtonDropdown.md +5 -3
  6. package/bundle/components/Carousel.md +671 -0
  7. package/bundle/components/CarouselExtended.md +7 -5
  8. package/bundle/components/CarouselIndicators.md +666 -0
  9. package/bundle/components/CarouselItem.md +579 -0
  10. package/bundle/components/CarouselNextButton.md +633 -0
  11. package/bundle/components/CarouselPrevButton.md +633 -0
  12. package/bundle/components/CarouselViewport.md +631 -0
  13. package/bundle/components/CheckboxTreeExtended.md +21 -7
  14. package/bundle/components/CheckboxTreeExtendedCheckbox.md +591 -0
  15. package/bundle/components/CheckboxTreeExtendedNode.md +577 -0
  16. package/bundle/components/Chip.md +1 -0
  17. package/bundle/components/ChipDatePicker.md +332 -0
  18. package/bundle/components/ChipDatePickerTarget.md +316 -0
  19. package/bundle/components/ChipMonthYearPicker.md +4 -3
  20. package/bundle/components/ChipMonthYearPickerTarget.md +318 -0
  21. package/bundle/components/ChipMultiselect.md +63 -73
  22. package/bundle/components/ChipSelect.md +385 -0
  23. package/bundle/components/ChipSelectTarget.md +388 -0
  24. package/bundle/components/ChipSuggest.md +10 -16
  25. package/bundle/components/ChipSuggestTarget.md +506 -0
  26. package/bundle/components/CollapsibleTree.md +2 -1
  27. package/bundle/components/CollapsibleTreeExtended.md +2 -1
  28. package/bundle/components/DateField.md +4 -2
  29. package/bundle/components/DatePickerExtended.md +16 -14
  30. package/bundle/components/DateRange.md +17 -10
  31. package/bundle/components/Dropdown.md +36 -63
  32. package/bundle/components/EmptyView.md +9 -4
  33. package/bundle/components/ExpandAnimation.md +9 -5
  34. package/bundle/components/FormField.md +1 -1
  35. package/bundle/components/ImageGallery.md +19 -52
  36. package/bundle/components/ImageGalleryExtended.md +123 -139
  37. package/bundle/components/ListItemControlsButtonDropdown.md +3 -2
  38. package/bundle/components/LoaderSmall.md +5 -4
  39. package/bundle/components/MonthYearRange.md +334 -0
  40. package/bundle/components/MultiselectField.md +81 -143
  41. package/bundle/components/Notification.md +2 -1
  42. package/bundle/components/NotificationGrouped.md +174 -0
  43. package/bundle/components/NumberField.md +259 -116
  44. package/bundle/components/OrderedList.md +149 -112
  45. package/bundle/components/Overlay.md +3 -2
  46. package/bundle/components/PageIndicators.md +306 -0
  47. package/bundle/components/Pagination.md +81 -3
  48. package/bundle/components/PaginationExtended.md +160 -0
  49. package/bundle/components/Portal.md +5 -2
  50. package/bundle/components/Puller.md +375 -0
  51. package/bundle/components/SMSField.md +277 -102
  52. package/bundle/components/SelectExtendedField.md +11 -7
  53. package/bundle/components/SelectField.md +7 -4
  54. package/bundle/components/SmartSpot.md +259 -0
  55. package/bundle/components/Step.md +2 -1
  56. package/bundle/components/Stepper.md +7 -7
  57. package/bundle/components/Suggest.md +7 -6
  58. package/bundle/components/SuggestField.md +8 -6
  59. package/bundle/components/TableBasic.md +12 -14
  60. package/bundle/components/Tooltip.md +9 -8
  61. package/bundle/guides/commits.md +4 -1
  62. package/bundle/guides/context.md +5 -5
  63. package/bundle/guides/stories.md +29 -21
  64. package/bundle/manifest.json +145 -13
  65. package/bundle/release-notes/1.50.0.mdx +4 -0
  66. package/bundle/release-notes/1.51.0.mdx +57 -0
  67. package/bundle/release-notes/1.52.0.mdx +55 -0
  68. package/bundle/release-notes/1.53.0.mdx +60 -0
  69. package/bundle/release-notes/1.54.0.mdx +45 -0
  70. package/bundle/release-notes/1.55.0.mdx +7 -0
  71. package/bundle/tokens.json +377 -222
  72. package/dist/index.js +39 -1
  73. package/dist/index.js.map +1 -1
  74. 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
- | `showDots` | `boolean` | `true` | Показывать ряд тиков-индикаторов (мобильный) |
68
+ | `showPageIndicators` | `boolean` | `true` | Показывать индикаторы страниц (мобильный) |
72
69
  | `thumbnailsProps` | `TImageGalleryThumbnailsProps` | — | Свойства ленты миниатюр (пробрасываются в `.Thumbnails`). Допускают `data-*` |
73
- | `dotsProps` | `TImageGalleryDotsProps` | — | Свойства ряда тиков (пробрасываются в `.Dots`). Допускают `data-*` |
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` / `TImageGalleryDotsProps`, barrel-экспорты) —
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
- - **Миниатюры и тики** берут доступное имя из `item.alt`.
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`), на мобильном — ряд тиков (`.Dots`).
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
- | `WithDots` | `WithDots.tsx` | Мобильный preset (XS viewport): крупная картинка + тики-индикаторы |
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
- dotsProps={{
326
- id: "image-gallery-dots",
327
- "data-test-id": "image-gallery-dots",
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`, `.Dots`, `.Nav`, `.Arrow`, `.Thumb`) в любом порядке.
26
+ (`.Main`, `.Thumbnails`, `.PageIndicators`, `.Nav`, `.Arrow`, `.Thumb`) в любом порядке.
30
27
 
31
28
  Используй `ImageGalleryExtended` когда: нужен полный контроль над раскладкой и
32
29
  поведением галереи (нестандартный порядок частей, кастомные стрелки или
33
30
  миниатюры через render-функции, собственное управление активным изображением).
34
31
 
35
32
  Не используй когда: достаточно стандартного пресета «крупная картинка + лента
36
- миниатюр (десктоп) / тики (мобильный)» с uncontrolled-режимом — для этого есть
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.Dots`
118
+ ### `ImageGalleryExtended.PageIndicators`
119
+
120
+ Индикаторы страниц (мобильный preset) — обёртка над `PageIndicators`: индикатор
121
+ на каждое изображение, видимо окно из 5. `count`/`activeIndex`/`onChange` берутся
122
+ из контекста, ориентация всегда горизонтальная. При `items.length <= 1` ничего не
123
+ рендерит.
114
124
 
115
- Ряд кликабельных тиков-индикаторов (мобильный preset). Изображения распределяются
116
- по тикам бакетами равного размера (макс. 4 тика); при `items.length <= 1` ничего
117
- не рендерит. Собственных публичных props нет (`className + ...HTMLDivAttributes`).
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`, `.Dots`). Target — корневой DOM-элемент части
161
- (`<div>` для контейнера/Main/Thumbnails/Dots, `<button>` для Arrow/Thumb).
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`), активный тик (`.Dots`) и
189
- активная кнопка получают `aria-current="true"`.
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`/`.Dots` берут доступное имя
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` + стрелки + миниатюры/тики через `MobileView`) и
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
- | `WithDots` | `WithDots.tsx` | Мобильный preset: крупная картинка + тики-индикаторы |
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] = React.useState("photo-1");
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] = React.useState("photo-1");
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 { ImageGalleryExtended } from "@sberbusiness/triplex-next";
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
- * крупной картинкой. Демонстрирует обе render-функции: `Thumbnails` рисует
404
- * миниатюры через `ImageGalleryExtended.Thumb` (можно подставить любую разметку,
405
- * проброс `ref` включает автоцентровку), а вместо стандартных стрелок `Nav`
406
- * отдаёт состояние навигации в кастомную панель «‹ N / Total ›».
396
+ * Кастомизация через render-функции: `Nav` отдаёт состояние навигации в панель
397
+ * «Назад · N / Total · Вперёд» под картинкой вместо стрелок поверх неё, а
398
+ * `Thumbnails` рисует стандартные миниатюры с собственным доступным именем
399
+ * (проброс `ref` сохраняет автоцентровку). На мобильном (<768px) лента миниатюр
400
+ * заменяется индикаторами страниц через `MobileView`.
407
401
  */
408
402
  export const CustomLayout = () => {
409
- const [selectedId, setSelectedId] = React.useState("photo-1");
403
+ const [selectedId, setSelectedId] = useState("photo-1");
410
404
 
411
405
  return (
412
406
  <ImageGalleryExtended items={ITEMS} selectedId={selectedId} onChange={setSelectedId}>
413
- <ImageGalleryExtended.Thumbnails>
414
- {({ item, isActive, onSelect, ref }) => (
415
- <ImageGalleryExtended.Thumb ref={ref} item={item} isActive={isActive} onClick={onSelect} />
416
- )}
417
- </ImageGalleryExtended.Thumbnails>
418
- <ImageGalleryExtended.Main withBlur height={400}>
419
- <ImageGalleryExtended.Nav>
420
- {({ onPrev, onNext, isFirst, isLast, selectedIndex, itemsCount }) => (
421
- <div
422
- style={{
423
- position: "absolute",
424
- bottom: 12,
425
- left: "50%",
426
- zIndex: 2,
427
- display: "flex",
428
- alignItems: "center",
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
- <button
438
- type="button"
439
- aria-label="Предыдущее изображение"
440
- disabled={isFirst}
441
- onClick={onPrev}
442
- style={{
443
- border: "none",
444
- background: "none",
445
- color: "inherit",
446
- fontSize: 18,
447
- cursor: isFirst ? "default" : "pointer",
448
- opacity: isFirst ? 0.4 : 1,
449
- }}
450
- >
451
- ‹
452
- </button>
453
- <span>
454
- {selectedIndex + 1} / {itemsCount}
455
- </span>
456
- <button
457
- type="button"
458
- aria-label="Следующее изображение"
459
- disabled={isLast}
460
- onClick={onNext}
461
- style={{
462
- border: "none",
463
- background: "none",
464
- color: "inherit",
465
- fontSize: 18,
466
- cursor: isLast ? "default" : "pointer",
467
- opacity: isLast ? 0.4 : 1,
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] = React.useState("photo-1");
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
- - `DropdownMobileBody`, `DropdownMobileList`, `DropdownMobileListItem`, `DropdownMobileHeader`, `DropdownMobileClose` — bottom-sheet на мобильном.
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*`). |