chuijs 4.0.1 → 4.0.3

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 (222) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/README.md +43 -632
  3. package/framework/appLayout/default/chui_app_layout.js +314 -273
  4. package/framework/appLayout/default/global_style.css +93 -53
  5. package/framework/components/chui_accordion/accordion.js +29 -26
  6. package/framework/components/chui_accordion/styles.css +6 -5
  7. package/framework/components/chui_action_sheet/action_sheet.js +59 -33
  8. package/framework/components/chui_action_sheet/styles.css +2 -1
  9. package/framework/components/chui_affix/affix.js +11 -6
  10. package/framework/components/chui_alert/alert.js +23 -14
  11. package/framework/components/chui_avatar/avatar.js +23 -22
  12. package/framework/components/chui_avatar_group/avatar_group.js +21 -19
  13. package/framework/components/chui_backtop/backtop.js +35 -19
  14. package/framework/components/chui_badge/badge.js +15 -13
  15. package/framework/components/chui_breadcrumb/breadcrumb.js +15 -13
  16. package/framework/components/chui_button/button.js +42 -22
  17. package/framework/components/chui_button/styles.css +2 -2
  18. package/framework/components/chui_calendar/calendar.js +12 -10
  19. package/framework/components/chui_card/card.js +43 -23
  20. package/framework/components/chui_chat/chat.js +72 -33
  21. package/framework/components/chui_clipboard_history/clipboard_history.js +30 -21
  22. package/framework/components/chui_clipboard_history/styles.css +4 -2
  23. package/framework/components/chui_code/code.js +2 -2
  24. package/framework/components/chui_code/styles.css +2 -2
  25. package/framework/components/chui_code_editor/code_editor.js +47 -31
  26. package/framework/components/chui_code_editor/styles.css +3 -2
  27. package/framework/components/chui_command_palette/command_palette.js +60 -37
  28. package/framework/components/chui_console/console.js +5 -5
  29. package/framework/components/chui_console/styles.css +1 -1
  30. package/framework/components/chui_content_block/content_block.js +33 -19
  31. package/framework/components/chui_content_block/styles.css +2 -2
  32. package/framework/components/chui_context_menu/context_menu.js +9 -4
  33. package/framework/components/chui_custom_element/custom_element.js +22 -15
  34. package/framework/components/chui_data_grid/data_grid.js +396 -234
  35. package/framework/components/chui_data_grid/styles.css +10 -8
  36. package/framework/components/chui_descriptions/descriptions.js +34 -17
  37. package/framework/components/chui_details/details.js +32 -26
  38. package/framework/components/chui_details/styles.css +5 -4
  39. package/framework/components/chui_diff_viewer/diff_viewer.js +91 -66
  40. package/framework/components/chui_diff_viewer/styles.css +1 -1
  41. package/framework/components/chui_divider/divider.js +13 -11
  42. package/framework/components/chui_drawer/drawer.js +27 -25
  43. package/framework/components/chui_drop_zone/drop_zone.js +31 -21
  44. package/framework/components/chui_empty_state/empty_state.js +20 -15
  45. package/framework/components/chui_fieldset/fieldset.js +37 -20
  46. package/framework/components/chui_fieldset/styles.css +1 -1
  47. package/framework/components/chui_file_explorer/file_explorer.js +157 -86
  48. package/framework/components/chui_file_explorer/styles.css +2 -1
  49. package/framework/components/chui_form/form.js +31 -19
  50. package/framework/components/chui_form/styles.css +1 -1
  51. package/framework/components/chui_gantt/gantt.js +64 -40
  52. package/framework/components/chui_graphs/graphs.js +301 -200
  53. package/framework/components/chui_graphs/styles.css +1 -1
  54. package/framework/components/chui_hero/hero.js +40 -22
  55. package/framework/components/chui_html_block/html_block.js +6 -6
  56. package/framework/components/chui_html_block/styles.css +2 -2
  57. package/framework/components/chui_hx/hx.js +3 -3
  58. package/framework/components/chui_hx/styles.css +11 -4
  59. package/framework/components/chui_icons/icons.js +2109 -2109
  60. package/framework/components/chui_icons/styles.css +2 -2
  61. package/framework/components/chui_inputs/chui_check_box/check_box.js +31 -19
  62. package/framework/components/chui_inputs/chui_check_box/styles.css +18 -18
  63. package/framework/components/chui_inputs/chui_chips/chips.js +50 -40
  64. package/framework/components/chui_inputs/chui_chips/styles.css +4 -2
  65. package/framework/components/chui_inputs/chui_color_picker/color_picker.js +36 -24
  66. package/framework/components/chui_inputs/chui_combo_box/combo_box.js +100 -82
  67. package/framework/components/chui_inputs/chui_combo_box/styles.css +14 -12
  68. package/framework/components/chui_inputs/chui_date/date.js +102 -66
  69. package/framework/components/chui_inputs/chui_date/styles.css +12 -11
  70. package/framework/components/chui_inputs/chui_date_range/date_range.js +40 -29
  71. package/framework/components/chui_inputs/chui_datetime/datetime.js +35 -27
  72. package/framework/components/chui_inputs/chui_email/email.js +43 -31
  73. package/framework/components/chui_inputs/chui_email/styles.css +5 -5
  74. package/framework/components/chui_inputs/chui_file/file.js +68 -41
  75. package/framework/components/chui_inputs/chui_file/styles.css +13 -12
  76. package/framework/components/chui_inputs/chui_hotkey/hotkey.js +61 -36
  77. package/framework/components/chui_inputs/chui_masked/masked.js +39 -28
  78. package/framework/components/chui_inputs/chui_mention/mention.js +77 -30
  79. package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +173 -153
  80. package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +9 -7
  81. package/framework/components/chui_inputs/chui_number/number.js +58 -41
  82. package/framework/components/chui_inputs/chui_number/styles.css +7 -7
  83. package/framework/components/chui_inputs/chui_otp/otp.js +38 -29
  84. package/framework/components/chui_inputs/chui_password/password.js +58 -36
  85. package/framework/components/chui_inputs/chui_password/styles.css +8 -8
  86. package/framework/components/chui_inputs/chui_radio_button/radio_button.js +37 -25
  87. package/framework/components/chui_inputs/chui_radio_button/styles.css +20 -20
  88. package/framework/components/chui_inputs/chui_rating/rating.js +26 -22
  89. package/framework/components/chui_inputs/chui_select_box/select_box.js +102 -78
  90. package/framework/components/chui_inputs/chui_select_box/styles.css +11 -11
  91. package/framework/components/chui_inputs/chui_slider/slider.js +29 -26
  92. package/framework/components/chui_inputs/chui_slider/styles.css +2 -1
  93. package/framework/components/chui_inputs/chui_text/styles.css +8 -8
  94. package/framework/components/chui_inputs/chui_text/text.js +65 -44
  95. package/framework/components/chui_inputs/chui_text_area/styles.css +6 -6
  96. package/framework/components/chui_inputs/chui_text_area/text_area.js +51 -28
  97. package/framework/components/chui_inputs/chui_time/styles.css +5 -3
  98. package/framework/components/chui_inputs/chui_time/time.js +38 -27
  99. package/framework/components/chui_inputs/chui_toggle/styles.css +3 -3
  100. package/framework/components/chui_inputs/chui_toggle/toggle.js +16 -16
  101. package/framework/components/chui_json_editor/json_editor.js +53 -43
  102. package/framework/components/chui_json_viewer/json_viewer.js +52 -33
  103. package/framework/components/chui_json_viewer/styles.css +3 -2
  104. package/framework/components/chui_kanban/kanban.js +52 -34
  105. package/framework/components/chui_kbd/kbd.js +12 -10
  106. package/framework/components/chui_label/label.js +14 -12
  107. package/framework/components/chui_label/styles.css +2 -2
  108. package/framework/components/chui_link/link.js +27 -20
  109. package/framework/components/chui_list/list.js +31 -27
  110. package/framework/components/chui_list/styles.css +2 -1
  111. package/framework/components/chui_markdown_editor/markdown_editor.js +60 -44
  112. package/framework/components/chui_media/audio.js +326 -227
  113. package/framework/components/chui_media/audio_styles.css +40 -21
  114. package/framework/components/chui_media/image.js +70 -38
  115. package/framework/components/chui_media/image_compare.js +52 -21
  116. package/framework/components/chui_media/image_styles.css +3 -3
  117. package/framework/components/chui_media/video.js +155 -62
  118. package/framework/components/chui_media/video_styles.css +33 -16
  119. package/framework/components/chui_menu_bar/menu_bar.js +26 -24
  120. package/framework/components/chui_menu_bar/styles.css +4 -2
  121. package/framework/components/chui_modal/modal.js +44 -43
  122. package/framework/components/chui_modal/styles.css +3 -2
  123. package/framework/components/chui_notification/notification.js +50 -34
  124. package/framework/components/chui_notification/notification_download.js +31 -25
  125. package/framework/components/chui_notification/notification_download_progress.css +3 -2
  126. package/framework/components/chui_notification/notification_download_progress.js +47 -41
  127. package/framework/components/chui_notification/notification_update.js +23 -16
  128. package/framework/components/chui_notification/status_plate.js +2 -2
  129. package/framework/components/chui_notification/styles_download.css +1 -1
  130. package/framework/components/chui_notification/styles_update.css +1 -1
  131. package/framework/components/chui_org_chart/org_chart.js +74 -35
  132. package/framework/components/chui_pagination/pagination.js +62 -27
  133. package/framework/components/chui_paragraph/paragraph.js +2 -2
  134. package/framework/components/chui_paragraph/styles.css +1 -1
  135. package/framework/components/chui_popover/popover.js +49 -28
  136. package/framework/components/chui_popups/popups.js +137 -108
  137. package/framework/components/chui_popups/styles.css +2 -2
  138. package/framework/components/chui_print_button/print_button.js +33 -23
  139. package/framework/components/chui_progress_bar/progress_bar.js +23 -15
  140. package/framework/components/chui_progress_bar/styles.css +2 -2
  141. package/framework/components/chui_progress_ring/progress_ring.js +17 -15
  142. package/framework/components/chui_qrcode/qrcode.js +75 -31
  143. package/framework/components/chui_query_builder/query_builder.js +216 -123
  144. package/framework/components/chui_radio_group/radio_group.js +36 -26
  145. package/framework/components/chui_radio_group/styles.css +1 -1
  146. package/framework/components/chui_result/result.js +26 -16
  147. package/framework/components/chui_scheduler/scheduler.js +57 -35
  148. package/framework/components/chui_scheduler/styles.css +6 -2
  149. package/framework/components/chui_segmented_control/segmented_control.js +27 -21
  150. package/framework/components/chui_settings/settings.js +122 -48
  151. package/framework/components/chui_shortcut_help/shortcut_help.js +55 -32
  152. package/framework/components/chui_sidebar_nav/sidebar_nav.js +33 -23
  153. package/framework/components/chui_skeleton/skeleton.js +29 -24
  154. package/framework/components/chui_slideshow/slideshow.js +60 -41
  155. package/framework/components/chui_slideshow/styles.css +18 -12
  156. package/framework/components/chui_spinner/spinner.js +8 -8
  157. package/framework/components/chui_spinner/styles.css +0 -1
  158. package/framework/components/chui_split_button/split_button.js +23 -18
  159. package/framework/components/chui_split_button/styles.css +1 -1
  160. package/framework/components/chui_splitter/splitter.js +35 -28
  161. package/framework/components/chui_statistic/statistic.js +65 -38
  162. package/framework/components/chui_status_bar/status_bar.js +11 -9
  163. package/framework/components/chui_stepper/stepper.js +27 -22
  164. package/framework/components/chui_sticky_bar/sticky_bar.js +9 -4
  165. package/framework/components/chui_sticky_bar/styles.css +3 -1
  166. package/framework/components/chui_tabs/chui_tabs.js +28 -22
  167. package/framework/components/chui_tabs/styles.css +3 -3
  168. package/framework/components/chui_text_editor/styles.css +20 -19
  169. package/framework/components/chui_text_editor/text_editor.js +85 -61
  170. package/framework/components/chui_text_editor/text_editor_panel.js +346 -284
  171. package/framework/components/chui_theme_toggle/theme_toggle.js +27 -22
  172. package/framework/components/chui_timeline/timeline.js +14 -12
  173. package/framework/components/chui_toast_queue/toast_queue.js +52 -46
  174. package/framework/components/chui_toolbar/toolbar.js +20 -13
  175. package/framework/components/chui_tooltip/tooltip.js +37 -24
  176. package/framework/components/chui_tour/styles.css +8 -3
  177. package/framework/components/chui_tour/tour.js +61 -27
  178. package/framework/components/chui_transfer/styles.css +2 -1
  179. package/framework/components/chui_transfer/transfer.js +75 -42
  180. package/framework/components/chui_tree_table/tree_table.js +43 -29
  181. package/framework/components/chui_tree_view/styles.css +4 -2
  182. package/framework/components/chui_tree_view/tree_view.js +142 -99
  183. package/framework/components/chui_watermark/watermark.js +24 -16
  184. package/framework/components/chui_webview/styles.css +2 -2
  185. package/framework/components/chui_webview/webview.js +62 -50
  186. package/framework/components/telegram_bot/chui_telegram_bot.js +71 -64
  187. package/framework/modules/chui_a11y/chui_a11y.js +77 -46
  188. package/framework/modules/chui_animations/animations.js +42 -42
  189. package/framework/modules/chui_animations/styles.css +1 -1
  190. package/framework/modules/chui_bridge/preload.js +56 -26
  191. package/framework/modules/chui_functions.js +52 -50
  192. package/framework/modules/chui_highlight/chui_highlight.js +25 -22
  193. package/framework/modules/chui_i18n/chui_i18n.js +9 -7
  194. package/framework/modules/chui_i18n/locales/a11y.js +5 -5
  195. package/framework/modules/chui_i18n/locales/app_layout.js +5 -5
  196. package/framework/modules/chui_i18n/locales/calendar.js +3 -3
  197. package/framework/modules/chui_i18n/locales/common.js +3 -3
  198. package/framework/modules/chui_i18n/locales/data.js +36 -26
  199. package/framework/modules/chui_i18n/locales/editors.js +40 -13
  200. package/framework/modules/chui_i18n/locales/feedback.js +3 -3
  201. package/framework/modules/chui_i18n/locales/forms.js +8 -8
  202. package/framework/modules/chui_i18n/locales/graphics.js +8 -8
  203. package/framework/modules/chui_i18n/locales/media.js +4 -4
  204. package/framework/modules/chui_i18n/locales/navigation.js +8 -8
  205. package/framework/modules/chui_i18n/locales/validate.js +3 -3
  206. package/framework/modules/chui_json/chui_json.js +9 -9
  207. package/framework/modules/chui_layout/chui_layout.js +12 -10
  208. package/framework/modules/chui_logger/chui_logger.js +29 -25
  209. package/framework/modules/chui_page/page.js +33 -27
  210. package/framework/modules/chui_page/styles.css +3 -26
  211. package/framework/modules/chui_qr/chui_qr.js +158 -67
  212. package/framework/modules/chui_scrollbar/chui_scrollbar.js +35 -24
  213. package/framework/modules/chui_scrollbar/styles.css +3 -1
  214. package/framework/modules/chui_services/chui_channels.js +76 -11
  215. package/framework/modules/chui_services/chui_services.js +39 -31
  216. package/framework/modules/chui_services/desktop.js +149 -30
  217. package/framework/modules/chui_sortable/chui_sortable.js +17 -12
  218. package/framework/modules/chui_validate/chui_validate.js +7 -4
  219. package/framework/tray_bar/chui_menu_items.js +136 -46
  220. package/index.d.ts +4814 -0
  221. package/index.js +449 -334
  222. package/package.json +79 -68
package/CHANGELOG.md CHANGED
@@ -3,6 +3,119 @@
3
3
  Формат — [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
4
4
  версии — [Semantic Versioning](https://semver.org/lang/ru/).
5
5
 
6
+ ## [4.0.3] - 2026-09-30
7
+
8
+ ### Добавлено
9
+
10
+ - **CI для GitVerse** — `.gitverse/workflows/ci.yaml`. На Node 18, 20 и 22 гоняются линтер,
11
+ проверка форматирования, проверка типов и тесты; отдельными задачами — покрытие (`c8`,
12
+ отчёт уходит артефактом) и сверка того, что сайт документации и `index.d.ts` пересобраны.
13
+ Установка идёт через `npm install`: lock-файл в репозиторий не коммитится.
14
+ - **Типы публичного API** — `index.d.ts` (подключён через `types` в `package.json`).
15
+ Опции конструкторов собираются из заготовок в самих компонентах
16
+ (`constructor(options = { width: String() })` → `width?: string`), имена и порядок экспортов —
17
+ из `index.js`. Файл генерируется: `npm run types:build`, проверяется `npm run types:check`
18
+ (компилятор TypeScript) и стендом `test/types.smoke.ts`.
19
+ - **Проверки и скрипты:** `npm run check` (линт + формат + типы + тесты + доки),
20
+ `npm run test:coverage` (покрытие через `c8`), `npm run docs:check`
21
+ (`scripts/check-docs.js`: сборка документации не должна менять рабочее дерево),
22
+ `npm run types:build` / `types:check`.
23
+ - **Тесты компонентов** — `test/chui_component_dom.test.js` на `jsdom`: поведение `Badge`,
24
+ `Label`, `Divider` и `Kbd` (текст, подпись, ориентация, клавиши, доступное имя) и проверка
25
+ того, что каждый подключённый через `setStyles()` css-файл существует.
26
+ - **Тест публичного API** — `test/chui_exports.test.js`: имена экспортов не повторяются,
27
+ каждый ссылается на объявленное имя, каждый относительный `require` ведёт в существующий файл.
28
+ - `CONTRIBUTING.md` — окружение, команды, структура, порядок добавления компонента.
29
+ - `.editorconfig` — те же отступы, что у Prettier, чтобы редакторы не расходились со стилем.
30
+
31
+ ### Изменено
32
+
33
+ - **README — только для пользователя пакета (103 → 71 строка).** Из него убрано всё
34
+ разработческое: команды проверок, `types:build`/`docs:build`, сборка сайта и детали устройства
35
+ репозитория — это переехало в `CONTRIBUTING.md`. В README остались описание фреймворка,
36
+ установка, быстрый старт, ссылки на справочник и лицензия.
37
+ - **README сокращён с 727 до 103 строк: его разделы переехали в `docs/content/`** — `start.md`
38
+ («Начало работы»), `i18n.md` (локализация и RTL), `roadmap.md` («В разработке»), `modules.md`
39
+ и страница на каждый модуль (`main.md`, `desktop.md`, `security.md` и другие). Текст перенесён
40
+ дословно: собранный сайт отличается только пометкой «Тексты этого раздела — из `docs/content/`».
41
+ `docs/build.js` разбор README больше не делает, поэтому у документации один источник правды —
42
+ `docs/content/*.md`, а README снова читается как обычная страница репозитория.
43
+ - **Prettier применяется ко всему поддерживаемому коду.** Из проверки исключены только
44
+ сгенерированный сайт (`docs/*.html`, `docs/components/` и другие страницы) и тексты страниц
45
+ `docs/content/*.md` — их переформатирование ломало бы разметку. `npm run format:check`
46
+ проходит, поэтому проверка добавлена в CI. Для YAML задан отступ 2 пробела.
47
+ - **`npm run test:coverage` считает весь `framework/**`**, а не только файлы, загруженные тестами.
48
+ Без `--all` c8 показывал 95% (в отчёт попадали лишь импортированные модули), с ним картина
49
+ честная — пока около 6%. Из подсчёта исключены `chui_fonts.js` (данные шрифтов) и
50
+ `preload.js` (загружает Electron, а не `require`).
51
+ - Тесты, читающие исходники регулярками (`chui_services_sync.test.js`), больше не зависят от
52
+ переносов строк и отступов: текст сравнивается с нормализованным пробелам.
53
+ - `main.js`: вместо `console.log` — `Log`; убран закомментированный код отладки.
54
+
55
+ ### Исправлено
56
+
57
+ - **Главная страница документации приведена в соответствие с кодом**: числа компонентов по
58
+ группам (13 / 29 / 73 / 21 вместо 12 / 29 / 77 / 21), ссылка на раздел «Модули и сервисы»
59
+ вместо утверждения «остались в README», убран раздел о публикации в GitHub Wiki — каталога
60
+ `wiki/` в репозитории давно нет.
61
+ - `.gitignore` и ESLint игнорируют каталог отчёта покрытия `coverage/`.
62
+
63
+ ### Пакет
64
+
65
+ - Версия 4.0.3.
66
+
67
+ ## [4.0.2] - 2026-09-29
68
+
69
+ ### Исправлено
70
+
71
+ - **Заголовок страницы вернулся в шапку.** `Route#go()` больше не подмешивает название в
72
+ содержимое: узел `page_title` (появился в 4.0.1) и его стили удалены. Он дублировал заголовок,
73
+ который страница рисует сама, а `Page#render()` отдаёт один и тот же узел — повторный переход
74
+ на ту же страницу (кнопка «Назад» из `Page#setBackButton()`) добавлял второй заголовок.
75
+ Название показывает узел `page_name` в шапке, у страницы с меню-баром он по-прежнему скрыт —
76
+ место занимает полоса меню.
77
+
78
+ ### Изменено
79
+
80
+ - **`Desktop.app.path()` отвечает значением, а не промисом.** Из путей страница собирает свои
81
+ (файлы, логи, кеш) на старте, где `await` пришлось бы протаскивать через весь код инициализации.
82
+ Путь приходит по синхронному каналу (`SERVICES_SYNC_CALLS`: `ipcRenderer.sendSync` в странице,
83
+ `ipcMain.on` + `event.returnValue` в main) и кешируется — за одним именем в main ходят один раз.
84
+ Ответ идёт конвертом `{value}`/`{error}`: у `sendSync` нет канала для исключения, поэтому отказ
85
+ (имя вне белого списка) приходит странице обычной ошибкой с текстом main. Прежний
86
+ `await Desktop.app.path(...)` продолжает работать — `await` на строке возвращает ту же строку.
87
+ Асинхронный канал `APP_PATH` оставлен: его ключ есть в карте `window.chui.services`.
88
+
89
+ ### Добавлено
90
+
91
+ - **`Desktop.app.quit()` и `Desktop.app.restart()`** — закрытие и перезапуск приложения со страницы,
92
+ в том числе из безопасного окна (`window.chui.desktop.app.quit()`). Идут через `Main.stop()`/
93
+ `Main.restart()`, то есть теми же шагами, что пункт меню «Выход»: снимаются обработчики сервисов,
94
+ глобальные клавиши и подписки, а не просто закрывается окно. Отвечают значением, а не промисом
95
+ (синхронные каналы `appQuitSync`/`appRestartSync`), поэтому `await` не обязателен; выход
96
+ откладывается `setImmediate`, чтобы ответ успел уйти странице. Асинхронные каналы
97
+ `APP_QUIT`/`APP_RESTART` оставлены: их ключи есть в карте `window.chui.services`.
98
+ - Тесты `test/chui_services_sync.test.js` и `test/chui_app_lifecycle.test.js`: сверяют синхронные
99
+ каналы (main ↔ мост preload ↔ страница) и то, что закрытие с перезапуском идут именно через
100
+ `Main.stop()`/`Main.restart()`.
101
+
102
+ ### Удалено
103
+
104
+ - **Класс `App` и вспомогательный `Application` удалены.** `App.get()`, `App.getSession()`,
105
+ `App.getWebContents()` и все `App.*Path()` больше не экспортируются. Пути теперь отдаёт
106
+ `Desktop.app.path(name)` — и на странице, и в main-процессе: там канала нет, поэтому путь
107
+ берётся у Electron напрямую с той же проверкой белого списка `APP_PATH_NAMES`. Сырые объекты
108
+ Electron в main отдают `Desktop.app.get()`, `Desktop.app.getSession()` и
109
+ `Desktop.app.getWebContents()`; со страницы они бросают ошибку с подсказкой (`Desktop.session.*`,
110
+ `Desktop.dialog` или свой канал из `security.channels`).
111
+ **Ломающее:** `const { App } = require('chuijs')` перестаёт работать.
112
+ - Тест `test/chui_app_paths.test.js` переписан: сверяет белый список с ожидаемым набором имён
113
+ путей и проверяет оба валидатора — `appPathByName` (`index.js`) и `#appPathInMain` (`desktop.js`).
114
+
115
+ ### Пакет
116
+
117
+ - Версия 4.0.2.
118
+
6
119
  ## [4.0.1] - 2026-09-28
7
120
 
8
121
  ### Добавлено