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,7 +1,8 @@
1
- const {Button} = require('../chui_button/button');
2
- const {Icons} = require('../chui_icons/icons');
3
- const {Desktop} = require('../../modules/chui_services/desktop');
4
- const {I18n} = require('../../modules/chui_i18n/chui_i18n');
1
+ const { Button } = require("../chui_button/button");
2
+ const { Icons } = require("../chui_icons/icons");
3
+ const { Desktop } = require("../../modules/chui_services/desktop");
4
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
5
+ const { reportError } = require("../../modules/chui_logger/chui_logger");
5
6
 
6
7
  /**
7
8
  * Кнопка печати: печатает страницу целиком, готовый HTML или элемент с его стилями.
@@ -22,7 +23,7 @@ const {I18n} = require('../../modules/chui_i18n/chui_i18n');
22
23
  class PrintButton {
23
24
  static MODE = {
24
25
  PRINT: "print",
25
- PDF: "pdf"
26
+ PDF: "pdf",
26
27
  };
27
28
 
28
29
  #button = undefined;
@@ -30,34 +31,45 @@ class PrintButton {
30
31
  #target = undefined;
31
32
  #html = undefined;
32
33
  #options = {};
33
- #file_name = undefined;
34
- #document_title = undefined;
35
- #on_result = undefined;
34
+ #fileName = undefined;
35
+ #documentTitle = undefined;
36
+ #onResult = undefined;
37
+ #onError = undefined;
36
38
 
37
- constructor(options = {
38
- title: String(),
39
- mode: String(),
40
- target: undefined,
41
- html: undefined,
42
- options: {},
43
- fileName: String(),
44
- documentTitle: String(),
45
- icon: undefined,
46
- onResult: undefined
47
- }) {
39
+ constructor(
40
+ options = {
41
+ title: String(),
42
+ mode: String(),
43
+ target: undefined,
44
+ html: undefined,
45
+ options: {},
46
+ fileName: String(),
47
+ documentTitle: String(),
48
+ icon: undefined,
49
+ onResult: undefined,
50
+ onError: undefined,
51
+ }
52
+ ) {
48
53
  this.#mode = options.mode === undefined ? PrintButton.MODE.PRINT : options.mode;
49
54
  this.#target = options.target;
50
55
  this.#html = options.html;
51
56
  this.#options = options.options === undefined ? {} : options.options;
52
- this.#file_name = options.fileName;
53
- this.#document_title = options.documentTitle;
54
- this.#on_result = options.onResult;
57
+ this.#fileName = options.fileName;
58
+ this.#documentTitle = options.documentTitle;
59
+ this.#onResult = options.onResult;
60
+ this.#onError = options.onError;
55
61
  this.#button = new Button({
56
- title: options.title === undefined ? (this.#mode === PrintButton.MODE.PDF ? I18n.t("graphics.printSavePdf") : I18n.t("graphics.print")) : options.title,
62
+ title:
63
+ options.title === undefined
64
+ ? this.#mode === PrintButton.MODE.PDF
65
+ ? I18n.t("graphics.printSavePdf")
66
+ : I18n.t("graphics.print")
67
+ : options.title,
57
68
  icon: options.icon === undefined ? Icons.ACTIONS.PRINT : options.icon,
58
69
  clickEvent: () => {
59
- this.print().catch(() => {});
60
- }
70
+ // Отказ сервиса не глушим: приложению — `onError`, без него — в лог
71
+ this.print().catch((error) => reportError(error, this.#onError));
72
+ },
61
73
  });
62
74
  }
63
75
 
@@ -99,13 +111,16 @@ class PrintButton {
99
111
  /** Запустить печать или сохранение PDF; возвращает результат сервиса */
100
112
  print() {
101
113
  const html = this.#buildHtml();
102
- const options = {...this.#options};
103
- if (this.#file_name !== undefined) options.fileName = this.#file_name;
104
- const request = this.#mode === PrintButton.MODE.PDF
105
- ? Desktop.print.pdf(html === undefined ? document.documentElement.outerHTML : html, options)
106
- : (html === undefined ? Desktop.print.page(options) : Desktop.print.html(html, options));
114
+ const options = { ...this.#options };
115
+ if (this.#fileName !== undefined) options.fileName = this.#fileName;
116
+ const request =
117
+ this.#mode === PrintButton.MODE.PDF
118
+ ? Desktop.print.pdf(html === undefined ? document.documentElement.outerHTML : html, options)
119
+ : html === undefined
120
+ ? Desktop.print.page(options)
121
+ : Desktop.print.html(html, options);
107
122
  return request.then((result) => {
108
- if (this.#on_result !== undefined) this.#on_result(result);
123
+ if (this.#onResult !== undefined) this.#onResult(result);
109
124
  return result;
110
125
  });
111
126
  }
@@ -122,9 +137,9 @@ class PrintButton {
122
137
  const node = this.#target instanceof Element ? this.#target : this.#target.set();
123
138
  if (node === undefined || node === null) return undefined;
124
139
  const styles = [...document.querySelectorAll("style")].map((style) => style.outerHTML).join("\n");
125
- const title = this.#document_title === undefined ? "" : `<title>${this.#document_title}</title>`;
140
+ const title = this.#documentTitle === undefined ? "" : `<title>${this.#documentTitle}</title>`;
126
141
  return `<!DOCTYPE html><html><head><meta charset="utf-8">${title}${styles}</head><body>${node.outerHTML}</body></html>`;
127
142
  }
128
143
  }
129
144
 
130
- exports.PrintButton = PrintButton
145
+ exports.PrintButton = PrintButton;
@@ -7,31 +7,35 @@
7
7
  * уходит в `aria-valuetext`, чтобы «40%» не читалось дважды.
8
8
  *
9
9
  * Значение зажимается в `0…max`, `setMax()` не принимает неположительный максимум —
10
- * иначе полоса и её озвучка расходились бы.
10
+ * иначе полоса и её озвучка расходились бы. Смена значения идёт движением: заливка догоняет
11
+ * число за время токена `--motion_base`, а при уменьшенном движении значение ставится сразу.
11
12
  */
13
+ const { animate, reducedMotion } = require("../../modules/chui_animations/motion");
12
14
  class ProgressBar {
13
15
  #id = require("randomstring").generate();
14
16
  #ProgressBar = document.createElement(`progress`);
15
17
  #main = document.createElement("progress_block");
16
- #progress_count = document.createElement('progress_count');
17
- #progress_text = document.createElement('progress_text');
18
+ #progressCount = document.createElement("progress_count");
19
+ #progressText = document.createElement("progress_text");
18
20
  #label = undefined;
21
+ // Остановка догоняющих кадров: новое значение отменяет прежнее движение
22
+ #stop = undefined;
19
23
  constructor(options = { max: Number(), label: String() }) {
20
- require('../../modules/chui_functions').setStyles(__dirname + "/styles.css", 'chUiJS_ProgressBar');
24
+ require("../../modules/chui_functions").setStyles(__dirname + "/styles.css", "chUiJS_ProgressBar");
21
25
  // Роль дублирует нативную у <progress>, но делает разметку явной для тестов и стендов
22
26
  this.#ProgressBar.setAttribute("role", "progressbar");
23
27
  if (options.max !== undefined) this.setMax(options.max);
24
28
  this.#ProgressBar.id = this.#id;
25
- this.#progress_count.setAttribute('for', this.#id);
26
- this.#progress_text.setAttribute('for', this.#id);
29
+ this.#progressCount.setAttribute("for", this.#id);
30
+ this.#progressText.setAttribute("for", this.#id);
27
31
  // Подписи рядом с полосой — внешний вид: значение объявляет сама полоса
28
- this.#progress_count.setAttribute('aria-hidden', 'true');
29
- this.#progress_text.setAttribute('aria-hidden', 'true');
32
+ this.#progressCount.setAttribute("aria-hidden", "true");
33
+ this.#progressText.setAttribute("aria-hidden", "true");
30
34
  // Вид подписей полностью в CSS: прежде отступы, ширина и выравнивание
31
35
  // задавались отсюда инлайново и расходились с темой
32
- this.#main.appendChild(this.#progress_count)
33
- this.#main.appendChild(this.#ProgressBar)
34
- this.#main.appendChild(this.#progress_text)
36
+ this.#main.appendChild(this.#progressCount);
37
+ this.#main.appendChild(this.#ProgressBar);
38
+ this.#main.appendChild(this.#progressText);
35
39
  this.setLabel(options.label);
36
40
  }
37
41
  #clamp(value) {
@@ -40,10 +44,16 @@ class ProgressBar {
40
44
  if (Number.isNaN(number) || Number.isNaN(max) || max <= 0) return 0;
41
45
  return Math.min(Math.max(number, 0), max);
42
46
  }
43
- getValue() { return Number(this.#ProgressBar.value); }
44
- getMax() { return Number(this.#ProgressBar.max); }
47
+ getValue() {
48
+ return Number(this.#ProgressBar.value);
49
+ }
50
+ getMax() {
51
+ return Number(this.#ProgressBar.max);
52
+ }
45
53
  /** Имя полосы для скринридера */
46
- getLabel() { return this.#label; }
54
+ getLabel() {
55
+ return this.#label;
56
+ }
47
57
  setLabel(text = String()) {
48
58
  this.#label = text === undefined || text === "" ? undefined : text;
49
59
  if (this.#label === undefined) this.#ProgressBar.removeAttribute("aria-label");
@@ -62,21 +72,41 @@ class ProgressBar {
62
72
  return this;
63
73
  }
64
74
  setProgressCountText(text = String()) {
65
- this.#progress_count.innerText = text;
75
+ this.#progressCount.innerText = text;
66
76
  return this;
67
77
  }
68
78
  setValue(value = Number()) {
69
- this.#ProgressBar.value = this.#clamp(value);
79
+ this.#animateTo(this.#clamp(value));
70
80
  return this;
71
81
  }
82
+
83
+ /**
84
+ * Смена значения идёт движением: заливка догоняет число, а не перескакивает кадром.
85
+ * Ширину заливки у нативного `progress` задаёт браузер — переходом её не задать,
86
+ * поэтому целевое значение догоняют кадры, а их считает общий движок движения.
87
+ */
88
+ #animateTo(target = Number()) {
89
+ const from = Number(this.#ProgressBar.value);
90
+ this.#stop?.();
91
+ this.#stop = undefined;
92
+ if (from === target || reducedMotion()) {
93
+ this.#ProgressBar.value = target;
94
+ return;
95
+ }
96
+ this.#stop = animate((t) => {
97
+ this.#ProgressBar.value = from + (target - from) * t;
98
+ });
99
+ }
72
100
  setProgressText(text = String()) {
73
- this.#progress_text.innerText = text;
101
+ this.#progressText.innerText = text;
74
102
  // Тот же текст читает скринридер вместо числа: подпись помечена aria-hidden
75
103
  if (text === undefined || text === "") this.#ProgressBar.removeAttribute("aria-valuetext");
76
104
  else this.#ProgressBar.setAttribute("aria-valuetext", String(text));
77
105
  return this;
78
106
  }
79
- set() { return this.#main; }
107
+ set() {
108
+ return this.#main;
109
+ }
80
110
  }
81
111
 
82
- exports.ProgressBar = ProgressBar
112
+ exports.ProgressBar = ProgressBar;
@@ -1,24 +1,24 @@
1
1
  progress_block {
2
2
  /* Толщина дорожки одной переменной: полоса тоньше 29-пиксельного контрола и
3
3
  читается индикатором, а не плашкой (прежде было 15px — ростом с кнопку) */
4
- --progress_height: 8px;
4
+ --progress_bar_height: 8px;
5
5
  width: max-content;
6
6
  height: max-content;
7
- margin: var(--margin);
7
+ margin: var(--block_margin);
8
8
  font-size: var(--font_labels_size);
9
9
  color: var(--text_color_disabled);
10
10
  /* Подписи стоят по левому краю полосы: центрирование расходилось с полосой */
11
11
  text-align: start;
12
- font-weight: 500
12
+ font-weight: 500;
13
13
  }
14
14
 
15
15
  progress {
16
16
  display: block;
17
17
  border-radius: var(--radius_pill);
18
18
  text-align: start;
19
- margin: var(--margin) 0;
19
+ margin: var(--block_margin) 0;
20
20
  width: -webkit-fill-available;
21
- height: var(--progress_height);
21
+ height: var(--progress_bar_height);
22
22
  border: none;
23
23
  }
24
24
 
@@ -53,4 +53,4 @@ progress_count + progress {
53
53
 
54
54
  progress + progress_text {
55
55
  margin-block-start: 4px;
56
- }
56
+ }
@@ -1,5 +1,5 @@
1
- const {setStyles, optionOr} = require('../../modules/chui_functions');
2
- const {I18n} = require('../../modules/chui_i18n/chui_i18n');
1
+ const { setStyles, optionOr } = require("../../modules/chui_functions");
2
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
3
3
 
4
4
  /**
5
5
  * Круговой индикатор прогресса: кольцо с процентом внутри.
@@ -32,30 +32,32 @@ class ProgressRing {
32
32
  #root = document.createElement("chui_progress_ring");
33
33
  #svg = undefined;
34
34
  #track = undefined;
35
- #value_arc = undefined;
35
+ #valueArc = undefined;
36
36
  #text = document.createElement("progress_ring_text");
37
37
  #id = undefined;
38
38
  #value = 0;
39
39
  #max = 100;
40
40
  #size = ProgressRing.DEFAULT_SIZE;
41
41
  #thickness = ProgressRing.DEFAULT_THICKNESS;
42
- #show_value = true;
42
+ #showValue = true;
43
43
  #indeterminate = false;
44
44
  #label = undefined;
45
45
  #format = undefined;
46
46
 
47
- constructor(options = {
48
- id: String(),
49
- value: Number(),
50
- max: Number(),
51
- size: Number(),
52
- thickness: Number(),
53
- showValue: Boolean(),
54
- indeterminate: Boolean(),
55
- label: String(),
56
- color: String(),
57
- format: undefined
58
- }) {
47
+ constructor(
48
+ options = {
49
+ id: String(),
50
+ value: Number(),
51
+ max: Number(),
52
+ size: Number(),
53
+ thickness: Number(),
54
+ showValue: Boolean(),
55
+ indeterminate: Boolean(),
56
+ label: String(),
57
+ color: String(),
58
+ format: undefined,
59
+ }
60
+ ) {
59
61
  setStyles(__dirname + "/styles.css", "chUiJS_ProgressRing");
60
62
  ProgressRing.#counter += 1;
61
63
  this.#id = options.id === undefined ? `chui_progress_ring_${ProgressRing.#counter}` : options.id;
@@ -64,7 +66,7 @@ class ProgressRing {
64
66
  if (options.max !== undefined) this.#max = options.max;
65
67
  if (options.size !== undefined) this.#size = options.size;
66
68
  if (options.thickness !== undefined) this.#thickness = options.thickness;
67
- this.#show_value = options.showValue !== false;
69
+ this.#showValue = options.showValue !== false;
68
70
  this.#format = options.format;
69
71
  this.#build();
70
72
  if (options.color !== undefined) this.setColor(options.color);
@@ -109,7 +111,7 @@ class ProgressRing {
109
111
  }
110
112
 
111
113
  isValueVisible() {
112
- return this.#show_value;
114
+ return this.#showValue;
113
115
  }
114
116
 
115
117
  // SET
@@ -147,7 +149,7 @@ class ProgressRing {
147
149
 
148
150
  /** Показывать ли процент внутри кольца */
149
151
  setShowValue(visible = Boolean()) {
150
- this.#show_value = visible === true;
152
+ this.#showValue = visible === true;
151
153
  this.#render();
152
154
  return this;
153
155
  }
@@ -200,13 +202,13 @@ class ProgressRing {
200
202
  this.#track.setAttribute("cx", "50");
201
203
  this.#track.setAttribute("cy", "50");
202
204
  this.#track.setAttribute("r", "45");
203
- this.#value_arc = document.createElementNS(namespace, "circle");
204
- this.#value_arc.setAttribute("class", "progress_ring_value");
205
- this.#value_arc.setAttribute("cx", "50");
206
- this.#value_arc.setAttribute("cy", "50");
207
- this.#value_arc.setAttribute("r", "45");
205
+ this.#valueArc = document.createElementNS(namespace, "circle");
206
+ this.#valueArc.setAttribute("class", "progress_ring_value");
207
+ this.#valueArc.setAttribute("cx", "50");
208
+ this.#valueArc.setAttribute("cy", "50");
209
+ this.#valueArc.setAttribute("r", "45");
208
210
  this.#svg.appendChild(this.#track);
209
- this.#svg.appendChild(this.#value_arc);
211
+ this.#svg.appendChild(this.#valueArc);
210
212
  this.#text.setAttribute("aria-hidden", "true");
211
213
  this.#root.appendChild(this.#svg);
212
214
  this.#root.appendChild(this.#text);
@@ -228,13 +230,13 @@ class ProgressRing {
228
230
  const radius = 50 - thickness / 2;
229
231
  this.#svg.style.setProperty("--progress_ring_thickness", String(thickness));
230
232
  this.#track.setAttribute("r", String(radius));
231
- this.#value_arc.setAttribute("r", String(radius));
233
+ this.#valueArc.setAttribute("r", String(radius));
232
234
  // Длина окружности: dasharray — периметр, dashoffset — доля от него.
233
235
  // У неопределённого прогресса дуга фиксированной длины, а крутит её CSS-анимация
234
236
  const circuit = 2 * Math.PI * radius;
235
- this.#value_arc.style.strokeDasharray = this.#indeterminate ? "60 230" : String(circuit);
236
- this.#value_arc.style.strokeDashoffset = this.#indeterminate ? "0" : String(circuit * (1 - this.getRatio()));
237
- this.#text.hidden = !this.#show_value;
237
+ this.#valueArc.style.strokeDasharray = this.#indeterminate ? "60 230" : String(circuit);
238
+ this.#valueArc.style.strokeDashoffset = this.#indeterminate ? "0" : String(circuit * (1 - this.getRatio()));
239
+ this.#text.hidden = !this.#showValue;
238
240
  this.#text.innerText = this.#indeterminate ? "" : this.#valueText();
239
241
  this.#root.setAttribute("aria-valuemin", String(0));
240
242
  this.#root.setAttribute("aria-valuemax", String(this.#max));
@@ -244,4 +246,4 @@ class ProgressRing {
244
246
  }
245
247
  }
246
248
 
247
- exports.ProgressRing = ProgressRing
249
+ exports.ProgressRing = ProgressRing;
@@ -34,7 +34,7 @@ chui_progress_ring {
34
34
  .progress_ring_value {
35
35
  stroke: var(--progress_ring_color);
36
36
  stroke-linecap: round;
37
- transition: stroke-dashoffset 0.25s ease;
37
+ transition: stroke-dashoffset var(--motion_base) var(--motion_ease);
38
38
  }
39
39
 
40
40
  chui_progress_ring.progress_ring_indeterminate .progress_ring_value {
@@ -1,6 +1,6 @@
1
- const { setStyles, optionOr } = require('../../modules/chui_functions');
2
- const { QR } = require('../../modules/chui_qr/chui_qr');
3
- const { I18n } = require('../../modules/chui_i18n/chui_i18n');
1
+ const { setStyles, optionOr } = require("../../modules/chui_functions");
2
+ const { QR } = require("../../modules/chui_qr/chui_qr");
3
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
4
4
 
5
5
  /** Длинное значение не перечисляется в имени кода — там остаётся только его длина */
6
6
  const LONG_VALUE = 64;
@@ -64,20 +64,31 @@ class QRCode {
64
64
  #margin = QRCode.DEFAULT_MARGIN;
65
65
  #level = QR.LEVEL.MEDIUM;
66
66
  #mode = QR.MODE.AUTO;
67
- #min_version = undefined;
67
+ #minVersion = undefined;
68
68
  #mask = undefined;
69
69
  #dark = QRCode.DEFAULT_DARK;
70
70
  #light = QRCode.DEFAULT_LIGHT;
71
71
  #label = undefined;
72
- #empty_text = undefined;
72
+ #emptyText = undefined;
73
73
  #code = undefined;
74
- #error_text = undefined;
74
+ #errorMessage = undefined;
75
75
 
76
- constructor(options = {
77
- id: String(), value: String(), size: Number(), margin: Number(), level: String(),
78
- mode: String(), minVersion: Number(), mask: Number(), dark: String(), light: String(),
79
- label: String(), emptyText: String()
80
- }) {
76
+ constructor(
77
+ options = {
78
+ id: String(),
79
+ value: String(),
80
+ size: Number(),
81
+ margin: Number(),
82
+ level: String(),
83
+ mode: String(),
84
+ minVersion: Number(),
85
+ mask: Number(),
86
+ dark: String(),
87
+ light: String(),
88
+ label: String(),
89
+ emptyText: String(),
90
+ }
91
+ ) {
81
92
  setStyles(__dirname + "/styles.css", "ChUiJS_QRCode");
82
93
  QRCode.#counter += 1;
83
94
  this.#id = options.id === undefined ? `chui_qrcode_${QRCode.#counter}` : options.id;
@@ -87,7 +98,7 @@ class QRCode {
87
98
  this.#hint.setAttribute("role", "status");
88
99
  this.#hint.setAttribute("aria-live", "polite");
89
100
  this.#label = options.label;
90
- this.#empty_text = options.emptyText;
101
+ this.#emptyText = options.emptyText;
91
102
  this.#root.appendChild(this.#canvas);
92
103
  this.#root.appendChild(this.#hint);
93
104
  // Пустая заготовка опции равносильна отсутствующей: `String()` в описании опций
@@ -97,45 +108,74 @@ class QRCode {
97
108
  if (optionOr(options.level, undefined) !== undefined) this.#level = QRCode.#toLevel(options.level);
98
109
  if (optionOr(options.mode, undefined) !== undefined) this.#mode = QRCode.#toMode(options.mode);
99
110
  if (Number.isInteger(Number(options.minVersion)) && Number(options.minVersion) > 0) {
100
- this.#min_version = QRCode.#toVersion(options.minVersion);
111
+ this.#minVersion = QRCode.#toVersion(options.minVersion);
101
112
  }
102
- if (Number.isInteger(Number(options.mask)) && Number(options.mask) >= 0) this.#mask = QRCode.#toMask(options.mask);
113
+ if (Number.isInteger(Number(options.mask)) && Number(options.mask) >= 0)
114
+ this.#mask = QRCode.#toMask(options.mask);
103
115
  if (optionOr(options.dark, undefined) !== undefined) this.#dark = String(options.dark);
104
116
  if (optionOr(options.light, undefined) !== undefined) this.#light = String(options.light);
105
117
  this.setValue(options.value);
106
118
  }
107
119
 
108
120
  // GET
109
- getId() { return this.#id; }
110
- getValue() { return this.#value; }
121
+ getId() {
122
+ return this.#id;
123
+ }
124
+ getValue() {
125
+ return this.#value;
126
+ }
111
127
  /** Заданная сторона канвы в CSS-пикселях (итоговая может быть меньше на доли модуля) */
112
- getSize() { return this.#size; }
128
+ getSize() {
129
+ return this.#size;
130
+ }
113
131
  /** Тихая зона вокруг кода в модулях */
114
- getMargin() { return this.#margin; }
115
- getLevel() { return this.#level; }
132
+ getMargin() {
133
+ return this.#margin;
134
+ }
135
+ getLevel() {
136
+ return this.#level;
137
+ }
116
138
  /** Режим готового кода: при `AUTO` — тот, что подобрался под строку */
117
- getMode() { return this.#code === undefined ? this.#mode : this.#code.mode; }
118
- getMinVersion() { return this.#min_version; }
139
+ getMode() {
140
+ return this.#code === undefined ? this.#mode : this.#code.mode;
141
+ }
142
+ getMinVersion() {
143
+ return this.#minVersion;
144
+ }
119
145
  /** Маска готового кода (0…7); без кода — заданная опция или `undefined` при автоподборе */
120
- getMask() { return this.#code === undefined ? this.#mask : this.#code.mask; }
146
+ getMask() {
147
+ return this.#code === undefined ? this.#mask : this.#code.mask;
148
+ }
121
149
  /** Цвета кода: тёмные модули и поле */
122
- getColors() { return {dark: this.#dark, light: this.#light}; }
123
- getCanvas() { return this.#canvas; }
150
+ getColors() {
151
+ return { dark: this.#dark, light: this.#light };
152
+ }
153
+ getCanvas() {
154
+ return this.#canvas;
155
+ }
124
156
  /** Описание готового кода: `{version, size, mask, level, mode, length}` или `undefined` */
125
157
  getCode() {
126
158
  if (this.#code === undefined) return undefined;
127
159
  return {
128
- version: this.#code.version, size: this.#code.size, mask: this.#code.mask,
129
- level: this.#code.level, mode: this.#code.mode, length: this.#code.length
160
+ version: this.#code.version,
161
+ size: this.#code.size,
162
+ mask: this.#code.mask,
163
+ level: this.#code.level,
164
+ mode: this.#code.mode,
165
+ length: this.#code.length,
130
166
  };
131
167
  }
132
- getVersion() { return this.#code === undefined ? undefined : this.#code.version; }
168
+ getVersion() {
169
+ return this.#code === undefined ? undefined : this.#code.version;
170
+ }
133
171
  /** Модули готового кода: `matrix[y][x] === true` — тёмный модуль */
134
172
  getMatrix() {
135
173
  return this.#code === undefined ? undefined : this.#code.matrix.map((row) => row.slice());
136
174
  }
137
175
  /** Текст незаданного состояния или ошибки; `undefined`, если код построен */
138
- getError() { return this.#error_text; }
176
+ getError() {
177
+ return this.#errorMessage;
178
+ }
139
179
 
140
180
  // SET
141
181
  setId(id = String()) {
@@ -175,7 +215,7 @@ class QRCode {
175
215
  }
176
216
  /** Наименьшая версия кода; `undefined` — подбирать самому */
177
217
  setMinVersion(version = undefined) {
178
- this.#min_version = version === undefined || version === "" ? undefined : QRCode.#toVersion(version);
218
+ this.#minVersion = version === undefined || version === "" ? undefined : QRCode.#toVersion(version);
179
219
  this.#render();
180
220
  return this;
181
221
  }
@@ -200,7 +240,7 @@ class QRCode {
200
240
  }
201
241
  /** Текст подсказки при пустом значении */
202
242
  setEmptyText(text = String()) {
203
- this.#empty_text = text;
243
+ this.#emptyText = text;
204
244
  this.#render();
205
245
  return this;
206
246
  }
@@ -213,7 +253,9 @@ class QRCode {
213
253
  toDataURL(type = "image/png", quality = undefined) {
214
254
  return this.#canvas.toDataURL(type, quality);
215
255
  }
216
- set() { return this.#root; }
256
+ set() {
257
+ return this.#root;
258
+ }
217
259
 
218
260
  // === ОТРИСОВКА ===
219
261
  #render() {
@@ -221,12 +263,12 @@ class QRCode {
221
263
  if (String(value).trim() === "") {
222
264
  this.#code = undefined;
223
265
  this.#clear();
224
- this.#setHint(this.#empty_text === undefined ? I18n.t("graphics.qrEmpty") : this.#empty_text);
266
+ this.#setHint(this.#emptyText === undefined ? I18n.t("graphics.qrEmpty") : this.#emptyText);
225
267
  this.#setLabel(I18n.t("graphics.qrLabel"));
226
268
  return this;
227
269
  }
228
- const options = {level: this.#level, mode: this.#mode};
229
- if (this.#min_version !== undefined) options.minVersion = this.#min_version;
270
+ const options = { level: this.#level, mode: this.#mode };
271
+ if (this.#minVersion !== undefined) options.minVersion = this.#minVersion;
230
272
  if (this.#mask !== undefined) options.mask = this.#mask;
231
273
  const result = QR.encode(value, options);
232
274
  if (result.ok !== true) {
@@ -292,7 +334,7 @@ class QRCode {
292
334
  }
293
335
 
294
336
  #setHint(text) {
295
- this.#error_text = text === "" ? undefined : text;
337
+ this.#errorMessage = text === "" ? undefined : text;
296
338
  this.#hint.innerText = text;
297
339
  return this;
298
340
  }
@@ -306,8 +348,8 @@ class QRCode {
306
348
  /** Имя кода: короткое значение перечисляется, длинное — только по длине */
307
349
  static #valueLabel(value = String()) {
308
350
  return value.length <= LONG_VALUE
309
- ? I18n.t("graphics.qrValue", {value: value})
310
- : I18n.t("graphics.qrLongValue", {length: value.length});
351
+ ? I18n.t("graphics.qrValue", { value: value })
352
+ : I18n.t("graphics.qrLongValue", { length: value.length });
311
353
  }
312
354
 
313
355
  /** Ошибка генератора словами словаря: пустое значение сюда не доходит */
@@ -315,11 +357,12 @@ class QRCode {
315
357
  if (error.code === "tooLong") {
316
358
  const bytes = error.mode === QR.MODE.BYTE;
317
359
  return I18n.t(bytes ? "graphics.qrTooLongBytes" : "graphics.qrTooLongChars", {
318
- needed: error.needed, capacity: error.capacity
360
+ needed: error.needed,
361
+ capacity: error.capacity,
319
362
  });
320
363
  }
321
364
  if (error.code === "mode") {
322
- return I18n.t("graphics.qrModeMismatch", {mode: I18n.t(`graphics.qrMode.${error.mode}`)});
365
+ return I18n.t("graphics.qrModeMismatch", { mode: I18n.t(`graphics.qrMode.${error.mode}`) });
323
366
  }
324
367
  return I18n.t("graphics.qrEmpty");
325
368
  }
@@ -357,9 +400,10 @@ class QRCode {
357
400
 
358
401
  static #toVersion(version = Number()) {
359
402
  const value = Number(version);
360
- if (!Number.isInteger(value) || value < 1 || value > 40) throw new RangeError("QRCode: версия вне диапазона 1…40");
403
+ if (!Number.isInteger(value) || value < 1 || value > 40)
404
+ throw new RangeError("QRCode: версия вне диапазона 1…40");
361
405
  return value;
362
406
  }
363
407
  }
364
408
 
365
- exports.QRCode = QRCode
409
+ exports.QRCode = QRCode;