@sberbusiness/triplex-next-mcp-server 1.42.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.
Files changed (35) hide show
  1. package/bundle/components/AlertProcess.md +3 -2
  2. package/bundle/components/BodyPage.md +72 -4
  3. package/bundle/components/Button.md +1 -0
  4. package/bundle/components/Checkbox.md +7 -1
  5. package/bundle/components/CheckboxTreeExtended.md +149 -248
  6. package/bundle/components/CheckboxXGroup.md +2 -0
  7. package/bundle/components/CheckboxYGroup.md +7 -2
  8. package/bundle/components/ChipGroup.md +195 -126
  9. package/bundle/components/CollapsibleTreeExtended.md +6 -1
  10. package/bundle/components/DatePickerExtended.md +409 -262
  11. package/bundle/components/ExpandAnimation.md +263 -218
  12. package/bundle/components/Footer.md +235 -278
  13. package/bundle/components/Island.md +36 -1
  14. package/bundle/components/LightBox.md +14 -3
  15. package/bundle/components/MediaWidth.md +7 -1
  16. package/bundle/components/Notification.md +21 -3
  17. package/bundle/components/Overlay.md +24 -1
  18. package/bundle/components/Pagination.md +12 -13
  19. package/bundle/components/SliderExtended.md +358 -222
  20. package/bundle/components/TableBasic.md +2294 -0
  21. package/bundle/components/TabsExtended.md +380 -194
  22. package/bundle/components/Tag.md +259 -78
  23. package/bundle/components/TopOverlay.md +366 -90
  24. package/bundle/components/TreeView.md +343 -166
  25. package/bundle/components/TreeViewNode.md +436 -0
  26. package/bundle/components/UnorderedList.md +254 -0
  27. package/bundle/components/UnorderedListExtended.md +255 -0
  28. package/bundle/components/WindowResizeListener.md +249 -0
  29. package/bundle/guides/commits.md +121 -15
  30. package/bundle/guides/stories.md +1 -1
  31. package/bundle/manifest.json +46 -20
  32. package/bundle/release-notes/1.43.0.mdx +87 -0
  33. package/bundle/release-notes/1.44.0.mdx +120 -0
  34. package/bundle/release-notes/1.45.0.mdx +7 -0
  35. package/package.json +1 -1
@@ -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` |
@@ -126,6 +126,15 @@ version: "1.0"
126
126
  последнего (при переключении роутов второй лайтбокс может смонтироваться раньше, чем
127
127
  размонтируется первый). Аналогичный счётчик в `LightBoxViewManager` управляет классами
128
128
  mount-ноды (`LightBoxMountNodeViewManager`, `LB-*`).
129
+ - **Локальные z-index внутри лайтбокса** (стековый контекст создаёт `.lightBox`): контролы и
130
+ sticky-шапка/футер `Page` — 100/101, лоадеры `LightBox.Content` и `LightBox.SideOverlay` — 201,
131
+ `TopOverlay` — 500. `LoaderScreen` приходит с глобальным `@z-index-loader-screen` (10100),
132
+ поэтому обе обёртки лоадера обязаны переопределять его локальным значением — иначе лоадер
133
+ перекрывает `TopOverlay`.
134
+ - В состоянии загрузки (`isLoading` и без открытых оверлеев) контейнер контролов поднимается
135
+ до 202 — иначе лоадер контента перекрывает кнопку закрытия. Поднимать нужно именно контейнер:
136
+ `.lightBoxControls` — flex-элемент с собственным z-index, то есть создаёт стековый контекст,
137
+ из которого z-index на самой кнопке уже не выберется.
129
138
  - Баррел `index.ts` реэкспортирует `LightBox`, `enums`, `LightBoxSideOverlay` — сохранять.
130
139
  - React 17 совместимость (синхронизация в release-0): React 18-only API не использовать.
131
140
 
@@ -140,8 +149,8 @@ version: "1.0"
140
149
  заголовок с `tabIndex={-1}`).
141
150
  - **Клавиатура**: Esc — клик по `Controls.Close`; ArrowLeft / ArrowRight — клик по
142
151
  `Controls.Prev` / `Controls.Next` при включённых `clickByArrowLeft` / `clickByArrowRight`.
143
- При открытом `SideOverlay` клавиатурные триггеры контролов лайтбокса не активны
144
- (рендерится вариант кнопок без триггера).
152
+ При открытом `SideOverlay` или `TopOverlay` клавиатурные триггеры контролов лайтбокса
153
+ не активны (рендерится вариант кнопок без триггера). В состоянии загрузки Esc работает.
145
154
  - Кнопки `Controls.Close` имеют `data-exclude-modal-focus` — исключаются из начального фокуса
146
155
  (у `Prev`/`Next` атрибута нет).
147
156
  - `title` у `Controls.Close` по умолчанию «Закрыть» — для других языков потребитель передаёт
@@ -194,6 +203,8 @@ version: "1.0"
194
203
  | 2026-07-22 | Создан документ (Phase 1 AI-Ready). В том же изменении — AI-рефакторинг: JSDoc на props, общий `LightBoxArrow` для Prev/Next, хук `useLightBoxSidebarVisibility` для сайдбаров, устранение eslint-подавлений; публичный API не менялся |
195
204
  | 2026-07-22 | Добавлен `export` к props-интерфейсам `ILightBoxControlsProps`, `ILightBoxCloseProps`, `ILightBoxPrevProps`, `ILightBoxNextProps`, `ILightBoxSideOverlayLoaderProps` (аддитивно, для консистентности с остальными интерфейсами компонента) |
196
205
  | 2026-07-22 | Багфиксы по ревью PR #474: клавиатурные триггеры контролов целятся в видимую кнопку (стрелки не работали на desktop, Esc — на mobile); таймер-хак блокировки скролла заменён счётчиком смонтированных лайтбоксов; `LightBoxViewManager` снимает классы mount-ноды при размонтировании последнего менеджера |
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 в состоянии загрузки сохранён рабочим |
197
208
 
198
209
  ---
199
210
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: MediaWidth
3
3
  category: MediaWidth
4
- related: [MediaMinWidth, MediaMaxWidth, MediaBetweenWidth, useMatchMedia, MobileView]
4
+ related: [MediaMinWidth, MediaMaxWidth, MediaBetweenWidth, useMatchMedia, MobileView, WindowResizeListener]
5
5
  tokens: []
6
6
  stories: stories/MediaWidth/MediaWidth.stories.tsx
7
7
  version: "1.0"
@@ -176,6 +176,11 @@ version: "1.0"
176
176
  - `MobileView` (`src/components/MobileView/`) — частный случай `MediaWidth` с
177
177
  `maxWidth={EScreenWidth.SM_MAX}`, со своим AI.md. Для мобильной границы
178
178
  используется он, а не `MediaWidth` напрямую.
179
+ - `WindowResizeListener` (`src/components/WindowResizeListener/`) — альтернатива
180
+ для императивного случая: даёт колбэк на поток событий `resize`, а не рендерит
181
+ ветку по медиа-запросу. Правило выбора: нужно **что-то показать** на
182
+ определённой ширине — `MediaWidth`; нужно **что-то посчитать/сделать** на
183
+ ресайз — `WindowResizeListener`.
179
184
 
180
185
  Разница между `MediaWidth` и тремя реализациями: у `MediaWidth` обе границы
181
186
  опциональны и выбор реализации делается за потребителя; у реализаций
@@ -220,6 +225,7 @@ version: "1.0"
220
225
 
221
226
  | Дата | Изменение |
222
227
  |---|---|
228
+ | 2026-08-18 | TRI-104: в `related` и «Связанные компоненты» добавлен `WindowResizeListener` — обратная сторона симметричной связи-альтернативы. Код и публичный API не затронуты. |
223
229
  | 2026-08-11 | Создан документ. AI-рефакторинг (TRI-58): `displayName` у `MediaWidth`, исправлены опечатки и дополнен JSDoc props и компонента, unit-тесты расширены с 7 до 19 кейсов (проверяются строки медиа-запросов, выбор реализации, `null`-ветки, переподписка и отписка). Публичный API не изменён (props, `IMediaProps`, barrel-экспорты; `forwardRef` по-прежнему осознанно отсутствует). |
224
230
 
225
231
  ---
@@ -202,7 +202,13 @@ export const Status = () => (
202
202
  <Notification.Body.Content>
203
203
  This message provides context or highlights important information to note.
204
204
  </Notification.Body.Content>
205
- <Notification.Body.List values={Array.from({ length: 3 }, () => "List item text;")} />
205
+ <Notification.Body.List
206
+ items={[
207
+ { key: "1", children: "List item text" },
208
+ { key: "2", children: "List item text" },
209
+ { key: "3", children: "List item text" },
210
+ ]}
211
+ />
206
212
  </Notification.Body>
207
213
  <Notification.Close onClick={() => {}} />
208
214
  </Notification>
@@ -218,7 +224,13 @@ export const Status = () => (
218
224
  <Notification.Body.Content>
219
225
  This message provides context or highlights important information to note.
220
226
  </Notification.Body.Content>
221
- <Notification.Body.List values={Array.from({ length: 3 }, () => "List item text;")} />
227
+ <Notification.Body.List
228
+ items={[
229
+ { key: "1", children: "List item text" },
230
+ { key: "2", children: "List item text" },
231
+ { key: "3", children: "List item text" },
232
+ ]}
233
+ />
222
234
  </Notification.Body>
223
235
  <Notification.Close onClick={() => {}} />
224
236
  </Notification>
@@ -234,7 +246,13 @@ export const Status = () => (
234
246
  <Notification.Body.Content>
235
247
  This message provides context or highlights important information to note.
236
248
  </Notification.Body.Content>
237
- <Notification.Body.List values={Array.from({ length: 3 }, () => "List item text;")} />
249
+ <Notification.Body.List
250
+ items={[
251
+ { key: "1", children: "List item text" },
252
+ { key: "2", children: "List item text" },
253
+ { key: "3", children: "List item text" },
254
+ ]}
255
+ />
238
256
  </Notification.Body>
239
257
  <Notification.Close onClick={() => {}} />
240
258
  </Notification>
@@ -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]}