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,32 +1,32 @@
1
- const {setStyles, markdownToHtml} = require("../../modules/chui_functions");
2
- const {Icon, Icons} = require("../chui_icons/icons");
3
- const {RovingKeyboard} = require("../../modules/chui_a11y/chui_a11y");
4
- const {Validate} = require("../../modules/chui_validate/chui_validate");
5
- const {I18n} = require("../../modules/chui_i18n/chui_i18n");
1
+ const { setStyles, markdownToHtml } = require("../../modules/chui_functions");
2
+ const { Icon, Icons } = require("../chui_icons/icons");
3
+ const { RovingKeyboard } = require("../../modules/chui_a11y/chui_a11y");
4
+ const { Validate } = require("../../modules/chui_validate/chui_validate");
5
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
6
6
 
7
7
  /** Действия панели разметки: ключ подписи, значок, сочетание и правка */
8
8
  const ACTIONS = [
9
- {id: "bold", labelKey: "editor.bold", icon: Icons.EDITOR.FORMAT_BOLD, shortcut: "Control+B"},
10
- {id: "italic", labelKey: "editor.italic", icon: Icons.EDITOR.FORMAT_ITALIC, shortcut: "Control+I"},
11
- {id: "strike", labelKey: "editor.strikethrough", icon: Icons.EDITOR.STRIKETHROUGH_S},
12
- {id: "heading", labelKey: "editor.heading", icon: Icons.EDITOR.TITLE},
13
- {id: "quote", labelKey: "editor.quote", icon: Icons.EDITOR.FORMAT_QUOTE},
14
- {id: "bullets", labelKey: "editor.list", icon: Icons.EDITOR.FORMAT_LIST_BULLETED},
15
- {id: "numbers", labelKey: "editor.orderedList", icon: Icons.EDITOR.FORMAT_LIST_NUMBERED},
16
- {id: "checklist", labelKey: "editor.checklist", icon: Icons.EDITOR.CHECKLIST},
17
- {id: "code", labelKey: "editor.code", icon: Icons.ACTIONS.CODE},
18
- {id: "codeblock", labelKey: "editor.codeBlock", icon: Icons.ACTIONS.TERMINAL},
19
- {id: "link", labelKey: "editor.link", icon: Icons.EDITOR.INSERT_LINK, shortcut: "Control+K"},
9
+ { id: "bold", labelKey: "editor.bold", icon: Icons.EDITOR.FORMAT_BOLD, shortcut: "Control+B" },
10
+ { id: "italic", labelKey: "editor.italic", icon: Icons.EDITOR.FORMAT_ITALIC, shortcut: "Control+I" },
11
+ { id: "strike", labelKey: "editor.strikethrough", icon: Icons.EDITOR.STRIKETHROUGH_S },
12
+ { id: "heading", labelKey: "editor.heading", icon: Icons.EDITOR.TITLE },
13
+ { id: "quote", labelKey: "editor.quote", icon: Icons.EDITOR.FORMAT_QUOTE },
14
+ { id: "bullets", labelKey: "editor.list", icon: Icons.EDITOR.FORMAT_LIST_BULLETED },
15
+ { id: "numbers", labelKey: "editor.orderedList", icon: Icons.EDITOR.FORMAT_LIST_NUMBERED },
16
+ { id: "checklist", labelKey: "editor.checklist", icon: Icons.EDITOR.CHECKLIST },
17
+ { id: "code", labelKey: "editor.code", icon: Icons.ACTIONS.CODE },
18
+ { id: "codeblock", labelKey: "editor.codeBlock", icon: Icons.ACTIONS.TERMINAL },
19
+ { id: "link", labelKey: "editor.link", icon: Icons.EDITOR.INSERT_LINK, shortcut: "Control+K" },
20
20
  ];
21
21
 
22
22
  /** Что делает каждое действие: обёртка вокруг выделения или приставка к строкам */
23
23
  const WRAPS = {
24
- bold: {before: "**", after: "**", placeholderKey: "editor.placeholderText"},
25
- italic: {before: "*", after: "*", placeholderKey: "editor.placeholderText"},
26
- strike: {before: "~~", after: "~~", placeholderKey: "editor.placeholderText"},
27
- code: {before: "`", after: "`", placeholderKey: "editor.placeholderCode"},
28
- codeblock: {before: "```\n", after: "\n```", placeholderKey: "editor.placeholderCode"},
29
- link: {before: "[", after: "](url)", placeholderKey: "editor.placeholderText"},
24
+ bold: { before: "**", after: "**", placeholderKey: "editor.placeholderText" },
25
+ italic: { before: "*", after: "*", placeholderKey: "editor.placeholderText" },
26
+ strike: { before: "~~", after: "~~", placeholderKey: "editor.placeholderText" },
27
+ code: { before: "`", after: "`", placeholderKey: "editor.placeholderCode" },
28
+ codeblock: { before: "```\n", after: "\n```", placeholderKey: "editor.placeholderCode" },
29
+ link: { before: "[", after: "](url)", placeholderKey: "editor.placeholderText" },
30
30
  };
31
31
 
32
32
  /**
@@ -80,45 +80,47 @@ class MarkdownEditor {
80
80
  #hint = document.createElement("markdown_editor_hint");
81
81
  #status = document.createElement("markdown_editor_status");
82
82
  #error = document.createElement("chui_error_message");
83
- #preview_button = undefined;
83
+ #previewButton = undefined;
84
84
  #actions = new Map();
85
85
  #id = undefined;
86
86
  #name = undefined;
87
- #title_text = undefined;
88
- #label_text = undefined;
89
- #preview_enabled = false;
90
- #preview_on = false;
91
- #max_length = undefined;
87
+ #titleText = undefined;
88
+ #labelText = undefined;
89
+ #previewEnabled = false;
90
+ #previewOn = false;
91
+ #maxLength = undefined;
92
92
  #width = undefined;
93
93
  #disabled = false;
94
- #read_only = false;
94
+ #readOnly = false;
95
95
  #listeners = [];
96
- #on_change = undefined;
97
-
98
- constructor(options = {
99
- id: String(),
100
- name: String(),
101
- title: String(),
102
- label: String(),
103
- hint: String(),
104
- value: String(),
105
- rows: Number(),
106
- preview: Boolean(),
107
- maxLength: Number(),
108
- width: String(),
109
- disabled: Boolean(),
110
- readOnly: Boolean(),
111
- changeListener: undefined,
112
- onChange: undefined
113
- }) {
96
+ #onChange = undefined;
97
+
98
+ constructor(
99
+ options = {
100
+ id: String(),
101
+ name: String(),
102
+ title: String(),
103
+ label: String(),
104
+ hint: String(),
105
+ value: String(),
106
+ rows: Number(),
107
+ preview: Boolean(),
108
+ maxLength: Number(),
109
+ width: String(),
110
+ disabled: Boolean(),
111
+ readOnly: Boolean(),
112
+ changeListener: undefined,
113
+ onChange: undefined,
114
+ }
115
+ ) {
114
116
  setStyles(__dirname + "/styles.css", "chUiJS_MarkdownEditor");
115
117
  MarkdownEditor.#counter += 1;
116
118
  this.#id = options.id === undefined ? `chui_markdown_editor_${MarkdownEditor.#counter}` : options.id;
117
119
  this.#name = options.name;
118
- this.#label_text = options.label;
119
- this.#on_change = options.onChange;
120
- this.#preview_enabled = options.preview === true;
121
- this.#max_length = options.maxLength === undefined ? undefined : Number(options.maxLength);
120
+ this.#labelText = options.label;
121
+ this.#onChange = options.onChange;
122
+ this.#previewEnabled = options.preview === true;
123
+ this.#maxLength = options.maxLength === undefined ? undefined : Number(options.maxLength);
122
124
  this.#root.id = this.#id;
123
125
  this.#label.className = "markdown_editor_label";
124
126
  this.#toolbar.className = "markdown_editor_toolbar";
@@ -145,7 +147,7 @@ class MarkdownEditor {
145
147
  this.#buildToolbar();
146
148
  // Панель — одна остановка обхода: по кнопкам ходят стрелки/Home/End (tabindex переходящий).
147
149
  // Слушатели слоя стоят на самой панели, поэтому destroy() за ним не нужен (как у TextEditorPanel)
148
- new RovingKeyboard(this.#toolbar, {itemSelector: "button"});
150
+ new RovingKeyboard(this.#toolbar, { itemSelector: "button" });
149
151
  this.#panes.appendChild(this.#textarea);
150
152
  this.#panes.appendChild(this.#preview);
151
153
  this.#footer.appendChild(this.#count);
@@ -157,7 +159,7 @@ class MarkdownEditor {
157
159
  this.#root.appendChild(this.#status);
158
160
  if (options.width !== undefined) this.setWidth(options.width);
159
161
  this.setTitle(options.title);
160
- this.setLabel(this.#label_text === undefined ? I18n.t("editor.markdownText") : this.#label_text);
162
+ this.setLabel(this.#labelText === undefined ? I18n.t("editor.markdownText") : this.#labelText);
161
163
  if (options.hint !== undefined) this.setHint(options.hint);
162
164
  this.setRows(options.rows === undefined ? 8 : options.rows);
163
165
  this.setTextAreaValue(options.value === undefined ? "" : options.value);
@@ -180,12 +182,12 @@ class MarkdownEditor {
180
182
  }
181
183
 
182
184
  getTitle() {
183
- return this.#title_text;
185
+ return this.#titleText;
184
186
  }
185
187
 
186
188
  /** Доступное имя поля, заданное в `label` */
187
189
  getLabel() {
188
- return this.#label_text;
190
+ return this.#labelText;
189
191
  }
190
192
 
191
193
  /** Текст Markdown как есть */
@@ -199,11 +201,11 @@ class MarkdownEditor {
199
201
  }
200
202
 
201
203
  isPreview() {
202
- return this.#preview_on;
204
+ return this.#previewOn;
203
205
  }
204
206
 
205
207
  getMaxLength() {
206
- return this.#max_length;
208
+ return this.#maxLength;
207
209
  }
208
210
 
209
211
  /** Ширина поля (по умолчанию — общая ширина контрола `--control_width`) */
@@ -212,7 +214,7 @@ class MarkdownEditor {
212
214
  }
213
215
 
214
216
  isReadOnly() {
215
- return this.#read_only;
217
+ return this.#readOnly;
216
218
  }
217
219
 
218
220
  getDisabled() {
@@ -233,7 +235,7 @@ class MarkdownEditor {
233
235
  this.#hint.id = `${id}_hint`;
234
236
  // Подпись — настоящий <label>: её связь с полем не должна отставать от идентификаторов
235
237
  this.#label.setAttribute("for", this.#textarea.id);
236
- if (this.#preview_button !== undefined) this.#preview_button.setAttribute("aria-controls", this.#preview.id);
238
+ if (this.#previewButton !== undefined) this.#previewButton.setAttribute("aria-controls", this.#preview.id);
237
239
  this.#syncDescribedBy();
238
240
  return this;
239
241
  }
@@ -255,7 +257,7 @@ class MarkdownEditor {
255
257
 
256
258
  /** Подпись над полем; `undefined` её убирает (имя тогда даёт `label`) */
257
259
  setTitle(text = undefined) {
258
- this.#title_text = text;
260
+ this.#titleText = text;
259
261
  // `for` держим всегда: в разметке настоящий <label>, а подпись появляется и исчезает
260
262
  this.#label.setAttribute("for", this.#textarea.id);
261
263
  if (text === undefined || text === "") {
@@ -272,8 +274,8 @@ class MarkdownEditor {
272
274
 
273
275
  /** Имя поля, когда подписи в разметке нет */
274
276
  setLabel(text = undefined) {
275
- this.#label_text = text;
276
- if (this.#title_text === undefined || this.#title_text === "") {
277
+ this.#labelText = text;
278
+ if (this.#titleText === undefined || this.#titleText === "") {
277
279
  if (text === undefined) this.#textarea.removeAttribute("aria-label");
278
280
  else this.#textarea.setAttribute("aria-label", String(text));
279
281
  }
@@ -305,7 +307,7 @@ class MarkdownEditor {
305
307
  setValue(value = String(), silent = false) {
306
308
  const text = value === undefined || value === null ? "" : String(value);
307
309
  // В тихом режиме (так зовёт Form.setValues) слишком длинный текст не подставляем
308
- if (silent === true && this.#max_length !== undefined && text.length > this.#max_length) return this;
310
+ if (silent === true && this.#maxLength !== undefined && text.length > this.#maxLength) return this;
309
311
  this.setTextAreaValue(text);
310
312
  this.#syncCount();
311
313
  return this;
@@ -320,20 +322,23 @@ class MarkdownEditor {
320
322
 
321
323
  /** Предпросмотр: кнопка панели становится переключателем */
322
324
  setPreview(on = Boolean()) {
323
- if (!this.#preview_enabled) return this;
324
- this.#preview_on = on === true;
325
- this.#textarea.hidden = this.#preview_on;
326
- this.#preview.hidden = !this.#preview_on;
327
- if (this.#preview_on) this.#preview.innerHTML = this.getPreviewHtml();
328
- if (this.#preview_button !== undefined) {
329
- this.#preview_button.setAttribute("aria-pressed", this.#preview_on ? "true" : "false");
330
- this.#preview_button.setAttribute("aria-label", this.#preview_on ? I18n.t("editor.showMarkup") : I18n.t("editor.showPreview"));
325
+ if (!this.#previewEnabled) return this;
326
+ this.#previewOn = on === true;
327
+ this.#textarea.hidden = this.#previewOn;
328
+ this.#preview.hidden = !this.#previewOn;
329
+ if (this.#previewOn) this.#preview.innerHTML = this.getPreviewHtml();
330
+ if (this.#previewButton !== undefined) {
331
+ this.#previewButton.setAttribute("aria-pressed", this.#previewOn ? "true" : "false");
332
+ this.#previewButton.setAttribute(
333
+ "aria-label",
334
+ this.#previewOn ? I18n.t("editor.showMarkup") : I18n.t("editor.showPreview")
335
+ );
331
336
  }
332
337
  return this;
333
338
  }
334
339
 
335
340
  togglePreview() {
336
- return this.setPreview(!this.#preview_on);
341
+ return this.setPreview(!this.#previewOn);
337
342
  }
338
343
 
339
344
  /** Убирает или возвращает панель разметки (поле остаётся полем) */
@@ -352,10 +357,10 @@ class MarkdownEditor {
352
357
  return this.#eachLine(marker);
353
358
  }
354
359
 
355
- setReadOnly(read_only = Boolean()) {
356
- this.#read_only = read_only === true;
357
- this.#root.classList.toggle("markdown_editor_readonly", this.#read_only);
358
- this.#textarea.readOnly = this.#read_only;
360
+ setReadOnly(readOnly = Boolean()) {
361
+ this.#readOnly = readOnly === true;
362
+ this.#root.classList.toggle("markdown_editor_readonly", this.#readOnly);
363
+ this.#textarea.readOnly = this.#readOnly;
359
364
  this.#actionButtonState();
360
365
  return this;
361
366
  }
@@ -377,7 +382,7 @@ class MarkdownEditor {
377
382
  /** Фокус на текст; `Form` зовёт это при ошибке валидации */
378
383
  focus() {
379
384
  if (this.#disabled) return this;
380
- if (this.#preview_on) this.setPreview(false);
385
+ if (this.#previewOn) this.setPreview(false);
381
386
  this.#textarea.focus();
382
387
  return this;
383
388
  }
@@ -389,8 +394,8 @@ class MarkdownEditor {
389
394
 
390
395
  // === ВНУТРЕННЕЕ ===
391
396
  #accessibleName() {
392
- if (this.#title_text !== undefined && this.#title_text !== "") return this.#title_text;
393
- if (this.#label_text !== undefined && this.#label_text !== "") return this.#label_text;
397
+ if (this.#titleText !== undefined && this.#titleText !== "") return this.#titleText;
398
+ if (this.#labelText !== undefined && this.#labelText !== "") return this.#labelText;
394
399
  return I18n.t("editor.markdownText");
395
400
  }
396
401
 
@@ -398,8 +403,8 @@ class MarkdownEditor {
398
403
  // предпросмотр — не правка: его гасит только запрет самого поля (раньше setDisabled
399
404
  // включал кнопки обратно и затирал режим только для чтения)
400
405
  #actionButtonState() {
401
- for (const button of this.#actions.values()) button.disabled = this.#disabled || this.#read_only;
402
- if (this.#preview_button !== undefined) this.#preview_button.disabled = this.#disabled;
406
+ for (const button of this.#actions.values()) button.disabled = this.#disabled || this.#readOnly;
407
+ if (this.#previewButton !== undefined) this.#previewButton.disabled = this.#disabled;
403
408
  return this;
404
409
  }
405
410
 
@@ -409,7 +414,12 @@ class MarkdownEditor {
409
414
  button.type = "button";
410
415
  button.className = "markdown_editor_action";
411
416
  button.dataset.action = action.id;
412
- button.setAttribute("aria-label", action.shortcut === undefined ? I18n.t(action.labelKey) : `${I18n.t(action.labelKey)} (${action.shortcut.replace("Control", "Ctrl")})`);
417
+ button.setAttribute(
418
+ "aria-label",
419
+ action.shortcut === undefined
420
+ ? I18n.t(action.labelKey)
421
+ : `${I18n.t(action.labelKey)} (${action.shortcut.replace("Control", "Ctrl")})`
422
+ );
413
423
  if (action.shortcut !== undefined) button.setAttribute("aria-keyshortcuts", action.shortcut);
414
424
  const glyph = new Icon(action.icon, "18px").set();
415
425
  glyph.setAttribute("aria-hidden", "true");
@@ -418,27 +428,27 @@ class MarkdownEditor {
418
428
  this.#actions.set(action.id, button);
419
429
  this.#toolbar.appendChild(button);
420
430
  }
421
- if (!this.#preview_enabled) return;
431
+ if (!this.#previewEnabled) return;
422
432
  const divider = document.createElement("markdown_editor_divider");
423
433
  divider.setAttribute("aria-hidden", "true");
424
434
  this.#toolbar.appendChild(divider);
425
- this.#preview_button = document.createElement("button");
426
- this.#preview_button.type = "button";
427
- this.#preview_button.className = "markdown_editor_action markdown_editor_preview";
428
- this.#preview_button.setAttribute("aria-pressed", "false");
429
- this.#preview_button.setAttribute("aria-label", I18n.t("editor.showPreview"));
430
- this.#preview_button.setAttribute("aria-controls", this.#preview.id);
435
+ this.#previewButton = document.createElement("button");
436
+ this.#previewButton.type = "button";
437
+ this.#previewButton.className = "markdown_editor_action markdown_editor_preview";
438
+ this.#previewButton.setAttribute("aria-pressed", "false");
439
+ this.#previewButton.setAttribute("aria-label", I18n.t("editor.showPreview"));
440
+ this.#previewButton.setAttribute("aria-controls", this.#preview.id);
431
441
  const glyph = new Icon(Icons.ACTIONS.VISIBILITY, "18px").set();
432
442
  glyph.setAttribute("aria-hidden", "true");
433
- this.#preview_button.appendChild(glyph);
434
- this.#preview_button.addEventListener("click", () => this.togglePreview());
435
- this.#toolbar.appendChild(this.#preview_button);
443
+ this.#previewButton.appendChild(glyph);
444
+ this.#previewButton.addEventListener("click", () => this.togglePreview());
445
+ this.#toolbar.appendChild(this.#previewButton);
436
446
  }
437
447
 
438
448
  // Значение ставится программно: слушателей не дёргаем (как у других полей)
439
449
  setTextAreaValue(text = String()) {
440
450
  this.#textarea.value = text;
441
- if (this.#preview_on) this.#preview.innerHTML = this.getPreviewHtml();
451
+ if (this.#previewOn) this.#preview.innerHTML = this.getPreviewHtml();
442
452
  return this;
443
453
  }
444
454
 
@@ -451,11 +461,11 @@ class MarkdownEditor {
451
461
  }
452
462
 
453
463
  #syncCount() {
454
- const has_limit = this.#max_length !== undefined;
455
- this.#footer.hidden = !has_limit;
456
- if (!has_limit) return this;
457
- this.#count.innerText = `${this.getValue().length} / ${this.#max_length}`;
458
- this.#count.classList.toggle("markdown_editor_count_over", this.getValue().length > this.#max_length);
464
+ const hasLimit = this.#maxLength !== undefined;
465
+ this.#footer.hidden = !hasLimit;
466
+ if (!hasLimit) return this;
467
+ this.#count.innerText = `${this.getValue().length} / ${this.#maxLength}`;
468
+ this.#count.classList.toggle("markdown_editor_count_over", this.getValue().length > this.#maxLength);
459
469
  return this;
460
470
  }
461
471
 
@@ -466,11 +476,11 @@ class MarkdownEditor {
466
476
  #notify() {
467
477
  const value = this.getValue();
468
478
  for (const listener of [...this.#listeners]) listener(value, this);
469
- if (this.#on_change !== undefined) this.#on_change(value, this);
479
+ if (this.#onChange !== undefined) this.#onChange(value, this);
470
480
  }
471
481
 
472
482
  // Правка диапазона: вставка идёт командой, поэтому Ctrl+Z в поле её отменяет
473
- #replaceRange(start = Number(), end = Number(), text = String(), caret_start = Number(), caret_end = Number()) {
483
+ #replaceRange(start = Number(), end = Number(), text = String(), caretStart = Number(), caretEnd = Number()) {
474
484
  const textarea = this.#textarea;
475
485
  textarea.focus();
476
486
  textarea.setSelectionRange(start, end);
@@ -486,8 +496,8 @@ class MarkdownEditor {
486
496
  this.#syncCount();
487
497
  this.#notify();
488
498
  }
489
- if (this.#preview_on) this.#preview.innerHTML = this.getPreviewHtml();
490
- textarea.setSelectionRange(caret_start, caret_end);
499
+ if (this.#previewOn) this.#preview.innerHTML = this.getPreviewHtml();
500
+ textarea.setSelectionRange(caretStart, caretEnd);
491
501
  return this;
492
502
  }
493
503
 
@@ -501,7 +511,13 @@ class MarkdownEditor {
501
511
  const from = start + before.length;
502
512
  const to = from + inner.length;
503
513
  // С выделением остаётся выделен весь результат, без него каретка встаёт внутрь разметки
504
- return this.#replaceRange(start, end, text, selected === "" && placeholder !== "" ? from : start, selected === "" && placeholder !== "" ? to : start + text.length);
514
+ return this.#replaceRange(
515
+ start,
516
+ end,
517
+ text,
518
+ selected === "" && placeholder !== "" ? from : start,
519
+ selected === "" && placeholder !== "" ? to : start + text.length
520
+ );
505
521
  }
506
522
 
507
523
  #eachLine(marker = undefined) {
@@ -518,7 +534,7 @@ class MarkdownEditor {
518
534
  }
519
535
 
520
536
  #apply(id = String()) {
521
- if (this.#disabled || this.#read_only) return this;
537
+ if (this.#disabled || this.#readOnly) return this;
522
538
  const action = ACTIONS.find((item) => item.id === id);
523
539
  const wrap = WRAPS[id];
524
540
  if (id === "link") this.#linkWrap();
@@ -528,7 +544,7 @@ class MarkdownEditor {
528
544
  else if (id === "bullets") this.#eachLine("- ");
529
545
  else if (id === "checklist") this.#eachLine("- [ ] ");
530
546
  else if (id === "numbers") this.#eachLine((line, index) => `${index + 1}. ${line}`);
531
- if (action !== undefined) this.#announce(I18n.t("editor.applied", {action: I18n.t(action.labelKey)}));
547
+ if (action !== undefined) this.#announce(I18n.t("editor.applied", { action: I18n.t(action.labelKey) }));
532
548
  return this;
533
549
  }
534
550
 
@@ -551,14 +567,14 @@ class MarkdownEditor {
551
567
  }
552
568
 
553
569
  #onInput = () => {
554
- if (this.#disabled || this.#read_only) return;
570
+ if (this.#disabled || this.#readOnly) return;
555
571
  this.#syncCount();
556
- if (this.#preview_on) this.#preview.innerHTML = this.getPreviewHtml();
572
+ if (this.#previewOn) this.#preview.innerHTML = this.getPreviewHtml();
557
573
  this.#notify();
558
574
  };
559
575
 
560
576
  #onKeyDown = (event) => {
561
- if (this.#disabled || this.#read_only) return;
577
+ if (this.#disabled || this.#readOnly) return;
562
578
  if (event.ctrlKey !== true && event.metaKey !== true) return;
563
579
  const key = String(event.key).toLowerCase();
564
580
  if (key !== "b" && key !== "i" && key !== "k") return;
@@ -567,4 +583,4 @@ class MarkdownEditor {
567
583
  };
568
584
  }
569
585
 
570
- exports.MarkdownEditor = MarkdownEditor
586
+ exports.MarkdownEditor = MarkdownEditor;
@@ -8,13 +8,13 @@ chui_markdown_editor {
8
8
  width: var(--control_width);
9
9
  max-width: 100%;
10
10
  height: max-content;
11
- margin: var(--margin);
11
+ margin: var(--block_margin);
12
12
  }
13
13
 
14
14
  .markdown_editor_label {
15
15
  display: block;
16
16
  width: max-content;
17
- margin: var(--margin);
17
+ margin: var(--block_margin);
18
18
  color: var(--text_color);
19
19
  font-size: var(--font_labels_size);
20
20
  font-weight: 500;
@@ -33,7 +33,7 @@ chui_markdown_editor {
33
33
  padding: 4px;
34
34
  border: 1px solid var(--border_color);
35
35
  border-bottom: none;
36
- border-radius: var(--border_radius) var(--border_radius) 0 0;
36
+ border-radius: var(--radius_sm) var(--radius_sm) 0 0;
37
37
  background: var(--element_background_2);
38
38
  }
39
39
 
@@ -98,7 +98,7 @@ markdown_editor_divider {
98
98
  box-sizing: border-box;
99
99
  overflow: hidden;
100
100
  border: 1px solid var(--border_color);
101
- border-radius: 0 0 var(--border_radius) var(--border_radius);
101
+ border-radius: 0 0 var(--radius_sm) var(--radius_sm);
102
102
  background: var(--element_background);
103
103
  }
104
104
 
@@ -123,7 +123,7 @@ markdown_editor_divider {
123
123
  border: none;
124
124
  background: transparent;
125
125
  color: var(--text_color);
126
- font-family: var(--code_font, monospace);
126
+ font-family: var(--font_mono);
127
127
  font-size: var(--font_default_size);
128
128
  line-height: 1.5;
129
129
  resize: vertical;