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.
Files changed (292) hide show
  1. package/CHANGELOG.md +597 -0
  2. package/README.md +43 -644
  3. package/framework/appLayout/default/chui_app_layout.js +602 -496
  4. package/framework/appLayout/default/global_style.css +288 -97
  5. package/framework/appLayout/default/main_theme_style.css +188 -101
  6. package/framework/components/chui_accordion/accordion.js +38 -35
  7. package/framework/components/chui_accordion/styles.css +13 -12
  8. package/framework/components/chui_action_sheet/action_sheet.js +93 -64
  9. package/framework/components/chui_action_sheet/styles.css +12 -5
  10. package/framework/components/chui_actions_bar/actions_bar.js +338 -0
  11. package/framework/components/chui_actions_bar/styles.css +139 -0
  12. package/framework/components/chui_affix/affix.js +16 -11
  13. package/framework/components/chui_affix/styles.css +5 -0
  14. package/framework/components/chui_alert/alert.js +34 -19
  15. package/framework/components/chui_alert/styles.css +7 -0
  16. package/framework/components/chui_avatar/avatar.js +36 -35
  17. package/framework/components/chui_avatar/styles.css +1 -1
  18. package/framework/components/chui_avatar_group/avatar_group.js +25 -23
  19. package/framework/components/chui_avatar_group/styles.css +1 -1
  20. package/framework/components/chui_backtop/backtop.js +60 -21
  21. package/framework/components/chui_backtop/styles.css +21 -0
  22. package/framework/components/chui_badge/badge.js +30 -28
  23. package/framework/components/chui_badge/styles.css +6 -6
  24. package/framework/components/chui_banner/banner.js +222 -0
  25. package/framework/components/chui_banner/styles.css +170 -0
  26. package/framework/components/chui_breadcrumb/breadcrumb.js +15 -13
  27. package/framework/components/chui_breadcrumb/styles.css +1 -1
  28. package/framework/components/chui_button/button.js +52 -36
  29. package/framework/components/chui_button/styles.css +7 -7
  30. package/framework/components/chui_calendar/calendar.js +18 -16
  31. package/framework/components/chui_card/card.js +52 -32
  32. package/framework/components/chui_card_scroll/card_scroll.js +169 -0
  33. package/framework/components/chui_card_scroll/styles.css +86 -0
  34. package/framework/components/chui_chat/chat.js +140 -79
  35. package/framework/components/chui_chat/styles.css +18 -7
  36. package/framework/components/chui_clipboard_history/clipboard_history.js +53 -39
  37. package/framework/components/chui_clipboard_history/styles.css +13 -9
  38. package/framework/components/chui_code/code.js +10 -10
  39. package/framework/components/chui_code/styles.css +4 -4
  40. package/framework/components/chui_code_editor/code_editor.js +73 -57
  41. package/framework/components/chui_code_editor/styles.css +6 -5
  42. package/framework/components/chui_command_palette/command_palette.js +87 -64
  43. package/framework/components/chui_command_palette/styles.css +5 -5
  44. package/framework/components/chui_console/console.js +13 -13
  45. package/framework/components/chui_console/styles.css +6 -3
  46. package/framework/components/chui_content_block/content_block.js +35 -21
  47. package/framework/components/chui_content_block/styles.css +2 -2
  48. package/framework/components/chui_context_menu/context_menu.js +171 -58
  49. package/framework/components/chui_context_menu/styles.css +82 -8
  50. package/framework/components/chui_custom_element/custom_element.js +25 -18
  51. package/framework/components/chui_data_grid/data_grid.js +633 -471
  52. package/framework/components/chui_data_grid/styles.css +24 -22
  53. package/framework/components/chui_descriptions/descriptions.js +34 -17
  54. package/framework/components/chui_descriptions/styles.css +1 -1
  55. package/framework/components/chui_details/details.js +42 -36
  56. package/framework/components/chui_details/styles.css +12 -11
  57. package/framework/components/chui_diff_viewer/diff_viewer.js +172 -147
  58. package/framework/components/chui_diff_viewer/styles.css +10 -10
  59. package/framework/components/chui_divider/divider.js +19 -17
  60. package/framework/components/chui_divider/styles.css +2 -2
  61. package/framework/components/chui_drawer/drawer.js +63 -38
  62. package/framework/components/chui_drawer/styles.css +18 -4
  63. package/framework/components/chui_drop_zone/drop_zone.js +37 -27
  64. package/framework/components/chui_drop_zone/styles.css +10 -6
  65. package/framework/components/chui_empty_state/empty_state.js +20 -15
  66. package/framework/components/chui_fieldset/fieldset.js +40 -23
  67. package/framework/components/chui_fieldset/styles.css +6 -6
  68. package/framework/components/chui_file_explorer/file_explorer.js +260 -189
  69. package/framework/components/chui_file_explorer/styles.css +8 -7
  70. package/framework/components/chui_form/form.js +40 -28
  71. package/framework/components/chui_form/styles.css +1 -1
  72. package/framework/components/chui_gantt/gantt.js +102 -78
  73. package/framework/components/chui_gantt/styles.css +5 -5
  74. package/framework/components/chui_graphs/graphs.js +376 -239
  75. package/framework/components/chui_graphs/styles.css +27 -6
  76. package/framework/components/chui_hero/hero.js +98 -37
  77. package/framework/components/chui_hero/styles.css +176 -7
  78. package/framework/components/chui_html_block/html_block.js +8 -8
  79. package/framework/components/chui_html_block/styles.css +3 -3
  80. package/framework/components/chui_hx/hx.js +3 -3
  81. package/framework/components/chui_hx/styles.css +13 -6
  82. package/framework/components/chui_icons/icons.js +2115 -2115
  83. package/framework/components/chui_icons/styles.css +4 -3
  84. package/framework/components/chui_inputs/chui_check_box/check_box.js +31 -19
  85. package/framework/components/chui_inputs/chui_check_box/styles.css +30 -21
  86. package/framework/components/chui_inputs/chui_chips/chips.js +141 -70
  87. package/framework/components/chui_inputs/chui_chips/styles.css +32 -7
  88. package/framework/components/chui_inputs/chui_color_picker/color_picker.js +55 -38
  89. package/framework/components/chui_inputs/chui_color_picker/styles.css +7 -7
  90. package/framework/components/chui_inputs/chui_combo_box/combo_box.js +127 -109
  91. package/framework/components/chui_inputs/chui_combo_box/styles.css +23 -21
  92. package/framework/components/chui_inputs/chui_date/date.js +161 -127
  93. package/framework/components/chui_inputs/chui_date/styles.css +20 -19
  94. package/framework/components/chui_inputs/chui_date_range/date_range.js +61 -50
  95. package/framework/components/chui_inputs/chui_date_range/styles.css +3 -3
  96. package/framework/components/chui_inputs/chui_datetime/datetime.js +47 -39
  97. package/framework/components/chui_inputs/chui_datetime/styles.css +3 -3
  98. package/framework/components/chui_inputs/chui_email/email.js +48 -36
  99. package/framework/components/chui_inputs/chui_email/styles.css +11 -11
  100. package/framework/components/chui_inputs/chui_file/file.js +71 -44
  101. package/framework/components/chui_inputs/chui_file/styles.css +23 -19
  102. package/framework/components/chui_inputs/chui_hotkey/hotkey.js +101 -76
  103. package/framework/components/chui_inputs/chui_hotkey/styles.css +6 -6
  104. package/framework/components/chui_inputs/chui_masked/masked.js +83 -72
  105. package/framework/components/chui_inputs/chui_masked/styles.css +5 -5
  106. package/framework/components/chui_inputs/chui_mention/mention.js +87 -40
  107. package/framework/components/chui_inputs/chui_mention/styles.css +14 -8
  108. package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +242 -212
  109. package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +23 -15
  110. package/framework/components/chui_inputs/chui_number/number.js +84 -70
  111. package/framework/components/chui_inputs/chui_number/styles.css +13 -13
  112. package/framework/components/chui_inputs/chui_otp/otp.js +71 -62
  113. package/framework/components/chui_inputs/chui_otp/styles.css +5 -5
  114. package/framework/components/chui_inputs/chui_password/password.js +72 -56
  115. package/framework/components/chui_inputs/chui_password/styles.css +15 -15
  116. package/framework/components/chui_inputs/chui_radio_button/radio_button.js +37 -25
  117. package/framework/components/chui_inputs/chui_radio_button/styles.css +22 -22
  118. package/framework/components/chui_inputs/chui_rating/rating.js +54 -50
  119. package/framework/components/chui_inputs/chui_rating/styles.css +3 -3
  120. package/framework/components/chui_inputs/chui_select_box/select_box.js +132 -108
  121. package/framework/components/chui_inputs/chui_select_box/styles.css +21 -21
  122. package/framework/components/chui_inputs/chui_slider/slider.js +41 -38
  123. package/framework/components/chui_inputs/chui_slider/styles.css +7 -5
  124. package/framework/components/chui_inputs/chui_text/styles.css +14 -14
  125. package/framework/components/chui_inputs/chui_text/text.js +69 -52
  126. package/framework/components/chui_inputs/chui_text_area/styles.css +14 -14
  127. package/framework/components/chui_inputs/chui_text_area/text_area.js +59 -36
  128. package/framework/components/chui_inputs/chui_time/styles.css +18 -20
  129. package/framework/components/chui_inputs/chui_time/time.js +71 -49
  130. package/framework/components/chui_inputs/chui_toggle/styles.css +13 -6
  131. package/framework/components/chui_inputs/chui_toggle/toggle.js +27 -27
  132. package/framework/components/chui_json_editor/json_editor.js +137 -127
  133. package/framework/components/chui_json_editor/styles.css +5 -5
  134. package/framework/components/chui_json_viewer/json_viewer.js +133 -114
  135. package/framework/components/chui_json_viewer/styles.css +9 -8
  136. package/framework/components/chui_kanban/kanban.js +78 -60
  137. package/framework/components/chui_kanban/styles.css +8 -4
  138. package/framework/components/chui_kbd/kbd.js +12 -10
  139. package/framework/components/chui_kbd/styles.css +1 -1
  140. package/framework/components/chui_label/label.js +31 -29
  141. package/framework/components/chui_label/styles.css +3 -3
  142. package/framework/components/chui_link/link.js +36 -29
  143. package/framework/components/chui_link/styles.css +11 -4
  144. package/framework/components/chui_list/list.js +42 -38
  145. package/framework/components/chui_list/styles.css +4 -3
  146. package/framework/components/chui_markdown_editor/markdown_editor.js +125 -109
  147. package/framework/components/chui_markdown_editor/styles.css +5 -5
  148. package/framework/components/chui_media/audio.js +457 -364
  149. package/framework/components/chui_media/audio_styles.css +74 -37
  150. package/framework/components/chui_media/image.js +99 -64
  151. package/framework/components/chui_media/image_compare.js +86 -55
  152. package/framework/components/chui_media/image_compare_styles.css +5 -5
  153. package/framework/components/chui_media/image_styles.css +4 -4
  154. package/framework/components/chui_media/video.js +264 -171
  155. package/framework/components/chui_media/video_styles.css +57 -24
  156. package/framework/components/chui_menu_bar/menu_bar.js +67 -65
  157. package/framework/components/chui_menu_bar/styles.css +14 -12
  158. package/framework/components/chui_message_bar/message_bar.js +551 -0
  159. package/framework/components/chui_message_bar/styles.css +248 -0
  160. package/framework/components/chui_modal/modal.js +81 -56
  161. package/framework/components/chui_modal/styles.css +3 -2
  162. package/framework/components/chui_notification/notification.js +107 -69
  163. package/framework/components/chui_notification/notification_download.js +28 -77
  164. package/framework/components/chui_notification/notification_download_card.js +115 -0
  165. package/framework/components/chui_notification/notification_download_progress.css +5 -4
  166. package/framework/components/chui_notification/notification_download_progress.js +73 -105
  167. package/framework/components/chui_notification/notification_update.js +44 -37
  168. package/framework/components/chui_notification/status_plate.css +3 -3
  169. package/framework/components/chui_notification/status_plate.js +2 -2
  170. package/framework/components/chui_notification/styles.css +6 -1
  171. package/framework/components/chui_notification/styles_download.css +2 -2
  172. package/framework/components/chui_notification/styles_update.css +3 -3
  173. package/framework/components/chui_org_chart/org_chart.js +101 -62
  174. package/framework/components/chui_org_chart/styles.css +2 -2
  175. package/framework/components/chui_pagination/pagination.js +65 -30
  176. package/framework/components/chui_pagination/styles.css +1 -1
  177. package/framework/components/chui_paragraph/paragraph.js +2 -2
  178. package/framework/components/chui_paragraph/styles.css +3 -3
  179. package/framework/components/chui_popover/popover.js +77 -50
  180. package/framework/components/chui_popover/styles.css +1 -1
  181. package/framework/components/chui_popups/popups.js +210 -181
  182. package/framework/components/chui_popups/styles.css +7 -7
  183. package/framework/components/chui_print_button/print_button.js +48 -33
  184. package/framework/components/chui_progress_bar/progress_bar.js +49 -19
  185. package/framework/components/chui_progress_bar/styles.css +6 -6
  186. package/framework/components/chui_progress_ring/progress_ring.js +32 -30
  187. package/framework/components/chui_progress_ring/styles.css +1 -1
  188. package/framework/components/chui_qrcode/qrcode.js +85 -41
  189. package/framework/components/chui_query_builder/query_builder.js +263 -170
  190. package/framework/components/chui_query_builder/styles.css +4 -4
  191. package/framework/components/chui_radio_group/radio_group.js +36 -26
  192. package/framework/components/chui_radio_group/styles.css +2 -2
  193. package/framework/components/chui_result/result.js +41 -31
  194. package/framework/components/chui_result/styles.css +3 -3
  195. package/framework/components/chui_scheduler/scheduler.js +126 -104
  196. package/framework/components/chui_scheduler/styles.css +11 -7
  197. package/framework/components/chui_screen_spinner/screen_spinner.js +167 -0
  198. package/framework/components/chui_screen_spinner/styles.css +49 -0
  199. package/framework/components/chui_segmented_control/segmented_control.js +90 -27
  200. package/framework/components/chui_segmented_control/styles.css +32 -6
  201. package/framework/components/chui_settings/settings.js +160 -87
  202. package/framework/components/chui_settings/styles.css +4 -4
  203. package/framework/components/chui_shortcut_help/shortcut_help.js +82 -61
  204. package/framework/components/chui_sidebar_nav/sidebar_nav.js +132 -53
  205. package/framework/components/chui_sidebar_nav/styles.css +9 -3
  206. package/framework/components/chui_skeleton/skeleton.js +29 -24
  207. package/framework/components/chui_slideshow/slideshow.js +122 -103
  208. package/framework/components/chui_slideshow/styles.css +22 -16
  209. package/framework/components/chui_spinner/spinner.js +17 -17
  210. package/framework/components/chui_spinner/styles.css +0 -1
  211. package/framework/components/chui_split_button/split_button.js +53 -30
  212. package/framework/components/chui_split_button/styles.css +22 -6
  213. package/framework/components/chui_splitter/splitter.js +46 -39
  214. package/framework/components/chui_splitter/styles.css +2 -2
  215. package/framework/components/chui_statistic/statistic.js +111 -84
  216. package/framework/components/chui_status_bar/status_bar.js +11 -9
  217. package/framework/components/chui_status_bar/styles.css +2 -2
  218. package/framework/components/chui_stepper/stepper.js +230 -54
  219. package/framework/components/chui_stepper/styles.css +79 -14
  220. package/framework/components/chui_sticky_bar/sticky_bar.js +53 -17
  221. package/framework/components/chui_sticky_bar/styles.css +11 -7
  222. package/framework/components/chui_tabs/chui_tabs.js +100 -46
  223. package/framework/components/chui_tabs/styles.css +43 -15
  224. package/framework/components/chui_text_editor/styles.css +24 -23
  225. package/framework/components/chui_text_editor/text_editor.js +103 -79
  226. package/framework/components/chui_text_editor/text_editor_panel.js +428 -367
  227. package/framework/components/chui_theme_toggle/theme_toggle.js +46 -25
  228. package/framework/components/chui_timeline/styles.css +3 -1
  229. package/framework/components/chui_timeline/timeline.js +14 -12
  230. package/framework/components/chui_toast_queue/styles.css +11 -11
  231. package/framework/components/chui_toast_queue/toast_queue.js +82 -73
  232. package/framework/components/chui_toolbar/styles.css +2 -2
  233. package/framework/components/chui_toolbar/toolbar.js +20 -13
  234. package/framework/components/chui_tooltip/styles.css +2 -2
  235. package/framework/components/chui_tooltip/tooltip.js +40 -27
  236. package/framework/components/chui_tour/styles.css +12 -7
  237. package/framework/components/chui_tour/tour.js +132 -98
  238. package/framework/components/chui_transfer/styles.css +8 -7
  239. package/framework/components/chui_transfer/transfer.js +143 -123
  240. package/framework/components/chui_tree_table/styles.css +4 -4
  241. package/framework/components/chui_tree_table/tree_table.js +88 -74
  242. package/framework/components/chui_tree_view/styles.css +14 -10
  243. package/framework/components/chui_tree_view/tree_view.js +298 -253
  244. package/framework/components/chui_user_bar/styles.css +145 -0
  245. package/framework/components/chui_user_bar/user_bar.js +402 -0
  246. package/framework/components/chui_user_list_bar/styles.css +173 -0
  247. package/framework/components/chui_user_list_bar/user_list_bar.js +485 -0
  248. package/framework/components/chui_watermark/watermark.js +41 -33
  249. package/framework/components/chui_webview/styles.css +2 -2
  250. package/framework/components/chui_webview/webview.js +64 -52
  251. package/framework/components/chui_write_bar/styles.css +172 -0
  252. package/framework/components/chui_write_bar/write_bar.js +320 -0
  253. package/framework/main_window.js +1234 -0
  254. package/framework/modules/chui_a11y/chui_a11y.js +153 -123
  255. package/framework/modules/chui_animations/animations.js +105 -43
  256. package/framework/modules/chui_animations/motion.js +120 -0
  257. package/framework/modules/chui_animations/styles.css +37 -4
  258. package/framework/modules/chui_bridge/preload.js +36 -25
  259. package/framework/modules/chui_functions.js +69 -63
  260. package/framework/modules/chui_highlight/chui_highlight.js +25 -22
  261. package/framework/modules/chui_highlight/styles.css +13 -10
  262. package/framework/modules/chui_i18n/chui_i18n.js +12 -10
  263. package/framework/modules/chui_i18n/locales/a11y.js +5 -5
  264. package/framework/modules/chui_i18n/locales/app_layout.js +5 -5
  265. package/framework/modules/chui_i18n/locales/calendar.js +3 -3
  266. package/framework/modules/chui_i18n/locales/common.js +3 -3
  267. package/framework/modules/chui_i18n/locales/data.js +36 -26
  268. package/framework/modules/chui_i18n/locales/editors.js +40 -13
  269. package/framework/modules/chui_i18n/locales/feedback.js +65 -3
  270. package/framework/modules/chui_i18n/locales/forms.js +8 -8
  271. package/framework/modules/chui_i18n/locales/graphics.js +8 -8
  272. package/framework/modules/chui_i18n/locales/media.js +4 -4
  273. package/framework/modules/chui_i18n/locales/navigation.js +12 -8
  274. package/framework/modules/chui_i18n/locales/validate.js +3 -3
  275. package/framework/modules/chui_json/chui_json.js +11 -11
  276. package/framework/modules/chui_layout/chui_layout.js +12 -10
  277. package/framework/modules/chui_logger/chui_logger.js +47 -28
  278. package/framework/modules/chui_page/page.js +39 -33
  279. package/framework/modules/chui_palette/palette.js +61 -0
  280. package/framework/modules/chui_qr/chui_qr.js +179 -88
  281. package/framework/modules/chui_scrollbar/chui_scrollbar.js +79 -68
  282. package/framework/modules/chui_scrollbar/styles.css +4 -2
  283. package/framework/modules/chui_services/chui_channels.js +27 -13
  284. package/framework/modules/chui_services/chui_services.js +47 -39
  285. package/framework/modules/chui_services/desktop.js +108 -101
  286. package/framework/modules/chui_sortable/chui_sortable.js +33 -28
  287. package/framework/modules/chui_validate/chui_validate.js +10 -7
  288. package/framework/tray_bar/chui_menu_items.js +136 -46
  289. package/index.d.ts +5046 -0
  290. package/index.js +199 -1254
  291. package/package.json +81 -68
  292. 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 styles_cache = new Map();
8
+ const stylesCache = new Map();
9
9
 
10
10
  function setStyles(pathToCSS = String(), component = String()) {
11
- if (document.getElementById(component) != null) return;
12
- if (styles_cache.has(pathToCSS) === false) styles_cache.set(pathToCSS, fs.readFileSync(pathToCSS, 'utf8'));
13
- let style = document.createElement('style');
14
- style.innerHTML = styles_cache.get(pathToCSS);
15
- style.type = 'text/css';
16
- style.setAttribute('id', component);
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 style_parse(json, component) {
23
+ function parseStyle(json, component) {
21
24
  // Сначала проверяем, что стиль уже есть: сборка строки стоит дорого (для шрифтов — мегабайты)
22
- if (document.getElementById(component) != null) return;
23
- let stringz = JSON.parse(JSON.stringify(json));
24
- let style_string = [];
25
- for (let i = 0; i < stringz.length; i++) {
26
- style_string.push(`${stringz[i].name} {`)
27
- JSON.parse(JSON.stringify(stringz[i].style), function(key, value) {
28
- if (typeof value !== 'object') style_string.push(`${key}:${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
- style_string.push(`}\n`)
34
+ styleParts.push(`}\n`);
32
35
  }
33
- let style = document.createElement('style');
34
- style.innerText = style_string.join("").slice(0, -1);
35
- style.type = 'text/css';
36
- style.setAttribute('id', component);
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 === 'loading') window.addEventListener('DOMContentLoaded', run, { once: true });
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('path').join(__dirname, 'chui_icon.png');
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 = /(auto|scroll|overlay|hidden)/.test(style.overflowY) ||
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 markdown_parser = undefined;
120
+ let markdownParser = undefined;
117
121
  function markdownToHtml(text = String()) {
118
122
  if (text === undefined || text === null || String(text) === "") return "";
119
- if (markdown_parser === undefined) markdown_parser = new (require('markdown-it'))({html: false, linkify: false, breaks: false});
120
- return markdown_parser.render(String(text)).trim();
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('turndown');
131
+ const TurndownService = require("turndown");
127
132
  return new TurndownService().turndown(String(text));
128
133
  }
129
134
 
130
135
  function getDate() {
131
- let date = new Date();
132
- let day = ('0' + Number(date.getDate()).toString()).slice(-2);
133
- let month = ('0' + Number(date.getMonth() + 1).toString()).slice(-2);
134
- let year = date.getFullYear();
135
- let hours = ('0' + Number(date.getHours()).toString()).slice(-2);
136
- let minutes = ('0' + Number(date.getMinutes()).toString()).slice(-2);
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 = ('0' + Number(date.getHours()).toString()).slice(-2);
149
- const minutes = ('0' + Number(date.getMinutes()).toString()).slice(-2);
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 = ('0' + Number(date.getMonth() + 1).toString()).slice(-2);
163
- const day = ('0' + Number(date.getDate()).toString()).slice(-2);
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 '0 Bytes'
169
- const k = 1024
170
- const dm = decimals < 0 ? 0 : decimals
171
- const sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
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
- exports.style_parse = style_parse
212
- exports.render = render
213
- exports.markdownToHtml = markdownToHtml
214
- exports.htmlToMarkdown = htmlToMarkdown
215
- exports.getDefaultIcon = getDefaultIcon
216
- exports.shouldOpenDropdownUp = shouldOpenDropdownUp
217
- exports.dropdownPlacement = dropdownPlacement
218
- exports.setStyles = setStyles
219
- exports.formatBytes = formatBytes
220
- exports.optionOr = optionOr
221
- exports.scrollParent = scrollParent
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
- {type: "keyword", 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"},
23
- {type: "function", source: "\\b[A-Za-z_$][\\w$]*(?=\\s*\\()"},
24
- {type: "property", source: "(?<=\\.)[A-Za-z_$][\\w$]*"},
25
- {type: "operator", source: "=>|===|!==|==|!=|<=|>=|&&|\\|\\||[+\\-*/%!<>=&|^~?:]"}
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: "\"(?:\\\\.|[^\"\\\\])*\"(?=\\s*:)"},
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(--text_color_disabled);
7
+ color: var(--code_token_comment);
5
8
  font-style: italic;
6
9
  }
7
10
 
8
11
  .code_token_string {
9
- color: #30d158;
12
+ color: var(--code_token_string);
10
13
  }
11
14
 
12
15
  .code_token_number {
13
- color: #ff9f0a;
16
+ color: var(--code_token_number);
14
17
  }
15
18
 
16
19
  .code_token_keyword {
17
- color: #bf5af2;
20
+ color: var(--code_token_keyword);
18
21
  }
19
22
 
20
23
  .code_token_function {
21
- color: #0a84ff;
24
+ color: var(--code_token_function);
22
25
  }
23
26
 
24
27
  .code_token_property,
25
28
  .code_token_key {
26
- color: #64d2ff;
29
+ color: var(--code_token_property);
27
30
  }
28
31
 
29
32
  .code_token_selector {
30
- color: #ffd60a;
33
+ color: var(--code_token_selector);
31
34
  }
32
35
 
33
36
  .code_token_color {
34
- color: #ff9f0a;
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.#applied_locale;
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) => (params[name] === undefined ? match : String(params[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 #applied_locale = undefined;
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.#applied_locale = this.#locale;
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": "Expand \"{name}\"",
30
- "a11y.collapseNode": "Collapse \"{name}\"",
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": "Страница \"{title}\" уже добавлена в меню",
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": "Page \"{title}\" is already in the menu",
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
  };