@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
@@ -3,7 +3,6 @@ component: Pagination
3
3
  category: Navigation
4
4
  related:
5
5
  - PaginationExtended
6
- - PaginationNavigationExtended
7
6
  - SelectField
8
7
  - ButtonIcon
9
8
  - MasterTable
@@ -51,7 +50,7 @@ version: "1.0"
51
50
  | `siblingCount` | `number` | `0` | Сколько соседних страниц показывать вокруг текущей. |
52
51
  | `buttonPrevProps` / `buttonNextProps` | `Omit<IPaginationNavigationButtonProps, "direction" \| "children">` | — | Доп. настройки кнопок навигации. |
53
52
 
54
- Логика расстановки видимых страниц и многоточий — в `utils/paginationUtils.tsx` (`PaginationUtils.createPagesArray`). При больших `totalPages` и нулевых `boundaryCount`/`siblingCount` отображается минимальный набор; увеличение этих значений раскрывает больше номеров и добавляет многоточия по краям. Места многоточий помечаются sentinel-значением `PAGINATION_ELLIPSIS_VALUE` (`-1`) в массиве страниц.
53
+ Логика расстановки видимых страниц и многоточий — в `utils.tsx` (`PaginationUtils.createPagesArray`). При больших `totalPages` и нулевых `boundaryCount`/`siblingCount` отображается минимальный набор; увеличение этих значений раскрывает больше номеров и добавляет многоточия по краям. Места многоточий помечаются sentinel-значением `PAGINATION_ELLIPSIS_VALUE` (`-1`) в массиве страниц.
55
54
 
56
55
  ### `PaginationSelect` props (через `paginationSelectProps`)
57
56
 
@@ -104,7 +103,7 @@ Pagination.PageButton_BorderColor_Focus
104
103
  - Публичный API не менять: имена и обязательность props (`paginationNavigationProps` — обязателен, `paginationSelectProps` — опционален), enum `EPaginationNavigationIconDirection` (`BACK`/`NEXT`), barrel-экспорты из `index.ts`.
105
104
  - Корневой DOM-элемент `Pagination`/`PaginationExtended` — `<nav>`; навигация по страницам — семантический список `<ul>/<li>`. Не менять без обсуждения: семантика участвует в accessibility-контракте.
106
105
  - Навигация рендерится всегда, включая случай единственной страницы: `PaginationNavigation` приводит `totalPages` к минимуму 1, рисует одну страницу и блокирует обе стрелки. Это держит высоту панели пагинации постоянной независимо от размера страницы — не возвращать условный рендер по `totalPages > 1`.
107
- - Логику `PaginationUtils.createPagesArray` / `generatePageRanges` / `generateRange` не менять без перегенерации `__tests__/paginationUtils.test.tsx` — там зафиксированы граничные случаи раскладки.
106
+ - Логику `PaginationUtils.createPagesArray` / `generatePageRanges` / `generateRange` не менять без проверки `__tests__/utils.test.ts` — там зафиксированы граничные случаи раскладки.
108
107
  - `PAGINATION_ELLIPSIS_VALUE = -1` — sentinel в массиве страниц, на него завязан рендер многоточия.
109
108
  - Блокировка по `MasterTableContext.loading` перекрывает `disabled`, пришедший из props: в состоянии загрузки кнопка заблокирована независимо от того, что передал потребитель. Обратное неверно — вне загрузки решает prop.
110
109
  - `PaginationSelect` не должен терять свойства: его публичный тип — свойства `SelectField`, поэтому всё, что не разобрано явно, обязано уходить в `SelectField`. Точечные перечисления props вместо `...rest` здесь уже приводили к молчаливой потере `status`, `targetProps` и `data`-атрибутов.
@@ -133,6 +132,16 @@ Pagination.PageButton_BorderColor_Focus
133
132
  - `PaginationNavigationButton` — кнопка «Назад»/«Вперёд» (поверх `ButtonIcon`), направление задаётся `EPaginationNavigationIconDirection`.
134
133
  - `MasterTable` — таблица, в паре с которой пагинация обычно и используется (`MasterTable.PaginationPanel`). Её `loading` через `MasterTableContext` блокирует элементы пагинации.
135
134
 
135
+ ### PaginationNavigationExtended
136
+
137
+ Контейнер `<ul>` для полностью кастомной компоновки навигации. Он задаёт раскладку списка, а состав страниц определяет потребитель. Для автоматического вычисления видимых страниц и многоточий используй `PaginationNavigation`. Как тривиальная обёртка `PaginationNavigationExtended` описывается здесь, отдельного AI.md у него нет.
138
+
139
+ `IPaginationNavigationExtendedProps` наследует стандартные HTML-атрибуты `<ul>`. `children` передаёт содержимое списка: для сохранения семантики `<ul>/<li>` используй `PaginationNavigationExtendedItem` или обычные `<li>`. `className` объединяется с базовым классом через `clsx`, остальные HTML-свойства, включая `id`, `aria-*`, `data-*` и обработчики событий, передаются через `...rest` на корневой `<ul>`. `forwardRef` направлен на этот же элемент (`HTMLUListElement`), `displayName` равен `PaginationNavigationExtended`; корневой элемент, ref-target и публичный экспорт сохраняй.
140
+
141
+ Раскладка — горизонтальный flex-список с `align-items: center` и `gap: 4px`, без маркеров (`list-style-type: none`), с нулевыми `margin` и `padding`. Собственных тем и дизайн-токенов у контейнера нет; оформление вложенных кнопок и многоточий определяется соответствующими компонентами.
142
+
143
+ Контейнер не хранит состояние и не имеет собственных callback-props, не генерирует номера страниц, не обрабатывает `disabled` или `loading` и не читает `MasterTableContext`. Текущую страницу, блокировку кнопок, многоточия и переходы задают дочерние элементы и потребитель; вложенные кнопки могут сами учитывать загрузку таблицы. Для доступности потребитель задаёт имя навигации, подписи кнопок и при необходимости `aria-current="page"` на текущей странице. Управление фокусом и клавиатурное поведение остаются у вложенных элементов: контейнер не добавляет обработчиков клавиатуры или roving tabindex.
144
+
136
145
  ---
137
146
 
138
147
  ## Stories
@@ -148,6 +157,17 @@ Pagination.PageButton_BorderColor_Focus
148
157
  | `Extended` | `Extended.tsx` | Кастомная компоновка через `PaginationExtended` + `PaginationNavigation` + `PaginationSelect` |
149
158
  | `VisualTests` | — | Скриншот-регрессия: короткая навигация, многоточия слева/справа/с обеих сторон, disabled-крайние кнопки, вариант с селектом |
150
159
 
160
+ ### PaginationNavigationExtended
161
+
162
+ Основные истории: `stories/Pagination/PaginationNavigationExtended.stories.tsx`
163
+ Файлы примеров: `stories/Pagination/examples/PaginationNavigationExtended/`
164
+
165
+ | Story | Example file | Что демонстрирует |
166
+ |---|---|---|
167
+ | `Example` | `Example.tsx` | Ручная компоновка кнопок страниц, текущей страницы, многоточия и заблокированной кнопки «Назад» внутри `PaginationExtended` |
168
+
169
+ `Playground` отсутствует: у контейнера только стандартные HTML-свойства. Единственная история `Example` доступна как пример семейства `Pagination` и участвует в скриншот-тестах.
170
+
151
171
  ---
152
172
 
153
173
  ## История изменений
@@ -159,6 +179,8 @@ Pagination.PageButton_BorderColor_Focus
159
179
  | 2026-08-12 | В состоянии загрузки `MasterTable` элементы пагинации становятся `disabled` — читается из `MasterTableContext.loading`. Публичный API не изменился. Заодно `PaginationSelect` перестал молча терять переданный `status`. |
160
180
  | 2026-08-27 | Навигация больше не скрывается при `totalPages <= 1`: отрисовывается одна страница с заблокированными стрелками, высота панели пагинации не схлопывается. Публичный API не изменился. |
161
181
  | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`PaginationNavigation`, `PaginationNavigationButton`, `PaginationNavigationExtendedItem`, `PaginationPageButton`, `PaginationPageEllipsis`, `PaginationSelect`, `ButtonBase`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
182
+ | 2026-10-07 | TRI-66: описан контракт обёртки `PaginationNavigationExtended` в родительской документации, добавлены её stories и файлы примеров; ссылка из `related` удалена, поскольку отдельный AI.md для обёртки не создаётся. |
183
+ | 2026-10-16 | При сверке AI-Ready удалены ссылки на отсутствующие stories и примеры `Default` / `VisualTests` у `PaginationNavigationExtended`; таблица соответствует текущему `Example`, пути к утилитам и их тестам актуализированы. |
162
184
 
163
185
  ---
164
186
 
@@ -293,3 +315,59 @@ export const Extended = () => {
293
315
  };
294
316
  ```
295
317
 
318
+ ### Example
319
+
320
+ `stories/Pagination/examples/PaginationNavigationExtended/Example.tsx`
321
+
322
+ ```tsx
323
+ import React from "react";
324
+ import {
325
+ EPaginationNavigationIconDirection,
326
+ PaginationExtended,
327
+ PaginationNavigationButton,
328
+ PaginationNavigationExtended,
329
+ PaginationNavigationExtendedItem,
330
+ PaginationPageButton,
331
+ PaginationPageEllipsis,
332
+ } from "@sberbusiness/triplex-next";
333
+
334
+ export const Example = () => (
335
+ <PaginationExtended aria-label="Пагинация">
336
+ <PaginationNavigationExtended>
337
+ <PaginationNavigationExtendedItem>
338
+ <PaginationNavigationButton
339
+ direction={EPaginationNavigationIconDirection.BACK}
340
+ aria-label="Предыдущая страница"
341
+ disabled
342
+ onClick={() => {}}
343
+ />
344
+ </PaginationNavigationExtendedItem>
345
+ <PaginationNavigationExtendedItem>
346
+ <PaginationPageButton isCurrent aria-current="page" onClick={() => {}}>
347
+ 1
348
+ </PaginationPageButton>
349
+ </PaginationNavigationExtendedItem>
350
+ <PaginationNavigationExtendedItem>
351
+ <PaginationPageButton onClick={() => {}}>2</PaginationPageButton>
352
+ </PaginationNavigationExtendedItem>
353
+ <PaginationNavigationExtendedItem>
354
+ <PaginationPageButton onClick={() => {}}>3</PaginationPageButton>
355
+ </PaginationNavigationExtendedItem>
356
+ <PaginationNavigationExtendedItem>
357
+ <PaginationPageEllipsis>...</PaginationPageEllipsis>
358
+ </PaginationNavigationExtendedItem>
359
+ <PaginationNavigationExtendedItem>
360
+ <PaginationPageButton onClick={() => {}}>20</PaginationPageButton>
361
+ </PaginationNavigationExtendedItem>
362
+ <PaginationNavigationExtendedItem>
363
+ <PaginationNavigationButton
364
+ direction={EPaginationNavigationIconDirection.NEXT}
365
+ aria-label="Следующая страница"
366
+ onClick={() => {}}
367
+ />
368
+ </PaginationNavigationExtendedItem>
369
+ </PaginationNavigationExtended>
370
+ </PaginationExtended>
371
+ );
372
+ ```
373
+
@@ -0,0 +1,160 @@
1
+ ---
2
+ component: PaginationExtended
3
+ category: Navigation
4
+ related:
5
+ - Pagination
6
+ tokens: []
7
+ stories: stories/Pagination/PaginationExtended.stories.tsx
8
+ version: "1.0"
9
+ ---
10
+
11
+ # PaginationExtended
12
+
13
+ ## Назначение
14
+
15
+ Контейнер `<nav>` для ручной компоновки пагинации. Располагает переданные дочерние элементы в строку и центрирует их по горизонтали и вертикали.
16
+
17
+ Используй когда: нужно самостоятельно выбрать состав и порядок элементов пагинации, добавить диапазон записей или собственный контрол размера страницы.
18
+
19
+ Не используй когда: достаточно готовой композиции навигации и селекта — используй `Pagination`; нужна только навигация по страницам без внешнего контейнера — используй `PaginationNavigation`.
20
+
21
+ ---
22
+
23
+ ## Варианты и props
24
+
25
+ Собственных вариантов, обязательных props и состояния нет. `IPaginationExtendedProps` наследует стандартные атрибуты `React.HTMLAttributes<HTMLElement>`.
26
+
27
+ | Prop | Назначение |
28
+ |---|---|
29
+ | `children` | Состав пагинации: навигация, выбор размера страницы и дополнительные элементы. Контейнер не добавляет их самостоятельно. |
30
+ | `className` | Дополнительный класс на корневом `<nav>`, объединяется с внутренним классом через `clsx`. |
31
+ | Стандартные HTML-атрибуты | `aria-label`, `aria-labelledby`, `id`, `style`, обработчики и другие атрибуты передаются на корневой `<nav>`. |
32
+
33
+ Текущую страницу, количество страниц, размер страницы и обработчики задаёт потребитель на дочерних компонентах. `PaginationExtended` не пересчитывает эти значения и не сбрасывает страницу при смене размера.
34
+
35
+ По умолчанию контейнер не задаёт промежутки между детьми и перенос строк. Кастомную раскладку можно задать через `className` или стандартный `style`; адаптацию к узкому экрану обеспечивает потребитель.
36
+
37
+ ---
38
+
39
+ ## Дизайн-токены
40
+
41
+ Собственных дизайн-токенов нет: `styles/Pagination.module.less` задаёт только позиционирование и flex-раскладку контейнера. Поэтому `tokens` в frontmatter пустой.
42
+
43
+ Цвета, состояния кнопок и оформление полей относятся к дочерним компонентам. Токены кнопок страниц описаны в [Pagination-ai.md](./Pagination-ai.md), поля выбора — в [SelectField-ai.md](../SelectField/SelectField-ai.md).
44
+
45
+ ---
46
+
47
+ ## Инварианты
48
+
49
+ - Сохранять `React.forwardRef<HTMLElement, IPaginationExtendedProps>`: ref указывает на корневой `<nav>`.
50
+ - Сохранять имя `PaginationExtended`, интерфейс `IPaginationExtendedProps`, `displayName = "PaginationExtended"` и их публичный экспорт из `Pagination/index.ts`.
51
+ - Корневой DOM-элемент — `<nav>`, внутренний класс — `paginationExtended`; `className` объединяется через `clsx`, остальные HTML-атрибуты передаются на этот же элемент.
52
+ - Дочерние элементы рендерятся в переданном порядке. Не добавлять скрытую навигацию, селект или состояние страницы в контейнер.
53
+ - Дефолтная раскладка — `display: flex`, `justify-content: center`, `align-items: center` и `position: relative`.
54
+ - Сохранять существующий story ID `components-pagination--extended` в `Pagination.stories.tsx`.
55
+
56
+ ---
57
+
58
+ ## Accessibility
59
+
60
+ - Нативный `<nav>` создаёт навигационную область. Передавай `aria-label` или `aria-labelledby`, чтобы обозначить её назначение; это особенно полезно при нескольких навигационных областях на странице.
61
+ - Контейнер не задаёт локализованный текст, ARIA-состояние текущей страницы и собственные клавиатурные обработчики. Эти настройки относятся к содержимому.
62
+ - Доступные имена иконочных стрелок передаются через `buttonPrevProps` / `buttonNextProps` у `PaginationNavigation`; собственному селекту нужен лейбл.
63
+ - Сам контейнер не включён в порядок Tab и не управляет фокусом. Клавиатурное взаимодействие обеспечивают дочерние элементы.
64
+
65
+ ---
66
+
67
+ ## Связанные компоненты
68
+
69
+ - `Pagination` — готовая композиция, которая использует `PaginationExtended` как корневой контейнер и собирает `PaginationNavigation` с опциональным `PaginationSelect`.
70
+ - `PaginationNavigation` — управляемая навигация по страницам, которую можно передать в `children`.
71
+ - `PaginationSelect` — готовая композиция лейбла и выбора размера страницы; также может быть дочерним элементом.
72
+ - `PaginationNavigationExtended` и его элементы — низкоуровневые части для ручного построения списка навигации внутри контейнера.
73
+
74
+ ---
75
+
76
+ ## Stories
77
+
78
+ Основные истории: `stories/Pagination/PaginationExtended.stories.tsx`
79
+
80
+ Файлы примеров: `stories/Pagination/examples/PaginationExtended/`
81
+
82
+ | Story | Example file | Что демонстрирует |
83
+ |---|---|---|
84
+ | `Example` | `Example.tsx` | Кастомный состав: диапазон записей, навигация и `SelectField`; перенос элементов, смена размера страницы со сбросом текущей страницы. |
85
+
86
+ Playground отсутствует: у контейнера нет настраиваемых props сверх `children` и стандартных HTML-атрибутов. Единственная история `Example` участвует в скриншот-тестах на xs и xl; отдельная `VisualTests` не нужна, поскольку собственных интерактивных состояний у контейнера нет.
87
+
88
+ Совместимый пример `Extended` остаётся в `stories/Pagination/Pagination.stories.tsx` с файлом `stories/Pagination/examples/Pagination/Extended.tsx`.
89
+
90
+ ---
91
+
92
+ ## История изменений
93
+
94
+ | Дата | Изменение |
95
+ |---|---|
96
+ | 2026-10-08 | Создан документ по TRI-65: зафиксирован композиционный контракт контейнера и добавлены самостоятельные stories с копируемыми примерами. |
97
+ | 2026-10-16 | При сверке AI-Ready удалена ссылка на отсутствующую story и пример `Default`; таблица соответствует текущему `Example`. |
98
+
99
+ ---
100
+
101
+ ## Примеры использования
102
+
103
+ ### Example
104
+
105
+ `stories/Pagination/examples/PaginationExtended/Example.tsx`
106
+
107
+ ```tsx
108
+ import React, { useState } from "react";
109
+ import {
110
+ PaginationExtended,
111
+ PaginationNavigation,
112
+ PaginationSelect,
113
+ ISelectExtendedFieldDefaultOption,
114
+ } from "@sberbusiness/triplex-next";
115
+
116
+ export const Example = () => {
117
+ const [page, setPage] = useState(1);
118
+ const [pageSize, setPageSize] = useState(10);
119
+ const totalItems = 300;
120
+ const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));
121
+
122
+ const handlePageSizeChange = (option: ISelectExtendedFieldDefaultOption) => {
123
+ setPageSize(Number(option.value));
124
+ // Смена размера страницы меняет totalPages — возвращаемся на первую, чтобы не оказаться вне диапазона.
125
+ setPage(1);
126
+ };
127
+
128
+ const options: ISelectExtendedFieldDefaultOption[] = [
129
+ { id: "0", value: "10", label: "10" },
130
+ { id: "1", value: "20", label: "20" },
131
+ { id: "2", value: "50", label: "50" },
132
+ { id: "3", value: "100", label: "100" },
133
+ { id: "4", value: "300", label: "300" },
134
+ ];
135
+
136
+ const selectedOption = options.find((option) => option.value === String(pageSize));
137
+
138
+ return (
139
+ <PaginationExtended>
140
+ <PaginationNavigation
141
+ currentPage={page}
142
+ totalPages={totalPages}
143
+ boundaryCount={1}
144
+ siblingCount={1}
145
+ onCurrentPageChange={setPage}
146
+ />
147
+ <PaginationSelect
148
+ paginationLabel="Показать на странице:"
149
+ value={selectedOption || options[0]}
150
+ options={options}
151
+ onChange={handlePageSizeChange}
152
+ targetProps={{
153
+ fieldLabel: "",
154
+ }}
155
+ />
156
+ </PaginationExtended>
157
+ );
158
+ };
159
+ ```
160
+
@@ -86,9 +86,12 @@ version: "1.0"
86
86
  ## Связанные компоненты
87
87
 
88
88
  - `Dropdown` (`src/components/Dropdown/`) — рендерит выпадающий слой через
89
- Portal в `document.body`.
89
+ Portal в `document.body`; мобильная версия — через `Puller`, в
90
+ `pullerProps.renderContainer ?? document.body`.
90
91
  - `Tooltip` (`src/components/Tooltip/`) — desktop- и mobile-реализации
91
- рендерят тултип через Portal: mobile — всегда в `document.body`, desktop — в
92
+ рендерят тултип через Portal: mobile — через `Puller`, всегда в
93
+ `document.body`, desktop — в `renderContainer ?? document.body`.
94
+ - `Puller` (`src/components/Puller/`) — рендерит шторку через Portal в
92
95
  `renderContainer ?? document.body`.
93
96
 
94
97
  ---