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,7 +1,7 @@
1
- const {setStyles} = require("../../modules/chui_functions");
2
- const {Icon, Icons} = require("../chui_icons/icons");
3
- const {MenuKeyboard} = require("../../modules/chui_a11y/chui_a11y");
4
- const {I18n} = require("../../modules/chui_i18n/chui_i18n");
1
+ const { setStyles } = require("../../modules/chui_functions");
2
+ const { Icon, Icons } = require("../chui_icons/icons");
3
+ const { MenuKeyboard } = require("../../modules/chui_a11y/chui_a11y");
4
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
5
5
 
6
6
  const SPLIT_MENU_GAP = 4;
7
7
  const SPLIT_MENU_EDGE = 8;
@@ -50,19 +50,21 @@ class SplitButton {
50
50
  #title = "";
51
51
  #icon = undefined;
52
52
  #disabled = false;
53
- #is_open = false;
53
+ #isOpen = false;
54
54
  #destroyed = false;
55
55
 
56
- constructor(options = {
57
- id: String(),
58
- title: String(),
59
- icon: String(),
60
- reverse: Boolean(),
61
- disabled: Boolean(),
62
- label: String(),
63
- clickEvent: undefined,
64
- items: []
65
- }) {
56
+ constructor(
57
+ options = {
58
+ id: String(),
59
+ title: String(),
60
+ icon: String(),
61
+ reverse: Boolean(),
62
+ disabled: Boolean(),
63
+ label: String(),
64
+ clickEvent: undefined,
65
+ items: [],
66
+ }
67
+ ) {
66
68
  setStyles(__dirname + "/styles.css", "chUiJS_SplitButton");
67
69
  SplitButton.#counter += 1;
68
70
  this.#id = options.id === undefined ? `chui_split_button_${SplitButton.#counter}` : options.id;
@@ -72,10 +74,10 @@ class SplitButton {
72
74
  this.#caret.type = "button";
73
75
  this.#caret.className = "split_button_caret";
74
76
  this.#caret.setAttribute("aria-label", I18n.t("navigation.moreActions"));
75
- const caret_glyph = new Icon(Icons.NAVIGATION.EXPAND_MORE, SplitButton.ICON_SIZE).set();
77
+ const caretGlyph = new Icon(Icons.NAVIGATION.EXPAND_MORE, SplitButton.ICON_SIZE).set();
76
78
  // Каретка — украшение: имя даёт aria-label кнопки
77
- caret_glyph.setAttribute("aria-hidden", "true");
78
- this.#caret.appendChild(caret_glyph);
79
+ caretGlyph.setAttribute("aria-hidden", "true");
80
+ this.#caret.appendChild(caretGlyph);
79
81
  this.#caret.setAttribute("aria-haspopup", "menu");
80
82
  this.#caret.setAttribute("aria-controls", `${this.#id}_menu`);
81
83
  this.#menu.id = `${this.#id}_menu`;
@@ -91,7 +93,7 @@ class SplitButton {
91
93
  this.#keyboard = new MenuKeyboard(this.#menu, {
92
94
  itemSelector: "button",
93
95
  onEscape: () => this.close(),
94
- trigger: this.#caret
96
+ trigger: this.#caret,
95
97
  });
96
98
  this.#keyboard.setExpanded(false);
97
99
  this.#caret.addEventListener("click", this.#onCaretClick);
@@ -125,7 +127,7 @@ class SplitButton {
125
127
  }
126
128
 
127
129
  get isOpen() {
128
- return this.#is_open;
130
+ return this.#isOpen;
129
131
  }
130
132
 
131
133
  getDisabled() {
@@ -183,7 +185,9 @@ class SplitButton {
183
185
  }
184
186
 
185
187
  /** Пункт меню: заголовок, значок, горячая клавиша и обработчик */
186
- static Item(options = { title: String(), icon: String(), shortcut: String(), disabled: Boolean(), clickEvent: undefined }) {
188
+ static Item(
189
+ options = { title: String(), icon: String(), shortcut: String(), disabled: Boolean(), clickEvent: undefined }
190
+ ) {
187
191
  return Object.assign({ type: "item" }, options);
188
192
  }
189
193
 
@@ -193,11 +197,12 @@ class SplitButton {
193
197
 
194
198
  // ОТКРЫТИЕ МЕНЮ
195
199
  open() {
196
- if (this.#destroyed || this.#is_open || this.#disabled) return this;
197
- this.#is_open = true;
200
+ if (this.#destroyed || this.#isOpen || this.#disabled) return this;
201
+ this.#isOpen = true;
198
202
  // Показ меню — классом: базовое `display: none` и вид задаёт CSS
199
203
  this.#menu.classList.add("split_button_menu_open");
200
204
  this.#positionMenu();
205
+ this.#menu.classList.remove("split_button_menu_leaving");
201
206
  this.#caret.classList.add("split_button_caret_active");
202
207
  window.addEventListener("click", this.#onWindowClick);
203
208
  window.addEventListener("resize", this.#onWindowChange);
@@ -208,9 +213,9 @@ class SplitButton {
208
213
  }
209
214
 
210
215
  close() {
211
- if (!this.#is_open) return this;
212
- this.#is_open = false;
213
- this.#menu.classList.remove("split_button_menu_open");
216
+ if (!this.#isOpen) return this;
217
+ this.#isOpen = false;
218
+ this.#hideMenu();
214
219
  this.#caret.classList.remove("split_button_caret_active");
215
220
  window.removeEventListener("click", this.#onWindowClick);
216
221
  window.removeEventListener("resize", this.#onWindowChange);
@@ -219,6 +224,23 @@ class SplitButton {
219
224
  return this;
220
225
  }
221
226
 
227
+ /**
228
+ * Уход меню идёт движением: класс показа снимается по концу кадра, поэтому меню не
229
+ * пропадает рывком. Открытие за время ухода отменяет снятие — иначе меню погасло бы
230
+ * уже открытым.
231
+ */
232
+ #hideMenu() {
233
+ this.#menu.classList.add("split_button_menu_leaving");
234
+ const done = (event) => {
235
+ if (event.target !== this.#menu) return;
236
+ this.#menu.removeEventListener("animationend", done);
237
+ if (this.#menu.classList.contains("split_button_menu_leaving") === false) return;
238
+ this.#menu.classList.remove("split_button_menu_leaving");
239
+ this.#menu.classList.remove("split_button_menu_open");
240
+ };
241
+ this.#menu.addEventListener("animationend", done);
242
+ }
243
+
222
244
  destroy() {
223
245
  if (this.#destroyed) return this;
224
246
  this.#destroyed = true;
@@ -301,7 +323,8 @@ class SplitButton {
301
323
  #positionMenu() {
302
324
  const button = this.#caret.getBoundingClientRect();
303
325
  let left = button.right - this.#menu.offsetWidth;
304
- if (left + this.#menu.offsetWidth > window.innerWidth - SPLIT_MENU_EDGE) left = window.innerWidth - SPLIT_MENU_EDGE - this.#menu.offsetWidth;
326
+ if (left + this.#menu.offsetWidth > window.innerWidth - SPLIT_MENU_EDGE)
327
+ left = window.innerWidth - SPLIT_MENU_EDGE - this.#menu.offsetWidth;
305
328
  if (left < SPLIT_MENU_EDGE) left = SPLIT_MENU_EDGE;
306
329
  this.#menu.style.left = `${Math.round(left)}px`;
307
330
  this.#menu.style.top = `${Math.round(button.bottom + SPLIT_MENU_GAP)}px`;
@@ -313,16 +336,16 @@ class SplitButton {
313
336
  };
314
337
 
315
338
  #onCaretClick = () => {
316
- if (this.#is_open) this.close();
339
+ if (this.#isOpen) this.close();
317
340
  else this.open();
318
341
  };
319
342
 
320
343
  #onWindowChange = () => {
321
- if (!this.#is_open) return;
344
+ if (!this.#isOpen) return;
322
345
  this.#positionMenu();
323
346
  };
324
347
 
325
348
  static ICON_SIZE = "16px";
326
349
  }
327
350
 
328
- exports.SplitButton = SplitButton
351
+ exports.SplitButton = SplitButton;
@@ -6,9 +6,9 @@ chui_split_button {
6
6
  align-items: stretch;
7
7
  width: max-content;
8
8
  height: max-content;
9
- margin: var(--margin);
9
+ margin: var(--block_margin);
10
10
  border: 1px solid var(--button_border_color);
11
- border-radius: var(--border_radius);
11
+ border-radius: var(--radius_sm);
12
12
  overflow: hidden;
13
13
  background: var(--button_background);
14
14
  color: var(--text_color);
@@ -25,7 +25,7 @@ chui_split_button {
25
25
  /* Компактный шаг и зазор — как у Button: 5px по вертикали дают
26
26
  те же 29px высоты контрола */
27
27
  gap: var(--control_padding);
28
- padding: var(--main_padding_sm);
28
+ padding: var(--block_padding_sm);
29
29
  border: none;
30
30
  background: transparent;
31
31
  color: inherit;
@@ -91,7 +91,7 @@ chui_split_button:not(.split_button_disabled):hover {
91
91
  правилом, а половинка кнопки, сжимающаяся отдельно, читалась бы поломкой */
92
92
  chui_split_button:not(.split_button_disabled):has(.split_button_main:active, .split_button_caret:active) {
93
93
  border-color: var(--button_border_color_hover);
94
- transform: scale(.97);
94
+ transform: scale(0.97);
95
95
  }
96
96
 
97
97
  /* Нажатие — акцент, как у Button: обе половины отвечают одинаково */
@@ -143,7 +143,7 @@ chui_split_menu {
143
143
  padding: 6px;
144
144
  gap: 2px;
145
145
  border: 1px solid var(--border_color);
146
- border-radius: var(--border_radius);
146
+ border-radius: var(--radius_sm);
147
147
  background: var(--header_background);
148
148
  backdrop-filter: var(--global_blur);
149
149
  box-shadow: var(--box_shadow_drop);
@@ -152,9 +152,25 @@ chui_split_menu {
152
152
  }
153
153
 
154
154
  /* Показ меню: базовое состояние — `display: none` выше. Класс ставит компонент при
155
- открытии (прежде показ задавал JS инлайном, дублируя это правило) */
155
+ открытии (прежде показ задавал JS инлайном, дублируя это правило), а появление ведёт
156
+ общий кадр панели: прежде меню возникало готовым, кадр был только у ухода */
156
157
  chui_split_menu.split_button_menu_open {
157
158
  display: flex;
159
+ animation: chui_panel_in var(--motion_base) var(--motion_spring);
160
+ }
161
+
162
+ /* Уход меню: оно гаснет и сходит вверх, а класс показа снимается по концу кадра.
163
+ Оба класса названы намеренно: показ задан селектором с элементом, и короткое
164
+ `.split_button_menu_leaving` проиграло бы ему по специфичности — кадр ухода не
165
+ проиграл бы вовсе, `animationend` не пришёл бы, и меню осталось бы открытым
166
+ навсегда (`close()` уже снял `#is_open`, поэтому каретка читалась бы закрытой) */
167
+ /* Уход меню: оно гаснет и сходит вверх, а класс показа снимается по концу кадра.
168
+ Оба класса названы намеренно: показ задан селектором с элементом, и короткое
169
+ `.split_button_menu_leaving` проиграло бы ему по специфичности — кадр ухода не
170
+ проиграл бы вовсе, `animationend` не пришёл бы, и меню осталось бы открытым
171
+ навсегда (сторож — `test/chui_motion.test.js`) */
172
+ chui_split_menu.split_button_menu_open.split_button_menu_leaving {
173
+ animation: chui_leave_up var(--motion_fast) var(--motion_ease) forwards;
158
174
  }
159
175
 
160
176
  .split_menu_item {
@@ -1,5 +1,5 @@
1
- const {setStyles, optionOr} = require('../../modules/chui_functions');
2
- const {I18n} = require('../../modules/chui_i18n/chui_i18n');
1
+ const { setStyles, optionOr } = require("../../modules/chui_functions");
2
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
3
3
 
4
4
  /**
5
5
  * Разделитель панелей: несколько областей и перетаскиваемые границы между ними.
@@ -31,7 +31,7 @@ const {I18n} = require('../../modules/chui_i18n/chui_i18n');
31
31
  class Splitter {
32
32
  static DIRECTION = {
33
33
  HORIZONTAL: "horizontal",
34
- VERTICAL: "vertical"
34
+ VERTICAL: "vertical",
35
35
  };
36
36
  static DEFAULT_SIZE = 6;
37
37
  static DEFAULT_STEP = 2;
@@ -48,26 +48,28 @@ class Splitter {
48
48
  #disabled = false;
49
49
  #label = I18n.t("a11y.resizePanel");
50
50
  #step = Splitter.DEFAULT_STEP;
51
- #on_resize = undefined;
52
- #on_resize_end = undefined;
53
- #on_reset = undefined;
51
+ #onResize = undefined;
52
+ #onResizeEnd = undefined;
53
+ #onReset = undefined;
54
54
  #dragging = undefined;
55
55
 
56
- constructor(options = {
57
- id: String(),
58
- direction: String(),
59
- sizes: [],
60
- min: undefined,
61
- panes: [],
62
- width: String(),
63
- height: String(),
64
- disabled: Boolean(),
65
- label: String(),
66
- step: Number(),
67
- onResize: undefined,
68
- onResizeEnd: undefined,
69
- onReset: undefined
70
- }) {
56
+ constructor(
57
+ options = {
58
+ id: String(),
59
+ direction: String(),
60
+ sizes: [],
61
+ min: undefined,
62
+ panes: [],
63
+ width: String(),
64
+ height: String(),
65
+ disabled: Boolean(),
66
+ label: String(),
67
+ step: Number(),
68
+ onResize: undefined,
69
+ onResizeEnd: undefined,
70
+ onReset: undefined,
71
+ }
72
+ ) {
71
73
  setStyles(__dirname + "/styles.css", "chUiJS_Splitter");
72
74
  Splitter.#counter += 1;
73
75
  // Заготовка опции (`String()`) равносильна отсутствующей: иначе вызов без аргументов
@@ -75,11 +77,11 @@ class Splitter {
75
77
  this.#id = optionOr(options.id, `chui_splitter_${Splitter.#counter}`);
76
78
  this.#root.id = this.#id;
77
79
  this.#direction = options.direction === undefined ? Splitter.DIRECTION.HORIZONTAL : options.direction;
78
- this.#min = options.min === undefined ? [] : (Array.isArray(options.min) ? options.min : [options.min]);
80
+ this.#min = options.min === undefined ? [] : Array.isArray(options.min) ? options.min : [options.min];
79
81
  this.#step = options.step === undefined ? Splitter.DEFAULT_STEP : options.step;
80
- this.#on_resize = options.onResize;
81
- this.#on_resize_end = options.onResizeEnd;
82
- this.#on_reset = options.onReset;
82
+ this.#onResize = options.onResize;
83
+ this.#onResizeEnd = options.onResizeEnd;
84
+ this.#onReset = options.onReset;
83
85
  this.#root.dataset.direction = this.#direction;
84
86
  this.setLabel(optionOr(options.label, this.#label));
85
87
  if (options.width !== undefined) this.setWidth(options.width);
@@ -200,7 +202,7 @@ class Splitter {
200
202
  const values = sizes.map((size) => Number(size)).map((size) => (Number.isFinite(size) && size > 0 ? size : 1));
201
203
  const count = this.#panes.length;
202
204
  if (count === 0) return this;
203
- let next = values.slice(0, count);
205
+ const next = values.slice(0, count);
204
206
  while (next.length < count) next.push(1);
205
207
  const sum = next.reduce((total, size) => total + size, 0);
206
208
  this.#sizes = sum === 0 ? this.#equalSizes() : next.map((size) => (size / sum) * 100);
@@ -287,13 +289,16 @@ class Splitter {
287
289
  const side = this.#isHorizontal()
288
290
  ? [I18n.t("a11y.sideLeft"), I18n.t("a11y.sideRight")]
289
291
  : [I18n.t("a11y.sideTop"), I18n.t("a11y.sideBottom")];
290
- handle.setAttribute("aria-valuetext", I18n.t("a11y.splitterValue", {
291
- first: side[0],
292
- firstPercent: Math.round(first),
293
- second: side[1].toLowerCase(),
294
- secondPercent: Math.round(second),
295
- total: Math.round(total)
296
- }));
292
+ handle.setAttribute(
293
+ "aria-valuetext",
294
+ I18n.t("a11y.splitterValue", {
295
+ first: side[0],
296
+ firstPercent: Math.round(first),
297
+ second: side[1].toLowerCase(),
298
+ secondPercent: Math.round(second),
299
+ total: Math.round(total),
300
+ })
301
+ );
297
302
  });
298
303
  }
299
304
 
@@ -307,13 +312,15 @@ class Splitter {
307
312
  const position = clientPosition - start;
308
313
  const before = this.#panes[index];
309
314
  const after = this.#panes[index + 1];
310
- const beforeStart = this.#isHorizontal() ? before.getBoundingClientRect().left - start : before.getBoundingClientRect().top - start;
315
+ const beforeStart = this.#isHorizontal()
316
+ ? before.getBoundingClientRect().left - start
317
+ : before.getBoundingClientRect().top - start;
311
318
  const pairSize = this.#paneSize(before) + this.#paneSize(after);
312
319
  if (pairSize === 0) return undefined;
313
320
  const pairShare = this.#sizes[index] + this.#sizes[index + 1];
314
321
  const minBefore = Math.min(this.getMin(index), pairSize);
315
322
  const minAfter = Math.min(this.getMin(index + 1), pairSize - minBefore);
316
- let beforePx = Math.max(minBefore, Math.min(position - beforeStart, pairSize - minAfter));
323
+ const beforePx = Math.max(minBefore, Math.min(position - beforeStart, pairSize - minAfter));
317
324
  const beforeShare = (beforePx / pairSize) * pairShare;
318
325
  const next = [...this.#sizes];
319
326
  next[index] = beforeShare;
@@ -346,15 +353,15 @@ class Splitter {
346
353
  }
347
354
 
348
355
  #emitResize() {
349
- if (this.#on_resize !== undefined) this.#on_resize(this.getSizes());
356
+ if (this.#onResize !== undefined) this.#onResize(this.getSizes());
350
357
  }
351
358
 
352
359
  #emitResizeEnd() {
353
- if (this.#on_resize_end !== undefined) this.#on_resize_end(this.getSizes());
360
+ if (this.#onResizeEnd !== undefined) this.#onResizeEnd(this.getSizes());
354
361
  }
355
362
 
356
363
  #emitReset() {
357
- if (this.#on_reset !== undefined) this.#on_reset(this.getSizes());
364
+ if (this.#onReset !== undefined) this.#onReset(this.getSizes());
358
365
  this.#emitResizeEnd();
359
366
  }
360
367
 
@@ -428,4 +435,4 @@ class Splitter {
428
435
  };
429
436
  }
430
437
 
431
- exports.Splitter = Splitter
438
+ exports.Splitter = Splitter;
@@ -3,9 +3,9 @@ chui_splitter {
3
3
  display: grid;
4
4
  width: -webkit-fill-available;
5
5
  box-sizing: border-box;
6
- margin: var(--margin);
6
+ margin: var(--block_margin);
7
7
  border: 1px solid var(--border_color);
8
- border-radius: var(--border_radius);
8
+ border-radius: var(--radius_sm);
9
9
  background: var(--element_background_2);
10
10
  overflow: hidden;
11
11
  }