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,8 @@
1
- const {setStyles} = require("../../modules/chui_functions");
2
- const {Validate} = require("../../modules/chui_validate/chui_validate");
3
- const {Icon, Icons} = require("../chui_icons/icons");
4
- const {RovingKeyboard} = require("../../modules/chui_a11y/chui_a11y");
5
- const {I18n} = require("../../modules/chui_i18n/chui_i18n");
1
+ const { setStyles } = require("../../modules/chui_functions");
2
+ const { Validate } = require("../../modules/chui_validate/chui_validate");
3
+ const { Icon, Icons } = require("../chui_icons/icons");
4
+ const { RovingKeyboard } = require("../../modules/chui_a11y/chui_a11y");
5
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
6
6
 
7
7
  /**
8
8
  * Перенос значений между двумя списками: слева доступное, справа выбранное.
@@ -36,64 +36,67 @@ class Transfer {
36
36
  #root = document.createElement("chui_transfer");
37
37
  #label = document.createElement("transfer_label");
38
38
  #row = document.createElement("transfer_row");
39
- #source_pane = document.createElement("transfer_pane");
40
- #target_pane = document.createElement("transfer_pane");
41
- #source_head = document.createElement("transfer_head");
42
- #target_head = document.createElement("transfer_head");
43
- #source_list = document.createElement("transfer_list");
44
- #target_list = document.createElement("transfer_list");
45
- #source_search = undefined;
46
- #target_search = undefined;
47
- #arrow_target = document.createElement("button");
48
- #arrow_source = document.createElement("button");
39
+ #sourcePane = document.createElement("transfer_pane");
40
+ #targetPane = document.createElement("transfer_pane");
41
+ #sourceHead = document.createElement("transfer_head");
42
+ #targetHead = document.createElement("transfer_head");
43
+ #sourceList = document.createElement("transfer_list");
44
+ #targetList = document.createElement("transfer_list");
45
+ #sourceSearch = undefined;
46
+ #targetSearch = undefined;
47
+ #arrowTarget = document.createElement("button");
48
+ #arrowSource = document.createElement("button");
49
49
  #hint = document.createElement("transfer_hint");
50
50
  #status = document.createElement("transfer_status");
51
51
  #error = document.createElement("chui_error_message");
52
- #source_roving = undefined;
53
- #target_roving = undefined;
52
+ #sourceRoving = undefined;
53
+ #targetRoving = undefined;
54
54
  #items = [];
55
55
  #marked = new Set();
56
56
  #id = undefined;
57
57
  #name = undefined;
58
- #title_text = undefined;
59
- #label_text = undefined;
60
- #source_title = undefined;
61
- #target_title = undefined;
58
+ #titleText = undefined;
59
+ #labelText = undefined;
60
+ #sourceTitle = undefined;
61
+ #targetTitle = undefined;
62
62
  #searchable = false;
63
63
  #disabled = false;
64
64
  #min = undefined;
65
65
  #max = undefined;
66
66
  #listeners = [];
67
- #on_change = undefined;
67
+ #onChange = undefined;
68
68
  // Строка, к которой нужно вернуть фокус после перерисовки
69
- #focus_value = undefined;
70
-
71
- constructor(options = {
72
- id: String(),
73
- name: String(),
74
- title: String(),
75
- label: String(),
76
- hint: String(),
77
- items: Array(),
78
- value: Array(),
79
- sourceTitle: String(),
80
- targetTitle: String(),
81
- searchable: Boolean(),
82
- disabled: Boolean(),
83
- min: Number(),
84
- max: Number(),
85
- changeListener: undefined,
86
- onChange: undefined
87
- }) {
69
+ #focusValue = undefined;
70
+
71
+ constructor(
72
+ options = {
73
+ id: String(),
74
+ name: String(),
75
+ title: String(),
76
+ label: String(),
77
+ hint: String(),
78
+ items: Array(),
79
+ value: Array(),
80
+ sourceTitle: String(),
81
+ targetTitle: String(),
82
+ searchable: Boolean(),
83
+ disabled: Boolean(),
84
+ min: Number(),
85
+ max: Number(),
86
+ changeListener: undefined,
87
+ onChange: undefined,
88
+ }
89
+ ) {
88
90
  setStyles(__dirname + "/styles.css", "chUiJS_Transfer");
89
91
  Transfer.#counter += 1;
90
92
  this.#id = options.id === undefined ? `chui_transfer_${Transfer.#counter}` : options.id;
91
93
  this.#name = options.name;
92
- this.#label_text = options.label;
93
- this.#on_change = options.onChange;
94
+ this.#labelText = options.label;
95
+ this.#onChange = options.onChange;
94
96
  this.#searchable = options.searchable === true;
95
- this.#source_title = options.sourceTitle === undefined ? I18n.t("transfer.available") : String(options.sourceTitle);
96
- this.#target_title = options.targetTitle === undefined ? I18n.t("transfer.chosen") : String(options.targetTitle);
97
+ this.#sourceTitle =
98
+ options.sourceTitle === undefined ? I18n.t("transfer.available") : String(options.sourceTitle);
99
+ this.#targetTitle = options.targetTitle === undefined ? I18n.t("transfer.chosen") : String(options.targetTitle);
97
100
  this.#min = options.min;
98
101
  this.#max = options.max;
99
102
  this.#root.id = this.#id;
@@ -101,27 +104,35 @@ class Transfer {
101
104
  this.#label.id = `${this.#id}_label`;
102
105
  this.#row.className = "transfer_row";
103
106
  this.#row.setAttribute("role", "group");
104
- this.#list_pane(this.#source_pane, this.#source_head, this.#source_list, this.#source_title, Transfer.SIDE.SOURCE);
105
- this.#list_pane(this.#target_pane, this.#target_head, this.#target_list, this.#target_title, Transfer.SIDE.TARGET);
106
- this.#source_list.addEventListener("click", this.#onClick);
107
- this.#target_list.addEventListener("click", this.#onClick);
108
- this.#source_list.addEventListener("dblclick", this.#onDoubleClick);
109
- this.#target_list.addEventListener("dblclick", this.#onDoubleClick);
110
- this.#source_list.addEventListener("keydown", this.#onKeyDown);
111
- this.#target_list.addEventListener("keydown", this.#onKeyDown);
112
- this.#arrow_target.type = "button";
113
- this.#arrow_source.type = "button";
114
- this.#move_button(this.#arrow_target, Transfer.SIDE.TARGET, Icons.NAVIGATION.CHEVRON_RIGHT,
115
- I18n.t("transfer.addMarked", {title: this.#target_title}));
116
- this.#move_button(this.#arrow_source, Transfer.SIDE.SOURCE, Icons.NAVIGATION.CHEVRON_LEFT,
117
- I18n.t("transfer.removeMarked", {title: this.#source_title}));
107
+ this.#listPane(this.#sourcePane, this.#sourceHead, this.#sourceList, this.#sourceTitle, Transfer.SIDE.SOURCE);
108
+ this.#listPane(this.#targetPane, this.#targetHead, this.#targetList, this.#targetTitle, Transfer.SIDE.TARGET);
109
+ this.#sourceList.addEventListener("click", this.#onClick);
110
+ this.#targetList.addEventListener("click", this.#onClick);
111
+ this.#sourceList.addEventListener("dblclick", this.#onDoubleClick);
112
+ this.#targetList.addEventListener("dblclick", this.#onDoubleClick);
113
+ this.#sourceList.addEventListener("keydown", this.#onKeyDown);
114
+ this.#targetList.addEventListener("keydown", this.#onKeyDown);
115
+ this.#arrowTarget.type = "button";
116
+ this.#arrowSource.type = "button";
117
+ this.#moveButton(
118
+ this.#arrowTarget,
119
+ Transfer.SIDE.TARGET,
120
+ Icons.NAVIGATION.CHEVRON_RIGHT,
121
+ I18n.t("transfer.addMarked", { title: this.#targetTitle })
122
+ );
123
+ this.#moveButton(
124
+ this.#arrowSource,
125
+ Transfer.SIDE.SOURCE,
126
+ Icons.NAVIGATION.CHEVRON_LEFT,
127
+ I18n.t("transfer.removeMarked", { title: this.#sourceTitle })
128
+ );
118
129
  const controls = document.createElement("transfer_controls");
119
130
  controls.className = "transfer_controls";
120
- controls.appendChild(this.#arrow_target);
121
- controls.appendChild(this.#arrow_source);
122
- this.#row.appendChild(this.#source_pane);
131
+ controls.appendChild(this.#arrowTarget);
132
+ controls.appendChild(this.#arrowSource);
133
+ this.#row.appendChild(this.#sourcePane);
123
134
  this.#row.appendChild(controls);
124
- this.#row.appendChild(this.#target_pane);
135
+ this.#row.appendChild(this.#targetPane);
125
136
  this.#hint.id = `${this.#id}_hint`;
126
137
  this.#hint.className = "transfer_hint";
127
138
  this.#hint.hidden = true;
@@ -135,16 +146,16 @@ class Transfer {
135
146
  this.#root.appendChild(this.#status);
136
147
  if (options.title !== undefined) this.setTitle(options.title);
137
148
  else this.#label.hidden = true;
138
- this.setLabel(this.#label_text === undefined ? I18n.t("transfer.title") : this.#label_text);
149
+ this.setLabel(this.#labelText === undefined ? I18n.t("transfer.title") : this.#labelText);
139
150
  if (options.hint !== undefined) this.setHint(options.hint);
140
151
  // Число выбранных значений сравнивается своим правилом, а не строками
141
- const rules_options = Object.assign({}, options);
142
- delete rules_options.min;
143
- delete rules_options.max;
144
- Validate.installField(this, rules_options, this.#root, this.#error, () => this.getValue(), this.#row);
152
+ const rulesOptions = Object.assign({}, options);
153
+ delete rulesOptions.min;
154
+ delete rulesOptions.max;
155
+ Validate.installField(this, rulesOptions, this.#root, this.#error, () => this.getValue(), this.#row);
145
156
  this.#installRules();
146
- this.#source_roving = new RovingKeyboard(this.#source_list, {itemSelector: ".transfer_item"});
147
- this.#target_roving = new RovingKeyboard(this.#target_list, {itemSelector: ".transfer_item"});
157
+ this.#sourceRoving = new RovingKeyboard(this.#sourceList, { itemSelector: ".transfer_item" });
158
+ this.#targetRoving = new RovingKeyboard(this.#targetList, { itemSelector: ".transfer_item" });
148
159
  this.setItems(options.items);
149
160
  if (options.value !== undefined) this.setValue(options.value);
150
161
  this.setDisabled(options.disabled === true);
@@ -161,12 +172,12 @@ class Transfer {
161
172
  }
162
173
 
163
174
  getTitle() {
164
- return this.#title_text;
175
+ return this.#titleText;
165
176
  }
166
177
 
167
178
  /** Доступное имя группы, заданное в `label` */
168
179
  getLabel() {
169
- return this.#label_text;
180
+ return this.#labelText;
170
181
  }
171
182
 
172
183
  /** Значения выбранного списка по порядку */
@@ -215,7 +226,7 @@ class Transfer {
215
226
 
216
227
  /** Подпись над списками; `undefined` её убирает (имя тогда даёт `label`) */
217
228
  setTitle(text = undefined) {
218
- this.#title_text = text;
229
+ this.#titleText = text;
219
230
  if (text === undefined || text === "") {
220
231
  this.#label.hidden = true;
221
232
  this.#label.innerText = "";
@@ -232,8 +243,8 @@ class Transfer {
232
243
 
233
244
  /** Имя группы, когда подписи в разметке нет */
234
245
  setLabel(text = undefined) {
235
- this.#label_text = text;
236
- if (this.#title_text === undefined || this.#title_text === "") {
246
+ this.#labelText = text;
247
+ if (this.#titleText === undefined || this.#titleText === "") {
237
248
  if (text === undefined) this.#row.removeAttribute("aria-label");
238
249
  else this.#row.setAttribute("aria-label", String(text));
239
250
  }
@@ -326,13 +337,13 @@ class Transfer {
326
337
  setDisabled(disabled = Boolean()) {
327
338
  this.#disabled = disabled === true;
328
339
  this.#root.classList.toggle("transfer_disabled", this.#disabled);
329
- for (const list of [this.#source_list, this.#target_list]) {
340
+ for (const list of [this.#sourceList, this.#targetList]) {
330
341
  if (this.#disabled) list.setAttribute("aria-disabled", "true");
331
342
  else list.removeAttribute("aria-disabled");
332
343
  }
333
- if (this.#source_search !== undefined) {
334
- this.#source_search.disabled = this.#disabled;
335
- this.#target_search.disabled = this.#disabled;
344
+ if (this.#sourceSearch !== undefined) {
345
+ this.#sourceSearch.disabled = this.#disabled;
346
+ this.#targetSearch.disabled = this.#disabled;
336
347
  for (const clear of this.#root.querySelectorAll(".transfer_search_clear")) clear.disabled = this.#disabled;
337
348
  }
338
349
  this.#render();
@@ -348,7 +359,7 @@ class Transfer {
348
359
  /** Фокус на первую строку: `Form` зовёт это при ошибке валидации */
349
360
  focus() {
350
361
  if (this.#disabled) return this;
351
- const list = this.#source_list.querySelector(".transfer_item") === null ? this.#target_list : this.#source_list;
362
+ const list = this.#sourceList.querySelector(".transfer_item") === null ? this.#targetList : this.#sourceList;
352
363
  const row = list.querySelector(".transfer_item");
353
364
  if (row !== null) row.focus();
354
365
  return this;
@@ -361,13 +372,14 @@ class Transfer {
361
372
 
362
373
  // === ВНУТРЕННЕЕ ===
363
374
  #accessibleName() {
364
- if (this.#title_text !== undefined && this.#title_text !== "") return this.#title_text;
365
- if (this.#label_text !== undefined && this.#label_text !== "") return this.#label_text;
375
+ if (this.#titleText !== undefined && this.#titleText !== "") return this.#titleText;
376
+ if (this.#labelText !== undefined && this.#labelText !== "") return this.#labelText;
366
377
  return I18n.t("transfer.title");
367
378
  }
368
379
 
369
380
  static #toItem(item = Object(), index = Number()) {
370
- if (typeof item === "string") return {title: item, subtitle: undefined, value: item, disabled: false, chosen: false};
381
+ if (typeof item === "string")
382
+ return { title: item, subtitle: undefined, value: item, disabled: false, chosen: false };
371
383
  return {
372
384
  title: item.title === undefined ? String(index + 1) : String(item.title),
373
385
  subtitle: item.subtitle === undefined ? undefined : String(item.subtitle),
@@ -391,7 +403,7 @@ class Transfer {
391
403
  }
392
404
 
393
405
  // Пара «заголовок + список» одного бока: поиск, список и место под пустое состояние
394
- #list_pane(pane = undefined, head = undefined, list = undefined, title = String(), side = String()) {
406
+ #listPane(pane = undefined, head = undefined, list = undefined, title = String(), side = String()) {
395
407
  pane.className = "transfer_pane";
396
408
  head.className = "transfer_head";
397
409
  head.innerText = title;
@@ -408,14 +420,14 @@ class Transfer {
408
420
  search.type = "search";
409
421
  search.className = "transfer_search";
410
422
  search.placeholder = I18n.t("transfer.search");
411
- search.setAttribute("aria-label", I18n.t("transfer.searchIn", {title: title}));
423
+ search.setAttribute("aria-label", I18n.t("transfer.searchIn", { title: title }));
412
424
  // Кнопка очистки — своя: системная кнопка очистки у `input[type=search]` скрыта (см. стили)
413
425
  const box = document.createElement("transfer_search_box");
414
426
  box.className = "transfer_search_box";
415
427
  const clear = document.createElement("button");
416
428
  clear.type = "button";
417
429
  clear.className = "transfer_search_clear";
418
- clear.setAttribute("aria-label", I18n.t("transfer.clearSearchIn", {title: title}));
430
+ clear.setAttribute("aria-label", I18n.t("transfer.clearSearchIn", { title: title }));
419
431
  clear.hidden = true;
420
432
  const glyph = new Icon(Icons.NAVIGATION.CLOSE, "16px").set();
421
433
  glyph.setAttribute("aria-hidden", "true");
@@ -430,8 +442,8 @@ class Transfer {
430
442
  clear.hidden = search.value === "";
431
443
  this.#render();
432
444
  });
433
- if (side === Transfer.SIDE.SOURCE) this.#source_search = search;
434
- else this.#target_search = search;
445
+ if (side === Transfer.SIDE.SOURCE) this.#sourceSearch = search;
446
+ else this.#targetSearch = search;
435
447
  box.appendChild(search);
436
448
  box.appendChild(clear);
437
449
  pane.appendChild(box);
@@ -440,7 +452,7 @@ class Transfer {
440
452
  return pane;
441
453
  }
442
454
 
443
- #move_button(button = undefined, side = String(), icon = String(), label = String()) {
455
+ #moveButton(button = undefined, side = String(), icon = String(), label = String()) {
444
456
  button.className = "transfer_move";
445
457
  button.setAttribute("aria-label", label);
446
458
  button.addEventListener("click", () => this.#moveSelected(side));
@@ -458,12 +470,12 @@ class Transfer {
458
470
  if (!result.valid) return result;
459
471
  const count = this.#markedItems().length;
460
472
  if (this.#min !== undefined && count < this.#min) {
461
- return {valid: false, rule: "min", message: I18n.t("transfer.selectMin", {min: this.#min})};
473
+ return { valid: false, rule: "min", message: I18n.t("transfer.selectMin", { min: this.#min }) };
462
474
  }
463
475
  if (this.#max !== undefined && count > this.#max) {
464
- return {valid: false, rule: "max", message: I18n.t("transfer.selectMax", {max: this.#max})};
476
+ return { valid: false, rule: "max", message: I18n.t("transfer.selectMax", { max: this.#max }) };
465
477
  }
466
- return {valid: true};
478
+ return { valid: true };
467
479
  };
468
480
  return this;
469
481
  }
@@ -473,30 +485,30 @@ class Transfer {
473
485
  // запомним строку под фокусом, чтобы вернуть его после перерисовки
474
486
  const active = document.activeElement;
475
487
  const focused = active === null || !this.#root.contains(active) ? null : active.closest(".transfer_item");
476
- if (focused !== null) this.#focus_value = focused.dataset.value;
477
- this.#source_list.innerHTML = "";
478
- this.#target_list.innerHTML = "";
479
- const source_filter = this.#filterOf(this.#source_search);
480
- const target_filter = this.#filterOf(this.#target_search);
481
- let source_count = 0;
482
- let target_count = 0;
488
+ if (focused !== null) this.#focusValue = focused.dataset.value;
489
+ this.#sourceList.innerHTML = "";
490
+ this.#targetList.innerHTML = "";
491
+ const sourceFilter = this.#filterOf(this.#sourceSearch);
492
+ const targetFilter = this.#filterOf(this.#targetSearch);
493
+ let sourceCount = 0;
494
+ let targetCount = 0;
483
495
  for (const item of this.#items) {
484
- const list = item.chosen ? this.#target_list : this.#source_list;
485
- const filter = item.chosen ? target_filter : source_filter;
486
- if (item.chosen) target_count += 1;
487
- else source_count += 1;
496
+ const list = item.chosen ? this.#targetList : this.#sourceList;
497
+ const filter = item.chosen ? targetFilter : sourceFilter;
498
+ if (item.chosen) targetCount += 1;
499
+ else sourceCount += 1;
488
500
  if (filter !== "" && !this.#matches(item, filter)) continue;
489
501
  list.appendChild(this.#rowNode(item));
490
502
  }
491
- this.#emptyNode(this.#source_list, this.#source_title, source_filter);
492
- this.#emptyNode(this.#target_list, this.#target_title, target_filter);
493
- this.#source_head.querySelector("transfer_count").innerText = `(${source_count})`;
494
- this.#target_head.querySelector("transfer_count").innerText = `(${target_count})`;
503
+ this.#emptyNode(this.#sourceList, this.#sourceTitle, sourceFilter);
504
+ this.#emptyNode(this.#targetList, this.#targetTitle, targetFilter);
505
+ this.#sourceHead.querySelector("transfer_count").innerText = `(${sourceCount})`;
506
+ this.#targetHead.querySelector("transfer_count").innerText = `(${targetCount})`;
495
507
  this.#applyButtons();
496
508
  this.#restoreFocus();
497
509
  // Остановка обхода подхватывает уже сфокусированную строку, а без неё — первую видимую
498
- if (this.#source_roving !== undefined) this.#source_roving.refresh();
499
- if (this.#target_roving !== undefined) this.#target_roving.refresh();
510
+ if (this.#sourceRoving !== undefined) this.#sourceRoving.refresh();
511
+ if (this.#targetRoving !== undefined) this.#targetRoving.refresh();
500
512
  return this;
501
513
  }
502
514
 
@@ -535,32 +547,33 @@ class Transfer {
535
547
  const empty = document.createElement("transfer_empty");
536
548
  // Пояснение, а не пункт списка: иначе listbox получил бы фиктивную опцию
537
549
  empty.setAttribute("role", "presentation");
538
- empty.innerText = filter === "" ? I18n.t("transfer.emptyList", {title: title}) : I18n.t("common.nothingFound");
550
+ empty.innerText =
551
+ filter === "" ? I18n.t("transfer.emptyList", { title: title }) : I18n.t("common.nothingFound");
539
552
  list.appendChild(empty);
540
553
  return empty;
541
554
  }
542
555
 
543
556
  #applyButtons() {
544
557
  const marked = this.#selectedValues();
545
- const can_add = marked.some((value) => {
558
+ const canAdd = marked.some((value) => {
546
559
  const item = this.#find(value);
547
560
  return item !== undefined && !item.chosen && !item.disabled;
548
561
  });
549
- const can_remove = marked.some((value) => {
562
+ const canRemove = marked.some((value) => {
550
563
  const item = this.#find(value);
551
564
  return item !== undefined && item.chosen && !item.disabled;
552
565
  });
553
566
  const chosen = this.#markedItems().length;
554
567
  const room = this.#max === undefined || chosen < this.#max;
555
- this.#arrow_target.disabled = this.#disabled || !can_add || !room;
556
- this.#arrow_source.disabled = this.#disabled || !can_remove;
568
+ this.#arrowTarget.disabled = this.#disabled || !canAdd || !room;
569
+ this.#arrowSource.disabled = this.#disabled || !canRemove;
557
570
  return this;
558
571
  }
559
572
 
560
573
  // После перерисовки фокус возвращается на ту же строку, а если её не стало — никуда
561
574
  #restoreFocus() {
562
- const value = this.#focus_value;
563
- this.#focus_value = undefined;
575
+ const value = this.#focusValue;
576
+ this.#focusValue = undefined;
564
577
  if (value === undefined) return;
565
578
  const row = this.#root.querySelector(`.transfer_item[data-value="${CSS.escape(value)}"]`);
566
579
  if (row === null) return;
@@ -583,7 +596,7 @@ class Transfer {
583
596
  if (side === Transfer.SIDE.TARGET && this.#max !== undefined) {
584
597
  const room = this.#max - this.#markedItems().length;
585
598
  if (moving.length > room) {
586
- this.#announce(I18n.t("transfer.maxReached", {max: this.#max}));
599
+ this.#announce(I18n.t("transfer.maxReached", { max: this.#max }));
587
600
  return;
588
601
  }
589
602
  }
@@ -594,10 +607,17 @@ class Transfer {
594
607
  titles.push(item.title);
595
608
  this.#marked.delete(value);
596
609
  }
597
- this.#focus_value = moving[0];
610
+ this.#focusValue = moving[0];
598
611
  this.#render();
599
- const side_title = side === Transfer.SIDE.TARGET ? this.#target_title : this.#source_title;
600
- this.#announce(I18n.t("transfer.moved", {title: side_title, titles: titles.join(", "), count: this.#markedItems().length, total: this.#items.length}));
612
+ const sideTitle = side === Transfer.SIDE.TARGET ? this.#targetTitle : this.#sourceTitle;
613
+ this.#announce(
614
+ I18n.t("transfer.moved", {
615
+ title: sideTitle,
616
+ titles: titles.join(", "),
617
+ count: this.#markedItems().length,
618
+ total: this.#items.length,
619
+ })
620
+ );
601
621
  this.#notify();
602
622
  return this;
603
623
  }
@@ -608,7 +628,7 @@ class Transfer {
608
628
  if (item === undefined || item.disabled) return;
609
629
  if (this.#marked.has(value)) this.#marked.delete(value);
610
630
  else this.#marked.add(value);
611
- this.#focus_value = value;
631
+ this.#focusValue = value;
612
632
  this.#render();
613
633
  // Об отметке сообщает сам список (aria-selected) — объявляем только снятие последней
614
634
  if (this.#marked.size === 0) this.#announce(I18n.t("transfer.nothingMarked"));
@@ -618,7 +638,7 @@ class Transfer {
618
638
  #notify() {
619
639
  const values = this.getValue();
620
640
  for (const listener of [...this.#listeners]) listener(values, this);
621
- if (this.#on_change !== undefined) this.#on_change(values, this);
641
+ if (this.#onChange !== undefined) this.#onChange(values, this);
622
642
  }
623
643
 
624
644
  #announce(text = String()) {
@@ -651,4 +671,4 @@ class Transfer {
651
671
  };
652
672
  }
653
673
 
654
- exports.Transfer = Transfer
674
+ exports.Transfer = Transfer;
@@ -6,14 +6,14 @@ chui_tree_table {
6
6
  width: -webkit-fill-available;
7
7
  max-width: 100%;
8
8
  height: max-content;
9
- margin: var(--margin);
9
+ margin: var(--block_margin);
10
10
  box-sizing: border-box;
11
11
  }
12
12
 
13
13
  .tree_table_label {
14
14
  display: block;
15
15
  width: max-content;
16
- margin: var(--margin);
16
+ margin: var(--block_margin);
17
17
  color: var(--text_color);
18
18
  font-size: var(--font_labels_size);
19
19
  font-weight: 500;
@@ -31,7 +31,7 @@ chui_tree_table {
31
31
  max-width: 100%;
32
32
  overflow: hidden;
33
33
  border: 1px solid var(--border_color);
34
- border-radius: var(--border_radius);
34
+ border-radius: var(--radius_sm);
35
35
  background: var(--element_background);
36
36
  color: var(--text_color);
37
37
  }
@@ -129,7 +129,7 @@ tree_table_toggle_spacer {
129
129
  .tree_table_toggle chui_icon {
130
130
  color: inherit;
131
131
  font-size: 18px;
132
- transition: transform var(--transition_time) ease;
132
+ transition: transform var(--motion_fast) var(--motion_ease);
133
133
  }
134
134
 
135
135
  .tree_table_toggle:hover {