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,39 +1,42 @@
|
|
|
1
|
-
const fs = require("fs")
|
|
1
|
+
const fs = require("fs");
|
|
2
2
|
|
|
3
3
|
function sleep(ms) {
|
|
4
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
4
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
/** Кэш прочитанных таблиц стилей: один файл отдаётся разным `id` без повторного чтения с диска */
|
|
8
|
-
const
|
|
8
|
+
const stylesCache = new Map();
|
|
9
9
|
|
|
10
10
|
function setStyles(pathToCSS = String(), component = String()) {
|
|
11
|
-
if (document.getElementById(component)
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
-
style
|
|
15
|
-
|
|
16
|
-
style
|
|
11
|
+
if (document.getElementById(component) !== null) return;
|
|
12
|
+
if (stylesCache.has(pathToCSS) === false) stylesCache.set(pathToCSS, fs.readFileSync(pathToCSS, "utf8"));
|
|
13
|
+
const style = document.createElement("style");
|
|
14
|
+
// Содержимое `<style>` — CSS, а не разметка: `textContent` не разбирает его как HTML,
|
|
15
|
+
// поэтому символы `<` в CSS не могут порвать таблицу (в jsdom `innerHTML` тоже работает,
|
|
16
|
+
// но `textContent` — это ровно то, чем является тело `<style>`)
|
|
17
|
+
style.textContent = stylesCache.get(pathToCSS);
|
|
18
|
+
style.type = "text/css";
|
|
19
|
+
style.setAttribute("id", component);
|
|
17
20
|
document.head.appendChild(style);
|
|
18
21
|
}
|
|
19
22
|
|
|
20
|
-
function
|
|
23
|
+
function parseStyle(json, component) {
|
|
21
24
|
// Сначала проверяем, что стиль уже есть: сборка строки стоит дорого (для шрифтов — мегабайты)
|
|
22
|
-
if (document.getElementById(component)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
for (let i = 0; i <
|
|
26
|
-
|
|
27
|
-
JSON.parse(JSON.stringify(
|
|
28
|
-
if (typeof value !==
|
|
25
|
+
if (document.getElementById(component) !== null) return;
|
|
26
|
+
const styleGroups = JSON.parse(JSON.stringify(json));
|
|
27
|
+
const styleParts = [];
|
|
28
|
+
for (let i = 0; i < styleGroups.length; i++) {
|
|
29
|
+
styleParts.push(`${styleGroups[i].name} {`);
|
|
30
|
+
JSON.parse(JSON.stringify(styleGroups[i].style), function (key, value) {
|
|
31
|
+
if (typeof value !== "object") styleParts.push(`${key}:${value};`);
|
|
29
32
|
return value;
|
|
30
33
|
});
|
|
31
|
-
|
|
34
|
+
styleParts.push(`}\n`);
|
|
32
35
|
}
|
|
33
|
-
|
|
34
|
-
style.
|
|
35
|
-
style.type =
|
|
36
|
-
style.setAttribute(
|
|
36
|
+
const style = document.createElement("style");
|
|
37
|
+
style.textContent = styleParts.join("").slice(0, -1);
|
|
38
|
+
style.type = "text/css";
|
|
39
|
+
style.setAttribute("id", component);
|
|
37
40
|
document.head.appendChild(style);
|
|
38
41
|
}
|
|
39
42
|
|
|
@@ -48,13 +51,13 @@ const render = (rendez) => {
|
|
|
48
51
|
reject(e);
|
|
49
52
|
}
|
|
50
53
|
};
|
|
51
|
-
if (document.readyState ===
|
|
54
|
+
if (document.readyState === "loading") window.addEventListener("DOMContentLoaded", run, { once: true });
|
|
52
55
|
else run();
|
|
53
56
|
});
|
|
54
|
-
}
|
|
57
|
+
};
|
|
55
58
|
|
|
56
59
|
function getDefaultIcon() {
|
|
57
|
-
return require(
|
|
60
|
+
return require("path").join(__dirname, "chui_icon.png");
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
const DROPDOWN_VIEWPORT_MARGIN = 8;
|
|
@@ -70,7 +73,8 @@ function dropdownViewport(anchor = new HTMLElement()) {
|
|
|
70
73
|
let current = anchor.parentElement;
|
|
71
74
|
while (current !== null) {
|
|
72
75
|
const style = window.getComputedStyle(current);
|
|
73
|
-
const clips =
|
|
76
|
+
const clips =
|
|
77
|
+
/(auto|scroll|overlay|hidden)/.test(style.overflowY) ||
|
|
74
78
|
/(auto|scroll|overlay|hidden)/.test(style.overflowX);
|
|
75
79
|
if (clips) {
|
|
76
80
|
const box = current.getBoundingClientRect();
|
|
@@ -79,7 +83,7 @@ function dropdownViewport(anchor = new HTMLElement()) {
|
|
|
79
83
|
}
|
|
80
84
|
current = current.parentElement;
|
|
81
85
|
}
|
|
82
|
-
return {top: top, bottom: Math.max(bottom, top)};
|
|
86
|
+
return { top: top, bottom: Math.max(bottom, top) };
|
|
83
87
|
}
|
|
84
88
|
|
|
85
89
|
/**
|
|
@@ -93,7 +97,7 @@ function dropdownPlacement(dropdown = new HTMLElement(), anchor = new HTMLElemen
|
|
|
93
97
|
const spaceBelow = view.bottom - anchorRect.bottom - DROPDOWN_VIEWPORT_MARGIN;
|
|
94
98
|
const spaceAbove = anchorRect.top - view.top - DROPDOWN_VIEWPORT_MARGIN;
|
|
95
99
|
const up = dropdown.offsetHeight > spaceBelow && spaceAbove >= spaceBelow;
|
|
96
|
-
return {up: up, maxHeight: Math.max(0, up ? spaceAbove : spaceBelow)};
|
|
100
|
+
return { up: up, maxHeight: Math.max(0, up ? spaceAbove : spaceBelow) };
|
|
97
101
|
}
|
|
98
102
|
|
|
99
103
|
/**
|
|
@@ -113,27 +117,28 @@ function shouldOpenDropdownUp(dropdown = new HTMLElement(), anchor = new HTMLEle
|
|
|
113
117
|
* явным `[текст](адрес)`. Разборщик создаётся при первом вызове: markdown нужен не каждой
|
|
114
118
|
* странице, а `require` тянет библиотеку целиком.
|
|
115
119
|
*/
|
|
116
|
-
let
|
|
120
|
+
let markdownParser = undefined;
|
|
117
121
|
function markdownToHtml(text = String()) {
|
|
118
122
|
if (text === undefined || text === null || String(text) === "") return "";
|
|
119
|
-
if (
|
|
120
|
-
|
|
123
|
+
if (markdownParser === undefined)
|
|
124
|
+
markdownParser = new (require("markdown-it"))({ html: false, linkify: false, breaks: false });
|
|
125
|
+
return markdownParser.render(String(text)).trim();
|
|
121
126
|
}
|
|
122
127
|
|
|
123
128
|
/** Обратный разбор: HTML → markdown (`turndown`) */
|
|
124
129
|
function htmlToMarkdown(text = String()) {
|
|
125
130
|
if (text === undefined || text === null || String(text) === "") return "";
|
|
126
|
-
const TurndownService = require(
|
|
131
|
+
const TurndownService = require("turndown");
|
|
127
132
|
return new TurndownService().turndown(String(text));
|
|
128
133
|
}
|
|
129
134
|
|
|
130
135
|
function getDate() {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
136
|
+
const date = new Date();
|
|
137
|
+
const day = ("0" + Number(date.getDate()).toString()).slice(-2);
|
|
138
|
+
const month = ("0" + Number(date.getMonth() + 1).toString()).slice(-2);
|
|
139
|
+
const year = date.getFullYear();
|
|
140
|
+
const hours = ("0" + Number(date.getHours()).toString()).slice(-2);
|
|
141
|
+
const minutes = ("0" + Number(date.getMinutes()).toString()).slice(-2);
|
|
137
142
|
return `${day}.${month}.${year} ${hours}:${minutes}`;
|
|
138
143
|
}
|
|
139
144
|
|
|
@@ -145,8 +150,8 @@ function getDate() {
|
|
|
145
150
|
* в узкой карточке съедала полстроки заголовка и читалась служебной подписью.
|
|
146
151
|
*/
|
|
147
152
|
function getTime(date = new Date()) {
|
|
148
|
-
const hours = (
|
|
149
|
-
const minutes = (
|
|
153
|
+
const hours = ("0" + Number(date.getHours()).toString()).slice(-2);
|
|
154
|
+
const minutes = ("0" + Number(date.getMinutes()).toString()).slice(-2);
|
|
150
155
|
return `${hours}:${minutes}`;
|
|
151
156
|
}
|
|
152
157
|
|
|
@@ -159,18 +164,18 @@ function getTime(date = new Date()) {
|
|
|
159
164
|
* как строки.
|
|
160
165
|
*/
|
|
161
166
|
function getDayKey(date = new Date()) {
|
|
162
|
-
const month = (
|
|
163
|
-
const day = (
|
|
167
|
+
const month = ("0" + Number(date.getMonth() + 1).toString()).slice(-2);
|
|
168
|
+
const day = ("0" + Number(date.getDate()).toString()).slice(-2);
|
|
164
169
|
return `${date.getFullYear()}-${month}-${day}`;
|
|
165
170
|
}
|
|
166
171
|
|
|
167
172
|
function formatBytes(bytes, decimals = 2) {
|
|
168
|
-
if (!+bytes) return
|
|
169
|
-
const k = 1024
|
|
170
|
-
const dm = decimals < 0 ? 0 : decimals
|
|
171
|
-
const sizes = [
|
|
172
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k))
|
|
173
|
-
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}
|
|
173
|
+
if (!+bytes) return "0 Bytes";
|
|
174
|
+
const k = 1024;
|
|
175
|
+
const dm = decimals < 0 ? 0 : decimals;
|
|
176
|
+
const sizes = ["Bytes", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
|
|
177
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
178
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
|
|
174
179
|
}
|
|
175
180
|
|
|
176
181
|
/**
|
|
@@ -204,18 +209,19 @@ function scrollParent(node = undefined) {
|
|
|
204
209
|
return document.scrollingElement;
|
|
205
210
|
}
|
|
206
211
|
|
|
207
|
-
exports.getDate = getDate
|
|
208
|
-
exports.getTime = getTime
|
|
209
|
-
exports.getDayKey = getDayKey
|
|
210
|
-
exports.sleep = sleep
|
|
211
|
-
|
|
212
|
-
exports.
|
|
213
|
-
exports.
|
|
214
|
-
exports.
|
|
215
|
-
exports.
|
|
216
|
-
exports.
|
|
217
|
-
exports.
|
|
218
|
-
exports.
|
|
219
|
-
exports.
|
|
220
|
-
exports.
|
|
221
|
-
exports.
|
|
212
|
+
exports.getDate = getDate;
|
|
213
|
+
exports.getTime = getTime;
|
|
214
|
+
exports.getDayKey = getDayKey;
|
|
215
|
+
exports.sleep = sleep;
|
|
216
|
+
// Ключ остаётся прежним: имя читает `chui_fonts.js` и чужой код, а функция внутри — своя
|
|
217
|
+
exports.style_parse = parseStyle;
|
|
218
|
+
exports.render = render;
|
|
219
|
+
exports.markdownToHtml = markdownToHtml;
|
|
220
|
+
exports.htmlToMarkdown = htmlToMarkdown;
|
|
221
|
+
exports.getDefaultIcon = getDefaultIcon;
|
|
222
|
+
exports.shouldOpenDropdownUp = shouldOpenDropdownUp;
|
|
223
|
+
exports.dropdownPlacement = dropdownPlacement;
|
|
224
|
+
exports.setStyles = setStyles;
|
|
225
|
+
exports.formatBytes = formatBytes;
|
|
226
|
+
exports.optionOr = optionOr;
|
|
227
|
+
exports.scrollParent = scrollParent;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const {setStyles} = require("../chui_functions");
|
|
1
|
+
const { setStyles } = require("../chui_functions");
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Подсветка кода регулярными токенами: общий модуль для `CodeEditor` и `JsonEditor`.
|
|
@@ -16,32 +16,35 @@ const {setStyles} = require("../chui_functions");
|
|
|
16
16
|
*/
|
|
17
17
|
const RULES = {
|
|
18
18
|
javascript: [
|
|
19
|
-
{type: "comment", source: "/\\*[\\s\\S]*?\\*/|//[^\\n]*"},
|
|
20
|
-
{type: "string", source: "`(?:\\\\.|[^`\\\\])*`|\"(?:\\\\.|[^\"\\\\\\n])*\"|'(?:\\\\.|[^'\\\\\\n])*'"},
|
|
21
|
-
{type: "number", source: "\\b(?:0[xX][0-9a-fA-F]+|\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)\\b"},
|
|
22
|
-
{
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
{ type: "comment", source: "/\\*[\\s\\S]*?\\*/|//[^\\n]*" },
|
|
20
|
+
{ type: "string", source: "`(?:\\\\.|[^`\\\\])*`|\"(?:\\\\.|[^\"\\\\\\n])*\"|'(?:\\\\.|[^'\\\\\\n])*'" },
|
|
21
|
+
{ type: "number", source: "\\b(?:0[xX][0-9a-fA-F]+|\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)\\b" },
|
|
22
|
+
{
|
|
23
|
+
type: "keyword",
|
|
24
|
+
source: "\\b(?:const|let|var|function|return|if|else|for|while|do|switch|case|break|continue|class|new|import|export|from|async|await|try|catch|finally|throw|typeof|instanceof|extends|super|this|null|undefined|true|false|delete|in|of|yield)\\b",
|
|
25
|
+
},
|
|
26
|
+
{ type: "function", source: "\\b[A-Za-z_$][\\w$]*(?=\\s*\\()" },
|
|
27
|
+
{ type: "property", source: "(?<=\\.)[A-Za-z_$][\\w$]*" },
|
|
28
|
+
{ type: "operator", source: "=>|===|!==|==|!=|<=|>=|&&|\\|\\||[+\\-*/%!<>=&|^~?:]" },
|
|
26
29
|
],
|
|
27
30
|
json: [
|
|
28
|
-
{type: "key", source: "
|
|
29
|
-
{type: "string", source: "
|
|
30
|
-
{type: "number", source: "-?\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b"},
|
|
31
|
-
{type: "keyword", source: "\\b(?:true|false|null)\\b"},
|
|
32
|
-
{type: "operator", source: "[{}\\[\\],:]"}
|
|
31
|
+
{ type: "key", source: '"(?:\\\\.|[^"\\\\])*"(?=\\s*:)' },
|
|
32
|
+
{ type: "string", source: '"(?:\\\\.|[^"\\\\])*"' },
|
|
33
|
+
{ type: "number", source: "-?\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b" },
|
|
34
|
+
{ type: "keyword", source: "\\b(?:true|false|null)\\b" },
|
|
35
|
+
{ type: "operator", source: "[{}\\[\\],:]" },
|
|
33
36
|
],
|
|
34
37
|
css: [
|
|
35
|
-
{type: "comment", source: "/\\*[\\s\\S]*?\\*/"},
|
|
36
|
-
{type: "keyword", source: "@[a-zA-Z-]+"},
|
|
37
|
-
{type: "string", source: "\"(?:\\\\.|[^\"\\\\\n])*\"|'(?:\\\\.|[^'\\\\\n])*'"},
|
|
38
|
+
{ type: "comment", source: "/\\*[\\s\\S]*?\\*/" },
|
|
39
|
+
{ type: "keyword", source: "@[a-zA-Z-]+" },
|
|
40
|
+
{ type: "string", source: "\"(?:\\\\.|[^\"\\\\\n])*\"|'(?:\\\\.|[^'\\\\\n])*'" },
|
|
38
41
|
// Цвета проверяем раньше селекторов: #ff9500 иначе считался бы идентификатором
|
|
39
|
-
{type: "color", source: "#[0-9a-fA-F]{3,8}\\b"},
|
|
40
|
-
{type: "selector", source: "[.#][A-Za-z_][\\w-]*|(?<=^|\\s|,)[a-zA-Z][\\w-]*(?=\\s*[,{])"},
|
|
41
|
-
{type: "property", source: "[a-zA-Z-]+(?=\\s*:)"},
|
|
42
|
-
{type: "number", source: "-?\\b\\d+(?:\\.\\d+)?(?:px|em|rem|%|vh|vw|s|ms|deg|fr)?\\b"},
|
|
43
|
-
{type: "operator", source: "[{};:,]"}
|
|
44
|
-
]
|
|
42
|
+
{ type: "color", source: "#[0-9a-fA-F]{3,8}\\b" },
|
|
43
|
+
{ type: "selector", source: "[.#][A-Za-z_][\\w-]*|(?<=^|\\s|,)[a-zA-Z][\\w-]*(?=\\s*[,{])" },
|
|
44
|
+
{ type: "property", source: "[a-zA-Z-]+(?=\\s*:)" },
|
|
45
|
+
{ type: "number", source: "-?\\b\\d+(?:\\.\\d+)?(?:px|em|rem|%|vh|vw|s|ms|deg|fr)?\\b" },
|
|
46
|
+
{ type: "operator", source: "[{};:,]" },
|
|
47
|
+
],
|
|
45
48
|
};
|
|
46
49
|
|
|
47
50
|
/** Языки, для которых есть правила подсветки */
|
|
@@ -1,37 +1,40 @@
|
|
|
1
|
-
/* Токены подсветки кода (модуль chui_highlight)
|
|
2
|
-
|
|
1
|
+
/* Токены подсветки кода (модуль chui_highlight). Цвета живут в общей палитре
|
|
2
|
+
(`--code_token_*` в `main_theme_style.css`) и у каждой схемы свои: акценты палитры,
|
|
3
|
+
приглушённые к заливке кода до нормы 4.5 — прежде здесь стояли цвета только тёмной
|
|
4
|
+
колонки, и в светлой схеме примеры читались тускло. Подключается самим модулем,
|
|
5
|
+
поэтому подсветка работает у любого потребителя. */
|
|
3
6
|
.code_token_comment {
|
|
4
|
-
color: var(--
|
|
7
|
+
color: var(--code_token_comment);
|
|
5
8
|
font-style: italic;
|
|
6
9
|
}
|
|
7
10
|
|
|
8
11
|
.code_token_string {
|
|
9
|
-
color:
|
|
12
|
+
color: var(--code_token_string);
|
|
10
13
|
}
|
|
11
14
|
|
|
12
15
|
.code_token_number {
|
|
13
|
-
color:
|
|
16
|
+
color: var(--code_token_number);
|
|
14
17
|
}
|
|
15
18
|
|
|
16
19
|
.code_token_keyword {
|
|
17
|
-
color:
|
|
20
|
+
color: var(--code_token_keyword);
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
.code_token_function {
|
|
21
|
-
color:
|
|
24
|
+
color: var(--code_token_function);
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
.code_token_property,
|
|
25
28
|
.code_token_key {
|
|
26
|
-
color:
|
|
29
|
+
color: var(--code_token_property);
|
|
27
30
|
}
|
|
28
31
|
|
|
29
32
|
.code_token_selector {
|
|
30
|
-
color:
|
|
33
|
+
color: var(--code_token_selector);
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
.code_token_color {
|
|
34
|
-
color:
|
|
37
|
+
color: var(--code_token_color);
|
|
35
38
|
}
|
|
36
39
|
|
|
37
40
|
.code_token_operator {
|
|
@@ -29,16 +29,16 @@ const NAMESPACES = [
|
|
|
29
29
|
require("./locales/navigation"),
|
|
30
30
|
require("./locales/forms"),
|
|
31
31
|
require("./locales/feedback"),
|
|
32
|
-
require("./locales/graphics")
|
|
32
|
+
require("./locales/graphics"),
|
|
33
33
|
];
|
|
34
34
|
|
|
35
35
|
/** Направление письма по умолчанию для известных языков: остальные считаются LTR */
|
|
36
|
-
const DIRECTIONS = {ar: "rtl", he: "rtl", fa: "rtl", ur: "rtl"};
|
|
36
|
+
const DIRECTIONS = { ar: "rtl", he: "rtl", fa: "rtl", ur: "rtl" };
|
|
37
37
|
|
|
38
38
|
const FALLBACK = "ru";
|
|
39
39
|
|
|
40
40
|
function buildDictionaries() {
|
|
41
|
-
const dictionaries = {ru: {}, en: {}};
|
|
41
|
+
const dictionaries = { ru: {}, en: {} };
|
|
42
42
|
for (const namespace of NAMESPACES) {
|
|
43
43
|
for (const locale of Object.keys(namespace)) {
|
|
44
44
|
if (dictionaries[locale] === undefined) dictionaries[locale] = {};
|
|
@@ -90,7 +90,7 @@ class I18n {
|
|
|
90
90
|
/** Сменить направление вручную: `"ltr"` или `"rtl"` */
|
|
91
91
|
static setDirection(direction = String(), silent = false) {
|
|
92
92
|
const next = direction === "rtl" ? "rtl" : "ltr";
|
|
93
|
-
const changed = next !== this.#direction || this.#locale !== this.#
|
|
93
|
+
const changed = next !== this.#direction || this.#locale !== this.#appliedLocale;
|
|
94
94
|
this.#direction = next;
|
|
95
95
|
this.#apply();
|
|
96
96
|
if (!silent && changed) this.#emit();
|
|
@@ -111,7 +111,9 @@ class I18n {
|
|
|
111
111
|
if (entry === undefined) return String(key);
|
|
112
112
|
const template = typeof entry === "object" && entry !== null ? this.#pluralForm(entry, params) : entry;
|
|
113
113
|
if (params === undefined) return template;
|
|
114
|
-
return template.replace(/\{(\w+)\}/g, (match, name) =>
|
|
114
|
+
return template.replace(/\{(\w+)\}/g, (match, name) =>
|
|
115
|
+
params[name] === undefined ? match : String(params[name])
|
|
116
|
+
);
|
|
115
117
|
}
|
|
116
118
|
|
|
117
119
|
/** Форма числа по правилам языка: `count` обязателен, иначе берётся `other` */
|
|
@@ -137,7 +139,7 @@ class I18n {
|
|
|
137
139
|
|
|
138
140
|
/** Словарь языка целиком (для инструментов и тестов) */
|
|
139
141
|
static getMessages(locale = this.#locale) {
|
|
140
|
-
return {...(this.#dictionaries[locale] === undefined ? {} : this.#dictionaries[locale])};
|
|
142
|
+
return { ...(this.#dictionaries[locale] === undefined ? {} : this.#dictionaries[locale]) };
|
|
141
143
|
}
|
|
142
144
|
|
|
143
145
|
/**
|
|
@@ -159,7 +161,7 @@ class I18n {
|
|
|
159
161
|
}
|
|
160
162
|
|
|
161
163
|
// Язык, для которого уже проставлены атрибуты документа (чтобы не дёргать DOM зря)
|
|
162
|
-
static #
|
|
164
|
+
static #appliedLocale = undefined;
|
|
163
165
|
|
|
164
166
|
static #lookup(key) {
|
|
165
167
|
const current = this.#dictionaries[this.#locale];
|
|
@@ -174,7 +176,7 @@ class I18n {
|
|
|
174
176
|
if (typeof document === "undefined" || document.documentElement === null) return;
|
|
175
177
|
document.documentElement.setAttribute("dir", this.#direction);
|
|
176
178
|
document.documentElement.setAttribute("lang", this.#locale);
|
|
177
|
-
this.#
|
|
179
|
+
this.#appliedLocale = this.#locale;
|
|
178
180
|
}
|
|
179
181
|
|
|
180
182
|
static #emit() {
|
|
@@ -182,8 +184,8 @@ class I18n {
|
|
|
182
184
|
}
|
|
183
185
|
}
|
|
184
186
|
|
|
185
|
-
exports.I18n = I18n
|
|
186
|
-
exports.I18N_DIRECTIONS = DIRECTIONS
|
|
187
|
+
exports.I18n = I18n;
|
|
188
|
+
exports.I18N_DIRECTIONS = DIRECTIONS;
|
|
187
189
|
|
|
188
190
|
// При загрузке в рендерере документ сразу получает `dir` и `lang` по умолчанию:
|
|
189
191
|
// без атрибута стили с логическими свойствами не знают направления
|
|
@@ -18,7 +18,7 @@ module.exports = {
|
|
|
18
18
|
"a11y.sideBottom": "Снизу",
|
|
19
19
|
"a11y.previous": "Назад",
|
|
20
20
|
"a11y.next": "Вперёд",
|
|
21
|
-
"a11y.splitterValue": "{first} {firstPercent}%, {second} {secondPercent}% (всего {total}%)"
|
|
21
|
+
"a11y.splitterValue": "{first} {firstPercent}%, {second} {secondPercent}% (всего {total}%)",
|
|
22
22
|
},
|
|
23
23
|
en: {
|
|
24
24
|
"a11y.closeDialog": "Close dialog",
|
|
@@ -26,8 +26,8 @@ module.exports = {
|
|
|
26
26
|
"a11y.closeMessage": "Close message",
|
|
27
27
|
"a11y.resizePanel": "Resize panels",
|
|
28
28
|
"a11y.resizePanelHint": "Drag to resize, double-click to restore the original sizes",
|
|
29
|
-
"a11y.expandNode":
|
|
30
|
-
"a11y.collapseNode":
|
|
29
|
+
"a11y.expandNode": 'Expand "{name}"',
|
|
30
|
+
"a11y.collapseNode": 'Collapse "{name}"',
|
|
31
31
|
"a11y.backToTop": "Back to top",
|
|
32
32
|
"a11y.sideLeft": "Left",
|
|
33
33
|
"a11y.sideRight": "Right",
|
|
@@ -35,6 +35,6 @@ module.exports = {
|
|
|
35
35
|
"a11y.sideBottom": "Bottom",
|
|
36
36
|
"a11y.previous": "Previous",
|
|
37
37
|
"a11y.next": "Next",
|
|
38
|
-
"a11y.splitterValue": "{first} {firstPercent}%, {second} {secondPercent}% ({total}% total)"
|
|
39
|
-
}
|
|
38
|
+
"a11y.splitterValue": "{first} {firstPercent}%, {second} {secondPercent}% ({total}% total)",
|
|
39
|
+
},
|
|
40
40
|
};
|
|
@@ -12,7 +12,7 @@ module.exports = {
|
|
|
12
12
|
"appLayout.search.placeholder": "Поиск...",
|
|
13
13
|
"appLayout.search.sections": "Поиск по разделам",
|
|
14
14
|
"appLayout.search.empty": "Ничего не найдено",
|
|
15
|
-
"appLayout.search.alreadyAdded":
|
|
15
|
+
"appLayout.search.alreadyAdded": 'Страница "{title}" уже добавлена в меню',
|
|
16
16
|
"appLayout.notifications.title": "Уведомления",
|
|
17
17
|
"appLayout.notifications.empty": "Уведомлений пока нет",
|
|
18
18
|
"appLayout.notifications.today": "Сегодня",
|
|
@@ -30,7 +30,7 @@ module.exports = {
|
|
|
30
30
|
"appLayout.update.downloaded": "Загрузка завершена",
|
|
31
31
|
"appLayout.update.downloading": "Загрузка новой версии {version}",
|
|
32
32
|
"appLayout.recentDocuments": "Открыть последние",
|
|
33
|
-
"appLayout.clearRecentDocuments": "Очистить список"
|
|
33
|
+
"appLayout.clearRecentDocuments": "Очистить список",
|
|
34
34
|
},
|
|
35
35
|
en: {
|
|
36
36
|
"appLayout.window.close": "Close",
|
|
@@ -41,7 +41,7 @@ module.exports = {
|
|
|
41
41
|
"appLayout.search.placeholder": "Search...",
|
|
42
42
|
"appLayout.search.sections": "Search sections",
|
|
43
43
|
"appLayout.search.empty": "Nothing found",
|
|
44
|
-
"appLayout.search.alreadyAdded":
|
|
44
|
+
"appLayout.search.alreadyAdded": 'Page "{title}" is already in the menu',
|
|
45
45
|
"appLayout.notifications.title": "Notifications",
|
|
46
46
|
"appLayout.notifications.empty": "No notifications yet",
|
|
47
47
|
"appLayout.notifications.today": "Today",
|
|
@@ -59,6 +59,6 @@ module.exports = {
|
|
|
59
59
|
"appLayout.update.downloaded": "Download complete",
|
|
60
60
|
"appLayout.update.downloading": "Downloading version {version}",
|
|
61
61
|
"appLayout.recentDocuments": "Open recent",
|
|
62
|
-
"appLayout.clearRecentDocuments": "Clear list"
|
|
63
|
-
}
|
|
62
|
+
"appLayout.clearRecentDocuments": "Clear list",
|
|
63
|
+
},
|
|
64
64
|
};
|
|
@@ -49,7 +49,7 @@ module.exports = {
|
|
|
49
49
|
"gantt.task": "Задача",
|
|
50
50
|
"gantt.empty": "Задач нет",
|
|
51
51
|
"gantt.progress": "выполнено {progress}%",
|
|
52
|
-
"gantt.dependsOn": "зависит от: {tasks}"
|
|
52
|
+
"gantt.dependsOn": "зависит от: {tasks}",
|
|
53
53
|
},
|
|
54
54
|
en: {
|
|
55
55
|
"date.calendar": "Calendar",
|
|
@@ -95,6 +95,6 @@ module.exports = {
|
|
|
95
95
|
"gantt.task": "Task",
|
|
96
96
|
"gantt.empty": "No tasks",
|
|
97
97
|
"gantt.progress": "{progress}% done",
|
|
98
|
-
"gantt.dependsOn": "depends on: {tasks}"
|
|
99
|
-
}
|
|
98
|
+
"gantt.dependsOn": "depends on: {tasks}",
|
|
99
|
+
},
|
|
100
100
|
};
|
|
@@ -28,7 +28,7 @@ module.exports = {
|
|
|
28
28
|
"common.expand": "Развернуть",
|
|
29
29
|
"common.collapse": "Свернуть",
|
|
30
30
|
"common.today": "Сегодня",
|
|
31
|
-
"common.yesterday": "Вчера"
|
|
31
|
+
"common.yesterday": "Вчера",
|
|
32
32
|
},
|
|
33
33
|
en: {
|
|
34
34
|
"common.close": "Close",
|
|
@@ -55,6 +55,6 @@ module.exports = {
|
|
|
55
55
|
"common.expand": "Expand",
|
|
56
56
|
"common.collapse": "Collapse",
|
|
57
57
|
"common.today": "Today",
|
|
58
|
-
"common.yesterday": "Yesterday"
|
|
59
|
-
}
|
|
58
|
+
"common.yesterday": "Yesterday",
|
|
59
|
+
},
|
|
60
60
|
};
|