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
@@ -7,13 +7,13 @@ chui_diff_viewer {
7
7
  box-sizing: border-box;
8
8
  width: -webkit-fill-available;
9
9
  max-width: 100%;
10
- margin: var(--margin);
10
+ margin: var(--block_margin);
11
11
  overflow: hidden;
12
12
  border: 1px solid var(--border_color);
13
- border-radius: var(--border_radius);
13
+ border-radius: var(--radius_sm);
14
14
  background: var(--element_background);
15
15
  color: var(--text_color);
16
- font-family: 'chui_mono', monospace;
16
+ font-family: "chui_mono", monospace;
17
17
  font-size: var(--font_default_size);
18
18
  }
19
19
 
@@ -24,7 +24,7 @@ chui_diff_viewer.diff_viewer_fixed .diff_viewer_body {
24
24
  .diff_viewer_title {
25
25
  display: block;
26
26
  width: max-content;
27
- margin: var(--margin);
27
+ margin: var(--block_margin);
28
28
  color: var(--text_color);
29
29
  font-family: system-ui, sans-serif;
30
30
  font-size: var(--font_labels_size);
@@ -68,17 +68,17 @@ chui_diff_viewer.diff_viewer_fixed .diff_viewer_body {
68
68
  }
69
69
 
70
70
  .diff_viewer_stat_removed {
71
- background: var(--badge_error_back);
71
+ background: var(--badge_error_background);
72
72
  color: var(--badge_error_text);
73
73
  }
74
74
 
75
75
  .diff_viewer_stat_added {
76
- background: var(--badge_success_back);
76
+ background: var(--badge_success_background);
77
77
  color: var(--badge_success_text);
78
78
  }
79
79
 
80
80
  .diff_viewer_stat_changed {
81
- background: var(--badge_warning_back);
81
+ background: var(--badge_warning_background);
82
82
  color: var(--badge_warning_text);
83
83
  }
84
84
 
@@ -246,15 +246,15 @@ chui_diff_viewer.diff_viewer_fixed .diff_viewer_body {
246
246
  /* Тона строк — те же, что у счётчиков: добавлено, удалено, заменено, без изменений.
247
247
  Класс строки собирается из типа модели (insert/delete/replace), поэтому имена совпадают с ним */
248
248
  .diff_viewer_row_insert {
249
- background: var(--badge_success_back);
249
+ background: var(--badge_success_background);
250
250
  }
251
251
 
252
252
  .diff_viewer_row_delete {
253
- background: var(--badge_error_back);
253
+ background: var(--badge_error_background);
254
254
  }
255
255
 
256
256
  .diff_viewer_row_replace {
257
- background: var(--badge_warning_back);
257
+ background: var(--badge_warning_background);
258
258
  }
259
259
 
260
260
  .diff_viewer_row_insert .diff_viewer_marker {
@@ -1,4 +1,4 @@
1
- const {setStyles, optionOr} = require('../../modules/chui_functions');
1
+ const { setStyles, optionOr } = require("../../modules/chui_functions");
2
2
 
3
3
  /**
4
4
  * Разделитель: тонкая линия между блоками, при необходимости с подписью.
@@ -19,24 +19,26 @@ const {setStyles, optionOr} = require('../../modules/chui_functions');
19
19
  class Divider {
20
20
  static ORIENTATION = {
21
21
  HORIZONTAL: "horizontal",
22
- VERTICAL: "vertical"
22
+ VERTICAL: "vertical",
23
23
  };
24
24
  static #counter = 0;
25
25
 
26
26
  #root = document.createElement("chui_divider");
27
27
  #line = document.createElement("divider_line");
28
28
  // Вторая линия существует ровно тогда, когда есть подпись
29
- #line_after = undefined;
29
+ #lineAfter = undefined;
30
30
  #text = undefined;
31
31
  #id = undefined;
32
32
 
33
- constructor(options = {
34
- id: String(),
35
- text: String(),
36
- orientation: String(),
37
- margin: Object(),
38
- width: String()
39
- }) {
33
+ constructor(
34
+ options = {
35
+ id: String(),
36
+ text: String(),
37
+ orientation: String(),
38
+ margin: Object(),
39
+ width: String(),
40
+ }
41
+ ) {
40
42
  setStyles(__dirname + "/styles.css", "chUiJS_Divider");
41
43
  Divider.#counter += 1;
42
44
  // Заготовка опции (`String()`) равносильна отсутствующей: без этого вызов `new Divider()`
@@ -78,17 +80,17 @@ class Divider {
78
80
  this.#text.remove();
79
81
  this.#text = undefined;
80
82
  }
81
- if (this.#line_after !== undefined) {
82
- this.#line_after.remove();
83
- this.#line_after = undefined;
83
+ if (this.#lineAfter !== undefined) {
84
+ this.#lineAfter.remove();
85
+ this.#lineAfter = undefined;
84
86
  }
85
87
  return this;
86
88
  }
87
89
  if (this.#text === undefined) {
88
90
  this.#text = document.createElement("divider_text");
89
- this.#line_after = document.createElement("divider_line");
91
+ this.#lineAfter = document.createElement("divider_line");
90
92
  this.#root.appendChild(this.#text);
91
- this.#root.appendChild(this.#line_after);
93
+ this.#root.appendChild(this.#lineAfter);
92
94
  }
93
95
  this.#text.innerText = text;
94
96
  return this;
@@ -103,7 +105,7 @@ class Divider {
103
105
  }
104
106
 
105
107
  /** Отступы со всех сторон: {top, bottom, left, right} — как у `Toggle.setMargin()` */
106
- setMargin(margin = {top: undefined, bottom: undefined, left: undefined, right: undefined}) {
108
+ setMargin(margin = { top: undefined, bottom: undefined, left: undefined, right: undefined }) {
107
109
  if (margin.top !== undefined) this.#root.style.marginTop = margin.top;
108
110
  if (margin.bottom !== undefined) this.#root.style.marginBottom = margin.bottom;
109
111
  if (margin.left !== undefined) this.#root.style.marginLeft = margin.left;
@@ -123,4 +125,4 @@ class Divider {
123
125
  }
124
126
  }
125
127
 
126
- exports.Divider = Divider
128
+ exports.Divider = Divider;
@@ -6,7 +6,7 @@ chui_divider {
6
6
  --divider_length: -webkit-fill-available;
7
7
  color: var(--text_color_disabled);
8
8
  font-size: var(--font_default_size);
9
- margin: var(--margin);
9
+ margin: var(--block_margin);
10
10
  }
11
11
 
12
12
  chui_divider[data-orientation="horizontal"] {
@@ -18,7 +18,7 @@ chui_divider[data-orientation="vertical"] {
18
18
  align-self: stretch;
19
19
  width: 1px;
20
20
  height: var(--divider_length);
21
- margin: 0 var(--margin);
21
+ margin: 0 var(--block_margin);
22
22
  }
23
23
 
24
24
  divider_line {
@@ -1,8 +1,8 @@
1
- const {Animation} = require('../../modules/chui_animations/animations');
2
- const {OverlayA11y, makeKeyboardButton} = require('../../modules/chui_a11y/chui_a11y');
3
- const {Icon, Icons} = require('../chui_icons/icons');
4
- const {setStyles, optionOr} = require('../../modules/chui_functions');
5
- const {I18n} = require('../../modules/chui_i18n/chui_i18n');
1
+ const { Animation } = require("../../modules/chui_animations/animations");
2
+ const { OverlayA11y, makeKeyboardButton } = require("../../modules/chui_a11y/chui_a11y");
3
+ const { Icon, Icons } = require("../chui_icons/icons");
4
+ const { setStyles, optionOr } = require("../../modules/chui_functions");
5
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
6
6
 
7
7
  /**
8
8
  * Боковая панель (drawer), выезжающая с одной из сторон окна.
@@ -24,7 +24,7 @@ class Drawer {
24
24
  LEFT: "left",
25
25
  RIGHT: "right",
26
26
  TOP: "top",
27
- BOTTOM: "bottom"
27
+ BOTTOM: "bottom",
28
28
  };
29
29
  static DEFAULT_WIDTH = "360px";
30
30
  static DEFAULT_HEIGHT = "280px";
@@ -43,30 +43,34 @@ class Drawer {
43
43
  #width = undefined;
44
44
  #height = undefined;
45
45
  #closable = true;
46
- #close_outside_click = false;
47
- #header_built = false;
48
- #footer_built = false;
46
+ #closeOutsideClick = false;
47
+ #headerBuilt = false;
48
+ #footerBuilt = false;
49
+ // Место, откуда слой открыли: туда он вернётся после ухода
50
+ #origin = undefined;
49
51
  // Имя слоя берётся из узла заголовка — тогда setTitle() ничего не переключает
50
- #labelled_by_title = false;
52
+ #labelledByTitle = false;
51
53
  #a11y = undefined;
52
54
  isOpen = false;
53
55
 
54
- constructor(options = {
55
- id: String(),
56
- title: String(),
57
- label: String(),
58
- side: String(),
59
- width: String(),
60
- height: String(),
61
- closable: Boolean(),
62
- closeOutSideClick: Boolean(),
63
- components: []
64
- }) {
56
+ constructor(
57
+ options = {
58
+ id: String(),
59
+ title: String(),
60
+ label: String(),
61
+ side: String(),
62
+ width: String(),
63
+ height: String(),
64
+ closable: Boolean(),
65
+ closeOutSideClick: Boolean(),
66
+ components: [],
67
+ }
68
+ ) {
65
69
  setStyles(__dirname + "/styles.css", "chUiJS_Drawer");
66
70
  this.#id = options.id === undefined ? require("randomstring").generate() : options.id;
67
71
  this.#drawer.id = this.#id;
68
72
  this.#closable = options.closable === undefined ? true : options.closable;
69
- this.#close_outside_click = options.closeOutSideClick === true;
73
+ this.#closeOutsideClick = options.closeOutSideClick === true;
70
74
  this.#width = options.width;
71
75
  this.#height = options.height;
72
76
  this.#panel.appendChild(this.#body);
@@ -80,13 +84,13 @@ class Drawer {
80
84
  // Пустая заготовка `title: String()` из описания опций заголовком не считается: иначе
81
85
  // слой ссылался бы на пустой узел и оставался без имени
82
86
  const title = optionOr(options.title, undefined);
83
- this.#labelled_by_title = title !== undefined;
87
+ this.#labelledByTitle = title !== undefined;
84
88
  if (title !== undefined) this.setTitle(title);
85
89
  this.#a11y = new OverlayA11y(this.#drawer, {
86
90
  role: "dialog",
87
- labelNode: this.#labelled_by_title ? this.#title : undefined,
88
- label: this.#labelled_by_title ? undefined : optionOr(options.label, I18n.t("feedback.drawer")),
89
- onEscape: () => this.close()
91
+ labelNode: this.#labelledByTitle ? this.#title : undefined,
92
+ label: this.#labelledByTitle ? undefined : optionOr(options.label, I18n.t("feedback.drawer")),
93
+ onEscape: () => this.close(),
90
94
  });
91
95
  if (this.#closable) this.#addCloseButton();
92
96
  if (options.components !== undefined) this.addToBody(...options.components);
@@ -121,7 +125,7 @@ class Drawer {
121
125
  if (this.#title.parentElement === null) this.#header.prepend(this.#title);
122
126
  this.#title.innerText = title;
123
127
  // Слой строился без заголовка: имя задавалось через aria-label — обновляем его
124
- if (!this.#labelled_by_title) {
128
+ if (!this.#labelledByTitle) {
125
129
  this.#a11y.setLabel(title);
126
130
  return this;
127
131
  }
@@ -185,7 +189,14 @@ class Drawer {
185
189
  open() {
186
190
  if (this.isOpen) return this;
187
191
  this.isOpen = true;
192
+ // Занавес ставится в body — рядом с шапкой и остальными слоями окна. У него
193
+ // `backdrop-filter` и `z-index`, а внутри карточки Chromium собирает такой слой
194
+ // отдельной поверхностью и рисует её под слоями из body: шапка приложения срезала
195
+ // верх панели вместе с заголовком и кнопкой закрытия
196
+ this.#origin = this.#drawer.parentElement;
197
+ if (this.#drawer.parentElement !== document.body) document.body.appendChild(this.#drawer);
188
198
  this.#panel.style.animationName = `drawer_${this.#side}_in`;
199
+ this.#panel.dataset.motion = "enter";
189
200
  new Animation(this.#drawer).fadeIn();
190
201
  this.#a11y.open();
191
202
  return this;
@@ -202,6 +213,7 @@ class Drawer {
202
213
  this.isOpen = false;
203
214
  this.#a11y.close();
204
215
  this.#panel.style.animationName = `drawer_${this.#side}_out`;
216
+ this.#panel.dataset.motion = "exit";
205
217
  new Animation(this.#drawer).fadeOut();
206
218
  return this;
207
219
  }
@@ -221,14 +233,14 @@ class Drawer {
221
233
  }
222
234
 
223
235
  #ensureHeader() {
224
- if (this.#header_built) return;
225
- this.#header_built = true;
236
+ if (this.#headerBuilt) return;
237
+ this.#headerBuilt = true;
226
238
  this.#panel.prepend(this.#header);
227
239
  }
228
240
 
229
241
  #ensureFooter() {
230
- if (this.#footer_built) return;
231
- this.#footer_built = true;
242
+ if (this.#footerBuilt) return;
243
+ this.#footerBuilt = true;
232
244
  this.#panel.appendChild(this.#footer);
233
245
  }
234
246
 
@@ -249,26 +261,39 @@ class Drawer {
249
261
  // Размер панели зависит от стороны: слева/справа — ширина, сверху/снизу — высота
250
262
  #applySize() {
251
263
  const vertical = this.#side === Drawer.SIDE.LEFT || this.#side === Drawer.SIDE.RIGHT;
252
- this.#panel.style.width = vertical
253
- ? (this.#width === undefined ? Drawer.DEFAULT_WIDTH : this.#width)
254
- : "100%";
264
+ this.#panel.style.width = vertical ? (this.#width === undefined ? Drawer.DEFAULT_WIDTH : this.#width) : "100%";
255
265
  this.#panel.style.height = vertical
256
266
  ? "100%"
257
- : (this.#height === undefined ? Drawer.DEFAULT_HEIGHT : this.#height);
267
+ : this.#height === undefined
268
+ ? Drawer.DEFAULT_HEIGHT
269
+ : this.#height;
258
270
  }
259
271
 
260
272
  // Клик по занавесу (но не по панели) закрывает панель, если это разрешено опцией
261
273
  #onDrawerClick = (event) => {
262
- if (!this.#close_outside_click || event.target !== this.#drawer) return;
274
+ if (!this.#closeOutsideClick || event.target !== this.#drawer) return;
263
275
  this.close();
264
- }
276
+ };
265
277
 
266
278
  // После проигрывания анимации имя снимается: иначе следующий показ не проиграется заново.
267
279
  // animationend всплывает, поэтому чужие анимации (спиннер внутри панели) пропускаем.
268
280
  #onPanelAnimationEnd = (event) => {
269
281
  if (event.target !== this.#panel) return;
270
282
  this.#panel.style.animationName = "";
283
+ if (this.isOpen) return;
284
+ // Уход доигран: слой возвращается туда, откуда открывался. Кадр откладывается на
285
+ // следующий кадр — перенос узла в момент `animationend` перезапустил бы уход
286
+ requestAnimationFrame(() => this.#returnHome());
287
+ };
288
+
289
+ /** Вернуть слой на прежнее место, если оно ещё в документе */
290
+ #returnHome() {
291
+ if (this.isOpen) return;
292
+ const origin = this.#origin;
293
+ if (origin === undefined || origin === null || origin === document.body) return;
294
+ if (origin.isConnected === false) return;
295
+ origin.appendChild(this.#drawer);
271
296
  }
272
297
  }
273
298
 
274
- exports.Drawer = Drawer
299
+ exports.Drawer = Drawer;
@@ -25,6 +25,20 @@ drawer_panel {
25
25
  backdrop-filter: var(--global_blur);
26
26
  }
27
27
 
28
+ /* Крупная поверхность выезжает медленнее базового движения, а уходит быстро: вид движения
29
+ ставит drawer.js, а длительность и кривая — здесь, иначе панель догоняла бы мелкие всплытия */
30
+ drawer_panel[data-motion="enter"] {
31
+ animation-duration: var(--motion_slow);
32
+ animation-timing-function: var(--motion_ease);
33
+ animation-fill-mode: both;
34
+ }
35
+
36
+ drawer_panel[data-motion="exit"] {
37
+ animation-duration: var(--motion_fast);
38
+ animation-timing-function: var(--motion_ease);
39
+ animation-fill-mode: both;
40
+ }
41
+
28
42
  /* Сторона панели. Радиус только на внутренних углах — панель «выходит» из-за края окна */
29
43
  chui_drawer[data-side="right"] > drawer_panel {
30
44
  inset-inline-end: 0;
@@ -132,7 +146,7 @@ drawer_header {
132
146
  flex-direction: row;
133
147
  align-items: center;
134
148
  justify-content: space-between;
135
- gap: var(--margin);
149
+ gap: var(--block_margin);
136
150
  padding: var(--control_padding);
137
151
  border-bottom: 1px solid var(--border_color);
138
152
  }
@@ -142,7 +156,7 @@ drawer_title {
142
156
  flex: 1;
143
157
  font-size: var(--font_default_size);
144
158
  font-weight: 500;
145
- padding: var(--margin);
159
+ padding: var(--block_margin);
146
160
  text-align: start;
147
161
  }
148
162
 
@@ -171,7 +185,7 @@ drawer_close:focus-visible {
171
185
  drawer_body {
172
186
  display: flex;
173
187
  flex-direction: column;
174
- gap: var(--margin);
188
+ gap: var(--block_margin);
175
189
  flex: 1;
176
190
  padding: var(--control_padding);
177
191
  overflow: auto;
@@ -182,7 +196,7 @@ drawer_footer {
182
196
  flex-direction: row;
183
197
  align-items: center;
184
198
  justify-content: flex-end;
185
- gap: var(--margin);
199
+ gap: var(--block_margin);
186
200
  padding: var(--control_padding);
187
201
  border-top: 1px solid var(--border_color);
188
202
  }
@@ -1,6 +1,6 @@
1
- const {setStyles, optionOr} = require('../../modules/chui_functions');
2
- const {Icon, Icons} = require('../chui_icons/icons');
3
- const {I18n} = require('../../modules/chui_i18n/chui_i18n');
1
+ const { setStyles, optionOr } = require("../../modules/chui_functions");
2
+ const { Icon, Icons } = require("../chui_icons/icons");
3
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
4
4
 
5
5
  /**
6
6
  * Зона приёма перетаскивания: файлы из системы, текст и ссылки.
@@ -44,30 +44,32 @@ class DropZone {
44
44
  #label = undefined;
45
45
  // Глубина входа: dragenter/dragleave приходят с дочерних узлов и гасили бы подсветку
46
46
  #depth = 0;
47
- #on_drop = undefined;
48
- #on_files = undefined;
47
+ #onDrop = undefined;
48
+ #onFiles = undefined;
49
49
  #files = [];
50
50
 
51
- constructor(options = {
52
- id: String(),
53
- title: String(),
54
- description: String(),
55
- icon: undefined,
56
- accept: [],
57
- multiple: Boolean(),
58
- disabled: Boolean(),
59
- label: String(),
60
- onDrop: undefined,
61
- onFiles: undefined
62
- }) {
51
+ constructor(
52
+ options = {
53
+ id: String(),
54
+ title: String(),
55
+ description: String(),
56
+ icon: undefined,
57
+ accept: [],
58
+ multiple: Boolean(),
59
+ disabled: Boolean(),
60
+ label: String(),
61
+ onDrop: undefined,
62
+ onFiles: undefined,
63
+ }
64
+ ) {
63
65
  setStyles(__dirname + "/styles.css", "chUiJS_DropZone");
64
66
  DropZone.#counter += 1;
65
67
  this.#id = options.id === undefined ? `chui_drop_zone_${DropZone.#counter}` : options.id;
66
68
  this.#root.id = this.#id;
67
69
  this.#accept = options.accept === undefined || options.accept.length === 0 ? undefined : options.accept;
68
70
  this.#multiple = options.multiple !== false;
69
- this.#on_drop = options.onDrop;
70
- this.#on_files = options.onFiles;
71
+ this.#onDrop = options.onDrop;
72
+ this.#onFiles = options.onFiles;
71
73
  // Пустая опция — «не задана»: `#applyLabel` тогда берёт подпись из заголовка
72
74
  this.#label = optionOr(options.label, undefined);
73
75
  this.#root.setAttribute("role", "button");
@@ -155,7 +157,12 @@ class DropZone {
155
157
  this.#icon.hidden = true;
156
158
  return this;
157
159
  }
158
- const node = typeof icon === "string" ? new Icon(icon, "28px").set() : (typeof icon.set === "function" ? icon.set() : icon);
160
+ const node =
161
+ typeof icon === "string"
162
+ ? new Icon(icon, "28px").set()
163
+ : typeof icon.set === "function"
164
+ ? icon.set()
165
+ : icon;
159
166
  node.setAttribute("aria-hidden", "true");
160
167
  this.#icon.appendChild(node);
161
168
  this.#icon.hidden = false;
@@ -225,10 +232,13 @@ class DropZone {
225
232
  const rejected = files.length - accepted.length;
226
233
  this.#files = this.#multiple ? accepted : accepted.slice(0, 1);
227
234
  this.#input.value = "";
228
- this.#status.innerText = rejected === 0
229
- ? (this.#files.length === 0 ? "" : I18n.t("forms.dropZoneAccepted", {count: this.#files.length}))
230
- : I18n.t("forms.dropZoneRejected", {count: rejected});
231
- if (this.#on_files !== undefined) this.#on_files(this.getFiles());
235
+ this.#status.innerText =
236
+ rejected === 0
237
+ ? this.#files.length === 0
238
+ ? ""
239
+ : I18n.t("forms.dropZoneAccepted", { count: this.#files.length })
240
+ : I18n.t("forms.dropZoneRejected", { count: rejected });
241
+ if (this.#onFiles !== undefined) this.#onFiles(this.getFiles());
232
242
  return rejected;
233
243
  }
234
244
 
@@ -240,12 +250,12 @@ class DropZone {
240
250
  paths: files.map((file) => file.path).filter((path) => path !== undefined),
241
251
  text: text === undefined || text === "" ? undefined : text,
242
252
  url: url === undefined || url === "" ? undefined : url,
243
- dataTransfer: dataTransfer
253
+ dataTransfer: dataTransfer,
244
254
  };
245
255
  }
246
256
 
247
257
  #emit(payload = Object()) {
248
- if (this.#on_drop !== undefined) this.#on_drop(payload);
258
+ if (this.#onDrop !== undefined) this.#onDrop(payload);
249
259
  }
250
260
 
251
261
  #setActive(active = Boolean()) {
@@ -309,4 +319,4 @@ class DropZone {
309
319
  };
310
320
  }
311
321
 
312
- exports.DropZone = DropZone
322
+ exports.DropZone = DropZone;
@@ -7,18 +7,18 @@ chui_drop_zone {
7
7
  gap: 6px;
8
8
  box-sizing: border-box;
9
9
  padding: 20px;
10
- margin: var(--margin);
10
+ margin: var(--block_margin);
11
11
  width: -webkit-fill-available;
12
12
  text-align: center;
13
13
  color: var(--text_color);
14
14
  font-size: var(--font_default_size);
15
15
  background: var(--element_background_2);
16
16
  border: 1px dashed var(--border_color);
17
- border-radius: var(--border_radius);
17
+ border-radius: var(--radius_sm);
18
18
  cursor: pointer;
19
19
  outline: none;
20
- /* Свой переход не нужен: фон и рамку анимирует общее правило `* { transition }`,
21
- а своё время (0.15s) расходилось с --transition_time */
20
+ /* Свой переход не нужен: фон и рамку ведёт общее правило `* { transition }` одним
21
+ видом движения — своё время ломало бы общий ритм */
22
22
  }
23
23
 
24
24
  chui_drop_zone:focus-visible {
@@ -27,10 +27,14 @@ chui_drop_zone:focus-visible {
27
27
  }
28
28
 
29
29
  chui_drop_zone.drop_zone_active {
30
- background: var(--blue_prime_background_trans);
30
+ background: var(--blue_prime_background_tint_strong);
31
31
  border-color: var(--blue_prime_background);
32
32
  border-style: solid;
33
33
  color: var(--text_color_hover);
34
+ /* Приём файла читается подъёмом: зона идёт навстречу перетаскиваемому, а не только
35
+ меняет цвет — это ответ на жест, а не смена состояния */
36
+ transform: scale(1.01);
37
+ box-shadow: var(--box_shadow_drop);
34
38
  }
35
39
 
36
40
  chui_drop_zone.drop_zone_disabled {
@@ -60,7 +64,7 @@ drop_zone_description {
60
64
  }
61
65
 
62
66
  chui_drop_zone.drop_zone_active drop_zone_description {
63
- color: var(--text_color_hover_disable);
67
+ color: var(--text_color_hover_disabled);
64
68
  }
65
69
 
66
70
  /* Скрытие идёт атрибутом hidden: авторский display перебил бы UA-правило [hidden] */
@@ -1,5 +1,5 @@
1
- const {setStyles} = require('../../modules/chui_functions');
2
- const {Icon} = require('../chui_icons/icons');
1
+ const { setStyles } = require("../../modules/chui_functions");
2
+ const { Icon } = require("../chui_icons/icons");
3
3
 
4
4
  /**
5
5
  * Пустое состояние: заглушка для списка, таблицы или раздела без данных.
@@ -35,15 +35,17 @@ class EmptyState {
35
35
  #id = undefined;
36
36
  #compact = false;
37
37
 
38
- constructor(options = {
39
- id: String(),
40
- icon: undefined,
41
- title: String(),
42
- description: String(),
43
- actions: [],
44
- compact: Boolean(),
45
- label: String()
46
- }) {
38
+ constructor(
39
+ options = {
40
+ id: String(),
41
+ icon: undefined,
42
+ title: String(),
43
+ description: String(),
44
+ actions: [],
45
+ compact: Boolean(),
46
+ label: String(),
47
+ }
48
+ ) {
47
49
  setStyles(__dirname + "/styles.css", "chUiJS_EmptyState");
48
50
  EmptyState.#counter += 1;
49
51
  this.#id = options.id === undefined ? `chui_empty_state_${EmptyState.#counter}` : options.id;
@@ -113,9 +115,12 @@ class EmptyState {
113
115
  this.#toggle(this.#icon, false);
114
116
  return this;
115
117
  }
116
- const node = typeof icon === "string"
117
- ? new Icon(icon, "32px").set()
118
- : (typeof icon.set === "function" ? icon.set() : icon);
118
+ const node =
119
+ typeof icon === "string"
120
+ ? new Icon(icon, "32px").set()
121
+ : typeof icon.set === "function"
122
+ ? icon.set()
123
+ : icon;
119
124
  node.setAttribute("aria-hidden", "true");
120
125
  this.#icon.appendChild(node);
121
126
  this.#toggle(this.#icon, true);
@@ -158,4 +163,4 @@ class EmptyState {
158
163
  }
159
164
  }
160
165
 
161
- exports.EmptyState = EmptyState
166
+ exports.EmptyState = EmptyState;