chuijs 4.0.2 → 4.0.4

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 (292) hide show
  1. package/CHANGELOG.md +597 -0
  2. package/README.md +43 -644
  3. package/framework/appLayout/default/chui_app_layout.js +602 -496
  4. package/framework/appLayout/default/global_style.css +288 -97
  5. package/framework/appLayout/default/main_theme_style.css +188 -101
  6. package/framework/components/chui_accordion/accordion.js +38 -35
  7. package/framework/components/chui_accordion/styles.css +13 -12
  8. package/framework/components/chui_action_sheet/action_sheet.js +93 -64
  9. package/framework/components/chui_action_sheet/styles.css +12 -5
  10. package/framework/components/chui_actions_bar/actions_bar.js +338 -0
  11. package/framework/components/chui_actions_bar/styles.css +139 -0
  12. package/framework/components/chui_affix/affix.js +16 -11
  13. package/framework/components/chui_affix/styles.css +5 -0
  14. package/framework/components/chui_alert/alert.js +34 -19
  15. package/framework/components/chui_alert/styles.css +7 -0
  16. package/framework/components/chui_avatar/avatar.js +36 -35
  17. package/framework/components/chui_avatar/styles.css +1 -1
  18. package/framework/components/chui_avatar_group/avatar_group.js +25 -23
  19. package/framework/components/chui_avatar_group/styles.css +1 -1
  20. package/framework/components/chui_backtop/backtop.js +60 -21
  21. package/framework/components/chui_backtop/styles.css +21 -0
  22. package/framework/components/chui_badge/badge.js +30 -28
  23. package/framework/components/chui_badge/styles.css +6 -6
  24. package/framework/components/chui_banner/banner.js +222 -0
  25. package/framework/components/chui_banner/styles.css +170 -0
  26. package/framework/components/chui_breadcrumb/breadcrumb.js +15 -13
  27. package/framework/components/chui_breadcrumb/styles.css +1 -1
  28. package/framework/components/chui_button/button.js +52 -36
  29. package/framework/components/chui_button/styles.css +7 -7
  30. package/framework/components/chui_calendar/calendar.js +18 -16
  31. package/framework/components/chui_card/card.js +52 -32
  32. package/framework/components/chui_card_scroll/card_scroll.js +169 -0
  33. package/framework/components/chui_card_scroll/styles.css +86 -0
  34. package/framework/components/chui_chat/chat.js +140 -79
  35. package/framework/components/chui_chat/styles.css +18 -7
  36. package/framework/components/chui_clipboard_history/clipboard_history.js +53 -39
  37. package/framework/components/chui_clipboard_history/styles.css +13 -9
  38. package/framework/components/chui_code/code.js +10 -10
  39. package/framework/components/chui_code/styles.css +4 -4
  40. package/framework/components/chui_code_editor/code_editor.js +73 -57
  41. package/framework/components/chui_code_editor/styles.css +6 -5
  42. package/framework/components/chui_command_palette/command_palette.js +87 -64
  43. package/framework/components/chui_command_palette/styles.css +5 -5
  44. package/framework/components/chui_console/console.js +13 -13
  45. package/framework/components/chui_console/styles.css +6 -3
  46. package/framework/components/chui_content_block/content_block.js +35 -21
  47. package/framework/components/chui_content_block/styles.css +2 -2
  48. package/framework/components/chui_context_menu/context_menu.js +171 -58
  49. package/framework/components/chui_context_menu/styles.css +82 -8
  50. package/framework/components/chui_custom_element/custom_element.js +25 -18
  51. package/framework/components/chui_data_grid/data_grid.js +633 -471
  52. package/framework/components/chui_data_grid/styles.css +24 -22
  53. package/framework/components/chui_descriptions/descriptions.js +34 -17
  54. package/framework/components/chui_descriptions/styles.css +1 -1
  55. package/framework/components/chui_details/details.js +42 -36
  56. package/framework/components/chui_details/styles.css +12 -11
  57. package/framework/components/chui_diff_viewer/diff_viewer.js +172 -147
  58. package/framework/components/chui_diff_viewer/styles.css +10 -10
  59. package/framework/components/chui_divider/divider.js +19 -17
  60. package/framework/components/chui_divider/styles.css +2 -2
  61. package/framework/components/chui_drawer/drawer.js +63 -38
  62. package/framework/components/chui_drawer/styles.css +18 -4
  63. package/framework/components/chui_drop_zone/drop_zone.js +37 -27
  64. package/framework/components/chui_drop_zone/styles.css +10 -6
  65. package/framework/components/chui_empty_state/empty_state.js +20 -15
  66. package/framework/components/chui_fieldset/fieldset.js +40 -23
  67. package/framework/components/chui_fieldset/styles.css +6 -6
  68. package/framework/components/chui_file_explorer/file_explorer.js +260 -189
  69. package/framework/components/chui_file_explorer/styles.css +8 -7
  70. package/framework/components/chui_form/form.js +40 -28
  71. package/framework/components/chui_form/styles.css +1 -1
  72. package/framework/components/chui_gantt/gantt.js +102 -78
  73. package/framework/components/chui_gantt/styles.css +5 -5
  74. package/framework/components/chui_graphs/graphs.js +376 -239
  75. package/framework/components/chui_graphs/styles.css +27 -6
  76. package/framework/components/chui_hero/hero.js +98 -37
  77. package/framework/components/chui_hero/styles.css +176 -7
  78. package/framework/components/chui_html_block/html_block.js +8 -8
  79. package/framework/components/chui_html_block/styles.css +3 -3
  80. package/framework/components/chui_hx/hx.js +3 -3
  81. package/framework/components/chui_hx/styles.css +13 -6
  82. package/framework/components/chui_icons/icons.js +2115 -2115
  83. package/framework/components/chui_icons/styles.css +4 -3
  84. package/framework/components/chui_inputs/chui_check_box/check_box.js +31 -19
  85. package/framework/components/chui_inputs/chui_check_box/styles.css +30 -21
  86. package/framework/components/chui_inputs/chui_chips/chips.js +141 -70
  87. package/framework/components/chui_inputs/chui_chips/styles.css +32 -7
  88. package/framework/components/chui_inputs/chui_color_picker/color_picker.js +55 -38
  89. package/framework/components/chui_inputs/chui_color_picker/styles.css +7 -7
  90. package/framework/components/chui_inputs/chui_combo_box/combo_box.js +127 -109
  91. package/framework/components/chui_inputs/chui_combo_box/styles.css +23 -21
  92. package/framework/components/chui_inputs/chui_date/date.js +161 -127
  93. package/framework/components/chui_inputs/chui_date/styles.css +20 -19
  94. package/framework/components/chui_inputs/chui_date_range/date_range.js +61 -50
  95. package/framework/components/chui_inputs/chui_date_range/styles.css +3 -3
  96. package/framework/components/chui_inputs/chui_datetime/datetime.js +47 -39
  97. package/framework/components/chui_inputs/chui_datetime/styles.css +3 -3
  98. package/framework/components/chui_inputs/chui_email/email.js +48 -36
  99. package/framework/components/chui_inputs/chui_email/styles.css +11 -11
  100. package/framework/components/chui_inputs/chui_file/file.js +71 -44
  101. package/framework/components/chui_inputs/chui_file/styles.css +23 -19
  102. package/framework/components/chui_inputs/chui_hotkey/hotkey.js +101 -76
  103. package/framework/components/chui_inputs/chui_hotkey/styles.css +6 -6
  104. package/framework/components/chui_inputs/chui_masked/masked.js +83 -72
  105. package/framework/components/chui_inputs/chui_masked/styles.css +5 -5
  106. package/framework/components/chui_inputs/chui_mention/mention.js +87 -40
  107. package/framework/components/chui_inputs/chui_mention/styles.css +14 -8
  108. package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +242 -212
  109. package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +23 -15
  110. package/framework/components/chui_inputs/chui_number/number.js +84 -70
  111. package/framework/components/chui_inputs/chui_number/styles.css +13 -13
  112. package/framework/components/chui_inputs/chui_otp/otp.js +71 -62
  113. package/framework/components/chui_inputs/chui_otp/styles.css +5 -5
  114. package/framework/components/chui_inputs/chui_password/password.js +72 -56
  115. package/framework/components/chui_inputs/chui_password/styles.css +15 -15
  116. package/framework/components/chui_inputs/chui_radio_button/radio_button.js +37 -25
  117. package/framework/components/chui_inputs/chui_radio_button/styles.css +22 -22
  118. package/framework/components/chui_inputs/chui_rating/rating.js +54 -50
  119. package/framework/components/chui_inputs/chui_rating/styles.css +3 -3
  120. package/framework/components/chui_inputs/chui_select_box/select_box.js +132 -108
  121. package/framework/components/chui_inputs/chui_select_box/styles.css +21 -21
  122. package/framework/components/chui_inputs/chui_slider/slider.js +41 -38
  123. package/framework/components/chui_inputs/chui_slider/styles.css +7 -5
  124. package/framework/components/chui_inputs/chui_text/styles.css +14 -14
  125. package/framework/components/chui_inputs/chui_text/text.js +69 -52
  126. package/framework/components/chui_inputs/chui_text_area/styles.css +14 -14
  127. package/framework/components/chui_inputs/chui_text_area/text_area.js +59 -36
  128. package/framework/components/chui_inputs/chui_time/styles.css +18 -20
  129. package/framework/components/chui_inputs/chui_time/time.js +71 -49
  130. package/framework/components/chui_inputs/chui_toggle/styles.css +13 -6
  131. package/framework/components/chui_inputs/chui_toggle/toggle.js +27 -27
  132. package/framework/components/chui_json_editor/json_editor.js +137 -127
  133. package/framework/components/chui_json_editor/styles.css +5 -5
  134. package/framework/components/chui_json_viewer/json_viewer.js +133 -114
  135. package/framework/components/chui_json_viewer/styles.css +9 -8
  136. package/framework/components/chui_kanban/kanban.js +78 -60
  137. package/framework/components/chui_kanban/styles.css +8 -4
  138. package/framework/components/chui_kbd/kbd.js +12 -10
  139. package/framework/components/chui_kbd/styles.css +1 -1
  140. package/framework/components/chui_label/label.js +31 -29
  141. package/framework/components/chui_label/styles.css +3 -3
  142. package/framework/components/chui_link/link.js +36 -29
  143. package/framework/components/chui_link/styles.css +11 -4
  144. package/framework/components/chui_list/list.js +42 -38
  145. package/framework/components/chui_list/styles.css +4 -3
  146. package/framework/components/chui_markdown_editor/markdown_editor.js +125 -109
  147. package/framework/components/chui_markdown_editor/styles.css +5 -5
  148. package/framework/components/chui_media/audio.js +457 -364
  149. package/framework/components/chui_media/audio_styles.css +74 -37
  150. package/framework/components/chui_media/image.js +99 -64
  151. package/framework/components/chui_media/image_compare.js +86 -55
  152. package/framework/components/chui_media/image_compare_styles.css +5 -5
  153. package/framework/components/chui_media/image_styles.css +4 -4
  154. package/framework/components/chui_media/video.js +264 -171
  155. package/framework/components/chui_media/video_styles.css +57 -24
  156. package/framework/components/chui_menu_bar/menu_bar.js +67 -65
  157. package/framework/components/chui_menu_bar/styles.css +14 -12
  158. package/framework/components/chui_message_bar/message_bar.js +551 -0
  159. package/framework/components/chui_message_bar/styles.css +248 -0
  160. package/framework/components/chui_modal/modal.js +81 -56
  161. package/framework/components/chui_modal/styles.css +3 -2
  162. package/framework/components/chui_notification/notification.js +107 -69
  163. package/framework/components/chui_notification/notification_download.js +28 -77
  164. package/framework/components/chui_notification/notification_download_card.js +115 -0
  165. package/framework/components/chui_notification/notification_download_progress.css +5 -4
  166. package/framework/components/chui_notification/notification_download_progress.js +73 -105
  167. package/framework/components/chui_notification/notification_update.js +44 -37
  168. package/framework/components/chui_notification/status_plate.css +3 -3
  169. package/framework/components/chui_notification/status_plate.js +2 -2
  170. package/framework/components/chui_notification/styles.css +6 -1
  171. package/framework/components/chui_notification/styles_download.css +2 -2
  172. package/framework/components/chui_notification/styles_update.css +3 -3
  173. package/framework/components/chui_org_chart/org_chart.js +101 -62
  174. package/framework/components/chui_org_chart/styles.css +2 -2
  175. package/framework/components/chui_pagination/pagination.js +65 -30
  176. package/framework/components/chui_pagination/styles.css +1 -1
  177. package/framework/components/chui_paragraph/paragraph.js +2 -2
  178. package/framework/components/chui_paragraph/styles.css +3 -3
  179. package/framework/components/chui_popover/popover.js +77 -50
  180. package/framework/components/chui_popover/styles.css +1 -1
  181. package/framework/components/chui_popups/popups.js +210 -181
  182. package/framework/components/chui_popups/styles.css +7 -7
  183. package/framework/components/chui_print_button/print_button.js +48 -33
  184. package/framework/components/chui_progress_bar/progress_bar.js +49 -19
  185. package/framework/components/chui_progress_bar/styles.css +6 -6
  186. package/framework/components/chui_progress_ring/progress_ring.js +32 -30
  187. package/framework/components/chui_progress_ring/styles.css +1 -1
  188. package/framework/components/chui_qrcode/qrcode.js +85 -41
  189. package/framework/components/chui_query_builder/query_builder.js +263 -170
  190. package/framework/components/chui_query_builder/styles.css +4 -4
  191. package/framework/components/chui_radio_group/radio_group.js +36 -26
  192. package/framework/components/chui_radio_group/styles.css +2 -2
  193. package/framework/components/chui_result/result.js +41 -31
  194. package/framework/components/chui_result/styles.css +3 -3
  195. package/framework/components/chui_scheduler/scheduler.js +126 -104
  196. package/framework/components/chui_scheduler/styles.css +11 -7
  197. package/framework/components/chui_screen_spinner/screen_spinner.js +167 -0
  198. package/framework/components/chui_screen_spinner/styles.css +49 -0
  199. package/framework/components/chui_segmented_control/segmented_control.js +90 -27
  200. package/framework/components/chui_segmented_control/styles.css +32 -6
  201. package/framework/components/chui_settings/settings.js +160 -87
  202. package/framework/components/chui_settings/styles.css +4 -4
  203. package/framework/components/chui_shortcut_help/shortcut_help.js +82 -61
  204. package/framework/components/chui_sidebar_nav/sidebar_nav.js +132 -53
  205. package/framework/components/chui_sidebar_nav/styles.css +9 -3
  206. package/framework/components/chui_skeleton/skeleton.js +29 -24
  207. package/framework/components/chui_slideshow/slideshow.js +122 -103
  208. package/framework/components/chui_slideshow/styles.css +22 -16
  209. package/framework/components/chui_spinner/spinner.js +17 -17
  210. package/framework/components/chui_spinner/styles.css +0 -1
  211. package/framework/components/chui_split_button/split_button.js +53 -30
  212. package/framework/components/chui_split_button/styles.css +22 -6
  213. package/framework/components/chui_splitter/splitter.js +46 -39
  214. package/framework/components/chui_splitter/styles.css +2 -2
  215. package/framework/components/chui_statistic/statistic.js +111 -84
  216. package/framework/components/chui_status_bar/status_bar.js +11 -9
  217. package/framework/components/chui_status_bar/styles.css +2 -2
  218. package/framework/components/chui_stepper/stepper.js +230 -54
  219. package/framework/components/chui_stepper/styles.css +79 -14
  220. package/framework/components/chui_sticky_bar/sticky_bar.js +53 -17
  221. package/framework/components/chui_sticky_bar/styles.css +11 -7
  222. package/framework/components/chui_tabs/chui_tabs.js +100 -46
  223. package/framework/components/chui_tabs/styles.css +43 -15
  224. package/framework/components/chui_text_editor/styles.css +24 -23
  225. package/framework/components/chui_text_editor/text_editor.js +103 -79
  226. package/framework/components/chui_text_editor/text_editor_panel.js +428 -367
  227. package/framework/components/chui_theme_toggle/theme_toggle.js +46 -25
  228. package/framework/components/chui_timeline/styles.css +3 -1
  229. package/framework/components/chui_timeline/timeline.js +14 -12
  230. package/framework/components/chui_toast_queue/styles.css +11 -11
  231. package/framework/components/chui_toast_queue/toast_queue.js +82 -73
  232. package/framework/components/chui_toolbar/styles.css +2 -2
  233. package/framework/components/chui_toolbar/toolbar.js +20 -13
  234. package/framework/components/chui_tooltip/styles.css +2 -2
  235. package/framework/components/chui_tooltip/tooltip.js +40 -27
  236. package/framework/components/chui_tour/styles.css +12 -7
  237. package/framework/components/chui_tour/tour.js +132 -98
  238. package/framework/components/chui_transfer/styles.css +8 -7
  239. package/framework/components/chui_transfer/transfer.js +143 -123
  240. package/framework/components/chui_tree_table/styles.css +4 -4
  241. package/framework/components/chui_tree_table/tree_table.js +88 -74
  242. package/framework/components/chui_tree_view/styles.css +14 -10
  243. package/framework/components/chui_tree_view/tree_view.js +298 -253
  244. package/framework/components/chui_user_bar/styles.css +145 -0
  245. package/framework/components/chui_user_bar/user_bar.js +402 -0
  246. package/framework/components/chui_user_list_bar/styles.css +173 -0
  247. package/framework/components/chui_user_list_bar/user_list_bar.js +485 -0
  248. package/framework/components/chui_watermark/watermark.js +41 -33
  249. package/framework/components/chui_webview/styles.css +2 -2
  250. package/framework/components/chui_webview/webview.js +64 -52
  251. package/framework/components/chui_write_bar/styles.css +172 -0
  252. package/framework/components/chui_write_bar/write_bar.js +320 -0
  253. package/framework/main_window.js +1234 -0
  254. package/framework/modules/chui_a11y/chui_a11y.js +153 -123
  255. package/framework/modules/chui_animations/animations.js +105 -43
  256. package/framework/modules/chui_animations/motion.js +120 -0
  257. package/framework/modules/chui_animations/styles.css +37 -4
  258. package/framework/modules/chui_bridge/preload.js +36 -25
  259. package/framework/modules/chui_functions.js +69 -63
  260. package/framework/modules/chui_highlight/chui_highlight.js +25 -22
  261. package/framework/modules/chui_highlight/styles.css +13 -10
  262. package/framework/modules/chui_i18n/chui_i18n.js +12 -10
  263. package/framework/modules/chui_i18n/locales/a11y.js +5 -5
  264. package/framework/modules/chui_i18n/locales/app_layout.js +5 -5
  265. package/framework/modules/chui_i18n/locales/calendar.js +3 -3
  266. package/framework/modules/chui_i18n/locales/common.js +3 -3
  267. package/framework/modules/chui_i18n/locales/data.js +36 -26
  268. package/framework/modules/chui_i18n/locales/editors.js +40 -13
  269. package/framework/modules/chui_i18n/locales/feedback.js +65 -3
  270. package/framework/modules/chui_i18n/locales/forms.js +8 -8
  271. package/framework/modules/chui_i18n/locales/graphics.js +8 -8
  272. package/framework/modules/chui_i18n/locales/media.js +4 -4
  273. package/framework/modules/chui_i18n/locales/navigation.js +12 -8
  274. package/framework/modules/chui_i18n/locales/validate.js +3 -3
  275. package/framework/modules/chui_json/chui_json.js +11 -11
  276. package/framework/modules/chui_layout/chui_layout.js +12 -10
  277. package/framework/modules/chui_logger/chui_logger.js +47 -28
  278. package/framework/modules/chui_page/page.js +39 -33
  279. package/framework/modules/chui_palette/palette.js +61 -0
  280. package/framework/modules/chui_qr/chui_qr.js +179 -88
  281. package/framework/modules/chui_scrollbar/chui_scrollbar.js +79 -68
  282. package/framework/modules/chui_scrollbar/styles.css +4 -2
  283. package/framework/modules/chui_services/chui_channels.js +27 -13
  284. package/framework/modules/chui_services/chui_services.js +47 -39
  285. package/framework/modules/chui_services/desktop.js +108 -101
  286. package/framework/modules/chui_sortable/chui_sortable.js +33 -28
  287. package/framework/modules/chui_validate/chui_validate.js +10 -7
  288. package/framework/tray_bar/chui_menu_items.js +136 -46
  289. package/index.d.ts +5046 -0
  290. package/index.js +199 -1254
  291. package/package.json +81 -68
  292. package/framework/components/telegram_bot/chui_telegram_bot.js +0 -184
@@ -1,8 +1,9 @@
1
- const {Icon, Icons} = require("../chui_icons/icons");
2
- const {I18n} = require("../../modules/chui_i18n/chui_i18n");
3
- const {optionOr} = require("../../modules/chui_functions");
4
- const {SegmentedControl} = require("../chui_segmented_control/segmented_control");
5
- const {Desktop} = require("../../modules/chui_services/desktop");
1
+ const { Icon, Icons } = require("../chui_icons/icons");
2
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
3
+ const { optionOr } = require("../../modules/chui_functions");
4
+ const { SegmentedControl } = require("../chui_segmented_control/segmented_control");
5
+ const { Desktop } = require("../../modules/chui_services/desktop");
6
+ const { reportError } = require("../../modules/chui_logger/chui_logger");
6
7
 
7
8
  /**
8
9
  * Переключатель темы: светлая, тёмная и системная (набор задаётся опцией `modes`).
@@ -21,52 +22,60 @@ class ThemeToggle {
21
22
  static MODE = {
22
23
  LIGHT: "light",
23
24
  DARK: "dark",
24
- SYSTEM: "system"
25
+ SYSTEM: "system",
25
26
  };
26
27
  // Ключи подписей режимов; сам текст берётся лениво — язык может смениться между запусками
27
28
  static #DEFAULT_LABEL_KEYS = {
28
29
  light: "graphics.themeLight",
29
30
  dark: "graphics.themeDark",
30
- system: "graphics.themeSystem"
31
+ system: "graphics.themeSystem",
31
32
  };
32
33
  static #ICONS = {
33
34
  light: "LIGHT_MODE",
34
35
  dark: "DARK_MODE",
35
- system: "BRIGHTNESS_AUTO"
36
+ system: "BRIGHTNESS_AUTO",
36
37
  };
37
38
 
38
39
  #control = undefined;
39
40
  #modes = [ThemeToggle.MODE.LIGHT, ThemeToggle.MODE.DARK, ThemeToggle.MODE.SYSTEM];
40
41
  #labels = {};
41
- #on_change = undefined;
42
+ #onChange = undefined;
43
+ #onError = undefined;
42
44
  #source = undefined;
43
45
  #unsubscribe = undefined;
44
46
  #bound = false;
45
47
 
46
- constructor(options = {
47
- modes: [],
48
- labels: {},
49
- label: String(),
50
- onChange: undefined
51
- }) {
48
+ constructor(
49
+ options = {
50
+ modes: [],
51
+ labels: {},
52
+ label: String(),
53
+ onChange: undefined,
54
+ onError: undefined,
55
+ }
56
+ ) {
52
57
  if (Array.isArray(options.modes) && options.modes.length > 0) this.#modes = options.modes;
53
58
  this.#labels = options.labels === undefined ? {} : options.labels;
54
- this.#on_change = options.onChange;
59
+ this.#onChange = options.onChange;
60
+ this.#onError = options.onError;
55
61
  this.#control = new SegmentedControl({
56
62
  id: options.id,
57
63
  label: optionOr(options.label, I18n.t("graphics.settingsAppearance")),
58
- options: this.#modes.map((mode) => ({value: mode, title: this.#title(mode), icon: this.#icon(mode)})),
64
+ options: this.#modes.map((mode) => ({ value: mode, title: this.#title(mode), icon: this.#icon(mode) })),
59
65
  // Нажатие в переключателе — это выбор темы, а не просто новая подсветка
60
- onChange: (mode) => this.setTheme(mode).catch(() => {})
66
+ onChange: (mode) => this.#applyTheme(mode),
61
67
  });
62
68
  this.#bound = true;
63
69
  // Смена темы системой не проходит через переключатель — вид обновляем подпиской
64
70
  this.#unsubscribe = Desktop.theme.onChange((theme) => this.#syncView(theme));
65
- Desktop.theme.get().then((state) => {
66
- if (!this.#bound) return;
67
- this.#source = state.source;
68
- this.#syncView(state.theme);
69
- }).catch(() => {});
71
+ Desktop.theme
72
+ .get()
73
+ .then((state) => {
74
+ if (!this.#bound) return;
75
+ this.#source = state.source;
76
+ this.#syncView(state.theme);
77
+ })
78
+ .catch((error) => reportError(error, this.#onError));
70
79
  }
71
80
 
72
81
  // GET
@@ -110,7 +119,7 @@ class ThemeToggle {
110
119
  if (!this.#bound) return state;
111
120
  this.#source = state.source;
112
121
  this.#syncView(state.theme);
113
- if (this.#on_change !== undefined) this.#on_change(state.source, state);
122
+ if (this.#onChange !== undefined) this.#onChange(state.source, state);
114
123
  return state;
115
124
  });
116
125
  }
@@ -131,6 +140,18 @@ class ThemeToggle {
131
140
  }
132
141
 
133
142
  // === ВНУТРЕННЕЕ ===
143
+ /**
144
+ * Выбор темы из переключателя. Тема не применилась — сообщаем об ошибке и возвращаем отметку
145
+ * к прежнему источнику: переключатель уже успел показать новый режим, и без отката вид врал бы
146
+ * (отмена идёт тихо, `setValue(..., true)`, поэтому `onChange` не вызывается заново).
147
+ */
148
+ #applyTheme(mode = String()) {
149
+ this.setTheme(mode).catch((error) => {
150
+ this.#syncView(undefined);
151
+ reportError(error, this.#onError);
152
+ });
153
+ }
154
+
134
155
  #title(mode = String()) {
135
156
  if (this.#labels[mode] !== undefined) return this.#labels[mode];
136
157
  const key = ThemeToggle.#DEFAULT_LABEL_KEYS[mode];
@@ -155,4 +176,4 @@ class ThemeToggle {
155
176
  }
156
177
  }
157
178
 
158
- exports.ThemeToggle = ThemeToggle
179
+ exports.ThemeToggle = ThemeToggle;
@@ -2,7 +2,7 @@
2
2
  chui_timeline {
3
3
  display: block;
4
4
  width: -webkit-fill-available;
5
- margin: var(--margin);
5
+ margin: var(--block_margin);
6
6
  color: var(--text_color);
7
7
  font-size: var(--font_default_size);
8
8
  }
@@ -24,6 +24,8 @@ chui_timeline[data-size="small"] {
24
24
  grid-template-rows: 1fr auto 1fr;
25
25
  align-items: stretch;
26
26
  column-gap: 12px;
27
+ /* Событие ленты встаёт на место: кадр общий — см. `chui_appear_up` в global_style.css */
28
+ animation: chui_appear_up var(--motion_base) var(--motion_ease);
27
29
  }
28
30
 
29
31
  .timeline_marker {
@@ -1,6 +1,6 @@
1
- const {setStyles, optionOr} = require("../../modules/chui_functions");
2
- const {I18n} = require("../../modules/chui_i18n/chui_i18n");
3
- const {Icon} = require("../chui_icons/icons");
1
+ const { setStyles, optionOr } = require("../../modules/chui_functions");
2
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
3
+ const { Icon } = require("../chui_icons/icons");
4
4
 
5
5
  /**
6
6
  * Лента событий: что случилось и когда.
@@ -29,7 +29,7 @@ class Timeline {
29
29
  DEFAULT: "default",
30
30
  SUCCESS: "success",
31
31
  WARNING: "warning",
32
- ERROR: "error"
32
+ ERROR: "error",
33
33
  };
34
34
  static #counter = 0;
35
35
 
@@ -39,12 +39,14 @@ class Timeline {
39
39
  #items = [];
40
40
  #label = undefined;
41
41
 
42
- constructor(options = {
43
- id: String(),
44
- items: [],
45
- label: String(),
46
- size: String()
47
- }) {
42
+ constructor(
43
+ options = {
44
+ id: String(),
45
+ items: [],
46
+ label: String(),
47
+ size: String(),
48
+ }
49
+ ) {
48
50
  setStyles(__dirname + "/styles.css", "chUiJS_Timeline");
49
51
  Timeline.#counter += 1;
50
52
  this.#id = options.id === undefined ? `chui_timeline_${Timeline.#counter}` : options.id;
@@ -215,9 +217,9 @@ class Timeline {
215
217
 
216
218
  static SIZE = {
217
219
  SMALL: "small",
218
- DEFAULT: "default"
220
+ DEFAULT: "default",
219
221
  };
220
222
  static ICON_SIZE = "16px";
221
223
  }
222
224
 
223
- exports.Timeline = Timeline
225
+ exports.Timeline = Timeline;
@@ -4,31 +4,31 @@ chui_toast_queue {
4
4
  z-index: 1002;
5
5
  display: flex;
6
6
  flex-direction: column;
7
- gap: var(--margin);
8
- max-width: calc(100% - (var(--margin) * 2));
7
+ gap: var(--block_margin);
8
+ max-width: calc(100% - (var(--block_margin) * 2));
9
9
  pointer-events: none;
10
10
  }
11
11
 
12
12
  chui_toast_queue[data-position="bottom_right"] {
13
- inset-inline-end: var(--margin);
14
- bottom: var(--margin);
13
+ inset-inline-end: var(--block_margin);
14
+ bottom: var(--block_margin);
15
15
  }
16
16
 
17
17
  chui_toast_queue[data-position="bottom_left"] {
18
- inset-inline-start: var(--margin);
19
- bottom: var(--margin);
18
+ inset-inline-start: var(--block_margin);
19
+ bottom: var(--block_margin);
20
20
  }
21
21
 
22
22
  /* Сверху новые тосты растут к углу — порядок обратный (column-reverse) */
23
23
  chui_toast_queue[data-position="top_right"] {
24
- inset-inline-end: var(--margin);
25
- top: var(--margin);
24
+ inset-inline-end: var(--block_margin);
25
+ top: var(--block_margin);
26
26
  flex-direction: column-reverse;
27
27
  }
28
28
 
29
29
  chui_toast_queue[data-position="top_left"] {
30
- inset-inline-start: var(--margin);
31
- top: var(--margin);
30
+ inset-inline-start: var(--block_margin);
31
+ top: var(--block_margin);
32
32
  flex-direction: column-reverse;
33
33
  }
34
34
 
@@ -88,7 +88,7 @@ toast_actions {
88
88
  display: flex;
89
89
  flex-direction: row;
90
90
  align-items: center;
91
- gap: var(--margin);
91
+ gap: var(--block_margin);
92
92
  flex-shrink: 0;
93
93
  }
94
94
 
@@ -1,32 +1,32 @@
1
- const {Animation} = require('../../modules/chui_animations/animations');
2
- const {makeKeyboardButton} = require('../../modules/chui_a11y/chui_a11y');
3
- const {Icon, Icons} = require('../chui_icons/icons');
4
- const {Button} = require('../chui_button/button');
5
- const {setStyles, markdownToHtml, optionOr} = require('../../modules/chui_functions');
6
- const {I18n} = require('../../modules/chui_i18n/chui_i18n');
1
+ const { Animation } = require("../../modules/chui_animations/animations");
2
+ const { makeKeyboardButton } = require("../../modules/chui_a11y/chui_a11y");
3
+ const { Icon, Icons } = require("../chui_icons/icons");
4
+ const { Button } = require("../chui_button/button");
5
+ const { setStyles, markdownToHtml, optionOr } = require("../../modules/chui_functions");
6
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
7
7
  // Плашка значка — общая с карточками уведомлений: одна фигура и одни цвета статуса
8
- const {createStatusPlate, setStatusPlate} = require("../chui_notification/status_plate");
8
+ const { createStatusPlate, setStatusPlate } = require("../chui_notification/status_plate");
9
9
 
10
10
  /** Стили тостов. `ERROR` объявляется скринридером сразу (`role="alert"`), остальные — вежливо (`role="status"`). */
11
11
  const STYLE = {
12
12
  INFO: "toast_info",
13
13
  SUCCESS: "toast_success",
14
14
  WARNING: "toast_warning",
15
- ERROR: "toast_error"
15
+ ERROR: "toast_error",
16
16
  };
17
17
  /** Угол окна, в котором растёт стопка тостов */
18
18
  const POSITION = {
19
19
  TOP_LEFT: "top_left",
20
20
  TOP_RIGHT: "top_right",
21
21
  BOTTOM_LEFT: "bottom_left",
22
- BOTTOM_RIGHT: "bottom_right"
22
+ BOTTOM_RIGHT: "bottom_right",
23
23
  };
24
24
  /** Ключ статуса для общей плашки значка: глифы и цвета те же, что у карточек уведомлений */
25
25
  const PLATE_STATUS = {
26
26
  [STYLE.INFO]: undefined,
27
27
  [STYLE.SUCCESS]: "success",
28
28
  [STYLE.WARNING]: "warning",
29
- [STYLE.ERROR]: "error"
29
+ [STYLE.ERROR]: "error",
30
30
  };
31
31
 
32
32
  /**
@@ -46,8 +46,8 @@ class Toast {
46
46
 
47
47
  #id = undefined;
48
48
  #toast = document.createElement("chui_toast");
49
- #icon_box = undefined;
50
- #icon_custom = undefined;
49
+ #iconBox = undefined;
50
+ #iconCustom = undefined;
51
51
  #body = document.createElement("toast_body");
52
52
  #title = document.createElement("toast_title");
53
53
  #text = document.createElement("toast_text");
@@ -57,27 +57,29 @@ class Toast {
57
57
  #style = STYLE.INFO;
58
58
  #duration = 0;
59
59
  #closable = true;
60
- #title_used = false;
61
- #text_used = false;
60
+ #titleUsed = false;
61
+ #textUsed = false;
62
62
  //
63
63
  #timer = undefined;
64
64
  #deadline = 0;
65
65
  #remaining = 0;
66
66
  #dismissed = false;
67
- #on_dismiss = undefined;
67
+ #onDismiss = undefined;
68
68
  #listeners = [];
69
69
 
70
- constructor(options = {
71
- id: String(),
72
- style: String(),
73
- title: String(),
74
- text: String(),
75
- markdownText: String(),
76
- duration: Number(),
77
- closable: Boolean(),
78
- icon: String(),
79
- action: { title: String(), listener: undefined, close: Boolean() }
80
- }) {
70
+ constructor(
71
+ options = {
72
+ id: String(),
73
+ style: String(),
74
+ title: String(),
75
+ text: String(),
76
+ markdownText: String(),
77
+ duration: Number(),
78
+ closable: Boolean(),
79
+ icon: String(),
80
+ action: { title: String(), listener: undefined, close: Boolean() },
81
+ }
82
+ ) {
81
83
  setStyles(__dirname + "/styles.css", "chUiJS_ToastQueue");
82
84
  Toast.#counter += 1;
83
85
  this.#id = options.id === undefined ? `chui_toast_${Toast.#counter}` : options.id;
@@ -89,32 +91,32 @@ class Toast {
89
91
  // Пустая заготовка опции равносильна отсутствующей — пустого узла не появляется
90
92
  const title = optionOr(options.title, undefined);
91
93
  const text = optionOr(options.text, undefined);
92
- const markdown_text = optionOr(options.markdownText, undefined);
94
+ const markdownText = optionOr(options.markdownText, undefined);
93
95
  if (title !== undefined) {
94
- this.#title_used = true;
96
+ this.#titleUsed = true;
95
97
  this.#title.innerText = title;
96
98
  this.#body.appendChild(this.#title);
97
99
  }
98
- if (text !== undefined && markdown_text !== undefined) {
100
+ if (text !== undefined && markdownText !== undefined) {
99
101
  throw new Error("Должна быть установлена одна опция text или markdownText");
100
102
  }
101
103
  if (text !== undefined) {
102
- this.#text_used = true;
104
+ this.#textUsed = true;
103
105
  this.#text.innerText = text;
104
106
  this.#body.appendChild(this.#text);
105
107
  }
106
- if (markdown_text !== undefined) {
107
- this.#text_used = true;
108
- this.#text.innerHTML = markdownToHtml(markdown_text);
108
+ if (markdownText !== undefined) {
109
+ this.#textUsed = true;
110
+ this.#text.innerHTML = markdownToHtml(markdownText);
109
111
  this.#body.appendChild(this.#text);
110
112
  }
111
113
  const icon = options.icon;
112
114
  // Пустая опция icon отключает иконку (в том числе иконку стиля) — пустой бокс не ставим.
113
115
  // Плашка общая с карточками уведомлений: цвет статуса и фигура — одни на всех
114
116
  if (icon !== "") {
115
- this.#icon_custom = icon;
116
- this.#icon_box = createStatusPlate(PLATE_STATUS[this.#style], icon);
117
- this.#toast.appendChild(this.#icon_box);
117
+ this.#iconCustom = icon;
118
+ this.#iconBox = createStatusPlate(PLATE_STATUS[this.#style], icon);
119
+ this.#toast.appendChild(this.#iconBox);
118
120
  }
119
121
  this.#toast.appendChild(this.#body);
120
122
  if (options.action !== undefined) this.#addAction(options.action);
@@ -129,11 +131,11 @@ class Toast {
129
131
  }
130
132
 
131
133
  getTitle() {
132
- return this.#title_used ? this.#title.innerText : "";
134
+ return this.#titleUsed ? this.#title.innerText : "";
133
135
  }
134
136
 
135
137
  getText() {
136
- return this.#text_used ? this.#text.innerText : "";
138
+ return this.#textUsed ? this.#text.innerText : "";
137
139
  }
138
140
 
139
141
  getStyle() {
@@ -156,8 +158,8 @@ class Toast {
156
158
  }
157
159
 
158
160
  setTitle(title = String()) {
159
- if (!this.#title_used) {
160
- this.#title_used = true;
161
+ if (!this.#titleUsed) {
162
+ this.#titleUsed = true;
161
163
  this.#body.prepend(this.#title);
162
164
  }
163
165
  this.#title.innerText = title;
@@ -165,8 +167,8 @@ class Toast {
165
167
  }
166
168
 
167
169
  setText(text = String()) {
168
- if (!this.#text_used) {
169
- this.#text_used = true;
170
+ if (!this.#textUsed) {
171
+ this.#textUsed = true;
170
172
  this.#body.appendChild(this.#text);
171
173
  }
172
174
  this.#text.innerText = text;
@@ -177,7 +179,7 @@ class Toast {
177
179
  this.#style = style;
178
180
  for (const value of Object.values(STYLE)) this.#toast.classList.toggle(value, value === style);
179
181
  // Плашка перекрашивается вместе со стилем, а свой значок остаётся собой
180
- if (this.#icon_box !== undefined) setStatusPlate(this.#icon_box, PLATE_STATUS[style], this.#icon_custom);
182
+ if (this.#iconBox !== undefined) setStatusPlate(this.#iconBox, PLATE_STATUS[style], this.#iconCustom);
181
183
  // Ошибку объявляем сразу, остальное — вежливо
182
184
  this.#toast.setAttribute("role", style === STYLE.ERROR ? "alert" : "status");
183
185
  return this;
@@ -191,7 +193,7 @@ class Toast {
191
193
 
192
194
  /** Колбэк «тост убран» — очередь снимает его со своего учёта */
193
195
  onDismiss(listener = () => {}) {
194
- this.#on_dismiss = listener;
196
+ this.#onDismiss = listener;
195
197
  return this;
196
198
  }
197
199
 
@@ -234,7 +236,10 @@ class Toast {
234
236
  this.#clearTimer();
235
237
  this.#notifyDismiss();
236
238
  // Анимация уходa сработает только при заданном animationName — ставим его, если тост не показывали
237
- if (this.#toast.style.animationName === "") this.#toast.style.animationName = "fade-in";
239
+ if (this.#toast.style.animationName === "") {
240
+ this.#toast.style.animationName = "fade-in";
241
+ this.#toast.dataset.motion = "enter";
242
+ }
238
243
  new Animation(this.#toast).fadeOutAndRemove();
239
244
  return this;
240
245
  }
@@ -263,7 +268,7 @@ class Toast {
263
268
  #onTimeout = () => {
264
269
  this.#timer = undefined;
265
270
  this.dismiss();
266
- }
271
+ };
267
272
 
268
273
  #clearTimer() {
269
274
  if (this.#timer !== undefined) clearTimeout(this.#timer);
@@ -272,9 +277,9 @@ class Toast {
272
277
  }
273
278
 
274
279
  #notifyDismiss() {
275
- if (this.#on_dismiss === undefined) return;
276
- const listener = this.#on_dismiss;
277
- this.#on_dismiss = undefined;
280
+ if (this.#onDismiss === undefined) return;
281
+ const listener = this.#onDismiss;
282
+ this.#onDismiss = undefined;
278
283
  listener(this);
279
284
  }
280
285
 
@@ -284,7 +289,7 @@ class Toast {
284
289
  clickEvent: () => {
285
290
  if (action.listener !== undefined) action.listener();
286
291
  if (action.close !== false) this.dismiss();
287
- }
292
+ },
288
293
  });
289
294
  this.#actions.appendChild(button.set());
290
295
  }
@@ -347,15 +352,17 @@ class ToastQueue {
347
352
  #duration = ToastQueue.DEFAULT_DURATION;
348
353
  #closable = true;
349
354
 
350
- constructor(options = {
351
- id: String(),
352
- position: String(),
353
- max: Number(),
354
- duration: Number(),
355
- width: String(),
356
- closable: Boolean(),
357
- label: String()
358
- }) {
355
+ constructor(
356
+ options = {
357
+ id: String(),
358
+ position: String(),
359
+ max: Number(),
360
+ duration: Number(),
361
+ width: String(),
362
+ closable: Boolean(),
363
+ label: String(),
364
+ }
365
+ ) {
359
366
  setStyles(__dirname + "/styles.css", "chUiJS_ToastQueue");
360
367
  ToastQueue.#counter += 1;
361
368
  this.#id = options.id === undefined ? `chui_toast_queue_${ToastQueue.#counter}` : options.id;
@@ -425,20 +432,22 @@ class ToastQueue {
425
432
 
426
433
  // ОЧЕРЕДЬ
427
434
  /** Добавить тост: title, text, markdownText, style, duration, closable, icon, action, id */
428
- push(options = {
429
- title: String(),
430
- text: String(),
431
- markdownText: String(),
432
- style: String(),
433
- duration: Number(),
434
- closable: Boolean(),
435
- icon: String(),
436
- action: { title: String(), listener: undefined, close: Boolean() }
437
- }) {
435
+ push(
436
+ options = {
437
+ title: String(),
438
+ text: String(),
439
+ markdownText: String(),
440
+ style: String(),
441
+ duration: Number(),
442
+ closable: Boolean(),
443
+ icon: String(),
444
+ action: { title: String(), listener: undefined, close: Boolean() },
445
+ }
446
+ ) {
438
447
  const toast = new Toast({
439
448
  ...options,
440
449
  duration: options.duration === undefined ? this.#duration : options.duration,
441
- closable: options.closable === undefined ? this.#closable : options.closable
450
+ closable: options.closable === undefined ? this.#closable : options.closable,
442
451
  });
443
452
  toast.onDismiss(() => this.#forget(toast));
444
453
  this.#toasts.push(toast);
@@ -451,7 +460,7 @@ class ToastQueue {
451
460
 
452
461
  /** Убрать тост по объекту или по id (без id — ничего не делает) */
453
462
  dismiss(target) {
454
- const toast = typeof target === "string" ? this.#toasts.find(item => item.getId() === target) : target;
463
+ const toast = typeof target === "string" ? this.#toasts.find((item) => item.getId() === target) : target;
455
464
  if (toast === undefined || toast === null) return this;
456
465
  toast.dismiss();
457
466
  return this;
@@ -491,5 +500,5 @@ class ToastQueue {
491
500
  }
492
501
  }
493
502
 
494
- exports.ToastQueue = ToastQueue
495
- exports.Toast = Toast
503
+ exports.ToastQueue = ToastQueue;
504
+ exports.Toast = Toast;
@@ -6,10 +6,10 @@ chui_toolbar {
6
6
  box-sizing: border-box;
7
7
  width: max-content;
8
8
  max-width: -webkit-fill-available;
9
- margin: var(--margin);
9
+ margin: var(--block_margin);
10
10
  padding: 3px;
11
11
  border: 1px solid var(--border_color);
12
- border-radius: var(--border_radius);
12
+ border-radius: var(--radius_sm);
13
13
  background: var(--element_background_2);
14
14
  overflow-x: auto;
15
15
  }
@@ -1,6 +1,6 @@
1
- const {setStyles, optionOr} = require('../../modules/chui_functions');
2
- const {A11Y_FOCUSABLE_SELECTOR} = require('../../modules/chui_a11y/chui_a11y');
3
- const {I18n} = require('../../modules/chui_i18n/chui_i18n');
1
+ const { setStyles, optionOr } = require("../../modules/chui_functions");
2
+ const { A11Y_FOCUSABLE_SELECTOR } = require("../../modules/chui_a11y/chui_a11y");
3
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
4
4
 
5
5
  /**
6
6
  * Панель инструментов: ряд кнопок и контролов с одним «стопом» клавиатуры.
@@ -26,7 +26,7 @@ const {I18n} = require('../../modules/chui_i18n/chui_i18n');
26
26
  class Toolbar {
27
27
  static ORIENTATION = {
28
28
  HORIZONTAL: "horizontal",
29
- VERTICAL: "vertical"
29
+ VERTICAL: "vertical",
30
30
  };
31
31
  static #counter = 0;
32
32
 
@@ -35,12 +35,14 @@ class Toolbar {
35
35
  #orientation = Toolbar.ORIENTATION.HORIZONTAL;
36
36
  #label = I18n.t("navigation.toolbar");
37
37
 
38
- constructor(options = {
39
- id: String(),
40
- orientation: String(),
41
- label: String(),
42
- items: []
43
- }) {
38
+ constructor(
39
+ options = {
40
+ id: String(),
41
+ orientation: String(),
42
+ label: String(),
43
+ items: [],
44
+ }
45
+ ) {
44
46
  setStyles(__dirname + "/styles.css", "chUiJS_Toolbar");
45
47
  Toolbar.#counter += 1;
46
48
  this.#id = options.id === undefined ? `chui_toolbar_${Toolbar.#counter}` : options.id;
@@ -80,7 +82,10 @@ class Toolbar {
80
82
  }
81
83
 
82
84
  setOrientation(orientation = String()) {
83
- this.#orientation = orientation === Toolbar.ORIENTATION.VERTICAL ? Toolbar.ORIENTATION.VERTICAL : Toolbar.ORIENTATION.HORIZONTAL;
85
+ this.#orientation =
86
+ orientation === Toolbar.ORIENTATION.VERTICAL
87
+ ? Toolbar.ORIENTATION.VERTICAL
88
+ : Toolbar.ORIENTATION.HORIZONTAL;
84
89
  this.#root.dataset.orientation = this.#orientation;
85
90
  this.#root.setAttribute("aria-orientation", this.#orientation);
86
91
  return this;
@@ -129,7 +134,9 @@ class Toolbar {
129
134
  const forward = this.#orientation === Toolbar.ORIENTATION.VERTICAL ? "ArrowDown" : "ArrowRight";
130
135
  if (![backward, forward, "Home", "End"].includes(event.key)) return;
131
136
  const items = this.#focusable();
132
- const current = items.findIndex((node) => node === document.activeElement || node.contains(document.activeElement));
137
+ const current = items.findIndex(
138
+ (node) => node === document.activeElement || node.contains(document.activeElement)
139
+ );
133
140
  if (current === -1) return;
134
141
  event.preventDefault();
135
142
  if (event.key === "Home") items[0].focus();
@@ -142,4 +149,4 @@ class Toolbar {
142
149
  };
143
150
  }
144
151
 
145
- exports.Toolbar = Toolbar
152
+ exports.Toolbar = Toolbar;
@@ -11,7 +11,7 @@ chui_tooltip {
11
11
  width: max-content;
12
12
  padding: var(--control_padding);
13
13
  border: 1px solid var(--border_color);
14
- border-radius: var(--border_radius);
14
+ border-radius: var(--radius_sm);
15
15
  background: var(--header_background);
16
16
  backdrop-filter: var(--global_blur);
17
17
  -webkit-backdrop-filter: var(--global_blur);
@@ -22,7 +22,7 @@ chui_tooltip {
22
22
  line-height: 1.35;
23
23
  text-align: start;
24
24
  pointer-events: none;
25
- animation: chui_tooltip_fade_in 120ms ease-out;
25
+ animation: chui_tooltip_fade_in var(--motion_fast) var(--motion_ease);
26
26
  }
27
27
 
28
28
  chui_tooltip p {