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,4 +1,4 @@
1
- const {setStyles, optionOr} = require('../../modules/chui_functions');
1
+ const { setStyles, optionOr } = require("../../modules/chui_functions");
2
2
 
3
3
  /** Схемы источника картинки: остальное считается локальным путём и читается как data URL */
4
4
  const URL_SCHEMES = ["data:", "http:", "https:", "file:", "blob:"];
@@ -32,7 +32,7 @@ const URL_SCHEMES = ["data:", "http:", "https:", "file:", "blob:"];
32
32
  */
33
33
  class Watermark {
34
34
  static #counter = 0;
35
- static #DEFAULT_GAP = {x: 100, y: 100};
35
+ static #DEFAULT_GAP = { x: 100, y: 100 };
36
36
  static #DEFAULT_ROTATE = -22;
37
37
  static #DEFAULT_OPACITY = 0.15;
38
38
  static #DEFAULT_FONT_SIZE = 16;
@@ -44,20 +44,28 @@ class Watermark {
44
44
  #id = undefined;
45
45
  #text = undefined;
46
46
  #image = undefined;
47
- #image_node = undefined;
48
- #font = {size: Watermark.#DEFAULT_FONT_SIZE, weight: 400, family: undefined, color: undefined};
47
+ #imageNode = undefined;
48
+ #font = { size: Watermark.#DEFAULT_FONT_SIZE, weight: 400, family: undefined, color: undefined };
49
49
  #rotate = Watermark.#DEFAULT_ROTATE;
50
- #gap = {...Watermark.#DEFAULT_GAP};
50
+ #gap = { ...Watermark.#DEFAULT_GAP };
51
51
  #opacity = Watermark.#DEFAULT_OPACITY;
52
- #z_index = Watermark.#DEFAULT_Z_INDEX;
52
+ #zIndex = Watermark.#DEFAULT_Z_INDEX;
53
53
  #scheme = undefined;
54
54
  #destroyed = false;
55
55
 
56
- constructor(options = {
57
- id: String(), text: String(), image: String(),
58
- font: Object(), rotate: Number(), gap: Object(), opacity: Number(),
59
- zIndex: Number(), components: []
60
- }) {
56
+ constructor(
57
+ options = {
58
+ id: String(),
59
+ text: String(),
60
+ image: String(),
61
+ font: Object(),
62
+ rotate: Number(),
63
+ gap: Object(),
64
+ opacity: Number(),
65
+ zIndex: Number(),
66
+ components: [],
67
+ }
68
+ ) {
61
69
  setStyles(__dirname + "/styles.css", "chUiJS_Watermark");
62
70
  Watermark.#counter += 1;
63
71
  this.#id = optionOr(options.id, `chui_watermark_${Watermark.#counter}`);
@@ -98,7 +106,7 @@ class Watermark {
98
106
 
99
107
  /** Настройки метки: `{size, weight, family, color}` */
100
108
  getFont() {
101
- return {...this.#font};
109
+ return { ...this.#font };
102
110
  }
103
111
 
104
112
  getRotate() {
@@ -107,7 +115,7 @@ class Watermark {
107
115
 
108
116
  /** Шаг между метками */
109
117
  getGap() {
110
- return {...this.#gap};
118
+ return { ...this.#gap };
111
119
  }
112
120
 
113
121
  getOpacity() {
@@ -115,7 +123,7 @@ class Watermark {
115
123
  }
116
124
 
117
125
  getZIndex() {
118
- return this.#z_index;
126
+ return this.#zIndex;
119
127
  }
120
128
 
121
129
  /** Слой с метками (для своих стилей) */
@@ -148,12 +156,12 @@ class Watermark {
148
156
  */
149
157
  setImage(image = undefined) {
150
158
  this.#image = image;
151
- this.#image_node = undefined;
159
+ this.#imageNode = undefined;
152
160
  if (image !== undefined && image !== null && image !== "") {
153
161
  const node = new Image();
154
162
  node.onload = () => this.#draw();
155
163
  node.src = Watermark.#resolveSource(image);
156
- this.#image_node = node;
164
+ this.#imageNode = node;
157
165
  }
158
166
  this.#draw();
159
167
  return this;
@@ -194,8 +202,8 @@ class Watermark {
194
202
 
195
203
  setZIndex(zIndex = Number()) {
196
204
  const number = Number(zIndex);
197
- this.#z_index = Number.isFinite(number) ? number : Watermark.#DEFAULT_Z_INDEX;
198
- this.#root.style.setProperty("--watermark_z_index", String(this.#z_index));
205
+ this.#zIndex = Number.isFinite(number) ? number : Watermark.#DEFAULT_Z_INDEX;
206
+ this.#root.style.setProperty("--watermark_z_index", String(this.#zIndex));
199
207
  return this;
200
208
  }
201
209
 
@@ -245,12 +253,12 @@ class Watermark {
245
253
  }
246
254
 
247
255
  static #normalizeGap(gap = Object()) {
248
- const source = Array.isArray(gap) ? {x: gap[0], y: gap[1]} : gap;
256
+ const source = Array.isArray(gap) ? { x: gap[0], y: gap[1] } : gap;
249
257
  const x = Number(source === undefined ? undefined : source.x);
250
258
  const y = Number(source === undefined ? undefined : source.y);
251
259
  return {
252
260
  x: Number.isFinite(x) && x > 0 ? x : Watermark.#DEFAULT_GAP.x,
253
- y: Number.isFinite(y) && y > 0 ? y : Watermark.#DEFAULT_GAP.y
261
+ y: Number.isFinite(y) && y > 0 ? y : Watermark.#DEFAULT_GAP.y,
254
262
  };
255
263
  }
256
264
 
@@ -265,33 +273,33 @@ class Watermark {
265
273
  weight: this.#font.weight,
266
274
  // Шрифт и цвет палитры берём из вычисленного стиля: канва наследование не умеет
267
275
  family: optionOr(this.#font.family, style.fontFamily),
268
- color: optionOr(this.#font.color, style.color)
276
+ color: optionOr(this.#font.color, style.color),
269
277
  };
270
278
  }
271
279
 
272
280
  #draw() {
273
281
  if (this.#destroyed) return this;
274
282
  const text = this.#text === undefined ? "" : String(this.#text);
275
- const image = this.#image_node;
276
- const has_image = image !== undefined && image.complete === true && image.naturalWidth > 0;
277
- const has_text = text !== "";
283
+ const image = this.#imageNode;
284
+ const hasImage = image !== undefined && image.complete === true && image.naturalWidth > 0;
285
+ const hasText = text !== "";
278
286
  // Метки нечем рисовать — слой не показываем, чтобы не занимать место
279
- this.#layer.hidden = has_text === false && has_image === false;
287
+ this.#layer.hidden = hasText === false && hasImage === false;
280
288
  if (this.#layer.hidden) {
281
289
  // Снимаем значение, а не ставим `none`: базовое состояние даёт CSS
282
290
  this.#layer.style.removeProperty("background-image");
283
291
  return this;
284
292
  }
285
- const pixel_ratio = typeof window !== "undefined" && window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;
286
- const tile = {x: this.#gap.x, y: this.#gap.y};
293
+ const pixelRatio = typeof window !== "undefined" && window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;
294
+ const tile = { x: this.#gap.x, y: this.#gap.y };
287
295
  // Плитка = две метки по каждой оси: на стыках соседних плиток рисунок сходится
288
296
  const canvas = document.createElement("canvas");
289
- canvas.width = Math.round(tile.x * 2 * pixel_ratio);
290
- canvas.height = Math.round(tile.y * 2 * pixel_ratio);
297
+ canvas.width = Math.round(tile.x * 2 * pixelRatio);
298
+ canvas.height = Math.round(tile.y * 2 * pixelRatio);
291
299
  const context = canvas.getContext("2d");
292
- context.scale(pixel_ratio, pixel_ratio);
300
+ context.scale(pixelRatio, pixelRatio);
293
301
  context.globalAlpha = this.#opacity;
294
- if (has_text) {
302
+ if (hasText) {
295
303
  const font = this.#resolveFont();
296
304
  context.font = `${font.weight} ${font.size}px ${font.family}`;
297
305
  context.fillStyle = font.color;
@@ -307,7 +315,7 @@ class Watermark {
307
315
  }
308
316
  }
309
317
  }
310
- if (has_image) {
318
+ if (hasImage) {
311
319
  const max = Math.min(tile.x, tile.y) * 0.6;
312
320
  const ratio = Math.min(max / image.naturalWidth, max / image.naturalHeight, 1);
313
321
  const width = image.naturalWidth * ratio;
@@ -330,4 +338,4 @@ class Watermark {
330
338
  }
331
339
  }
332
340
 
333
- exports.Watermark = Watermark
341
+ exports.Watermark = Watermark;
@@ -1,7 +1,7 @@
1
1
  chui_webview {
2
2
  position: relative;
3
3
  width: -webkit-fill-available;
4
- height: 100%
4
+ height: 100%;
5
5
  }
6
6
 
7
7
  chui_load {
@@ -25,4 +25,4 @@ webview {
25
25
 
26
26
  webview.hide {
27
27
  visibility: hidden;
28
- }
28
+ }
@@ -1,6 +1,6 @@
1
- const { Animation } = require('../../modules/chui_animations/animations')
2
- const { Spinner } = require('../chui_spinner/spinner')
3
- const {Log} = require("../../../framework/modules/chui_logger/chui_logger");
1
+ const { Animation } = require("../../modules/chui_animations/animations");
2
+ const { Spinner } = require("../chui_spinner/spinner");
3
+ const { Log } = require("../../../framework/modules/chui_logger/chui_logger");
4
4
 
5
5
  /**
6
6
  * Встроенный браузер на `<webview>`.
@@ -25,7 +25,7 @@ class WebView {
25
25
  userAgent: undefined,
26
26
  webPreferences: "allowRunningInsecureContent, javascript=yes",
27
27
  partition: undefined,
28
- preload: undefined
28
+ preload: undefined,
29
29
  };
30
30
  /** Безопасный набор для недоверенного контента: без Node, с webSecurity и без попапов */
31
31
  static SECURE = {
@@ -33,43 +33,52 @@ class WebView {
33
33
  webSecurity: true,
34
34
  allowPopups: false,
35
35
  plugins: false,
36
- webPreferences: "javascript=yes"
36
+ webPreferences: "javascript=yes",
37
37
  };
38
- #id = require("randomstring").generate()
39
- #main_block = document.createElement('chui_webview')
40
- #WebView = document.createElement('webview')
41
- #chui_load = document.createElement('chui_load')
38
+ #id = require("randomstring").generate();
39
+ #mainBlock = document.createElement("chui_webview");
40
+ #WebView = document.createElement("webview");
41
+ #chuiLoad = document.createElement("chui_load");
42
42
  constructor(url = String(), dev = false, options = {}) {
43
- require('../../modules/chui_functions').setStyles(__dirname + '/styles.css', 'chUiJS_WebView');
44
- const settings = {...WebView.DEFAULTS};
43
+ require("../../modules/chui_functions").setStyles(__dirname + "/styles.css", "chUiJS_WebView");
44
+ const settings = { ...WebView.DEFAULTS };
45
45
  // undefined в объекте опций означает «как по умолчанию», а не «перезаписать пустым»
46
46
  for (const [key, value] of Object.entries(options)) {
47
47
  if (value !== undefined) settings[key] = value;
48
48
  }
49
- this.#WebView.setAttribute('id', this.#id)
50
- this.#WebView.setAttribute('src', url)
51
- if (settings.nodeIntegration === true) this.#WebView.setAttribute('nodeintegration', 'true');
52
- if (settings.plugins === true) this.#WebView.setAttribute('plugins', 'true')
53
- this.#WebView.setAttribute('useragent', settings.userAgent === undefined ? getFirefoxUserAgent() : String(settings.userAgent))
49
+ this.#WebView.setAttribute("id", this.#id);
50
+ this.#WebView.setAttribute("src", url);
51
+ if (settings.nodeIntegration === true) this.#WebView.setAttribute("nodeintegration", "true");
52
+ if (settings.plugins === true) this.#WebView.setAttribute("plugins", "true");
53
+ this.#WebView.setAttribute(
54
+ "useragent",
55
+ settings.userAgent === undefined ? getFirefoxUserAgent() : String(settings.userAgent)
56
+ );
54
57
  // Атрибут отрицательный: ставим его только когда webSecurity выключен явно
55
- if (settings.webSecurity === false) this.#WebView.setAttribute('disablewebsecurity', 'true')
56
- if (settings.allowPopups === true) this.#WebView.setAttribute('allowpopups', 'true')
57
- if (settings.webPreferences !== undefined) this.#WebView.setAttribute("webpreferences", settings.nodeIntegration === true ? withNodeIntegration(String(settings.webPreferences)) : String(settings.webPreferences));
58
+ if (settings.webSecurity === false) this.#WebView.setAttribute("disablewebsecurity", "true");
59
+ if (settings.allowPopups === true) this.#WebView.setAttribute("allowpopups", "true");
60
+ if (settings.webPreferences !== undefined)
61
+ this.#WebView.setAttribute(
62
+ "webpreferences",
63
+ settings.nodeIntegration === true
64
+ ? withNodeIntegration(String(settings.webPreferences))
65
+ : String(settings.webPreferences)
66
+ );
58
67
  if (settings.partition !== undefined) this.#WebView.setAttribute("partition", String(settings.partition));
59
68
  if (settings.preload !== undefined) this.#WebView.setAttribute("preload", String(settings.preload));
60
- let spinner = new Spinner(Spinner.SIZE.BIG);
61
- this.#chui_load.appendChild(spinner.set());
62
- this.#main_block.appendChild(this.#WebView)
69
+ const spinner = new Spinner(Spinner.SIZE.BIG);
70
+ this.#chuiLoad.appendChild(spinner.set());
71
+ this.#mainBlock.appendChild(this.#WebView);
63
72
  const loadStart = () => {
64
- this.#main_block.appendChild(this.#chui_load)
65
- }
73
+ this.#mainBlock.appendChild(this.#chuiLoad);
74
+ };
66
75
  const loadStop = () => {
67
76
  new Animation(this.#WebView).fadeIn();
68
- this.#main_block.removeChild(this.#chui_load)
77
+ this.#mainBlock.removeChild(this.#chuiLoad);
69
78
  if (dev) this.#WebView.openDevTools();
70
- }
71
- this.#WebView.addEventListener('did-start-loading', loadStart)
72
- this.#WebView.addEventListener('did-stop-loading', loadStop)
79
+ };
80
+ this.#WebView.addEventListener("did-start-loading", loadStart);
81
+ this.#WebView.addEventListener("did-stop-loading", loadStop);
73
82
  }
74
83
  setPartition(partition = String()) {
75
84
  this.#WebView.partition = partition;
@@ -78,51 +87,51 @@ class WebView {
78
87
  this.#WebView.preload = "file://" + path;
79
88
  }
80
89
  addStartLoadEvent(listener = () => {}) {
81
- this.#WebView.addEventListener('did-start-loading', listener)
90
+ this.#WebView.addEventListener("did-start-loading", listener);
82
91
  }
83
92
  addStopLoadEvent(listener = () => {}) {
84
- this.#WebView.addEventListener('did-stop-loading', listener)
93
+ this.#WebView.addEventListener("did-stop-loading", listener);
85
94
  }
86
95
  addFinishLoadEvent(listener = () => {}) {
87
- this.#WebView.addEventListener('did-finish-load', listener)
96
+ this.#WebView.addEventListener("did-finish-load", listener);
88
97
  }
89
98
  async executeJavaScript(code = String()) {
90
99
  try {
91
100
  await this.#WebView.executeJavaScript(code);
92
101
  } catch (err) {
93
- Log.error(err)
102
+ Log.error(err);
94
103
  }
95
104
  }
96
105
  insertCustomRes(options = { cssPath: String(), jsPath: String() }) {
97
- this.#WebView.addEventListener('did-frame-finish-load', async () => {
98
- const fs = require('fs');
106
+ this.#WebView.addEventListener("did-frame-finish-load", async () => {
107
+ const fs = require("fs");
99
108
  if (options.cssPath !== undefined) {
100
- let data = fs.readFileSync(options.cssPath, 'utf8');
101
- this.#WebView.insertCSS(String(data)).catch(r => Log.error(r));
109
+ const data = fs.readFileSync(options.cssPath, "utf8");
110
+ this.#WebView.insertCSS(String(data)).catch((r) => Log.error(r));
102
111
  }
103
112
  if (options.jsPath !== undefined) {
104
113
  try {
105
- const data = fs.readFileSync(options.jsPath, 'utf8');
114
+ const data = fs.readFileSync(options.jsPath, "utf8");
106
115
  await this.#WebView.executeJavaScript(data);
107
116
  } catch (err) {
108
117
  Log.error(err);
109
118
  }
110
119
  }
111
- })
120
+ });
112
121
  }
113
122
  async send(channel = String(), ...args) {
114
123
  // Аргументы передаются как есть: `webview.send(channel, ...args)`. Раньше они
115
124
  // уезжали одним массивом, и слушатель в гостевой странице видел один аргумент
116
- await this.#WebView.send(channel, ...args)
125
+ await this.#WebView.send(channel, ...args);
117
126
  }
118
127
  setUrl(url = String()) {
119
- this.#WebView.setAttribute('src', url)
128
+ this.#WebView.setAttribute("src", url);
120
129
  }
121
130
  getWebContentsId() {
122
- return this.#WebView.getWebContentsId()
131
+ return this.#WebView.getWebContentsId();
123
132
  }
124
133
  set() {
125
- return this.#main_block
134
+ return this.#mainBlock;
126
135
  }
127
136
  }
128
137
 
@@ -141,19 +150,22 @@ const withNodeIntegration = (preferences = String()) => {
141
150
 
142
151
  const getFirefoxUserAgent = () => {
143
152
  const rootUAs = {
144
- mac: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:FXVERSION.0) Gecko/20100101 Firefox/FXVERSION.0',
145
- windows: 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:FXVERSION.0) Gecko/20100101 Firefox/FXVERSION.0',
146
- linux: 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:FXVERSION.0) Gecko/20100101 Firefox/FXVERSION.0',
153
+ mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:FXVERSION.0) Gecko/20100101 Firefox/FXVERSION.0",
154
+ windows: "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:FXVERSION.0) Gecko/20100101 Firefox/FXVERSION.0",
155
+ linux: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:FXVERSION.0) Gecko/20100101 Firefox/FXVERSION.0",
147
156
  };
148
157
  let rootUA;
149
- if (process.platform === 'win32') {
150
- rootUA = rootUAs.windows;
151
- } else if (process.platform === 'darwin') {
152
- rootUA = rootUAs.mac;
158
+ if (process.platform === "win32") {
159
+ rootUA = rootUAs.windows;
160
+ } else if (process.platform === "darwin") {
161
+ rootUA = rootUAs.mac;
153
162
  } else {
154
- rootUA = rootUAs.linux;
163
+ rootUA = rootUAs.linux;
155
164
  }
156
- return rootUA.replace(/FXVERSION/g, 91 + Math.floor((Date.now() - 1628553600000) / (4.1 * 7 * 24 * 60 * 60 * 1000)));
165
+ return rootUA.replace(
166
+ /FXVERSION/g,
167
+ 91 + Math.floor((Date.now() - 1628553600000) / (4.1 * 7 * 24 * 60 * 60 * 1000))
168
+ );
157
169
  };
158
170
 
159
- exports.WebView = WebView
171
+ exports.WebView = WebView;
@@ -0,0 +1,172 @@
1
+ /* Панель ввода: строка «вложения — текст — отправка».
2
+ Панель не полагает, где она стоит: в карточке она читается кромкой той же карточки,
3
+ а поверх содержимого её поднимают тенью (`data-shadow="true"`), которую включает
4
+ приложение — заодно с `StickyBar`, если панель должна прилипать к низу окна. */
5
+
6
+ chui_write_bar {
7
+ display: block;
8
+ box-sizing: border-box;
9
+ width: -webkit-fill-available;
10
+ }
11
+
12
+ write_bar_row {
13
+ display: flex;
14
+ flex-direction: row;
15
+ /* Кнопки встают по низу: пока поле в одну линию, разницы нет, а на выросшем поле
16
+ строка кнопок остаётся там же, где была, — она не едет за текстом */
17
+ align-items: flex-end;
18
+ gap: 6px;
19
+ box-sizing: border-box;
20
+ width: -webkit-fill-available;
21
+ padding: var(--control_padding);
22
+ background: var(--element_background_2);
23
+ border-top: 1px solid var(--border_color);
24
+ }
25
+
26
+ /* Тень вместо верхней линии: панель поверх содержимого отделяется материалом, а не чертой */
27
+ chui_write_bar[data-shadow="true"] write_bar_row {
28
+ border-top-color: transparent;
29
+ box-shadow: var(--box_shadow_main);
30
+ }
31
+
32
+ /* Пустой слот места не занимает: у панели без вложений слева нет зазора */
33
+ write_bar_slot {
34
+ display: flex;
35
+ flex-direction: row;
36
+ align-items: center;
37
+ gap: 2px;
38
+ flex: none;
39
+ }
40
+
41
+ write_bar_slot:empty {
42
+ display: none;
43
+ }
44
+
45
+ .write_bar_field {
46
+ flex: 1 1 auto;
47
+ min-width: 0;
48
+ box-sizing: border-box;
49
+ resize: none;
50
+ /* Коробка поля — как у остальных полей фреймворка: заливка контрола, волосяная линия
51
+ и радиус. Отступы и строка подобраны под `--control_height`, поэтому в одну линию
52
+ поле ровно той же высоты, что кнопки панели, и строка читается одной линией:
53
+ с прежними отступами 8px поле было на 8px выше кнопок и панель выглядела кривой. */
54
+ min-height: var(--control_height);
55
+ padding: calc(var(--control_padding_sm) - 1px) 10px;
56
+ line-height: 1.25;
57
+ /* Прокрутка появляется только на выросшем поле: в одну линию у поля нет полосы,
58
+ которая отнимала бы ширину у текста (предел роста задаёт JS — maxHeight) */
59
+ overflow-y: hidden;
60
+ border-radius: var(--radius_sm);
61
+ border: 1px solid var(--border_color);
62
+ background: var(--element_background);
63
+ color: var(--text_color);
64
+ font-family: inherit;
65
+ font-size: var(--font_default_size);
66
+ }
67
+
68
+ .write_bar_field[data-scrollable="true"] {
69
+ overflow-y: auto;
70
+ }
71
+
72
+ .write_bar_field::placeholder {
73
+ color: var(--text_color_disabled);
74
+ }
75
+
76
+ .write_bar_field:hover:not(:disabled) {
77
+ border-color: var(--border_color_hover);
78
+ }
79
+
80
+ /* Активное поле выдаёт кромка, а не кольцо: в панели ввода каретка и так показывает,
81
+ где набирают, а контур вокруг строки рябит на каждом щелчке по полю */
82
+ .write_bar_field:focus {
83
+ outline: none;
84
+ border-color: var(--blue_prime_background);
85
+ }
86
+
87
+ .write_bar_field:disabled {
88
+ cursor: not-allowed;
89
+ background: var(--element_background_disabled);
90
+ color: var(--text_color_disabled);
91
+ }
92
+
93
+ /* Кнопка панели: круг со значком, подпись живёт в `aria-label` и подсказке */
94
+ .write_bar_button {
95
+ position: relative;
96
+ flex: none;
97
+ cursor: pointer;
98
+ display: flex;
99
+ align-items: center;
100
+ justify-content: center;
101
+ box-sizing: border-box;
102
+ width: var(--control_height);
103
+ height: var(--control_height);
104
+ padding: 0;
105
+ border: none;
106
+ border-radius: var(--radius_circle);
107
+ background: transparent;
108
+ color: var(--text_color);
109
+ }
110
+
111
+ .write_bar_button:hover {
112
+ background: var(--element_background_hover);
113
+ }
114
+
115
+ /* Нажатие — акцент, как у Button: контрол отвечает на клик ещё до действия */
116
+ .write_bar_button:active:not(:disabled) {
117
+ background: var(--blue_prime_background);
118
+ color: var(--text_color_hover);
119
+ }
120
+
121
+ .write_bar_button:disabled {
122
+ cursor: not-allowed;
123
+ background: transparent;
124
+ color: var(--text_color_disabled);
125
+ }
126
+
127
+ /* Отправка — акцентная кнопка панели: она одна здесь означает «сделать» */
128
+ .write_bar_button[data-accent="true"] {
129
+ background: var(--blue_prime_background);
130
+ color: var(--text_color_hover);
131
+ }
132
+
133
+ .write_bar_button[data-accent="true"]:hover {
134
+ background: var(--blue_prime_background_tint_strong);
135
+ }
136
+
137
+ .write_bar_button[data-accent="true"]:disabled {
138
+ cursor: not-allowed;
139
+ background: var(--button_background_disabled);
140
+ color: var(--text_color_disabled);
141
+ }
142
+
143
+ .write_bar_button chui_icon {
144
+ color: inherit;
145
+ }
146
+
147
+ /* Счётчик кнопки: число выбранного важнее подписи, поэтому плашка в углу круга */
148
+ write_bar_badge {
149
+ position: absolute;
150
+ top: -2px;
151
+ inset-inline-end: -2px;
152
+ box-sizing: border-box;
153
+ min-width: 16px;
154
+ height: 16px;
155
+ padding-inline: 4px;
156
+ border-radius: var(--radius_pill);
157
+ background: var(--red_prime_background);
158
+ color: var(--text_color_hover);
159
+ font-size: 10px;
160
+ font-weight: 600;
161
+ line-height: 16px;
162
+ text-align: center;
163
+ }
164
+
165
+ write_bar_badge[hidden] {
166
+ display: none;
167
+ }
168
+
169
+ /* DISABLED STYLES */
170
+ chui_write_bar[data-disabled="true"] write_bar_row {
171
+ background: var(--element_background_disabled);
172
+ }