chuijs 4.0.3 → 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 (258) hide show
  1. package/CHANGELOG.md +536 -0
  2. package/framework/appLayout/default/chui_app_layout.js +361 -303
  3. package/framework/appLayout/default/global_style.css +243 -89
  4. package/framework/appLayout/default/main_theme_style.css +188 -101
  5. package/framework/components/chui_accordion/accordion.js +17 -17
  6. package/framework/components/chui_accordion/styles.css +7 -7
  7. package/framework/components/chui_action_sheet/action_sheet.js +35 -32
  8. package/framework/components/chui_action_sheet/styles.css +10 -4
  9. package/framework/components/chui_actions_bar/actions_bar.js +338 -0
  10. package/framework/components/chui_actions_bar/styles.css +139 -0
  11. package/framework/components/chui_affix/affix.js +4 -4
  12. package/framework/components/chui_affix/styles.css +5 -0
  13. package/framework/components/chui_alert/alert.js +11 -5
  14. package/framework/components/chui_alert/styles.css +7 -0
  15. package/framework/components/chui_avatar/avatar.js +13 -13
  16. package/framework/components/chui_avatar/styles.css +1 -1
  17. package/framework/components/chui_avatar_group/avatar_group.js +4 -4
  18. package/framework/components/chui_avatar_group/styles.css +1 -1
  19. package/framework/components/chui_backtop/backtop.js +25 -2
  20. package/framework/components/chui_backtop/styles.css +21 -0
  21. package/framework/components/chui_badge/badge.js +15 -15
  22. package/framework/components/chui_badge/styles.css +6 -6
  23. package/framework/components/chui_banner/banner.js +222 -0
  24. package/framework/components/chui_banner/styles.css +170 -0
  25. package/framework/components/chui_breadcrumb/styles.css +1 -1
  26. package/framework/components/chui_button/button.js +24 -28
  27. package/framework/components/chui_button/styles.css +5 -5
  28. package/framework/components/chui_calendar/calendar.js +6 -6
  29. package/framework/components/chui_card/card.js +14 -14
  30. package/framework/components/chui_card_scroll/card_scroll.js +169 -0
  31. package/framework/components/chui_card_scroll/styles.css +86 -0
  32. package/framework/components/chui_chat/chat.js +73 -51
  33. package/framework/components/chui_chat/styles.css +18 -7
  34. package/framework/components/chui_clipboard_history/clipboard_history.js +25 -20
  35. package/framework/components/chui_clipboard_history/styles.css +10 -8
  36. package/framework/components/chui_code/code.js +8 -8
  37. package/framework/components/chui_code/styles.css +2 -2
  38. package/framework/components/chui_code_editor/code_editor.js +26 -26
  39. package/framework/components/chui_code_editor/styles.css +3 -3
  40. package/framework/components/chui_command_palette/command_palette.js +29 -29
  41. package/framework/components/chui_command_palette/styles.css +5 -5
  42. package/framework/components/chui_console/console.js +9 -9
  43. package/framework/components/chui_console/styles.css +5 -2
  44. package/framework/components/chui_content_block/content_block.js +2 -2
  45. package/framework/components/chui_context_menu/context_menu.js +162 -54
  46. package/framework/components/chui_context_menu/styles.css +82 -8
  47. package/framework/components/chui_custom_element/custom_element.js +11 -11
  48. package/framework/components/chui_data_grid/data_grid.js +268 -268
  49. package/framework/components/chui_data_grid/styles.css +14 -14
  50. package/framework/components/chui_descriptions/styles.css +1 -1
  51. package/framework/components/chui_details/details.js +12 -12
  52. package/framework/components/chui_details/styles.css +7 -7
  53. package/framework/components/chui_diff_viewer/diff_viewer.js +88 -88
  54. package/framework/components/chui_diff_viewer/styles.css +9 -9
  55. package/framework/components/chui_divider/divider.js +6 -6
  56. package/framework/components/chui_divider/styles.css +2 -2
  57. package/framework/components/chui_drawer/drawer.js +37 -14
  58. package/framework/components/chui_drawer/styles.css +18 -4
  59. package/framework/components/chui_drop_zone/drop_zone.js +6 -6
  60. package/framework/components/chui_drop_zone/styles.css +10 -6
  61. package/framework/components/chui_fieldset/fieldset.js +6 -6
  62. package/framework/components/chui_fieldset/styles.css +5 -5
  63. package/framework/components/chui_file_explorer/file_explorer.js +115 -115
  64. package/framework/components/chui_file_explorer/styles.css +6 -6
  65. package/framework/components/chui_form/form.js +11 -11
  66. package/framework/components/chui_gantt/gantt.js +41 -41
  67. package/framework/components/chui_gantt/styles.css +5 -5
  68. package/framework/components/chui_graphs/graphs.js +82 -46
  69. package/framework/components/chui_graphs/styles.css +26 -5
  70. package/framework/components/chui_hero/hero.js +63 -20
  71. package/framework/components/chui_hero/styles.css +176 -7
  72. package/framework/components/chui_html_block/html_block.js +5 -5
  73. package/framework/components/chui_html_block/styles.css +1 -1
  74. package/framework/components/chui_hx/styles.css +2 -2
  75. package/framework/components/chui_icons/icons.js +7 -7
  76. package/framework/components/chui_icons/styles.css +2 -1
  77. package/framework/components/chui_inputs/chui_check_box/styles.css +12 -3
  78. package/framework/components/chui_inputs/chui_chips/chips.js +92 -31
  79. package/framework/components/chui_inputs/chui_chips/styles.css +28 -5
  80. package/framework/components/chui_inputs/chui_color_picker/color_picker.js +20 -15
  81. package/framework/components/chui_inputs/chui_color_picker/styles.css +7 -7
  82. package/framework/components/chui_inputs/chui_combo_box/combo_box.js +58 -58
  83. package/framework/components/chui_inputs/chui_combo_box/styles.css +9 -9
  84. package/framework/components/chui_inputs/chui_date/date.js +93 -95
  85. package/framework/components/chui_inputs/chui_date/styles.css +8 -8
  86. package/framework/components/chui_inputs/chui_date_range/date_range.js +22 -22
  87. package/framework/components/chui_inputs/chui_date_range/styles.css +3 -3
  88. package/framework/components/chui_inputs/chui_datetime/datetime.js +12 -12
  89. package/framework/components/chui_inputs/chui_datetime/styles.css +3 -3
  90. package/framework/components/chui_inputs/chui_email/email.js +10 -10
  91. package/framework/components/chui_inputs/chui_email/styles.css +6 -6
  92. package/framework/components/chui_inputs/chui_file/file.js +8 -8
  93. package/framework/components/chui_inputs/chui_file/styles.css +12 -9
  94. package/framework/components/chui_inputs/chui_hotkey/hotkey.js +39 -39
  95. package/framework/components/chui_inputs/chui_hotkey/styles.css +6 -6
  96. package/framework/components/chui_inputs/chui_masked/masked.js +44 -44
  97. package/framework/components/chui_inputs/chui_masked/styles.css +5 -5
  98. package/framework/components/chui_inputs/chui_mention/mention.js +13 -13
  99. package/framework/components/chui_inputs/chui_mention/styles.css +14 -8
  100. package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +147 -137
  101. package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +14 -8
  102. package/framework/components/chui_inputs/chui_number/number.js +42 -45
  103. package/framework/components/chui_inputs/chui_number/styles.css +6 -6
  104. package/framework/components/chui_inputs/chui_otp/otp.js +32 -32
  105. package/framework/components/chui_inputs/chui_otp/styles.css +5 -5
  106. package/framework/components/chui_inputs/chui_password/password.js +30 -36
  107. package/framework/components/chui_inputs/chui_password/styles.css +7 -7
  108. package/framework/components/chui_inputs/chui_radio_button/styles.css +2 -2
  109. package/framework/components/chui_inputs/chui_rating/rating.js +28 -28
  110. package/framework/components/chui_inputs/chui_rating/styles.css +3 -3
  111. package/framework/components/chui_inputs/chui_select_box/select_box.js +54 -54
  112. package/framework/components/chui_inputs/chui_select_box/styles.css +10 -10
  113. package/framework/components/chui_inputs/chui_slider/slider.js +14 -14
  114. package/framework/components/chui_inputs/chui_slider/styles.css +5 -4
  115. package/framework/components/chui_inputs/chui_text/styles.css +7 -7
  116. package/framework/components/chui_inputs/chui_text/text.js +13 -17
  117. package/framework/components/chui_inputs/chui_text_area/styles.css +8 -8
  118. package/framework/components/chui_inputs/chui_text_area/text_area.js +23 -23
  119. package/framework/components/chui_inputs/chui_time/styles.css +13 -17
  120. package/framework/components/chui_inputs/chui_time/time.js +35 -24
  121. package/framework/components/chui_inputs/chui_toggle/styles.css +10 -3
  122. package/framework/components/chui_inputs/chui_toggle/toggle.js +16 -16
  123. package/framework/components/chui_json_editor/json_editor.js +87 -87
  124. package/framework/components/chui_json_editor/styles.css +5 -5
  125. package/framework/components/chui_json_viewer/json_viewer.js +80 -80
  126. package/framework/components/chui_json_viewer/styles.css +6 -6
  127. package/framework/components/chui_kanban/kanban.js +27 -27
  128. package/framework/components/chui_kanban/styles.css +8 -4
  129. package/framework/components/chui_kbd/styles.css +1 -1
  130. package/framework/components/chui_label/label.js +17 -17
  131. package/framework/components/chui_label/styles.css +1 -1
  132. package/framework/components/chui_link/link.js +9 -9
  133. package/framework/components/chui_link/styles.css +11 -4
  134. package/framework/components/chui_list/list.js +11 -11
  135. package/framework/components/chui_list/styles.css +2 -2
  136. package/framework/components/chui_markdown_editor/markdown_editor.js +66 -66
  137. package/framework/components/chui_markdown_editor/styles.css +5 -5
  138. package/framework/components/chui_media/audio.js +240 -246
  139. package/framework/components/chui_media/audio_styles.css +41 -23
  140. package/framework/components/chui_media/image.js +49 -46
  141. package/framework/components/chui_media/image_compare.js +35 -35
  142. package/framework/components/chui_media/image_compare_styles.css +5 -5
  143. package/framework/components/chui_media/image_styles.css +1 -1
  144. package/framework/components/chui_media/video.js +148 -148
  145. package/framework/components/chui_media/video_styles.css +27 -11
  146. package/framework/components/chui_menu_bar/menu_bar.js +54 -54
  147. package/framework/components/chui_menu_bar/styles.css +10 -10
  148. package/framework/components/chui_message_bar/message_bar.js +551 -0
  149. package/framework/components/chui_message_bar/styles.css +248 -0
  150. package/framework/components/chui_modal/modal.js +37 -13
  151. package/framework/components/chui_notification/notification.js +76 -54
  152. package/framework/components/chui_notification/notification_download.js +26 -81
  153. package/framework/components/chui_notification/notification_download_card.js +115 -0
  154. package/framework/components/chui_notification/notification_download_progress.css +2 -2
  155. package/framework/components/chui_notification/notification_download_progress.js +70 -108
  156. package/framework/components/chui_notification/notification_update.js +31 -31
  157. package/framework/components/chui_notification/status_plate.css +3 -3
  158. package/framework/components/chui_notification/styles.css +6 -1
  159. package/framework/components/chui_notification/styles_download.css +1 -1
  160. package/framework/components/chui_notification/styles_update.css +2 -2
  161. package/framework/components/chui_org_chart/org_chart.js +29 -29
  162. package/framework/components/chui_org_chart/styles.css +2 -2
  163. package/framework/components/chui_pagination/pagination.js +3 -3
  164. package/framework/components/chui_pagination/styles.css +1 -1
  165. package/framework/components/chui_paragraph/styles.css +2 -2
  166. package/framework/components/chui_popover/popover.js +29 -23
  167. package/framework/components/chui_popover/styles.css +1 -1
  168. package/framework/components/chui_popups/popups.js +124 -124
  169. package/framework/components/chui_popups/styles.css +5 -5
  170. package/framework/components/chui_print_button/print_button.js +15 -10
  171. package/framework/components/chui_progress_bar/progress_bar.js +34 -12
  172. package/framework/components/chui_progress_bar/styles.css +4 -4
  173. package/framework/components/chui_progress_ring/progress_ring.js +15 -15
  174. package/framework/components/chui_progress_ring/styles.css +1 -1
  175. package/framework/components/chui_qrcode/qrcode.js +12 -12
  176. package/framework/components/chui_query_builder/query_builder.js +46 -46
  177. package/framework/components/chui_query_builder/styles.css +4 -4
  178. package/framework/components/chui_radio_group/styles.css +1 -1
  179. package/framework/components/chui_result/result.js +15 -15
  180. package/framework/components/chui_result/styles.css +3 -3
  181. package/framework/components/chui_scheduler/scheduler.js +74 -74
  182. package/framework/components/chui_scheduler/styles.css +5 -5
  183. package/framework/components/chui_screen_spinner/screen_spinner.js +167 -0
  184. package/framework/components/chui_screen_spinner/styles.css +49 -0
  185. package/framework/components/chui_segmented_control/segmented_control.js +63 -6
  186. package/framework/components/chui_segmented_control/styles.css +32 -6
  187. package/framework/components/chui_settings/settings.js +45 -46
  188. package/framework/components/chui_settings/styles.css +4 -4
  189. package/framework/components/chui_shortcut_help/shortcut_help.js +32 -34
  190. package/framework/components/chui_sidebar_nav/sidebar_nav.js +98 -29
  191. package/framework/components/chui_sidebar_nav/styles.css +9 -3
  192. package/framework/components/chui_slideshow/slideshow.js +85 -85
  193. package/framework/components/chui_slideshow/styles.css +6 -6
  194. package/framework/components/chui_spinner/spinner.js +10 -10
  195. package/framework/components/chui_split_button/split_button.js +30 -12
  196. package/framework/components/chui_split_button/styles.css +21 -5
  197. package/framework/components/chui_splitter/splitter.js +11 -11
  198. package/framework/components/chui_splitter/styles.css +2 -2
  199. package/framework/components/chui_statistic/statistic.js +47 -47
  200. package/framework/components/chui_status_bar/styles.css +2 -2
  201. package/framework/components/chui_stepper/stepper.js +202 -31
  202. package/framework/components/chui_stepper/styles.css +79 -14
  203. package/framework/components/chui_sticky_bar/sticky_bar.js +44 -13
  204. package/framework/components/chui_sticky_bar/styles.css +10 -8
  205. package/framework/components/chui_tabs/chui_tabs.js +74 -26
  206. package/framework/components/chui_tabs/styles.css +40 -12
  207. package/framework/components/chui_text_editor/styles.css +7 -7
  208. package/framework/components/chui_text_editor/text_editor.js +56 -56
  209. package/framework/components/chui_text_editor/text_editor_panel.js +173 -174
  210. package/framework/components/chui_theme_toggle/theme_toggle.js +21 -5
  211. package/framework/components/chui_timeline/styles.css +3 -1
  212. package/framework/components/chui_toast_queue/styles.css +11 -11
  213. package/framework/components/chui_toast_queue/toast_queue.js +30 -27
  214. package/framework/components/chui_toolbar/styles.css +2 -2
  215. package/framework/components/chui_tooltip/styles.css +2 -2
  216. package/framework/components/chui_tooltip/tooltip.js +3 -3
  217. package/framework/components/chui_tour/styles.css +8 -8
  218. package/framework/components/chui_tour/tour.js +72 -72
  219. package/framework/components/chui_transfer/styles.css +6 -6
  220. package/framework/components/chui_transfer/transfer.js +93 -106
  221. package/framework/components/chui_tree_table/styles.css +4 -4
  222. package/framework/components/chui_tree_table/tree_table.js +45 -45
  223. package/framework/components/chui_tree_view/styles.css +10 -8
  224. package/framework/components/chui_tree_view/tree_view.js +185 -183
  225. package/framework/components/chui_user_bar/styles.css +145 -0
  226. package/framework/components/chui_user_bar/user_bar.js +402 -0
  227. package/framework/components/chui_user_list_bar/styles.css +173 -0
  228. package/framework/components/chui_user_list_bar/user_list_bar.js +485 -0
  229. package/framework/components/chui_watermark/watermark.js +17 -17
  230. package/framework/components/chui_webview/webview.js +9 -9
  231. package/framework/components/chui_write_bar/styles.css +172 -0
  232. package/framework/components/chui_write_bar/write_bar.js +320 -0
  233. package/framework/main_window.js +1234 -0
  234. package/framework/modules/chui_a11y/chui_a11y.js +78 -79
  235. package/framework/modules/chui_animations/animations.js +77 -15
  236. package/framework/modules/chui_animations/motion.js +120 -0
  237. package/framework/modules/chui_animations/styles.css +36 -3
  238. package/framework/modules/chui_functions.js +31 -27
  239. package/framework/modules/chui_highlight/styles.css +13 -10
  240. package/framework/modules/chui_i18n/chui_i18n.js +3 -3
  241. package/framework/modules/chui_i18n/locales/feedback.js +62 -0
  242. package/framework/modules/chui_i18n/locales/navigation.js +4 -0
  243. package/framework/modules/chui_json/chui_json.js +2 -2
  244. package/framework/modules/chui_logger/chui_logger.js +23 -8
  245. package/framework/modules/chui_page/page.js +10 -10
  246. package/framework/modules/chui_palette/palette.js +61 -0
  247. package/framework/modules/chui_qr/chui_qr.js +23 -23
  248. package/framework/modules/chui_scrollbar/chui_scrollbar.js +45 -45
  249. package/framework/modules/chui_scrollbar/styles.css +3 -3
  250. package/framework/modules/chui_services/chui_services.js +8 -8
  251. package/framework/modules/chui_services/desktop.js +77 -71
  252. package/framework/modules/chui_sortable/chui_sortable.js +17 -17
  253. package/framework/modules/chui_validate/chui_validate.js +3 -3
  254. package/framework/tray_bar/chui_menu_items.js +2 -2
  255. package/index.d.ts +266 -34
  256. package/index.js +20 -1168
  257. package/package.json +6 -4
  258. package/framework/components/telegram_bot/chui_telegram_bot.js +0 -191
@@ -8,24 +8,24 @@ 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");
11
+ #idCb = require("randomstring").generate();
12
+ #MultiComboBoxMain = document.createElement("chui_multicombobox");
13
+ #MultiComboBoxSecond = document.createElement("multicombobox");
14
+ #MultiComboBoxOptions = document.createElement("multicombobox_options");
15
15
  #label = document.createElement("label");
16
16
  #input = document.createElement("input");
17
- #button_open = document.createElement("multicombo_button_open");
18
- #button_open_disabled = document.createElement("multicombo_button_open");
17
+ #buttonOpen = document.createElement("multicombo_button_open");
18
+ #buttonOpenDisabled = document.createElement("multicombo_button_open");
19
19
  #dropdown = document.createElement("multicombobox_dropdown");
20
20
  #more = document.createElement("multicombobox_option_added_more");
21
- #overflow_frame = undefined;
22
- #overflow_observer = undefined;
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";
28
+ #dropdownHeight = "max-content";
29
29
  #value = [];
30
30
  constructor(
31
31
  options = {
@@ -39,61 +39,61 @@ class MultiComboBox {
39
39
  ) {
40
40
  require("../../../modules/chui_functions").setStyles(__dirname + "/styles.css", "chUiJS_MultiComboBox");
41
41
  if (options.placeholder !== undefined) this.#input.placeholder = options.placeholder;
42
- if (options.width !== undefined) this.#MultiComboBox_main.style.width = options.width;
42
+ if (options.width !== undefined) this.#MultiComboBoxMain.style.width = options.width;
43
43
  if (options.title !== undefined) {
44
44
  this.#label.classList.add("multicombobox_label");
45
45
  this.#label.innerText = options.title;
46
- this.#label.setAttribute("for", this.#id_cb);
47
- this.#MultiComboBox_main.appendChild(this.#label);
46
+ this.#label.setAttribute("for", this.#idCb);
47
+ this.#MultiComboBoxMain.appendChild(this.#label);
48
48
  }
49
49
  if (options.optionsLen !== undefined) {
50
- this.#dropdown_height = OPTION_ROW_HEIGHT * options.optionsLen + "px";
50
+ this.#dropdownHeight = OPTION_ROW_HEIGHT * options.optionsLen + "px";
51
51
  }
52
- this.#dropdown.style.height = this.#dropdown_height;
52
+ this.#dropdown.style.height = this.#dropdownHeight;
53
53
  if (options.name !== undefined) this.#input.name = options.name;
54
54
  if (options.required !== undefined) this.#input.required = options.required;
55
- this.#input.setAttribute("id", this.#id_cb);
55
+ this.#input.setAttribute("id", this.#idCb);
56
56
  this.#input.classList.add("multicombobox_input");
57
57
  this.#input.type = "text";
58
58
  // Рамку и подпись активного поля держит общее правило темы (`multicombobox:focus-within`
59
59
  // в global_style.css): индайновые состояние и цвет подписи перебивали тему
60
60
  // и расходились с остальными полями
61
- this.#button_open.innerHTML = new Icon(
61
+ this.#buttonOpen.innerHTML = new Icon(
62
62
  Icons.HARDWARE.KEYBOARD_ARROW_DOWN,
63
63
  undefined,
64
64
  "var(--blue_prime_background)"
65
65
  ).getHTML();
66
- this.#button_open_disabled.innerHTML = new Icon(
66
+ this.#buttonOpenDisabled.innerHTML = new Icon(
67
67
  Icons.HARDWARE.KEYBOARD_ARROW_DOWN,
68
68
  undefined,
69
69
  "var(--text_color_disabled)"
70
70
  ).getHTML();
71
71
  // Курсор выключенного поля даёт `.multicombobox_disabled`: `cursor` наследуется
72
72
  this.#dropdown.setAttribute("id", this.#id);
73
- this.#MultiComboBox_second.appendChild(this.#MultiComboBox_options);
74
- this.#MultiComboBox_options.appendChild(this.#input);
73
+ this.#MultiComboBoxSecond.appendChild(this.#MultiComboBoxOptions);
74
+ this.#MultiComboBoxOptions.appendChild(this.#input);
75
75
  // Счётчик выбранных значений, не поместившихся в строку: поле держит одну линию
76
76
  // (--control_height) и не растёт от выбора (`#syncOverflow`)
77
77
  this.#more.hidden = true;
78
78
  this.#more.setAttribute("role", "img");
79
- this.#MultiComboBox_options.appendChild(this.#more);
79
+ this.#MultiComboBoxOptions.appendChild(this.#more);
80
80
  // Ширину строки задаёт вёрстка вокруг: о смене размера сообщает наблюдатель
81
81
  if (typeof ResizeObserver === "function") {
82
- this.#overflow_observer = new ResizeObserver(() => this.#scheduleOverflow());
83
- this.#overflow_observer.observe(this.#MultiComboBox_options);
82
+ this.#overflowObserver = new ResizeObserver(() => this.#scheduleOverflow());
83
+ this.#overflowObserver.observe(this.#MultiComboBoxOptions);
84
84
  }
85
- this.#MultiComboBox_second.appendChild(this.#button_open);
86
- this.#MultiComboBox_second.appendChild(this.#dropdown);
85
+ this.#MultiComboBoxSecond.appendChild(this.#buttonOpen);
86
+ this.#MultiComboBoxSecond.appendChild(this.#dropdown);
87
87
  //LISTENERS
88
88
  this.#input.addEventListener("focus", () => {
89
- this.#button_open.style.transform = "rotate(180deg)";
90
- this.#dropdown.style.height = this.#dropdown_height;
89
+ this.#buttonOpen.style.transform = "rotate(180deg)";
90
+ this.#dropdown.style.height = this.#dropdownHeight;
91
91
  });
92
92
  this.#input.addEventListener("blur", () => {
93
- this.#button_open.style.transform = "rotate(0deg)";
94
- this.#dropdown.style.height = this.#dropdown_height;
93
+ this.#buttonOpen.style.transform = "rotate(0deg)";
94
+ this.#dropdown.style.height = this.#dropdownHeight;
95
95
  });
96
- this.#MultiComboBox_second.addEventListener("click", (event) => {
96
+ this.#MultiComboBoxSecond.addEventListener("click", (event) => {
97
97
  if (!this.#input.disabled) {
98
98
  if (
99
99
  event.target.closest("multicombobox_dropdown") === null &&
@@ -104,7 +104,7 @@ class MultiComboBox {
104
104
  }
105
105
  }
106
106
  });
107
- this.#MultiComboBox_main.appendChild(this.#MultiComboBox_second);
107
+ this.#MultiComboBoxMain.appendChild(this.#MultiComboBoxSecond);
108
108
  // Клавиатура и aria: фокус в поле, стрелки по опциям, Enter переключает чекбокс, Escape закрывает.
109
109
  // `selectionState` отделяет выбор от наведения: `aria-selected` читается с чекбокса.
110
110
  this.#a11y = new ComboboxKeyboard(this.#input, {
@@ -121,88 +121,98 @@ class MultiComboBox {
121
121
  this.#dropdown.setAttribute("aria-multiselectable", "true");
122
122
  }
123
123
  #openDropdown() {
124
- new Animation(this.#dropdown).fadeIn();
124
+ new Animation(this.#dropdown).panelIn();
125
125
  setOptionDisplay(this.#dropdown);
126
126
  this.#setDropdownDirection();
127
127
  // Список раскрывают на видимом поле — подходящий момент пересчитать счётчик «+N»
128
128
  this.#scheduleOverflow();
129
129
  this.#a11y.setExpanded(true);
130
130
  // Слушатель окна нужен только пока список открыт: закрытие по клику снаружи
131
- window.addEventListener("click", this.#window_click_event);
131
+ window.addEventListener("click", this.#windowClickEvent);
132
132
  }
133
133
  #closeDropdown() {
134
134
  new Animation(this.#dropdown).fadeOut();
135
135
  if (this.#a11y !== undefined) this.#a11y.setExpanded(false);
136
- window.removeEventListener("click", this.#window_click_event);
136
+ window.removeEventListener("click", this.#windowClickEvent);
137
137
  }
138
- /** Полное удаление: снять слушатели окна и клавиатурный слой */
138
+ /** Полное удаление: снять слушатели окна, наблюдатель за строкой и клавиатурный слой */
139
139
  destroy() {
140
- 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
+ }
141
151
  this.#a11y.destroy();
142
152
  this.#closeDropdown();
143
153
  }
144
154
  addValueChangeListener(listener = () => {}) {
145
- this.#MultiComboBox_main.addEventListener("chui_multi_combo_option_changed", listener);
155
+ this.#MultiComboBoxMain.addEventListener("chui_multi_combo_option_changed", listener);
146
156
  }
147
157
  clearDropdown() {
148
158
  this.#dropdown.innerHTML = "";
149
159
  }
150
160
  addOptionsWithSections(options = []) {
151
- for (let sect of options) {
161
+ for (const sect of options) {
152
162
  const section = document.createElement(`section`);
153
- const section_title = document.createElement("label");
163
+ const sectionTitle = document.createElement("label");
154
164
  section.className = "multi_combobox_section";
155
- section_title.className = "multi_combobox_section_title";
156
- section_title.innerText = sect.title;
157
- section.appendChild(section_title);
165
+ sectionTitle.className = "multi_combobox_section_title";
166
+ sectionTitle.innerText = sect.title;
167
+ section.appendChild(sectionTitle);
158
168
 
159
- for (let opt of sect.options) {
160
- const id_name = require("randomstring").generate();
169
+ for (const opt of sect.options) {
170
+ const identifier = require("randomstring").generate();
161
171
  const option = document.createElement(`label`);
162
172
  option.className = "multi_combobox_option";
163
173
  option.setAttribute("option_title", opt.title);
164
- const checkbox_input_check = document.createElement("input_check");
165
- checkbox_input_check.className = "checkmark";
166
- const checkbox_input_label = document.createElement("input_text");
167
- checkbox_input_label.className = "option_input_label";
168
- checkbox_input_label.innerText = opt.title;
169
- const checkbox_input = document.createElement("input");
170
- checkbox_input.className = "option_input";
171
- checkbox_input.type = "checkbox";
172
- checkbox_input.id = id_name;
173
- checkbox_input.name = id_name;
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;
174
184
  //
175
- option.appendChild(checkbox_input);
176
- option.appendChild(checkbox_input_check);
177
- option.appendChild(checkbox_input_label);
185
+ option.appendChild(checkboxInput);
186
+ option.appendChild(checkboxInputCheck);
187
+ option.appendChild(checkboxInputLabel);
178
188
  section.appendChild(option);
179
189
  //
180
- checkbox_input.addEventListener("change", (evt) => {
190
+ checkboxInput.addEventListener("change", (evt) => {
181
191
  this.#input.value = "";
182
192
  // Выбор пункта — то же, что `aria-selected` у опции (см. `selectionState`)
183
193
  option.setAttribute("aria-selected", evt.target.checked ? "true" : "false");
184
194
  if (evt.target.checked) {
185
- const test_main = document.createElement("multicombobox_option_added_main");
195
+ const optionChip = document.createElement("multicombobox_option_added_main");
186
196
  // Метка и чекбокс — два узла: id у каждого свой, иначе в документе два одинаковых id
187
- test_main.id = id_name + "_chip";
188
- const test_body = document.createElement("multicombobox_option_added_body");
189
- test_body.innerText = sect.title + ": " + opt.title;
190
- test_body.title = sect.title + ": " + opt.title;
191
- const test_remove = document.createElement("multicombobox_option_added_remove");
192
- test_remove.innerHTML = new Icon(Icons.NAVIGATION.CLOSE, "12px").getHTML();
193
- test_remove.addEventListener("click", () => checkbox_input.click());
194
- test_main.appendChild(test_body);
195
- test_main.appendChild(test_remove);
196
- 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);
197
207
  this.#value.push({
198
- id: id_name,
208
+ id: identifier,
199
209
  section: sect.title,
200
210
  option: opt,
201
211
  });
202
212
  // Новая метка могла не влезть в строку — пересчёт счётчика «+N»
203
213
  this.#scheduleOverflow();
204
214
  } else {
205
- this.#removeOptionById(id_name);
215
+ this.#removeOptionById(identifier);
206
216
  }
207
217
  //
208
218
  const eventAwesome = new CustomEvent("chui_multi_combo_option_changed", {
@@ -210,60 +220,60 @@ class MultiComboBox {
210
220
  values: this.#value,
211
221
  },
212
222
  });
213
- this.#MultiComboBox_main.dispatchEvent(eventAwesome);
223
+ this.#MultiComboBoxMain.dispatchEvent(eventAwesome);
214
224
  });
215
225
  }
216
226
  this.#dropdown.appendChild(section);
217
227
  }
218
- this.#input.removeEventListener("input", this.#filter_options_event);
219
- this.#input.addEventListener("input", this.#filter_sections_event);
228
+ this.#input.removeEventListener("input", this.#filterOptionsEvent);
229
+ this.#input.addEventListener("input", this.#filterSectionsEvent);
220
230
  }
221
231
  addOptions(...options) {
222
- for (let opt of options) {
232
+ for (const opt of options) {
223
233
  // Свой id на каждый вариант: одинаковые подписи больше не дают дубликатов id в документе
224
- const id_name = require("randomstring").generate();
234
+ const identifier = require("randomstring").generate();
225
235
  const option = document.createElement(`label`);
226
236
  option.className = "multi_combobox_option";
227
237
  option.setAttribute("option_title", opt.title);
228
- const checkbox_input_check = document.createElement("input_check");
229
- checkbox_input_check.className = "checkmark";
230
- const checkbox_input_label = document.createElement("input_text");
231
- checkbox_input_label.className = "option_input_label";
232
- checkbox_input_label.innerText = opt.title;
233
- const checkbox_input = document.createElement("input");
234
- checkbox_input.className = "option_input";
235
- checkbox_input.type = "checkbox";
236
- checkbox_input.id = id_name;
237
- checkbox_input.name = id_name;
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;
238
248
  //
239
- option.appendChild(checkbox_input);
240
- option.appendChild(checkbox_input_check);
241
- option.appendChild(checkbox_input_label);
249
+ option.appendChild(checkboxInput);
250
+ option.appendChild(checkboxInputCheck);
251
+ option.appendChild(checkboxInputLabel);
242
252
  //
243
- checkbox_input.addEventListener("change", (evt) => {
253
+ checkboxInput.addEventListener("change", (evt) => {
244
254
  this.#input.value = "";
245
255
  // Выбор пункта — то же, что `aria-selected` у опции (см. `selectionState`)
246
256
  option.setAttribute("aria-selected", evt.target.checked ? "true" : "false");
247
- const test_main = document.createElement("multicombobox_option_added_main");
248
- test_main.id = id_name + "_chip";
249
- const test_body = document.createElement("multicombobox_option_added_body");
250
- test_body.innerText = opt.title;
251
- test_body.title = opt.title;
252
- const test_remove = document.createElement("multicombobox_option_added_remove");
253
- test_remove.innerHTML = new Icon(Icons.NAVIGATION.CLOSE, "12px").getHTML();
254
- test_main.appendChild(test_body);
255
- test_main.appendChild(test_remove);
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);
256
266
  //
257
- test_remove.addEventListener("click", () => checkbox_input.click());
267
+ optionChipRemove.addEventListener("click", () => checkboxInput.click());
258
268
  //
259
269
  if (evt.target.checked) {
260
- this.#MultiComboBox_options.insertBefore(test_main, this.#input);
270
+ this.#MultiComboBoxOptions.insertBefore(optionChip, this.#input);
261
271
  this.#value.push(opt);
262
272
  // Новая метка могла не влезть в строку — пересчёт счётчика «+N»
263
273
  this.#scheduleOverflow();
264
274
  } else {
265
275
  // Метка снимается по своему id, а значение — по самому описанию варианта
266
- this.#removeOptionById(id_name);
276
+ this.#removeOptionById(identifier);
267
277
  const index = this.#value.indexOf(opt);
268
278
  if (index !== -1) this.#value.splice(index, 1);
269
279
  }
@@ -272,43 +282,43 @@ class MultiComboBox {
272
282
  values: this.#value,
273
283
  },
274
284
  });
275
- this.#MultiComboBox_main.dispatchEvent(eventAwesome);
285
+ this.#MultiComboBoxMain.dispatchEvent(eventAwesome);
276
286
  });
277
287
  this.#dropdown.appendChild(option);
278
288
  }
279
- this.#input.removeEventListener("input", this.#filter_sections_event);
280
- this.#input.addEventListener("input", this.#filter_options_event);
289
+ this.#input.removeEventListener("input", this.#filterSectionsEvent);
290
+ this.#input.addEventListener("input", this.#filterOptionsEvent);
281
291
  }
282
- #filter_sections_event = (event) => {
283
- let dropdown = this.#dropdown;
284
- for (let section of dropdown.childNodes) {
285
- for (let option of section.childNodes) {
286
- 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");
287
297
  if (attr) {
288
298
  if (!attr.toLowerCase().includes(event.target.value.toLowerCase())) {
289
299
  option.style.display = "none";
290
300
  dropdown.style.height = "max-content";
291
301
  } else {
292
302
  option.style.display = "flex";
293
- dropdown.style.height = this.#dropdown_height;
303
+ dropdown.style.height = this.#dropdownHeight;
294
304
  }
295
305
  }
296
306
  }
297
307
  }
298
308
  };
299
- #filter_options_event = (event) => {
300
- let dropdown = this.#dropdown;
301
- let query = event.target.value.toLowerCase();
302
- for (let option of dropdown.childNodes) {
309
+ #filterOptionsEvent = (event) => {
310
+ const dropdown = this.#dropdown;
311
+ const query = event.target.value.toLowerCase();
312
+ for (const option of dropdown.childNodes) {
303
313
  if (typeof option.getAttribute !== "function") continue;
304
- let title = option.getAttribute("option_title");
314
+ const title = option.getAttribute("option_title");
305
315
  if (title === null) continue;
306
316
  if (!title.toLowerCase().includes(query)) {
307
317
  option.style.display = "none";
308
318
  dropdown.style.height = "max-content";
309
319
  } else {
310
320
  option.style.display = "flex";
311
- dropdown.style.height = this.#dropdown_height;
321
+ dropdown.style.height = this.#dropdownHeight;
312
322
  }
313
323
  }
314
324
  };
@@ -321,24 +331,24 @@ class MultiComboBox {
321
331
  setDisabled(boolean = Boolean()) {
322
332
  this.#input.disabled = boolean;
323
333
  if (boolean) {
324
- this.#MultiComboBox_second.classList.add("multicombobox_disabled");
334
+ this.#MultiComboBoxSecond.classList.add("multicombobox_disabled");
325
335
  this.#input.className = "multicombobox_input_disabled";
326
336
  this.#label.className = "multicombobox_label_disabled";
327
- this.#button_open.remove();
328
- this.#MultiComboBox_second.appendChild(this.#button_open_disabled);
337
+ this.#buttonOpen.remove();
338
+ this.#MultiComboBoxSecond.appendChild(this.#buttonOpenDisabled);
329
339
  } else {
330
- this.#MultiComboBox_second.classList.remove("multicombobox_disabled");
340
+ this.#MultiComboBoxSecond.classList.remove("multicombobox_disabled");
331
341
  this.#input.className = "multicombobox_input";
332
342
  this.#label.className = "multicombobox_label";
333
- this.#button_open_disabled.remove();
334
- this.#MultiComboBox_second.appendChild(this.#button_open);
343
+ this.#buttonOpenDisabled.remove();
344
+ this.#MultiComboBoxSecond.appendChild(this.#buttonOpen);
335
345
  }
336
346
  }
337
347
  #removeOptionById(id) {
338
348
  // У метки свой id (id чекбокса + «_chip»): сам чекбокс из разметки не убирается
339
- const chip_id = id + "_chip";
340
- for (let node of [...this.#MultiComboBox_options.childNodes]) {
341
- 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();
342
352
  }
343
353
  const index = this.#value.findIndex((item) => item.id === id);
344
354
  if (index !== -1) this.#value.splice(index, 1);
@@ -348,21 +358,21 @@ class MultiComboBox {
348
358
  clear() {
349
359
  this.#input.value = "";
350
360
  this.#value = [];
351
- for (let node of [...this.#MultiComboBox_options.childNodes]) {
361
+ for (const node of [...this.#MultiComboBoxOptions.childNodes]) {
352
362
  if (node !== this.#input && node !== this.#more) node.remove();
353
363
  }
354
- for (let checkbox of this.#dropdown.querySelectorAll('input[type="checkbox"]')) {
364
+ for (const checkbox of this.#dropdown.querySelectorAll('input[type="checkbox"]')) {
355
365
  checkbox.checked = false;
356
366
  }
357
367
  // Отметка выбора снимается вместе с чекбоксами: прежде `aria-selected` оставался
358
368
  // «true» и список после сброса формы показывал прошлый выбор
359
- for (let option of this.#dropdown.querySelectorAll(".multi_combobox_option")) {
369
+ for (const option of this.#dropdown.querySelectorAll(".multi_combobox_option")) {
360
370
  option.setAttribute("aria-selected", "false");
361
371
  }
362
372
  this.#scheduleOverflow();
363
373
  }
364
374
  #setDropdownDirection() {
365
- const placement = dropdownPlacement(this.#dropdown, this.#MultiComboBox_second);
375
+ const placement = dropdownPlacement(this.#dropdown, this.#MultiComboBoxSecond);
366
376
  // Зазор до поля держит CSS (`top: calc(100% + 4px)`), как у остальных списков:
367
377
  // прежде отступ задавался числом в пикселях под высоту прежнего поля 35 px
368
378
  this.#dropdown.style.top = placement.up ? "auto" : "";
@@ -379,7 +389,7 @@ class MultiComboBox {
379
389
  * не «съедает» место для набора.
380
390
  */
381
391
  #syncOverflow() {
382
- const options = this.#MultiComboBox_options;
392
+ const options = this.#MultiComboBoxOptions;
383
393
  const chips = [...options.querySelectorAll("multicombobox_option_added_main")];
384
394
  const available = options.clientWidth;
385
395
  for (const chip of chips) chip.hidden = false;
@@ -408,21 +418,21 @@ class MultiComboBox {
408
418
 
409
419
  /** Пересчёт счётчика после текущего кадра: к этому моменту разметка значений уже уложена */
410
420
  #scheduleOverflow() {
411
- if (this.#overflow_frame !== undefined) return;
412
- this.#overflow_frame = requestAnimationFrame(() => {
413
- this.#overflow_frame = undefined;
421
+ if (this.#overflowFrame !== undefined) return;
422
+ this.#overflowFrame = requestAnimationFrame(() => {
423
+ this.#overflowFrame = undefined;
414
424
  this.#syncOverflow();
415
425
  });
416
426
  }
417
427
  set() {
418
- return this.#MultiComboBox_main;
428
+ return this.#MultiComboBoxMain;
419
429
  }
420
430
  }
421
431
 
422
432
  function setOptionDisplay(element) {
423
433
  // Скрытая фильтром секция возвращается снятием инлайнового `display`:
424
434
  // базовый вид строки (флекс) задаёт CSS
425
- for (let option of element.childNodes) {
435
+ for (const option of element.childNodes) {
426
436
  option.style.removeProperty("display");
427
437
  }
428
438
  }
@@ -4,12 +4,12 @@ chui_multicombobox {
4
4
  карточку. Токены переопределены у корня поля, поэтому действуют только внутри него
5
5
  (тот же приём у полосы меню-бара). */
6
6
  --control_padding: var(--control_padding_sm);
7
- --main_padding: var(--main_padding_sm);
7
+ --block_padding: var(--block_padding_sm);
8
8
  position: relative;
9
9
  display: flex;
10
10
  flex-direction: column;
11
11
  height: max-content;
12
- margin: var(--margin);
12
+ margin: var(--block_margin);
13
13
  width: var(--control_width);
14
14
  }
15
15
 
@@ -23,7 +23,7 @@ multicombobox {
23
23
  min-height: var(--control_height);
24
24
  height: max-content;
25
25
  width: -webkit-fill-available;
26
- border-radius: var(--border_radius);
26
+ border-radius: var(--radius_sm);
27
27
  padding: 0;
28
28
  font-size: var(--font_default_size);
29
29
  background: var(--element_background);
@@ -67,7 +67,7 @@ multicombobox_dropdown {
67
67
  position: absolute;
68
68
  display: none;
69
69
  height: max-content;
70
- border-radius: var(--border_radius);
70
+ border-radius: var(--radius_sm);
71
71
  /* Зазор под полем — как у остальных списков (см. chui_chips/styles.css): прежде
72
72
  отступ задавался числом в JS и был зашит под высоту прежнего поля 35 px */
73
73
  top: calc(100% + 4px);
@@ -89,7 +89,7 @@ multicombobox_dropdown {
89
89
  height: max-content;
90
90
  width: max-content;
91
91
  /* Только нижний отступ: боковой сдвигал подпись вправо от коробки поля */
92
- margin: 0 0 var(--margin);
92
+ margin: 0 0 var(--block_margin);
93
93
  font-size: var(--font_labels_size);
94
94
  font-weight: 500;
95
95
  color: var(--text_color);
@@ -97,7 +97,7 @@ multicombobox_dropdown {
97
97
 
98
98
  multicombo_button_open {
99
99
  cursor: pointer;
100
- padding: var(--main_padding);
100
+ padding: var(--block_padding);
101
101
  color: var(--blue_prime_background);
102
102
  justify-content: center;
103
103
  align-items: center;
@@ -121,13 +121,19 @@ multicombo_button_open {
121
121
  .multi_combobox_option {
122
122
  display: flex;
123
123
  flex-direction: row;
124
+ /* Строка занимает всю ширину списка: секция держит `align-items: flex-start` (иначе
125
+ подпись группы растягивалась и наследовала центрирование, см. `.multi_combobox_section`),
126
+ а от этого выравнивания строка сжималась до содержимого — подсветка под курсором шла
127
+ прямоугольником вокруг флажка, а не строкой (замер: 53px против 288px у списка).
128
+ У Select и ComboBox строка растянута — здесь то же поведение */
129
+ align-self: stretch;
124
130
  /* Строка не сжимается при ограниченной высоте слоя (см. `selectbox_option`) */
125
131
  flex: none;
126
132
  /* Тот же шаг строки, что у опций Select и ComboBox (замер: 27px), — прежде строка была
127
133
  33px из-за отступов чекбокса, и список читался рыхлым против соседних компонентов */
128
134
  padding: var(--control_padding) 6px;
129
135
  gap: 10px;
130
- border-radius: var(--border_radius);
136
+ border-radius: var(--radius_sm);
131
137
  color: var(--text_color);
132
138
  /* Подпись и чекбокс идут от левого края: центрирование строки было лишним */
133
139
  align-items: center;
@@ -170,7 +176,7 @@ multicombo_button_open {
170
176
  cursor: not-allowed;
171
177
  height: max-content;
172
178
  width: max-content;
173
- margin: 0 0 var(--margin);
179
+ margin: 0 0 var(--block_margin);
174
180
  font-size: var(--font_labels_size);
175
181
  font-weight: 500;
176
182
  color: var(--text_color_disabled);