@sberbusiness/triplex-next-mcp-server 1.46.0-beta → 1.50.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 (110) hide show
  1. package/README.md +7 -7
  2. package/bundle/components/Amount.md +2 -1
  3. package/bundle/components/AmountField.md +222 -323
  4. package/bundle/components/Avatar.md +138 -146
  5. package/bundle/components/Badge.md +2 -1
  6. package/bundle/components/BodyPage.md +2 -1
  7. package/bundle/components/Button.md +5 -1
  8. package/bundle/components/ButtonDropdownExtended.md +3 -1
  9. package/bundle/components/ButtonIcon.md +3 -1
  10. package/bundle/components/Calendar.md +3 -1
  11. package/bundle/components/CardAction.md +1 -0
  12. package/bundle/components/CardStatic.md +402 -0
  13. package/bundle/components/CheckboxTree.md +157 -215
  14. package/bundle/components/CheckboxTreeExtended.md +7 -7
  15. package/bundle/components/CheckboxXGroup.md +2 -1
  16. package/bundle/components/Chip.md +2 -1
  17. package/bundle/components/ChipGroup.md +1 -1
  18. package/bundle/components/ChipMonthYearPicker.md +6 -5
  19. package/bundle/components/ChipMultiselect.md +4 -1
  20. package/bundle/components/ChipOptions.md +2 -1
  21. package/bundle/components/ChipSort.md +4 -1
  22. package/bundle/components/ChipSuggest.md +7 -6
  23. package/bundle/components/CollapsibleTree.md +10 -5
  24. package/bundle/components/CollapsibleTreeExtended.md +8 -6
  25. package/bundle/components/ComposedKeyDownListener.md +4 -3
  26. package/bundle/components/Confirm.md +346 -281
  27. package/bundle/components/DateField.md +7 -1
  28. package/bundle/components/DateRange.md +351 -210
  29. package/bundle/components/Divider.md +85 -138
  30. package/bundle/components/DocumentNumberEdit.md +173 -214
  31. package/bundle/components/Dropdown.md +11 -1
  32. package/bundle/components/Ellipsis.md +131 -147
  33. package/bundle/components/FooterPage.md +4 -1
  34. package/bundle/components/FormField.md +13 -5
  35. package/bundle/components/FormGroup.md +3 -2
  36. package/bundle/components/Gap.md +1 -1
  37. package/bundle/components/Header.md +1 -0
  38. package/bundle/components/HeaderPage.md +3 -1
  39. package/bundle/components/HelpBox.md +2 -1
  40. package/bundle/components/IconWrapper.md +10 -6
  41. package/bundle/components/ImageGallery.md +2 -1
  42. package/bundle/components/ImageGalleryExtended.md +2 -1
  43. package/bundle/components/IslandAccordion.md +6 -1
  44. package/bundle/components/KeyDownListener.md +3 -2
  45. package/bundle/components/LightBox.md +15 -1
  46. package/bundle/components/List.md +2 -1
  47. package/bundle/components/ListActionItem.md +2 -1
  48. package/bundle/components/ListItem.md +3 -1
  49. package/bundle/components/ListItemControlsButton.md +2 -1
  50. package/bundle/components/ListItemSelectable.md +2 -1
  51. package/bundle/components/ListMaster.md +2 -2
  52. package/bundle/components/ListMasterFooter.md +2 -1
  53. package/bundle/components/ListMasterHeader.md +2 -1
  54. package/bundle/components/ListSortable.md +2 -1
  55. package/bundle/components/ListSortableItem.md +2 -1
  56. package/bundle/components/ListTableItem.md +10 -7
  57. package/bundle/components/LoaderMiddle.md +5 -1
  58. package/bundle/components/LoaderScreen.md +7 -1
  59. package/bundle/components/LoaderSmall.md +10 -4
  60. package/bundle/components/MaskedField.md +3 -1
  61. package/bundle/components/MediaWidth.md +2 -1
  62. package/bundle/components/MobileView.md +2 -1
  63. package/bundle/components/ModalWindow.md +4 -1
  64. package/bundle/components/MonthYearField.md +19 -5
  65. package/bundle/components/Notification.md +1 -0
  66. package/bundle/components/Overlay.md +7 -2
  67. package/bundle/components/Pagination.md +1 -7
  68. package/bundle/components/Radio.md +238 -115
  69. package/bundle/components/RadioXGroup.md +259 -0
  70. package/bundle/components/RadioYGroup.md +266 -0
  71. package/bundle/components/SegmentedControl.md +505 -158
  72. package/bundle/components/SelectExtendedField.md +2 -1
  73. package/bundle/components/SelectField.md +4 -1
  74. package/bundle/components/Skeleton.md +140 -69
  75. package/bundle/components/Slider.md +389 -97
  76. package/bundle/components/SliderRange.md +486 -105
  77. package/bundle/components/Spoiler.md +245 -63
  78. package/bundle/components/StatusTracker.md +386 -94
  79. package/bundle/components/Step.md +257 -68
  80. package/bundle/components/Stepper.md +355 -102
  81. package/bundle/components/StepperExtended.md +633 -0
  82. package/bundle/components/SuggestField.md +1061 -96
  83. package/bundle/components/SwipeableArea.md +7 -7
  84. package/bundle/components/Tabs.md +266 -92
  85. package/bundle/components/TabsExtended.md +18 -18
  86. package/bundle/components/TabsLine.md +302 -127
  87. package/bundle/components/TagColor.md +187 -66
  88. package/bundle/components/TagGroup.md +184 -48
  89. package/bundle/components/TextField.md +8 -4
  90. package/bundle/components/TextareaField.md +279 -70
  91. package/bundle/components/ThemeProvider.md +2 -1
  92. package/bundle/components/Tooltip.md +6 -3
  93. package/bundle/components/TopOverlay.md +17 -1
  94. package/bundle/components/TreeView.md +16 -7
  95. package/bundle/components/TriggerClickOnKeyDownEvent.md +277 -0
  96. package/bundle/components/UploadZone.md +318 -0
  97. package/bundle/guides/codestyle.md +16 -1
  98. package/bundle/guides/commits.md +47 -1
  99. package/bundle/guides/context.md +4 -1
  100. package/bundle/guides/tests.md +23 -2
  101. package/bundle/manifest.json +78 -29
  102. package/bundle/release-notes/1.47.0.mdx +115 -0
  103. package/bundle/release-notes/1.48.0.mdx +68 -0
  104. package/bundle/release-notes/1.49.0.mdx +85 -0
  105. package/bundle/release-notes/1.50.0.mdx +35 -0
  106. package/bundle/release-notes/1.51.0.mdx +7 -0
  107. package/bundle/tokens.json +163 -13
  108. package/dist/index.js +220 -6
  109. package/dist/index.js.map +1 -1
  110. package/package.json +1 -1
@@ -117,8 +117,8 @@ version: "1.0"
117
117
  - `TriggerClickOnKeyDownEvent` (`src/components/Triggers/`) — по нажатию клавиши
118
118
  вызывает `click` на элементе из `targetRef`.
119
119
  - `SelectExtendedField` — закрывает выпадающий список по `Esc`.
120
- - `SliderExtendedDot`, `SliderExtendedTrack` — стрелки для перемещения ползунка,
121
- слушатели монтируются только когда элемент в фокусе.
120
+ - `SliderExtended` (`SliderExtendedDot`, `SliderExtendedTrack`) — стрелки для перемещения
121
+ ползунка, слушатели монтируются только когда элемент в фокусе.
122
122
 
123
123
  ---
124
124
 
@@ -149,6 +149,7 @@ version: "1.0"
149
149
  | 2026-08-11 | TRI-112: у `ComposedKeyDownListener` появились собственный `ComposedKeyDownListener-ai.md` и набор stories `stories/ComposedKeyDownListener/`; раздел «Связанные компоненты» сокращён до ссылки, story `Example` (демонстрация композитора) перенесена в новый набор. Ограничение на стабильную длину `keyDownListeners` снято — композитор рендерит слушателей соседями к `children`. Набор stories `KeyDownListener` исключён из скриншот-тестов, story `VisualTests` и baseline удалены — визуального интерфейса у компонента нет. Реализация самого `KeyDownListener` не менялась. |
150
150
  | 2026-08-04 | По ревью PR #502: интерфейс props `IComposedKeyDownListenerProps` стал экспортируемым — публичная поверхность пакета расширена аддитивно. `ComposedKeyDownListener` добавлен отдельной строкой в `docs/ai/ROADMAP.md`, собственный AI.md вынесен в отдельную задачу. |
151
151
  | 2026-08-04 | Создан документ. AI-рефакторинг (TRI-48): JSDoc на props `IKeyDownListenerProps` и `ComposedKeyDownListener`, ветвление в `handleKeyDown` сведено к одной проверке (снят `eslint-disable`), в `ComposedKeyDownListener` убран `as JSX.Element` и добавлен `displayName`, unit-тесты (16 кейсов на оба компонента), stories по modern pattern. Публичный API не менялся; компонент остаётся class-компонентом, `forwardRef` осознанно отсутствует. |
152
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): в «Связанных компонентах» потребители `SliderExtendedDot` / `SliderExtendedTrack` названы через адресата `related` — `SliderExtended`. Публичный API и поведение не затронуты. |
152
153
 
153
154
  ---
154
155
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: LightBox
3
3
  category: LightBox
4
- related: [Page, TopOverlay, Portal, FocusTrapExtended, LoaderScreen, Button, ModalWindow]
4
+ related: [Page, TopOverlay, Portal, LoaderScreen, Button, ModalWindow, Overlay]
5
5
  tokens:
6
6
  - LightBox.Backdrop_Background
7
7
  - LightBox.Content_Background
@@ -101,6 +101,13 @@ LightBox.SideOverlay_Background
101
101
  css-переменную `--lightBox-scroll-width`, которую вычитают из ширины оверлеев. Ширины размеров
102
102
  (`664/864/1064/1264`) заданы LESS-константами `@lightBox-content-max-width-*`.
103
103
 
104
+ Боковые отступы контента лайтбокса (`@lightBoxContentPaddingX`, 80px — место под кнопки
105
+ вперёд/назад, на экранах до 1024px включительно 0) публикуются css-переменной
106
+ `--lightBox-content-padding-x` на `.lightBoxContent`. По ней потомки выравниваются с колонкой
107
+ страницы — так это делает обёртка `TopOverlay`. Переменная объявлена именно на `.lightBoxContent`,
108
+ поэтому вне его поддерева (например в `LightBox.SideOverlay` — он сиблинг `LightBox.Content`,
109
+ а не его потомок) она не видна, и читающие её стили получают фолбэк 0.
110
+
104
111
  ---
105
112
 
106
113
  ## Инварианты
@@ -166,10 +173,15 @@ css-переменную `--lightBox-scroll-width`, которую вычита
166
173
  - `LightBoxControls` + `LightBoxClose` / `LightBoxPrev` / `LightBoxNext` (`LightBoxControls/`) — кнопки управления; стрелки построены на общем внутреннем `LightBoxArrow` (не экспортируется)
167
174
  - `LightBoxLeftSidebar` / `LightBoxRightSidebar` (`LightBoxSidebars/`) — сайдбары с автоскрытием содержимого по ширине (общий хук `useLightBoxSidebarVisibility`)
168
175
  - `LightBoxSideOverlay` (`LightBoxSideOverlay/`) — выезжающая справа панель с собственным focus trap, лоадером и кнопками закрытия CloseDesktop/CloseMobile
176
+ - `FocusTrapExtended` (`src/components/FocusTrapExtended`) — focus trap окна и боковой панели; настраивается через `focusTrapProps` (`IFocusTrapExtendedProps`). Своего AI.md и строки в `docs/ai/ROADMAP.md` не имеет
169
177
  - `LightBoxViewManager` (`LightBoxViewManager/`) — внутренний менеджер позиционирования: следит за границами view-manager-ноды, проставляет breakpoint-классы и CSS-переменные
170
178
  - `TopOverlay` (`src/components/TopOverlay`) — верхняя панель, реэкспортируется как `LightBox.TopOverlay`
171
179
  - `Page` (`src/components/Page`) — рекомендуемая структура содержимого `LightBox.Content`
172
180
  - `ModalWindow` — альтернатива для компактных диалогов
181
+ - `Overlay` (`src/components/Overlay`) — механика оверлея, на которой построен `LightBox.SideOverlay`: `ILightBoxSideOverlayProps` берёт `opened` / `onClose` из `IOverlayBaseProps`, подложку рисует `OverlayMask`
182
+ - `Portal` (`src/components/Portal`) — рендер содержимого в отдельный узел вне текущего DOM-поддерева
183
+ - `LoaderScreen` (`src/components/LoaderScreen`) — экран загрузки боковой панели, настраивается через `loaderScreenProps`
184
+ - `Button` (`src/components/Button`) — на нём построены кнопки управления: `LightBox.Controls` (закрытие и стрелки через общий `LightBoxArrow`) и кнопки закрытия `LightBox.SideOverlay`
173
185
 
174
186
  ---
175
187
 
@@ -202,11 +214,13 @@ css-переменную `--lightBox-scroll-width`, которую вычита
202
214
 
203
215
  | Дата | Изменение |
204
216
  |---|---|
217
+ | 2026-09-21 | Боковые отступы `.lightBoxContent` вынесены в css-переменную `--lightBox-content-padding-x` (константа `@lightBoxContentPaddingX`). Нужна, чтобы `TopOverlay` выравнивался по колонке контента |
205
218
  | 2026-07-22 | Создан документ (Phase 1 AI-Ready). В том же изменении — AI-рефакторинг: JSDoc на props, общий `LightBoxArrow` для Prev/Next, хук `useLightBoxSidebarVisibility` для сайдбаров, устранение eslint-подавлений; публичный API не менялся |
206
219
  | 2026-07-22 | Добавлен `export` к props-интерфейсам `ILightBoxControlsProps`, `ILightBoxCloseProps`, `ILightBoxPrevProps`, `ILightBoxNextProps`, `ILightBoxSideOverlayLoaderProps` (аддитивно, для консистентности с остальными интерфейсами компонента) |
207
220
  | 2026-07-22 | Багфиксы по ревью PR #474: клавиатурные триггеры контролов целятся в видимую кнопку (стрелки не работали на desktop, Esc — на mobile); таймер-хак блокировки скролла заменён счётчиком смонтированных лайтбоксов; `LightBoxViewManager` снимает классы mount-ноды при размонтировании последнего менеджера |
208
221
  | 2026-08-17 | Исправлено: `LightBox.TopOverlay` перекрывался лоадером `LightBox.Content`. У `.loadingContentOverlay` теперь локальный z-index (201) — выше sticky-шапки и футера `Page`, но ниже `TopOverlay` (500); раньше `LoaderScreen` шёл с глобальным `@z-index-loader-screen` (10100) |
209
222
  | 2026-08-25 | Исправлено: в состоянии загрузки кнопка закрытия была недоступна для клика — её перекрывал лоадер `LightBox.Content`. Восстановлен модификатор `isLoading` на корневом элементе (терялся при переходе на CSS Modules): контролы поднимаются над лоадером, кнопки вперёд/назад скрываются. Esc в состоянии загрузки сохранён рабочим |
223
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`FocusTrapExtended`); добавлены обратные ссылки (`Overlay`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
210
224
 
211
225
  ---
212
226
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: List
3
3
  category: List
4
- related: [ListSortable, ListItem, ListEmptyState, ListItemLoading, LoaderScreen]
4
+ related: [ListSortable, ListItem, LoaderScreen]
5
5
  tokens: []
6
6
  stories: stories/List/List.stories.tsx
7
7
  version: "1.0"
@@ -75,6 +75,7 @@ version: "1.0"
75
75
  |---|---|
76
76
  | 2026-04-29 | Создан документ |
77
77
  | 2026-06-17 | `List.module.less`: локальный `z-index: @z-index-step` на `.listLoaderScreen` — исправлено перекрытие `LoaderScreen` поверх `LightBox` / `ModalWindow` |
78
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListEmptyState`, `ListItemLoading`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
78
79
 
79
80
  ---
80
81
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ListActionItem
3
3
  category: List
4
- related: [ListItem, ListItemContent, ListSortableItem]
4
+ related: [ListItem]
5
5
  tokens:
6
6
  - ListItem.Background_Hover
7
7
  - ListItem.BorderColor_Focus
@@ -158,3 +158,4 @@ ListItem.BorderColor_Focus // цвет focus-обводки (:focus-visible)
158
158
  |---|---|
159
159
  | 2026-07-17 | Добавлена story `WithActionItems` в `List.stories.tsx` — список из нескольких `ListActionItem`. |
160
160
  | 2026-07-16 | Создан компонент `ListActionItem` — самодостаточная интерактивная строка (hover, focus по Tab, `onClick` + Enter/Space). Сам рендерит `ListItem` + `ListItemContent`; интерактивность и весь фон живут на одном `ListItemContent`. Пропсы разделены: собственные — на `<li>`, интерактивные — через `listItemContentProps`. |
161
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListItemContent`); из `related` убраны несимметричные имена (`ListSortableItem`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ListItem
3
3
  category: List
4
- related: [List, ListItemContent, ListActionItem, ListItemSelectable, ListTableItem, ListSortableItem]
4
+ related: [List, ListActionItem, ListItemSelectable, ListTableItem, ListSortableItem]
5
5
  tokens:
6
6
  - ListItem.Background
7
7
  - ListItem.Background_Selected
@@ -73,6 +73,7 @@ ListItem.BorderColor_Focus // цвет focus-обводки на desktop (List
73
73
  - `ListItemLoading` — элемент-спиннер для пагинации (используется как последний элемент).
74
74
  - `ListItemControls`, `ListItemControlsButton`, `ListItemControlsButtonDropdown` — кнопки действий, обычно внутри `SwipeableArea.rightSwipeableArea`.
75
75
  - `ListItemTailLeft` / `ListItemTailRight` — декоративные хвосты для `SwipeableArea`.
76
+ - `ListSortableItem` — самодостаточный элемент перетаскиваемого списка: тоже рендерит `ListItem` внутри себя, но добавляет target и контролы перетаскивания.
76
77
  - `ListTableItem` — комбинированная высокоуровневая обёртка.
77
78
 
78
79
  ---
@@ -99,6 +100,7 @@ ListItem.BorderColor_Focus // цвет focus-обводки на desktop (List
99
100
  | 2026-04-29 | Создан документ |
100
101
  | 2026-05-21 | `ListItemContext` расширен полями `selectable` / `setSelectable`. Исправлен цвет токена `Background_Selected` в тёмной теме (`ColorDarkNeutral.10` → `ColorDarkNeutral.60`). |
101
102
  | 2026-07-16 | Добавлен самодостаточный компонент `ListActionItem` (сам рендерит `ListItem` + `ListItemContent`; hover, focus по Tab, `onClick` + Enter/Space). Координация фона через контекст не понадобилась — `ListItemContext` без изменений. Другие компоненты семейства его не используют. |
103
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListItemContent`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
102
104
 
103
105
  ---
104
106
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ListItemControlsButton
3
3
  category: List
4
- related: [ListItemControls, ListItemControlsButtonDropdown, IconWrapper]
4
+ related: [ListItemControlsButtonDropdown, IconWrapper]
5
5
  tokens:
6
6
  - ListItemControlsButton.Background_Default
7
7
  - ListItemControlsButton.Background_Hover
@@ -104,3 +104,4 @@ ListItemControlsButton.Color_Active
104
104
  | Дата | Изменение |
105
105
  |---|---|
106
106
  | 2026-04-29 | Создан документ |
107
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListItemControls`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ListItemSelectable
3
3
  category: List
4
- related: [ListItem, ListItemContent, Checkbox]
4
+ related: [ListItem, Checkbox]
5
5
  tokens:
6
6
  - ListItem.Background
7
7
  - ListItem.Background_Selected
@@ -100,3 +100,4 @@ ListItem.Background_Selected // фон, когда selected=true
100
100
  |---|---|
101
101
  | 2026-04-29 | Создан документ |
102
102
  | 2026-05-21 | Добавлен опциональный prop `disabled` (пробрасывается в `Checkbox`). Компонент пишет в `ListItemContext` флаг `selectable = true` при монтировании. |
103
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListItemContent`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
@@ -628,13 +628,13 @@ export const Default = () => {
628
628
  controlButtons={
629
629
  <>
630
630
  <ListItemControlsButton
631
- icon={<AttachmentStrokeSrvIcon20 paletteIndex={5} />}
631
+ icon={<AttachmentStrokeSrvIcon20 paletteIndex={0} />}
632
632
  >
633
633
  Скачать
634
634
  </ListItemControlsButton>
635
635
 
636
636
  <ListItemControlsButtonDropdown
637
- icon={<DotshorizontalStrokeSrvIcon20 paletteIndex={5} />}
637
+ icon={<DotshorizontalStrokeSrvIcon20 paletteIndex={0} />}
638
638
  options={itemActions}
639
639
  >
640
640
  Действия
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ListMasterFooter
3
3
  category: List
4
- related: [ListMaster, ListMasterFooterDescription, ListMasterFooterControls]
4
+ related: [ListMaster]
5
5
  tokens:
6
6
  - ListMaster.Footer_Background
7
7
  - ListMaster.Footer_Shadow
@@ -81,3 +81,4 @@ ListMaster.Footer_Shadow // тень сверху
81
81
  | Дата | Изменение |
82
82
  |---|---|
83
83
  | 2026-04-29 | Создан документ. Уточнён JSDoc по дефолтному значению `sticky`. Добавлены unit-тесты. |
84
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListMasterFooterDescription`, `ListMasterFooterControls`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ListMasterHeader
3
3
  category: List
4
- related: [ListMaster, SelectionControls]
4
+ related: [ListMaster]
5
5
  tokens:
6
6
  - ListMaster.Header_Background
7
7
  - ListMaster.Header_Shadow
@@ -87,3 +87,4 @@ ListMaster.Header_Shadow // тень снизу
87
87
  | Дата | Изменение |
88
88
  |---|---|
89
89
  | 2026-04-29 | Создан документ. Уточнён JSDoc по `useEffect`-логике компенсации скролла. Добавлены unit-тесты. |
90
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`SelectionControls`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ListSortable
3
3
  category: List
4
- related: [List, ListSortableItem, ListSortableItemTarget, ListSortableItemControls]
4
+ related: [List, ListSortableItem]
5
5
  tokens: []
6
6
  stories: stories/List/List.stories.tsx
7
7
  version: "1.0"
@@ -86,6 +86,7 @@ callback `onItemsChange`, в который пробрасывает резул
86
86
  | Дата | Изменение |
87
87
  |---|---|
88
88
  | 2026-04-29 | Создан документ |
89
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListSortableItemTarget`, `ListSortableItemControls`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
89
90
 
90
91
  ---
91
92
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ListSortableItem
3
3
  category: List
4
- related: [ListSortable, ListSortableItemTarget, ListSortableItemControls, ListItem]
4
+ related: [ListSortable, ListItem]
5
5
  tokens:
6
6
  - ListItem.Background
7
7
  - ListItem.Background_Hover
@@ -111,6 +111,7 @@ ListItem.Shadow_Dragging // тень во время drag
111
111
  | Дата | Изменение |
112
112
  |---|---|
113
113
  | 2026-04-29 | Создан документ |
114
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListSortableItemTarget`, `ListSortableItemControls`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
114
115
 
115
116
  ---
116
117
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ListTableItem
3
3
  category: List
4
- related: [ListItem, ListItemSelectable, ListItemControls, ListItemControlsButton, SwipeableArea]
4
+ related: [ListItem, ListItemSelectable, TableBasic, SwipeableArea]
5
5
  tokens:
6
6
  - ListItem.Background
7
7
  - ListItem.Background_Selected
@@ -80,7 +80,9 @@ ListItem.Background_Selected // фон выбранной строки (чере
80
80
  - `ListItemSelectable` — добавляется автоматически, если переданы `selected` + `onSelect`.
81
81
  - `ListItemControls` — обёртка для `controlButtons`, подключается как `rightSwipeableArea`.
82
82
  - `ListItemTailRight` — декоративный «хвост» в правой части (всегда отрисовывается).
83
+ - `ListItemControlsButton` — кнопка действия внутри `ListItemControls`; из таких кнопок собирается `controlButtons`.
83
84
  - `SwipeableArea` — внешняя зависимость, обеспечивает swipe-жесты.
85
+ - `TableBasic` — альтернатива для табличного списка: настоящая таблица с колонками, когда строка не карточка со своей вёрсткой, свайпом и контролами.
84
86
 
85
87
  ---
86
88
 
@@ -104,6 +106,7 @@ ListItem.Background_Selected // фон выбранной строки (чере
104
106
  |---|---|
105
107
  | 2026-04-29 | Создан документ |
106
108
  | 2026-07-16 | Компонент переименован `ListItemTable` → `ListTableItem`. Пропсы `IListItemTableProps`/`IListItemTableSelectableProps` → `IListTableItemProps`/`IListTableItemSelectableProps`, CSS-класс `.listItemTable` → `.listTableItem`, файлы `ListTableItem.*`. **Breaking change.** |
109
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListItemControls`) и `ListItemControlsButton` — `ListTableItem` принимает `controlButtons` как `React.ReactNode` и рендерит `ListItemControls`, а саму кнопку не импортирует; добавлены обратные ссылки (`TableBasic`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
107
110
 
108
111
  ---
109
112
 
@@ -156,11 +159,11 @@ export const Default = () => {
156
159
  onClickItem={() => {}}
157
160
  controlButtons={
158
161
  <>
159
- <ListItemControlsButton icon={<AttachmentStrokeSrvIcon20 paletteIndex={5} />}>
162
+ <ListItemControlsButton icon={<AttachmentStrokeSrvIcon20 paletteIndex={0} />}>
160
163
  Скачать
161
164
  </ListItemControlsButton>
162
165
  <ListItemControlsButtonDropdown
163
- icon={<DotshorizontalStrokeSrvIcon20 paletteIndex={5} />}
166
+ icon={<DotshorizontalStrokeSrvIcon20 paletteIndex={0} />}
164
167
  options={options}
165
168
  >
166
169
  Действия
@@ -245,11 +248,11 @@ export const Selectable = () => {
245
248
  onClickItem={() => console.log("Клик по карточке.")}
246
249
  controlButtons={
247
250
  <>
248
- <ListItemControlsButton icon={<AttachmentStrokeSrvIcon20 paletteIndex={5} />}>
251
+ <ListItemControlsButton icon={<AttachmentStrokeSrvIcon20 paletteIndex={0} />}>
249
252
  Скачать
250
253
  </ListItemControlsButton>
251
254
  <ListItemControlsButtonDropdown
252
- icon={<DotshorizontalStrokeSrvIcon20 paletteIndex={5} />}
255
+ icon={<DotshorizontalStrokeSrvIcon20 paletteIndex={0} />}
253
256
  options={options}
254
257
  >
255
258
  Действия
@@ -354,11 +357,11 @@ export const WithSwipeEmulation = () => {
354
357
  onClickItem={() => console.log("Клик по карточке.")}
355
358
  controlButtons={
356
359
  <>
357
- <ListItemControlsButton icon={<AttachmentStrokeSrvIcon20 paletteIndex={5} />}>
360
+ <ListItemControlsButton icon={<AttachmentStrokeSrvIcon20 paletteIndex={0} />}>
358
361
  Скачать
359
362
  </ListItemControlsButton>
360
363
  <ListItemControlsButtonDropdown
361
- icon={<DotshorizontalStrokeSrvIcon20 paletteIndex={5} />}
364
+ icon={<DotshorizontalStrokeSrvIcon20 paletteIndex={0} />}
362
365
  options={options}
363
366
  >
364
367
  Действия
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: LoaderMiddle
3
3
  category: Loaders
4
- related: [LoaderSmall, LoaderScreen, TableBasic]
4
+ related: [Skeleton, LoaderSmall, LoaderScreen, TableBasic]
5
5
  tokens:
6
6
  - Loader.Middle_Background_Default
7
7
  - Loader.Element_Background_Brand
@@ -106,6 +106,9 @@ Loader.Element_Background_Brand
106
106
  того же barrel `src/components/Loader/index.ts`.
107
107
  - `LoaderScreen` (`src/components/LoaderScreen/LoaderScreen.tsx`) — оверлей-подложка с лоадером по
108
108
  центру, подписью и кнопками; при `type="middle"` рендерит `LoaderMiddle` без обёрток.
109
+ - `Skeleton` (`src/components/Skeleton/`) — альтернатива для той же задачи (первая загрузка
110
+ блока) с другим компромиссом: показывает каркас будущей раскладки, поэтому берётся, когда
111
+ раскладка известна заранее. `LoaderMiddle` — когда неизвестна.
109
112
  - `TableBasic` (`src/components/Table/TableBasic/TableBasic.tsx`) — показывает `LoaderMiddle` в
110
113
  футере таблицы при догрузке данных на пустом состоянии.
111
114
 
@@ -134,6 +137,7 @@ Loader.Element_Background_Brand
134
137
  | Дата | Изменение |
135
138
  |---|---|
136
139
  | 2026-08-05 | Создан документ. AI-рефакторинг: JSDoc на компоненте, порядок импортов приведён к codestyle, в LESS объединены дублирующиеся базовые стили `.dot` и `.line`, unit-тесты расширены с 1 до 2 кейсов (роль корневого элемента, количество точек и линии). В stories `controls: { disable: true }` перенесён на верхний уровень `parameters` (внутри `docs` не применялся). Публичный API, DOM и визуальное поведение не изменены. |
140
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): добавлена обратная ссылка `Skeleton` — `Skeleton-ai.md` называет `LoaderMiddle` альтернативой (категория 2), а такие пары по `docs/ai/CONTEXT.md` симметричны; в TRI-76 связь была проставлена только с одной стороны. Публичный API и поведение не затронуты. |
137
141
 
138
142
  ---
139
143
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: LoaderScreen
3
3
  category: Loaders
4
- related: [LoaderSmall, LoaderMiddle, Gap, Text, ModalWindowContent, LightBoxContent, LightBoxSideOverlay, List, TableBasic, MultiselectField]
4
+ related: [LoaderSmall, LoaderMiddle, Gap, Text, List, TableBasic]
5
5
  tokens:
6
6
  - LoaderScreen.Small_Backdrop_Default
7
7
  - LoaderScreen.Middle_Backdrop_Default
@@ -161,6 +161,11 @@ breaking change для темизации), но опираться на нег
161
161
  - `TableBasic` — лоадер поверх тела таблицы.
162
162
  - `MultiselectField` — `LoaderScreen type="small"` внутри выпадающего списка.
163
163
 
164
+ `MultiselectField` в `related` не входит: обычный контракт по рендеру, ссылка стоит с его
165
+ стороны. `List` и `TableBasic` остаются — они подпадают под исключение «потребитель,
166
+ опирающийся на хрупкую деталь»: оба понижают `z-index` лоадера через вложенный селектор,
167
+ и держится это на специфичности правил `.loaderScreen` (см. «Ограничения раскладки»).
168
+
164
169
  ---
165
170
 
166
171
  ## Stories
@@ -186,6 +191,7 @@ breaking change для темизации), но опираться на нег
186
191
  | Дата | Изменение |
187
192
  |---|---|
188
193
  | 2026-08-06 | Создан документ. AI-рефакторинг: порядок импортов по `codestyle.md`, JSDoc на компоненте, props и `ILoaderScreenMiddleProps` (включая значение по умолчанию для `size`), подложка вынесена в `TYPE_TO_BACKDROP_CLASS_NAME_MAP`, `className` в `clsx` перенесён в конец. Unit-тесты расширены: все значения `EComponentSize`, игнорирование `size` при `type="middle"`, класс подложки по типу, отсутствие `description` / `controls`, мердж `className`, spread rest-props, `forwardRef`. Публичный API, DOM и стили не изменены. |
194
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ModalWindowContent`, `LightBoxContent`, `LightBoxSideOverlay`) и потребитель `MultiselectField` — контракт по рендеру, ссылка стоит с его стороны. `List` и `TableBasic` оставлены: они понижают `z-index` лоадера вложенным селектором и опираются на специфичность правил `.loaderScreen` — исключение «потребитель, опирающийся на хрупкую деталь». Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
189
195
 
190
196
  ---
191
197
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: LoaderSmall
3
3
  category: Loaders
4
- related: [LoaderMiddle, LoaderScreen, Button, Dropdown, ListItemLoading, SuggestField, SelectExtendedField]
4
+ related: [LoaderMiddle, LoaderScreen, Button]
5
5
  tokens:
6
6
  - Loader.Element_Background_Brand
7
7
  - Loader.Element_Background_Neutral
@@ -128,13 +128,18 @@ Loader: `Element_Background_Brand` использует также `LoaderMiddle
128
128
  - `LoaderScreen` (`src/components/LoaderScreen/LoaderScreen.tsx`) — оверлей с лоадером,
129
129
  подписью и кнопками; при `type="small"` рендерит `LoaderSmall` с темой `BRAND`.
130
130
  - `Button` (`src/components/Button/Button.tsx`) — рендерит `LoaderSmall` **всегда**, а вне
131
- состояния `loading` прячет обёртку классом (`Button.tsx:156`), поэтому `role="status"`
132
- доступен и у обычной кнопки — не пиши тест вида `queryByRole("status")` → `null`.
131
+ состояния `loading` прячет обёртку классом (`Button.tsx:156`). Класс задаёт
132
+ `visibility: hidden` (`Button.module.less:136-138`), то есть в браузере узел выпадает
133
+ из дерева доступности, но остаётся в DOM. Unit-тесты идут в jsdom, который LESS не
134
+ применяет, поэтому там `role="status"` находится и у обычной кнопки — не пиши тест
135
+ вида `queryByRole("status")` → `null`.
133
136
  Тему выбирает по теме кнопки (`SECONDARY` / `SECONDARY_LIGHT` → `BRAND`,
134
137
  остальные → `NEUTRAL`), размер — по размеру кнопки.
135
138
  - `Dropdown` (`DropdownList`, `DropdownMobileList`, `DropdownMobileLoader`), `SuggestField`,
136
139
  `ChipSuggest`, `SelectExtendedField`, `ListItemLoading` — показывают `LoaderSmall` с темой
137
- `BRAND` во время подгрузки данных.
140
+ `BRAND` во время подгрузки данных. В `related` не входят: это контракт по рендеру, ссылка
141
+ стоит с их стороны. `Button` — исключение «потребитель, опирающийся на хрупкую деталь»
142
+ (см. выше про `role="status"`), поэтому он в `related` остаётся с обеих сторон.
138
143
 
139
144
  ---
140
145
 
@@ -166,6 +171,7 @@ Loader: `Element_Background_Brand` использует также `LoaderMiddle
166
171
  | Дата | Изменение |
167
172
  |---|---|
168
173
  | 2026-08-06 | Создан документ. AI-рефакторинг: JSDoc на компоненте, props и значениях `ELoaderSmallTheme`, документирован неиспользуемый `ELoaderSmallSize`, порядок импортов приведён к codestyle, константы-маппинги переименованы в `THEME_TO_CLASS_NAME_MAP` / `SIZE_TO_CLASS_NAME_MAP`, в стилях объединено дублирующееся объявление анимации точек — сама анимация задана один раз на `.dot`, а у `.dot1` / `.dot2` / `.dot3` осталась только `animation-delay` (правило `.dot1` с нулевой задержкой обязательно: без него класс исчезнет из CSS-модуля и из разметки), unit-тесты расширены с 3 до 6 кейсов. В stories `controls: { disable: true }` перенесён на верхний уровень `parameters` — внутри `docs` он не применялся. Публичный API, DOM и визуальное поведение не изменены. |
174
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ListItemLoading`); из `related` убраны потребители `Dropdown`, `SuggestField`, `SelectExtendedField` — ссылка на контракт по рендеру стоит с их стороны; `Button` оставлен как исключение «потребитель, опирающийся на хрупкую деталь». Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
169
175
 
170
176
  ---
171
177
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: MaskedField
3
3
  category: TextFields
4
- related: [TextField, FormField, FormFieldMaskedInput, FormGroup, DateField, MonthYearField]
4
+ related: [TextField, FormField, FormGroup, DateField]
5
5
  tokens: []
6
6
  stories: stories/MaskedField/MaskedField.stories.tsx
7
7
  version: "1.0"
@@ -87,6 +87,7 @@ version: "1.0"
87
87
  - `TextFieldBase` — базовая раскладка `FormGroup`/`FormField` + слоты `prefix`/`children`/`label`/`postfix` и блок `description`/`counter`.
88
88
  - `FormFieldMaskedInput` — сам элемент ввода с маской и статическим свойством `presets` (`masks`, `placeholderMasks`). Используется напрямую, когда нужна нестандартная композиция поля.
89
89
  - `FormFieldClear` — кнопка очистки, передаётся в `postfix`.
90
+ - `TextField` — то же поле без маски: отличается только элементом ввода (`FormFieldInput` вместо `FormFieldMaskedInput`).
90
91
  - `FormGroup` / `FormField` — контейнеры раскладки поля и описания.
91
92
  - `DateField`, `MonthYearField`, `AmountField`, `SuggestField`, `TextareaField` — специализированные поля той же группы `TextFields`.
92
93
 
@@ -119,6 +120,7 @@ version: "1.0"
119
120
  | 2026-08-11 | Тип `maskedInputProps.ref` исправлен на `React.RefObject<HTMLDivElement>` — соответствует фактическому ref-таргету (правки по ревью PR #515) |
120
121
  | 2026-08-12 | Исправления в `FormFieldMaskedInput` по ревью PR #515: убрана мутация prop `value` в `getValue()`, `defaultValue` больше не уходит в `<input>` (предупреждение React о controlled/uncontrolled) и исключён из `IFormFieldMaskedInputProps` |
121
122
  | 2026-09-09 | Исправлено: значение с кодом страны раскладывалось по маске телефона со сдвигом и теряло последнюю цифру. Нормализация номера вынесена в `normalizePhoneText` и применяется и к внешнему `value`, и к слою с маской |
123
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`FormFieldMaskedInput`); из `related` убраны несимметричные имена (`MonthYearField`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
122
124
 
123
125
  ---
124
126
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: MediaWidth
3
3
  category: MediaWidth
4
- related: [MediaMinWidth, MediaMaxWidth, MediaBetweenWidth, useMatchMedia, MobileView, WindowResizeListener]
4
+ related: [MobileView, WindowResizeListener]
5
5
  tokens: []
6
6
  stories: stories/MediaWidth/MediaWidth.stories.tsx
7
7
  version: "1.0"
@@ -227,6 +227,7 @@ version: "1.0"
227
227
  |---|---|
228
228
  | 2026-08-18 | TRI-104: в `related` и «Связанные компоненты» добавлен `WindowResizeListener` — обратная сторона симметричной связи-альтернативы. Код и публичный API не затронуты. |
229
229
  | 2026-08-11 | Создан документ. AI-рефакторинг (TRI-58): `displayName` у `MediaWidth`, исправлены опечатки и дополнен JSDoc props и компонента, unit-тесты расширены с 7 до 19 кейсов (проверяются строки медиа-запросов, выбор реализации, `null`-ветки, переподписка и отписка). Публичный API не изменён (props, `IMediaProps`, barrel-экспорты; `forwardRef` по-прежнему осознанно отсутствует). |
230
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`MediaMinWidth`, `MediaMaxWidth`, `MediaBetweenWidth`, `useMatchMedia`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
230
231
 
231
232
  ---
232
233
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: MobileView
3
3
  category: MobileView
4
- related: [MediaWidth, MediaMaxWidth, useMatchMedia, useMobileView]
4
+ related: [MediaWidth]
5
5
  tokens: []
6
6
  stories: stories/MobileView/MobileView.stories.tsx
7
7
  version: "1.0"
@@ -173,6 +173,7 @@ viewport `xs` (575px) рендерится мобильный вариант, н
173
173
  | Дата | Изменение |
174
174
  |---|---|
175
175
  | 2026-08-10 | Создан документ. AI-рефакторинг (TRI-59): `useMobileView.tsx` → `useMobileView.ts` (в файле нет JSX), явный тип возврата у хука, `displayName` у `MobileView`, дополнен JSDoc, добавлены unit-тесты (15 кейсов) и stories по modern pattern. Публичный API не изменён (props, сигнатура хука, barrel-экспорты; `forwardRef` по-прежнему осознанно отсутствует). |
176
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`MediaMaxWidth`, `useMatchMedia`, `useMobileView`). Пояснения к убранным именам сохранены прозой в «Связанные компоненты»; публичный API и поведение не затронуты. |
176
177
 
177
178
  ---
178
179
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: ModalWindow
3
3
  category: ModalWindow
4
- related: [ModalWindowContent, ModalWindowHeader, ModalWindowBody, ModalWindowFooter, ModalWindowClose, ModalWindowViewManager, Portal, FocusTrap, Page, HeaderPage, FooterPage, Island, LoaderScreen]
4
+ related: [LightBox, Portal, Page, HeaderPage, FooterPage, Island, LoaderScreen]
5
5
  tokens:
6
6
  - ModalWindow.Backdrop_Background
7
7
  - ModalWindow.Background
@@ -107,6 +107,8 @@ ModalWindow.Background
107
107
  - **`ModalWindowBody`** — тело. Тривиальная обёртка над `Island` с фиксированными `type=TYPE_1` и `size=MD`. Тип `IModalWindowBodyProps extends Omit<IIslandProps, "loading" | "loaderScreenProps">`. Состояние загрузки у `Island` намеренно отрезано: тело скроллируется (`overflow: auto`), а `LoaderScreen` позиционируется абсолютно и уехал бы вместе с контентом. Загрузку модального окна задавай на `ModalWindowContent`.
108
108
  - **`ModalWindowFooter`** — футер. Тривиальная обёртка над `FooterPage` с фиксированным `type=FIRST`. Экспонирует статическое поле `Description = FooterPage.Description`.
109
109
  - **`ModalWindowClose`** — кнопка закрытия. Обёртка над `Button` (`theme=SECONDARY`, `size=MD`, иконка `CrossStrokeSrvIcon20`) внутри `TriggerClickOnKeyDownEvent` с `EVENT_KEY_CODES.ESCAPE`. **Текст `title` не имеет дефолта внутри компонента** — библиотека мультиязычная, локализованную подсказку (например, `title="Закрыть"`) передаёт потребитель через props. Тип `IModalWindowCloseProps` (Omit `size`/`theme`/`icon` от `IButtonSecondaryProps`).
110
+ - **`LightBox`** — альтернатива для полноэкранного просмотра: тот же механизм оверлея, но контент занимает весь экран, а не центрированное окно.
111
+ - **`FocusTrapExtended`** (`src/components/FocusTrapExtended`) — focus trap окна: `ModalWindow` рендерит его и настраивает через `focusTrapProps` (`IFocusTrapExtendedProps`). Своего AI.md и строки в `docs/ai/ROADMAP.md` не имеет.
110
112
  - **`ModalWindowViewManager`** — невидимый компонент-сенсор. Создаёт DOM-ноду `<div id="modalWindowViewManagerNodeId">` (если её нет в `body`) и рендерит туда через `Portal` resize-сенсор + `<style>`-инжект CSS-переменных `--modalWindow-screen-*` в `:root`. Подключается автоматически из `ModalWindow`; экспортируется отдельно для случая, когда лайаут хочет позиционировать ноду вручную (например, рисовать модалку только в области рабочей зоны без шапки).
111
113
 
112
114
  ---
@@ -138,6 +140,7 @@ ModalWindow.Background
138
140
  | 2026-06-30 | Fix: модалка не отображалась под React 18 `StrictMode`. На искусственном unmount/mount-цикле cleanup в `useEffect` открепляет портальный `mountNode`, а инициализатор `useState` повторно не вызывается — узел оставался вне DOM. Теперь `useEffect` при (повторном) mount возвращает узел в wrapper, если тот откреплён. Wrapper вынесен в `getOrCreateWrapperNode`. Добавлен регрессионный тест на реальном `Portal` (`ModalWindow.strictMode.test.tsx`). |
139
141
  | 2026-08-07 | `IModalWindowBodyProps` сузился до `Omit<IIslandProps, "isLoading" \| "loaderScreenProps">`: в `Island` появилось состояние загрузки, но в скроллируемом теле модалки абсолютный `LoaderScreen` уезжает вместе с контентом. Публичный API не изменён — props исключены до их первого релиза; путь для загрузки модального окна прежний, `ModalWindowContent`. |
140
142
  | 2026-08-11 | Prop загрузки в `Island` переименован `isLoading` → `loading`, вслед за ним `Omit` в `IModalWindowBodyProps` — теперь `Omit<IIslandProps, "loading" \| "loaderScreenProps">`. Публичный API `ModalWindow` не изменён: у `ModalWindowContent` prop по-прежнему `isLoading`. |
143
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): из `related` убраны имена без строки в `docs/ai/ROADMAP.md` (`ModalWindowContent`, `ModalWindowHeader`, `ModalWindowBody`, `ModalWindowFooter`, `ModalWindowClose`, `ModalWindowViewManager`, `FocusTrap`); добавлены обратные ссылки (`LightBox`). Пояснения к убранным `ModalWindow*` сохранены прозой в «Связанные компоненты», а `FocusTrap` там заменён на фактически рендерящийся `FocusTrapExtended`; публичный API и поведение не затронуты. |
141
144
 
142
145
  ---
143
146
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  component: MonthYearField
3
3
  category: Date components
4
- related: [DatePickerExtended, MonthYearRange, ChipMonthYearPicker, TextField, Calendar]
4
+ related: [MonthYearRange, ChipMonthYearPicker, DateField, DatePickerExtended, TextField, Calendar]
5
5
  tokens: []
6
6
  stories: stories/MonthYearField/MonthYearField.stories.tsx
7
7
  version: "1.0"
@@ -61,7 +61,6 @@ version: "1.0"
61
61
  - `forwardRef` на компоненте — не убирать. Ref пробрасывается в `DatePickerExtended` (корневой DOM-элемент — элемент `DatePickerExtended`).
62
62
  - Публичный API (`IMonthYearFieldProps`: `value`, `onChange`, `onClear`, `targetProps`, `placeholder` + унаследованные `size`/`status`/`label` и props `DatePickerExtended`) — изменение имён/типов/значений — breaking change.
63
63
  - Поле read-only по контракту — не делать его редактируемым без обсуждения (компонент не имеет логики валидации клавиатурного ввода).
64
- - Отображаемый формат `"MMM YYYY"` зафиксирован в `inputMonthYearFormat`; менять его — визуальный breaking change для потребителей.
65
64
  - Sync-эффект в `MonthYearField.tsx` (`useEffect` по `[value, format, limitRange]` с `eslint-disable react-hooks/exhaustive-deps`) — намеренная синхронизация derived-стейта `pickerValues` с внешним `value`. Не переписывать без анализа поведения: сравнение идёт по `inputString`, чтобы не сбрасывать стейт при эквивалентных значениях.
66
65
  - Внутренние символы `MonthYearPickerUtils` (`utils.ts`), `MonthYearFieldContext`, `MonthYearFieldTarget` не экспортируются через barrel — это приватные детали реализации.
67
66
 
@@ -82,6 +81,8 @@ version: "1.0"
82
81
  - `MonthYearRange` — выбор диапазона месяцев; использует `MonthYearField` как поля «от» и «до».
83
82
  - `ChipMonthYearPicker` — тот же выбор месяца в виде чипса-фильтра: наследует `IMonthYearFieldProps` и утилиты `MonthYearPickerUtils`, но вместо поля формы рендерит `Chip`.
84
83
  - `TextField` — внутреннее поле-триггер.
84
+ - `Calendar` — календарь внутри дропдауна в режиме `MONTH_YEAR`; его props приходят в публичный API через `DatePickerExtended`.
85
+ - `DateField` — альтернатива для выбора полной даты; устроен по той же схеме, но поле редактируемое и с маской.
85
86
  - `MonthYearFieldTarget` (внутренний, не в barrel) — рендерит `TextField` с иконкой календаря и кнопкой очистки, обрабатывает клик/клавиатуру для открытия дропдауна. Описан здесь, отдельного AI.md не имеет.
86
87
  - `MonthYearFieldContext` (внутренний, не в barrel) — прокидывает `onChange` в target; тривиальный контекст без своей логики.
87
88
  - `MonthYearPickerUtils` (`utils.ts`, внутренний) — чистые функции парсинга/валидации даты (`getPickerValues`, `getCalendarDate`, `isAvailableDate`). Покрыты `__tests__/utils.test.tsx`.
@@ -112,6 +113,7 @@ version: "1.0"
112
113
  | 2026-06-16 | Создан документ. AI-рефакторинг (JSDoc-фиксы), unit-тесты для `utils.ts`, story `VisualTests` и включение скриншот-тестов |
113
114
  | 2026-06-16 | Добавлена story `VisualTestsOpen` — скриншот раскрытого dropdown с календарём (через `play`) |
114
115
  | 2026-09-07 | В «Связанные компоненты» добавлен `ChipMonthYearPicker` — чипс-вариант того же выбора месяца |
116
+ | 2026-09-29 | Аудит симметрии `related` (TRI-156): добавлены обратные ссылки (`DateField`). Публичный API и поведение не затронуты. |
115
117
 
116
118
  ---
117
119
 
@@ -130,7 +132,7 @@ export const DefaultExample = () => {
130
132
 
131
133
  return (
132
134
  <div style={{ maxWidth: 300 }}>
133
- <MonthYearField value={value} placeholder="мм.гггг" label="Label" onChange={setValue} />
135
+ <MonthYearField value={value} placeholder="Select to proceed" label="Label" onChange={setValue} />
134
136
  </div>
135
137
  );
136
138
  };
@@ -154,7 +156,13 @@ const SizeItem = ({ size }: ISizeItemProps) => {
154
156
  return (
155
157
  <div style={{ maxWidth: 300 }}>
156
158
  <div style={{ marginBottom: 8, fontSize: 16, fontWeight: 700 }}>{size.toUpperCase()}</div>
157
- <MonthYearField size={size} value={value} label="Label" placeholder="мм.гггг" onChange={setValue} />
159
+ <MonthYearField
160
+ size={size}
161
+ value={value}
162
+ label="Label"
163
+ placeholder="Select to proceed"
164
+ onChange={setValue}
165
+ />
158
166
  </div>
159
167
  );
160
168
  };
@@ -188,7 +196,13 @@ const StatusItem = ({ status }: IStatusItemProps) => {
188
196
  return (
189
197
  <div style={{ maxWidth: 300 }}>
190
198
  <div style={{ marginBottom: 8, fontSize: 16, fontWeight: 700 }}>{status.toUpperCase()}</div>
191
- <MonthYearField status={status} value={value} label="Label" placeholder="мм.гггг" onChange={setValue} />
199
+ <MonthYearField
200
+ status={status}
201
+ value={value}
202
+ label="Label"
203
+ placeholder="Select to proceed"
204
+ onChange={setValue}
205
+ />
192
206
  </div>
193
207
  );
194
208
  };
@@ -152,6 +152,7 @@ Notification.TimeColor (цвет времени)
152
152
  | Дата | Изменение |
153
153
  |---|---|
154
154
  | 2026-06-16 | Создан AI-документ. `Notification`, `NotificationGrouped`, `NotificationBody` переведены на `forwardRef` (паттерн `Object.assign`); удалены типы `INotificationSFC`/`INotificationBodySFC`; тип `Notification.Time.time` расширен с `React.ReactText` до `React.ReactNode`. Stories мигрированы на modern pattern. |
155
+ | 2026-09-28 | Токен `Notification.Shadow` ссылается на `Shadow.07` (светлая) и `DarkShadow.07` (тёмная) вместо литералов; в тёмной теме прозрачность 0.25 вместо 0.35. |
155
156
 
156
157
  ---
157
158