@sberbusiness/triplex-next-mcp-server 1.43.0-beta → 1.44.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.
@@ -56,7 +56,7 @@ version: "1.0"
56
56
  | Prop | Тип | По умолчанию | Описание |
57
57
  |---|---|---|---|
58
58
  | `size` | `ELightBoxSize` | `MD` | Максимальная ширина контента |
59
- | `isLoading` | `boolean` | — | Состояние загрузки: деактивирует focus trap; `LightBox.Content` показывает `LoaderScreen` |
59
+ | `isLoading` | `boolean` | — | Состояние загрузки: деактивирует focus trap, добавляет модификатор на корневой элемент (кнопка закрытия поднимается над лоадером контента); `LightBox.Content` показывает `LoaderScreen` |
60
60
  | `isSideOverlayOpened` | `boolean` | — | Флаг открытой боковой панели — добавляет модификатор на корневой элемент (блокирует скролл контента) |
61
61
  | `isTopOverlayOpened` | `boolean` | — | Флаг открытой верхней панели — аналогичный модификатор |
62
62
  | `focusTrapProps` | `IFocusTrapExtendedProps` | — | Переопределение настроек `FocusTrapExtended` |
@@ -128,9 +128,13 @@ version: "1.0"
128
128
  mount-ноды (`LightBoxMountNodeViewManager`, `LB-*`).
129
129
  - **Локальные z-index внутри лайтбокса** (стековый контекст создаёт `.lightBox`): контролы и
130
130
  sticky-шапка/футер `Page` — 100/101, лоадеры `LightBox.Content` и `LightBox.SideOverlay` — 201,
131
- `TopOverlay` — 500. `LoaderScreen` приходит с глобальным `@z-index-loader-screen` (10100), поэтому
132
- обе обёртки лоадера обязаны переопределять его локальным значением — иначе лоадер перекрывает
133
- `TopOverlay`.
131
+ `TopOverlay` — 500. `LoaderScreen` приходит с глобальным `@z-index-loader-screen` (10100),
132
+ поэтому обе обёртки лоадера обязаны переопределять его локальным значением — иначе лоадер
133
+ перекрывает `TopOverlay`.
134
+ - В состоянии загрузки (`isLoading` и без открытых оверлеев) контейнер контролов поднимается
135
+ до 202 — иначе лоадер контента перекрывает кнопку закрытия. Поднимать нужно именно контейнер:
136
+ `.lightBoxControls` — flex-элемент с собственным z-index, то есть создаёт стековый контекст,
137
+ из которого z-index на самой кнопке уже не выберется.
134
138
  - Баррел `index.ts` реэкспортирует `LightBox`, `enums`, `LightBoxSideOverlay` — сохранять.
135
139
  - React 17 совместимость (синхронизация в release-0): React 18-only API не использовать.
136
140
 
@@ -145,8 +149,8 @@ version: "1.0"
145
149
  заголовок с `tabIndex={-1}`).
146
150
  - **Клавиатура**: Esc — клик по `Controls.Close`; ArrowLeft / ArrowRight — клик по
147
151
  `Controls.Prev` / `Controls.Next` при включённых `clickByArrowLeft` / `clickByArrowRight`.
148
- При открытом `SideOverlay` клавиатурные триггеры контролов лайтбокса не активны
149
- (рендерится вариант кнопок без триггера).
152
+ При открытом `SideOverlay` или `TopOverlay` клавиатурные триггеры контролов лайтбокса
153
+ не активны (рендерится вариант кнопок без триггера). В состоянии загрузки Esc работает.
150
154
  - Кнопки `Controls.Close` имеют `data-exclude-modal-focus` — исключаются из начального фокуса
151
155
  (у `Prev`/`Next` атрибута нет).
152
156
  - `title` у `Controls.Close` по умолчанию «Закрыть» — для других языков потребитель передаёт
@@ -200,6 +204,7 @@ version: "1.0"
200
204
  | 2026-07-22 | Добавлен `export` к props-интерфейсам `ILightBoxControlsProps`, `ILightBoxCloseProps`, `ILightBoxPrevProps`, `ILightBoxNextProps`, `ILightBoxSideOverlayLoaderProps` (аддитивно, для консистентности с остальными интерфейсами компонента) |
201
205
  | 2026-07-22 | Багфиксы по ревью PR #474: клавиатурные триггеры контролов целятся в видимую кнопку (стрелки не работали на desktop, Esc — на mobile); таймер-хак блокировки скролла заменён счётчиком смонтированных лайтбоксов; `LightBoxViewManager` снимает классы mount-ноды при размонтировании последнего менеджера |
202
206
  | 2026-08-17 | Исправлено: `LightBox.TopOverlay` перекрывался лоадером `LightBox.Content`. У `.loadingContentOverlay` теперь локальный z-index (201) — выше sticky-шапки и футера `Page`, но ниже `TopOverlay` (500); раньше `LoaderScreen` шёл с глобальным `@z-index-loader-screen` (10100) |
207
+ | 2026-08-25 | Исправлено: в состоянии загрузки кнопка закрытия была недоступна для клика — её перекрывал лоадер `LightBox.Content`. Восстановлен модификатор `isLoading` на корневом элементе (терялся при переходе на CSS Modules): контролы поднимаются над лоадером, кнопки вперёд/назад скрываются. Esc в состоянии загрузки сохранён рабочим |
203
208
 
204
209
  ---
205
210
 
@@ -45,7 +45,7 @@ off-canvas) над контейнером или страницей.
45
45
  |---|---|---|---|
46
46
  | `fixed` | `boolean` | `false` | `position: fixed` (на всю страницу) вместо `absolute` (поверх родителя) |
47
47
  | `onOpening` | `() => void` | — | Вызывается в начале открытия |
48
- | `onOpen` | `() => void` | — | Вызывается по завершении анимации открытия |
48
+ | `onOpen` | `() => void` | — | Вызывается по завершении анимации открытия. Если оверлей смонтирован уже с `opened={true}`, анимации нет и колбэк вызывается сразу на маунте |
49
49
  | `onClosing` | `() => void` | — | Вызывается в начале закрытия |
50
50
  | `onClose` | `() => void` | — | Вызывается по завершении анимации закрытия |
51
51
  | `...HTMLDivAttributes` | — | — | Стандартные атрибуты корневого `<div>` (кроме `children`) |
@@ -134,6 +134,28 @@ unit-тестами (`toHaveBeenCalledTimes(1)`).
134
134
  > за переход — прямой вызов из `useLayoutEffect` дублировал эффект-driven вызов.
135
135
  > Исправлено: прямые вызовы из layout-эффекта удалены.
136
136
 
137
+ ### Монтирование сразу с `opened={true}`
138
+
139
+ Оверлей, смонтированный уже открытым, никакой анимации открытия не проигрывает —
140
+ панель отрисована в конечном положении, `transitionend` не наступит. Поэтому цикл
141
+ открытия считается завершённым сразу: на маунте вызывается `onOpen`, а `onOpening`
142
+ — нет (сообщать о начале анимации нечего). Флаги `opening` / `closing` при этом
143
+ остаются `false`.
144
+
145
+ Вызов сделан в пассивном `useEffect`, а не в layout-эффекте: к моменту пассивных
146
+ эффектов refs уже проставлены, и потребитель может обратиться к DOM внутри
147
+ `onOpen`. Измерять геометрию в этот момент всё же не стоит — оверлей мог быть
148
+ смонтирован внутри контейнера, который сам ещё выезжает (`TopOverlay` поэтому
149
+ пропускает пересчёт позиции на маунте).
150
+
151
+ Монтирование с `opened={false}` не вызывает ничего — это нейтральное начальное
152
+ состояние, а не закрытие.
153
+
154
+ > Ранее (до 2026-08-27) на первом рендере гасились все колбэки: оверлей,
155
+ > смонтированный открытым, не сообщал об этом потребителю. Обёртки, которые
156
+ > в `onOpen` включают ловушку фокуса или считают позицию (`TopOverlay`), в этом
157
+ > случае оставались недоинициализированными.
158
+
137
159
  ---
138
160
 
139
161
  ## Accessibility
@@ -183,6 +205,7 @@ Visual baseline для `components-overlay--visual-tests` генерируетс
183
205
 
184
206
  | Дата | Изменение |
185
207
  |---|---|
208
+ | 2026-08-27 | `OverlayBase` вызывает `onOpen` при монтировании с `opened={true}` — раньше первый рендер гасил все колбэки, и оверлей, смонтированный открытым, не сообщал об этом потребителю (release notes 1.44.0). |
186
209
  | 2026-06-17 | Создан документ. `Overlay` переведён на `forwardRef` (ref → корневой `div`, аддитивно, release notes 1.34.0). Дедуплицирован флаг `closing` (единый источник — `OverlayBase`). Codestyle/JSDoc cleanup в 4 файлах. Добавлены 4 unit-тест-файла. Исправлен двойной вызов `onClosing`/`onOpening` за переход — теперь ровно один раз (закреплено `toHaveBeenCalledTimes(1)`). |
187
210
 
188
211
  ---
@@ -31,7 +31,7 @@ version: "1.0"
31
31
 
32
32
  Используй когда: нужно дать пользователю переход по страницам списка/таблицы, при необходимости — с выбором размера страницы.
33
33
 
34
- Не используй когда: данных немного и помещаются на один экран (при `totalPages <= 1` навигация не рендерится); нужна бесконечная прокрутка вместо постраничной.
34
+ Не используй когда: данных немного и они помещаются на один экран (навигация всё равно отрисуется — одной страницей с заблокированными стрелками); нужна бесконечная прокрутка вместо постраничной.
35
35
 
36
36
  ---
37
37
 
@@ -43,7 +43,7 @@ version: "1.0"
43
43
 
44
44
  | Prop | Тип | Обяз. | Описание |
45
45
  |---|---|---|---|
46
- | `paginationNavigationProps` | `IPaginationNavigationProps` | да | Настройки навигации по страницам. Навигация рендерится только при `totalPages > 1`. |
46
+ | `paginationNavigationProps` | `IPaginationNavigationProps` | да | Настройки навигации по страницам. Навигация рендерится всегда: при `totalPages <= 1` — одна страница с заблокированными стрелками. |
47
47
  | `paginationSelectProps` | `IPaginationSelectProps` | нет | Настройки селекта размера страницы. Если не передан — селект не отображается. |
48
48
  | `...rest` | `IPaginationExtendedProps` | — | Прокидывается в корневой `<nav>` (className, aria-атрибуты и т.д.). |
49
49
 
@@ -52,7 +52,7 @@ version: "1.0"
52
52
  | Prop | Тип | По умолчанию | Описание |
53
53
  |---|---|---|---|
54
54
  | `currentPage` | `number` | — | Номер текущей страницы (нумерация с 1). |
55
- | `totalPages` | `number` | — | Общее число страниц. |
55
+ | `totalPages` | `number` | — | Общее число страниц. Значения меньше 1 отображаются как одна страница. |
56
56
  | `onCurrentPageChange` | `(page: number) => void` | — | Колбэк смены страницы. Вызывается с целевым номером. |
57
57
  | `boundaryCount` | `number` | `0` | Сколько страниц всегда показывать в начале и в конце. |
58
58
  | `siblingCount` | `number` | `0` | Сколько соседних страниц показывать вокруг текущей. |
@@ -105,7 +105,7 @@ version: "1.0"
105
105
  - `forwardRef` на всех компонентах семейства — не убирать. Refs: `Pagination` → `HTMLSpanElement` (фактически прокидывается в корневой `<nav>` через `PaginationExtended`, ref-тип которого `HTMLElement`), `PaginationNavigation`/`PaginationNavigationExtended` → `HTMLUListElement`, `PaginationNavigationExtendedItem` → `HTMLLIElement`, `PaginationSelect` → `HTMLDivElement`, кнопки → `HTMLButtonElement`, ellipsis → `HTMLSpanElement`.
106
106
  - Публичный API не менять: имена и обязательность props (`paginationNavigationProps` — обязателен, `paginationSelectProps` — опционален), enum `EPaginationNavigationIconDirection` (`BACK`/`NEXT`), barrel-экспорты из `index.ts`.
107
107
  - Корневой DOM-элемент `Pagination`/`PaginationExtended` — `<nav>`; навигация по страницам — семантический список `<ul>/<li>`. Не менять без обсуждения: семантика участвует в accessibility-контракте.
108
- - Навигация рендерится только при `totalPages > 1` — поведение публичное, на него опираются потребители.
108
+ - Навигация рендерится всегда, включая случай единственной страницы: `PaginationNavigation` приводит `totalPages` к минимуму 1, рисует одну страницу и блокирует обе стрелки. Это держит высоту панели пагинации постоянной независимо от размера страницы — не возвращать условный рендер по `totalPages > 1`.
109
109
  - Логику `PaginationUtils.createPagesArray` / `generatePageRanges` / `generateRange` не менять без перегенерации `__tests__/paginationUtils.test.tsx` — там зафиксированы граничные случаи раскладки.
110
110
  - `PAGINATION_ELLIPSIS_VALUE = -1` — sentinel в массиве страниц, на него завязан рендер многоточия.
111
111
  - Блокировка по `MasterTableContext.loading` перекрывает `disabled`, пришедший из props: в состоянии загрузки кнопка заблокирована независимо от того, что передал потребитель. Обратное неверно — вне загрузки решает prop.
@@ -157,6 +157,7 @@ version: "1.0"
157
157
  |---|---|
158
158
  | 2026-06-22 | Создан документ |
159
159
  | 2026-08-12 | В состоянии загрузки `MasterTable` элементы пагинации становятся `disabled` — читается из `MasterTableContext.loading`. Публичный API не изменился. Заодно `PaginationSelect` перестал молча терять переданный `status`. |
160
+ | 2026-08-27 | Навигация больше не скрывается при `totalPages <= 1`: отрисовывается одна страница с заблокированными стрелками, высота панели пагинации не схлопывается. Публичный API не изменился. |
160
161
 
161
162
  ---
162
163
 
@@ -270,15 +271,13 @@ export const Extended = () => {
270
271
 
271
272
  return (
272
273
  <PaginationExtended>
273
- {totalPages > 1 && (
274
- <PaginationNavigation
275
- currentPage={page}
276
- totalPages={totalPages}
277
- boundaryCount={1}
278
- siblingCount={1}
279
- onCurrentPageChange={setPage}
280
- />
281
- )}
274
+ <PaginationNavigation
275
+ currentPage={page}
276
+ totalPages={totalPages}
277
+ boundaryCount={1}
278
+ siblingCount={1}
279
+ onCurrentPageChange={setPage}
280
+ />
282
281
  <PaginationSelect
283
282
  paginationLabel="Показать на странице:"
284
283
  value={selectedOption || options[0]}