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
@@ -1,74 +1,87 @@
1
- const { Animation } = require('../../../modules/chui_animations/animations');
2
- const { dropdownPlacement } = require('../../../modules/chui_functions');
3
- const { Icon, Icons } = require('../../chui_icons/icons');
4
- const { ComboboxKeyboard } = require('../../../modules/chui_a11y/chui_a11y');
1
+ const { Animation } = require("../../../modules/chui_animations/animations");
2
+ const { dropdownPlacement } = require("../../../modules/chui_functions");
3
+ const { Icon, Icons } = require("../../chui_icons/icons");
4
+ const { ComboboxKeyboard } = require("../../../modules/chui_a11y/chui_a11y");
5
5
 
6
- const {Validate} = require('../../../modules/chui_validate/chui_validate');
6
+ const { Validate } = require("../../../modules/chui_validate/chui_validate");
7
7
 
8
8
  class Select {
9
9
  #id = require("randomstring").generate();
10
- #id_sb = require("randomstring").generate();
11
- #Select_main = document.createElement('chui_selectbox');
12
- #Select_second = document.createElement('selectbox');
13
- #label = document.createElement('label');
14
- #input = document.createElement('input');
15
- #button_open = document.createElement('select_button_open');
16
- #button_open_disabled = document.createElement('select_button_open');
17
- #disabled_trigger = false;
10
+ #idSb = require("randomstring").generate();
11
+ #SelectMain = document.createElement("chui_selectbox");
12
+ #SelectSecond = document.createElement("selectbox");
13
+ #label = document.createElement("label");
14
+ #input = document.createElement("input");
15
+ #buttonOpen = document.createElement("select_button_open");
16
+ #buttonOpenDisabled = document.createElement("select_button_open");
17
+ #disabledTrigger = false;
18
18
  // Признак «вариант только что выбран мышью» — см. обработчик клика по полю
19
- #chosen_by_mouse = false;
20
- #dropdown = document.createElement('selectbox_dropdown');
19
+ #chosenByMouse = false;
20
+ #dropdown = document.createElement("selectbox_dropdown");
21
21
  #a11y = undefined;
22
22
  // Слушатель окна храним полем, чтобы можно было снять в destroy()
23
23
  // Клик вне поля закрывает список. Проверять надо весь контрол целиком, а не только
24
24
  // `selectbox`: слой списка накрывает своё же поле, поэтому у настоящего щелчка по полю
25
25
  // цель `mouseup` — слой, а `click` схлопывается до `<selectbox>` и прежняя проверка
26
26
  // «цель — не ребёнок selectbox» принимала его за клик снаружи (список закрывался сразу)
27
- #window_click_event = (event) => {
28
- if (!this.#Select_main.contains(event.target)) this.#closeDropdown();
27
+ #windowClickEvent = (event) => {
28
+ if (!this.#SelectMain.contains(event.target)) this.#closeDropdown();
29
29
  };
30
- constructor(options = {
31
- name: String(), title: String(), placeholder: String(),
32
- width: String(), required: Boolean()
33
- }) {
34
- require('../../../modules/chui_functions').setStyles(__dirname + "/styles.css", 'chUiJS_Select');
35
- if (options.width !== undefined) this.#Select_main.style.width = options.width;
30
+ constructor(
31
+ options = {
32
+ name: String(),
33
+ title: String(),
34
+ placeholder: String(),
35
+ width: String(),
36
+ required: Boolean(),
37
+ }
38
+ ) {
39
+ require("../../../modules/chui_functions").setStyles(__dirname + "/styles.css", "chUiJS_Select");
40
+ if (options.width !== undefined) this.#SelectMain.style.width = options.width;
36
41
  if (options.placeholder !== undefined) this.#input.placeholder = options.placeholder;
37
42
  if (options.title !== undefined) {
38
- this.#label.classList.add('select_label')
43
+ this.#label.classList.add("select_label");
39
44
  this.#label.innerText = options.title;
40
- this.#label.setAttribute('for', this.#id_sb);
41
- this.#Select_main.appendChild(this.#label);
45
+ this.#label.setAttribute("for", this.#idSb);
46
+ this.#SelectMain.appendChild(this.#label);
42
47
  }
43
48
  if (options.required !== undefined) this.#input.required = options.required;
44
49
  // Валидация: для списка required означает «есть выбранный вариант»
45
- Validate.installField(this, options, this.#Select_second, undefined, () => this.getValue());
46
- this.#input.setAttribute('id', this.#id_sb);
47
- this.#input.classList.add('selectbox_input');
48
- this.#input.type = 'text';
50
+ Validate.installField(this, options, this.#SelectSecond, undefined, () => this.getValue());
51
+ this.#input.setAttribute("id", this.#idSb);
52
+ this.#input.classList.add("selectbox_input");
53
+ this.#input.type = "text";
49
54
  if (options.name !== undefined) this.#input.name = options.name;
50
- this.#input.readOnly = true
51
- this.#button_open.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_DOWN, undefined, "var(--blue_prime_background)").getHTML();
52
- this.#button_open_disabled.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_DOWN, undefined, "var(--text_color_disabled)").getHTML();
55
+ this.#input.readOnly = true;
56
+ this.#buttonOpen.innerHTML = new Icon(
57
+ Icons.HARDWARE.KEYBOARD_ARROW_DOWN,
58
+ undefined,
59
+ "var(--blue_prime_background)"
60
+ ).getHTML();
61
+ this.#buttonOpenDisabled.innerHTML = new Icon(
62
+ Icons.HARDWARE.KEYBOARD_ARROW_DOWN,
63
+ undefined,
64
+ "var(--text_color_disabled)"
65
+ ).getHTML();
53
66
  // Курсор выключенного поля даёт `.selectbox_disabled`: `cursor` наследуется
54
- this.#dropdown.setAttribute('id', this.#id);
55
- this.#Select_second.appendChild(this.#input)
56
- this.#Select_second.appendChild(this.#button_open)
57
- this.#Select_second.appendChild(this.#dropdown)
67
+ this.#dropdown.setAttribute("id", this.#id);
68
+ this.#SelectSecond.appendChild(this.#input);
69
+ this.#SelectSecond.appendChild(this.#buttonOpen);
70
+ this.#SelectSecond.appendChild(this.#dropdown);
58
71
  //LISTENERS
59
- this.#input.addEventListener('focus', () => this.#openDropdown())
60
- this.#input.addEventListener('blur', () => this.#closeDropdown())
61
- this.#Select_second.addEventListener('click', (event) => {
72
+ this.#input.addEventListener("focus", () => this.#openDropdown());
73
+ this.#input.addEventListener("blur", () => this.#closeDropdown());
74
+ this.#SelectSecond.addEventListener("click", (event) => {
62
75
  // Клик по полю или стрелке открывает список сам. Одного `focus` мало:
63
76
  // если фокус уже в поле (повторный клик, диалог поставил фокус первым),
64
77
  // событие `focus` не придёт и список не раскроется
65
78
  const target = event.target;
66
79
  if (!(target instanceof Element)) return;
67
- if (target !== this.#input && !this.#button_open.contains(target)) return;
80
+ if (target !== this.#input && !this.#buttonOpen.contains(target)) return;
68
81
  // Выбор варианта мышью закрывает список на `mousedown` варианта, а `mouseup`
69
82
  // приходит уже по полю — без этой проверки щелчок по варианту раскрывал список заново
70
- if (this.#chosen_by_mouse) {
71
- this.#chosen_by_mouse = false;
83
+ if (this.#chosenByMouse) {
84
+ this.#chosenByMouse = false;
72
85
  return;
73
86
  }
74
87
  this.#input.focus();
@@ -76,44 +89,44 @@ class Select {
76
89
  });
77
90
  // Слой списка не забирает фокус: клик по его отступу не должен закрывать список
78
91
  // (иначе поле теряло бы фокус на пустом месте слоя)
79
- this.#dropdown.addEventListener('mousedown', (event) => event.preventDefault());
80
- window.addEventListener('click', this.#window_click_event);
81
- this.#input.addEventListener('input', (event) => {
82
- let dropdown = this.#dropdown;
83
- for (let option of dropdown.childNodes) {
84
- if (!option.getAttribute('option_value').includes(event.target.value)) {
85
- option.style.display = 'none'
92
+ this.#dropdown.addEventListener("mousedown", (event) => event.preventDefault());
93
+ window.addEventListener("click", this.#windowClickEvent);
94
+ this.#input.addEventListener("input", (event) => {
95
+ const dropdown = this.#dropdown;
96
+ for (const option of dropdown.childNodes) {
97
+ if (!option.getAttribute("option_value").includes(event.target.value)) {
98
+ option.style.display = "none";
86
99
  } else {
87
- option.style.display = 'block'
100
+ option.style.display = "block";
88
101
  }
89
102
  }
90
103
  this.#a11y.refresh();
91
104
  });
92
- this.#Select_main.appendChild(this.#Select_second)
105
+ this.#SelectMain.appendChild(this.#SelectSecond);
93
106
  // Клавиатура и aria: фокус в поле, стрелки/Home/End/Enter по опциям, Escape закрывает
94
107
  this.#a11y = new ComboboxKeyboard(this.#input, {
95
108
  dropdown: this.#dropdown,
96
109
  optionSelector: "selectbox_option",
97
110
  onEscape: () => this.#closeDropdown(),
98
- onOpen: () => this.#openDropdown()
111
+ onOpen: () => this.#openDropdown(),
99
112
  });
100
113
  }
101
114
  #openDropdown() {
102
- if (this.#disabled_trigger) return;
103
- this.#setOpenState(true)
104
- new Animation(this.#dropdown).fadeIn();
115
+ if (this.#disabledTrigger) return;
116
+ this.#setOpenState(true);
117
+ new Animation(this.#dropdown).panelIn();
105
118
  setOptionDisplay(this.#dropdown);
106
119
  this.#setDropdownDirection();
107
120
  this.#a11y.setExpanded(true);
108
121
  }
109
122
  #closeDropdown() {
110
- this.#setOpenState(false)
123
+ this.#setOpenState(false);
111
124
  new Animation(this.#dropdown).fadeOut();
112
125
  if (this.#a11y !== undefined) this.#a11y.setExpanded(false);
113
126
  }
114
127
  /** Полное удаление: снять слушатели окна и клавиатурный слой */
115
128
  destroy() {
116
- window.removeEventListener('click', this.#window_click_event);
129
+ window.removeEventListener("click", this.#windowClickEvent);
117
130
  this.#a11y.destroy();
118
131
  this.#closeDropdown();
119
132
  }
@@ -125,7 +138,7 @@ class Select {
125
138
 
126
139
  /** Значение выбранной опции; пустая строка — опция не выбрана */
127
140
  getSelectedValue() {
128
- const value = this.#Select_main.getAttribute("option_value");
141
+ const value = this.#SelectMain.getAttribute("option_value");
129
142
  return value === null ? "" : value;
130
143
  }
131
144
 
@@ -139,7 +152,8 @@ class Select {
139
152
  setValue(value = String(), silent = Boolean()) {
140
153
  const text = String(value);
141
154
  const options = [...this.#dropdown.children];
142
- const option = options.find((item) => item.getAttribute("option_value") === text) ??
155
+ const option =
156
+ options.find((item) => item.getAttribute("option_value") === text) ??
143
157
  options.find((item) => item.getAttribute("option_title") === text);
144
158
  if (option === undefined) return this;
145
159
  this.#applyOption(option, silent === true);
@@ -154,8 +168,8 @@ class Select {
154
168
  clear() {
155
169
  this.#closeDropdown();
156
170
  this.#input.value = "";
157
- this.#Select_main.removeAttribute("option_title");
158
- this.#Select_main.removeAttribute("option_value");
171
+ this.#SelectMain.removeAttribute("option_title");
172
+ this.#SelectMain.removeAttribute("option_value");
159
173
  this.#markSelected(undefined);
160
174
  return this;
161
175
  }
@@ -183,22 +197,24 @@ class Select {
183
197
  }
184
198
  /** Выбор опции: подпись и значение идут в поле и в атрибуты корня, затем слушатели */
185
199
  #applyOption(option = new HTMLElement(), silent = Boolean()) {
186
- const title = option.getAttribute('option_title');
187
- const value = option.getAttribute('option_value');
200
+ const title = option.getAttribute("option_title");
201
+ const value = option.getAttribute("option_value");
188
202
  this.#input.value = title;
189
- this.#Select_main.setAttribute("option_title", title);
190
- this.#Select_main.setAttribute("option_value", value);
203
+ this.#SelectMain.setAttribute("option_title", title);
204
+ this.#SelectMain.setAttribute("option_value", value);
191
205
  this.#markSelected(option);
192
206
  if (silent) return;
193
207
  // Выбор варианта закрывает список: клику по опции это уже не поручить —
194
208
  // click схлопывается до общего предка (mousedown был в поле, mouseup — в слое)
195
209
  this.#closeDropdown();
196
- this.#Select_main.dispatchEvent(new CustomEvent("chui_select_option_changed", {
197
- detail: {
198
- title: title,
199
- value: value
200
- },
201
- }));
210
+ this.#SelectMain.dispatchEvent(
211
+ new CustomEvent("chui_select_option_changed", {
212
+ detail: {
213
+ title: title,
214
+ value: value,
215
+ },
216
+ })
217
+ );
202
218
  }
203
219
  /**
204
220
  * Выбор опции: подпись и значение идут в поле и в атрибуты корня, затем слушатели.
@@ -207,32 +223,32 @@ class Select {
207
223
  * закрывался бы по blur до щелчка, и выбор терялся бы.
208
224
  */
209
225
  #wireOption(option = new HTMLElement()) {
210
- option.addEventListener('mousedown', (event) => {
226
+ option.addEventListener("mousedown", (event) => {
211
227
  event.preventDefault();
212
228
  // Признак «выбрано мышью»: гасит повторное раскрытие списка на `mouseup` по полю
213
- this.#chosen_by_mouse = true;
229
+ this.#chosenByMouse = true;
214
230
  this.#applyOption(option, false);
215
231
  });
216
- option.addEventListener('click', (event) => {
232
+ option.addEventListener("click", (event) => {
217
233
  if (event.detail !== 0) return;
218
234
  this.#applyOption(option, false);
219
235
  });
220
236
  }
221
237
  addOption(title, value) {
222
- let option = document.createElement(`selectbox_option`);
238
+ const option = document.createElement(`selectbox_option`);
223
239
  option.innerHTML = title;
224
- option.setAttribute('option_title', title);
225
- option.setAttribute('option_value', value);
240
+ option.setAttribute("option_title", title);
241
+ option.setAttribute("option_value", value);
226
242
  this.#wireOption(option);
227
243
  this.#dropdown.appendChild(option);
228
244
  this.#a11y.refresh();
229
245
  }
230
246
  addOptions(...options) {
231
- for (let opt of options) {
232
- let option = document.createElement(`selectbox_option`);
247
+ for (const opt of options) {
248
+ const option = document.createElement(`selectbox_option`);
233
249
  option.innerHTML = opt.title;
234
- option.setAttribute('option_title', opt.title);
235
- option.setAttribute('option_value', opt.value);
250
+ option.setAttribute("option_title", opt.title);
251
+ option.setAttribute("option_value", opt.value);
236
252
  this.#wireOption(option);
237
253
  this.#dropdown.appendChild(option);
238
254
  }
@@ -247,58 +263,66 @@ class Select {
247
263
  */
248
264
  setDefaultOption(object = Object()) {
249
265
  const wanted = object !== null && typeof object === "object" ? object.value : object;
250
- let opt = this.#dropdown.getElementsByTagName('selectbox_option');
266
+ const opt = this.#dropdown.getElementsByTagName("selectbox_option");
251
267
  for (let i = 0; i < opt.length; i++) {
252
- let test = opt.item(i);
253
- if (test.getAttribute('option_value') === String(wanted)) test.click()
268
+ const test = opt.item(i);
269
+ if (test.getAttribute("option_value") === String(wanted)) test.click();
254
270
  }
255
271
  }
256
272
  addValueChangeListener(listener = () => {}) {
257
- this.#Select_main.addEventListener("chui_select_option_changed", listener)
273
+ this.#SelectMain.addEventListener("chui_select_option_changed", listener);
274
+ }
275
+ getName() {
276
+ return this.#input.name;
277
+ }
278
+ getValue() {
279
+ return this.#input.value;
258
280
  }
259
- getName() { return this.#input.name; }
260
- getValue() { return this.#input.value; }
261
281
  setDisabled(boolean = Boolean()) {
262
- this.#disabled_trigger = boolean
282
+ this.#disabledTrigger = boolean;
263
283
  if (boolean) {
264
- this.#setOpenState(false)
284
+ this.#setOpenState(false);
265
285
  if (this.#a11y !== undefined) this.#a11y.setExpanded(false);
266
- this.#Select_second.classList.add("selectbox_disabled")
267
- this.#input.className = "selectbox_input_disabled"
268
- this.#label.className = "select_label_disabled"
269
- this.#button_open.remove();
270
- this.#Select_second.appendChild(this.#button_open_disabled);
286
+ this.#SelectSecond.classList.add("selectbox_disabled");
287
+ this.#input.className = "selectbox_input_disabled";
288
+ this.#label.className = "select_label_disabled";
289
+ this.#buttonOpen.remove();
290
+ this.#SelectSecond.appendChild(this.#buttonOpenDisabled);
271
291
  } else {
272
- this.#Select_second.classList.remove("selectbox_disabled")
273
- this.#input.className = "selectbox_input"
274
- this.#label.className = "select_label"
275
- this.#button_open_disabled.remove();
276
- this.#Select_second.appendChild(this.#button_open);
292
+ this.#SelectSecond.classList.remove("selectbox_disabled");
293
+ this.#input.className = "selectbox_input";
294
+ this.#label.className = "select_label";
295
+ this.#buttonOpenDisabled.remove();
296
+ this.#SelectSecond.appendChild(this.#buttonOpen);
277
297
  }
278
298
  }
279
299
  #setOpenState(opened = Boolean()) {
280
300
  // Рамку активного поля держит общее правило темы (`selectbox:focus-within`
281
301
  // в global_style.css, вместе с кольцом), а не индайн компонента: индайновая рамка
282
302
  // перебивала тему и мешала централизации состояний
283
- this.#button_open.style.transform = opened ? 'rotate(180deg)' : 'rotate(0deg)'
303
+ this.#buttonOpen.style.transform = opened ? "rotate(180deg)" : "rotate(0deg)";
284
304
  }
285
305
  #setDropdownDirection() {
286
- const placement = dropdownPlacement(this.#dropdown, this.#Select_second);
306
+ const placement = dropdownPlacement(this.#dropdown, this.#SelectSecond);
287
307
  // Зазор до поля держит CSS (`top: calc(100% + 4px)`), вверх — то же число через `bottom`:
288
308
  // так список отстоит от поля на один зазор в обе стороны (вверх - `bottom`)
289
- this.#dropdown.style.top = placement.up ? 'auto' : '';
290
- this.#dropdown.style.bottom = placement.up ? 'calc(100% + 4px)' : '';
309
+ this.#dropdown.style.top = placement.up ? "auto" : "";
310
+ this.#dropdown.style.bottom = placement.up ? "calc(100% + 4px)" : "";
291
311
  // Слой не вылезает за видимую часть контейнера: лишнее уходит в прокрутку списка
292
312
  if (placement.maxHeight > 0) this.#dropdown.style.maxHeight = `${placement.maxHeight}px`;
293
- else this.#dropdown.style.removeProperty('max-height');
313
+ else this.#dropdown.style.removeProperty("max-height");
314
+ }
315
+ set() {
316
+ return this.#SelectMain;
294
317
  }
295
- set() { return this.#Select_main; }
296
318
  }
297
319
 
298
320
  function setOptionDisplay(element = new HTMLElement()) {
299
321
  // Скрытый фильтром вариант показывается снятием инлайнового `display`:
300
322
  // базовый вид строки (блок) задаёт CSS, а не этот обход
301
- for (let option of element.childNodes) { option.style.removeProperty("display"); }
323
+ for (const option of element.childNodes) {
324
+ option.style.removeProperty("display");
325
+ }
302
326
  }
303
327
 
304
- exports.Select = Select
328
+ exports.Select = Select;
@@ -4,21 +4,21 @@ chui_selectbox {
4
4
  карточку. Токены переопределены у корня поля, поэтому действуют только внутри него
5
5
  (тот же приём у полосы меню-бара). */
6
6
  --control_padding: var(--control_padding_sm);
7
- --main_padding: var(--main_padding_sm);
7
+ --block_padding: var(--block_padding_sm);
8
8
  display: flex;
9
9
  flex-direction: column;
10
10
  height: max-content;
11
- margin: var(--margin);
12
- width: var(--control_width)
11
+ margin: var(--block_margin);
12
+ width: var(--control_width);
13
13
  }
14
14
 
15
15
  selectbox {
16
16
  position: relative;
17
- display:flex;
17
+ display: flex;
18
18
  outline: none;
19
19
  height: max-content;
20
20
  width: -webkit-fill-available;
21
- border-radius: var(--border_radius);
21
+ border-radius: var(--radius_sm);
22
22
  padding: 0;
23
23
  font-size: var(--font_default_size);
24
24
  color: var(--text_color);
@@ -28,11 +28,11 @@ selectbox {
28
28
 
29
29
  .selectbox_input {
30
30
  cursor: pointer;
31
- width:100%;
31
+ width: 100%;
32
32
  display: block;
33
33
  outline: none;
34
34
  margin: 0;
35
- padding: var(--control_padding) 0 var(--main_padding);
35
+ padding: var(--control_padding) 0 var(--block_padding);
36
36
  background: transparent;
37
37
  color: var(--text_color);
38
38
  text-align: start;
@@ -59,10 +59,10 @@ selectbox_dropdown {
59
59
  -webkit-backdrop-filter: var(--global_blur);
60
60
  color: var(--text_color);
61
61
  outline: none;
62
- position:absolute;
63
- display:none;
62
+ position: absolute;
63
+ display: none;
64
64
  height: max-content;
65
- border-radius: var(--border_radius);
65
+ border-radius: var(--radius_sm);
66
66
  padding: var(--control_padding);
67
67
  font-size: var(--font_default_size);
68
68
  flex-direction: column;
@@ -76,7 +76,7 @@ selectbox_dropdown {
76
76
  select_button_open {
77
77
  cursor: pointer;
78
78
  outline: none;
79
- padding: var(--main_padding);
79
+ padding: var(--block_padding);
80
80
  }
81
81
 
82
82
  selectbox_option {
@@ -92,7 +92,7 @@ selectbox_option {
92
92
  text-align: start;
93
93
  /* 5px отступа слоя + 6px строки = 11px — ровно отступ текста в самом поле */
94
94
  padding: var(--control_padding) 6px;
95
- border-radius: var(--border_radius);
95
+ border-radius: var(--radius_sm);
96
96
  color: var(--text_color);
97
97
  /* Подпись держит одну строку (как у чипсов): длинный вариант усекается, а не растит список */
98
98
  white-space: nowrap;
@@ -122,10 +122,10 @@ selectbox_option:active {
122
122
  .select_label {
123
123
  height: max-content;
124
124
  width: max-content;
125
- margin: 0 0 var(--margin);
125
+ margin: 0 0 var(--block_margin);
126
126
  font-size: var(--font_labels_size);
127
- font-weight:500;
128
- color: var(--text_color)
127
+ font-weight: 500;
128
+ color: var(--text_color);
129
129
  }
130
130
 
131
131
  /* DISABLED STYLES */
@@ -137,9 +137,9 @@ selectbox_option:active {
137
137
 
138
138
  .selectbox_input_disabled {
139
139
  cursor: not-allowed;
140
- width:100%;
140
+ width: 100%;
141
141
  margin: 0;
142
- padding: var(--control_padding) 0 var(--main_padding);
142
+ padding: var(--control_padding) 0 var(--block_padding);
143
143
  background: transparent;
144
144
  color: var(--text_color_disabled);
145
145
  text-align: start;
@@ -160,8 +160,8 @@ selectbox_option:active {
160
160
  cursor: not-allowed;
161
161
  height: max-content;
162
162
  width: max-content;
163
- margin: 0 0 var(--margin);
163
+ margin: 0 0 var(--block_margin);
164
164
  font-size: var(--font_labels_size);
165
- font-weight:500;
166
- color: var(--text_color_disabled)
167
- }
165
+ font-weight: 500;
166
+ color: var(--text_color_disabled);
167
+ }