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
@@ -37,7 +37,11 @@
37
37
  он дорого (композитинг всего, что под слоем). Насыщенность оставлена: она и даёт
38
38
  ощущение стекла, а не серой плёнки. */
39
39
  --global_blur: saturate(180%) blur(20px);
40
+ /* Отступ поверхности (карточка, панель, список): 8px по вертикали, 13px по горизонтали.
41
+ Значение держит прежнее имя --main_padding, новое --block_padding читает его:
42
+ чужие стили правят ключ по имени, и переименование не должно их отключать. */
40
43
  --main_padding: calc(8px * var(--density)) calc(13px * var(--density));
44
+ --block_padding: var(--main_padding);
41
45
  /* Отступ внутри контрола — 8px по всем сторонам: пара к --control_width.
42
46
  Прежнее имя --test_padding оставлено псевдонимом: оно попало в документацию и в
43
47
  чужие проекты, поэтому убираем его отдельным шагом, а не молча ломаем вёрстку. */
@@ -46,10 +50,11 @@
46
50
 
47
51
  /* Компактный шаг контрола — для кнопки и полей ввода. 5px по вертикали дают 29px высоты
48
52
  (строка 17 + отступы 10 + 2 черты при `box-sizing: border-box`), то есть тот же шаг,
49
- что у кнопок шапки (30px). Общие --main_padding/--control_padding трогать нельзя:
53
+ что у кнопок шапки (30px). Общие --block_padding/--control_padding трогать нельзя:
50
54
  их берут ещё 43 файла поверхностей и списков, где 8px и есть нужная плотность,
51
55
  поэтому контролы задают себе компактные значения локально у своего корня. */
52
56
  --main_padding_sm: calc(5px * var(--density)) calc(11px * var(--density));
57
+ --block_padding_sm: var(--main_padding_sm);
53
58
  --control_padding_sm: calc(5px * var(--density));
54
59
  /* Высота контрола одним числом: её берут те поля, у которых высота не следует
55
60
  из содержимого (chips, color_picker, hotkey, masked, date, time) */
@@ -61,17 +66,18 @@
61
66
  До неё плееры держали числа у себя (30/36 px у кнопки, 24/30 px у глифов) */
62
67
  --player_control_size: calc(32px * var(--density));
63
68
  --player_play_size: calc(36px * var(--density));
64
- /* Глифы панели: глиф меньше кнопки — кнопка читается площадкой, а не рамкой значка */
69
+ /* Глифы панели: глиф меньше кнопки — кнопка читается площадкой, а не рамкой значка.
70
+ Размер берут стили плееров (`font-size` у кнопки), а значок его наследует: одно число
71
+ на оба плеера. Прежде оно было вписано числом в код (пять мест) */
65
72
  --player_icon_size: 18px;
66
73
  /* Высота полосы прогресса и дорожки громкости */
67
74
  --player_track_height: 4px;
68
- --player_row_height: calc(34px * var(--density));
69
- /* Ползунок дорожек: белый круг в обеих схемах — он лежит и на акцентной заливке,
70
- и на серой дорожке, а цвет подложки на нём пропадал (в тёмной схеме — чёрный блоб) */
71
- --player_thumb_background: #ffffff;
72
75
  --header_icon_size: 13pt;
73
76
  --font_default_size: 14px;
74
77
  --font_labels_size: 12px;
78
+ /* Моно-шрифт: семейство ставит `chui_fonts.installMono()`. Ключ общий, потому что
79
+ код рисуют несколько компонентов (вставка кода, редакторы, примеры в подписях) */
80
+ --font_mono: "chui_mono", monospace;
75
81
  /* Дубль размера подписи: уведомление читается тем же кеглем. Алиас разрешается
76
82
  на `:root`, поэтому локальное переопределение `--font_labels_size` его не меняет */
77
83
  --font_notification_size: var(--font_labels_size);
@@ -84,7 +90,10 @@
84
90
  --font_lead_size: 18px;
85
91
  --font_display_size: 30px;
86
92
  --button_text_color: var(--text_color);
93
+ /* Отступ между блоками. Значение держит прежнее имя --margin, новое --block_margin
94
+ читает его — по той же причине, что и у отступа поверхности. */
87
95
  --margin: calc(6px * var(--density));
96
+ --block_margin: var(--margin);
88
97
  /* Высота шапки: одна точка правды. От неё считаются отступ содержимого, положение
89
98
  и отступы выдвижных панелей — раньше то же число было вписано в четырёх местах
90
99
  (47px, 46px, 65px), и правка одного значения уводила панели.
@@ -93,31 +102,23 @@
93
102
  47px = кнопка 30px + отступы 8px сверху и снизу + черта 1px. */
94
103
  --header_height: calc(47px * var(--density));
95
104
  /* Вертикальный отступ содержимого полосы: 30px кнопка + 8 сверху и снизу = 46px полосы.
96
- Горизонтальные зазоры шапки — общий --margin. */
105
+ Горизонтальные зазоры шапки — общий --block_margin. */
97
106
  --header_margin: calc(8px * var(--density));
98
107
 
99
108
  /* Скругления: контролы — radius_sm, поверхности — radius_md, капсулы — pill.
100
109
  Отдельного «среднего» значения больше нет: 10px рядом с 8 и 12 не читались как
101
110
  система, а выглядели как случайный набор. */
102
- --border_radius: var(--radius_sm);
103
111
  --radius_sm: 8px;
104
112
  --radius_md: 12px;
105
113
  --radius_pill: 999px;
106
114
  --radius_circle: 50%;
115
+ /* Прежнее имя малого скругления: было --border_radius без шкалы в названии. Внутри
116
+ стили читают --radius_sm, чужой ключ остаётся псевдонимом и уйдёт отдельным шагом. */
117
+ --border_radius: var(--radius_sm);
107
118
 
108
119
  /* Ширина управляющих элементов */
109
120
  --control_width: 200px;
110
121
 
111
- /* Тени: три уровня — контактный (main), всплывающий (drop) и модальный (modal).
112
- Форма одна на всю оболочку: два слоя с большим разлётом и малым процентом — тень
113
- читается как мягкое затемнение под элементом, а не как обводка. Одиночный слой с
114
- малым разлётом читался именно обводкой, а резкие тени (20–40%) — как грязь на карточках.
115
- В тёмной схеме та же форма с большими процентами: чёрная тень на почти чёрной
116
- подложке иначе не видна (см. main_theme_style.css). */
117
- --box_shadow_main: 0 1px 2px rgb(0 0 0 / 4%), 0 3px 10px rgb(0 0 0 / 5%);
118
- --box_shadow_drop: 0 2px 6px rgb(0 0 0 / 5%), 0 14px 36px rgb(0 0 0 / 9%);
119
- --box_shadow_modal: 0 4px 12px rgb(0 0 0 / 6%), 0 28px 72px rgb(0 0 0 / 14%);
120
-
121
122
  /* Фокус. Кольцо одно на всю оболочку: `--focus_outline` для обычных
122
123
  элементов и `--focus_outline_offset_inset` — для тех, кого обрезает
123
124
  контейнер (ячейка сетки, журнал чата, строки листа действий). */
@@ -125,11 +126,26 @@
125
126
  --focus_outline_offset: 2px;
126
127
  --focus_outline_offset_inset: -2px;
127
128
 
128
- /* Тайминг анимаций */
129
- --transition_time: .165s;
130
- /* Кривая движения: быстрый старт, мягкое торможение — «выезд» панели читается
131
- как отклик, а не как линейный сдвиг. Отскока нет намеренно. */
132
- --ease_out: cubic-bezier(.2, .8, .2, 1);
129
+ /* Движение: три длительности и три кривые — один набор на всё приложение.
130
+ Длительность выбирается по роли, а не «на глаз»: состояния (наведение, нажатие,
131
+ фокус) быстрые, появление и перемещение — базовые, крупные поверхности (ящик,
132
+ шторка, полоса меню) медленные. Уход короче входа: покачивание на выходе задерживало
133
+ бы следующий экран.
134
+ Кривые: `--motion_ease` тормозит к покою (вход и перемещение читаются как отклик),
135
+ `--motion_ease_in_out` — для обратимых ходов (высота раскрытия, уход карточки),
136
+ `--motion_spring` даёт лёгкий перелёт на отклике (появление меню и диалога).
137
+ Прежние имена оставлены псевдонимами: они разошлись по стилям и документации. */
138
+ --motion_fast: 0.15s;
139
+ --motion_base: 0.25s;
140
+ --motion_slow: 0.4s;
141
+ --motion_ease: cubic-bezier(0.32, 0.72, 0, 1);
142
+ --motion_ease_in_out: cubic-bezier(0.4, 0, 0.2, 1);
143
+ --motion_spring: cubic-bezier(0.34, 1.4, 0.64, 1);
144
+ /* Переключатель состояния без движения: у `visibility` время нулевое, а всё движение
145
+ несёт соседнее свойство — так узел появляется сразу, а исчезает только после ухода */
146
+ --motion_none: 0s;
147
+ --transition_time: var(--motion_fast);
148
+ --ease_out: var(--motion_ease);
133
149
 
134
150
  /* Схема нативных частей: палитры приложения разложены по prefers-color-scheme,
135
151
  поэтому браузер должен рисовать и родные части (каретка, выделение, системные
@@ -149,6 +165,67 @@ html {
149
165
  background: var(--main_background);
150
166
  }
151
167
 
168
+ /* Вложенная поверхность. Контейнерные поверхности носят заливку карточки — и карточка тоже:
169
+ внутри карточки контейнер сливался с хозяином, и разделяла их только граница (шаг светлоты 0;
170
+ так в витрине выглядели SidebarNav, List, Toolbar, CodeEditor и остальные). Вложенный
171
+ контейнер берёт нейтральную заливку: на карточке это шаг светлоты 8.4 в тёмной схеме и 5.6
172
+ в светлой — не меньше, чем между подложкой и карточкой (7.7 и 4.4), а числа печатает
173
+ `npm run palette:check`. В обоих списках — контейнерные поверхности: то, что носит заливку
174
+ карточки и может оказаться внутри другого такого же. Своя заливка у контейнера остаётся:
175
+ на подложке он читается как карточка, и лишь вложенность опускает его на нейтральную ступень. */
176
+ :is(
177
+ chui_card,
178
+ chui_list,
179
+ chui_sidebar_nav,
180
+ chui_toolbar,
181
+ chui_status_bar,
182
+ chui_shortcut_help,
183
+ chui_clipboard_history,
184
+ chui_code_editor,
185
+ chui_json_viewer,
186
+ chui_tree_view,
187
+ chui_gantt,
188
+ chui_scheduler,
189
+ chui_splitter,
190
+ chui_drop_zone,
191
+ chui_statistic,
192
+ chui_alert,
193
+ chui_banner,
194
+ chui_actions_bar,
195
+ chui_user_bar,
196
+ write_bar_row,
197
+ chui_editor_controls,
198
+ .chui_code,
199
+ .settings_section
200
+ )
201
+ :is(
202
+ chui_card,
203
+ chui_list,
204
+ chui_sidebar_nav,
205
+ chui_toolbar,
206
+ chui_status_bar,
207
+ chui_shortcut_help,
208
+ chui_clipboard_history,
209
+ chui_code_editor,
210
+ chui_json_viewer,
211
+ chui_tree_view,
212
+ chui_gantt,
213
+ chui_scheduler,
214
+ chui_splitter,
215
+ chui_drop_zone,
216
+ chui_statistic,
217
+ chui_alert,
218
+ chui_banner,
219
+ chui_actions_bar,
220
+ chui_user_bar,
221
+ write_bar_row,
222
+ chui_editor_controls,
223
+ .chui_code,
224
+ .settings_section
225
+ ) {
226
+ background: var(--element_background);
227
+ }
228
+
152
229
  /* Коробки полей ввода. У внутреннего `input` своей рамки нет, а общее правило фокуса его
153
230
  намеренно исключает (`:not(input)` — у полей рисуется системная рамка), поэтому активное
154
231
  поле было видно только по карету. Наведение и фокус описаны одним правилом на список
@@ -263,7 +340,7 @@ chui_error_message {
263
340
  display: block;
264
341
  color: var(--red_prime_background);
265
342
  font-size: var(--font_labels_size);
266
- margin: var(--margin);
343
+ margin: var(--block_margin);
267
344
  }
268
345
 
269
346
  /* Активный пункт меню/опции при навигации с клавиатуры — совпадает с :hover.
@@ -279,51 +356,81 @@ chui_error_message {
279
356
  }
280
357
 
281
358
  * {
282
- font-family: 'chui_I';
359
+ font-family: "chui_I";
283
360
  font-style: normal;
284
361
  user-select: none;
285
362
  outline: none;
286
- transition: background-color var(--transition_time) ease,
287
- color var(--transition_time) ease,
288
- border-color var(--transition_time) ease,
289
- box-shadow var(--transition_time) ease,
290
- opacity var(--transition_time) ease,
291
- transform var(--transition_time) ease;
292
- animation-duration: var(--transition_time);
363
+ /* Движение по умолчанию: цвет, тень и яркость — быстрые состояния, прозрачность и
364
+ перемещение — базовые. Кривая одна (торможение к покою), поэтому один и тот же жест
365
+ в разных местах читается одинаково, а свои списки ниже только уточняют его */
366
+ transition:
367
+ background-color var(--motion_fast) var(--motion_ease),
368
+ color var(--motion_fast) var(--motion_ease),
369
+ border-color var(--motion_fast) var(--motion_ease),
370
+ box-shadow var(--motion_fast) var(--motion_ease),
371
+ filter var(--motion_fast) var(--motion_ease),
372
+ opacity var(--motion_base) var(--motion_ease),
373
+ transform var(--motion_base) var(--motion_ease);
374
+ animation-duration: var(--motion_base);
293
375
  position: relative;
294
376
  font-size: var(--font_default_size);
295
377
  line-height: normal;
296
378
  }
297
379
 
298
380
  *:before {
299
- font-family: 'chui_I';
381
+ font-family: "chui_I";
300
382
  font-style: normal;
301
383
  user-select: none;
302
384
  outline: none;
303
- transition: background-color var(--transition_time) ease,
304
- color var(--transition_time) ease,
305
- border-color var(--transition_time) ease,
306
- box-shadow var(--transition_time) ease,
307
- opacity var(--transition_time) ease,
308
- transform var(--transition_time) ease;
309
- animation-duration: var(--transition_time);
385
+ transition:
386
+ background-color var(--motion_fast) var(--motion_ease),
387
+ color var(--motion_fast) var(--motion_ease),
388
+ border-color var(--motion_fast) var(--motion_ease),
389
+ box-shadow var(--motion_fast) var(--motion_ease),
390
+ filter var(--motion_fast) var(--motion_ease),
391
+ opacity var(--motion_base) var(--motion_ease),
392
+ transform var(--motion_base) var(--motion_ease);
393
+ animation-duration: var(--motion_base);
310
394
  position: relative;
311
395
  font-size: var(--font_default_size);
312
396
  line-height: normal;
313
397
  }
314
398
 
399
+ /* Смена темы — кроссфейдом: браузер снимает страницу до и после смены и переводит один кадр
400
+ в другой (ведёт его служба темы, `crossFade` в `chui_animations/motion`). Своим переходом
401
+ смену схемы не показать: цвет приходит сменой `prefers-color-scheme`, а переходы на такое
402
+ изменение браузер не запускает (проверено замером — цвет подложки менялся кадром, хотя
403
+ класс с временем перехода на корне уже стоял). Время и кривая — из токенов движения:
404
+ смена схемы меняет цвет всего окна сразу, это крупная поверхность. При уменьшенном
405
+ движении кроссфейд не запускается вовсе — это решает JS. */
406
+ ::view-transition-old(root),
407
+ ::view-transition-new(root) {
408
+ animation-duration: var(--motion_slow, 0.4s);
409
+ animation-timing-function: var(--motion_ease, ease-out);
410
+ }
411
+
315
412
  :root *:focus-visible:not(input):not(textarea):not(select):not([contenteditable="true"]) {
316
413
  outline: var(--focus_outline);
317
414
  outline-offset: var(--focus_outline_offset);
318
415
  }
319
-
320
416
  /* Кольцо изнутри — там, где внешний контур срезает край контейнера с
321
417
  `overflow: hidden` или прокруткой: ячейка сетки уезжает под закреплённые
322
418
  колонки, журнал чата и строки листа действий лежат в обрезанной коробке.
323
419
  Селектор повторяет вес общего правила: `:where` специфичности не добавляет,
324
420
  а без повтора исключение проиграло бы — общее правило весит больше любого
325
421
  компонентного (0,6,0 против 0,2,0). */
326
- :root *:focus-visible:not(input):not(textarea):not(select):not([contenteditable="true"]):where(data_grid_cell, chat_log, chat_input, time_option, action_sheet_action, action_sheet_cancel) {
422
+ :root
423
+ *:focus-visible:not(input):not(textarea):not(select):not([contenteditable="true"]):where(
424
+ data_grid_cell,
425
+ chat_log,
426
+ chat_input,
427
+ message_bar_feed,
428
+ user_list_bar_item,
429
+ chui_user_bar,
430
+ time_option,
431
+ action_sheet_action,
432
+ action_sheet_cancel
433
+ ) {
327
434
  outline-offset: var(--focus_outline_offset_inset);
328
435
  }
329
436
 
@@ -459,7 +566,7 @@ header {
459
566
  логическими свойствами, поэтому в RTL скругление зеркалится; верхние углы прямые —
460
567
  их срезал бы композитор. */
461
568
  align-items: start;
462
- background-color: var(--header_background);
569
+ background-color: var(--bar_background);
463
570
  backdrop-filter: var(--global_blur);
464
571
  justify-content: space-between;
465
572
  border-bottom: 1px solid var(--border_color);
@@ -523,7 +630,7 @@ notification_panel {
523
630
  position: fixed;
524
631
  top: calc(var(--header_height) - 1px);
525
632
  inset-inline-end: 0;
526
- padding: var(--margin);
633
+ padding: var(--block_margin);
527
634
  align-items: flex-end;
528
635
  justify-content: flex-start;
529
636
  z-index: 1001;
@@ -533,8 +640,10 @@ notification_panel {
533
640
  chui_notification/styles.css): у всплывающей тени разлёт больше, и её обрезало бы
534
641
  краем панели в серый прямоугольник под карточками. */
535
642
  overflow: hidden auto;
536
- max-height: calc(100% - var(--header_height) - 18px - (var(--margin) * 2));
537
- transition: max-height var(--transition_time) ease-in-out;
643
+ max-height: calc(100% - var(--header_height) - 18px - (var(--block_margin) * 2));
644
+ /* Раскрытие панели — обратимый ход по высоте, поэтому базовая длительность и мягкая кривая
645
+ с обеих сторон, а не быстрая кривая состояний */
646
+ transition: max-height var(--motion_base) var(--motion_ease_in_out);
538
647
  }
539
648
 
540
649
  app_menu {
@@ -544,10 +653,12 @@ app_menu {
544
653
  justify-content: flex-start;
545
654
  align-items: flex-start;
546
655
  z-index: 1000;
547
- margin: calc(var(--header_height) + (var(--margin) * 2)) calc(var(--margin) * 2) calc(var(--margin) * 2) calc(var(--margin) * 2);
656
+ margin: calc(var(--header_height) + (var(--block_margin) * 2)) calc(var(--block_margin) * 2)
657
+ calc(var(--block_margin) * 2) calc(var(--block_margin) * 2);
548
658
  border-radius: var(--radius_md);
549
659
  box-shadow: var(--box_shadow_drop);
550
- background: var(--header_background);
660
+ /* Меню маршрутов — полоса оболочки: заливка — цвет подложки, а не карточки */
661
+ background: var(--bar_background);
551
662
  backdrop-filter: var(--global_blur);
552
663
  height: -webkit-fill-available;
553
664
  width: -webkit-fill-available;
@@ -562,26 +673,29 @@ notification_box {
562
673
  align-items: flex-start;
563
674
  height: -webkit-fill-available;
564
675
  z-index: 1000;
565
- margin: calc(var(--header_height) + (var(--margin) * 2)) calc(var(--margin) * 2) calc(var(--margin) * 2) calc(var(--margin) * 2);
676
+ margin: calc(var(--header_height) + (var(--block_margin) * 2)) calc(var(--block_margin) * 2)
677
+ calc(var(--block_margin) * 2) calc(var(--block_margin) * 2);
566
678
  border-radius: var(--radius_md);
567
679
  box-shadow: var(--box_shadow_drop);
568
- background: var(--header_background);
680
+ /* Ящик уведомлений — тоже полоса оболочки: заливка — цвет подложки */
681
+ background: var(--bar_background);
569
682
  backdrop-filter: var(--global_blur);
570
683
  width: -webkit-fill-available;
571
684
  border: 1px solid var(--border_color);
572
685
  }
573
686
 
574
- /* Панели выезжают сдвигом (transform ставит JS), поэтому движение задано здесь явно и с
575
- кривой --ease_out: выезд читается как отклик, а не как линейный сдвиг. Остальные свойства
576
- переходят как у всех элементов. */
687
+ /* Панели выезжают сдвигом (transform ставит JS), поэтому движение задано здесь явно и
688
+ с кривой --motion_ease: выезд читается как отклик, а не как линейный сдвиг. Остальные
689
+ свойства переходят как у всех элементов, но с быстрой длительностью — это состояния. */
577
690
  app_menu,
578
691
  notification_box {
579
- transition: transform var(--transition_time) var(--ease_out),
580
- background-color var(--transition_time) ease,
581
- color var(--transition_time) ease,
582
- border-color var(--transition_time) ease,
583
- box-shadow var(--transition_time) ease,
584
- opacity var(--transition_time) ease;
692
+ transition:
693
+ transform var(--motion_base) var(--motion_ease),
694
+ background-color var(--motion_fast) var(--motion_ease),
695
+ color var(--motion_fast) var(--motion_ease),
696
+ border-color var(--motion_fast) var(--motion_ease),
697
+ box-shadow var(--motion_fast) var(--motion_ease),
698
+ opacity var(--motion_fast) var(--motion_ease);
585
699
  }
586
700
 
587
701
  /* Шапка ящика уведомлений: заголовок со счётчиком истории и действие «Очистить». */
@@ -590,9 +704,10 @@ notification_box_header {
590
704
  flex-direction: row;
591
705
  align-items: center;
592
706
  justify-content: space-between;
593
- gap: var(--margin);
707
+ gap: var(--block_margin);
594
708
  width: -webkit-fill-available;
595
- padding-block: 10px 10px; padding-inline: 14px 10px;
709
+ padding-block: 10px 10px;
710
+ padding-inline: 14px 10px;
596
711
  box-shadow: inset 0 -1px 0 var(--border_color);
597
712
  }
598
713
 
@@ -687,8 +802,10 @@ route_views > * {
687
802
  }
688
803
 
689
804
  /* Разделитель дней в истории: липнет к верху списка, пока видна его группа, поэтому день
690
- остаётся названным и в середине длинной истории. Материал тот же, что у ящика: под
691
- подписью проезжают карточки, и без фона текст наложился бы на них. */
805
+ остаётся названным и в середине длинной истории. Подпись прозрачная полностью — ни заливки,
806
+ ни размытия: она не рисует полосу поверх списка, а только называет день. Текст — по центру
807
+ ящика. Из-за этого карточки при прокрутке проходят под подписью: это цена прозрачности,
808
+ прежде её закрывала заливка материала. */
692
809
  notification_group {
693
810
  position: sticky;
694
811
  top: 0;
@@ -696,11 +813,12 @@ notification_group {
696
813
  flex: none;
697
814
  width: -webkit-fill-available;
698
815
  padding: 8px 6px 6px;
699
- background: var(--header_background);
700
- backdrop-filter: var(--global_blur);
816
+ background: transparent;
817
+ backdrop-filter: none;
701
818
  color: var(--text_color_disabled);
702
819
  font-size: var(--font_notification_size);
703
820
  font-weight: 500;
821
+ text-align: center;
704
822
  }
705
823
 
706
824
  /* Отметка непрочитанного: точка в углу записи, пока ящик не открывали. Абсолютная, а не
@@ -732,6 +850,35 @@ notification_box_empty {
732
850
 
733
851
  .notification_box_empty_visible {
734
852
  display: flex;
853
+ /* Подсказка приходит движением: класс включает `display`, поэтому общий кадр
854
+ появления проигрывается заново, а не вспыхивает после очистки */
855
+ animation: chui_appear_up var(--motion_base) var(--motion_ease);
856
+ }
857
+
858
+ /*
859
+ * Очистка истории. Карточки уходят каскадом: номер в очереди ставит JS
860
+ * (`--notification_clear_index`), шаг — доля токена движения, поэтому весь список
861
+ * читается как рассыпающийся, а не выключенный одним щелчком. `forwards` держит
862
+ * конечное состояние, пока узел ещё в разметке: узел убирают по концу кадра.
863
+ */
864
+ .notification_clearing {
865
+ animation: notification_clear var(--motion_fast) var(--motion_ease) forwards;
866
+ animation-delay: calc(var(--motion_fast) / 4 * var(--notification_clear_index, 0));
867
+ /* Уезжающая карточка уже не цель: иначе её можно было бы нажать на ходу */
868
+ pointer-events: none;
869
+ }
870
+
871
+ @keyframes notification_clear {
872
+ to {
873
+ opacity: 0;
874
+ transform: translateX(100%);
875
+ }
876
+ }
877
+
878
+ /* Уход подписи дня: она гаснет вместе с карточками, а не пропадает из-под них */
879
+ .notification_group_leaving {
880
+ animation: chui_leave_up var(--motion_fast) var(--motion_ease) forwards;
881
+ pointer-events: none;
735
882
  }
736
883
 
737
884
  /* Кнопки шапки — одна высота и один вертикальный отступ: 30 + 8 + 8 = 46px полосы.
@@ -754,17 +901,16 @@ notification_button {
754
901
  высоты) — пилюля наведения казалась узкой. */
755
902
  width: 30px;
756
903
  border: none;
757
- border-radius: var(--border_radius);
904
+ border-radius: var(--radius_sm);
758
905
  padding: 0;
759
906
  margin-block: var(--header_margin) var(--header_margin);
760
907
  /* Отступ справа такой же, как слева: справа от кнопки уведомлений стоит группа
761
908
  кнопок окна с разделительной чертой (см. wc_box), и без своего отступа черта
762
909
  прилипала к значку */
763
- margin-inline: var(--margin) var(--margin);
910
+ margin-inline: var(--block_margin) var(--block_margin);
764
911
  background: transparent;
765
912
  color: var(--text_color);
766
913
  -webkit-app-region: no-drag;
767
- transition: background-color var(--transition_time) ease, color var(--transition_time) ease;
768
914
  }
769
915
 
770
916
  notification_button:hover {
@@ -772,7 +918,8 @@ notification_button:hover {
772
918
  }
773
919
 
774
920
  notification_button:active {
775
- background: var(--element_background_prime); color: var(--text_color_hover);
921
+ background: var(--element_background_prime);
922
+ color: var(--text_color_hover);
776
923
  }
777
924
 
778
925
  /* Открытый ящик уведомлений: тонировка акцента, а не ховер и не заливка во весь цвет */
@@ -814,14 +961,13 @@ app_menu_button {
814
961
  height: 30px;
815
962
  width: 30px;
816
963
  border: none;
817
- border-radius: var(--border_radius);
964
+ border-radius: var(--radius_sm);
818
965
  padding: 0;
819
966
  margin-block: var(--header_margin) var(--header_margin);
820
- margin-inline: var(--margin) var(--margin);
967
+ margin-inline: var(--block_margin) var(--block_margin);
821
968
  background: transparent;
822
969
  color: var(--text_color);
823
970
  -webkit-app-region: no-drag;
824
- transition: background-color var(--transition_time) ease, color var(--transition_time) ease;
825
971
  }
826
972
 
827
973
  app_menu_button:hover {
@@ -829,7 +975,8 @@ app_menu_button:hover {
829
975
  }
830
976
 
831
977
  app_menu_button:active {
832
- background: var(--element_background_prime); color: var(--text_color_hover);
978
+ background: var(--element_background_prime);
979
+ color: var(--text_color_hover);
833
980
  }
834
981
 
835
982
  /* Открытое меню маршрутов: та же тонировка акцента, что и у пунктов внутри */
@@ -904,11 +1051,12 @@ page_name {
904
1051
  border: none;
905
1052
  border-radius: var(--radius_pill);
906
1053
  padding: 0 12px;
907
- margin-block: var(--header_margin) var(--header_margin); margin-inline: 0 var(--margin);
1054
+ margin-block: var(--header_margin) var(--header_margin);
1055
+ margin-inline: 0 var(--block_margin);
908
1056
  font-size: var(--font_default_size);
909
1057
  font-weight: 500;
910
1058
  background: var(--element_background_disabled);
911
- color: var(--text_color)
1059
+ color: var(--text_color);
912
1060
  }
913
1061
 
914
1062
  /* Пустое название не занимает места: до выбора страницы шапка не должна держать пустую капсулу */
@@ -952,7 +1100,8 @@ route:hover {
952
1100
  }
953
1101
 
954
1102
  route:active {
955
- background: var(--element_background_prime); color: var(--text_color_hover);
1103
+ background: var(--element_background_prime);
1104
+ color: var(--text_color_hover);
956
1105
  }
957
1106
 
958
1107
  route_title {
@@ -1034,7 +1183,7 @@ blockquote {
1034
1183
  margin: 1.5em 10px;
1035
1184
  padding: 9px 14px;
1036
1185
  color: var(--text_color);
1037
- border-radius: var(--border_radius);
1186
+ border-radius: var(--radius_sm);
1038
1187
  display: flex;
1039
1188
  }
1040
1189
 
@@ -1043,7 +1192,7 @@ header_left_box {
1043
1192
  min-width: 0;
1044
1193
  overflow: hidden;
1045
1194
  width: -webkit-fill-available;
1046
- align-items: center
1195
+ align-items: center;
1047
1196
  }
1048
1197
 
1049
1198
  header_right_box {
@@ -1070,9 +1219,10 @@ user_button {
1070
1219
  width: max-content;
1071
1220
  border: none;
1072
1221
  color: var(--text_color);
1073
- border-radius: var(--border_radius);
1222
+ border-radius: var(--radius_sm);
1074
1223
  padding: 5px 13px;
1075
- margin-block: var(--header_margin) var(--header_margin); margin-inline: var(--margin) 0;
1224
+ margin-block: var(--header_margin) var(--header_margin);
1225
+ margin-inline: var(--block_margin) 0;
1076
1226
  font-size: var(--font_default_size);
1077
1227
  background: transparent;
1078
1228
  font-weight: 500;
@@ -1087,7 +1237,8 @@ user_button:hover {
1087
1237
  }
1088
1238
 
1089
1239
  user_button:active {
1090
- background: var(--element_background_prime); color: var(--text_color_hover);
1240
+ background: var(--element_background_prime);
1241
+ color: var(--text_color_hover);
1091
1242
  }
1092
1243
 
1093
1244
  /* Открытое меню: тонировка акцента — та же, что у открытых кнопок шапки.
@@ -1114,7 +1265,7 @@ user_dropdown {
1114
1265
  z-index: 1002;
1115
1266
  flex-direction: column;
1116
1267
  min-width: 165px;
1117
- padding: var(--margin);
1268
+ padding: var(--block_margin);
1118
1269
  background: var(--header_background);
1119
1270
  color: var(--text_color);
1120
1271
  border: 1px solid var(--border_color);
@@ -1125,7 +1276,7 @@ user_dropdown {
1125
1276
  }
1126
1277
 
1127
1278
  /* Пункт — плоская строка в стиле context_menu_item / пункта меню-бара: синяя заливка
1128
- ховера одна на всю семью меню, а размеры строки берутся из --main_padding. */
1279
+ ховера одна на всю семью меню, а размеры строки берутся из --block_padding. */
1129
1280
  user_dropdown user_item {
1130
1281
  color: var(--text_color);
1131
1282
  display: flex;
@@ -1135,8 +1286,8 @@ user_dropdown user_item {
1135
1286
  cursor: pointer;
1136
1287
  text-align: start;
1137
1288
  width: -webkit-fill-available;
1138
- padding: var(--main_padding);
1139
- border-radius: var(--border_radius)
1289
+ padding: var(--block_padding);
1290
+ border-radius: var(--radius_sm);
1140
1291
  }
1141
1292
 
1142
1293
  user_dropdown user_item:hover {
@@ -1170,7 +1321,7 @@ user_dd_image_main {
1170
1321
  align-items: center;
1171
1322
  justify-content: center;
1172
1323
  flex-wrap: nowrap;
1173
- margin-bottom: 6px
1324
+ margin-bottom: 6px;
1174
1325
  }
1175
1326
 
1176
1327
  /* chUiJS_HeaderButton */
@@ -1181,9 +1332,10 @@ header_button {
1181
1332
  height: calc(30px * var(--density));
1182
1333
  width: max-content;
1183
1334
  border: none;
1184
- border-radius: var(--border_radius);
1335
+ border-radius: var(--radius_sm);
1185
1336
  padding: 5px 13px;
1186
- margin-block: var(--header_margin) var(--header_margin); margin-inline: var(--margin) 0;
1337
+ margin-block: var(--header_margin) var(--header_margin);
1338
+ margin-inline: var(--block_margin) 0;
1187
1339
  font-size: var(--font_default_size);
1188
1340
  background: transparent;
1189
1341
  color: var(--text_color);
@@ -1192,7 +1344,6 @@ header_button {
1192
1344
  flex-direction: row;
1193
1345
  align-items: center;
1194
1346
  -webkit-app-region: no-drag;
1195
- transition: background-color var(--transition_time) ease, color var(--transition_time) ease;
1196
1347
  }
1197
1348
 
1198
1349
  header_button header_button_title {
@@ -1210,7 +1361,8 @@ header_button:hover {
1210
1361
  }
1211
1362
 
1212
1363
  header_button:active {
1213
- background: var(--element_background_prime); color: var(--text_color_hover);
1364
+ background: var(--element_background_prime);
1365
+ color: var(--text_color_hover);
1214
1366
  }
1215
1367
 
1216
1368
  /*Управление окном — те же кнопки-иконки, что и остальные в шапке, но приглушённые:
@@ -1243,7 +1395,9 @@ wc_box:not(:first-child) {
1243
1395
  box-shadow: inset 1px 0 0 var(--border_color);
1244
1396
  }
1245
1397
 
1246
- wc_close, wc_maximize, wc_minimize {
1398
+ wc_close,
1399
+ wc_maximize,
1400
+ wc_minimize {
1247
1401
  cursor: pointer;
1248
1402
  display: flex;
1249
1403
  align-items: center;
@@ -1255,7 +1409,6 @@ wc_close, wc_maximize, wc_minimize {
1255
1409
  border-radius: var(--radius_sm);
1256
1410
  background: transparent;
1257
1411
  color: var(--text_color_disabled);
1258
- transition: background-color var(--transition_time) ease, color var(--transition_time) ease;
1259
1412
  }
1260
1413
 
1261
1414
  /* Значки кнопок окна нарисованы линиями (SVG), а не взяты из шрифта иконок: три системные
@@ -1273,12 +1426,15 @@ wc_minimize svg {
1273
1426
  color: var(--text_color_disabled);
1274
1427
  }
1275
1428
 
1276
- wc_maximize:hover, wc_minimize:hover {
1429
+ wc_maximize:hover,
1430
+ wc_minimize:hover {
1277
1431
  background: var(--element_background_hover);
1278
1432
  }
1279
1433
 
1280
- wc_maximize:active, wc_minimize:active {
1281
- background: var(--element_background_prime); color: var(--text_color_hover);
1434
+ wc_maximize:active,
1435
+ wc_minimize:active {
1436
+ background: var(--element_background_prime);
1437
+ color: var(--text_color_hover);
1282
1438
  }
1283
1439
 
1284
1440
  wc_maximize:hover svg,
@@ -1303,7 +1459,9 @@ wc_close:active svg {
1303
1459
  color: var(--text_color);
1304
1460
  }
1305
1461
 
1306
- wc_close:focus-visible, wc_maximize:focus-visible, wc_minimize:focus-visible {
1462
+ wc_close:focus-visible,
1463
+ wc_maximize:focus-visible,
1464
+ wc_minimize:focus-visible {
1307
1465
  outline: var(--focus_outline);
1308
1466
  outline-offset: var(--focus_outline_offset);
1309
1467
  }
@@ -1333,4 +1491,37 @@ header_tabs {
1333
1491
 
1334
1492
  .header_tab_active header_button_icon chui_icon {
1335
1493
  color: var(--link_color);
1336
- }
1494
+ }
1495
+
1496
+ /* ── Появление строки в списке ─────────────────────────────── */
1497
+ /* Списки, которые наполняются по одной (журнал, чат, буфер обмена, лента), читаются
1498
+ растущим документом, если строка встаёт на место, а не возникает рывком. Кадр общий:
1499
+ одно движение на все списки, а время и кривая — из токенов движения */
1500
+ @keyframes chui_appear_up {
1501
+ from {
1502
+ opacity: 0;
1503
+ transform: translateY(6px);
1504
+ }
1505
+ }
1506
+
1507
+ /* Уход строки или слоя: гаснет и сходит вверх. Пара к `chui_appear_up`: узел убирается
1508
+ по концу кадра, а `forwards` держит конечное состояние, пока он ещё в документе */
1509
+ @keyframes chui_leave_up {
1510
+ to {
1511
+ opacity: 0;
1512
+ transform: translateY(-6px);
1513
+ }
1514
+ }
1515
+
1516
+ /* ── Появление всплывающей панели у триггера ───────────────── */
1517
+ /* Выпадающий список, меню и поповер читаются раскрывшимися у своего триггера, если панель
1518
+ приходит сверху вниз и чуть вырастает. Прежний `fade-in` менял только прозрачность —
1519
+ открытие получалось рывком.
1520
+ Конечное состояние не объявлено: панель возвращается к своим стилям, и вычисленный
1521
+ `transform` на ней не остаётся (иначе панель стала бы содержащим блоком для детей). */
1522
+ @keyframes chui_panel_in {
1523
+ from {
1524
+ opacity: 0;
1525
+ transform: translateY(-4px) scale(0.97);
1526
+ }
1527
+ }