chuijs 4.0.3 → 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 (258) hide show
  1. package/CHANGELOG.md +536 -0
  2. package/framework/appLayout/default/chui_app_layout.js +361 -303
  3. package/framework/appLayout/default/global_style.css +243 -89
  4. package/framework/appLayout/default/main_theme_style.css +188 -101
  5. package/framework/components/chui_accordion/accordion.js +17 -17
  6. package/framework/components/chui_accordion/styles.css +7 -7
  7. package/framework/components/chui_action_sheet/action_sheet.js +35 -32
  8. package/framework/components/chui_action_sheet/styles.css +10 -4
  9. package/framework/components/chui_actions_bar/actions_bar.js +338 -0
  10. package/framework/components/chui_actions_bar/styles.css +139 -0
  11. package/framework/components/chui_affix/affix.js +4 -4
  12. package/framework/components/chui_affix/styles.css +5 -0
  13. package/framework/components/chui_alert/alert.js +11 -5
  14. package/framework/components/chui_alert/styles.css +7 -0
  15. package/framework/components/chui_avatar/avatar.js +13 -13
  16. package/framework/components/chui_avatar/styles.css +1 -1
  17. package/framework/components/chui_avatar_group/avatar_group.js +4 -4
  18. package/framework/components/chui_avatar_group/styles.css +1 -1
  19. package/framework/components/chui_backtop/backtop.js +25 -2
  20. package/framework/components/chui_backtop/styles.css +21 -0
  21. package/framework/components/chui_badge/badge.js +15 -15
  22. package/framework/components/chui_badge/styles.css +6 -6
  23. package/framework/components/chui_banner/banner.js +222 -0
  24. package/framework/components/chui_banner/styles.css +170 -0
  25. package/framework/components/chui_breadcrumb/styles.css +1 -1
  26. package/framework/components/chui_button/button.js +24 -28
  27. package/framework/components/chui_button/styles.css +5 -5
  28. package/framework/components/chui_calendar/calendar.js +6 -6
  29. package/framework/components/chui_card/card.js +14 -14
  30. package/framework/components/chui_card_scroll/card_scroll.js +169 -0
  31. package/framework/components/chui_card_scroll/styles.css +86 -0
  32. package/framework/components/chui_chat/chat.js +73 -51
  33. package/framework/components/chui_chat/styles.css +18 -7
  34. package/framework/components/chui_clipboard_history/clipboard_history.js +25 -20
  35. package/framework/components/chui_clipboard_history/styles.css +10 -8
  36. package/framework/components/chui_code/code.js +8 -8
  37. package/framework/components/chui_code/styles.css +2 -2
  38. package/framework/components/chui_code_editor/code_editor.js +26 -26
  39. package/framework/components/chui_code_editor/styles.css +3 -3
  40. package/framework/components/chui_command_palette/command_palette.js +29 -29
  41. package/framework/components/chui_command_palette/styles.css +5 -5
  42. package/framework/components/chui_console/console.js +9 -9
  43. package/framework/components/chui_console/styles.css +5 -2
  44. package/framework/components/chui_content_block/content_block.js +2 -2
  45. package/framework/components/chui_context_menu/context_menu.js +162 -54
  46. package/framework/components/chui_context_menu/styles.css +82 -8
  47. package/framework/components/chui_custom_element/custom_element.js +11 -11
  48. package/framework/components/chui_data_grid/data_grid.js +268 -268
  49. package/framework/components/chui_data_grid/styles.css +14 -14
  50. package/framework/components/chui_descriptions/styles.css +1 -1
  51. package/framework/components/chui_details/details.js +12 -12
  52. package/framework/components/chui_details/styles.css +7 -7
  53. package/framework/components/chui_diff_viewer/diff_viewer.js +88 -88
  54. package/framework/components/chui_diff_viewer/styles.css +9 -9
  55. package/framework/components/chui_divider/divider.js +6 -6
  56. package/framework/components/chui_divider/styles.css +2 -2
  57. package/framework/components/chui_drawer/drawer.js +37 -14
  58. package/framework/components/chui_drawer/styles.css +18 -4
  59. package/framework/components/chui_drop_zone/drop_zone.js +6 -6
  60. package/framework/components/chui_drop_zone/styles.css +10 -6
  61. package/framework/components/chui_fieldset/fieldset.js +6 -6
  62. package/framework/components/chui_fieldset/styles.css +5 -5
  63. package/framework/components/chui_file_explorer/file_explorer.js +115 -115
  64. package/framework/components/chui_file_explorer/styles.css +6 -6
  65. package/framework/components/chui_form/form.js +11 -11
  66. package/framework/components/chui_gantt/gantt.js +41 -41
  67. package/framework/components/chui_gantt/styles.css +5 -5
  68. package/framework/components/chui_graphs/graphs.js +82 -46
  69. package/framework/components/chui_graphs/styles.css +26 -5
  70. package/framework/components/chui_hero/hero.js +63 -20
  71. package/framework/components/chui_hero/styles.css +176 -7
  72. package/framework/components/chui_html_block/html_block.js +5 -5
  73. package/framework/components/chui_html_block/styles.css +1 -1
  74. package/framework/components/chui_hx/styles.css +2 -2
  75. package/framework/components/chui_icons/icons.js +7 -7
  76. package/framework/components/chui_icons/styles.css +2 -1
  77. package/framework/components/chui_inputs/chui_check_box/styles.css +12 -3
  78. package/framework/components/chui_inputs/chui_chips/chips.js +92 -31
  79. package/framework/components/chui_inputs/chui_chips/styles.css +28 -5
  80. package/framework/components/chui_inputs/chui_color_picker/color_picker.js +20 -15
  81. package/framework/components/chui_inputs/chui_color_picker/styles.css +7 -7
  82. package/framework/components/chui_inputs/chui_combo_box/combo_box.js +58 -58
  83. package/framework/components/chui_inputs/chui_combo_box/styles.css +9 -9
  84. package/framework/components/chui_inputs/chui_date/date.js +93 -95
  85. package/framework/components/chui_inputs/chui_date/styles.css +8 -8
  86. package/framework/components/chui_inputs/chui_date_range/date_range.js +22 -22
  87. package/framework/components/chui_inputs/chui_date_range/styles.css +3 -3
  88. package/framework/components/chui_inputs/chui_datetime/datetime.js +12 -12
  89. package/framework/components/chui_inputs/chui_datetime/styles.css +3 -3
  90. package/framework/components/chui_inputs/chui_email/email.js +10 -10
  91. package/framework/components/chui_inputs/chui_email/styles.css +6 -6
  92. package/framework/components/chui_inputs/chui_file/file.js +8 -8
  93. package/framework/components/chui_inputs/chui_file/styles.css +12 -9
  94. package/framework/components/chui_inputs/chui_hotkey/hotkey.js +39 -39
  95. package/framework/components/chui_inputs/chui_hotkey/styles.css +6 -6
  96. package/framework/components/chui_inputs/chui_masked/masked.js +44 -44
  97. package/framework/components/chui_inputs/chui_masked/styles.css +5 -5
  98. package/framework/components/chui_inputs/chui_mention/mention.js +13 -13
  99. package/framework/components/chui_inputs/chui_mention/styles.css +14 -8
  100. package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +147 -137
  101. package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +14 -8
  102. package/framework/components/chui_inputs/chui_number/number.js +42 -45
  103. package/framework/components/chui_inputs/chui_number/styles.css +6 -6
  104. package/framework/components/chui_inputs/chui_otp/otp.js +32 -32
  105. package/framework/components/chui_inputs/chui_otp/styles.css +5 -5
  106. package/framework/components/chui_inputs/chui_password/password.js +30 -36
  107. package/framework/components/chui_inputs/chui_password/styles.css +7 -7
  108. package/framework/components/chui_inputs/chui_radio_button/styles.css +2 -2
  109. package/framework/components/chui_inputs/chui_rating/rating.js +28 -28
  110. package/framework/components/chui_inputs/chui_rating/styles.css +3 -3
  111. package/framework/components/chui_inputs/chui_select_box/select_box.js +54 -54
  112. package/framework/components/chui_inputs/chui_select_box/styles.css +10 -10
  113. package/framework/components/chui_inputs/chui_slider/slider.js +14 -14
  114. package/framework/components/chui_inputs/chui_slider/styles.css +5 -4
  115. package/framework/components/chui_inputs/chui_text/styles.css +7 -7
  116. package/framework/components/chui_inputs/chui_text/text.js +13 -17
  117. package/framework/components/chui_inputs/chui_text_area/styles.css +8 -8
  118. package/framework/components/chui_inputs/chui_text_area/text_area.js +23 -23
  119. package/framework/components/chui_inputs/chui_time/styles.css +13 -17
  120. package/framework/components/chui_inputs/chui_time/time.js +35 -24
  121. package/framework/components/chui_inputs/chui_toggle/styles.css +10 -3
  122. package/framework/components/chui_inputs/chui_toggle/toggle.js +16 -16
  123. package/framework/components/chui_json_editor/json_editor.js +87 -87
  124. package/framework/components/chui_json_editor/styles.css +5 -5
  125. package/framework/components/chui_json_viewer/json_viewer.js +80 -80
  126. package/framework/components/chui_json_viewer/styles.css +6 -6
  127. package/framework/components/chui_kanban/kanban.js +27 -27
  128. package/framework/components/chui_kanban/styles.css +8 -4
  129. package/framework/components/chui_kbd/styles.css +1 -1
  130. package/framework/components/chui_label/label.js +17 -17
  131. package/framework/components/chui_label/styles.css +1 -1
  132. package/framework/components/chui_link/link.js +9 -9
  133. package/framework/components/chui_link/styles.css +11 -4
  134. package/framework/components/chui_list/list.js +11 -11
  135. package/framework/components/chui_list/styles.css +2 -2
  136. package/framework/components/chui_markdown_editor/markdown_editor.js +66 -66
  137. package/framework/components/chui_markdown_editor/styles.css +5 -5
  138. package/framework/components/chui_media/audio.js +240 -246
  139. package/framework/components/chui_media/audio_styles.css +41 -23
  140. package/framework/components/chui_media/image.js +49 -46
  141. package/framework/components/chui_media/image_compare.js +35 -35
  142. package/framework/components/chui_media/image_compare_styles.css +5 -5
  143. package/framework/components/chui_media/image_styles.css +1 -1
  144. package/framework/components/chui_media/video.js +148 -148
  145. package/framework/components/chui_media/video_styles.css +27 -11
  146. package/framework/components/chui_menu_bar/menu_bar.js +54 -54
  147. package/framework/components/chui_menu_bar/styles.css +10 -10
  148. package/framework/components/chui_message_bar/message_bar.js +551 -0
  149. package/framework/components/chui_message_bar/styles.css +248 -0
  150. package/framework/components/chui_modal/modal.js +37 -13
  151. package/framework/components/chui_notification/notification.js +76 -54
  152. package/framework/components/chui_notification/notification_download.js +26 -81
  153. package/framework/components/chui_notification/notification_download_card.js +115 -0
  154. package/framework/components/chui_notification/notification_download_progress.css +2 -2
  155. package/framework/components/chui_notification/notification_download_progress.js +70 -108
  156. package/framework/components/chui_notification/notification_update.js +31 -31
  157. package/framework/components/chui_notification/status_plate.css +3 -3
  158. package/framework/components/chui_notification/styles.css +6 -1
  159. package/framework/components/chui_notification/styles_download.css +1 -1
  160. package/framework/components/chui_notification/styles_update.css +2 -2
  161. package/framework/components/chui_org_chart/org_chart.js +29 -29
  162. package/framework/components/chui_org_chart/styles.css +2 -2
  163. package/framework/components/chui_pagination/pagination.js +3 -3
  164. package/framework/components/chui_pagination/styles.css +1 -1
  165. package/framework/components/chui_paragraph/styles.css +2 -2
  166. package/framework/components/chui_popover/popover.js +29 -23
  167. package/framework/components/chui_popover/styles.css +1 -1
  168. package/framework/components/chui_popups/popups.js +124 -124
  169. package/framework/components/chui_popups/styles.css +5 -5
  170. package/framework/components/chui_print_button/print_button.js +15 -10
  171. package/framework/components/chui_progress_bar/progress_bar.js +34 -12
  172. package/framework/components/chui_progress_bar/styles.css +4 -4
  173. package/framework/components/chui_progress_ring/progress_ring.js +15 -15
  174. package/framework/components/chui_progress_ring/styles.css +1 -1
  175. package/framework/components/chui_qrcode/qrcode.js +12 -12
  176. package/framework/components/chui_query_builder/query_builder.js +46 -46
  177. package/framework/components/chui_query_builder/styles.css +4 -4
  178. package/framework/components/chui_radio_group/styles.css +1 -1
  179. package/framework/components/chui_result/result.js +15 -15
  180. package/framework/components/chui_result/styles.css +3 -3
  181. package/framework/components/chui_scheduler/scheduler.js +74 -74
  182. package/framework/components/chui_scheduler/styles.css +5 -5
  183. package/framework/components/chui_screen_spinner/screen_spinner.js +167 -0
  184. package/framework/components/chui_screen_spinner/styles.css +49 -0
  185. package/framework/components/chui_segmented_control/segmented_control.js +63 -6
  186. package/framework/components/chui_segmented_control/styles.css +32 -6
  187. package/framework/components/chui_settings/settings.js +45 -46
  188. package/framework/components/chui_settings/styles.css +4 -4
  189. package/framework/components/chui_shortcut_help/shortcut_help.js +32 -34
  190. package/framework/components/chui_sidebar_nav/sidebar_nav.js +98 -29
  191. package/framework/components/chui_sidebar_nav/styles.css +9 -3
  192. package/framework/components/chui_slideshow/slideshow.js +85 -85
  193. package/framework/components/chui_slideshow/styles.css +6 -6
  194. package/framework/components/chui_spinner/spinner.js +10 -10
  195. package/framework/components/chui_split_button/split_button.js +30 -12
  196. package/framework/components/chui_split_button/styles.css +21 -5
  197. package/framework/components/chui_splitter/splitter.js +11 -11
  198. package/framework/components/chui_splitter/styles.css +2 -2
  199. package/framework/components/chui_statistic/statistic.js +47 -47
  200. package/framework/components/chui_status_bar/styles.css +2 -2
  201. package/framework/components/chui_stepper/stepper.js +202 -31
  202. package/framework/components/chui_stepper/styles.css +79 -14
  203. package/framework/components/chui_sticky_bar/sticky_bar.js +44 -13
  204. package/framework/components/chui_sticky_bar/styles.css +10 -8
  205. package/framework/components/chui_tabs/chui_tabs.js +74 -26
  206. package/framework/components/chui_tabs/styles.css +40 -12
  207. package/framework/components/chui_text_editor/styles.css +7 -7
  208. package/framework/components/chui_text_editor/text_editor.js +56 -56
  209. package/framework/components/chui_text_editor/text_editor_panel.js +173 -174
  210. package/framework/components/chui_theme_toggle/theme_toggle.js +21 -5
  211. package/framework/components/chui_timeline/styles.css +3 -1
  212. package/framework/components/chui_toast_queue/styles.css +11 -11
  213. package/framework/components/chui_toast_queue/toast_queue.js +30 -27
  214. package/framework/components/chui_toolbar/styles.css +2 -2
  215. package/framework/components/chui_tooltip/styles.css +2 -2
  216. package/framework/components/chui_tooltip/tooltip.js +3 -3
  217. package/framework/components/chui_tour/styles.css +8 -8
  218. package/framework/components/chui_tour/tour.js +72 -72
  219. package/framework/components/chui_transfer/styles.css +6 -6
  220. package/framework/components/chui_transfer/transfer.js +93 -106
  221. package/framework/components/chui_tree_table/styles.css +4 -4
  222. package/framework/components/chui_tree_table/tree_table.js +45 -45
  223. package/framework/components/chui_tree_view/styles.css +10 -8
  224. package/framework/components/chui_tree_view/tree_view.js +185 -183
  225. package/framework/components/chui_user_bar/styles.css +145 -0
  226. package/framework/components/chui_user_bar/user_bar.js +402 -0
  227. package/framework/components/chui_user_list_bar/styles.css +173 -0
  228. package/framework/components/chui_user_list_bar/user_list_bar.js +485 -0
  229. package/framework/components/chui_watermark/watermark.js +17 -17
  230. package/framework/components/chui_webview/webview.js +9 -9
  231. package/framework/components/chui_write_bar/styles.css +172 -0
  232. package/framework/components/chui_write_bar/write_bar.js +320 -0
  233. package/framework/main_window.js +1234 -0
  234. package/framework/modules/chui_a11y/chui_a11y.js +78 -79
  235. package/framework/modules/chui_animations/animations.js +77 -15
  236. package/framework/modules/chui_animations/motion.js +120 -0
  237. package/framework/modules/chui_animations/styles.css +36 -3
  238. package/framework/modules/chui_functions.js +31 -27
  239. package/framework/modules/chui_highlight/styles.css +13 -10
  240. package/framework/modules/chui_i18n/chui_i18n.js +3 -3
  241. package/framework/modules/chui_i18n/locales/feedback.js +62 -0
  242. package/framework/modules/chui_i18n/locales/navigation.js +4 -0
  243. package/framework/modules/chui_json/chui_json.js +2 -2
  244. package/framework/modules/chui_logger/chui_logger.js +23 -8
  245. package/framework/modules/chui_page/page.js +10 -10
  246. package/framework/modules/chui_palette/palette.js +61 -0
  247. package/framework/modules/chui_qr/chui_qr.js +23 -23
  248. package/framework/modules/chui_scrollbar/chui_scrollbar.js +45 -45
  249. package/framework/modules/chui_scrollbar/styles.css +3 -3
  250. package/framework/modules/chui_services/chui_services.js +8 -8
  251. package/framework/modules/chui_services/desktop.js +77 -71
  252. package/framework/modules/chui_sortable/chui_sortable.js +17 -17
  253. package/framework/modules/chui_validate/chui_validate.js +3 -3
  254. package/framework/tray_bar/chui_menu_items.js +2 -2
  255. package/index.d.ts +266 -34
  256. package/index.js +20 -1168
  257. package/package.json +6 -4
  258. package/framework/components/telegram_bot/chui_telegram_bot.js +0 -191
@@ -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: 0.165s;
130
- /* Кривая движения: быстрый старт, мягкое торможение — «выезд» панели читается
131
- как отклик, а не как линейный сдвиг. Отскока нет намеренно. */
132
- --ease_out: cubic-bezier(0.2, 0.8, 0.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.
@@ -283,14 +360,18 @@ chui_error_message {
283
360
  font-style: normal;
284
361
  user-select: none;
285
362
  outline: none;
363
+ /* Движение по умолчанию: цвет, тень и яркость — быстрые состояния, прозрачность и
364
+ перемещение — базовые. Кривая одна (торможение к покою), поэтому один и тот же жест
365
+ в разных местах читается одинаково, а свои списки ниже только уточняют его */
286
366
  transition:
287
- background-color var(--transition_time) ease,
288
- color var(--transition_time) ease,
289
- border-color var(--transition_time) ease,
290
- box-shadow var(--transition_time) ease,
291
- opacity var(--transition_time) ease,
292
- transform var(--transition_time) ease;
293
- animation-duration: var(--transition_time);
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);
294
375
  position: relative;
295
376
  font-size: var(--font_default_size);
296
377
  line-height: normal;
@@ -302,23 +383,36 @@ chui_error_message {
302
383
  user-select: none;
303
384
  outline: none;
304
385
  transition:
305
- background-color var(--transition_time) ease,
306
- color var(--transition_time) ease,
307
- border-color var(--transition_time) ease,
308
- box-shadow var(--transition_time) ease,
309
- opacity var(--transition_time) ease,
310
- transform var(--transition_time) ease;
311
- animation-duration: var(--transition_time);
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);
312
394
  position: relative;
313
395
  font-size: var(--font_default_size);
314
396
  line-height: normal;
315
397
  }
316
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
+
317
412
  :root *:focus-visible:not(input):not(textarea):not(select):not([contenteditable="true"]) {
318
413
  outline: var(--focus_outline);
319
414
  outline-offset: var(--focus_outline_offset);
320
415
  }
321
-
322
416
  /* Кольцо изнутри — там, где внешний контур срезает край контейнера с
323
417
  `overflow: hidden` или прокруткой: ячейка сетки уезжает под закреплённые
324
418
  колонки, журнал чата и строки листа действий лежат в обрезанной коробке.
@@ -330,6 +424,9 @@ chui_error_message {
330
424
  data_grid_cell,
331
425
  chat_log,
332
426
  chat_input,
427
+ message_bar_feed,
428
+ user_list_bar_item,
429
+ chui_user_bar,
333
430
  time_option,
334
431
  action_sheet_action,
335
432
  action_sheet_cancel
@@ -469,7 +566,7 @@ header {
469
566
  логическими свойствами, поэтому в RTL скругление зеркалится; верхние углы прямые —
470
567
  их срезал бы композитор. */
471
568
  align-items: start;
472
- background-color: var(--header_background);
569
+ background-color: var(--bar_background);
473
570
  backdrop-filter: var(--global_blur);
474
571
  justify-content: space-between;
475
572
  border-bottom: 1px solid var(--border_color);
@@ -533,7 +630,7 @@ notification_panel {
533
630
  position: fixed;
534
631
  top: calc(var(--header_height) - 1px);
535
632
  inset-inline-end: 0;
536
- padding: var(--margin);
633
+ padding: var(--block_margin);
537
634
  align-items: flex-end;
538
635
  justify-content: flex-start;
539
636
  z-index: 1001;
@@ -543,8 +640,10 @@ notification_panel {
543
640
  chui_notification/styles.css): у всплывающей тени разлёт больше, и её обрезало бы
544
641
  краем панели в серый прямоугольник под карточками. */
545
642
  overflow: hidden auto;
546
- max-height: calc(100% - var(--header_height) - 18px - (var(--margin) * 2));
547
- 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);
548
647
  }
549
648
 
550
649
  app_menu {
@@ -554,11 +653,12 @@ app_menu {
554
653
  justify-content: flex-start;
555
654
  align-items: flex-start;
556
655
  z-index: 1000;
557
- margin: calc(var(--header_height) + (var(--margin) * 2)) calc(var(--margin) * 2) calc(var(--margin) * 2)
558
- 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);
559
658
  border-radius: var(--radius_md);
560
659
  box-shadow: var(--box_shadow_drop);
561
- background: var(--header_background);
660
+ /* Меню маршрутов — полоса оболочки: заливка — цвет подложки, а не карточки */
661
+ background: var(--bar_background);
562
662
  backdrop-filter: var(--global_blur);
563
663
  height: -webkit-fill-available;
564
664
  width: -webkit-fill-available;
@@ -573,28 +673,29 @@ notification_box {
573
673
  align-items: flex-start;
574
674
  height: -webkit-fill-available;
575
675
  z-index: 1000;
576
- margin: calc(var(--header_height) + (var(--margin) * 2)) calc(var(--margin) * 2) calc(var(--margin) * 2)
577
- 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);
578
678
  border-radius: var(--radius_md);
579
679
  box-shadow: var(--box_shadow_drop);
580
- background: var(--header_background);
680
+ /* Ящик уведомлений — тоже полоса оболочки: заливка — цвет подложки */
681
+ background: var(--bar_background);
581
682
  backdrop-filter: var(--global_blur);
582
683
  width: -webkit-fill-available;
583
684
  border: 1px solid var(--border_color);
584
685
  }
585
686
 
586
- /* Панели выезжают сдвигом (transform ставит JS), поэтому движение задано здесь явно и с
587
- кривой --ease_out: выезд читается как отклик, а не как линейный сдвиг. Остальные свойства
588
- переходят как у всех элементов. */
687
+ /* Панели выезжают сдвигом (transform ставит JS), поэтому движение задано здесь явно и
688
+ с кривой --motion_ease: выезд читается как отклик, а не как линейный сдвиг. Остальные
689
+ свойства переходят как у всех элементов, но с быстрой длительностью — это состояния. */
589
690
  app_menu,
590
691
  notification_box {
591
692
  transition:
592
- transform var(--transition_time) var(--ease_out),
593
- background-color var(--transition_time) ease,
594
- color var(--transition_time) ease,
595
- border-color var(--transition_time) ease,
596
- box-shadow var(--transition_time) ease,
597
- opacity var(--transition_time) ease;
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);
598
699
  }
599
700
 
600
701
  /* Шапка ящика уведомлений: заголовок со счётчиком истории и действие «Очистить». */
@@ -603,7 +704,7 @@ notification_box_header {
603
704
  flex-direction: row;
604
705
  align-items: center;
605
706
  justify-content: space-between;
606
- gap: var(--margin);
707
+ gap: var(--block_margin);
607
708
  width: -webkit-fill-available;
608
709
  padding-block: 10px 10px;
609
710
  padding-inline: 14px 10px;
@@ -701,8 +802,10 @@ route_views > * {
701
802
  }
702
803
 
703
804
  /* Разделитель дней в истории: липнет к верху списка, пока видна его группа, поэтому день
704
- остаётся названным и в середине длинной истории. Материал тот же, что у ящика: под
705
- подписью проезжают карточки, и без фона текст наложился бы на них. */
805
+ остаётся названным и в середине длинной истории. Подпись прозрачная полностью — ни заливки,
806
+ ни размытия: она не рисует полосу поверх списка, а только называет день. Текст — по центру
807
+ ящика. Из-за этого карточки при прокрутке проходят под подписью: это цена прозрачности,
808
+ прежде её закрывала заливка материала. */
706
809
  notification_group {
707
810
  position: sticky;
708
811
  top: 0;
@@ -710,11 +813,12 @@ notification_group {
710
813
  flex: none;
711
814
  width: -webkit-fill-available;
712
815
  padding: 8px 6px 6px;
713
- background: var(--header_background);
714
- backdrop-filter: var(--global_blur);
816
+ background: transparent;
817
+ backdrop-filter: none;
715
818
  color: var(--text_color_disabled);
716
819
  font-size: var(--font_notification_size);
717
820
  font-weight: 500;
821
+ text-align: center;
718
822
  }
719
823
 
720
824
  /* Отметка непрочитанного: точка в углу записи, пока ящик не открывали. Абсолютная, а не
@@ -746,6 +850,35 @@ notification_box_empty {
746
850
 
747
851
  .notification_box_empty_visible {
748
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;
749
882
  }
750
883
 
751
884
  /* Кнопки шапки — одна высота и один вертикальный отступ: 30 + 8 + 8 = 46px полосы.
@@ -768,19 +901,16 @@ notification_button {
768
901
  высоты) — пилюля наведения казалась узкой. */
769
902
  width: 30px;
770
903
  border: none;
771
- border-radius: var(--border_radius);
904
+ border-radius: var(--radius_sm);
772
905
  padding: 0;
773
906
  margin-block: var(--header_margin) var(--header_margin);
774
907
  /* Отступ справа такой же, как слева: справа от кнопки уведомлений стоит группа
775
908
  кнопок окна с разделительной чертой (см. wc_box), и без своего отступа черта
776
909
  прилипала к значку */
777
- margin-inline: var(--margin) var(--margin);
910
+ margin-inline: var(--block_margin) var(--block_margin);
778
911
  background: transparent;
779
912
  color: var(--text_color);
780
913
  -webkit-app-region: no-drag;
781
- transition:
782
- background-color var(--transition_time) ease,
783
- color var(--transition_time) ease;
784
914
  }
785
915
 
786
916
  notification_button:hover {
@@ -831,16 +961,13 @@ app_menu_button {
831
961
  height: 30px;
832
962
  width: 30px;
833
963
  border: none;
834
- border-radius: var(--border_radius);
964
+ border-radius: var(--radius_sm);
835
965
  padding: 0;
836
966
  margin-block: var(--header_margin) var(--header_margin);
837
- margin-inline: var(--margin) var(--margin);
967
+ margin-inline: var(--block_margin) var(--block_margin);
838
968
  background: transparent;
839
969
  color: var(--text_color);
840
970
  -webkit-app-region: no-drag;
841
- transition:
842
- background-color var(--transition_time) ease,
843
- color var(--transition_time) ease;
844
971
  }
845
972
 
846
973
  app_menu_button:hover {
@@ -925,7 +1052,7 @@ page_name {
925
1052
  border-radius: var(--radius_pill);
926
1053
  padding: 0 12px;
927
1054
  margin-block: var(--header_margin) var(--header_margin);
928
- margin-inline: 0 var(--margin);
1055
+ margin-inline: 0 var(--block_margin);
929
1056
  font-size: var(--font_default_size);
930
1057
  font-weight: 500;
931
1058
  background: var(--element_background_disabled);
@@ -1056,7 +1183,7 @@ blockquote {
1056
1183
  margin: 1.5em 10px;
1057
1184
  padding: 9px 14px;
1058
1185
  color: var(--text_color);
1059
- border-radius: var(--border_radius);
1186
+ border-radius: var(--radius_sm);
1060
1187
  display: flex;
1061
1188
  }
1062
1189
 
@@ -1092,10 +1219,10 @@ user_button {
1092
1219
  width: max-content;
1093
1220
  border: none;
1094
1221
  color: var(--text_color);
1095
- border-radius: var(--border_radius);
1222
+ border-radius: var(--radius_sm);
1096
1223
  padding: 5px 13px;
1097
1224
  margin-block: var(--header_margin) var(--header_margin);
1098
- margin-inline: var(--margin) 0;
1225
+ margin-inline: var(--block_margin) 0;
1099
1226
  font-size: var(--font_default_size);
1100
1227
  background: transparent;
1101
1228
  font-weight: 500;
@@ -1138,7 +1265,7 @@ user_dropdown {
1138
1265
  z-index: 1002;
1139
1266
  flex-direction: column;
1140
1267
  min-width: 165px;
1141
- padding: var(--margin);
1268
+ padding: var(--block_margin);
1142
1269
  background: var(--header_background);
1143
1270
  color: var(--text_color);
1144
1271
  border: 1px solid var(--border_color);
@@ -1149,7 +1276,7 @@ user_dropdown {
1149
1276
  }
1150
1277
 
1151
1278
  /* Пункт — плоская строка в стиле context_menu_item / пункта меню-бара: синяя заливка
1152
- ховера одна на всю семью меню, а размеры строки берутся из --main_padding. */
1279
+ ховера одна на всю семью меню, а размеры строки берутся из --block_padding. */
1153
1280
  user_dropdown user_item {
1154
1281
  color: var(--text_color);
1155
1282
  display: flex;
@@ -1159,8 +1286,8 @@ user_dropdown user_item {
1159
1286
  cursor: pointer;
1160
1287
  text-align: start;
1161
1288
  width: -webkit-fill-available;
1162
- padding: var(--main_padding);
1163
- border-radius: var(--border_radius);
1289
+ padding: var(--block_padding);
1290
+ border-radius: var(--radius_sm);
1164
1291
  }
1165
1292
 
1166
1293
  user_dropdown user_item:hover {
@@ -1205,10 +1332,10 @@ header_button {
1205
1332
  height: calc(30px * var(--density));
1206
1333
  width: max-content;
1207
1334
  border: none;
1208
- border-radius: var(--border_radius);
1335
+ border-radius: var(--radius_sm);
1209
1336
  padding: 5px 13px;
1210
1337
  margin-block: var(--header_margin) var(--header_margin);
1211
- margin-inline: var(--margin) 0;
1338
+ margin-inline: var(--block_margin) 0;
1212
1339
  font-size: var(--font_default_size);
1213
1340
  background: transparent;
1214
1341
  color: var(--text_color);
@@ -1217,9 +1344,6 @@ header_button {
1217
1344
  flex-direction: row;
1218
1345
  align-items: center;
1219
1346
  -webkit-app-region: no-drag;
1220
- transition:
1221
- background-color var(--transition_time) ease,
1222
- color var(--transition_time) ease;
1223
1347
  }
1224
1348
 
1225
1349
  header_button header_button_title {
@@ -1285,9 +1409,6 @@ wc_minimize {
1285
1409
  border-radius: var(--radius_sm);
1286
1410
  background: transparent;
1287
1411
  color: var(--text_color_disabled);
1288
- transition:
1289
- background-color var(--transition_time) ease,
1290
- color var(--transition_time) ease;
1291
1412
  }
1292
1413
 
1293
1414
  /* Значки кнопок окна нарисованы линиями (SVG), а не взяты из шрифта иконок: три системные
@@ -1371,3 +1492,36 @@ header_tabs {
1371
1492
  .header_tab_active header_button_icon chui_icon {
1372
1493
  color: var(--link_color);
1373
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
+ }