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
@@ -0,0 +1,248 @@
1
+ /* ── MessageBar — лента сообщений ───────────────────────────── */
2
+ chui_message_bar {
3
+ display: flex;
4
+ flex-direction: column;
5
+ box-sizing: border-box;
6
+ width: -webkit-fill-available;
7
+ height: max-content;
8
+ margin: var(--block_margin);
9
+ overflow: hidden;
10
+ border-radius: var(--radius_sm);
11
+ background: var(--element_background);
12
+ border: 1px solid var(--border_color);
13
+ font-size: var(--font_default_size);
14
+ color: var(--text_color);
15
+ }
16
+
17
+ /* Лента и кнопка «Новые сообщения» живут в одной коробке: кнопка лежит поверх нижнего края,
18
+ а не под лентой, — поэтому она и попадает в поле зрения, и не отнимает высоту у сообщений */
19
+ message_bar_view {
20
+ position: relative;
21
+ display: flex;
22
+ flex-direction: column;
23
+ height: var(--message_bar_height, 320px);
24
+ min-height: 0;
25
+ }
26
+
27
+ /* Лента прокручивается сама: страница под ней не растёт. Сообщения лежат отдельным слоем —
28
+ за его размером следит `ResizeObserver`, чтобы лента осталась у нижнего края, когда стили
29
+ доехали, окно изменило ширину или догрузилась картинка */
30
+ message_bar_feed {
31
+ display: flex;
32
+ flex-direction: column;
33
+ flex: 1 1 auto;
34
+ min-height: 0;
35
+ box-sizing: border-box;
36
+ padding: var(--control_padding);
37
+ overflow-y: auto;
38
+ overflow-x: hidden;
39
+ background: var(--element_background_2);
40
+ /* Кольцо фокуса рисует общее правило темы, а смещает его внутрь общий список
41
+ обрезанных коробок (`message_bar_feed` рядом с `chat_log` в global_style.css):
42
+ лента лежит в коробке с `overflow: hidden`, внешний контур срезался бы */
43
+ }
44
+
45
+ message_bar_content {
46
+ display: flex;
47
+ flex-direction: column;
48
+ flex: 1 1 auto;
49
+ gap: 6px;
50
+ min-height: 0;
51
+ }
52
+
53
+ message_bar_empty {
54
+ margin: auto;
55
+ padding: var(--control_padding);
56
+ color: var(--text_color_disabled);
57
+ font-size: var(--font_labels_size);
58
+ text-align: center;
59
+ }
60
+
61
+ message_bar_empty[hidden] {
62
+ display: none;
63
+ }
64
+
65
+ /* Кнопка «Новые сообщения»/«К низу»: показ и уборка идут переходом, поэтому кнопка
66
+ не мигает и в скрытом состоянии не перехватывает щелчки (видимость снимается целиком) */
67
+ .message_bar_jump {
68
+ position: absolute;
69
+ inset-block-end: var(--control_padding);
70
+ inset-inline-start: 50%;
71
+ display: flex;
72
+ flex-direction: row;
73
+ align-items: center;
74
+ gap: 4px;
75
+ box-sizing: border-box;
76
+ padding: 4px var(--control_padding);
77
+ border: none;
78
+ border-radius: var(--radius_pill);
79
+ background: var(--blue_prime_background);
80
+ color: var(--text_color_hover);
81
+ font-family: inherit;
82
+ font-size: var(--font_labels_size);
83
+ font-weight: 500;
84
+ cursor: pointer;
85
+ box-shadow: var(--box_shadow_main);
86
+ visibility: hidden;
87
+ opacity: 0;
88
+ transform: translateX(-50%) translateY(4px);
89
+ transition:
90
+ opacity var(--motion_fast) var(--motion_ease),
91
+ transform var(--motion_fast) var(--motion_ease),
92
+ visibility var(--motion_fast);
93
+ }
94
+
95
+ .message_bar_jump[data-visible="true"] {
96
+ visibility: visible;
97
+ opacity: 1;
98
+ transform: translateX(-50%);
99
+ }
100
+
101
+ .message_bar_jump:hover {
102
+ background: var(--blue_prime_background_tint_strong);
103
+ }
104
+
105
+ .message_bar_jump_icon {
106
+ display: flex;
107
+ align-items: center;
108
+ }
109
+
110
+ .message_bar_jump chui_icon {
111
+ color: inherit;
112
+ }
113
+
114
+ /* Разделитель дня: подпись-пилюля по центру ленты */
115
+ message_bar_day {
116
+ display: flex;
117
+ justify-content: center;
118
+ padding: 2px 0;
119
+ }
120
+
121
+ message_bar_day_label {
122
+ padding: 2px var(--control_padding);
123
+ border-radius: var(--radius_sm);
124
+ background: var(--element_background);
125
+ border: 1px solid var(--border_color);
126
+ color: var(--text_color_disabled);
127
+ font-size: var(--font_labels_size);
128
+ }
129
+
130
+ /* Группа сообщений одного автора одного дня: аватар и стопка пузырей */
131
+ message_bar_group {
132
+ display: flex;
133
+ flex-direction: row;
134
+ align-items: flex-end;
135
+ gap: 8px;
136
+ }
137
+
138
+ message_bar_group[data-own="true"] {
139
+ flex-direction: row-reverse;
140
+ }
141
+
142
+ message_bar_bubbles {
143
+ display: flex;
144
+ flex-direction: column;
145
+ gap: 4px;
146
+ max-width: 78%;
147
+ min-width: 0;
148
+ }
149
+
150
+ message_bar_bubble {
151
+ display: flex;
152
+ flex-direction: column;
153
+ gap: 2px;
154
+ padding: 8px 10px;
155
+ border-radius: var(--radius_sm);
156
+ background: var(--element_background);
157
+ border: 1px solid var(--border_color);
158
+ color: var(--text_color);
159
+ /* Новое сообщение встаёт на место: кадр общий — см. `chui_appear_up` в global_style.css */
160
+ animation: chui_appear_up var(--motion_base) var(--motion_ease);
161
+ }
162
+
163
+ /* Хвостик стопки: у последнего пузыря угол со стороны автора скруглён меньше — по нему
164
+ видно, где стопка кончается */
165
+ message_bar_bubble[data-last="true"][data-own="false"] {
166
+ border-end-start-radius: calc(var(--radius_sm) / 2);
167
+ }
168
+
169
+ message_bar_bubble[data-last="true"][data-own="true"] {
170
+ border-end-end-radius: calc(var(--radius_sm) / 2);
171
+ }
172
+
173
+ /* Свои сообщения — акцентом и справа */
174
+ message_bar_bubble[data-own="true"] {
175
+ background: var(--blue_prime_background);
176
+ border-color: var(--blue_prime_background);
177
+ color: var(--text_color_hover);
178
+ }
179
+
180
+ message_bar_author {
181
+ display: block;
182
+ font-size: var(--font_labels_size);
183
+ font-weight: 600;
184
+ color: var(--blue_prime_background);
185
+ }
186
+
187
+ message_bar_text {
188
+ display: block;
189
+ white-space: pre-wrap;
190
+ word-break: break-word;
191
+ line-height: 1.35;
192
+ }
193
+
194
+ message_bar_attachment {
195
+ display: block;
196
+ margin-block-start: 2px;
197
+ font-size: var(--font_labels_size);
198
+ text-decoration: underline;
199
+ }
200
+
201
+ message_bar_attachment a {
202
+ color: inherit;
203
+ }
204
+
205
+ message_bar_meta {
206
+ display: flex;
207
+ flex-direction: row;
208
+ align-items: center;
209
+ gap: 4px;
210
+ align-self: flex-end;
211
+ color: var(--text_color_disabled);
212
+ font-size: var(--font_labels_size);
213
+ }
214
+
215
+ message_bar_bubble[data-own="true"] message_bar_meta {
216
+ color: var(--text_color_hover_disabled);
217
+ }
218
+
219
+ message_bar_status {
220
+ display: flex;
221
+ align-items: center;
222
+ justify-content: center;
223
+ }
224
+
225
+ message_bar_status chui_icon {
226
+ color: inherit;
227
+ font-size: var(--font_labels_size);
228
+ }
229
+
230
+ message_bar_status[data-status="failed"] {
231
+ color: var(--red_prime_background);
232
+ }
233
+
234
+ /* Строка «печатает…»: на контейнерной ступени под лентой, как у чата */
235
+ message_bar_typing {
236
+ padding: var(--control_padding) var(--block_padding);
237
+ color: var(--text_color_disabled);
238
+ font-size: var(--font_labels_size);
239
+ animation: chui_appear_up var(--motion_base) var(--motion_ease);
240
+ }
241
+
242
+ .message_bar_typing_leaving {
243
+ animation: chui_leave_up var(--motion_fast) var(--motion_ease) forwards;
244
+ }
245
+
246
+ message_bar_typing[hidden] {
247
+ display: none;
248
+ }
@@ -1,7 +1,7 @@
1
- const {Animation} = require('../../modules/chui_animations/animations');
2
- const {OverlayA11y} = require('../../modules/chui_a11y/chui_a11y');
3
- const {optionOr} = require('../../modules/chui_functions');
4
- const {I18n} = require('../../modules/chui_i18n/chui_i18n');
1
+ const { Animation } = require("../../modules/chui_animations/animations");
2
+ const { OverlayA11y } = require("../../modules/chui_a11y/chui_a11y");
3
+ const { optionOr } = require("../../modules/chui_functions");
4
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
5
5
 
6
6
  class Dialog {
7
7
  #id = require("randomstring").generate();
@@ -9,23 +9,26 @@ class Dialog {
9
9
  // Занавес под диалогом: размывает и затемняет окно. Живёт отдельным узлом в body
10
10
  // (внутри диалога его бы срезал собственный overflow), клики пропускает насквозь.
11
11
  #scrim = document.createElement(`dialog_scrim`);
12
- #header = document.createElement('dialog_header');
13
- #body = document.createElement('dialog_body');
14
- #footer = document.createElement('dialog_footer');
12
+ #header = document.createElement("dialog_header");
13
+ #body = document.createElement("dialog_body");
14
+ #footer = document.createElement("dialog_footer");
15
15
  //
16
16
  #a11y = undefined;
17
- #outside_click_bound = false;
17
+ #outsideClickBound = false;
18
+ // Место, откуда слой открыли: туда он вернётся после ухода
19
+ #origin = undefined;
18
20
  isOpen = false;
19
21
 
20
- constructor(options = {
21
- width: String(),
22
- height: String(),
23
- title: String(),
24
- closeOutSideClick: false
25
- }) {
26
-
27
- require('../../modules/chui_functions').setStyles(__dirname + "/styles.css", 'chUiJS_Dialogs');
28
- this.#dialog.id = this.#id
22
+ constructor(
23
+ options = {
24
+ width: String(),
25
+ height: String(),
26
+ title: String(),
27
+ closeOutSideClick: false,
28
+ }
29
+ ) {
30
+ require("../../modules/chui_functions").setStyles(__dirname + "/styles.css", "chUiJS_Dialogs");
31
+ this.#dialog.id = this.#id;
29
32
  this.#scrim.setAttribute("aria-hidden", "true");
30
33
  // Занавес встаёт в body при открытии: у неоткрытого диалога в документе не остаётся
31
34
  // лишнего узла (TextEditor и витрина создают диалоги заранее — каждый оставлял занавес)
@@ -35,7 +38,7 @@ class Dialog {
35
38
  this.#a11y = new OverlayA11y(this.#dialog, {
36
39
  role: "dialog",
37
40
  label: optionOr(options.title, I18n.t("feedback.dialog")),
38
- onEscape: () => this.close()
41
+ onEscape: () => this.close(),
39
42
  });
40
43
 
41
44
  this.#dialog.style.width = options.width === undefined ? "max-content" : options.width;
@@ -43,59 +46,76 @@ class Dialog {
43
46
 
44
47
  if (options.closeOutSideClick) {
45
48
  this.#dialog.addEventListener("animationend", (evt) => {
46
- if (evt.animationName === "fade-in" && !this.#outside_click_bound) {
47
- this.#outside_click_bound = true;
48
- window.addEventListener('click', this.#closeOutsideEvent)
49
+ if (evt.animationName === "fade-in" && !this.#outsideClickBound) {
50
+ this.#outsideClickBound = true;
51
+ window.addEventListener("click", this.#closeOutsideEvent);
49
52
  }
50
- })
53
+ });
51
54
  }
55
+ // Слой возвращается на место после ухода и снимает занавес из документа
56
+ this.#dialog.addEventListener("animationend", this.#returnHome);
52
57
  //ADDS
53
- this.#dialog.appendChild(this.#body)
58
+ this.#dialog.appendChild(this.#body);
54
59
  }
55
60
 
56
61
  #closeOutsideEvent = (event) => {
57
62
  if (!this.#dialog.contains(event.target)) {
58
- if (this.#outside_click_bound) {
59
- this.#outside_click_bound = false;
60
- window.removeEventListener("click", this.#closeOutsideEvent)
63
+ if (this.#outsideClickBound) {
64
+ this.#outsideClickBound = false;
65
+ window.removeEventListener("click", this.#closeOutsideEvent);
61
66
  }
62
- this.close()
67
+ this.close();
63
68
  }
64
- }
69
+ };
70
+
71
+ /**
72
+ * Уход доигран: диалог возвращается туда, откуда открывался, а занавес убирается из
73
+ * документа — закрытому слою в body делать нечего (карточку, из которой его открыли,
74
+ * могли уже снести), при следующем открытии занавес встанет заново.
75
+ * Слушатель висит постоянно: вход (`fade-in`) и чужие кадры внутри диалога пропускаем.
76
+ */
77
+ #returnHome = (event) => {
78
+ if (event.target !== this.#dialog || event.animationName !== "fade-out" || this.isOpen) return;
79
+ this.#scrim.remove();
80
+ const origin = this.#origin;
81
+ if (origin === undefined || origin === null || origin === document.body) return;
82
+ if (origin.isConnected === false) return;
83
+ origin.appendChild(this.#dialog);
84
+ };
65
85
 
66
86
  #resizeEvent = () => {
67
87
  if (!document.contains(this.#dialog)) return;
68
- this.#setCenter(this.#dialog, window)
69
- }
88
+ this.#setCenter(this.#dialog, window);
89
+ };
70
90
 
71
91
  addToHeader(...components) {
72
- this.#dialog.insertBefore(this.#header, this.#body)
73
- for (let component of components) this.#header.appendChild(component.set());
92
+ this.#dialog.insertBefore(this.#header, this.#body);
93
+ for (const component of components) this.#header.appendChild(component.set());
74
94
  }
75
95
 
76
96
  addToBody(...components) {
77
- for (let component of components) this.#body.appendChild(component.set());
97
+ for (const component of components) this.#body.appendChild(component.set());
78
98
  }
79
99
 
80
100
  addToFooter(...components) {
81
- this.#dialog.appendChild(this.#footer)
82
- for (let component of components) this.#footer.appendChild(component.set());
101
+ this.#dialog.appendChild(this.#footer);
102
+ for (const component of components) this.#footer.appendChild(component.set());
83
103
  }
84
104
 
85
105
  removeFromHeader(...components) {
86
- for (let component of components) new Animation(component.set()).fadeOutAndRemove();
106
+ for (const component of components) new Animation(component.set()).fadeOutAndRemove();
87
107
  }
88
108
 
89
109
  removeFromBody(...components) {
90
- for (let component of components) new Animation(component.set()).fadeOutAndRemove();
110
+ for (const component of components) new Animation(component.set()).fadeOutAndRemove();
91
111
  }
92
112
 
93
113
  removeFromFooter(...components) {
94
- for (let component of components) new Animation(component.set()).fadeOutAndRemove();
114
+ for (const component of components) new Animation(component.set()).fadeOutAndRemove();
95
115
  }
96
116
 
97
117
  open() {
98
- this.isOpen = true
118
+ this.isOpen = true;
99
119
  // if (this.#width === "-webkit-fill-available" && this.#height === "-webkit-fill-available") {
100
120
  // dialog.style.top = "0"
101
121
  // dialog.style.left = "0"
@@ -106,38 +126,43 @@ class Dialog {
106
126
  // this.#setCenter(dialog, window)
107
127
  // }
108
128
 
109
- window.addEventListener("resize", this.#resizeEvent)
129
+ window.addEventListener("resize", this.#resizeEvent);
130
+ // Слой встаёт в body — рядом с занавесом и шапкой окна: у обоих `backdrop-filter` и
131
+ // `z-index`, а внутри карточки Chromium собирает такой слой отдельной поверхностью и
132
+ // рисует её под слоями из body — занавес закрывал диалог целиком
133
+ this.#origin = this.#dialog.parentElement;
134
+ if (this.#dialog.parentElement !== document.body) document.body.appendChild(this.#dialog);
110
135
  // Занавес нужен только открытому слою
111
136
  if (document.body.contains(this.#scrim) === false) document.body.appendChild(this.#scrim);
112
137
  new Animation(this.#dialog).fadeIn();
113
138
  new Animation(this.#scrim).fadeIn();
114
- this.#setCenter(this.#dialog, window)
115
- this.#a11y.open()
139
+ this.#setCenter(this.#dialog, window);
140
+ this.#a11y.open();
116
141
  }
117
142
 
118
143
  /** Доступное имя диалога (aria-label), если заголовок в разметке не годится.
119
144
  * Пустое значение имя не затирает — иначе слой остался бы безымянным */
120
145
  setAriaLabel(text = String()) {
121
146
  if (typeof text !== "string" || text.trim() === "") return;
122
- this.#a11y.setLabel(text)
147
+ this.#a11y.setLabel(text);
123
148
  }
124
149
 
125
150
  openAndClose() {
126
151
  if (!this.isOpen) {
127
- this.open()
152
+ this.open();
128
153
  } else {
129
- this.close()
154
+ this.close();
130
155
  }
131
156
  }
132
157
 
133
158
  close() {
134
- if (this.#outside_click_bound) {
135
- this.#outside_click_bound = false;
136
- window.removeEventListener("click", this.#closeOutsideEvent)
159
+ if (this.#outsideClickBound) {
160
+ this.#outsideClickBound = false;
161
+ window.removeEventListener("click", this.#closeOutsideEvent);
137
162
  }
138
- window.removeEventListener("resize", this.#resizeEvent)
139
- this.isOpen = false
140
- this.#a11y.close()
163
+ window.removeEventListener("resize", this.#resizeEvent);
164
+ this.isOpen = false;
165
+ this.#a11y.close();
141
166
  new Animation(this.#dialog).fadeOut();
142
167
  new Animation(this.#scrim).fadeOut();
143
168
  }
@@ -155,20 +180,20 @@ class Dialog {
155
180
 
156
181
  #setCenter(element, window) {
157
182
  // Ширина
158
- const width = parseInt(window.getComputedStyle(element).width) + "px"
183
+ const width = parseInt(window.getComputedStyle(element).width) + "px";
159
184
  if (element.style.width === "-webkit-fill-available") {
160
- element.style.left = "0"
185
+ element.style.left = "0";
161
186
  } else {
162
187
  element.style.left = `calc(100% / 2 - ${width} / 2)`;
163
188
  }
164
189
  // Высота
165
- const height = parseInt(window.getComputedStyle(element).height) + "px"
190
+ const height = parseInt(window.getComputedStyle(element).height) + "px";
166
191
  if (element.style.height === "-webkit-fill-available") {
167
- element.style.top = "0"
192
+ element.style.top = "0";
168
193
  } else {
169
194
  element.style.top = `calc(100% / 2 - ${height} / 2)`;
170
195
  }
171
196
  }
172
197
  }
173
198
 
174
- exports.Dialog = Dialog
199
+ exports.Dialog = Dialog;
@@ -59,7 +59,8 @@ dialog_header .chui_button:not(:disabled):hover {
59
59
  }
60
60
 
61
61
  dialog_header .chui_button:not(:disabled):active {
62
- background: var(--element_background_prime); color: var(--text_color_hover);
62
+ background: var(--element_background_prime);
63
+ color: var(--text_color_hover);
63
64
  border: none;
64
65
  }
65
66
 
@@ -91,4 +92,4 @@ dialog_footer {
91
92
  margin-top: 12px;
92
93
  padding-top: 12px;
93
94
  border-top: 1px solid var(--border_color);
94
- }
95
+ }