chuijs 4.0.1 → 4.0.3

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 (222) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/README.md +43 -632
  3. package/framework/appLayout/default/chui_app_layout.js +314 -273
  4. package/framework/appLayout/default/global_style.css +93 -53
  5. package/framework/components/chui_accordion/accordion.js +29 -26
  6. package/framework/components/chui_accordion/styles.css +6 -5
  7. package/framework/components/chui_action_sheet/action_sheet.js +59 -33
  8. package/framework/components/chui_action_sheet/styles.css +2 -1
  9. package/framework/components/chui_affix/affix.js +11 -6
  10. package/framework/components/chui_alert/alert.js +23 -14
  11. package/framework/components/chui_avatar/avatar.js +23 -22
  12. package/framework/components/chui_avatar_group/avatar_group.js +21 -19
  13. package/framework/components/chui_backtop/backtop.js +35 -19
  14. package/framework/components/chui_badge/badge.js +15 -13
  15. package/framework/components/chui_breadcrumb/breadcrumb.js +15 -13
  16. package/framework/components/chui_button/button.js +42 -22
  17. package/framework/components/chui_button/styles.css +2 -2
  18. package/framework/components/chui_calendar/calendar.js +12 -10
  19. package/framework/components/chui_card/card.js +43 -23
  20. package/framework/components/chui_chat/chat.js +72 -33
  21. package/framework/components/chui_clipboard_history/clipboard_history.js +30 -21
  22. package/framework/components/chui_clipboard_history/styles.css +4 -2
  23. package/framework/components/chui_code/code.js +2 -2
  24. package/framework/components/chui_code/styles.css +2 -2
  25. package/framework/components/chui_code_editor/code_editor.js +47 -31
  26. package/framework/components/chui_code_editor/styles.css +3 -2
  27. package/framework/components/chui_command_palette/command_palette.js +60 -37
  28. package/framework/components/chui_console/console.js +5 -5
  29. package/framework/components/chui_console/styles.css +1 -1
  30. package/framework/components/chui_content_block/content_block.js +33 -19
  31. package/framework/components/chui_content_block/styles.css +2 -2
  32. package/framework/components/chui_context_menu/context_menu.js +9 -4
  33. package/framework/components/chui_custom_element/custom_element.js +22 -15
  34. package/framework/components/chui_data_grid/data_grid.js +396 -234
  35. package/framework/components/chui_data_grid/styles.css +10 -8
  36. package/framework/components/chui_descriptions/descriptions.js +34 -17
  37. package/framework/components/chui_details/details.js +32 -26
  38. package/framework/components/chui_details/styles.css +5 -4
  39. package/framework/components/chui_diff_viewer/diff_viewer.js +91 -66
  40. package/framework/components/chui_diff_viewer/styles.css +1 -1
  41. package/framework/components/chui_divider/divider.js +13 -11
  42. package/framework/components/chui_drawer/drawer.js +27 -25
  43. package/framework/components/chui_drop_zone/drop_zone.js +31 -21
  44. package/framework/components/chui_empty_state/empty_state.js +20 -15
  45. package/framework/components/chui_fieldset/fieldset.js +37 -20
  46. package/framework/components/chui_fieldset/styles.css +1 -1
  47. package/framework/components/chui_file_explorer/file_explorer.js +157 -86
  48. package/framework/components/chui_file_explorer/styles.css +2 -1
  49. package/framework/components/chui_form/form.js +31 -19
  50. package/framework/components/chui_form/styles.css +1 -1
  51. package/framework/components/chui_gantt/gantt.js +64 -40
  52. package/framework/components/chui_graphs/graphs.js +301 -200
  53. package/framework/components/chui_graphs/styles.css +1 -1
  54. package/framework/components/chui_hero/hero.js +40 -22
  55. package/framework/components/chui_html_block/html_block.js +6 -6
  56. package/framework/components/chui_html_block/styles.css +2 -2
  57. package/framework/components/chui_hx/hx.js +3 -3
  58. package/framework/components/chui_hx/styles.css +11 -4
  59. package/framework/components/chui_icons/icons.js +2109 -2109
  60. package/framework/components/chui_icons/styles.css +2 -2
  61. package/framework/components/chui_inputs/chui_check_box/check_box.js +31 -19
  62. package/framework/components/chui_inputs/chui_check_box/styles.css +18 -18
  63. package/framework/components/chui_inputs/chui_chips/chips.js +50 -40
  64. package/framework/components/chui_inputs/chui_chips/styles.css +4 -2
  65. package/framework/components/chui_inputs/chui_color_picker/color_picker.js +36 -24
  66. package/framework/components/chui_inputs/chui_combo_box/combo_box.js +100 -82
  67. package/framework/components/chui_inputs/chui_combo_box/styles.css +14 -12
  68. package/framework/components/chui_inputs/chui_date/date.js +102 -66
  69. package/framework/components/chui_inputs/chui_date/styles.css +12 -11
  70. package/framework/components/chui_inputs/chui_date_range/date_range.js +40 -29
  71. package/framework/components/chui_inputs/chui_datetime/datetime.js +35 -27
  72. package/framework/components/chui_inputs/chui_email/email.js +43 -31
  73. package/framework/components/chui_inputs/chui_email/styles.css +5 -5
  74. package/framework/components/chui_inputs/chui_file/file.js +68 -41
  75. package/framework/components/chui_inputs/chui_file/styles.css +13 -12
  76. package/framework/components/chui_inputs/chui_hotkey/hotkey.js +61 -36
  77. package/framework/components/chui_inputs/chui_masked/masked.js +39 -28
  78. package/framework/components/chui_inputs/chui_mention/mention.js +77 -30
  79. package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +173 -153
  80. package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +9 -7
  81. package/framework/components/chui_inputs/chui_number/number.js +58 -41
  82. package/framework/components/chui_inputs/chui_number/styles.css +7 -7
  83. package/framework/components/chui_inputs/chui_otp/otp.js +38 -29
  84. package/framework/components/chui_inputs/chui_password/password.js +58 -36
  85. package/framework/components/chui_inputs/chui_password/styles.css +8 -8
  86. package/framework/components/chui_inputs/chui_radio_button/radio_button.js +37 -25
  87. package/framework/components/chui_inputs/chui_radio_button/styles.css +20 -20
  88. package/framework/components/chui_inputs/chui_rating/rating.js +26 -22
  89. package/framework/components/chui_inputs/chui_select_box/select_box.js +102 -78
  90. package/framework/components/chui_inputs/chui_select_box/styles.css +11 -11
  91. package/framework/components/chui_inputs/chui_slider/slider.js +29 -26
  92. package/framework/components/chui_inputs/chui_slider/styles.css +2 -1
  93. package/framework/components/chui_inputs/chui_text/styles.css +8 -8
  94. package/framework/components/chui_inputs/chui_text/text.js +65 -44
  95. package/framework/components/chui_inputs/chui_text_area/styles.css +6 -6
  96. package/framework/components/chui_inputs/chui_text_area/text_area.js +51 -28
  97. package/framework/components/chui_inputs/chui_time/styles.css +5 -3
  98. package/framework/components/chui_inputs/chui_time/time.js +38 -27
  99. package/framework/components/chui_inputs/chui_toggle/styles.css +3 -3
  100. package/framework/components/chui_inputs/chui_toggle/toggle.js +16 -16
  101. package/framework/components/chui_json_editor/json_editor.js +53 -43
  102. package/framework/components/chui_json_viewer/json_viewer.js +52 -33
  103. package/framework/components/chui_json_viewer/styles.css +3 -2
  104. package/framework/components/chui_kanban/kanban.js +52 -34
  105. package/framework/components/chui_kbd/kbd.js +12 -10
  106. package/framework/components/chui_label/label.js +14 -12
  107. package/framework/components/chui_label/styles.css +2 -2
  108. package/framework/components/chui_link/link.js +27 -20
  109. package/framework/components/chui_list/list.js +31 -27
  110. package/framework/components/chui_list/styles.css +2 -1
  111. package/framework/components/chui_markdown_editor/markdown_editor.js +60 -44
  112. package/framework/components/chui_media/audio.js +326 -227
  113. package/framework/components/chui_media/audio_styles.css +40 -21
  114. package/framework/components/chui_media/image.js +70 -38
  115. package/framework/components/chui_media/image_compare.js +52 -21
  116. package/framework/components/chui_media/image_styles.css +3 -3
  117. package/framework/components/chui_media/video.js +155 -62
  118. package/framework/components/chui_media/video_styles.css +33 -16
  119. package/framework/components/chui_menu_bar/menu_bar.js +26 -24
  120. package/framework/components/chui_menu_bar/styles.css +4 -2
  121. package/framework/components/chui_modal/modal.js +44 -43
  122. package/framework/components/chui_modal/styles.css +3 -2
  123. package/framework/components/chui_notification/notification.js +50 -34
  124. package/framework/components/chui_notification/notification_download.js +31 -25
  125. package/framework/components/chui_notification/notification_download_progress.css +3 -2
  126. package/framework/components/chui_notification/notification_download_progress.js +47 -41
  127. package/framework/components/chui_notification/notification_update.js +23 -16
  128. package/framework/components/chui_notification/status_plate.js +2 -2
  129. package/framework/components/chui_notification/styles_download.css +1 -1
  130. package/framework/components/chui_notification/styles_update.css +1 -1
  131. package/framework/components/chui_org_chart/org_chart.js +74 -35
  132. package/framework/components/chui_pagination/pagination.js +62 -27
  133. package/framework/components/chui_paragraph/paragraph.js +2 -2
  134. package/framework/components/chui_paragraph/styles.css +1 -1
  135. package/framework/components/chui_popover/popover.js +49 -28
  136. package/framework/components/chui_popups/popups.js +137 -108
  137. package/framework/components/chui_popups/styles.css +2 -2
  138. package/framework/components/chui_print_button/print_button.js +33 -23
  139. package/framework/components/chui_progress_bar/progress_bar.js +23 -15
  140. package/framework/components/chui_progress_bar/styles.css +2 -2
  141. package/framework/components/chui_progress_ring/progress_ring.js +17 -15
  142. package/framework/components/chui_qrcode/qrcode.js +75 -31
  143. package/framework/components/chui_query_builder/query_builder.js +216 -123
  144. package/framework/components/chui_radio_group/radio_group.js +36 -26
  145. package/framework/components/chui_radio_group/styles.css +1 -1
  146. package/framework/components/chui_result/result.js +26 -16
  147. package/framework/components/chui_scheduler/scheduler.js +57 -35
  148. package/framework/components/chui_scheduler/styles.css +6 -2
  149. package/framework/components/chui_segmented_control/segmented_control.js +27 -21
  150. package/framework/components/chui_settings/settings.js +122 -48
  151. package/framework/components/chui_shortcut_help/shortcut_help.js +55 -32
  152. package/framework/components/chui_sidebar_nav/sidebar_nav.js +33 -23
  153. package/framework/components/chui_skeleton/skeleton.js +29 -24
  154. package/framework/components/chui_slideshow/slideshow.js +60 -41
  155. package/framework/components/chui_slideshow/styles.css +18 -12
  156. package/framework/components/chui_spinner/spinner.js +8 -8
  157. package/framework/components/chui_spinner/styles.css +0 -1
  158. package/framework/components/chui_split_button/split_button.js +23 -18
  159. package/framework/components/chui_split_button/styles.css +1 -1
  160. package/framework/components/chui_splitter/splitter.js +35 -28
  161. package/framework/components/chui_statistic/statistic.js +65 -38
  162. package/framework/components/chui_status_bar/status_bar.js +11 -9
  163. package/framework/components/chui_stepper/stepper.js +27 -22
  164. package/framework/components/chui_sticky_bar/sticky_bar.js +9 -4
  165. package/framework/components/chui_sticky_bar/styles.css +3 -1
  166. package/framework/components/chui_tabs/chui_tabs.js +28 -22
  167. package/framework/components/chui_tabs/styles.css +3 -3
  168. package/framework/components/chui_text_editor/styles.css +20 -19
  169. package/framework/components/chui_text_editor/text_editor.js +85 -61
  170. package/framework/components/chui_text_editor/text_editor_panel.js +346 -284
  171. package/framework/components/chui_theme_toggle/theme_toggle.js +27 -22
  172. package/framework/components/chui_timeline/timeline.js +14 -12
  173. package/framework/components/chui_toast_queue/toast_queue.js +52 -46
  174. package/framework/components/chui_toolbar/toolbar.js +20 -13
  175. package/framework/components/chui_tooltip/tooltip.js +37 -24
  176. package/framework/components/chui_tour/styles.css +8 -3
  177. package/framework/components/chui_tour/tour.js +61 -27
  178. package/framework/components/chui_transfer/styles.css +2 -1
  179. package/framework/components/chui_transfer/transfer.js +75 -42
  180. package/framework/components/chui_tree_table/tree_table.js +43 -29
  181. package/framework/components/chui_tree_view/styles.css +4 -2
  182. package/framework/components/chui_tree_view/tree_view.js +142 -99
  183. package/framework/components/chui_watermark/watermark.js +24 -16
  184. package/framework/components/chui_webview/styles.css +2 -2
  185. package/framework/components/chui_webview/webview.js +62 -50
  186. package/framework/components/telegram_bot/chui_telegram_bot.js +71 -64
  187. package/framework/modules/chui_a11y/chui_a11y.js +77 -46
  188. package/framework/modules/chui_animations/animations.js +42 -42
  189. package/framework/modules/chui_animations/styles.css +1 -1
  190. package/framework/modules/chui_bridge/preload.js +56 -26
  191. package/framework/modules/chui_functions.js +52 -50
  192. package/framework/modules/chui_highlight/chui_highlight.js +25 -22
  193. package/framework/modules/chui_i18n/chui_i18n.js +9 -7
  194. package/framework/modules/chui_i18n/locales/a11y.js +5 -5
  195. package/framework/modules/chui_i18n/locales/app_layout.js +5 -5
  196. package/framework/modules/chui_i18n/locales/calendar.js +3 -3
  197. package/framework/modules/chui_i18n/locales/common.js +3 -3
  198. package/framework/modules/chui_i18n/locales/data.js +36 -26
  199. package/framework/modules/chui_i18n/locales/editors.js +40 -13
  200. package/framework/modules/chui_i18n/locales/feedback.js +3 -3
  201. package/framework/modules/chui_i18n/locales/forms.js +8 -8
  202. package/framework/modules/chui_i18n/locales/graphics.js +8 -8
  203. package/framework/modules/chui_i18n/locales/media.js +4 -4
  204. package/framework/modules/chui_i18n/locales/navigation.js +8 -8
  205. package/framework/modules/chui_i18n/locales/validate.js +3 -3
  206. package/framework/modules/chui_json/chui_json.js +9 -9
  207. package/framework/modules/chui_layout/chui_layout.js +12 -10
  208. package/framework/modules/chui_logger/chui_logger.js +29 -25
  209. package/framework/modules/chui_page/page.js +33 -27
  210. package/framework/modules/chui_page/styles.css +3 -26
  211. package/framework/modules/chui_qr/chui_qr.js +158 -67
  212. package/framework/modules/chui_scrollbar/chui_scrollbar.js +35 -24
  213. package/framework/modules/chui_scrollbar/styles.css +3 -1
  214. package/framework/modules/chui_services/chui_channels.js +76 -11
  215. package/framework/modules/chui_services/chui_services.js +39 -31
  216. package/framework/modules/chui_services/desktop.js +149 -30
  217. package/framework/modules/chui_sortable/chui_sortable.js +17 -12
  218. package/framework/modules/chui_validate/chui_validate.js +7 -4
  219. package/framework/tray_bar/chui_menu_items.js +136 -46
  220. package/index.d.ts +4814 -0
  221. package/index.js +449 -334
  222. package/package.json +79 -68
@@ -126,10 +126,10 @@
126
126
  --focus_outline_offset_inset: -2px;
127
127
 
128
128
  /* Тайминг анимаций */
129
- --transition_time: .165s;
129
+ --transition_time: 0.165s;
130
130
  /* Кривая движения: быстрый старт, мягкое торможение — «выезд» панели читается
131
131
  как отклик, а не как линейный сдвиг. Отскока нет намеренно. */
132
- --ease_out: cubic-bezier(.2, .8, .2, 1);
132
+ --ease_out: cubic-bezier(0.2, 0.8, 0.2, 1);
133
133
 
134
134
  /* Схема нативных частей: палитры приложения разложены по prefers-color-scheme,
135
135
  поэтому браузер должен рисовать и родные части (каретка, выделение, системные
@@ -279,16 +279,17 @@ chui_error_message {
279
279
  }
280
280
 
281
281
  * {
282
- font-family: 'chui_I';
282
+ font-family: "chui_I";
283
283
  font-style: normal;
284
284
  user-select: none;
285
285
  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;
286
+ 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;
292
293
  animation-duration: var(--transition_time);
293
294
  position: relative;
294
295
  font-size: var(--font_default_size);
@@ -296,16 +297,17 @@ chui_error_message {
296
297
  }
297
298
 
298
299
  *:before {
299
- font-family: 'chui_I';
300
+ font-family: "chui_I";
300
301
  font-style: normal;
301
302
  user-select: none;
302
303
  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;
304
+ 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;
309
311
  animation-duration: var(--transition_time);
310
312
  position: relative;
311
313
  font-size: var(--font_default_size);
@@ -323,7 +325,15 @@ chui_error_message {
323
325
  Селектор повторяет вес общего правила: `:where` специфичности не добавляет,
324
326
  а без повтора исключение проиграло бы — общее правило весит больше любого
325
327
  компонентного (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) {
328
+ :root
329
+ *:focus-visible:not(input):not(textarea):not(select):not([contenteditable="true"]):where(
330
+ data_grid_cell,
331
+ chat_log,
332
+ chat_input,
333
+ time_option,
334
+ action_sheet_action,
335
+ action_sheet_cancel
336
+ ) {
327
337
  outline-offset: var(--focus_outline_offset_inset);
328
338
  }
329
339
 
@@ -544,7 +554,8 @@ app_menu {
544
554
  justify-content: flex-start;
545
555
  align-items: flex-start;
546
556
  z-index: 1000;
547
- margin: calc(var(--header_height) + (var(--margin) * 2)) calc(var(--margin) * 2) calc(var(--margin) * 2) calc(var(--margin) * 2);
557
+ margin: calc(var(--header_height) + (var(--margin) * 2)) calc(var(--margin) * 2) calc(var(--margin) * 2)
558
+ calc(var(--margin) * 2);
548
559
  border-radius: var(--radius_md);
549
560
  box-shadow: var(--box_shadow_drop);
550
561
  background: var(--header_background);
@@ -562,7 +573,8 @@ notification_box {
562
573
  align-items: flex-start;
563
574
  height: -webkit-fill-available;
564
575
  z-index: 1000;
565
- margin: calc(var(--header_height) + (var(--margin) * 2)) calc(var(--margin) * 2) calc(var(--margin) * 2) calc(var(--margin) * 2);
576
+ margin: calc(var(--header_height) + (var(--margin) * 2)) calc(var(--margin) * 2) calc(var(--margin) * 2)
577
+ calc(var(--margin) * 2);
566
578
  border-radius: var(--radius_md);
567
579
  box-shadow: var(--box_shadow_drop);
568
580
  background: var(--header_background);
@@ -576,12 +588,13 @@ notification_box {
576
588
  переходят как у всех элементов. */
577
589
  app_menu,
578
590
  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;
591
+ 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;
585
598
  }
586
599
 
587
600
  /* Шапка ящика уведомлений: заголовок со счётчиком истории и действие «Очистить». */
@@ -592,7 +605,8 @@ notification_box_header {
592
605
  justify-content: space-between;
593
606
  gap: var(--margin);
594
607
  width: -webkit-fill-available;
595
- padding-block: 10px 10px; padding-inline: 14px 10px;
608
+ padding-block: 10px 10px;
609
+ padding-inline: 14px 10px;
596
610
  box-shadow: inset 0 -1px 0 var(--border_color);
597
611
  }
598
612
 
@@ -764,7 +778,9 @@ notification_button {
764
778
  background: transparent;
765
779
  color: var(--text_color);
766
780
  -webkit-app-region: no-drag;
767
- transition: background-color var(--transition_time) ease, color var(--transition_time) ease;
781
+ transition:
782
+ background-color var(--transition_time) ease,
783
+ color var(--transition_time) ease;
768
784
  }
769
785
 
770
786
  notification_button:hover {
@@ -772,7 +788,8 @@ notification_button:hover {
772
788
  }
773
789
 
774
790
  notification_button:active {
775
- background: var(--element_background_prime); color: var(--text_color_hover);
791
+ background: var(--element_background_prime);
792
+ color: var(--text_color_hover);
776
793
  }
777
794
 
778
795
  /* Открытый ящик уведомлений: тонировка акцента, а не ховер и не заливка во весь цвет */
@@ -821,7 +838,9 @@ app_menu_button {
821
838
  background: transparent;
822
839
  color: var(--text_color);
823
840
  -webkit-app-region: no-drag;
824
- transition: background-color var(--transition_time) ease, color var(--transition_time) ease;
841
+ transition:
842
+ background-color var(--transition_time) ease,
843
+ color var(--transition_time) ease;
825
844
  }
826
845
 
827
846
  app_menu_button:hover {
@@ -829,7 +848,8 @@ app_menu_button:hover {
829
848
  }
830
849
 
831
850
  app_menu_button:active {
832
- background: var(--element_background_prime); color: var(--text_color_hover);
851
+ background: var(--element_background_prime);
852
+ color: var(--text_color_hover);
833
853
  }
834
854
 
835
855
  /* Открытое меню маршрутов: та же тонировка акцента, что и у пунктов внутри */
@@ -884,11 +904,14 @@ app_menu_empty {
884
904
  ниже содержимого, и длинное название выдавило бы кнопки за край окна. Полный текст
885
905
  лежит в подсказке (её ставит setPageName в chui_app_layout.js). */
886
906
  page_name {
887
- /* Название переехало в содержимое страницы (`page_title` в chui_page/styles.css):
888
- в шапке оно уезжало при прокрутке и делило полосу с кнопками. Узел оставлен
889
- якорем — за ним разметка ставит полосу меню (`applyPageMenuBar`), а `setPageName`
890
- продолжает держать текст для меню маршрутов и подсказки */
891
- display: none;
907
+ /* Название показывает шапка, а не содержимое: оболочка в страницу его не подмешивает
908
+ (`Route#go`), поэтому приложение, рисующее свой заголовок, ничего не дублирует.
909
+ Узел — якорь полосы меню (`applyPageMenuBar` ставит её следом), и он же держит текст
910
+ для меню маршрутов и подсказки (`setPageName`).
911
+ У страницы с меню-баром название скрыто — место занимает полоса (правило
912
+ `.header_with_menu_bar page_name` ниже) */
913
+ display: flex;
914
+ align-items: center;
892
915
  outline: none;
893
916
  box-sizing: border-box;
894
917
  min-width: 0;
@@ -901,11 +924,12 @@ page_name {
901
924
  border: none;
902
925
  border-radius: var(--radius_pill);
903
926
  padding: 0 12px;
904
- margin-block: var(--header_margin) var(--header_margin); margin-inline: 0 var(--margin);
927
+ margin-block: var(--header_margin) var(--header_margin);
928
+ margin-inline: 0 var(--margin);
905
929
  font-size: var(--font_default_size);
906
930
  font-weight: 500;
907
931
  background: var(--element_background_disabled);
908
- color: var(--text_color)
932
+ color: var(--text_color);
909
933
  }
910
934
 
911
935
  /* Пустое название не занимает места: до выбора страницы шапка не должна держать пустую капсулу */
@@ -949,7 +973,8 @@ route:hover {
949
973
  }
950
974
 
951
975
  route:active {
952
- background: var(--element_background_prime); color: var(--text_color_hover);
976
+ background: var(--element_background_prime);
977
+ color: var(--text_color_hover);
953
978
  }
954
979
 
955
980
  route_title {
@@ -1040,7 +1065,7 @@ header_left_box {
1040
1065
  min-width: 0;
1041
1066
  overflow: hidden;
1042
1067
  width: -webkit-fill-available;
1043
- align-items: center
1068
+ align-items: center;
1044
1069
  }
1045
1070
 
1046
1071
  header_right_box {
@@ -1069,7 +1094,8 @@ user_button {
1069
1094
  color: var(--text_color);
1070
1095
  border-radius: var(--border_radius);
1071
1096
  padding: 5px 13px;
1072
- margin-block: var(--header_margin) var(--header_margin); margin-inline: var(--margin) 0;
1097
+ margin-block: var(--header_margin) var(--header_margin);
1098
+ margin-inline: var(--margin) 0;
1073
1099
  font-size: var(--font_default_size);
1074
1100
  background: transparent;
1075
1101
  font-weight: 500;
@@ -1084,7 +1110,8 @@ user_button:hover {
1084
1110
  }
1085
1111
 
1086
1112
  user_button:active {
1087
- background: var(--element_background_prime); color: var(--text_color_hover);
1113
+ background: var(--element_background_prime);
1114
+ color: var(--text_color_hover);
1088
1115
  }
1089
1116
 
1090
1117
  /* Открытое меню: тонировка акцента — та же, что у открытых кнопок шапки.
@@ -1133,7 +1160,7 @@ user_dropdown user_item {
1133
1160
  text-align: start;
1134
1161
  width: -webkit-fill-available;
1135
1162
  padding: var(--main_padding);
1136
- border-radius: var(--border_radius)
1163
+ border-radius: var(--border_radius);
1137
1164
  }
1138
1165
 
1139
1166
  user_dropdown user_item:hover {
@@ -1167,7 +1194,7 @@ user_dd_image_main {
1167
1194
  align-items: center;
1168
1195
  justify-content: center;
1169
1196
  flex-wrap: nowrap;
1170
- margin-bottom: 6px
1197
+ margin-bottom: 6px;
1171
1198
  }
1172
1199
 
1173
1200
  /* chUiJS_HeaderButton */
@@ -1180,7 +1207,8 @@ header_button {
1180
1207
  border: none;
1181
1208
  border-radius: var(--border_radius);
1182
1209
  padding: 5px 13px;
1183
- margin-block: var(--header_margin) var(--header_margin); margin-inline: var(--margin) 0;
1210
+ margin-block: var(--header_margin) var(--header_margin);
1211
+ margin-inline: var(--margin) 0;
1184
1212
  font-size: var(--font_default_size);
1185
1213
  background: transparent;
1186
1214
  color: var(--text_color);
@@ -1189,7 +1217,9 @@ header_button {
1189
1217
  flex-direction: row;
1190
1218
  align-items: center;
1191
1219
  -webkit-app-region: no-drag;
1192
- transition: background-color var(--transition_time) ease, color var(--transition_time) ease;
1220
+ transition:
1221
+ background-color var(--transition_time) ease,
1222
+ color var(--transition_time) ease;
1193
1223
  }
1194
1224
 
1195
1225
  header_button header_button_title {
@@ -1207,7 +1237,8 @@ header_button:hover {
1207
1237
  }
1208
1238
 
1209
1239
  header_button:active {
1210
- background: var(--element_background_prime); color: var(--text_color_hover);
1240
+ background: var(--element_background_prime);
1241
+ color: var(--text_color_hover);
1211
1242
  }
1212
1243
 
1213
1244
  /*Управление окном — те же кнопки-иконки, что и остальные в шапке, но приглушённые:
@@ -1240,7 +1271,9 @@ wc_box:not(:first-child) {
1240
1271
  box-shadow: inset 1px 0 0 var(--border_color);
1241
1272
  }
1242
1273
 
1243
- wc_close, wc_maximize, wc_minimize {
1274
+ wc_close,
1275
+ wc_maximize,
1276
+ wc_minimize {
1244
1277
  cursor: pointer;
1245
1278
  display: flex;
1246
1279
  align-items: center;
@@ -1252,7 +1285,9 @@ wc_close, wc_maximize, wc_minimize {
1252
1285
  border-radius: var(--radius_sm);
1253
1286
  background: transparent;
1254
1287
  color: var(--text_color_disabled);
1255
- transition: background-color var(--transition_time) ease, color var(--transition_time) ease;
1288
+ transition:
1289
+ background-color var(--transition_time) ease,
1290
+ color var(--transition_time) ease;
1256
1291
  }
1257
1292
 
1258
1293
  /* Значки кнопок окна нарисованы линиями (SVG), а не взяты из шрифта иконок: три системные
@@ -1270,12 +1305,15 @@ wc_minimize svg {
1270
1305
  color: var(--text_color_disabled);
1271
1306
  }
1272
1307
 
1273
- wc_maximize:hover, wc_minimize:hover {
1308
+ wc_maximize:hover,
1309
+ wc_minimize:hover {
1274
1310
  background: var(--element_background_hover);
1275
1311
  }
1276
1312
 
1277
- wc_maximize:active, wc_minimize:active {
1278
- background: var(--element_background_prime); color: var(--text_color_hover);
1313
+ wc_maximize:active,
1314
+ wc_minimize:active {
1315
+ background: var(--element_background_prime);
1316
+ color: var(--text_color_hover);
1279
1317
  }
1280
1318
 
1281
1319
  wc_maximize:hover svg,
@@ -1300,7 +1338,9 @@ wc_close:active svg {
1300
1338
  color: var(--text_color);
1301
1339
  }
1302
1340
 
1303
- wc_close:focus-visible, wc_maximize:focus-visible, wc_minimize:focus-visible {
1341
+ wc_close:focus-visible,
1342
+ wc_maximize:focus-visible,
1343
+ wc_minimize:focus-visible {
1304
1344
  outline: var(--focus_outline);
1305
1345
  outline-offset: var(--focus_outline_offset);
1306
1346
  }
@@ -1330,4 +1370,4 @@ header_tabs {
1330
1370
 
1331
1371
  .header_tab_active header_button_icon chui_icon {
1332
1372
  color: var(--link_color);
1333
- }
1373
+ }
@@ -1,6 +1,6 @@
1
- const {Icon, Icons} = require("../chui_icons/icons");
1
+ const { Icon, Icons } = require("../chui_icons/icons");
2
2
 
3
- const {makeKeyboardButton} = require("../../modules/chui_a11y/chui_a11y");
3
+ const { makeKeyboardButton } = require("../../modules/chui_a11y/chui_a11y");
4
4
 
5
5
  /** Идентификаторы для aria-controls у панелей аккордеона */
6
6
  let disclosure_panel_counter = 0;
@@ -8,38 +8,38 @@ let disclosure_panel_counter = 0;
8
8
  class Accordion {
9
9
  #name = require("randomstring").generate();
10
10
  #chui_accordion = document.createElement(`chui_accordion`);
11
- constructor(options = [ { b_text: undefined, p_text: undefined } ]) {
12
- require('../../modules/chui_functions').setStyles(__dirname + "/styles.css", 'chUiJS_Accordion');
11
+ constructor(options = [{ b_text: undefined, p_text: undefined }]) {
12
+ require("../../modules/chui_functions").setStyles(__dirname + "/styles.css", "chUiJS_Accordion");
13
13
  // На вход идёт массив секций: объект — ошибка вызова, и объяснить её лучше словами
14
14
  if (Array.isArray(options) === false) {
15
15
  throw new Error("Accordion: нужен массив секций [{b_text, p_text}]");
16
16
  }
17
- options.forEach(element => {
17
+ options.forEach((element) => {
18
18
  let main_test = document.createElement(`chui_accordion_section`);
19
- let ab = document.createElement('accordion_button')
20
- ab.setAttribute('name', this.#name)
21
- let bt = document.createElement('accordion_button_text')
19
+ let ab = document.createElement("accordion_button");
20
+ ab.setAttribute("name", this.#name);
21
+ let bt = document.createElement("accordion_button_text");
22
22
  // Пустая заготовка — это «текста нет», а не слово «undefined» в разметке;
23
23
  // разметку секции принимает innerHTML, как и раньше
24
- bt.innerHTML = element.b_text === undefined || element.b_text === null ? "" : String(element.b_text)
25
- let barrow = document.createElement('accordion_button_arrow')
24
+ bt.innerHTML = element.b_text === undefined || element.b_text === null ? "" : String(element.b_text);
25
+ let barrow = document.createElement("accordion_button_arrow");
26
26
  barrow.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_DOWN).getHTML();
27
- ab.appendChild(bt)
28
- ab.appendChild(barrow)
29
- let ap = document.createElement('accordion_panel')
30
- let html = document.createElement('accordion_panel_html')
31
- html.innerHTML = element.p_text === undefined || element.p_text === null ? "" : String(element.p_text)
32
- ap.appendChild(html)
33
- main_test.appendChild(ab)
34
- main_test.appendChild(ap)
35
- this.#chui_accordion.appendChild(main_test)
27
+ ab.appendChild(bt);
28
+ ab.appendChild(barrow);
29
+ let ap = document.createElement("accordion_panel");
30
+ let html = document.createElement("accordion_panel_html");
31
+ html.innerHTML = element.p_text === undefined || element.p_text === null ? "" : String(element.p_text);
32
+ ap.appendChild(html);
33
+ main_test.appendChild(ab);
34
+ main_test.appendChild(ap);
35
+ this.#chui_accordion.appendChild(main_test);
36
36
 
37
37
  //ФУНКЦИИ
38
38
  let test = main_test.children;
39
39
  let i;
40
40
  for (i = 0; i < test.length; i++) {
41
41
  let elem = test[i];
42
- if (elem.tagName === 'ACCORDION_BUTTON') {
42
+ if (elem.tagName === "ACCORDION_BUTTON") {
43
43
  let panel = elem.nextElementSibling;
44
44
  // Доступность: кнопка раскрытия — role=button с состоянием, панель — регион
45
45
  panel.id = "chui_accordion_panel_" + (disclosure_panel_counter += 1);
@@ -50,8 +50,8 @@ class Accordion {
50
50
  // в обходе Tab и в дереве доступности — поэтому свёрнутая панель помечается инерт
51
51
  panel.inert = true;
52
52
  makeKeyboardButton(elem);
53
- elem.addEventListener('click', () => {
54
- elem.classList.toggle('accordion_active')
53
+ elem.addEventListener("click", () => {
54
+ elem.classList.toggle("accordion_active");
55
55
  let panel = elem.nextElementSibling;
56
56
  // Стрелка и углы кнопки зависят от `aria-expanded` — их ведёт CSS,
57
57
  // а инлайном остаётся только измеренная высота панели
@@ -62,15 +62,18 @@ class Accordion {
62
62
  panel.inert = false;
63
63
  panel.style.maxHeight = panel.scrollHeight + "px";
64
64
  }
65
- elem.setAttribute("aria-expanded", elem.classList.contains('accordion_active') ? "true" : "false");
66
- })
65
+ elem.setAttribute(
66
+ "aria-expanded",
67
+ elem.classList.contains("accordion_active") ? "true" : "false"
68
+ );
69
+ });
67
70
  }
68
71
  }
69
- })
72
+ });
70
73
  }
71
74
  set() {
72
75
  return this.#chui_accordion;
73
76
  }
74
77
  }
75
78
 
76
- exports.Accordion = Accordion
79
+ exports.Accordion = Accordion;
@@ -8,7 +8,7 @@ chui_accordion {
8
8
  /* Зазор между секциями (прежде отдельной секции писал JS инлайном) */
9
9
  gap: 8px;
10
10
  font-size: var(--font_default_size);
11
- font-weight:400;
11
+ font-weight: 400;
12
12
  border: none;
13
13
  margin: var(--margin);
14
14
  }
@@ -19,7 +19,7 @@ chui_accordion_section {
19
19
  height: max-content;
20
20
  width: -webkit-fill-available;
21
21
  font-size: var(--font_default_size);
22
- font-weight:400;
22
+ font-weight: 400;
23
23
  border-radius: var(--border_radius);
24
24
  border: none;
25
25
  }
@@ -63,7 +63,7 @@ accordion_panel_html {
63
63
  padding: 8px 0;
64
64
  width: -webkit-fill-available;
65
65
  display: flex;
66
- border: none
66
+ border: none;
67
67
  }
68
68
 
69
69
  accordion_button:hover {
@@ -71,7 +71,8 @@ accordion_button:hover {
71
71
  }
72
72
 
73
73
  accordion_button:active {
74
- background: var(--element_background_prime); color: var(--text_color_hover);
74
+ background: var(--element_background_prime);
75
+ color: var(--text_color_hover);
75
76
  }
76
77
 
77
78
  accordion_button:hover accordion_button_text {
@@ -109,4 +110,4 @@ accordion_button[aria-expanded="true"] accordion_button_arrow chui_icon {
109
110
 
110
111
  accordion_button[aria-expanded="false"] accordion_button_arrow chui_icon {
111
112
  transform: rotate(0deg);
112
- }
113
+ }
@@ -1,8 +1,8 @@
1
- const {Animation} = require('../../modules/chui_animations/animations');
2
- const {OverlayA11y} = require('../../modules/chui_a11y/chui_a11y');
3
- const {Icon} = require('../chui_icons/icons');
4
- const {setStyles, optionOr} = require('../../modules/chui_functions');
5
- const {I18n} = require('../../modules/chui_i18n/chui_i18n');
1
+ const { Animation } = require("../../modules/chui_animations/animations");
2
+ const { OverlayA11y } = require("../../modules/chui_a11y/chui_a11y");
3
+ const { Icon } = require("../chui_icons/icons");
4
+ const { setStyles, optionOr } = require("../../modules/chui_functions");
5
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
6
6
 
7
7
  /**
8
8
  * Список действий из нижней части экрана (action sheet): заголовок, пояснение,
@@ -43,7 +43,7 @@ const {I18n} = require('../../modules/chui_i18n/chui_i18n');
43
43
  class ActionSheet {
44
44
  static STYLE = {
45
45
  DEFAULT: "default",
46
- DESTRUCTIVE: "destructive"
46
+ DESTRUCTIVE: "destructive",
47
47
  };
48
48
  static #counter = 0;
49
49
 
@@ -69,11 +69,20 @@ class ActionSheet {
69
69
  #on_close = undefined;
70
70
  isOpen = false;
71
71
 
72
- constructor(options = {
73
- id: String(), title: String(), message: String(), label: String(), actions: [],
74
- cancelText: String(), closable: Boolean(), closeOnOutsideClick: Boolean(),
75
- onSelect: undefined, onClose: undefined
76
- }) {
72
+ constructor(
73
+ options = {
74
+ id: String(),
75
+ title: String(),
76
+ message: String(),
77
+ label: String(),
78
+ actions: [],
79
+ cancelText: String(),
80
+ closable: Boolean(),
81
+ closeOnOutsideClick: Boolean(),
82
+ onSelect: undefined,
83
+ onClose: undefined,
84
+ }
85
+ ) {
77
86
  setStyles(__dirname + "/styles.css", "chUiJS_ActionSheet");
78
87
  ActionSheet.#counter += 1;
79
88
  this.#id = options.id === undefined ? `chui_action_sheet_${ActionSheet.#counter}` : options.id;
@@ -105,7 +114,7 @@ class ActionSheet {
105
114
  role: "dialog",
106
115
  labelNode: this.#labelled_by_title ? this.#title : undefined,
107
116
  label: this.#labelled_by_title ? undefined : optionOr(options.label, I18n.t("feedback.actionSheet")),
108
- onEscape: () => this.close()
117
+ onEscape: () => this.close(),
109
118
  });
110
119
  this.#syncCancelText();
111
120
  this.setActions(options.actions === undefined ? [] : options.actions);
@@ -116,12 +125,22 @@ class ActionSheet {
116
125
  }
117
126
 
118
127
  // GET
119
- getId() { return this.#id; }
120
- getTitle() { return this.#title.innerText; }
121
- getMessage() { return this.#message.innerText; }
128
+ getId() {
129
+ return this.#id;
130
+ }
131
+ getTitle() {
132
+ return this.#title.innerText;
133
+ }
134
+ getMessage() {
135
+ return this.#message.innerText;
136
+ }
122
137
  /** Описания действий — те же объекты, что вернула фабрика `ActionSheet.Item` */
123
- getActions() { return [...this.#actions]; }
124
- getCancelText() { return this.#cancel.innerText; }
138
+ getActions() {
139
+ return [...this.#actions];
140
+ }
141
+ getCancelText() {
142
+ return this.#cancel.innerText;
143
+ }
125
144
 
126
145
  // SET
127
146
  setTitle(text = String()) {
@@ -184,24 +203,31 @@ class ActionSheet {
184
203
  this.#sheet.remove();
185
204
  return this;
186
205
  }
187
- set() { return this.#sheet; }
206
+ set() {
207
+ return this.#sheet;
208
+ }
188
209
 
189
210
  /** Готовое обещание: выбор даёт описание действия (`value` — ваше поле), отмена — `undefined`.
190
211
  * Временный слой после ответа убирается: иначе каждый вызов оставлял бы узел в документе */
191
212
  static show(options = {}) {
192
213
  return new Promise((resolve) => {
193
214
  let sheet;
194
- const answer = (value) => { resolve(value); sheet.destroy(); };
195
- sheet = new ActionSheet(Object.assign({}, options, {
196
- onSelect: (action, index) => {
197
- if (options.onSelect !== undefined) options.onSelect(action, index);
198
- answer(action);
199
- },
200
- onClose: () => {
201
- if (options.onClose !== undefined) options.onClose();
202
- answer(undefined);
203
- }
204
- }));
215
+ const answer = (value) => {
216
+ resolve(value);
217
+ sheet.destroy();
218
+ };
219
+ sheet = new ActionSheet(
220
+ Object.assign({}, options, {
221
+ onSelect: (action, index) => {
222
+ if (options.onSelect !== undefined) options.onSelect(action, index);
223
+ answer(action);
224
+ },
225
+ onClose: () => {
226
+ if (options.onClose !== undefined) options.onClose();
227
+ answer(undefined);
228
+ },
229
+ })
230
+ );
205
231
  sheet.open();
206
232
  });
207
233
  }
@@ -244,12 +270,12 @@ class ActionSheet {
244
270
  #onSheetClick = (event) => {
245
271
  if (!this.#close_outside || event.target !== this.#sheet) return;
246
272
  this.close();
247
- }
273
+ };
248
274
  // После анимации имя снимается: иначе следующий показ не проиграется заново
249
275
  #onPanelAnimationEnd = (event) => {
250
276
  if (event.target !== this.#panel) return;
251
277
  this.#panel.style.animationName = "";
252
- }
278
+ };
253
279
  /** Заголовок и пояснение показываются, только когда заданы; пояснение — описание слоя */
254
280
  #syncHead() {
255
281
  const has_title = this.#title.innerText.trim() !== "";
@@ -268,7 +294,7 @@ class ActionSheet {
268
294
  }
269
295
  }
270
296
 
271
- exports.ActionSheet = ActionSheet
297
+ exports.ActionSheet = ActionSheet;
272
298
 
273
299
  // Описание действия собирает фабрика — как у ContextMenu и SplitButton
274
- ActionSheet.Item = (options = {}) => Object.assign({style: ActionSheet.STYLE.DEFAULT}, options);
300
+ ActionSheet.Item = (options = {}) => Object.assign({ style: ActionSheet.STYLE.DEFAULT }, options);
@@ -121,7 +121,8 @@ action_sheet_actions .action_sheet_action:first-child {
121
121
  }
122
122
 
123
123
  .action_sheet_action:active {
124
- background: var(--element_background_prime); color: var(--text_color_hover);
124
+ background: var(--element_background_prime);
125
+ color: var(--text_color_hover);
125
126
  }
126
127
 
127
128
  .action_sheet_action:disabled {