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,98 +1,110 @@
1
- const { Animation } = require('../../../modules/chui_animations/animations');
2
- const { dropdownPlacement } = require('../../../modules/chui_functions');
3
- const { Icon, Icons } = require('../../chui_icons/icons');
4
- const {ComboboxKeyboard} = require('../../../modules/chui_a11y/chui_a11y');
5
- const {I18n} = require('../../../modules/chui_i18n/chui_i18n');
1
+ const { Animation } = require("../../../modules/chui_animations/animations");
2
+ const { dropdownPlacement } = require("../../../modules/chui_functions");
3
+ const { Icon, Icons } = require("../../chui_icons/icons");
4
+ const { ComboboxKeyboard } = require("../../../modules/chui_a11y/chui_a11y");
5
+ const { I18n } = require("../../../modules/chui_i18n/chui_i18n");
6
6
 
7
7
  const OPTION_ROW_HEIGHT = 33;
8
8
 
9
9
  class MultiComboBox {
10
10
  #id = require("randomstring").generate();
11
- #id_cb = require("randomstring").generate();
12
- #MultiComboBox_main = document.createElement('chui_multicombobox');
13
- #MultiComboBox_second = document.createElement('multicombobox');
14
- #MultiComboBox_options = document.createElement('multicombobox_options');
15
- #label = document.createElement('label');
16
- #input = document.createElement('input');
17
- #button_open = document.createElement('multicombo_button_open');
18
- #button_open_disabled = document.createElement('multicombo_button_open');
19
- #dropdown = document.createElement('multicombobox_dropdown');
20
- #more = document.createElement('multicombobox_option_added_more');
21
- #overflow_frame = undefined;
22
- #overflow_observer = undefined;
11
+ #idCb = require("randomstring").generate();
12
+ #MultiComboBoxMain = document.createElement("chui_multicombobox");
13
+ #MultiComboBoxSecond = document.createElement("multicombobox");
14
+ #MultiComboBoxOptions = document.createElement("multicombobox_options");
15
+ #label = document.createElement("label");
16
+ #input = document.createElement("input");
17
+ #buttonOpen = document.createElement("multicombo_button_open");
18
+ #buttonOpenDisabled = document.createElement("multicombo_button_open");
19
+ #dropdown = document.createElement("multicombobox_dropdown");
20
+ #more = document.createElement("multicombobox_option_added_more");
21
+ #overflowFrame = undefined;
22
+ #overflowObserver = undefined;
23
23
  #a11y = undefined;
24
24
  // Слушатель окна храним полем, чтобы можно было снять в destroy()
25
- #window_click_event = (event) => {
26
- if (!this.#MultiComboBox_second.contains(event.target)) this.#closeDropdown();
25
+ #windowClickEvent = (event) => {
26
+ if (!this.#MultiComboBoxSecond.contains(event.target)) this.#closeDropdown();
27
27
  };
28
- #dropdown_height = "max-content";
29
- #value = []
30
- constructor(options = {
31
- name: String(),
32
- title: String(),
33
- placeholder: String(),
34
- width: String(),
35
- required: Boolean(),
36
- optionsLen: String(),
37
- }) {
38
- require('../../../modules/chui_functions').setStyles(__dirname + "/styles.css", 'chUiJS_MultiComboBox');
28
+ #dropdownHeight = "max-content";
29
+ #value = [];
30
+ constructor(
31
+ options = {
32
+ name: String(),
33
+ title: String(),
34
+ placeholder: String(),
35
+ width: String(),
36
+ required: Boolean(),
37
+ optionsLen: String(),
38
+ }
39
+ ) {
40
+ require("../../../modules/chui_functions").setStyles(__dirname + "/styles.css", "chUiJS_MultiComboBox");
39
41
  if (options.placeholder !== undefined) this.#input.placeholder = options.placeholder;
40
- if (options.width !== undefined) this.#MultiComboBox_main.style.width = options.width;
42
+ if (options.width !== undefined) this.#MultiComboBoxMain.style.width = options.width;
41
43
  if (options.title !== undefined) {
42
- this.#label.classList.add('multicombobox_label')
44
+ this.#label.classList.add("multicombobox_label");
43
45
  this.#label.innerText = options.title;
44
- this.#label.setAttribute('for', this.#id_cb);
45
- this.#MultiComboBox_main.appendChild(this.#label);
46
+ this.#label.setAttribute("for", this.#idCb);
47
+ this.#MultiComboBoxMain.appendChild(this.#label);
46
48
  }
47
49
  if (options.optionsLen !== undefined) {
48
- this.#dropdown_height = (OPTION_ROW_HEIGHT * options.optionsLen) + "px";
50
+ this.#dropdownHeight = OPTION_ROW_HEIGHT * options.optionsLen + "px";
49
51
  }
50
- this.#dropdown.style.height = this.#dropdown_height;
52
+ this.#dropdown.style.height = this.#dropdownHeight;
51
53
  if (options.name !== undefined) this.#input.name = options.name;
52
54
  if (options.required !== undefined) this.#input.required = options.required;
53
- this.#input.setAttribute('id', this.#id_cb);
54
- this.#input.classList.add('multicombobox_input');
55
- this.#input.type = 'text';
55
+ this.#input.setAttribute("id", this.#idCb);
56
+ this.#input.classList.add("multicombobox_input");
57
+ this.#input.type = "text";
56
58
  // Рамку и подпись активного поля держит общее правило темы (`multicombobox:focus-within`
57
59
  // в global_style.css): индайновые состояние и цвет подписи перебивали тему
58
60
  // и расходились с остальными полями
59
- this.#button_open.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_DOWN, undefined, "var(--blue_prime_background)").getHTML();
60
- this.#button_open_disabled.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_DOWN, undefined, "var(--text_color_disabled)").getHTML();
61
+ this.#buttonOpen.innerHTML = new Icon(
62
+ Icons.HARDWARE.KEYBOARD_ARROW_DOWN,
63
+ undefined,
64
+ "var(--blue_prime_background)"
65
+ ).getHTML();
66
+ this.#buttonOpenDisabled.innerHTML = new Icon(
67
+ Icons.HARDWARE.KEYBOARD_ARROW_DOWN,
68
+ undefined,
69
+ "var(--text_color_disabled)"
70
+ ).getHTML();
61
71
  // Курсор выключенного поля даёт `.multicombobox_disabled`: `cursor` наследуется
62
- this.#dropdown.setAttribute('id', this.#id);
63
- this.#MultiComboBox_second.appendChild(this.#MultiComboBox_options)
64
- this.#MultiComboBox_options.appendChild(this.#input)
72
+ this.#dropdown.setAttribute("id", this.#id);
73
+ this.#MultiComboBoxSecond.appendChild(this.#MultiComboBoxOptions);
74
+ this.#MultiComboBoxOptions.appendChild(this.#input);
65
75
  // Счётчик выбранных значений, не поместившихся в строку: поле держит одну линию
66
76
  // (--control_height) и не растёт от выбора (`#syncOverflow`)
67
77
  this.#more.hidden = true;
68
78
  this.#more.setAttribute("role", "img");
69
- this.#MultiComboBox_options.appendChild(this.#more)
79
+ this.#MultiComboBoxOptions.appendChild(this.#more);
70
80
  // Ширину строки задаёт вёрстка вокруг: о смене размера сообщает наблюдатель
71
81
  if (typeof ResizeObserver === "function") {
72
- this.#overflow_observer = new ResizeObserver(() => this.#scheduleOverflow());
73
- this.#overflow_observer.observe(this.#MultiComboBox_options);
82
+ this.#overflowObserver = new ResizeObserver(() => this.#scheduleOverflow());
83
+ this.#overflowObserver.observe(this.#MultiComboBoxOptions);
74
84
  }
75
- this.#MultiComboBox_second.appendChild(this.#button_open)
76
- this.#MultiComboBox_second.appendChild(this.#dropdown)
85
+ this.#MultiComboBoxSecond.appendChild(this.#buttonOpen);
86
+ this.#MultiComboBoxSecond.appendChild(this.#dropdown);
77
87
  //LISTENERS
78
- this.#input.addEventListener('focus', () => {
79
- this.#button_open.style.transform = 'rotate(180deg)'
80
- this.#dropdown.style.height = this.#dropdown_height
81
- })
82
- this.#input.addEventListener('blur', () => {
83
- this.#button_open.style.transform = 'rotate(0deg)'
84
- this.#dropdown.style.height = this.#dropdown_height
85
- })
86
- this.#MultiComboBox_second.addEventListener('click', (event) => {
88
+ this.#input.addEventListener("focus", () => {
89
+ this.#buttonOpen.style.transform = "rotate(180deg)";
90
+ this.#dropdown.style.height = this.#dropdownHeight;
91
+ });
92
+ this.#input.addEventListener("blur", () => {
93
+ this.#buttonOpen.style.transform = "rotate(0deg)";
94
+ this.#dropdown.style.height = this.#dropdownHeight;
95
+ });
96
+ this.#MultiComboBoxSecond.addEventListener("click", (event) => {
87
97
  if (!this.#input.disabled) {
88
- if (event.target.closest('multicombobox_dropdown') === null &&
89
- event.target.closest('multicombobox_option_added_main') === null) {
90
- this.#input.focus()
91
- this.#openDropdown()
98
+ if (
99
+ event.target.closest("multicombobox_dropdown") === null &&
100
+ event.target.closest("multicombobox_option_added_main") === null
101
+ ) {
102
+ this.#input.focus();
103
+ this.#openDropdown();
92
104
  }
93
105
  }
94
106
  });
95
- this.#MultiComboBox_main.appendChild(this.#MultiComboBox_second)
107
+ this.#MultiComboBoxMain.appendChild(this.#MultiComboBoxSecond);
96
108
  // Клавиатура и aria: фокус в поле, стрелки по опциям, Enter переключает чекбокс, Escape закрывает.
97
109
  // `selectionState` отделяет выбор от наведения: `aria-selected` читается с чекбокса.
98
110
  this.#a11y = new ComboboxKeyboard(this.#input, {
@@ -103,257 +115,271 @@ class MultiComboBox {
103
115
  return box !== null && box.checked === true;
104
116
  },
105
117
  onEscape: () => this.#closeDropdown(),
106
- onOpen: () => this.#openDropdown()
118
+ onOpen: () => this.#openDropdown(),
107
119
  });
108
120
  // Список допускает несколько выбранных пунктов
109
121
  this.#dropdown.setAttribute("aria-multiselectable", "true");
110
122
  }
111
123
  #openDropdown() {
112
- new Animation(this.#dropdown).fadeIn();
124
+ new Animation(this.#dropdown).panelIn();
113
125
  setOptionDisplay(this.#dropdown);
114
126
  this.#setDropdownDirection();
115
127
  // Список раскрывают на видимом поле — подходящий момент пересчитать счётчик «+N»
116
128
  this.#scheduleOverflow();
117
129
  this.#a11y.setExpanded(true);
118
130
  // Слушатель окна нужен только пока список открыт: закрытие по клику снаружи
119
- window.addEventListener('click', this.#window_click_event);
131
+ window.addEventListener("click", this.#windowClickEvent);
120
132
  }
121
133
  #closeDropdown() {
122
134
  new Animation(this.#dropdown).fadeOut();
123
135
  if (this.#a11y !== undefined) this.#a11y.setExpanded(false);
124
- window.removeEventListener('click', this.#window_click_event);
136
+ window.removeEventListener("click", this.#windowClickEvent);
125
137
  }
126
- /** Полное удаление: снять слушатели окна и клавиатурный слой */
138
+ /** Полное удаление: снять слушатели окна, наблюдатель за строкой и клавиатурный слой */
127
139
  destroy() {
128
- window.removeEventListener('click', this.#window_click_event);
140
+ window.removeEventListener("click", this.#windowClickEvent);
141
+ // Наблюдатель за шириной строки и отложенный кадр живут дольше узла, если их не снять:
142
+ // `ResizeObserver` держит цель, а пересчёт «+N» продолжил бы считать скрытые метки
143
+ if (this.#overflowObserver !== undefined) {
144
+ this.#overflowObserver.disconnect();
145
+ this.#overflowObserver = undefined;
146
+ }
147
+ if (this.#overflowFrame !== undefined) {
148
+ cancelAnimationFrame(this.#overflowFrame);
149
+ this.#overflowFrame = undefined;
150
+ }
129
151
  this.#a11y.destroy();
130
152
  this.#closeDropdown();
131
153
  }
132
154
  addValueChangeListener(listener = () => {}) {
133
- this.#MultiComboBox_main.addEventListener("chui_multi_combo_option_changed", listener)
155
+ this.#MultiComboBoxMain.addEventListener("chui_multi_combo_option_changed", listener);
134
156
  }
135
157
  clearDropdown() {
136
158
  this.#dropdown.innerHTML = "";
137
159
  }
138
160
  addOptionsWithSections(options = []) {
139
- for (let sect of options) {
161
+ for (const sect of options) {
140
162
  const section = document.createElement(`section`);
141
- const section_title = document.createElement("label")
142
- section.className = "multi_combobox_section"
143
- section_title.className = "multi_combobox_section_title"
144
- section_title.innerText = sect.title;
145
- section.appendChild(section_title)
163
+ const sectionTitle = document.createElement("label");
164
+ section.className = "multi_combobox_section";
165
+ sectionTitle.className = "multi_combobox_section_title";
166
+ sectionTitle.innerText = sect.title;
167
+ section.appendChild(sectionTitle);
146
168
 
147
- for (let opt of sect.options) {
148
- const id_name = require("randomstring").generate();
169
+ for (const opt of sect.options) {
170
+ const identifier = require("randomstring").generate();
149
171
  const option = document.createElement(`label`);
150
- option.className = "multi_combobox_option"
151
- option.setAttribute("option_title", opt.title)
152
- const checkbox_input_check = document.createElement("input_check");
153
- checkbox_input_check.className = "checkmark"
154
- const checkbox_input_label = document.createElement("input_text");
155
- checkbox_input_label.className = "option_input_label"
156
- checkbox_input_label.innerText = opt.title;
157
- const checkbox_input = document.createElement("input");
158
- checkbox_input.className = "option_input"
159
- checkbox_input.type = "checkbox"
160
- checkbox_input.id = id_name;
161
- checkbox_input.name = id_name;
172
+ option.className = "multi_combobox_option";
173
+ option.setAttribute("option_title", opt.title);
174
+ const checkboxInputCheck = document.createElement("input_check");
175
+ checkboxInputCheck.className = "checkmark";
176
+ const checkboxInputLabel = document.createElement("input_text");
177
+ checkboxInputLabel.className = "option_input_label";
178
+ checkboxInputLabel.innerText = opt.title;
179
+ const checkboxInput = document.createElement("input");
180
+ checkboxInput.className = "option_input";
181
+ checkboxInput.type = "checkbox";
182
+ checkboxInput.id = identifier;
183
+ checkboxInput.name = identifier;
162
184
  //
163
- option.appendChild(checkbox_input)
164
- option.appendChild(checkbox_input_check)
165
- option.appendChild(checkbox_input_label)
166
- section.appendChild(option)
185
+ option.appendChild(checkboxInput);
186
+ option.appendChild(checkboxInputCheck);
187
+ option.appendChild(checkboxInputLabel);
188
+ section.appendChild(option);
167
189
  //
168
- checkbox_input.addEventListener("change", (evt) => {
169
- this.#input.value = ""
190
+ checkboxInput.addEventListener("change", (evt) => {
191
+ this.#input.value = "";
170
192
  // Выбор пункта — то же, что `aria-selected` у опции (см. `selectionState`)
171
- option.setAttribute("aria-selected", evt.target.checked ? "true" : "false")
193
+ option.setAttribute("aria-selected", evt.target.checked ? "true" : "false");
172
194
  if (evt.target.checked) {
173
- const test_main = document.createElement("multicombobox_option_added_main")
195
+ const optionChip = document.createElement("multicombobox_option_added_main");
174
196
  // Метка и чекбокс — два узла: id у каждого свой, иначе в документе два одинаковых id
175
- test_main.id = id_name + "_chip"
176
- const test_body = document.createElement("multicombobox_option_added_body")
177
- test_body.innerText = sect.title + ": " + opt.title;
178
- test_body.title = sect.title + ": " + opt.title;
179
- const test_remove = document.createElement("multicombobox_option_added_remove")
180
- test_remove.innerHTML = new Icon(Icons.NAVIGATION.CLOSE, "12px").getHTML()
181
- test_remove.addEventListener("click", () => checkbox_input.click())
182
- test_main.appendChild(test_body)
183
- test_main.appendChild(test_remove)
184
- this.#MultiComboBox_options.insertBefore(test_main, this.#input)
197
+ optionChip.id = identifier + "_chip";
198
+ const optionChipBody = document.createElement("multicombobox_option_added_body");
199
+ optionChipBody.innerText = sect.title + ": " + opt.title;
200
+ optionChipBody.title = sect.title + ": " + opt.title;
201
+ const optionChipRemove = document.createElement("multicombobox_option_added_remove");
202
+ optionChipRemove.innerHTML = new Icon(Icons.NAVIGATION.CLOSE, "12px").getHTML();
203
+ optionChipRemove.addEventListener("click", () => checkboxInput.click());
204
+ optionChip.appendChild(optionChipBody);
205
+ optionChip.appendChild(optionChipRemove);
206
+ this.#MultiComboBoxOptions.insertBefore(optionChip, this.#input);
185
207
  this.#value.push({
186
- id: id_name,
208
+ id: identifier,
187
209
  section: sect.title,
188
- option: opt
189
- })
210
+ option: opt,
211
+ });
190
212
  // Новая метка могла не влезть в строку — пересчёт счётчика «+N»
191
213
  this.#scheduleOverflow();
192
214
  } else {
193
- this.#removeOptionById(id_name)
215
+ this.#removeOptionById(identifier);
194
216
  }
195
217
  //
196
218
  const eventAwesome = new CustomEvent("chui_multi_combo_option_changed", {
197
219
  detail: {
198
- values: this.#value
220
+ values: this.#value,
199
221
  },
200
222
  });
201
- this.#MultiComboBox_main.dispatchEvent(eventAwesome)
202
- })
223
+ this.#MultiComboBoxMain.dispatchEvent(eventAwesome);
224
+ });
203
225
  }
204
226
  this.#dropdown.appendChild(section);
205
227
  }
206
- this.#input.removeEventListener('input', this.#filter_options_event);
207
- this.#input.addEventListener('input', this.#filter_sections_event);
228
+ this.#input.removeEventListener("input", this.#filterOptionsEvent);
229
+ this.#input.addEventListener("input", this.#filterSectionsEvent);
208
230
  }
209
231
  addOptions(...options) {
210
- for (let opt of options) {
232
+ for (const opt of options) {
211
233
  // Свой id на каждый вариант: одинаковые подписи больше не дают дубликатов id в документе
212
- const id_name = require("randomstring").generate();
234
+ const identifier = require("randomstring").generate();
213
235
  const option = document.createElement(`label`);
214
- option.className = "multi_combobox_option"
215
- option.setAttribute("option_title", opt.title)
216
- const checkbox_input_check = document.createElement("input_check");
217
- checkbox_input_check.className = "checkmark"
218
- const checkbox_input_label = document.createElement("input_text");
219
- checkbox_input_label.className = "option_input_label"
220
- checkbox_input_label.innerText = opt.title;
221
- const checkbox_input = document.createElement("input");
222
- checkbox_input.className = "option_input"
223
- checkbox_input.type = "checkbox"
224
- checkbox_input.id = id_name;
225
- checkbox_input.name = id_name;
236
+ option.className = "multi_combobox_option";
237
+ option.setAttribute("option_title", opt.title);
238
+ const checkboxInputCheck = document.createElement("input_check");
239
+ checkboxInputCheck.className = "checkmark";
240
+ const checkboxInputLabel = document.createElement("input_text");
241
+ checkboxInputLabel.className = "option_input_label";
242
+ checkboxInputLabel.innerText = opt.title;
243
+ const checkboxInput = document.createElement("input");
244
+ checkboxInput.className = "option_input";
245
+ checkboxInput.type = "checkbox";
246
+ checkboxInput.id = identifier;
247
+ checkboxInput.name = identifier;
226
248
  //
227
- option.appendChild(checkbox_input)
228
- option.appendChild(checkbox_input_check)
229
- option.appendChild(checkbox_input_label)
249
+ option.appendChild(checkboxInput);
250
+ option.appendChild(checkboxInputCheck);
251
+ option.appendChild(checkboxInputLabel);
230
252
  //
231
- checkbox_input.addEventListener("change", (evt) => {
232
- this.#input.value = ""
253
+ checkboxInput.addEventListener("change", (evt) => {
254
+ this.#input.value = "";
233
255
  // Выбор пункта — то же, что `aria-selected` у опции (см. `selectionState`)
234
- option.setAttribute("aria-selected", evt.target.checked ? "true" : "false")
235
- const test_main = document.createElement("multicombobox_option_added_main")
236
- test_main.id = id_name + "_chip"
237
- const test_body = document.createElement("multicombobox_option_added_body")
238
- test_body.innerText = opt.title;
239
- test_body.title = opt.title;
240
- const test_remove = document.createElement("multicombobox_option_added_remove")
241
- test_remove.innerHTML = new Icon(Icons.NAVIGATION.CLOSE, "12px").getHTML()
242
- test_main.appendChild(test_body)
243
- test_main.appendChild(test_remove)
256
+ option.setAttribute("aria-selected", evt.target.checked ? "true" : "false");
257
+ const optionChip = document.createElement("multicombobox_option_added_main");
258
+ optionChip.id = identifier + "_chip";
259
+ const optionChipBody = document.createElement("multicombobox_option_added_body");
260
+ optionChipBody.innerText = opt.title;
261
+ optionChipBody.title = opt.title;
262
+ const optionChipRemove = document.createElement("multicombobox_option_added_remove");
263
+ optionChipRemove.innerHTML = new Icon(Icons.NAVIGATION.CLOSE, "12px").getHTML();
264
+ optionChip.appendChild(optionChipBody);
265
+ optionChip.appendChild(optionChipRemove);
244
266
  //
245
- test_remove.addEventListener("click", () => checkbox_input.click())
267
+ optionChipRemove.addEventListener("click", () => checkboxInput.click());
246
268
  //
247
269
  if (evt.target.checked) {
248
- this.#MultiComboBox_options.insertBefore(test_main, this.#input)
249
- this.#value.push(opt)
270
+ this.#MultiComboBoxOptions.insertBefore(optionChip, this.#input);
271
+ this.#value.push(opt);
250
272
  // Новая метка могла не влезть в строку — пересчёт счётчика «+N»
251
273
  this.#scheduleOverflow();
252
274
  } else {
253
275
  // Метка снимается по своему id, а значение — по самому описанию варианта
254
- this.#removeOptionById(id_name)
255
- const index = this.#value.indexOf(opt)
256
- if (index !== -1) this.#value.splice(index, 1)
276
+ this.#removeOptionById(identifier);
277
+ const index = this.#value.indexOf(opt);
278
+ if (index !== -1) this.#value.splice(index, 1);
257
279
  }
258
280
  const eventAwesome = new CustomEvent("chui_multi_combo_option_changed", {
259
281
  detail: {
260
- values: this.#value
282
+ values: this.#value,
261
283
  },
262
284
  });
263
- this.#MultiComboBox_main.dispatchEvent(eventAwesome)
264
- })
285
+ this.#MultiComboBoxMain.dispatchEvent(eventAwesome);
286
+ });
265
287
  this.#dropdown.appendChild(option);
266
288
  }
267
- this.#input.removeEventListener('input', this.#filter_sections_event);
268
- this.#input.addEventListener('input', this.#filter_options_event);
289
+ this.#input.removeEventListener("input", this.#filterSectionsEvent);
290
+ this.#input.addEventListener("input", this.#filterOptionsEvent);
269
291
  }
270
- #filter_sections_event = (event) => {
271
- let dropdown = this.#dropdown;
272
- for (let section of dropdown.childNodes) {
273
- for (let option of section.childNodes) {
274
- let attr = option.getAttribute("option_title")
292
+ #filterSectionsEvent = (event) => {
293
+ const dropdown = this.#dropdown;
294
+ for (const section of dropdown.childNodes) {
295
+ for (const option of section.childNodes) {
296
+ const attr = option.getAttribute("option_title");
275
297
  if (attr) {
276
298
  if (!attr.toLowerCase().includes(event.target.value.toLowerCase())) {
277
- option.style.display = 'none'
278
- dropdown.style.height = 'max-content'
299
+ option.style.display = "none";
300
+ dropdown.style.height = "max-content";
279
301
  } else {
280
- option.style.display = 'flex'
281
- dropdown.style.height = this.#dropdown_height
302
+ option.style.display = "flex";
303
+ dropdown.style.height = this.#dropdownHeight;
282
304
  }
283
305
  }
284
306
  }
285
307
  }
286
- }
287
- #filter_options_event = (event) => {
288
- let dropdown = this.#dropdown;
289
- let query = event.target.value.toLowerCase();
290
- for (let option of dropdown.childNodes) {
308
+ };
309
+ #filterOptionsEvent = (event) => {
310
+ const dropdown = this.#dropdown;
311
+ const query = event.target.value.toLowerCase();
312
+ for (const option of dropdown.childNodes) {
291
313
  if (typeof option.getAttribute !== "function") continue;
292
- let title = option.getAttribute('option_title');
314
+ const title = option.getAttribute("option_title");
293
315
  if (title === null) continue;
294
316
  if (!title.toLowerCase().includes(query)) {
295
- option.style.display = 'none'
296
- dropdown.style.height = 'max-content'
317
+ option.style.display = "none";
318
+ dropdown.style.height = "max-content";
297
319
  } else {
298
- option.style.display = 'flex'
299
- dropdown.style.height = this.#dropdown_height
320
+ option.style.display = "flex";
321
+ dropdown.style.height = this.#dropdownHeight;
300
322
  }
301
323
  }
324
+ };
325
+ getName() {
326
+ return this.#input.name;
327
+ }
328
+ getValue() {
329
+ return this.#value;
302
330
  }
303
- getName() { return this.#input.name; }
304
- getValue() { return this.#value }
305
331
  setDisabled(boolean = Boolean()) {
306
- this.#input.disabled = boolean
332
+ this.#input.disabled = boolean;
307
333
  if (boolean) {
308
- this.#MultiComboBox_second.classList.add("multicombobox_disabled")
309
- this.#input.className = "multicombobox_input_disabled"
310
- this.#label.className = "multicombobox_label_disabled"
311
- this.#button_open.remove();
312
- this.#MultiComboBox_second.appendChild(this.#button_open_disabled);
334
+ this.#MultiComboBoxSecond.classList.add("multicombobox_disabled");
335
+ this.#input.className = "multicombobox_input_disabled";
336
+ this.#label.className = "multicombobox_label_disabled";
337
+ this.#buttonOpen.remove();
338
+ this.#MultiComboBoxSecond.appendChild(this.#buttonOpenDisabled);
313
339
  } else {
314
- this.#MultiComboBox_second.classList.remove("multicombobox_disabled")
315
- this.#input.className = "multicombobox_input"
316
- this.#label.className = "multicombobox_label"
317
- this.#button_open_disabled.remove();
318
- this.#MultiComboBox_second.appendChild(this.#button_open);
340
+ this.#MultiComboBoxSecond.classList.remove("multicombobox_disabled");
341
+ this.#input.className = "multicombobox_input";
342
+ this.#label.className = "multicombobox_label";
343
+ this.#buttonOpenDisabled.remove();
344
+ this.#MultiComboBoxSecond.appendChild(this.#buttonOpen);
319
345
  }
320
346
  }
321
347
  #removeOptionById(id) {
322
348
  // У метки свой id (id чекбокса + «_chip»): сам чекбокс из разметки не убирается
323
- const chip_id = id + "_chip";
324
- for (let node of [...this.#MultiComboBox_options.childNodes]) {
325
- if (node.id === chip_id) node.remove()
349
+ const chipId = id + "_chip";
350
+ for (const node of [...this.#MultiComboBoxOptions.childNodes]) {
351
+ if (node.id === chipId) node.remove();
326
352
  }
327
- const index = this.#value.findIndex((item) => item.id === id)
328
- if (index !== -1) this.#value.splice(index, 1)
353
+ const index = this.#value.findIndex((item) => item.id === id);
354
+ if (index !== -1) this.#value.splice(index, 1);
329
355
  // Место в строке освободилось: прежде скрытые значения могут вернуться
330
356
  this.#scheduleOverflow();
331
357
  }
332
358
  clear() {
333
- this.#input.value = ""
334
- this.#value = []
335
- for (let node of [...this.#MultiComboBox_options.childNodes]) {
336
- if (node !== this.#input && node !== this.#more) node.remove()
359
+ this.#input.value = "";
360
+ this.#value = [];
361
+ for (const node of [...this.#MultiComboBoxOptions.childNodes]) {
362
+ if (node !== this.#input && node !== this.#more) node.remove();
337
363
  }
338
- for (let checkbox of this.#dropdown.querySelectorAll('input[type="checkbox"]')) {
364
+ for (const checkbox of this.#dropdown.querySelectorAll('input[type="checkbox"]')) {
339
365
  checkbox.checked = false;
340
366
  }
341
367
  // Отметка выбора снимается вместе с чекбоксами: прежде `aria-selected` оставался
342
368
  // «true» и список после сброса формы показывал прошлый выбор
343
- for (let option of this.#dropdown.querySelectorAll('.multi_combobox_option')) {
369
+ for (const option of this.#dropdown.querySelectorAll(".multi_combobox_option")) {
344
370
  option.setAttribute("aria-selected", "false");
345
371
  }
346
372
  this.#scheduleOverflow();
347
373
  }
348
374
  #setDropdownDirection() {
349
- const placement = dropdownPlacement(this.#dropdown, this.#MultiComboBox_second);
375
+ const placement = dropdownPlacement(this.#dropdown, this.#MultiComboBoxSecond);
350
376
  // Зазор до поля держит CSS (`top: calc(100% + 4px)`), как у остальных списков:
351
377
  // прежде отступ задавался числом в пикселях под высоту прежнего поля 35 px
352
- this.#dropdown.style.top = placement.up ? 'auto' : '';
353
- this.#dropdown.style.bottom = placement.up ? 'calc(100% + 4px)' : '';
378
+ this.#dropdown.style.top = placement.up ? "auto" : "";
379
+ this.#dropdown.style.bottom = placement.up ? "calc(100% + 4px)" : "";
354
380
  // Слой не вылезает за видимую часть контейнера: лишнее уходит в прокрутку списка
355
381
  if (placement.maxHeight > 0) this.#dropdown.style.maxHeight = `${placement.maxHeight}px`;
356
- else this.#dropdown.style.removeProperty('max-height');
382
+ else this.#dropdown.style.removeProperty("max-height");
357
383
  }
358
384
 
359
385
  /**
@@ -363,7 +389,7 @@ class MultiComboBox {
363
389
  * не «съедает» место для набора.
364
390
  */
365
391
  #syncOverflow() {
366
- const options = this.#MultiComboBox_options;
392
+ const options = this.#MultiComboBoxOptions;
367
393
  const chips = [...options.querySelectorAll("multicombobox_option_added_main")];
368
394
  const available = options.clientWidth;
369
395
  for (const chip of chips) chip.hidden = false;
@@ -378,7 +404,7 @@ class MultiComboBox {
378
404
  // Не помещается: ищем, сколько значений показать числом, чтобы строка сошлась
379
405
  for (let hidden = 1; hidden <= chips.length; hidden += 1) {
380
406
  this.#more.innerText = `+${hidden}`;
381
- this.#more.setAttribute("aria-label", I18n.t("forms.multiComboMore", {count: hidden}));
407
+ this.#more.setAttribute("aria-label", I18n.t("forms.multiComboMore", { count: hidden }));
382
408
  this.#more.hidden = false;
383
409
  const counter = this.#more.getBoundingClientRect().width + gap;
384
410
  if (total(chips.length - hidden) + counter + reserve <= available) {
@@ -392,19 +418,23 @@ class MultiComboBox {
392
418
 
393
419
  /** Пересчёт счётчика после текущего кадра: к этому моменту разметка значений уже уложена */
394
420
  #scheduleOverflow() {
395
- if (this.#overflow_frame !== undefined) return;
396
- this.#overflow_frame = requestAnimationFrame(() => {
397
- this.#overflow_frame = undefined;
421
+ if (this.#overflowFrame !== undefined) return;
422
+ this.#overflowFrame = requestAnimationFrame(() => {
423
+ this.#overflowFrame = undefined;
398
424
  this.#syncOverflow();
399
425
  });
400
426
  }
401
- set() { return this.#MultiComboBox_main; }
427
+ set() {
428
+ return this.#MultiComboBoxMain;
429
+ }
402
430
  }
403
431
 
404
432
  function setOptionDisplay(element) {
405
433
  // Скрытая фильтром секция возвращается снятием инлайнового `display`:
406
434
  // базовый вид строки (флекс) задаёт CSS
407
- for (let option of element.childNodes) { option.style.removeProperty("display"); }
435
+ for (const option of element.childNodes) {
436
+ option.style.removeProperty("display");
437
+ }
408
438
  }
409
439
 
410
- exports.MultiComboBox = MultiComboBox
440
+ exports.MultiComboBox = MultiComboBox;