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.
- package/CHANGELOG.md +536 -0
- package/framework/appLayout/default/chui_app_layout.js +361 -303
- package/framework/appLayout/default/global_style.css +243 -89
- package/framework/appLayout/default/main_theme_style.css +188 -101
- package/framework/components/chui_accordion/accordion.js +17 -17
- package/framework/components/chui_accordion/styles.css +7 -7
- package/framework/components/chui_action_sheet/action_sheet.js +35 -32
- package/framework/components/chui_action_sheet/styles.css +10 -4
- package/framework/components/chui_actions_bar/actions_bar.js +338 -0
- package/framework/components/chui_actions_bar/styles.css +139 -0
- package/framework/components/chui_affix/affix.js +4 -4
- package/framework/components/chui_affix/styles.css +5 -0
- package/framework/components/chui_alert/alert.js +11 -5
- package/framework/components/chui_alert/styles.css +7 -0
- package/framework/components/chui_avatar/avatar.js +13 -13
- package/framework/components/chui_avatar/styles.css +1 -1
- package/framework/components/chui_avatar_group/avatar_group.js +4 -4
- package/framework/components/chui_avatar_group/styles.css +1 -1
- package/framework/components/chui_backtop/backtop.js +25 -2
- package/framework/components/chui_backtop/styles.css +21 -0
- package/framework/components/chui_badge/badge.js +15 -15
- package/framework/components/chui_badge/styles.css +6 -6
- package/framework/components/chui_banner/banner.js +222 -0
- package/framework/components/chui_banner/styles.css +170 -0
- package/framework/components/chui_breadcrumb/styles.css +1 -1
- package/framework/components/chui_button/button.js +24 -28
- package/framework/components/chui_button/styles.css +5 -5
- package/framework/components/chui_calendar/calendar.js +6 -6
- package/framework/components/chui_card/card.js +14 -14
- package/framework/components/chui_card_scroll/card_scroll.js +169 -0
- package/framework/components/chui_card_scroll/styles.css +86 -0
- package/framework/components/chui_chat/chat.js +73 -51
- package/framework/components/chui_chat/styles.css +18 -7
- package/framework/components/chui_clipboard_history/clipboard_history.js +25 -20
- package/framework/components/chui_clipboard_history/styles.css +10 -8
- package/framework/components/chui_code/code.js +8 -8
- package/framework/components/chui_code/styles.css +2 -2
- package/framework/components/chui_code_editor/code_editor.js +26 -26
- package/framework/components/chui_code_editor/styles.css +3 -3
- package/framework/components/chui_command_palette/command_palette.js +29 -29
- package/framework/components/chui_command_palette/styles.css +5 -5
- package/framework/components/chui_console/console.js +9 -9
- package/framework/components/chui_console/styles.css +5 -2
- package/framework/components/chui_content_block/content_block.js +2 -2
- package/framework/components/chui_context_menu/context_menu.js +162 -54
- package/framework/components/chui_context_menu/styles.css +82 -8
- package/framework/components/chui_custom_element/custom_element.js +11 -11
- package/framework/components/chui_data_grid/data_grid.js +268 -268
- package/framework/components/chui_data_grid/styles.css +14 -14
- package/framework/components/chui_descriptions/styles.css +1 -1
- package/framework/components/chui_details/details.js +12 -12
- package/framework/components/chui_details/styles.css +7 -7
- package/framework/components/chui_diff_viewer/diff_viewer.js +88 -88
- package/framework/components/chui_diff_viewer/styles.css +9 -9
- package/framework/components/chui_divider/divider.js +6 -6
- package/framework/components/chui_divider/styles.css +2 -2
- package/framework/components/chui_drawer/drawer.js +37 -14
- package/framework/components/chui_drawer/styles.css +18 -4
- package/framework/components/chui_drop_zone/drop_zone.js +6 -6
- package/framework/components/chui_drop_zone/styles.css +10 -6
- package/framework/components/chui_fieldset/fieldset.js +6 -6
- package/framework/components/chui_fieldset/styles.css +5 -5
- package/framework/components/chui_file_explorer/file_explorer.js +115 -115
- package/framework/components/chui_file_explorer/styles.css +6 -6
- package/framework/components/chui_form/form.js +11 -11
- package/framework/components/chui_gantt/gantt.js +41 -41
- package/framework/components/chui_gantt/styles.css +5 -5
- package/framework/components/chui_graphs/graphs.js +82 -46
- package/framework/components/chui_graphs/styles.css +26 -5
- package/framework/components/chui_hero/hero.js +63 -20
- package/framework/components/chui_hero/styles.css +176 -7
- package/framework/components/chui_html_block/html_block.js +5 -5
- package/framework/components/chui_html_block/styles.css +1 -1
- package/framework/components/chui_hx/styles.css +2 -2
- package/framework/components/chui_icons/icons.js +7 -7
- package/framework/components/chui_icons/styles.css +2 -1
- package/framework/components/chui_inputs/chui_check_box/styles.css +12 -3
- package/framework/components/chui_inputs/chui_chips/chips.js +92 -31
- package/framework/components/chui_inputs/chui_chips/styles.css +28 -5
- package/framework/components/chui_inputs/chui_color_picker/color_picker.js +20 -15
- package/framework/components/chui_inputs/chui_color_picker/styles.css +7 -7
- package/framework/components/chui_inputs/chui_combo_box/combo_box.js +58 -58
- package/framework/components/chui_inputs/chui_combo_box/styles.css +9 -9
- package/framework/components/chui_inputs/chui_date/date.js +93 -95
- package/framework/components/chui_inputs/chui_date/styles.css +8 -8
- package/framework/components/chui_inputs/chui_date_range/date_range.js +22 -22
- package/framework/components/chui_inputs/chui_date_range/styles.css +3 -3
- package/framework/components/chui_inputs/chui_datetime/datetime.js +12 -12
- package/framework/components/chui_inputs/chui_datetime/styles.css +3 -3
- package/framework/components/chui_inputs/chui_email/email.js +10 -10
- package/framework/components/chui_inputs/chui_email/styles.css +6 -6
- package/framework/components/chui_inputs/chui_file/file.js +8 -8
- package/framework/components/chui_inputs/chui_file/styles.css +12 -9
- package/framework/components/chui_inputs/chui_hotkey/hotkey.js +39 -39
- package/framework/components/chui_inputs/chui_hotkey/styles.css +6 -6
- package/framework/components/chui_inputs/chui_masked/masked.js +44 -44
- package/framework/components/chui_inputs/chui_masked/styles.css +5 -5
- package/framework/components/chui_inputs/chui_mention/mention.js +13 -13
- package/framework/components/chui_inputs/chui_mention/styles.css +14 -8
- package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +147 -137
- package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +14 -8
- package/framework/components/chui_inputs/chui_number/number.js +42 -45
- package/framework/components/chui_inputs/chui_number/styles.css +6 -6
- package/framework/components/chui_inputs/chui_otp/otp.js +32 -32
- package/framework/components/chui_inputs/chui_otp/styles.css +5 -5
- package/framework/components/chui_inputs/chui_password/password.js +30 -36
- package/framework/components/chui_inputs/chui_password/styles.css +7 -7
- package/framework/components/chui_inputs/chui_radio_button/styles.css +2 -2
- package/framework/components/chui_inputs/chui_rating/rating.js +28 -28
- package/framework/components/chui_inputs/chui_rating/styles.css +3 -3
- package/framework/components/chui_inputs/chui_select_box/select_box.js +54 -54
- package/framework/components/chui_inputs/chui_select_box/styles.css +10 -10
- package/framework/components/chui_inputs/chui_slider/slider.js +14 -14
- package/framework/components/chui_inputs/chui_slider/styles.css +5 -4
- package/framework/components/chui_inputs/chui_text/styles.css +7 -7
- package/framework/components/chui_inputs/chui_text/text.js +13 -17
- package/framework/components/chui_inputs/chui_text_area/styles.css +8 -8
- package/framework/components/chui_inputs/chui_text_area/text_area.js +23 -23
- package/framework/components/chui_inputs/chui_time/styles.css +13 -17
- package/framework/components/chui_inputs/chui_time/time.js +35 -24
- package/framework/components/chui_inputs/chui_toggle/styles.css +10 -3
- package/framework/components/chui_inputs/chui_toggle/toggle.js +16 -16
- package/framework/components/chui_json_editor/json_editor.js +87 -87
- package/framework/components/chui_json_editor/styles.css +5 -5
- package/framework/components/chui_json_viewer/json_viewer.js +80 -80
- package/framework/components/chui_json_viewer/styles.css +6 -6
- package/framework/components/chui_kanban/kanban.js +27 -27
- package/framework/components/chui_kanban/styles.css +8 -4
- package/framework/components/chui_kbd/styles.css +1 -1
- package/framework/components/chui_label/label.js +17 -17
- package/framework/components/chui_label/styles.css +1 -1
- package/framework/components/chui_link/link.js +9 -9
- package/framework/components/chui_link/styles.css +11 -4
- package/framework/components/chui_list/list.js +11 -11
- package/framework/components/chui_list/styles.css +2 -2
- package/framework/components/chui_markdown_editor/markdown_editor.js +66 -66
- package/framework/components/chui_markdown_editor/styles.css +5 -5
- package/framework/components/chui_media/audio.js +240 -246
- package/framework/components/chui_media/audio_styles.css +41 -23
- package/framework/components/chui_media/image.js +49 -46
- package/framework/components/chui_media/image_compare.js +35 -35
- package/framework/components/chui_media/image_compare_styles.css +5 -5
- package/framework/components/chui_media/image_styles.css +1 -1
- package/framework/components/chui_media/video.js +148 -148
- package/framework/components/chui_media/video_styles.css +27 -11
- package/framework/components/chui_menu_bar/menu_bar.js +54 -54
- package/framework/components/chui_menu_bar/styles.css +10 -10
- package/framework/components/chui_message_bar/message_bar.js +551 -0
- package/framework/components/chui_message_bar/styles.css +248 -0
- package/framework/components/chui_modal/modal.js +37 -13
- package/framework/components/chui_notification/notification.js +76 -54
- package/framework/components/chui_notification/notification_download.js +26 -81
- package/framework/components/chui_notification/notification_download_card.js +115 -0
- package/framework/components/chui_notification/notification_download_progress.css +2 -2
- package/framework/components/chui_notification/notification_download_progress.js +70 -108
- package/framework/components/chui_notification/notification_update.js +31 -31
- package/framework/components/chui_notification/status_plate.css +3 -3
- package/framework/components/chui_notification/styles.css +6 -1
- package/framework/components/chui_notification/styles_download.css +1 -1
- package/framework/components/chui_notification/styles_update.css +2 -2
- package/framework/components/chui_org_chart/org_chart.js +29 -29
- package/framework/components/chui_org_chart/styles.css +2 -2
- package/framework/components/chui_pagination/pagination.js +3 -3
- package/framework/components/chui_pagination/styles.css +1 -1
- package/framework/components/chui_paragraph/styles.css +2 -2
- package/framework/components/chui_popover/popover.js +29 -23
- package/framework/components/chui_popover/styles.css +1 -1
- package/framework/components/chui_popups/popups.js +124 -124
- package/framework/components/chui_popups/styles.css +5 -5
- package/framework/components/chui_print_button/print_button.js +15 -10
- package/framework/components/chui_progress_bar/progress_bar.js +34 -12
- package/framework/components/chui_progress_bar/styles.css +4 -4
- package/framework/components/chui_progress_ring/progress_ring.js +15 -15
- package/framework/components/chui_progress_ring/styles.css +1 -1
- package/framework/components/chui_qrcode/qrcode.js +12 -12
- package/framework/components/chui_query_builder/query_builder.js +46 -46
- package/framework/components/chui_query_builder/styles.css +4 -4
- package/framework/components/chui_radio_group/styles.css +1 -1
- package/framework/components/chui_result/result.js +15 -15
- package/framework/components/chui_result/styles.css +3 -3
- package/framework/components/chui_scheduler/scheduler.js +74 -74
- package/framework/components/chui_scheduler/styles.css +5 -5
- package/framework/components/chui_screen_spinner/screen_spinner.js +167 -0
- package/framework/components/chui_screen_spinner/styles.css +49 -0
- package/framework/components/chui_segmented_control/segmented_control.js +63 -6
- package/framework/components/chui_segmented_control/styles.css +32 -6
- package/framework/components/chui_settings/settings.js +45 -46
- package/framework/components/chui_settings/styles.css +4 -4
- package/framework/components/chui_shortcut_help/shortcut_help.js +32 -34
- package/framework/components/chui_sidebar_nav/sidebar_nav.js +98 -29
- package/framework/components/chui_sidebar_nav/styles.css +9 -3
- package/framework/components/chui_slideshow/slideshow.js +85 -85
- package/framework/components/chui_slideshow/styles.css +6 -6
- package/framework/components/chui_spinner/spinner.js +10 -10
- package/framework/components/chui_split_button/split_button.js +30 -12
- package/framework/components/chui_split_button/styles.css +21 -5
- package/framework/components/chui_splitter/splitter.js +11 -11
- package/framework/components/chui_splitter/styles.css +2 -2
- package/framework/components/chui_statistic/statistic.js +47 -47
- package/framework/components/chui_status_bar/styles.css +2 -2
- package/framework/components/chui_stepper/stepper.js +202 -31
- package/framework/components/chui_stepper/styles.css +79 -14
- package/framework/components/chui_sticky_bar/sticky_bar.js +44 -13
- package/framework/components/chui_sticky_bar/styles.css +10 -8
- package/framework/components/chui_tabs/chui_tabs.js +74 -26
- package/framework/components/chui_tabs/styles.css +40 -12
- package/framework/components/chui_text_editor/styles.css +7 -7
- package/framework/components/chui_text_editor/text_editor.js +56 -56
- package/framework/components/chui_text_editor/text_editor_panel.js +173 -174
- package/framework/components/chui_theme_toggle/theme_toggle.js +21 -5
- package/framework/components/chui_timeline/styles.css +3 -1
- package/framework/components/chui_toast_queue/styles.css +11 -11
- package/framework/components/chui_toast_queue/toast_queue.js +30 -27
- package/framework/components/chui_toolbar/styles.css +2 -2
- package/framework/components/chui_tooltip/styles.css +2 -2
- package/framework/components/chui_tooltip/tooltip.js +3 -3
- package/framework/components/chui_tour/styles.css +8 -8
- package/framework/components/chui_tour/tour.js +72 -72
- package/framework/components/chui_transfer/styles.css +6 -6
- package/framework/components/chui_transfer/transfer.js +93 -106
- package/framework/components/chui_tree_table/styles.css +4 -4
- package/framework/components/chui_tree_table/tree_table.js +45 -45
- package/framework/components/chui_tree_view/styles.css +10 -8
- package/framework/components/chui_tree_view/tree_view.js +185 -183
- package/framework/components/chui_user_bar/styles.css +145 -0
- package/framework/components/chui_user_bar/user_bar.js +402 -0
- package/framework/components/chui_user_list_bar/styles.css +173 -0
- package/framework/components/chui_user_list_bar/user_list_bar.js +485 -0
- package/framework/components/chui_watermark/watermark.js +17 -17
- package/framework/components/chui_webview/webview.js +9 -9
- package/framework/components/chui_write_bar/styles.css +172 -0
- package/framework/components/chui_write_bar/write_bar.js +320 -0
- package/framework/main_window.js +1234 -0
- package/framework/modules/chui_a11y/chui_a11y.js +78 -79
- package/framework/modules/chui_animations/animations.js +77 -15
- package/framework/modules/chui_animations/motion.js +120 -0
- package/framework/modules/chui_animations/styles.css +36 -3
- package/framework/modules/chui_functions.js +31 -27
- package/framework/modules/chui_highlight/styles.css +13 -10
- package/framework/modules/chui_i18n/chui_i18n.js +3 -3
- package/framework/modules/chui_i18n/locales/feedback.js +62 -0
- package/framework/modules/chui_i18n/locales/navigation.js +4 -0
- package/framework/modules/chui_json/chui_json.js +2 -2
- package/framework/modules/chui_logger/chui_logger.js +23 -8
- package/framework/modules/chui_page/page.js +10 -10
- package/framework/modules/chui_palette/palette.js +61 -0
- package/framework/modules/chui_qr/chui_qr.js +23 -23
- package/framework/modules/chui_scrollbar/chui_scrollbar.js +45 -45
- package/framework/modules/chui_scrollbar/styles.css +3 -3
- package/framework/modules/chui_services/chui_services.js +8 -8
- package/framework/modules/chui_services/desktop.js +77 -71
- package/framework/modules/chui_sortable/chui_sortable.js +17 -17
- package/framework/modules/chui_validate/chui_validate.js +3 -3
- package/framework/tray_bar/chui_menu_items.js +2 -2
- package/index.d.ts +266 -34
- package/index.js +20 -1168
- package/package.json +6 -4
- 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
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
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
|
-
#
|
|
18
|
-
#
|
|
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
|
-
#
|
|
22
|
-
#
|
|
21
|
+
#overflowFrame = undefined;
|
|
22
|
+
#overflowObserver = undefined;
|
|
23
23
|
#a11y = undefined;
|
|
24
24
|
// Слушатель окна храним полем, чтобы можно было снять в destroy()
|
|
25
|
-
#
|
|
26
|
-
if (!this.#
|
|
25
|
+
#windowClickEvent = (event) => {
|
|
26
|
+
if (!this.#MultiComboBoxSecond.contains(event.target)) this.#closeDropdown();
|
|
27
27
|
};
|
|
28
|
-
#
|
|
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.#
|
|
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.#
|
|
47
|
-
this.#
|
|
46
|
+
this.#label.setAttribute("for", this.#idCb);
|
|
47
|
+
this.#MultiComboBoxMain.appendChild(this.#label);
|
|
48
48
|
}
|
|
49
49
|
if (options.optionsLen !== undefined) {
|
|
50
|
-
this.#
|
|
50
|
+
this.#dropdownHeight = OPTION_ROW_HEIGHT * options.optionsLen + "px";
|
|
51
51
|
}
|
|
52
|
-
this.#dropdown.style.height = this.#
|
|
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.#
|
|
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.#
|
|
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.#
|
|
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.#
|
|
74
|
-
this.#
|
|
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.#
|
|
79
|
+
this.#MultiComboBoxOptions.appendChild(this.#more);
|
|
80
80
|
// Ширину строки задаёт вёрстка вокруг: о смене размера сообщает наблюдатель
|
|
81
81
|
if (typeof ResizeObserver === "function") {
|
|
82
|
-
this.#
|
|
83
|
-
this.#
|
|
82
|
+
this.#overflowObserver = new ResizeObserver(() => this.#scheduleOverflow());
|
|
83
|
+
this.#overflowObserver.observe(this.#MultiComboBoxOptions);
|
|
84
84
|
}
|
|
85
|
-
this.#
|
|
86
|
-
this.#
|
|
85
|
+
this.#MultiComboBoxSecond.appendChild(this.#buttonOpen);
|
|
86
|
+
this.#MultiComboBoxSecond.appendChild(this.#dropdown);
|
|
87
87
|
//LISTENERS
|
|
88
88
|
this.#input.addEventListener("focus", () => {
|
|
89
|
-
this.#
|
|
90
|
-
this.#dropdown.style.height = this.#
|
|
89
|
+
this.#buttonOpen.style.transform = "rotate(180deg)";
|
|
90
|
+
this.#dropdown.style.height = this.#dropdownHeight;
|
|
91
91
|
});
|
|
92
92
|
this.#input.addEventListener("blur", () => {
|
|
93
|
-
this.#
|
|
94
|
-
this.#dropdown.style.height = this.#
|
|
93
|
+
this.#buttonOpen.style.transform = "rotate(0deg)";
|
|
94
|
+
this.#dropdown.style.height = this.#dropdownHeight;
|
|
95
95
|
});
|
|
96
|
-
this.#
|
|
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.#
|
|
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).
|
|
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.#
|
|
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.#
|
|
136
|
+
window.removeEventListener("click", this.#windowClickEvent);
|
|
137
137
|
}
|
|
138
|
-
/** Полное удаление: снять слушатели
|
|
138
|
+
/** Полное удаление: снять слушатели окна, наблюдатель за строкой и клавиатурный слой */
|
|
139
139
|
destroy() {
|
|
140
|
-
window.removeEventListener("click", this.#
|
|
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.#
|
|
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 (
|
|
161
|
+
for (const sect of options) {
|
|
152
162
|
const section = document.createElement(`section`);
|
|
153
|
-
const
|
|
163
|
+
const sectionTitle = document.createElement("label");
|
|
154
164
|
section.className = "multi_combobox_section";
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
section.appendChild(
|
|
165
|
+
sectionTitle.className = "multi_combobox_section_title";
|
|
166
|
+
sectionTitle.innerText = sect.title;
|
|
167
|
+
section.appendChild(sectionTitle);
|
|
158
168
|
|
|
159
|
-
for (
|
|
160
|
-
const
|
|
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
|
|
165
|
-
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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(
|
|
176
|
-
option.appendChild(
|
|
177
|
-
option.appendChild(
|
|
185
|
+
option.appendChild(checkboxInput);
|
|
186
|
+
option.appendChild(checkboxInputCheck);
|
|
187
|
+
option.appendChild(checkboxInputLabel);
|
|
178
188
|
section.appendChild(option);
|
|
179
189
|
//
|
|
180
|
-
|
|
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
|
|
195
|
+
const optionChip = document.createElement("multicombobox_option_added_main");
|
|
186
196
|
// Метка и чекбокс — два узла: id у каждого свой, иначе в документе два одинаковых id
|
|
187
|
-
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
this.#
|
|
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:
|
|
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(
|
|
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.#
|
|
223
|
+
this.#MultiComboBoxMain.dispatchEvent(eventAwesome);
|
|
214
224
|
});
|
|
215
225
|
}
|
|
216
226
|
this.#dropdown.appendChild(section);
|
|
217
227
|
}
|
|
218
|
-
this.#input.removeEventListener("input", this.#
|
|
219
|
-
this.#input.addEventListener("input", this.#
|
|
228
|
+
this.#input.removeEventListener("input", this.#filterOptionsEvent);
|
|
229
|
+
this.#input.addEventListener("input", this.#filterSectionsEvent);
|
|
220
230
|
}
|
|
221
231
|
addOptions(...options) {
|
|
222
|
-
for (
|
|
232
|
+
for (const opt of options) {
|
|
223
233
|
// Свой id на каждый вариант: одинаковые подписи больше не дают дубликатов id в документе
|
|
224
|
-
const
|
|
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
|
|
229
|
-
|
|
230
|
-
const
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
const
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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(
|
|
240
|
-
option.appendChild(
|
|
241
|
-
option.appendChild(
|
|
249
|
+
option.appendChild(checkboxInput);
|
|
250
|
+
option.appendChild(checkboxInputCheck);
|
|
251
|
+
option.appendChild(checkboxInputLabel);
|
|
242
252
|
//
|
|
243
|
-
|
|
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
|
|
248
|
-
|
|
249
|
-
const
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
const
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
267
|
+
optionChipRemove.addEventListener("click", () => checkboxInput.click());
|
|
258
268
|
//
|
|
259
269
|
if (evt.target.checked) {
|
|
260
|
-
this.#
|
|
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(
|
|
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.#
|
|
285
|
+
this.#MultiComboBoxMain.dispatchEvent(eventAwesome);
|
|
276
286
|
});
|
|
277
287
|
this.#dropdown.appendChild(option);
|
|
278
288
|
}
|
|
279
|
-
this.#input.removeEventListener("input", this.#
|
|
280
|
-
this.#input.addEventListener("input", this.#
|
|
289
|
+
this.#input.removeEventListener("input", this.#filterSectionsEvent);
|
|
290
|
+
this.#input.addEventListener("input", this.#filterOptionsEvent);
|
|
281
291
|
}
|
|
282
|
-
#
|
|
283
|
-
|
|
284
|
-
for (
|
|
285
|
-
for (
|
|
286
|
-
|
|
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.#
|
|
303
|
+
dropdown.style.height = this.#dropdownHeight;
|
|
294
304
|
}
|
|
295
305
|
}
|
|
296
306
|
}
|
|
297
307
|
}
|
|
298
308
|
};
|
|
299
|
-
#
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
for (
|
|
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
|
-
|
|
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.#
|
|
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.#
|
|
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.#
|
|
328
|
-
this.#
|
|
337
|
+
this.#buttonOpen.remove();
|
|
338
|
+
this.#MultiComboBoxSecond.appendChild(this.#buttonOpenDisabled);
|
|
329
339
|
} else {
|
|
330
|
-
this.#
|
|
340
|
+
this.#MultiComboBoxSecond.classList.remove("multicombobox_disabled");
|
|
331
341
|
this.#input.className = "multicombobox_input";
|
|
332
342
|
this.#label.className = "multicombobox_label";
|
|
333
|
-
this.#
|
|
334
|
-
this.#
|
|
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
|
|
340
|
-
for (
|
|
341
|
-
if (node.id ===
|
|
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 (
|
|
361
|
+
for (const node of [...this.#MultiComboBoxOptions.childNodes]) {
|
|
352
362
|
if (node !== this.#input && node !== this.#more) node.remove();
|
|
353
363
|
}
|
|
354
|
-
for (
|
|
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 (
|
|
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.#
|
|
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.#
|
|
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.#
|
|
412
|
-
this.#
|
|
413
|
-
this.#
|
|
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.#
|
|
428
|
+
return this.#MultiComboBoxMain;
|
|
419
429
|
}
|
|
420
430
|
}
|
|
421
431
|
|
|
422
432
|
function setOptionDisplay(element) {
|
|
423
433
|
// Скрытая фильтром секция возвращается снятием инлайнового `display`:
|
|
424
434
|
// базовый вид строки (флекс) задаёт CSS
|
|
425
|
-
for (
|
|
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
|
-
--
|
|
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(--
|
|
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(--
|
|
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(--
|
|
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(--
|
|
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(--
|
|
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(--
|
|
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(--
|
|
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);
|