@sberbusiness/triplex-next-mcp-server 1.45.0-beta → 1.48.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 (60) hide show
  1. package/README.md +7 -7
  2. package/bundle/components/AmountField.md +222 -323
  3. package/bundle/components/Avatar.md +138 -146
  4. package/bundle/components/CardAction.md +615 -0
  5. package/bundle/components/CardStatic.md +402 -0
  6. package/bundle/components/CheckboxTree.md +157 -215
  7. package/bundle/components/CheckboxTreeExtended.md +7 -7
  8. package/bundle/components/Chip.md +7 -6
  9. package/bundle/components/ChipGroup.md +1 -1
  10. package/bundle/components/ChipMonthYearPicker.md +344 -0
  11. package/bundle/components/ChipMultiselect.md +1251 -0
  12. package/bundle/components/ChipOptions.md +329 -0
  13. package/bundle/components/ChipSort.md +333 -0
  14. package/bundle/components/ChipSuggest.md +588 -0
  15. package/bundle/components/CollapsibleTree.md +8 -4
  16. package/bundle/components/CollapsibleTreeExtended.md +8 -6
  17. package/bundle/components/Confirm.md +346 -281
  18. package/bundle/components/DateField.md +222 -303
  19. package/bundle/components/DatePickerExtended.md +3 -1
  20. package/bundle/components/DateRange.md +351 -210
  21. package/bundle/components/FooterPage.md +1 -0
  22. package/bundle/components/FormField.md +14 -5
  23. package/bundle/components/FormGroup.md +3 -2
  24. package/bundle/components/HelpBox.md +7 -1
  25. package/bundle/components/IslandAccordion.md +443 -152
  26. package/bundle/components/IslandWidget.md +622 -157
  27. package/bundle/components/LightBox.md +8 -0
  28. package/bundle/components/ListMaster.md +2 -2
  29. package/bundle/components/ListTableItem.md +6 -6
  30. package/bundle/components/MaskedField.md +2 -1
  31. package/bundle/components/MonthYearField.md +18 -5
  32. package/bundle/components/Slider.md +389 -97
  33. package/bundle/components/SliderRange.md +486 -105
  34. package/bundle/components/StatusTracker.md +386 -94
  35. package/bundle/components/Stepper.md +355 -102
  36. package/bundle/components/StepperExtended.md +633 -0
  37. package/bundle/components/SuggestField.md +1049 -96
  38. package/bundle/components/SwipeableArea.md +7 -7
  39. package/bundle/components/Tabs.md +265 -92
  40. package/bundle/components/TabsExtended.md +18 -18
  41. package/bundle/components/TabsLine.md +301 -127
  42. package/bundle/components/TagColor.md +187 -66
  43. package/bundle/components/TagGroup.md +184 -48
  44. package/bundle/components/TextareaField.md +278 -70
  45. package/bundle/components/TopOverlay.md +17 -1
  46. package/bundle/components/TreeView.md +16 -7
  47. package/bundle/components/TriggerClickOnKeyDownEvent.md +277 -0
  48. package/bundle/components/UploadZone.md +318 -0
  49. package/bundle/guides/codestyle.md +16 -1
  50. package/bundle/guides/commits.md +47 -1
  51. package/bundle/guides/tests.md +23 -2
  52. package/bundle/manifest.json +92 -24
  53. package/bundle/release-notes/1.46.0.mdx +59 -0
  54. package/bundle/release-notes/1.47.0.mdx +122 -0
  55. package/bundle/release-notes/1.48.0.mdx +68 -0
  56. package/bundle/release-notes/1.49.0.mdx +7 -0
  57. package/bundle/tokens.json +3 -3
  58. package/dist/index.js +220 -6
  59. package/dist/index.js.map +1 -1
  60. package/package.json +1 -1
@@ -88,6 +88,12 @@ TRI-21 Alert: AI refactoring + unit-тесты
88
88
  - Первая строка — не длиннее 72 символов.
89
89
  - Тело коммита опционально (для сложных изменений).
90
90
  - Язык: русский или английский — не смешивать в одном коммите.
91
+ - **Не воспроизводи в сообщении текст маркеров** — `[skip ci]`, `[no-pr]`,
92
+ `[update-snapshots]`. Они ищутся во всём сообщении, а не только
93
+ в заголовке, поэтому упоминание в теле срабатывает как настоящий маркер.
94
+ Реальный случай (2026-09-15): пустой коммит, объяснявший в теле, что
95
+ предыдущая вершина помечена маркером пропуска CI, сам оказался пропущен —
96
+ и PR так и остался без проверок. Пиши словами: «маркер пропуска прогонов».
91
97
 
92
98
  **Исключение — релизные коммиты еженедельного релиза.** Их делает
93
99
  [`release-weekly.yml`](../../.github/workflows/release-weekly.yml) в GitHub
@@ -107,6 +113,33 @@ Actions, и они идут **без префикса задачи**:
107
113
  При **ручном** выпуске (`/release`) префикс обязателен, как обычно: там
108
114
  задача Linear заводится до начала работы.
109
115
 
116
+ **Исключение — коммит со скриншотами.** Его делает
117
+ [`visual-update.yml`](../../.github/workflows/visual-update.yml) в CI:
118
+
119
+ ```text
120
+ chore: update visual snapshots
121
+ ```
122
+
123
+ Префикса намеренно нет: `auto-pr.yml` создаёт PR по коммитам в формате
124
+ `TRI-XXX ...`, и обновление скриншотов на ветке без PR завело бы его
125
+ со случайным заголовком. А вот коммит-триггер, который пушит агент, обычным
126
+ правилам подчиняется — номер задачи плюс маркер:
127
+
128
+ ```text
129
+ TRI-141 Обновление baseline-скриншотов [update-snapshots]
130
+ ```
131
+
132
+ **Исключение — коммиты Dependabot.** Обновления зависимостей и actions
133
+ приезжают с префиксом `deps` (настроено в
134
+ [`.github/dependabot.yml`](../../.github/dependabot.yml)):
135
+
136
+ ```text
137
+ deps: bump vitest from 3.2.7 to 3.2.8
138
+ ```
139
+
140
+ Причина та же: задачи Linear под такой PR нет, и бот её не заведёт. Разбирает
141
+ эти PR человек, при необходимости заводя задачу на нетривиальное обновление.
142
+
110
143
  ---
111
144
 
112
145
  ## Когда запускать линтер
@@ -254,7 +287,7 @@ fi
254
287
  | `git push` ветки, включая защищённый `main` | ✅ |
255
288
  | Создание и мерж PR, комментарии | ✅ |
256
289
  | Чтение REST и Actions | ✅ |
257
- | Диспатч нерелизных workflow (`visual-update.yml`) | ✅ |
290
+ | Диспатч нерелизных workflow (`visual-update.yml`) | ❌ с 2026-09-15 |
258
291
  | `git push` тега | ❌ `RPC failed; HTTP 403` |
259
292
  | `POST /git/refs`, `PATCH /git/refs/heads/*` | ❌ |
260
293
  | `gh release create` | ❌ |
@@ -265,6 +298,19 @@ fi
265
298
  permitted through this proxy` — это ограничение прокси, а не прав токена
266
299
  и не настроек репозитория. Менять branch protection бесполезно.
267
300
 
301
+ **Диспатч `visual-update.yml` перестал проходить 2026-09-15** — 403
302
+ «Resource not accessible by integration», хотя зонды 14 и 21 августа
303
+ фиксировали его как доступный, а 11 сентября утренняя routine ещё его
304
+ выполняла. Со стороны репозитория всё в порядке: тот же вызов с локальным
305
+ PAT проходит (прогон 34941531923), workflow активен, права не менялись.
306
+ Что именно изменилось — allowlist прокси или права GitHub App — изнутри
307
+ репозитория не различить, поэтому причина здесь не утверждается.
308
+
309
+ Следствие: baseline-скриншоты обновляются **пушем коммита с маркером
310
+ `[update-snapshots]`**, а не диспатчем (TRI-141, см.
311
+ `.agents/skills/update-visual-baselines/SKILL.md`). Триггер опирается
312
+ только на `git push`, который из облака доступен.
313
+
268
314
  **Следствие для релиза:** выпустить его из облачной сессии нельзя ни одним
269
315
  маршрутом. Поэтому механика релиза живёт в GitHub Actions
270
316
  (`.github/workflows/release-weekly.yml`), расписание держит сам GitHub, а
@@ -57,15 +57,36 @@ Uncaught Error: Vitest failed to access its internal state.
57
57
  Именно это произошло в 1.39.0 из-за файла `src/components/Carousel/__tests__/utils.ts`
58
58
  (хелпер без постфикса `.test`). Чанк `vendor` вырос с 640 KB до 1.28 MB.
59
59
 
60
+ **Страховка на уровне сборки (TRI-106).** После той регрессии `vite.config.ts`
61
+ исключает из `rollupOptions.input` не только `*.test.{ts,tsx}`, но и целиком
62
+ `src/**/__tests__/**`, `src/**/__test__/**` и `src/**/tests/**`. Важно понимать
63
+ границу: исключение из `input` означает, что такой файл не становится
64
+ **отдельной entry-точкой**. Оно не запрещает Rollup затянуть файл в бандл
65
+ транзитивно, если его импортирует production-код. То же и с `test-utils/`:
66
+ каталог вне `src/` просто не попадает в `input`, но в граф импортов попасть
67
+ может.
68
+
69
+ Поэтому правило ниже — не формальность, а первая линия защиты: если в
70
+ production-код не ведёт ни одного импорта тестового хелпера, транзитивного
71
+ попадания не будет. А окончательная проверка — только содержимое `dist`:
72
+
73
+ ```bash
74
+ grep -rl 'testing-library\|vitest' dist/ --include='*.js' # должно быть пусто
75
+ ```
76
+
77
+ Не читай нарушение правила как «прямо сейчас течёт в бандл» и наоборот — не
78
+ считай соблюдение правила доказательством, что не течёт. Смотри `dist`.
79
+
60
80
  **Общие тестовые хелперы** (моки `ResizeObserver`, фейковые `Touch`, подмена
61
81
  размеров элементов и т.п.) кладём в `test-utils/` в корне репозитория — вне `src/`,
62
- поэтому сборка их физически не видит:
82
+ поэтому отдельной entry-точкой они не становятся и исключения в конфиге сборки
83
+ для них не нужны:
63
84
 
64
85
  ```typescript
65
86
  // ✅ src/components/Carousel/__tests__/CarouselRoot.test.tsx
66
87
  import { getResizeCallback, mockElementSize } from "../../../../test-utils/dom";
67
88
 
68
- // ❌ src/components/Carousel/__tests__/utils.ts — станет entry-точкой сборки
89
+ // ❌ src/components/Carousel/__tests__/utils.ts — общему хелперу здесь не место
69
90
  import { vi } from "vitest";
70
91
  ```
71
92
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "triplexVersion": "1.45.0",
4
- "generatedAt": "2026-09-04T13:44:34.562Z",
3
+ "triplexVersion": "1.48.0",
4
+ "generatedAt": "2026-09-25T18:18:53.795Z",
5
5
  "components": [
6
6
  {
7
7
  "name": "AbstractTree",
@@ -41,13 +41,13 @@
41
41
  },
42
42
  {
43
43
  "name": "AmountField",
44
- "path": "src/components/AmountField/AmountField-AI.md",
44
+ "path": "src/components/AmountField/AmountField-ai.md",
45
45
  "file": "components/AmountField.md",
46
46
  "ai_ready": true
47
47
  },
48
48
  {
49
49
  "name": "Avatar",
50
- "path": "src/components/Avatar/Avatar-AI.md",
50
+ "path": "src/components/Avatar/Avatar-ai.md",
51
51
  "file": "components/Avatar.md",
52
52
  "ai_ready": true
53
53
  },
@@ -111,6 +111,18 @@
111
111
  "file": "components/Card.md",
112
112
  "ai_ready": true
113
113
  },
114
+ {
115
+ "name": "CardAction",
116
+ "path": "src/components/Card/CardAction-ai.md",
117
+ "file": "components/CardAction.md",
118
+ "ai_ready": true
119
+ },
120
+ {
121
+ "name": "CardStatic",
122
+ "path": "src/components/Card/CardStatic-ai.md",
123
+ "file": "components/CardStatic.md",
124
+ "ai_ready": true
125
+ },
114
126
  {
115
127
  "name": "Carousel",
116
128
  "path": "src/components/Carousel",
@@ -132,7 +144,7 @@
132
144
  },
133
145
  {
134
146
  "name": "CheckboxTree",
135
- "path": "src/components/CheckboxTree/CheckboxTree-AI.md",
147
+ "path": "src/components/CheckboxTree/CheckboxTree-ai.md",
136
148
  "file": "components/CheckboxTree.md",
137
149
  "ai_ready": true
138
150
  },
@@ -166,6 +178,36 @@
166
178
  "file": "components/ChipGroup.md",
167
179
  "ai_ready": true
168
180
  },
181
+ {
182
+ "name": "ChipMonthYearPicker",
183
+ "path": "src/components/Chip/ChipMonthYearPicker-ai.md",
184
+ "file": "components/ChipMonthYearPicker.md",
185
+ "ai_ready": true
186
+ },
187
+ {
188
+ "name": "ChipMultiselect",
189
+ "path": "src/components/Chip/ChipMultiselect-ai.md",
190
+ "file": "components/ChipMultiselect.md",
191
+ "ai_ready": true
192
+ },
193
+ {
194
+ "name": "ChipOptions",
195
+ "path": "src/components/Chip/ChipOptions-ai.md",
196
+ "file": "components/ChipOptions.md",
197
+ "ai_ready": true
198
+ },
199
+ {
200
+ "name": "ChipSort",
201
+ "path": "src/components/Chip/ChipSort-ai.md",
202
+ "file": "components/ChipSort.md",
203
+ "ai_ready": true
204
+ },
205
+ {
206
+ "name": "ChipSuggest",
207
+ "path": "src/components/Chip/ChipSuggest-ai.md",
208
+ "file": "components/ChipSuggest.md",
209
+ "ai_ready": true
210
+ },
169
211
  {
170
212
  "name": "CodeText",
171
213
  "path": "src/components/Typography/CodeText-ai.md",
@@ -198,13 +240,13 @@
198
240
  },
199
241
  {
200
242
  "name": "Confirm",
201
- "path": "src/components/Confirm/Confirm-AI.md",
243
+ "path": "src/components/Confirm/Confirm-ai.md",
202
244
  "file": "components/Confirm.md",
203
245
  "ai_ready": true
204
246
  },
205
247
  {
206
248
  "name": "DateField",
207
- "path": "src/components/DateField/DateField-AI.md",
249
+ "path": "src/components/DateField/DateField-ai.md",
208
250
  "file": "components/DateField.md",
209
251
  "ai_ready": true
210
252
  },
@@ -216,7 +258,7 @@
216
258
  },
217
259
  {
218
260
  "name": "DateRange",
219
- "path": "src/components/DateRange/DateRange-AI.md",
261
+ "path": "src/components/DateRange/DateRange-ai.md",
220
262
  "file": "components/DateRange.md",
221
263
  "ai_ready": true
222
264
  },
@@ -343,13 +385,13 @@
343
385
  },
344
386
  {
345
387
  "name": "IslandAccordion",
346
- "path": "src/components/IslandAccordion/IslandAccordion-AI.md",
388
+ "path": "src/components/IslandAccordion/IslandAccordion-ai.md",
347
389
  "file": "components/IslandAccordion.md",
348
390
  "ai_ready": true
349
391
  },
350
392
  {
351
393
  "name": "IslandWidget",
352
- "path": "src/components/IslandWidget/IslandWidget-AI.md",
394
+ "path": "src/components/IslandWidget/IslandWidget-ai.md",
353
395
  "file": "components/IslandWidget.md",
354
396
  "ai_ready": true
355
397
  },
@@ -608,7 +650,7 @@
608
650
  },
609
651
  {
610
652
  "name": "Slider",
611
- "path": "src/components/Slider/Slider-AI.md",
653
+ "path": "src/components/Slider/Slider-ai.md",
612
654
  "file": "components/Slider.md",
613
655
  "ai_ready": true
614
656
  },
@@ -620,7 +662,7 @@
620
662
  },
621
663
  {
622
664
  "name": "SliderRange",
623
- "path": "src/components/SliderRange/SliderRange-AI.md",
665
+ "path": "src/components/SliderRange/SliderRange-ai.md",
624
666
  "file": "components/SliderRange.md",
625
667
  "ai_ready": true
626
668
  },
@@ -644,7 +686,7 @@
644
686
  },
645
687
  {
646
688
  "name": "StatusTracker",
647
- "path": "src/components/StatusTracker/StatusTracker-AI.md",
689
+ "path": "src/components/StatusTracker/StatusTracker-ai.md",
648
690
  "file": "components/StatusTracker.md",
649
691
  "ai_ready": true
650
692
  },
@@ -656,10 +698,16 @@
656
698
  },
657
699
  {
658
700
  "name": "Stepper",
659
- "path": "src/components/Stepper/Stepper-AI.md",
701
+ "path": "src/components/Stepper/Stepper-ai.md",
660
702
  "file": "components/Stepper.md",
661
703
  "ai_ready": true
662
704
  },
705
+ {
706
+ "name": "StepperExtended",
707
+ "path": "src/components/Stepper/StepperExtended-ai.md",
708
+ "file": "components/StepperExtended.md",
709
+ "ai_ready": true
710
+ },
663
711
  {
664
712
  "name": "Suggest",
665
713
  "path": "src/components/Suggest/Suggest-ai.md",
@@ -668,7 +716,7 @@
668
716
  },
669
717
  {
670
718
  "name": "SuggestField",
671
- "path": "src/components/SuggestField/SuggestField-AI.md",
719
+ "path": "src/components/SuggestField/SuggestField-ai.md",
672
720
  "file": "components/SuggestField.md",
673
721
  "ai_ready": true
674
722
  },
@@ -692,7 +740,7 @@
692
740
  },
693
741
  {
694
742
  "name": "Tabs",
695
- "path": "src/components/Tabs/Tabs-AI.md",
743
+ "path": "src/components/Tabs/Tabs-ai.md",
696
744
  "file": "components/Tabs.md",
697
745
  "ai_ready": true
698
746
  },
@@ -704,7 +752,7 @@
704
752
  },
705
753
  {
706
754
  "name": "TabsLine",
707
- "path": "src/components/TabsLine/TabsLine-AI.md",
755
+ "path": "src/components/TabsLine/TabsLine-ai.md",
708
756
  "file": "components/TabsLine.md",
709
757
  "ai_ready": true
710
758
  },
@@ -716,13 +764,13 @@
716
764
  },
717
765
  {
718
766
  "name": "TagColor",
719
- "path": "src/components/TagColor/TagColor-AI.md",
767
+ "path": "src/components/TagColor/TagColor-ai.md",
720
768
  "file": "components/TagColor.md",
721
769
  "ai_ready": true
722
770
  },
723
771
  {
724
772
  "name": "TagGroup",
725
- "path": "src/components/TagGroup/TagGroup-AI.md",
773
+ "path": "src/components/TagGroup/TagGroup-ai.md",
726
774
  "file": "components/TagGroup.md",
727
775
  "ai_ready": true
728
776
  },
@@ -734,7 +782,7 @@
734
782
  },
735
783
  {
736
784
  "name": "TextareaField",
737
- "path": "src/components/TextareaField/TextareaField-AI.md",
785
+ "path": "src/components/TextareaField/TextareaField-ai.md",
738
786
  "file": "components/TextareaField.md",
739
787
  "ai_ready": true
740
788
  },
@@ -780,6 +828,12 @@
780
828
  "file": "components/TreeViewNode.md",
781
829
  "ai_ready": true
782
830
  },
831
+ {
832
+ "name": "TriggerClickOnKeyDownEvent",
833
+ "path": "src/components/Triggers/TriggerClickOnKeyDownEvent-ai.md",
834
+ "file": "components/TriggerClickOnKeyDownEvent.md",
835
+ "ai_ready": true
836
+ },
783
837
  {
784
838
  "name": "Triggers",
785
839
  "path": "src/components/Triggers/Triggers-AI.md",
@@ -807,10 +861,9 @@
807
861
  },
808
862
  {
809
863
  "name": "UploadZone",
810
- "path": "src/components/UploadZone",
811
- "file": null,
812
- "ai_ready": false,
813
- "storiesPath": "stories/UploadZone/UploadZone.stories.tsx"
864
+ "path": "src/components/UploadZone/UploadZone-ai.md",
865
+ "file": "components/UploadZone.md",
866
+ "ai_ready": true
814
867
  },
815
868
  {
816
869
  "name": "WindowResizeListener",
@@ -1094,6 +1147,21 @@
1094
1147
  "file": "release-notes/1.46.0.mdx",
1095
1148
  "path": "stories/release-notes/v1/1.46.0.mdx"
1096
1149
  },
1150
+ {
1151
+ "version": "1.47.0",
1152
+ "file": "release-notes/1.47.0.mdx",
1153
+ "path": "stories/release-notes/v1/1.47.0.mdx"
1154
+ },
1155
+ {
1156
+ "version": "1.48.0",
1157
+ "file": "release-notes/1.48.0.mdx",
1158
+ "path": "stories/release-notes/v1/1.48.0.mdx"
1159
+ },
1160
+ {
1161
+ "version": "1.49.0",
1162
+ "file": "release-notes/1.49.0.mdx",
1163
+ "path": "stories/release-notes/v1/1.49.0.mdx"
1164
+ },
1097
1165
  {
1098
1166
  "version": "1.5.0",
1099
1167
  "file": "release-notes/1.5.0.mdx",
@@ -4,4 +4,63 @@ import { Meta, Title, Heading } from "@storybook/addon-docs/blocks";
4
4
 
5
5
  <Title>v1.46.0</Title>
6
6
 
7
+ <Heading>Новые компоненты</Heading>
8
+
9
+ **ChipMonthYearPicker**
10
+
11
+ - Компонент выбора месяца и года с видом `Chip`.
12
+
7
13
  <Heading>Изменения</Heading>
14
+
15
+ **CardAction**
16
+
17
+ - Исправлен аргумент `onToggle` в неконтролируемом режиме: колбэк получает актуальное состояние выбора. Раньше при нескольких переключениях в одном пакете обновлений React (например, два вызова `handleToggle` подряд через `ref`) все вызовы `onToggle` получали одно и то же значение, не совпадающее с итоговым состоянием карточки. Одиночное переключение по клику, `Enter` или `Space` работает как прежде.
18
+ - Проведён AI-рефакторинг: других изменений для потребителя нет.
19
+
20
+ **ChipMultiselect**
21
+
22
+ - Проведён AI-рефакторинг: изменений для потребителя нет.
23
+
24
+ **ChipOptions**
25
+
26
+ - Добавлен prop `clearButtonProps` — props кнопки сброса выбора (`aria-label`, `disabled`, `className`, `data-*`). Размер кнопки по-прежнему задаётся `size` чипса и в тип не входит. Переданные `onClick` и `onKeyDown` не заменяют собственные обработчики компонента, а вызываются после них.
27
+ - `Enter` и `Space`, нажатые на кнопке сброса, больше не всплывают до чипса: `Space` теперь активирует кнопку, а внешний `onKeyDown` чипса не срабатывает заодно со сбросом.
28
+ - Проведён AI-рефакторинг: других изменений для потребителя нет.
29
+
30
+ **ChipSort**
31
+
32
+ - Проведён AI-рефакторинг: изменений для потребителя нет.
33
+
34
+ **ChipSuggest**
35
+
36
+ - Проведён AI-рефакторинг: `ChipSuggest` больше не оборачивает переданный `ref` в новую функцию на каждый рендер, поэтому стабильный callback-`ref` перестал переприкрепляться (элемент, на который указывает `ref`, прежний). Других изменений для потребителя нет.
37
+
38
+ **DateField**
39
+
40
+ - Проведён AI-рефакторинг, добавлен `displayName` у внутреннего управляющего элемента поля.
41
+
42
+ **HelpBox**
43
+
44
+ - Проведён AI-рефакторинг: `HelpBox` больше не оборачивает переданный `ref` в новую функцию на каждый рендер, поэтому стабильный callback-`ref` перестал переприкрепляться. Автогенерируемый `id` подсказки теперь имеет вид `HelpBox-<n>` вместо `:r<n>:`. Других изменений для потребителя нет.
45
+ - Исправлен баг, когда компонент при открытии наведением мыши перехватывал фокус у полей ввода, внутри которых находился.
46
+
47
+ **IslandAccordion**
48
+
49
+ - Проведён AI-рефакторинг: при `num={0}` со `status` в заголовке больше не появляется текст «0» (кружок шага, как и прежде, не рендерится). Автогенерируемые `id` заголовка и раскрывающейся области теперь имеют вид `IslandAccordionItem-<n>-header` и `IslandAccordionItem-<n>-body`. Смена `opened` применяется в том же рендере, без промежуточного кадра со старым состоянием. Других изменений для потребителя нет.
50
+
51
+ **IslandWidget**
52
+
53
+ - Исправлено: размонтирование раскрытого `IslandWidget.ExtraFooter` больше не оставляет на виджете тень и отступ под уже убранный подвал. Раньше состояние сбрасывалось только сменой `open` на `false`, поэтому условный рендеринг подвала оставлял виджет в состоянии «подвал раскрыт».
54
+ - Исправлено: если в одном `IslandWidget.Wrapper` раскрыто несколько `ExtraFooter`, закрытие или удаление одного из них больше не снимает тень с виджета, пока раскрыт хотя бы один.
55
+ - Исправлено: при `disableAdaptiveCollapsing` клик по шапке в адаптиве больше не переключает внутреннее состояние раскрытия вхолостую — обработчик не навешивается, когда сворачивание отключено. Вид виджета в этом режиме прежний.
56
+ - С тени `ExtraFooter` снята пометка `!important` — теперь её можно переопределить своими стилями. Сама тень выглядит как прежде.
57
+ - Проведён AI-рефакторинг: `className`, переданный в `IslandWidget.Footer.Content` и `IslandWidget.Footer.Controls`, больше не затирается базовым классом компонента, а дополняет его. Атрибут `data-tx` теперь проставляется после остальных props и потребителем не переопределяется.
58
+ - Экспортированы интерфейсы `IIslandWidgetHeaderDescriptionProps` и `IIslandWidgetHeaderContentProps` — стало возможно типизировать обёртки над `IslandWidget.Header.Description` и `IslandWidget.Header.Content`.
59
+
60
+ **MaskedField**
61
+
62
+ - Исправлен баг, когда номер телефона, переданный в `value` с кодом страны, отображался со сдвигом на одну цифру.
63
+
64
+ **TextareaField**
65
+
66
+ - `height` заменен на `min-height`.
@@ -0,0 +1,122 @@
1
+ import { Meta, Title, Heading } from "@storybook/addon-docs/blocks";
2
+
3
+ <Meta title="release-notes/v1/1.47.0" />
4
+
5
+ <Title>v1.47.0</Title>
6
+
7
+ <Heading>Ломающие изменения</Heading>
8
+
9
+ **Carousel.Indicators**
10
+
11
+ - Удалено свойство `renderIndicator`.
12
+
13
+ **FormFieldTextarea**
14
+
15
+ - Удалено свойство `disabled`, используйте `status` со значением `EFormFieldStatus.DISABLED`. Раньше переданное значение всё равно перетиралось статусом. Для `FormFieldInput` / `FormFieldMaskedInput` то же было сделано в 1.45.0.
16
+
17
+ **TextareaField**
18
+
19
+ - Свойство `disabled` больше нельзя передать в `textareaProps` — следствие правки `FormFieldTextarea` выше.
20
+
21
+ **TreeView**
22
+
23
+ - `ref` на `TreeView` теперь отдаёт корневой `<ul role="tree">`, а не инстанс класса. Компонент по-прежнему реализован классом внутри, но наружу экспортируется как `React.ForwardRefExoticComponent`. Это выравнивает `TreeView` с остальной библиотекой, где `ref` всегда указывает на корневой DOM-узел.
24
+ - `TreeView` больше не является типом: `React.createRef<TreeView>()` не компилируется, используйте `React.createRef<HTMLUListElement>()`.
25
+
26
+ <Heading>Изменения</Heading>
27
+
28
+ **AmountField**
29
+
30
+ - Добавлено: `clearProps` — свойства кнопки очистки. Нужен, чтобы задать ей доступное имя (`aria-label`): кнопка содержит только иконку, а зашить дефолтную строку нельзя — библиотека мультиязычная. Обработчик клика по-прежнему задаётся через `onClear`.
31
+ - Исправлено: каретка в сфокусированном поле больше не остаётся на позиции из прежнего формата, когда меняется `fractionDigits` или `maxIntegerDigits`, а `value` при этом не меняется.
32
+ - Проведён AI-рефакторинг: у компонента появился `displayName` (виден в React DevTools). Других изменений для потребителя нет.
33
+
34
+ **Avatar**
35
+
36
+ - Проведён AI-рефакторинг: изменений для потребителя нет.
37
+
38
+ **CardStatic**
39
+
40
+ - Добавлено: `CardStatic` пробрасывает `ref` на свой корневой `<div>` — раньше компонент был объявлен как `React.FC`, поэтому переданный `ref` терялся. Тип компонента изменился на `React.ForwardRefExoticComponent`.
41
+ - Проведён AI-рефакторинг: других изменений для потребителя нет.
42
+
43
+ **Carousel.Indicators**
44
+
45
+ - Добавлена анимация для индикаторов.
46
+
47
+ **CheckboxTree**
48
+
49
+ - Добавлено: `CheckboxTree` пробрасывает `ref` на свой корневой `<ul role="tree">` — раньше компонент был объявлен как `React.FC`, поэтому переданный `ref` терялся. Тип компонента изменился на `React.ForwardRefExoticComponent`.
50
+ - Добавлено: `CheckboxTree` прокидывает `className`, `id`, `data-*` и остальные html-атрибуты на свой корневой `<ul>` — раньше он деструктурировал только `checkboxes`, `onChange` и `size`, а всё остальное молча терял, хотя тип их разрешал.
51
+ - Исправлено: узел с пустым массивом `children` больше не становится выбранным сам по себе. Раньше условие «все потомки выбраны» выполнялось для него вырожденно (`0 === 0`), и узел уезжал в `onChange` с `checked: true` после первого же клика по любому чекбоксу дерева. Теперь пустой `children` обрабатывается как лист.
52
+ - Проведён AI-рефакторинг: других изменений для потребителя нет.
53
+
54
+ **CheckboxTreeExtended**
55
+
56
+ - Добавлено: `CheckboxTreeExtended` пробрасывает `ref` на свой корневой `<ul role="tree">`. Тип компонента изменился на `React.ForwardRefExoticComponent`.
57
+ - Изменено: тип `ICheckboxTreeExtendedSFC` переименован в `ICheckboxTreeExtendedFC` — название `SFC` больше не отражает форму компонента. Старое имя сохранено как deprecated-алиас, поэтому импорты не ломаются. Но алиас указывает на новый тип: если вы аннотировали им собственный компонент (`const My: ICheckboxTreeExtendedSFC = (props) => ...`), аннотацию нужно убрать или заменить — это следствие перехода на `forwardRef`.
58
+
59
+ **CollapsibleTreeExtended**
60
+
61
+ - Добавлено: `CollapsibleTreeExtended` пробрасывает `ref` на свой корневой `<ul role="tree">`. Тип компонента изменился на `React.ForwardRefExoticComponent`.
62
+ - Изменено: тип `ICollapsibleTreeExtendedSFC` переименован в `ICollapsibleTreeExtendedFC`. Старое имя сохранено как deprecated-алиас, поэтому импорты не ломаются, но сам тип теперь `ForwardRefExoticComponent` — собственные аннотации им нужно убрать или заменить.
63
+
64
+ **Confirm**
65
+
66
+ - Добавлено: `Confirm` пробрасывает `ref` на свой корневой `<div>` — раньше компонент был объявлен как `React.FC`, поэтому переданный `ref` терялся. Тип компонента изменился на `React.ForwardRefExoticComponent`.
67
+ - Добавлено: `ref` пробрасывают и составные части — `Confirm.Content` (и её `Title` / `SubTitle`), `Confirm.Controls`, `Confirm.Close`. Раньше все они были объявлены как `React.FC`.
68
+ - Изменено: у `Confirm.Close` больше нет дефолтного `title="Закрыть"`. Кнопка иконочная, поэтому без явного `title` (или `aria-label`) у неё не будет доступного имени — передавайте его сами. Строки на конкретном языке внутри компонентов библиотеки не задаются.
69
+ - Изменено: `ref` у `Confirm.Content.Title` и `Confirm.Content.SubTitle` типизирован как `HTMLElement` вместо `HTMLHeadingElement` и `HTMLDivElement`. Оба компонента разрешают переопределить тег через `tag`, и прежние типы обещали не тот DOM-узел.
70
+ - Проведён AI-рефакторинг: других изменений для потребителя нет.
71
+
72
+ **DateRange**
73
+
74
+ - Добавлено: `DateRange` пробрасывает `ref` на свой корневой `<div>` — раньше компонент был объявлен как `React.FC`, поэтому переданный `ref` терялся. Тип компонента изменился на `React.ForwardRefExoticComponent`.
75
+ - Проведён AI-рефакторинг: других изменений для потребителя нет.
76
+
77
+ **FormField**
78
+
79
+ - Исправлен баг, когда в консоли браузера появлялась ошибка связи лейбла с полем для полей без элемента ввода.
80
+
81
+ **Page.Footer**
82
+
83
+ - Добавлен нижний отступ для `type={EFooterPageType.SECOND}`.
84
+
85
+ **Slider**
86
+
87
+ - Добавлено: `Slider` пробрасывает `ref` на свой корневой `<div>` — раньше компонент был объявлен как `React.FC`, поэтому переданный `ref` терялся. Тип компонента изменился на `React.ForwardRefExoticComponent`.
88
+ - Проведён AI-рефакторинг, добавлен `displayName`: других изменений для потребителя нет.
89
+
90
+ **SliderRange**
91
+
92
+ - Проведён AI-рефакторинг: изменений для потребителя нет.
93
+
94
+ **Step**
95
+
96
+ - Изменен цвет токена `Step.Background_Active` в светлой теме.
97
+
98
+ **TabsLine**
99
+
100
+ - Добавлено: `TabsLine` пробрасывает `ref` на свой корневой `<div>` — раньше компонент был объявлен как `React.FC`, поэтому переданный `ref` терялся. Тип компонента изменился на `React.ForwardRefExoticComponent`.
101
+ - Добавлено: `ref` пробрасывают и остальные компоненты семейства — `TabsLineDesktop`, `TabsLineMobile` и `TabsLineDropdown`. Раньше все они были объявлены как `React.FC`.
102
+ - Добавлено: `TabsLineDesktop` и `TabsLineMobile` прокидывают `className` и остальные html-атрибуты на свой корневой `<div>` — раньше они их молча теряли.
103
+ - Исправлено: таб больше не теряет `className`, `onMouseEnter` и `onMouseLeave`, переданные в элементе массива `tabs`. Раньше `className` перетирался внутренним, а обработчики наведения не вызывались.
104
+ - Исправлено: кнопка дропдауна больше не теряет `className`, `onClick` и `onKeyDown`, переданные в `dropdownTargetHtmlAttributes`. Раньше `className` перетирался внутренним, а обработчики не вызывались.
105
+ - Исправлено: табы отображаются на первом же рендере. Раньше распределение между строкой и дропдауном считалось в `useEffect`, поэтому первый кадр был пустым.
106
+ - Изменено: из кнопки дропдауна и пунктов выпадающего списка убраны вложенные `<span>`-обёртки без классов в LESS-модуле. Визуально ничего не изменилось, но собственные стили по вложенности (`button > span`) и e2e-локаторы могут перестать находить элементы.
107
+ - Изменено: DOM `id` пункта выпадающего списка больше не равен `id` таба — он выводится из внутреннего идентификатора экземпляра. Раньше два `TabsLine` с одинаковыми `id` табов давали дублирующиеся DOM `id`, и `aria-activedescendant` мог адресовать пункт чужого экземпляра. В `onChangeTab` по-прежнему приходит исходный `id` таба.
108
+ - Проведён AI-рефакторинг, добавлен `displayName`.
109
+
110
+ **TextareaField**
111
+
112
+ - Добавлено: `TextareaField` пробрасывает `ref` на `<div>` поля (`FormField`, внутри обёртки `FormGroup`) — туда же, куда уходит `className`. Раньше компонент был объявлен как `React.FC`, поэтому переданный `ref` терялся. Тип компонента изменился на `React.ForwardRefExoticComponent`.
113
+ - Проведён AI-рефакторинг, добавлен `displayName`: других изменений для потребителя нет.
114
+
115
+ **TriggerClickOnKeyDownEvent**
116
+
117
+ - Добавлено: тип props `ITriggerClickOnKeyDownEventProps` теперь экспортируется — раньше интерфейс был внутренним, и типизировать обёртки над компонентом приходилось вручную.
118
+ - Проведён AI-рефакторинг: других изменений для потребителя нет.
119
+
120
+ **Установка**
121
+
122
+ - Тег `react17` в npm снова указывает на актуальную React 17-сборку: `npm i @sberbusiness/triplex-next@react17` ставит версию текущего релиза. Раньше тег не двигался при выпусках и с августа отдавал `0.41.1`. Теги работают в npmjs; из внутреннего registry по-прежнему ставьте по точному номеру версии.