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
|
@@ -10,13 +10,13 @@ class MenuBar {
|
|
|
10
10
|
// Панели выпадающих списков лежат в body, а не в полосе (см. MenuBarDropDown), поэтому
|
|
11
11
|
// снятие полосы обязано убирать и их: экземпляр находится по узлу полосы
|
|
12
12
|
static #instances = new WeakMap();
|
|
13
|
-
#
|
|
13
|
+
#chuiMenuBarMain = document.createElement("chui_menu_bar_main");
|
|
14
14
|
#dropdowns = [];
|
|
15
15
|
constructor(options = { test: Boolean() }) {
|
|
16
16
|
require("../../modules/chui_functions").setStyles(__dirname + "/styles.css", "chUiJS_MenuBar");
|
|
17
|
-
MenuBar.#instances.set(this.#
|
|
18
|
-
if (options.test !== undefined) this.#
|
|
19
|
-
this.#
|
|
17
|
+
MenuBar.#instances.set(this.#chuiMenuBarMain, this);
|
|
18
|
+
if (options.test !== undefined) this.#chuiMenuBarMain.setAttribute("test", options.test);
|
|
19
|
+
this.#chuiMenuBarMain.addEventListener("wheel", this.#wheelEvent, { passive: true });
|
|
20
20
|
}
|
|
21
21
|
/*
|
|
22
22
|
* Колесо мыши прокручивает полосу вбок.
|
|
@@ -26,16 +26,16 @@ class MenuBar {
|
|
|
26
26
|
* (для этого нужен сдвиг или тачпад), поэтому переводим дельту сами — иначе до правых
|
|
27
27
|
* пунктов полосы мышью было бы не добраться.
|
|
28
28
|
*/
|
|
29
|
-
#
|
|
30
|
-
const bar = this.#
|
|
29
|
+
#wheelEvent = (event) => {
|
|
30
|
+
const bar = this.#chuiMenuBarMain;
|
|
31
31
|
if (bar.scrollWidth <= bar.clientWidth) return;
|
|
32
32
|
bar.scrollLeft += event.deltaY;
|
|
33
33
|
};
|
|
34
34
|
addMenuItems(...components) {
|
|
35
|
-
for (
|
|
36
|
-
|
|
35
|
+
for (const component of components) {
|
|
36
|
+
const element = component.set();
|
|
37
37
|
new Animation(element).fadeIn();
|
|
38
|
-
this.#
|
|
38
|
+
this.#chuiMenuBarMain.appendChild(element);
|
|
39
39
|
if (component instanceof MenuBarDropDown) this.#dropdowns.push(component);
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -43,8 +43,8 @@ class MenuBar {
|
|
|
43
43
|
destroy() {
|
|
44
44
|
for (const dropdown of this.#dropdowns) dropdown.unmount();
|
|
45
45
|
this.#dropdowns = [];
|
|
46
|
-
this.#
|
|
47
|
-
MenuBar.#instances.delete(this.#
|
|
46
|
+
this.#chuiMenuBarMain.removeEventListener("wheel", this.#wheelEvent);
|
|
47
|
+
MenuBar.#instances.delete(this.#chuiMenuBarMain);
|
|
48
48
|
return this;
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
@@ -57,7 +57,7 @@ class MenuBar {
|
|
|
57
57
|
return node;
|
|
58
58
|
}
|
|
59
59
|
set() {
|
|
60
|
-
return this.#
|
|
60
|
+
return this.#chuiMenuBarMain;
|
|
61
61
|
}
|
|
62
62
|
static DROPDOWN(options = { title: String(), items: [] }) {
|
|
63
63
|
return new MenuBarDropDown(options);
|
|
@@ -65,38 +65,38 @@ class MenuBar {
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
class MenuBarDropDown {
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
-
#
|
|
71
|
-
#
|
|
68
|
+
#mbDdMain = document.createElement("menu_bar_drop_down_main");
|
|
69
|
+
#mbDdButton = document.createElement("menu_bar_drop_down_button");
|
|
70
|
+
#mbDdDropdown = document.createElement("menu_bar_dropdown");
|
|
71
|
+
#isOpen = false;
|
|
72
72
|
#keyboard = undefined;
|
|
73
73
|
constructor(options = { title: String(), items: [] }) {
|
|
74
74
|
// Панель собирают и отдельно от полосы (`MenuBar.DROPDOWN`) — свои стили нужны здесь же
|
|
75
75
|
require("../../modules/chui_functions").setStyles(__dirname + "/styles.css", "chUiJS_MenuBar");
|
|
76
76
|
// Пустой заголовок остаётся пустым: подстановка заготовки опции рисовала слово «undefined»
|
|
77
|
-
this.#
|
|
78
|
-
this.#
|
|
79
|
-
this.#
|
|
80
|
-
for (
|
|
81
|
-
this.#
|
|
77
|
+
this.#mbDdButton.innerText = options.title === undefined || options.title === null ? "" : options.title;
|
|
78
|
+
this.#mbDdDropdown.id = require("randomstring").generate();
|
|
79
|
+
this.#mbDdMain.appendChild(this.#mbDdButton);
|
|
80
|
+
for (const item of Array.isArray(options.items) ? options.items : [])
|
|
81
|
+
this.#mbDdDropdown.appendChild(item.set());
|
|
82
82
|
// Панель лежит в document.body, а не рядом с кнопкой: шапка — сама с backdrop-filter,
|
|
83
83
|
// а элемент с backdrop-filter становится «backdrop root» — вложенная панель тогда не
|
|
84
84
|
// блюрит содержимое под собой (замер: детальность 33.4 и с блюром, и без него; вне шапки
|
|
85
85
|
// 20.1 против 31.5). Там же, в body, панель свободна и от контекста наложения шапки:
|
|
86
86
|
// с z-index 1 внутри шапки её перекрывали выдвижные слои (app_menu, ящик уведомлений).
|
|
87
|
-
document.body.appendChild(this.#
|
|
87
|
+
document.body.appendChild(this.#mbDdDropdown);
|
|
88
88
|
|
|
89
89
|
// Клавиатура и aria: кнопка открывает меню, стрелки ходят по пунктам, Escape закрывает
|
|
90
|
-
this.#keyboard = new MenuKeyboard(this.#
|
|
90
|
+
this.#keyboard = new MenuKeyboard(this.#mbDdDropdown, {
|
|
91
91
|
itemSelector: "button",
|
|
92
92
|
onEscape: () => this.#close(),
|
|
93
|
-
trigger: this.#
|
|
93
|
+
trigger: this.#mbDdButton,
|
|
94
94
|
});
|
|
95
|
-
makeKeyboardButton(this.#
|
|
95
|
+
makeKeyboardButton(this.#mbDdButton);
|
|
96
96
|
// Закрытый список тоже должен быть объявлен как закрытый: без этого у кнопки,
|
|
97
97
|
// которую ни разу не открывали, не было бы aria-expanded
|
|
98
98
|
this.#keyboard.setExpanded(false);
|
|
99
|
-
this.#
|
|
99
|
+
this.#mbDdButton.addEventListener("keydown", (event) => {
|
|
100
100
|
if (event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
101
101
|
event.preventDefault();
|
|
102
102
|
this.#open();
|
|
@@ -105,57 +105,57 @@ class MenuBarDropDown {
|
|
|
105
105
|
});
|
|
106
106
|
|
|
107
107
|
// Слушатели
|
|
108
|
-
this.#
|
|
109
|
-
this.#
|
|
108
|
+
this.#mbDdButton.addEventListener("click", this.#mbDdButtonClickEvent);
|
|
109
|
+
this.#mbDdDropdown.addEventListener("click", this.#mbDdDropdownClickEvent);
|
|
110
110
|
}
|
|
111
111
|
#open() {
|
|
112
|
-
this.#
|
|
112
|
+
this.#isOpen = true;
|
|
113
113
|
// Панель живёт в body: если её снимали вместе с полосой (`unmount`), возвращаем на место
|
|
114
|
-
if (document.body.contains(this.#
|
|
115
|
-
this.#
|
|
116
|
-
//
|
|
117
|
-
new Animation(this.#
|
|
114
|
+
if (document.body.contains(this.#mbDdDropdown) === false) document.body.appendChild(this.#mbDdDropdown);
|
|
115
|
+
this.#mbDdButton.classList.add(MENU_BAR_DROP_DOWN_ACTIVE_CLASS);
|
|
116
|
+
// panelIn показывает панель (display: flex), и только после этого её можно измерить
|
|
117
|
+
new Animation(this.#mbDdDropdown).panelIn();
|
|
118
118
|
this.#positionDropdown();
|
|
119
|
-
window.addEventListener("click", this.#
|
|
120
|
-
window.addEventListener("resize", this.#
|
|
119
|
+
window.addEventListener("click", this.#windowClickEvent);
|
|
120
|
+
window.addEventListener("resize", this.#positionDropdownEvent);
|
|
121
121
|
this.#keyboard.setExpanded(true);
|
|
122
122
|
}
|
|
123
123
|
#close() {
|
|
124
|
-
if (!this.#
|
|
125
|
-
this.#
|
|
126
|
-
this.#
|
|
127
|
-
new Animation(this.#
|
|
128
|
-
window.removeEventListener("click", this.#
|
|
129
|
-
window.removeEventListener("resize", this.#
|
|
124
|
+
if (!this.#isOpen) return;
|
|
125
|
+
this.#isOpen = false;
|
|
126
|
+
this.#mbDdButton.classList.remove(MENU_BAR_DROP_DOWN_ACTIVE_CLASS);
|
|
127
|
+
new Animation(this.#mbDdDropdown).fadeOut();
|
|
128
|
+
window.removeEventListener("click", this.#windowClickEvent);
|
|
129
|
+
window.removeEventListener("resize", this.#positionDropdownEvent);
|
|
130
130
|
this.#keyboard.setExpanded(false);
|
|
131
131
|
}
|
|
132
132
|
// position: fixed — координаты считаются от окна, поэтому панель пересчитывается и на resize
|
|
133
133
|
#positionDropdown() {
|
|
134
|
-
const button = this.#
|
|
135
|
-
const dropdown = this.#
|
|
134
|
+
const button = this.#mbDdButton.getBoundingClientRect();
|
|
135
|
+
const dropdown = this.#mbDdDropdown.getBoundingClientRect();
|
|
136
136
|
let left = button.left;
|
|
137
137
|
// Панель у последнего пункта меню-бара уезжала бы за правый край окна
|
|
138
138
|
if (left + dropdown.width > window.innerWidth - MENU_BAR_DROPDOWN_EDGE) {
|
|
139
139
|
left = window.innerWidth - MENU_BAR_DROPDOWN_EDGE - dropdown.width;
|
|
140
140
|
}
|
|
141
141
|
if (left < MENU_BAR_DROPDOWN_EDGE) left = MENU_BAR_DROPDOWN_EDGE;
|
|
142
|
-
this.#
|
|
143
|
-
this.#
|
|
142
|
+
this.#mbDdDropdown.style.left = `${Math.round(left)}px`;
|
|
143
|
+
this.#mbDdDropdown.style.top = `${Math.round(button.bottom + MENU_BAR_DROPDOWN_GAP)}px`;
|
|
144
144
|
}
|
|
145
|
-
#
|
|
146
|
-
if (this.#
|
|
145
|
+
#mbDdButtonClickEvent = () => {
|
|
146
|
+
if (this.#isOpen) this.#close();
|
|
147
147
|
else this.#open();
|
|
148
148
|
};
|
|
149
|
-
#
|
|
149
|
+
#mbDdDropdownClickEvent = () => {
|
|
150
150
|
this.#close();
|
|
151
151
|
};
|
|
152
152
|
// «Снаружи» — это и кнопка с обёрткой, и сама панель: она теперь не их потомок
|
|
153
|
-
#
|
|
154
|
-
if (!this.#
|
|
155
|
-
if (this.#
|
|
153
|
+
#windowClickEvent = (event) => {
|
|
154
|
+
if (!this.#isOpen) return;
|
|
155
|
+
if (this.#mbDdMain.contains(event.target) || this.#mbDdDropdown.contains(event.target)) return;
|
|
156
156
|
this.#close();
|
|
157
157
|
};
|
|
158
|
-
#
|
|
158
|
+
#positionDropdownEvent = () => this.#positionDropdown();
|
|
159
159
|
/**
|
|
160
160
|
* Убрать панель из body, не трогая клавиатурный слой: панель живёт в body, а не в полосе,
|
|
161
161
|
* и её снимает тот, кто уводит полосу из шапки. Вернувшаяся полоса вернёт панель в body
|
|
@@ -163,7 +163,7 @@ class MenuBarDropDown {
|
|
|
163
163
|
*/
|
|
164
164
|
unmount() {
|
|
165
165
|
this.#close();
|
|
166
|
-
this.#
|
|
166
|
+
this.#mbDdDropdown.remove();
|
|
167
167
|
return this;
|
|
168
168
|
}
|
|
169
169
|
/** Полное удаление: панель больше не нужна — снять клавиатуру и убрать панель из body */
|
|
@@ -173,7 +173,7 @@ class MenuBarDropDown {
|
|
|
173
173
|
return this;
|
|
174
174
|
}
|
|
175
175
|
set() {
|
|
176
|
-
return this.#
|
|
176
|
+
return this.#mbDdMain;
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
179
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
chui_menu_bar_main {
|
|
2
2
|
/* Компактный режим. В шапке меню-бар — служебная полоса, а не контрол страницы, поэтому
|
|
3
|
-
общесистемные отступы (--
|
|
3
|
+
общесистемные отступы (--block_padding 8px 13px, --control_padding 8px, --block_margin 6px)
|
|
4
4
|
уменьшены здесь локально. Токены переопределяются на корне полосы: Button пишет
|
|
5
5
|
padding: var(--control_padding) инлайном, стилями его иначе не перебить.
|
|
6
6
|
При полосе шапки 46px кнопки меню выходят ≈27px — они ниже кнопок шапки (30px),
|
|
7
7
|
но не теряются в строке. */
|
|
8
|
-
--
|
|
8
|
+
--block_padding: 5px 10px;
|
|
9
9
|
--control_padding: 5px;
|
|
10
10
|
display: flex;
|
|
11
11
|
align-items: center;
|
|
@@ -15,7 +15,7 @@ chui_menu_bar_main {
|
|
|
15
15
|
gap: 2px;
|
|
16
16
|
/* Полоса идёт за кнопкой меню маршрутов; без этой кнопки (`disableAppMenu`)
|
|
17
17
|
она упиралась бы в край окна */
|
|
18
|
-
margin-inline-start: var(--
|
|
18
|
+
margin-inline-start: var(--block_margin);
|
|
19
19
|
/* Тесная шапка: полоса с вкладками, кнопкой меню и названием занимает больше, чем окно
|
|
20
20
|
минимальной ширины (960px), и раньше лишние пункты просто исчезали — левый бокс шапки
|
|
21
21
|
их обрезал. Теперь полоса прокручивается вбок (ось X), поэтому пункты остаются
|
|
@@ -33,7 +33,7 @@ chui_menu_bar_main {
|
|
|
33
33
|
-webkit-app-region: no-drag;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
/* Button и MenuBar.DROPDOWN несут свои внешние отступы (--
|
|
36
|
+
/* Button и MenuBar.DROPDOWN несут свои внешние отступы (--block_margin и auto 6px) —
|
|
37
37
|
внутри полосы их заменяет gap, иначе полоса распухает по вертикали. */
|
|
38
38
|
chui_menu_bar_main > chui_button,
|
|
39
39
|
menu_bar_drop_down_main {
|
|
@@ -48,7 +48,7 @@ chui_menu_bar_main .chui_button {
|
|
|
48
48
|
background: transparent;
|
|
49
49
|
border: none;
|
|
50
50
|
border-radius: var(--radius_sm);
|
|
51
|
-
padding: var(--
|
|
51
|
+
padding: var(--block_padding);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
chui_menu_bar_main .chui_button:hover {
|
|
@@ -115,8 +115,8 @@ menu_bar_drop_down_button {
|
|
|
115
115
|
cursor: pointer;
|
|
116
116
|
height: max-content;
|
|
117
117
|
width: max-content;
|
|
118
|
-
border-radius: var(--
|
|
119
|
-
padding: var(--
|
|
118
|
+
border-radius: var(--radius_sm);
|
|
119
|
+
padding: var(--block_padding);
|
|
120
120
|
font-size: var(--font_default_size);
|
|
121
121
|
font-weight: 400;
|
|
122
122
|
border: none;
|
|
@@ -140,7 +140,7 @@ menu_bar_dropdown {
|
|
|
140
140
|
display: none;
|
|
141
141
|
flex-direction: column;
|
|
142
142
|
min-width: max-content;
|
|
143
|
-
padding: var(--
|
|
143
|
+
padding: var(--block_margin);
|
|
144
144
|
background: var(--header_background);
|
|
145
145
|
color: var(--text_color);
|
|
146
146
|
border: 1px solid var(--border_color);
|
|
@@ -153,7 +153,7 @@ menu_bar_dropdown {
|
|
|
153
153
|
/* Пункты панели — плоские строки в стиле context_menu_item / user_item: синяя заливка ховера
|
|
154
154
|
одна на всю семью меню (у `chui_button` ховер красит и текст, и глиф). Панель лежит в body,
|
|
155
155
|
поэтому обёртка пункта больше не потомок полосы — её внешние отступы снимаются здесь
|
|
156
|
-
(иначе между строками появлялись бы поля --
|
|
156
|
+
(иначе между строками появлялись бы поля --block_margin). */
|
|
157
157
|
menu_bar_dropdown chui_button {
|
|
158
158
|
margin: 0;
|
|
159
159
|
width: -webkit-fill-available;
|
|
@@ -162,7 +162,7 @@ menu_bar_dropdown chui_button {
|
|
|
162
162
|
menu_bar_dropdown .chui_button {
|
|
163
163
|
width: -webkit-fill-available;
|
|
164
164
|
justify-content: flex-start;
|
|
165
|
-
padding: var(--
|
|
165
|
+
padding: var(--block_padding);
|
|
166
166
|
background: transparent;
|
|
167
167
|
border: none;
|
|
168
168
|
border-radius: var(--radius_sm);
|