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
@@ -74,17 +74,17 @@ class OrgChart {
74
74
  #roots = [];
75
75
  #rows = [];
76
76
  #slots = 1;
77
- #node_width = OrgChart.DEFAULT_NODE_WIDTH;
78
- #node_height = OrgChart.DEFAULT_NODE_HEIGHT;
79
- #gap_x = OrgChart.DEFAULT_GAP_X;
80
- #gap_y = OrgChart.DEFAULT_GAP_Y;
77
+ #nodeWidth = OrgChart.DEFAULT_NODE_WIDTH;
78
+ #nodeHeight = OrgChart.DEFAULT_NODE_HEIGHT;
79
+ #gapX = OrgChart.DEFAULT_GAP_X;
80
+ #gapY = OrgChart.DEFAULT_GAP_Y;
81
81
  #collapsible = true;
82
- #empty_text = undefined;
82
+ #emptyText = undefined;
83
83
  #label = undefined;
84
84
  #selected = undefined;
85
85
  #expanded = new Map();
86
- #on_node_click = undefined;
87
- #click_listeners = [];
86
+ #onNodeClick = undefined;
87
+ #clickListeners = [];
88
88
 
89
89
  constructor(
90
90
  options = {
@@ -107,19 +107,19 @@ class OrgChart {
107
107
  this.#id = options.id === undefined ? `chui_org_chart_${OrgChart.#counter}` : options.id;
108
108
  this.#root.id = this.#id;
109
109
  this.#label = options.label;
110
- this.#empty_text = options.emptyText;
111
- this.#on_node_click = options.onNodeClick;
110
+ this.#emptyText = options.emptyText;
111
+ this.#onNodeClick = options.onNodeClick;
112
112
  if (options.nodeWidth !== undefined)
113
- this.#node_width = Math.max(80, Number(options.nodeWidth) || OrgChart.DEFAULT_NODE_WIDTH);
113
+ this.#nodeWidth = Math.max(80, Number(options.nodeWidth) || OrgChart.DEFAULT_NODE_WIDTH);
114
114
  if (options.nodeHeight !== undefined)
115
- this.#node_height = Math.max(40, Number(options.nodeHeight) || OrgChart.DEFAULT_NODE_HEIGHT);
116
- if (options.gapX !== undefined) this.#gap_x = Number(options.gapX);
117
- if (options.gapY !== undefined) this.#gap_y = Number(options.gapY);
115
+ this.#nodeHeight = Math.max(40, Number(options.nodeHeight) || OrgChart.DEFAULT_NODE_HEIGHT);
116
+ if (options.gapX !== undefined) this.#gapX = Number(options.gapX);
117
+ if (options.gapY !== undefined) this.#gapY = Number(options.gapY);
118
118
  if (options.collapsible !== undefined) this.#collapsible = options.collapsible !== false;
119
119
  // Размер карточки читают и полотно, и поле прокрутки (отступ по краям), поэтому
120
120
  // переменные живут на корне, а не на полотне
121
- this.#root.style.setProperty("--org_chart_node_width", `${this.#node_width}px`);
122
- this.#root.style.setProperty("--org_chart_node_height", `${this.#node_height}px`);
121
+ this.#root.style.setProperty("--org_chart_node_width", `${this.#nodeWidth}px`);
122
+ this.#root.style.setProperty("--org_chart_node_height", `${this.#nodeHeight}px`);
123
123
  if (options.height !== undefined) this.#root.style.setProperty("--org_chart_height", options.height);
124
124
 
125
125
  this.#title.id = `${this.#id}_title`;
@@ -132,7 +132,7 @@ class OrgChart {
132
132
  this.#status.classList.add("chui_visually_hidden");
133
133
  this.#status.setAttribute("role", "status");
134
134
  this.#status.setAttribute("aria-live", "polite");
135
- this.#empty.innerText = this.#empty_text === undefined ? I18n.t("data.orgChartEmpty") : this.#empty_text;
135
+ this.#empty.innerText = this.#emptyText === undefined ? I18n.t("data.orgChartEmpty") : this.#emptyText;
136
136
 
137
137
  this.#canvas.appendChild(this.#links);
138
138
  this.#viewport.appendChild(this.#canvas);
@@ -198,7 +198,7 @@ class OrgChart {
198
198
  return this;
199
199
  }
200
200
  setEmptyText(text = String()) {
201
- this.#empty_text = text;
201
+ this.#emptyText = text;
202
202
  this.#empty.innerText = text;
203
203
  return this;
204
204
  }
@@ -253,7 +253,7 @@ class OrgChart {
253
253
  return this;
254
254
  }
255
255
  addNodeClickListener(listener = () => {}) {
256
- this.#click_listeners.push(listener);
256
+ this.#clickListeners.push(listener);
257
257
  return this;
258
258
  }
259
259
  set() {
@@ -368,10 +368,10 @@ class OrgChart {
368
368
  this.#rows = projected.rows;
369
369
  this.#slots = projected.slots;
370
370
  this.#nodes().forEach((node) => node.remove());
371
- const step = this.#node_height + this.#gap_y;
371
+ const step = this.#nodeHeight + this.#gapY;
372
372
  const levels = this.#rows.reduce((max, row) => Math.max(max, row.level + 1), 0);
373
- const height = Math.max(this.#node_height, levels * step - this.#gap_y);
374
- const width = Math.max(this.#slots * (this.#node_width + this.#gap_x), 1);
373
+ const height = Math.max(this.#nodeHeight, levels * step - this.#gapY);
374
+ const width = Math.max(this.#slots * (this.#nodeWidth + this.#gapX), 1);
375
375
  this.#canvas.style.width = `${width}px`;
376
376
  this.#canvas.style.height = `${height}px`;
377
377
  // Система координат связей: 0…100 по ширине полотна и пиксели по высоте —
@@ -401,7 +401,7 @@ class OrgChart {
401
401
  return undefined;
402
402
  }
403
403
  /** Координаты узла в той же системе, что у связей: `x` — процент, `y` — пиксели */
404
- #positionOf(row, step = this.#node_height + this.#gap_y) {
404
+ #positionOf(row, step = this.#nodeHeight + this.#gapY) {
405
405
  return { x: (row.slot / this.#slots) * 100, y: row.level * step };
406
406
  }
407
407
  #renderNode(row, step = Number()) {
@@ -437,9 +437,9 @@ class OrgChart {
437
437
  title.title = title.innerText;
438
438
  content.appendChild(title);
439
439
  if (row.node.position !== undefined) {
440
- const position_text = document.createElement("org_chart_node_position");
441
- position_text.innerText = String(row.node.position);
442
- content.appendChild(position_text);
440
+ const positionText = document.createElement("org_chart_node_position");
441
+ positionText.innerText = String(row.node.position);
442
+ content.appendChild(positionText);
443
443
  }
444
444
  if (row.node.description !== undefined) {
445
445
  const description = document.createElement("org_chart_node_description");
@@ -478,8 +478,8 @@ class OrgChart {
478
478
  const from = this.#positionOf(row.parent, step);
479
479
  const to = this.#positionOf(row, step);
480
480
  const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
481
- const middle = (from.y + this.#node_height + to.y) / 2;
482
- path.setAttribute("d", `M ${from.x} ${from.y + this.#node_height} V ${middle} H ${to.x} V ${to.y}`);
481
+ const middle = (from.y + this.#nodeHeight + to.y) / 2;
482
+ path.setAttribute("d", `M ${from.x} ${from.y + this.#nodeHeight} V ${middle} H ${to.x} V ${to.y}`);
483
483
  path.setAttribute("class", "org_chart_link");
484
484
  path.setAttribute("vector-effect", "non-scaling-stroke");
485
485
  this.#links.appendChild(path);
@@ -511,8 +511,8 @@ class OrgChart {
511
511
  }
512
512
  #emit(row) {
513
513
  if (row === undefined) return;
514
- for (const listener of [...this.#click_listeners]) listener(row.node);
515
- if (this.#on_node_click !== undefined) this.#on_node_click(row.node);
514
+ for (const listener of [...this.#clickListeners]) listener(row.node);
515
+ if (this.#onNodeClick !== undefined) this.#onNodeClick(row.node);
516
516
  }
517
517
  #announce(text = String()) {
518
518
  this.#status.innerText = "";
@@ -11,7 +11,7 @@ chui_org_chart {
11
11
  width: -webkit-fill-available;
12
12
  max-width: 100%;
13
13
  box-sizing: border-box;
14
- margin: var(--margin);
14
+ margin: var(--block_margin);
15
15
  color: var(--text_color);
16
16
  font-size: var(--font_default_size);
17
17
  text-align: start;
@@ -184,7 +184,7 @@ org_chart_node chui_avatar {
184
184
 
185
185
  org_chart_empty {
186
186
  display: block;
187
- padding: var(--main_padding);
187
+ padding: var(--block_padding);
188
188
  color: var(--text_color_disabled);
189
189
  text-align: center;
190
190
  }
@@ -38,7 +38,7 @@ class Pagination {
38
38
  #edges = 1;
39
39
  #jump = true;
40
40
  #listeners = [];
41
- #on_change = undefined;
41
+ #onChange = undefined;
42
42
 
43
43
  constructor(
44
44
  options = {
@@ -67,7 +67,7 @@ class Pagination {
67
67
  if (options.jump !== undefined) this.#jump = options.jump === true;
68
68
  this.#pages = Pagination.#count(options.pages, 1);
69
69
  this.#page = Pagination.#clamp(Pagination.#count(options.page, 1), this.#pages);
70
- this.#on_change = options.onChange;
70
+ this.#onChange = options.onChange;
71
71
  if (options.changeEvent !== undefined) this.addChangeListener(options.changeEvent);
72
72
  this.#root.appendChild(this.#list);
73
73
  this.#render();
@@ -165,7 +165,7 @@ class Pagination {
165
165
  // === ВНУТРЕННЕЕ ===
166
166
  #notify() {
167
167
  for (const listener of [...this.#listeners]) listener(this.#page, this);
168
- if (this.#on_change !== undefined) this.#on_change(this.#page, this);
168
+ if (this.#onChange !== undefined) this.#onChange(this.#page, this);
169
169
  }
170
170
 
171
171
  // Номера страниц с пропусками: `{gap: true}` — место для «…»
@@ -3,7 +3,7 @@ chui_pagination {
3
3
  display: inline-flex;
4
4
  width: max-content;
5
5
  height: max-content;
6
- margin: var(--margin);
6
+ margin: var(--block_margin);
7
7
  color: var(--text_color);
8
8
  font-size: var(--font_default_size);
9
9
  }
@@ -1,11 +1,11 @@
1
1
  p {
2
2
  height: max-content;
3
3
  /* Ширина абзаца — по контейнеру: с max-content длинный текст не переносился,
4
- а вместе с margin: var(--margin) абзац ещё и смещался вправо за край родителя */
4
+ а вместе с margin: var(--block_margin) абзац ещё и смещался вправо за край родителя */
5
5
  width: -webkit-fill-available;
6
6
  /* Слово шире строки (ссылка, длинное имя) разрывается, а не вылезает за абзац */
7
7
  overflow-wrap: break-word;
8
8
  color: var(--text_color);
9
- margin: var(--margin);
9
+ margin: var(--block_margin);
10
10
  font-size: var(--font_default_size);
11
11
  }
@@ -1,4 +1,5 @@
1
1
  const { setStyles, optionOr } = require("../../modules/chui_functions");
2
+ const { Animation } = require("../../modules/chui_animations/animations");
2
3
 
3
4
  /**
4
5
  * Поповер: панель у триггера с произвольным содержимым.
@@ -48,10 +49,10 @@ class Popover {
48
49
  #id = undefined;
49
50
  #trigger = undefined;
50
51
  #placement = Popover.PLACEMENT.BOTTOM;
51
- #is_open = false;
52
- #on_open = undefined;
53
- #on_close = undefined;
54
- #close_on_outside = true;
52
+ #isOpen = false;
53
+ #onOpen = undefined;
54
+ #onClose = undefined;
55
+ #closeOnOutside = true;
55
56
  #destroyed = false;
56
57
 
57
58
  constructor(
@@ -78,9 +79,9 @@ class Popover {
78
79
  this.#panel.setAttribute("tabindex", "-1");
79
80
  if (options.label !== undefined) this.setLabel(options.label);
80
81
  if (options.placement !== undefined) this.#placement = Popover.#normalize(options.placement);
81
- this.#on_open = options.onOpen;
82
- this.#on_close = options.onClose;
83
- if (options.closeOnOutsideClick !== undefined) this.#close_on_outside = options.closeOnOutsideClick !== false;
82
+ this.#onOpen = options.onOpen;
83
+ this.#onClose = options.onClose;
84
+ if (options.closeOnOutsideClick !== undefined) this.#closeOnOutside = options.closeOnOutsideClick !== false;
84
85
  this.#panel.appendChild(this.#header);
85
86
  this.#panel.appendChild(this.#body);
86
87
  if (options.title !== undefined) this.setTitle(options.title);
@@ -98,7 +99,7 @@ class Popover {
98
99
  }
99
100
 
100
101
  get isOpen() {
101
- return this.#is_open;
102
+ return this.#isOpen;
102
103
  }
103
104
 
104
105
  getTitle() {
@@ -121,8 +122,8 @@ class Popover {
121
122
  this.#header.innerText = text === undefined ? "" : String(text);
122
123
  if (this.#header.id === "") this.#header.id = `${this.#id}_title`;
123
124
  // Заголовок служит именем слоя, пока не задан свой label и пока он не пуст
124
- const has_title = this.#header.innerText.trim() !== "";
125
- if (has_title && this.#panel.getAttribute("aria-label") === null)
125
+ const hasTitle = this.#header.innerText.trim() !== "";
126
+ if (hasTitle && this.#panel.getAttribute("aria-label") === null)
126
127
  this.#panel.setAttribute("aria-labelledby", this.#header.id);
127
128
  else this.#panel.removeAttribute("aria-labelledby");
128
129
  return this;
@@ -142,7 +143,7 @@ class Popover {
142
143
 
143
144
  setPlacement(placement = String()) {
144
145
  this.#placement = Popover.#normalize(placement);
145
- if (this.#is_open) this.#place();
146
+ if (this.#isOpen) this.#place();
146
147
  return this;
147
148
  }
148
149
 
@@ -183,41 +184,46 @@ class Popover {
183
184
 
184
185
  // ПОКАЗ / СКРЫТИЕ
185
186
  open() {
186
- if (this.#destroyed || this.#is_open) return this;
187
+ if (this.#destroyed || this.#isOpen) return this;
187
188
  if (this.#trigger !== undefined && !document.body.contains(this.#trigger)) return this;
188
- this.#is_open = true;
189
+ this.#isOpen = true;
189
190
  this.#panel.style.visibility = "hidden";
190
191
  this.#panel.style.display = "flex";
191
192
  this.#place();
192
193
  this.#panel.style.visibility = "visible";
194
+ // Кадр — после расстановки: её мереет `getBoundingClientRect`, а он считает
195
+ // по анимированному состоянию
196
+ new Animation(this.#panel).panelIn();
193
197
  if (this.#trigger !== undefined) this.#trigger.setAttribute("aria-expanded", "true");
194
- if (this.#close_on_outside) window.addEventListener("click", this.#onWindowClick);
198
+ if (this.#closeOnOutside) window.addEventListener("click", this.#onWindowClick);
195
199
  window.addEventListener("resize", this.#onWindowChange);
196
200
  window.addEventListener("scroll", this.#onWindowChange, true);
197
201
  this.#focusInside();
198
- if (this.#on_open !== undefined) this.#on_open(this);
202
+ if (this.#onOpen !== undefined) this.#onOpen(this);
199
203
  return this;
200
204
  }
201
205
 
202
206
  close() {
203
- if (!this.#is_open) return this;
207
+ if (!this.#isOpen) return this;
204
208
  // Проверяем до скрытия: `display: none` уводит фокус в body, и «был ли он внутри» уже не узнать
205
- const focus_inside = this.#panel.contains(document.activeElement);
206
- this.#is_open = false;
209
+ const focusInside = this.#panel.contains(document.activeElement);
210
+ this.#isOpen = false;
207
211
  window.removeEventListener("click", this.#onWindowClick);
208
212
  window.removeEventListener("resize", this.#onWindowChange);
209
213
  window.removeEventListener("scroll", this.#onWindowChange, true);
210
- this.#panel.style.display = "none";
214
+ // Уход — кадром: панель гаснет и сходит вверх, а `display` снимает драйвер по концу
215
+ // кадра. Прежде панель пропадала рывком
216
+ new Animation(this.#panel).fadeOut();
211
217
  if (this.#trigger !== undefined) {
212
218
  this.#trigger.setAttribute("aria-expanded", "false");
213
- if (focus_inside) this.#trigger.focus();
219
+ if (focusInside) this.#trigger.focus();
214
220
  }
215
- if (this.#on_close !== undefined) this.#on_close(this);
221
+ if (this.#onClose !== undefined) this.#onClose(this);
216
222
  return this;
217
223
  }
218
224
 
219
225
  toggle() {
220
- return this.#is_open ? this.close() : this.open();
226
+ return this.#isOpen ? this.close() : this.open();
221
227
  }
222
228
 
223
229
  destroy() {
@@ -310,7 +316,7 @@ class Popover {
310
316
  };
311
317
 
312
318
  #onWindowChange = () => {
313
- if (!this.#is_open) return;
319
+ if (!this.#isOpen) return;
314
320
  this.#place();
315
321
  };
316
322
 
@@ -11,7 +11,7 @@ chui_popover {
11
11
  padding: 12px;
12
12
  gap: 10px;
13
13
  border: 1px solid var(--border_color);
14
- border-radius: var(--border_radius);
14
+ border-radius: var(--radius_sm);
15
15
  background: var(--header_background);
16
16
  backdrop-filter: var(--global_blur);
17
17
  box-shadow: var(--box_shadow_drop);