chuijs 4.0.2 → 4.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +597 -0
- package/README.md +43 -644
- package/framework/appLayout/default/chui_app_layout.js +602 -496
- package/framework/appLayout/default/global_style.css +288 -97
- package/framework/appLayout/default/main_theme_style.css +188 -101
- package/framework/components/chui_accordion/accordion.js +38 -35
- package/framework/components/chui_accordion/styles.css +13 -12
- package/framework/components/chui_action_sheet/action_sheet.js +93 -64
- package/framework/components/chui_action_sheet/styles.css +12 -5
- 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 +16 -11
- package/framework/components/chui_affix/styles.css +5 -0
- package/framework/components/chui_alert/alert.js +34 -19
- package/framework/components/chui_alert/styles.css +7 -0
- package/framework/components/chui_avatar/avatar.js +36 -35
- package/framework/components/chui_avatar/styles.css +1 -1
- package/framework/components/chui_avatar_group/avatar_group.js +25 -23
- package/framework/components/chui_avatar_group/styles.css +1 -1
- package/framework/components/chui_backtop/backtop.js +60 -21
- package/framework/components/chui_backtop/styles.css +21 -0
- package/framework/components/chui_badge/badge.js +30 -28
- 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/breadcrumb.js +15 -13
- package/framework/components/chui_breadcrumb/styles.css +1 -1
- package/framework/components/chui_button/button.js +52 -36
- package/framework/components/chui_button/styles.css +7 -7
- package/framework/components/chui_calendar/calendar.js +18 -16
- package/framework/components/chui_card/card.js +52 -32
- 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 +140 -79
- package/framework/components/chui_chat/styles.css +18 -7
- package/framework/components/chui_clipboard_history/clipboard_history.js +53 -39
- package/framework/components/chui_clipboard_history/styles.css +13 -9
- package/framework/components/chui_code/code.js +10 -10
- package/framework/components/chui_code/styles.css +4 -4
- package/framework/components/chui_code_editor/code_editor.js +73 -57
- package/framework/components/chui_code_editor/styles.css +6 -5
- package/framework/components/chui_command_palette/command_palette.js +87 -64
- package/framework/components/chui_command_palette/styles.css +5 -5
- package/framework/components/chui_console/console.js +13 -13
- package/framework/components/chui_console/styles.css +6 -3
- package/framework/components/chui_content_block/content_block.js +35 -21
- package/framework/components/chui_content_block/styles.css +2 -2
- package/framework/components/chui_context_menu/context_menu.js +171 -58
- package/framework/components/chui_context_menu/styles.css +82 -8
- package/framework/components/chui_custom_element/custom_element.js +25 -18
- package/framework/components/chui_data_grid/data_grid.js +633 -471
- package/framework/components/chui_data_grid/styles.css +24 -22
- package/framework/components/chui_descriptions/descriptions.js +34 -17
- package/framework/components/chui_descriptions/styles.css +1 -1
- package/framework/components/chui_details/details.js +42 -36
- package/framework/components/chui_details/styles.css +12 -11
- package/framework/components/chui_diff_viewer/diff_viewer.js +172 -147
- package/framework/components/chui_diff_viewer/styles.css +10 -10
- package/framework/components/chui_divider/divider.js +19 -17
- package/framework/components/chui_divider/styles.css +2 -2
- package/framework/components/chui_drawer/drawer.js +63 -38
- package/framework/components/chui_drawer/styles.css +18 -4
- package/framework/components/chui_drop_zone/drop_zone.js +37 -27
- package/framework/components/chui_drop_zone/styles.css +10 -6
- package/framework/components/chui_empty_state/empty_state.js +20 -15
- package/framework/components/chui_fieldset/fieldset.js +40 -23
- package/framework/components/chui_fieldset/styles.css +6 -6
- package/framework/components/chui_file_explorer/file_explorer.js +260 -189
- package/framework/components/chui_file_explorer/styles.css +8 -7
- package/framework/components/chui_form/form.js +40 -28
- package/framework/components/chui_form/styles.css +1 -1
- package/framework/components/chui_gantt/gantt.js +102 -78
- package/framework/components/chui_gantt/styles.css +5 -5
- package/framework/components/chui_graphs/graphs.js +376 -239
- package/framework/components/chui_graphs/styles.css +27 -6
- package/framework/components/chui_hero/hero.js +98 -37
- package/framework/components/chui_hero/styles.css +176 -7
- package/framework/components/chui_html_block/html_block.js +8 -8
- package/framework/components/chui_html_block/styles.css +3 -3
- package/framework/components/chui_hx/hx.js +3 -3
- package/framework/components/chui_hx/styles.css +13 -6
- package/framework/components/chui_icons/icons.js +2115 -2115
- package/framework/components/chui_icons/styles.css +4 -3
- package/framework/components/chui_inputs/chui_check_box/check_box.js +31 -19
- package/framework/components/chui_inputs/chui_check_box/styles.css +30 -21
- package/framework/components/chui_inputs/chui_chips/chips.js +141 -70
- package/framework/components/chui_inputs/chui_chips/styles.css +32 -7
- package/framework/components/chui_inputs/chui_color_picker/color_picker.js +55 -38
- package/framework/components/chui_inputs/chui_color_picker/styles.css +7 -7
- package/framework/components/chui_inputs/chui_combo_box/combo_box.js +127 -109
- package/framework/components/chui_inputs/chui_combo_box/styles.css +23 -21
- package/framework/components/chui_inputs/chui_date/date.js +161 -127
- package/framework/components/chui_inputs/chui_date/styles.css +20 -19
- package/framework/components/chui_inputs/chui_date_range/date_range.js +61 -50
- package/framework/components/chui_inputs/chui_date_range/styles.css +3 -3
- package/framework/components/chui_inputs/chui_datetime/datetime.js +47 -39
- package/framework/components/chui_inputs/chui_datetime/styles.css +3 -3
- package/framework/components/chui_inputs/chui_email/email.js +48 -36
- package/framework/components/chui_inputs/chui_email/styles.css +11 -11
- package/framework/components/chui_inputs/chui_file/file.js +71 -44
- package/framework/components/chui_inputs/chui_file/styles.css +23 -19
- package/framework/components/chui_inputs/chui_hotkey/hotkey.js +101 -76
- package/framework/components/chui_inputs/chui_hotkey/styles.css +6 -6
- package/framework/components/chui_inputs/chui_masked/masked.js +83 -72
- package/framework/components/chui_inputs/chui_masked/styles.css +5 -5
- package/framework/components/chui_inputs/chui_mention/mention.js +87 -40
- package/framework/components/chui_inputs/chui_mention/styles.css +14 -8
- package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +242 -212
- package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +23 -15
- package/framework/components/chui_inputs/chui_number/number.js +84 -70
- package/framework/components/chui_inputs/chui_number/styles.css +13 -13
- package/framework/components/chui_inputs/chui_otp/otp.js +71 -62
- package/framework/components/chui_inputs/chui_otp/styles.css +5 -5
- package/framework/components/chui_inputs/chui_password/password.js +72 -56
- package/framework/components/chui_inputs/chui_password/styles.css +15 -15
- package/framework/components/chui_inputs/chui_radio_button/radio_button.js +37 -25
- package/framework/components/chui_inputs/chui_radio_button/styles.css +22 -22
- package/framework/components/chui_inputs/chui_rating/rating.js +54 -50
- package/framework/components/chui_inputs/chui_rating/styles.css +3 -3
- package/framework/components/chui_inputs/chui_select_box/select_box.js +132 -108
- package/framework/components/chui_inputs/chui_select_box/styles.css +21 -21
- package/framework/components/chui_inputs/chui_slider/slider.js +41 -38
- package/framework/components/chui_inputs/chui_slider/styles.css +7 -5
- package/framework/components/chui_inputs/chui_text/styles.css +14 -14
- package/framework/components/chui_inputs/chui_text/text.js +69 -52
- package/framework/components/chui_inputs/chui_text_area/styles.css +14 -14
- package/framework/components/chui_inputs/chui_text_area/text_area.js +59 -36
- package/framework/components/chui_inputs/chui_time/styles.css +18 -20
- package/framework/components/chui_inputs/chui_time/time.js +71 -49
- package/framework/components/chui_inputs/chui_toggle/styles.css +13 -6
- package/framework/components/chui_inputs/chui_toggle/toggle.js +27 -27
- package/framework/components/chui_json_editor/json_editor.js +137 -127
- package/framework/components/chui_json_editor/styles.css +5 -5
- package/framework/components/chui_json_viewer/json_viewer.js +133 -114
- package/framework/components/chui_json_viewer/styles.css +9 -8
- package/framework/components/chui_kanban/kanban.js +78 -60
- package/framework/components/chui_kanban/styles.css +8 -4
- package/framework/components/chui_kbd/kbd.js +12 -10
- package/framework/components/chui_kbd/styles.css +1 -1
- package/framework/components/chui_label/label.js +31 -29
- package/framework/components/chui_label/styles.css +3 -3
- package/framework/components/chui_link/link.js +36 -29
- package/framework/components/chui_link/styles.css +11 -4
- package/framework/components/chui_list/list.js +42 -38
- package/framework/components/chui_list/styles.css +4 -3
- package/framework/components/chui_markdown_editor/markdown_editor.js +125 -109
- package/framework/components/chui_markdown_editor/styles.css +5 -5
- package/framework/components/chui_media/audio.js +457 -364
- package/framework/components/chui_media/audio_styles.css +74 -37
- package/framework/components/chui_media/image.js +99 -64
- package/framework/components/chui_media/image_compare.js +86 -55
- package/framework/components/chui_media/image_compare_styles.css +5 -5
- package/framework/components/chui_media/image_styles.css +4 -4
- package/framework/components/chui_media/video.js +264 -171
- package/framework/components/chui_media/video_styles.css +57 -24
- package/framework/components/chui_menu_bar/menu_bar.js +67 -65
- package/framework/components/chui_menu_bar/styles.css +14 -12
- 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 +81 -56
- package/framework/components/chui_modal/styles.css +3 -2
- package/framework/components/chui_notification/notification.js +107 -69
- package/framework/components/chui_notification/notification_download.js +28 -77
- package/framework/components/chui_notification/notification_download_card.js +115 -0
- package/framework/components/chui_notification/notification_download_progress.css +5 -4
- package/framework/components/chui_notification/notification_download_progress.js +73 -105
- package/framework/components/chui_notification/notification_update.js +44 -37
- package/framework/components/chui_notification/status_plate.css +3 -3
- package/framework/components/chui_notification/status_plate.js +2 -2
- package/framework/components/chui_notification/styles.css +6 -1
- package/framework/components/chui_notification/styles_download.css +2 -2
- package/framework/components/chui_notification/styles_update.css +3 -3
- package/framework/components/chui_org_chart/org_chart.js +101 -62
- package/framework/components/chui_org_chart/styles.css +2 -2
- package/framework/components/chui_pagination/pagination.js +65 -30
- package/framework/components/chui_pagination/styles.css +1 -1
- package/framework/components/chui_paragraph/paragraph.js +2 -2
- package/framework/components/chui_paragraph/styles.css +3 -3
- package/framework/components/chui_popover/popover.js +77 -50
- package/framework/components/chui_popover/styles.css +1 -1
- package/framework/components/chui_popups/popups.js +210 -181
- package/framework/components/chui_popups/styles.css +7 -7
- package/framework/components/chui_print_button/print_button.js +48 -33
- package/framework/components/chui_progress_bar/progress_bar.js +49 -19
- package/framework/components/chui_progress_bar/styles.css +6 -6
- package/framework/components/chui_progress_ring/progress_ring.js +32 -30
- package/framework/components/chui_progress_ring/styles.css +1 -1
- package/framework/components/chui_qrcode/qrcode.js +85 -41
- package/framework/components/chui_query_builder/query_builder.js +263 -170
- package/framework/components/chui_query_builder/styles.css +4 -4
- package/framework/components/chui_radio_group/radio_group.js +36 -26
- package/framework/components/chui_radio_group/styles.css +2 -2
- package/framework/components/chui_result/result.js +41 -31
- package/framework/components/chui_result/styles.css +3 -3
- package/framework/components/chui_scheduler/scheduler.js +126 -104
- package/framework/components/chui_scheduler/styles.css +11 -7
- 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 +90 -27
- package/framework/components/chui_segmented_control/styles.css +32 -6
- package/framework/components/chui_settings/settings.js +160 -87
- package/framework/components/chui_settings/styles.css +4 -4
- package/framework/components/chui_shortcut_help/shortcut_help.js +82 -61
- package/framework/components/chui_sidebar_nav/sidebar_nav.js +132 -53
- package/framework/components/chui_sidebar_nav/styles.css +9 -3
- package/framework/components/chui_skeleton/skeleton.js +29 -24
- package/framework/components/chui_slideshow/slideshow.js +122 -103
- package/framework/components/chui_slideshow/styles.css +22 -16
- package/framework/components/chui_spinner/spinner.js +17 -17
- package/framework/components/chui_spinner/styles.css +0 -1
- package/framework/components/chui_split_button/split_button.js +53 -30
- package/framework/components/chui_split_button/styles.css +22 -6
- package/framework/components/chui_splitter/splitter.js +46 -39
- package/framework/components/chui_splitter/styles.css +2 -2
- package/framework/components/chui_statistic/statistic.js +111 -84
- package/framework/components/chui_status_bar/status_bar.js +11 -9
- package/framework/components/chui_status_bar/styles.css +2 -2
- package/framework/components/chui_stepper/stepper.js +230 -54
- package/framework/components/chui_stepper/styles.css +79 -14
- package/framework/components/chui_sticky_bar/sticky_bar.js +53 -17
- package/framework/components/chui_sticky_bar/styles.css +11 -7
- package/framework/components/chui_tabs/chui_tabs.js +100 -46
- package/framework/components/chui_tabs/styles.css +43 -15
- package/framework/components/chui_text_editor/styles.css +24 -23
- package/framework/components/chui_text_editor/text_editor.js +103 -79
- package/framework/components/chui_text_editor/text_editor_panel.js +428 -367
- package/framework/components/chui_theme_toggle/theme_toggle.js +46 -25
- package/framework/components/chui_timeline/styles.css +3 -1
- package/framework/components/chui_timeline/timeline.js +14 -12
- package/framework/components/chui_toast_queue/styles.css +11 -11
- package/framework/components/chui_toast_queue/toast_queue.js +82 -73
- package/framework/components/chui_toolbar/styles.css +2 -2
- package/framework/components/chui_toolbar/toolbar.js +20 -13
- package/framework/components/chui_tooltip/styles.css +2 -2
- package/framework/components/chui_tooltip/tooltip.js +40 -27
- package/framework/components/chui_tour/styles.css +12 -7
- package/framework/components/chui_tour/tour.js +132 -98
- package/framework/components/chui_transfer/styles.css +8 -7
- package/framework/components/chui_transfer/transfer.js +143 -123
- package/framework/components/chui_tree_table/styles.css +4 -4
- package/framework/components/chui_tree_table/tree_table.js +88 -74
- package/framework/components/chui_tree_view/styles.css +14 -10
- package/framework/components/chui_tree_view/tree_view.js +298 -253
- 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 +41 -33
- package/framework/components/chui_webview/styles.css +2 -2
- package/framework/components/chui_webview/webview.js +64 -52
- 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 +153 -123
- package/framework/modules/chui_animations/animations.js +105 -43
- package/framework/modules/chui_animations/motion.js +120 -0
- package/framework/modules/chui_animations/styles.css +37 -4
- package/framework/modules/chui_bridge/preload.js +36 -25
- package/framework/modules/chui_functions.js +69 -63
- package/framework/modules/chui_highlight/chui_highlight.js +25 -22
- package/framework/modules/chui_highlight/styles.css +13 -10
- package/framework/modules/chui_i18n/chui_i18n.js +12 -10
- package/framework/modules/chui_i18n/locales/a11y.js +5 -5
- package/framework/modules/chui_i18n/locales/app_layout.js +5 -5
- package/framework/modules/chui_i18n/locales/calendar.js +3 -3
- package/framework/modules/chui_i18n/locales/common.js +3 -3
- package/framework/modules/chui_i18n/locales/data.js +36 -26
- package/framework/modules/chui_i18n/locales/editors.js +40 -13
- package/framework/modules/chui_i18n/locales/feedback.js +65 -3
- package/framework/modules/chui_i18n/locales/forms.js +8 -8
- package/framework/modules/chui_i18n/locales/graphics.js +8 -8
- package/framework/modules/chui_i18n/locales/media.js +4 -4
- package/framework/modules/chui_i18n/locales/navigation.js +12 -8
- package/framework/modules/chui_i18n/locales/validate.js +3 -3
- package/framework/modules/chui_json/chui_json.js +11 -11
- package/framework/modules/chui_layout/chui_layout.js +12 -10
- package/framework/modules/chui_logger/chui_logger.js +47 -28
- package/framework/modules/chui_page/page.js +39 -33
- package/framework/modules/chui_palette/palette.js +61 -0
- package/framework/modules/chui_qr/chui_qr.js +179 -88
- package/framework/modules/chui_scrollbar/chui_scrollbar.js +79 -68
- package/framework/modules/chui_scrollbar/styles.css +4 -2
- package/framework/modules/chui_services/chui_channels.js +27 -13
- package/framework/modules/chui_services/chui_services.js +47 -39
- package/framework/modules/chui_services/desktop.js +108 -101
- package/framework/modules/chui_sortable/chui_sortable.js +33 -28
- package/framework/modules/chui_validate/chui_validate.js +10 -7
- package/framework/tray_bar/chui_menu_items.js +136 -46
- package/index.d.ts +5046 -0
- package/index.js +199 -1254
- package/package.json +81 -68
- package/framework/components/telegram_bot/chui_telegram_bot.js +0 -184
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const {setStyles} = require("../../../modules/chui_functions");
|
|
2
|
-
const {Validate} = require("../../../modules/chui_validate/chui_validate");
|
|
3
|
-
const {I18n} = require("../../../modules/chui_i18n/chui_i18n");
|
|
1
|
+
const { setStyles } = require("../../../modules/chui_functions");
|
|
2
|
+
const { Validate } = require("../../../modules/chui_validate/chui_validate");
|
|
3
|
+
const { I18n } = require("../../../modules/chui_i18n/chui_i18n");
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Поле с маской: позиции значения заданы шаблоном, литералы маски подставляются сами.
|
|
@@ -151,37 +151,39 @@ class MaskedInput {
|
|
|
151
151
|
#error = document.createElement("chui_error_message");
|
|
152
152
|
#id = undefined;
|
|
153
153
|
#name = undefined;
|
|
154
|
-
#
|
|
155
|
-
#
|
|
154
|
+
#titleText = undefined;
|
|
155
|
+
#labelText = undefined;
|
|
156
156
|
#mask = "";
|
|
157
157
|
#rendered = "";
|
|
158
|
-
#
|
|
159
|
-
#
|
|
158
|
+
#placeholderText = "";
|
|
159
|
+
#placeholderDefault = false;
|
|
160
160
|
#disabled = false;
|
|
161
|
-
#
|
|
161
|
+
#readOnly = false;
|
|
162
162
|
#listeners = [];
|
|
163
|
-
#
|
|
164
|
-
|
|
165
|
-
constructor(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
163
|
+
#onChange = undefined;
|
|
164
|
+
|
|
165
|
+
constructor(
|
|
166
|
+
options = {
|
|
167
|
+
id: String(),
|
|
168
|
+
name: String(),
|
|
169
|
+
title: String(),
|
|
170
|
+
label: String(),
|
|
171
|
+
hint: String(),
|
|
172
|
+
mask: String(),
|
|
173
|
+
placeholder: String(),
|
|
174
|
+
value: String(),
|
|
175
|
+
disabled: Boolean(),
|
|
176
|
+
readOnly: Boolean(),
|
|
177
|
+
changeListener: undefined,
|
|
178
|
+
onChange: undefined,
|
|
179
|
+
}
|
|
180
|
+
) {
|
|
179
181
|
setStyles(__dirname + "/styles.css", "chUiJS_MaskedInput");
|
|
180
182
|
MaskedInput.#counter += 1;
|
|
181
183
|
this.#id = options.id === undefined ? `chui_masked_input_${MaskedInput.#counter}` : options.id;
|
|
182
184
|
this.#name = options.name;
|
|
183
|
-
this.#
|
|
184
|
-
this.#
|
|
185
|
+
this.#labelText = options.label;
|
|
186
|
+
this.#onChange = options.onChange;
|
|
185
187
|
this.#mask = options.mask === undefined ? MaskedInput.MASKS.PHONE : String(options.mask);
|
|
186
188
|
this.#root.id = this.#id;
|
|
187
189
|
this.#label.className = "masked_label";
|
|
@@ -209,18 +211,26 @@ class MaskedInput {
|
|
|
209
211
|
this.#root.appendChild(this.#status);
|
|
210
212
|
if (options.title !== undefined) this.setTitle(options.title);
|
|
211
213
|
else this.#label.hidden = true;
|
|
212
|
-
this.setLabel(this.#
|
|
214
|
+
this.setLabel(this.#labelText === undefined ? I18n.t("forms.maskedLabel") : this.#labelText);
|
|
213
215
|
if (options.hint !== undefined) this.setHint(options.hint);
|
|
214
|
-
this.setPlaceholder(
|
|
215
|
-
? MaskedInput.placeholderText(this.#mask) : options.placeholder
|
|
216
|
+
this.setPlaceholder(
|
|
217
|
+
options.placeholder === undefined ? MaskedInput.placeholderText(this.#mask) : options.placeholder
|
|
218
|
+
);
|
|
216
219
|
// Флаг ставим после `setPlaceholder`: он же отмечает образец как заданный вручную
|
|
217
|
-
this.#
|
|
220
|
+
this.#placeholderDefault = options.placeholder === undefined;
|
|
218
221
|
// Текст «неверный формат» у маски значит «поле не дозаполнено» — так и говорим
|
|
219
|
-
const messages = Object.assign({pattern: I18n.t("forms.maskedIncomplete")}, options.messages);
|
|
220
|
-
Validate.installField(
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
222
|
+
const messages = Object.assign({ pattern: I18n.t("forms.maskedIncomplete") }, options.messages);
|
|
223
|
+
Validate.installField(
|
|
224
|
+
this,
|
|
225
|
+
Object.assign({}, options, {
|
|
226
|
+
pattern: MaskedInput.maskPattern(this.#mask),
|
|
227
|
+
messages: messages,
|
|
228
|
+
}),
|
|
229
|
+
this.#root,
|
|
230
|
+
this.#error,
|
|
231
|
+
() => this.#rendered,
|
|
232
|
+
this.#main
|
|
233
|
+
);
|
|
224
234
|
if (options.value !== undefined && options.value !== "") this.setValue(options.value);
|
|
225
235
|
this.setReadOnly(options.readOnly === true);
|
|
226
236
|
this.setDisabled(options.disabled === true);
|
|
@@ -237,12 +247,12 @@ class MaskedInput {
|
|
|
237
247
|
}
|
|
238
248
|
|
|
239
249
|
getTitle() {
|
|
240
|
-
return this.#
|
|
250
|
+
return this.#titleText;
|
|
241
251
|
}
|
|
242
252
|
|
|
243
253
|
/** Доступное имя поля, заданное в `label` */
|
|
244
254
|
getLabel() {
|
|
245
|
-
return this.#
|
|
255
|
+
return this.#labelText;
|
|
246
256
|
}
|
|
247
257
|
|
|
248
258
|
getMask() {
|
|
@@ -265,7 +275,7 @@ class MaskedInput {
|
|
|
265
275
|
}
|
|
266
276
|
|
|
267
277
|
getPlaceholder() {
|
|
268
|
-
return this.#
|
|
278
|
+
return this.#placeholderText;
|
|
269
279
|
}
|
|
270
280
|
|
|
271
281
|
getDisabled() {
|
|
@@ -273,7 +283,7 @@ class MaskedInput {
|
|
|
273
283
|
}
|
|
274
284
|
|
|
275
285
|
isReadOnly() {
|
|
276
|
-
return this.#
|
|
286
|
+
return this.#readOnly;
|
|
277
287
|
}
|
|
278
288
|
|
|
279
289
|
// SET
|
|
@@ -292,7 +302,7 @@ class MaskedInput {
|
|
|
292
302
|
|
|
293
303
|
/** Подпись над полем; `undefined` её убирает (имя тогда даёт `label`) */
|
|
294
304
|
setTitle(text = undefined) {
|
|
295
|
-
this.#
|
|
305
|
+
this.#titleText = text;
|
|
296
306
|
if (text === undefined || text === "") {
|
|
297
307
|
this.#label.hidden = true;
|
|
298
308
|
this.#label.innerText = "";
|
|
@@ -309,8 +319,8 @@ class MaskedInput {
|
|
|
309
319
|
|
|
310
320
|
/** Имя поля, когда подписи в разметке нет */
|
|
311
321
|
setLabel(text = undefined) {
|
|
312
|
-
this.#
|
|
313
|
-
if (this.#
|
|
322
|
+
this.#labelText = text;
|
|
323
|
+
if (this.#titleText === undefined || this.#titleText === "") {
|
|
314
324
|
if (text === undefined) this.#input.removeAttribute("aria-label");
|
|
315
325
|
else this.#input.setAttribute("aria-label", String(text));
|
|
316
326
|
}
|
|
@@ -332,9 +342,9 @@ class MaskedInput {
|
|
|
332
342
|
}
|
|
333
343
|
|
|
334
344
|
setPlaceholder(text = String()) {
|
|
335
|
-
this.#
|
|
336
|
-
this.#
|
|
337
|
-
this.#input.placeholder = this.#
|
|
345
|
+
this.#placeholderText = text === undefined ? "" : String(text);
|
|
346
|
+
this.#placeholderDefault = false;
|
|
347
|
+
this.#input.placeholder = this.#placeholderText;
|
|
338
348
|
return this;
|
|
339
349
|
}
|
|
340
350
|
|
|
@@ -348,10 +358,10 @@ class MaskedInput {
|
|
|
348
358
|
const rules = this.getRules === undefined ? undefined : this.getRules();
|
|
349
359
|
if (rules !== undefined) rules.pattern = MaskedInput.maskPattern(this.#mask);
|
|
350
360
|
// Своя подсказка-образец остаётся, а вид маски по умолчанию пересобирается
|
|
351
|
-
if (this.#
|
|
352
|
-
this.#
|
|
353
|
-
this.#input.placeholder = this.#
|
|
354
|
-
this.#
|
|
361
|
+
if (this.#placeholderDefault) {
|
|
362
|
+
this.#placeholderText = MaskedInput.placeholderText(this.#mask);
|
|
363
|
+
this.#input.placeholder = this.#placeholderText;
|
|
364
|
+
this.#placeholderDefault = true;
|
|
355
365
|
}
|
|
356
366
|
return this;
|
|
357
367
|
}
|
|
@@ -381,10 +391,10 @@ class MaskedInput {
|
|
|
381
391
|
}
|
|
382
392
|
|
|
383
393
|
/** Режим показа: значение видно, но поле не принимает нажатия */
|
|
384
|
-
setReadOnly(
|
|
385
|
-
this.#
|
|
386
|
-
this.#root.classList.toggle("masked_readonly", this.#
|
|
387
|
-
this.#input.readOnly = this.#
|
|
394
|
+
setReadOnly(readOnly = Boolean()) {
|
|
395
|
+
this.#readOnly = readOnly === true;
|
|
396
|
+
this.#root.classList.toggle("masked_readonly", this.#readOnly);
|
|
397
|
+
this.#input.readOnly = this.#readOnly;
|
|
388
398
|
return this;
|
|
389
399
|
}
|
|
390
400
|
|
|
@@ -414,8 +424,8 @@ class MaskedInput {
|
|
|
414
424
|
|
|
415
425
|
// === ВНУТРЕННЕЕ ===
|
|
416
426
|
#accessibleName() {
|
|
417
|
-
if (this.#
|
|
418
|
-
if (this.#
|
|
427
|
+
if (this.#titleText !== undefined && this.#titleText !== "") return this.#titleText;
|
|
428
|
+
if (this.#labelText !== undefined && this.#labelText !== "") return this.#labelText;
|
|
419
429
|
return I18n.t("forms.maskedLabel");
|
|
420
430
|
}
|
|
421
431
|
|
|
@@ -466,7 +476,7 @@ class MaskedInput {
|
|
|
466
476
|
|
|
467
477
|
#notify() {
|
|
468
478
|
for (const listener of [...this.#listeners]) listener(this.#rendered, this);
|
|
469
|
-
if (this.#
|
|
479
|
+
if (this.#onChange !== undefined) this.#onChange(this.#rendered, this);
|
|
470
480
|
}
|
|
471
481
|
|
|
472
482
|
#announce(text = String()) {
|
|
@@ -479,35 +489,36 @@ class MaskedInput {
|
|
|
479
489
|
* и раскладываем по позициям маски заново.
|
|
480
490
|
*/
|
|
481
491
|
#onInput = () => {
|
|
482
|
-
if (this.#disabled || this.#
|
|
492
|
+
if (this.#disabled || this.#readOnly) return;
|
|
483
493
|
const next = this.#input.value;
|
|
484
494
|
const previous = this.#rendered;
|
|
485
495
|
let start = 0;
|
|
486
496
|
while (start < previous.length && start < next.length && previous[start] === next[start]) start += 1;
|
|
487
|
-
let
|
|
488
|
-
let
|
|
489
|
-
while (
|
|
490
|
-
|
|
491
|
-
|
|
497
|
+
let previousEnd = previous.length;
|
|
498
|
+
let nextEnd = next.length;
|
|
499
|
+
while (previousEnd > start && nextEnd > start && previous[previousEnd - 1] === next[nextEnd - 1]) {
|
|
500
|
+
previousEnd -= 1;
|
|
501
|
+
nextEnd -= 1;
|
|
492
502
|
}
|
|
493
|
-
const
|
|
503
|
+
const insertedText = next.slice(start, nextEnd);
|
|
494
504
|
const data = MaskedInput.#collect(this.#mask, previous, 0);
|
|
495
505
|
const before = MaskedInput.#placeholders(this.#mask, start);
|
|
496
|
-
const removed = MaskedInput.#placeholders(this.#mask,
|
|
497
|
-
const inserted = MaskedInput.#collect(this.#mask,
|
|
506
|
+
const removed = MaskedInput.#placeholders(this.#mask, previousEnd) - before;
|
|
507
|
+
const inserted = MaskedInput.#collect(this.#mask, insertedText, start);
|
|
498
508
|
const list = data.slice(0, before).concat(inserted, data.slice(before + removed));
|
|
499
509
|
const value = MaskedInput.#format(this.#mask, list);
|
|
500
|
-
const
|
|
510
|
+
const completeBefore = this.isComplete();
|
|
501
511
|
const changed = this.#apply(value);
|
|
502
512
|
const caret = this.#caretAfter(value, before + inserted.length);
|
|
503
513
|
this.#input.setSelectionRange(caret, caret);
|
|
504
514
|
// Отклонённый символ и заполненная маска иначе не заметны: поле просто ничего не делает.
|
|
505
515
|
// Литералы самой маски («-», «(») за отказ не считаем — их место в шаблоне.
|
|
506
|
-
const junk = [...
|
|
507
|
-
symbol !== "" && !this.#accepts(symbol) && !this.#mask.includes(symbol)
|
|
516
|
+
const junk = [...insertedText].filter(
|
|
517
|
+
(symbol) => symbol !== "" && !this.#accepts(symbol) && !this.#mask.includes(symbol)
|
|
518
|
+
);
|
|
508
519
|
if (junk.length > 0) {
|
|
509
|
-
this.#announce(I18n.t("forms.maskedAllowedOnly", {value: this.#allowedText()}));
|
|
510
|
-
} else if (!
|
|
520
|
+
this.#announce(I18n.t("forms.maskedAllowedOnly", { value: this.#allowedText() }));
|
|
521
|
+
} else if (!completeBefore && this.isComplete()) {
|
|
511
522
|
this.#announce(I18n.t("forms.maskedComplete"));
|
|
512
523
|
} else if (this.#status.innerText !== "") {
|
|
513
524
|
this.#announce("");
|
|
@@ -520,7 +531,7 @@ class MaskedInput {
|
|
|
520
531
|
// Backspace снимает ближайший значимый символ слева, Delete — справа (как в тексте).
|
|
521
532
|
// Иначе каретка сразу за литералом удаляла бы символ справа от себя.
|
|
522
533
|
#onKeyDown = (event) => {
|
|
523
|
-
if (this.#disabled || this.#
|
|
534
|
+
if (this.#disabled || this.#readOnly) return;
|
|
524
535
|
if (event.key !== "Backspace" && event.key !== "Delete") return;
|
|
525
536
|
const caret = this.#input.selectionStart;
|
|
526
537
|
if (caret === null || caret !== this.#input.selectionEnd) return;
|
|
@@ -542,4 +553,4 @@ class MaskedInput {
|
|
|
542
553
|
};
|
|
543
554
|
}
|
|
544
555
|
|
|
545
|
-
exports.MaskedInput = MaskedInput
|
|
556
|
+
exports.MaskedInput = MaskedInput;
|
|
@@ -5,18 +5,18 @@ chui_masked_input {
|
|
|
5
5
|
карточку. Токены переопределены у корня поля, поэтому действуют только внутри него
|
|
6
6
|
(тот же приём у полосы меню-бара). */
|
|
7
7
|
--control_padding: var(--control_padding_sm);
|
|
8
|
-
--
|
|
8
|
+
--block_padding: var(--block_padding_sm);
|
|
9
9
|
display: flex;
|
|
10
10
|
flex-direction: column;
|
|
11
11
|
width: var(--control_width);
|
|
12
12
|
height: max-content;
|
|
13
|
-
margin: var(--
|
|
13
|
+
margin: var(--block_margin);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
.masked_label {
|
|
17
17
|
display: block;
|
|
18
18
|
width: max-content;
|
|
19
|
-
margin: 0 0 var(--
|
|
19
|
+
margin: 0 0 var(--block_margin);
|
|
20
20
|
color: var(--text_color);
|
|
21
21
|
font-size: var(--font_labels_size);
|
|
22
22
|
font-weight: 500;
|
|
@@ -33,9 +33,9 @@ chui_masked_input {
|
|
|
33
33
|
width: -webkit-fill-available;
|
|
34
34
|
min-height: var(--control_height);
|
|
35
35
|
margin: 0;
|
|
36
|
-
padding: var(--
|
|
36
|
+
padding: var(--block_padding);
|
|
37
37
|
border: 1px solid var(--border_color);
|
|
38
|
-
border-radius: var(--
|
|
38
|
+
border-radius: var(--radius_sm);
|
|
39
39
|
background: var(--element_background);
|
|
40
40
|
color: var(--text_color);
|
|
41
41
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const {setStyles, dropdownPlacement} = require(
|
|
2
|
-
const {Validate} = require(
|
|
3
|
-
const {ComboboxKeyboard} = require(
|
|
4
|
-
const {Icon} = require(
|
|
5
|
-
const {I18n} = require(
|
|
1
|
+
const { setStyles, dropdownPlacement } = require("../../../modules/chui_functions");
|
|
2
|
+
const { Validate } = require("../../../modules/chui_validate/chui_validate");
|
|
3
|
+
const { ComboboxKeyboard } = require("../../../modules/chui_a11y/chui_a11y");
|
|
4
|
+
const { Icon } = require("../../chui_icons/icons");
|
|
5
|
+
const { I18n } = require("../../../modules/chui_i18n/chui_i18n");
|
|
6
6
|
|
|
7
7
|
/** Сколько подсказок показывать за раз */
|
|
8
8
|
const DEFAULT_LIMIT = 6;
|
|
@@ -51,7 +51,7 @@ class Mention {
|
|
|
51
51
|
#dropdown = document.createElement("mention_dropdown");
|
|
52
52
|
#hint = document.createElement("mention_hint");
|
|
53
53
|
// Объявление для скринридера: класс общей утилиты скрытия (по нему его узнают стенды)
|
|
54
|
-
#status = Object.assign(document.createElement("chui_visually_hidden"), {className: "chui_visually_hidden"});
|
|
54
|
+
#status = Object.assign(document.createElement("chui_visually_hidden"), { className: "chui_visually_hidden" });
|
|
55
55
|
#a11y = undefined;
|
|
56
56
|
#items = [];
|
|
57
57
|
#trigger = "@";
|
|
@@ -59,21 +59,34 @@ class Mention {
|
|
|
59
59
|
#multiline = false;
|
|
60
60
|
#placeholder = "";
|
|
61
61
|
#name = undefined;
|
|
62
|
-
#
|
|
63
|
-
#
|
|
62
|
+
#labelText = undefined;
|
|
63
|
+
#hintText = undefined;
|
|
64
64
|
#disabled = false;
|
|
65
|
-
#
|
|
65
|
+
#changeListeners = [];
|
|
66
66
|
|
|
67
|
-
constructor(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
67
|
+
constructor(
|
|
68
|
+
options = {
|
|
69
|
+
name: String(),
|
|
70
|
+
title: String(),
|
|
71
|
+
label: String(),
|
|
72
|
+
hint: String(),
|
|
73
|
+
placeholder: String(),
|
|
74
|
+
width: String(),
|
|
75
|
+
multiline: Boolean(),
|
|
76
|
+
rows: Number(),
|
|
77
|
+
items: [],
|
|
78
|
+
trigger: String(),
|
|
79
|
+
limit: Number(),
|
|
80
|
+
disabled: Boolean(),
|
|
81
|
+
value: String(),
|
|
82
|
+
required: Boolean(),
|
|
83
|
+
changeListener: undefined,
|
|
84
|
+
}
|
|
85
|
+
) {
|
|
73
86
|
setStyles(__dirname + "/styles.css", "chUiJS_Mention");
|
|
74
87
|
this.#name = options.name;
|
|
75
|
-
this.#
|
|
76
|
-
this.#
|
|
88
|
+
this.#labelText = options.label;
|
|
89
|
+
this.#hintText = options.hint;
|
|
77
90
|
this.#placeholder = options.placeholder === undefined ? "" : options.placeholder;
|
|
78
91
|
this.#multiline = options.multiline === true;
|
|
79
92
|
if (options.trigger !== undefined) this.#trigger = options.trigger;
|
|
@@ -100,7 +113,8 @@ class Mention {
|
|
|
100
113
|
this.#dropdown.setAttribute("aria-label", I18n.t("forms.mentionOptions"));
|
|
101
114
|
this.#hint.id = `${this.#id}_hint`;
|
|
102
115
|
this.#hint.className = "mention_hint";
|
|
103
|
-
this.#hint.innerText =
|
|
116
|
+
this.#hint.innerText =
|
|
117
|
+
this.#hintText === undefined ? I18n.t("forms.mentionHint", { trigger: this.#trigger }) : this.#hintText;
|
|
104
118
|
this.#input.setAttribute("aria-describedby", this.#hint.id);
|
|
105
119
|
this.#status.setAttribute("role", "status");
|
|
106
120
|
this.#status.setAttribute("aria-live", "polite");
|
|
@@ -115,7 +129,7 @@ class Mention {
|
|
|
115
129
|
dropdown: this.#dropdown,
|
|
116
130
|
optionSelector: ".mention_option",
|
|
117
131
|
onEscape: () => this.#setDropdown(false),
|
|
118
|
-
onOpen: () => this.#syncDropdown()
|
|
132
|
+
onOpen: () => this.#syncDropdown(),
|
|
119
133
|
});
|
|
120
134
|
this.#input.addEventListener("input", this.#onInput);
|
|
121
135
|
this.#input.addEventListener("keyup", this.#onCaretMove);
|
|
@@ -133,15 +147,31 @@ class Mention {
|
|
|
133
147
|
}
|
|
134
148
|
|
|
135
149
|
// GET
|
|
136
|
-
getId() {
|
|
137
|
-
|
|
138
|
-
|
|
150
|
+
getId() {
|
|
151
|
+
return this.#id;
|
|
152
|
+
}
|
|
153
|
+
getName() {
|
|
154
|
+
return this.#name;
|
|
155
|
+
}
|
|
156
|
+
getTitle() {
|
|
157
|
+
return this.#label === undefined ? undefined : this.#label.innerText;
|
|
158
|
+
}
|
|
139
159
|
/** Текст поля целиком — упоминания остаются в нём как набранные */
|
|
140
|
-
getValue() {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
160
|
+
getValue() {
|
|
161
|
+
return this.#input.value;
|
|
162
|
+
}
|
|
163
|
+
getItems() {
|
|
164
|
+
return [...this.#items];
|
|
165
|
+
}
|
|
166
|
+
getTrigger() {
|
|
167
|
+
return this.#trigger;
|
|
168
|
+
}
|
|
169
|
+
isDisabled() {
|
|
170
|
+
return this.#disabled;
|
|
171
|
+
}
|
|
172
|
+
getInput() {
|
|
173
|
+
return this.#input;
|
|
174
|
+
}
|
|
145
175
|
|
|
146
176
|
/**
|
|
147
177
|
* Упоминания по текущему тексту: для каждого пункта ищется `триггер + подпись`.
|
|
@@ -154,7 +184,11 @@ class Mention {
|
|
|
154
184
|
const token = this.#trigger + String(item.title);
|
|
155
185
|
let index = text.indexOf(token);
|
|
156
186
|
while (index !== -1) {
|
|
157
|
-
found.push({
|
|
187
|
+
found.push({
|
|
188
|
+
title: item.title,
|
|
189
|
+
value: item.value === undefined ? item.title : item.value,
|
|
190
|
+
index: index,
|
|
191
|
+
});
|
|
158
192
|
index = text.indexOf(token, index + token.length);
|
|
159
193
|
}
|
|
160
194
|
}
|
|
@@ -188,7 +222,8 @@ class Mention {
|
|
|
188
222
|
}
|
|
189
223
|
setTrigger(trigger = String()) {
|
|
190
224
|
this.#trigger = trigger;
|
|
191
|
-
if (this.#
|
|
225
|
+
if (this.#hintText === undefined)
|
|
226
|
+
this.#hint.innerText = I18n.t("forms.mentionHint", { trigger: this.#trigger });
|
|
192
227
|
this.#setDropdown(false);
|
|
193
228
|
return this;
|
|
194
229
|
}
|
|
@@ -198,7 +233,7 @@ class Mention {
|
|
|
198
233
|
return this;
|
|
199
234
|
}
|
|
200
235
|
setHint(text = String()) {
|
|
201
|
-
this.#
|
|
236
|
+
this.#hintText = text;
|
|
202
237
|
this.#hint.innerText = text;
|
|
203
238
|
this.#hint.style.display = String(text).trim() === "" ? "none" : "";
|
|
204
239
|
return this;
|
|
@@ -215,10 +250,12 @@ class Mention {
|
|
|
215
250
|
return this;
|
|
216
251
|
}
|
|
217
252
|
addChangeListener(listener = () => {}) {
|
|
218
|
-
this.#
|
|
253
|
+
this.#changeListeners.push(listener);
|
|
219
254
|
return this;
|
|
220
255
|
}
|
|
221
|
-
set() {
|
|
256
|
+
set() {
|
|
257
|
+
return this.#root;
|
|
258
|
+
}
|
|
222
259
|
|
|
223
260
|
// === ВНУТРЕННЕЕ ===
|
|
224
261
|
#caret() {
|
|
@@ -239,17 +276,20 @@ class Mention {
|
|
|
239
276
|
if (/\s/.test(query)) return undefined;
|
|
240
277
|
const before = index === 0 ? "" : text[index - 1];
|
|
241
278
|
if (before !== "" && BEFORE_TRIGGER.test(before) === false) return undefined;
|
|
242
|
-
return {start: index, query: query};
|
|
279
|
+
return { start: index, query: query };
|
|
243
280
|
}
|
|
244
281
|
#syncFieldAria() {
|
|
245
|
-
const
|
|
246
|
-
if (
|
|
282
|
+
const hasTitle = this.#label !== undefined && this.#label.innerText !== "";
|
|
283
|
+
if (hasTitle) {
|
|
247
284
|
this.#input.setAttribute("aria-labelledby", this.#label.id);
|
|
248
285
|
this.#input.removeAttribute("aria-label");
|
|
249
286
|
return;
|
|
250
287
|
}
|
|
251
288
|
this.#input.removeAttribute("aria-labelledby");
|
|
252
|
-
this.#input.setAttribute(
|
|
289
|
+
this.#input.setAttribute(
|
|
290
|
+
"aria-label",
|
|
291
|
+
this.#labelText === undefined ? I18n.t("forms.mentionLabel") : this.#labelText
|
|
292
|
+
);
|
|
253
293
|
}
|
|
254
294
|
/** Пересобрать подсказки по тексту до каретки и открыть список, если есть совпадения */
|
|
255
295
|
#syncDropdown() {
|
|
@@ -314,7 +354,7 @@ class Mention {
|
|
|
314
354
|
this.#input.value = value.slice(0, token.start) + inserted + value.slice(caret);
|
|
315
355
|
this.#setCaret(token.start + inserted.length);
|
|
316
356
|
this.#setDropdown(false);
|
|
317
|
-
this.#announce(I18n.t("forms.mentionInserted", {value: item.title}));
|
|
357
|
+
this.#announce(I18n.t("forms.mentionInserted", { value: item.title }));
|
|
318
358
|
this.#emit();
|
|
319
359
|
this.#input.focus();
|
|
320
360
|
return true;
|
|
@@ -325,7 +365,7 @@ class Mention {
|
|
|
325
365
|
}
|
|
326
366
|
#emit() {
|
|
327
367
|
const text = this.getValue();
|
|
328
|
-
for (const listener of [...this.#
|
|
368
|
+
for (const listener of [...this.#changeListeners]) listener(text);
|
|
329
369
|
}
|
|
330
370
|
|
|
331
371
|
// === ОБРАБОТЧИКИ ===
|
|
@@ -335,7 +375,14 @@ class Mention {
|
|
|
335
375
|
};
|
|
336
376
|
/** Каретка переехала (стрелки, щелчок, Home/End) — упоминание под ней могло измениться */
|
|
337
377
|
#onCaretMove = (event) => {
|
|
338
|
-
if (
|
|
378
|
+
if (
|
|
379
|
+
event.type === "keyup" &&
|
|
380
|
+
event.key !== "ArrowLeft" &&
|
|
381
|
+
event.key !== "ArrowRight" &&
|
|
382
|
+
event.key !== "Home" &&
|
|
383
|
+
event.key !== "End"
|
|
384
|
+
)
|
|
385
|
+
return;
|
|
339
386
|
if (document.activeElement !== this.#input) return;
|
|
340
387
|
this.#syncDropdown();
|
|
341
388
|
};
|
|
@@ -348,4 +395,4 @@ class Mention {
|
|
|
348
395
|
};
|
|
349
396
|
}
|
|
350
397
|
|
|
351
|
-
exports.Mention = Mention
|
|
398
|
+
exports.Mention = Mention;
|
|
@@ -5,11 +5,11 @@ chui_mention {
|
|
|
5
5
|
карточку. Токены переопределены у корня поля, поэтому действуют только внутри него
|
|
6
6
|
(тот же приём у полосы меню-бара). */
|
|
7
7
|
--control_padding: var(--control_padding_sm);
|
|
8
|
-
--
|
|
8
|
+
--block_padding: var(--block_padding_sm);
|
|
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
|
font-size: var(--font_default_size);
|
|
15
15
|
color: var(--text_color);
|
|
@@ -18,7 +18,7 @@ chui_mention {
|
|
|
18
18
|
.mention_label {
|
|
19
19
|
height: max-content;
|
|
20
20
|
width: max-content;
|
|
21
|
-
margin: 0 0 var(--
|
|
21
|
+
margin: 0 0 var(--block_margin);
|
|
22
22
|
font-size: var(--font_labels_size);
|
|
23
23
|
font-weight: 500;
|
|
24
24
|
color: var(--text_color);
|
|
@@ -31,7 +31,7 @@ mention_field {
|
|
|
31
31
|
flex-direction: column;
|
|
32
32
|
height: max-content;
|
|
33
33
|
width: -webkit-fill-available;
|
|
34
|
-
border-radius: var(--
|
|
34
|
+
border-radius: var(--radius_sm);
|
|
35
35
|
background: var(--element_background);
|
|
36
36
|
border: 1px solid var(--border_color);
|
|
37
37
|
}
|
|
@@ -41,10 +41,10 @@ mention_field {
|
|
|
41
41
|
box-sizing: border-box;
|
|
42
42
|
width: 100%;
|
|
43
43
|
margin: 0;
|
|
44
|
-
padding: var(--
|
|
44
|
+
padding: var(--block_padding);
|
|
45
45
|
background: transparent;
|
|
46
46
|
border: none;
|
|
47
|
-
border-radius: var(--
|
|
47
|
+
border-radius: var(--radius_sm);
|
|
48
48
|
color: var(--text_color);
|
|
49
49
|
font-size: var(--font_default_size);
|
|
50
50
|
font-family: inherit;
|
|
@@ -74,7 +74,7 @@ mention_dropdown {
|
|
|
74
74
|
backdrop-filter: var(--global_blur);
|
|
75
75
|
-webkit-backdrop-filter: var(--global_blur);
|
|
76
76
|
border: 1px solid var(--border_color);
|
|
77
|
-
border-radius: var(--
|
|
77
|
+
border-radius: var(--radius_sm);
|
|
78
78
|
box-shadow: var(--box_shadow_main);
|
|
79
79
|
/* Прокрутка списка подсказок; `overflow: overlay` удалён в Chromium 122 */
|
|
80
80
|
overflow: hidden auto;
|
|
@@ -87,6 +87,12 @@ mention_dropdown[hidden] {
|
|
|
87
87
|
display: none;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
/* Появление списка подсказок: общий кадр панели, он же проигрывается заново при снятии
|
|
91
|
+
`hidden`. Прежде список появлялся без движения вовсе */
|
|
92
|
+
mention_dropdown {
|
|
93
|
+
animation: chui_panel_in var(--motion_base) var(--motion_spring);
|
|
94
|
+
}
|
|
95
|
+
|
|
90
96
|
.mention_option {
|
|
91
97
|
display: flex;
|
|
92
98
|
flex-direction: row;
|
|
@@ -132,7 +138,7 @@ mention_dropdown[hidden] {
|
|
|
132
138
|
|
|
133
139
|
.mention_hint {
|
|
134
140
|
display: block;
|
|
135
|
-
margin: var(--
|
|
141
|
+
margin: var(--block_margin);
|
|
136
142
|
color: var(--text_color_disabled);
|
|
137
143
|
font-size: var(--font_labels_size);
|
|
138
144
|
}
|