chuijs 4.0.1 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/README.md +43 -632
  3. package/framework/appLayout/default/chui_app_layout.js +314 -273
  4. package/framework/appLayout/default/global_style.css +93 -53
  5. package/framework/components/chui_accordion/accordion.js +29 -26
  6. package/framework/components/chui_accordion/styles.css +6 -5
  7. package/framework/components/chui_action_sheet/action_sheet.js +59 -33
  8. package/framework/components/chui_action_sheet/styles.css +2 -1
  9. package/framework/components/chui_affix/affix.js +11 -6
  10. package/framework/components/chui_alert/alert.js +23 -14
  11. package/framework/components/chui_avatar/avatar.js +23 -22
  12. package/framework/components/chui_avatar_group/avatar_group.js +21 -19
  13. package/framework/components/chui_backtop/backtop.js +35 -19
  14. package/framework/components/chui_badge/badge.js +15 -13
  15. package/framework/components/chui_breadcrumb/breadcrumb.js +15 -13
  16. package/framework/components/chui_button/button.js +42 -22
  17. package/framework/components/chui_button/styles.css +2 -2
  18. package/framework/components/chui_calendar/calendar.js +12 -10
  19. package/framework/components/chui_card/card.js +43 -23
  20. package/framework/components/chui_chat/chat.js +72 -33
  21. package/framework/components/chui_clipboard_history/clipboard_history.js +30 -21
  22. package/framework/components/chui_clipboard_history/styles.css +4 -2
  23. package/framework/components/chui_code/code.js +2 -2
  24. package/framework/components/chui_code/styles.css +2 -2
  25. package/framework/components/chui_code_editor/code_editor.js +47 -31
  26. package/framework/components/chui_code_editor/styles.css +3 -2
  27. package/framework/components/chui_command_palette/command_palette.js +60 -37
  28. package/framework/components/chui_console/console.js +5 -5
  29. package/framework/components/chui_console/styles.css +1 -1
  30. package/framework/components/chui_content_block/content_block.js +33 -19
  31. package/framework/components/chui_content_block/styles.css +2 -2
  32. package/framework/components/chui_context_menu/context_menu.js +9 -4
  33. package/framework/components/chui_custom_element/custom_element.js +22 -15
  34. package/framework/components/chui_data_grid/data_grid.js +396 -234
  35. package/framework/components/chui_data_grid/styles.css +10 -8
  36. package/framework/components/chui_descriptions/descriptions.js +34 -17
  37. package/framework/components/chui_details/details.js +32 -26
  38. package/framework/components/chui_details/styles.css +5 -4
  39. package/framework/components/chui_diff_viewer/diff_viewer.js +91 -66
  40. package/framework/components/chui_diff_viewer/styles.css +1 -1
  41. package/framework/components/chui_divider/divider.js +13 -11
  42. package/framework/components/chui_drawer/drawer.js +27 -25
  43. package/framework/components/chui_drop_zone/drop_zone.js +31 -21
  44. package/framework/components/chui_empty_state/empty_state.js +20 -15
  45. package/framework/components/chui_fieldset/fieldset.js +37 -20
  46. package/framework/components/chui_fieldset/styles.css +1 -1
  47. package/framework/components/chui_file_explorer/file_explorer.js +157 -86
  48. package/framework/components/chui_file_explorer/styles.css +2 -1
  49. package/framework/components/chui_form/form.js +31 -19
  50. package/framework/components/chui_form/styles.css +1 -1
  51. package/framework/components/chui_gantt/gantt.js +64 -40
  52. package/framework/components/chui_graphs/graphs.js +301 -200
  53. package/framework/components/chui_graphs/styles.css +1 -1
  54. package/framework/components/chui_hero/hero.js +40 -22
  55. package/framework/components/chui_html_block/html_block.js +6 -6
  56. package/framework/components/chui_html_block/styles.css +2 -2
  57. package/framework/components/chui_hx/hx.js +3 -3
  58. package/framework/components/chui_hx/styles.css +11 -4
  59. package/framework/components/chui_icons/icons.js +2109 -2109
  60. package/framework/components/chui_icons/styles.css +2 -2
  61. package/framework/components/chui_inputs/chui_check_box/check_box.js +31 -19
  62. package/framework/components/chui_inputs/chui_check_box/styles.css +18 -18
  63. package/framework/components/chui_inputs/chui_chips/chips.js +50 -40
  64. package/framework/components/chui_inputs/chui_chips/styles.css +4 -2
  65. package/framework/components/chui_inputs/chui_color_picker/color_picker.js +36 -24
  66. package/framework/components/chui_inputs/chui_combo_box/combo_box.js +100 -82
  67. package/framework/components/chui_inputs/chui_combo_box/styles.css +14 -12
  68. package/framework/components/chui_inputs/chui_date/date.js +102 -66
  69. package/framework/components/chui_inputs/chui_date/styles.css +12 -11
  70. package/framework/components/chui_inputs/chui_date_range/date_range.js +40 -29
  71. package/framework/components/chui_inputs/chui_datetime/datetime.js +35 -27
  72. package/framework/components/chui_inputs/chui_email/email.js +43 -31
  73. package/framework/components/chui_inputs/chui_email/styles.css +5 -5
  74. package/framework/components/chui_inputs/chui_file/file.js +68 -41
  75. package/framework/components/chui_inputs/chui_file/styles.css +13 -12
  76. package/framework/components/chui_inputs/chui_hotkey/hotkey.js +61 -36
  77. package/framework/components/chui_inputs/chui_masked/masked.js +39 -28
  78. package/framework/components/chui_inputs/chui_mention/mention.js +77 -30
  79. package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +173 -153
  80. package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +9 -7
  81. package/framework/components/chui_inputs/chui_number/number.js +58 -41
  82. package/framework/components/chui_inputs/chui_number/styles.css +7 -7
  83. package/framework/components/chui_inputs/chui_otp/otp.js +38 -29
  84. package/framework/components/chui_inputs/chui_password/password.js +58 -36
  85. package/framework/components/chui_inputs/chui_password/styles.css +8 -8
  86. package/framework/components/chui_inputs/chui_radio_button/radio_button.js +37 -25
  87. package/framework/components/chui_inputs/chui_radio_button/styles.css +20 -20
  88. package/framework/components/chui_inputs/chui_rating/rating.js +26 -22
  89. package/framework/components/chui_inputs/chui_select_box/select_box.js +102 -78
  90. package/framework/components/chui_inputs/chui_select_box/styles.css +11 -11
  91. package/framework/components/chui_inputs/chui_slider/slider.js +29 -26
  92. package/framework/components/chui_inputs/chui_slider/styles.css +2 -1
  93. package/framework/components/chui_inputs/chui_text/styles.css +8 -8
  94. package/framework/components/chui_inputs/chui_text/text.js +65 -44
  95. package/framework/components/chui_inputs/chui_text_area/styles.css +6 -6
  96. package/framework/components/chui_inputs/chui_text_area/text_area.js +51 -28
  97. package/framework/components/chui_inputs/chui_time/styles.css +5 -3
  98. package/framework/components/chui_inputs/chui_time/time.js +38 -27
  99. package/framework/components/chui_inputs/chui_toggle/styles.css +3 -3
  100. package/framework/components/chui_inputs/chui_toggle/toggle.js +16 -16
  101. package/framework/components/chui_json_editor/json_editor.js +53 -43
  102. package/framework/components/chui_json_viewer/json_viewer.js +52 -33
  103. package/framework/components/chui_json_viewer/styles.css +3 -2
  104. package/framework/components/chui_kanban/kanban.js +52 -34
  105. package/framework/components/chui_kbd/kbd.js +12 -10
  106. package/framework/components/chui_label/label.js +14 -12
  107. package/framework/components/chui_label/styles.css +2 -2
  108. package/framework/components/chui_link/link.js +27 -20
  109. package/framework/components/chui_list/list.js +31 -27
  110. package/framework/components/chui_list/styles.css +2 -1
  111. package/framework/components/chui_markdown_editor/markdown_editor.js +60 -44
  112. package/framework/components/chui_media/audio.js +326 -227
  113. package/framework/components/chui_media/audio_styles.css +40 -21
  114. package/framework/components/chui_media/image.js +70 -38
  115. package/framework/components/chui_media/image_compare.js +52 -21
  116. package/framework/components/chui_media/image_styles.css +3 -3
  117. package/framework/components/chui_media/video.js +155 -62
  118. package/framework/components/chui_media/video_styles.css +33 -16
  119. package/framework/components/chui_menu_bar/menu_bar.js +26 -24
  120. package/framework/components/chui_menu_bar/styles.css +4 -2
  121. package/framework/components/chui_modal/modal.js +44 -43
  122. package/framework/components/chui_modal/styles.css +3 -2
  123. package/framework/components/chui_notification/notification.js +50 -34
  124. package/framework/components/chui_notification/notification_download.js +31 -25
  125. package/framework/components/chui_notification/notification_download_progress.css +3 -2
  126. package/framework/components/chui_notification/notification_download_progress.js +47 -41
  127. package/framework/components/chui_notification/notification_update.js +23 -16
  128. package/framework/components/chui_notification/status_plate.js +2 -2
  129. package/framework/components/chui_notification/styles_download.css +1 -1
  130. package/framework/components/chui_notification/styles_update.css +1 -1
  131. package/framework/components/chui_org_chart/org_chart.js +74 -35
  132. package/framework/components/chui_pagination/pagination.js +62 -27
  133. package/framework/components/chui_paragraph/paragraph.js +2 -2
  134. package/framework/components/chui_paragraph/styles.css +1 -1
  135. package/framework/components/chui_popover/popover.js +49 -28
  136. package/framework/components/chui_popups/popups.js +137 -108
  137. package/framework/components/chui_popups/styles.css +2 -2
  138. package/framework/components/chui_print_button/print_button.js +33 -23
  139. package/framework/components/chui_progress_bar/progress_bar.js +23 -15
  140. package/framework/components/chui_progress_bar/styles.css +2 -2
  141. package/framework/components/chui_progress_ring/progress_ring.js +17 -15
  142. package/framework/components/chui_qrcode/qrcode.js +75 -31
  143. package/framework/components/chui_query_builder/query_builder.js +216 -123
  144. package/framework/components/chui_radio_group/radio_group.js +36 -26
  145. package/framework/components/chui_radio_group/styles.css +1 -1
  146. package/framework/components/chui_result/result.js +26 -16
  147. package/framework/components/chui_scheduler/scheduler.js +57 -35
  148. package/framework/components/chui_scheduler/styles.css +6 -2
  149. package/framework/components/chui_segmented_control/segmented_control.js +27 -21
  150. package/framework/components/chui_settings/settings.js +122 -48
  151. package/framework/components/chui_shortcut_help/shortcut_help.js +55 -32
  152. package/framework/components/chui_sidebar_nav/sidebar_nav.js +33 -23
  153. package/framework/components/chui_skeleton/skeleton.js +29 -24
  154. package/framework/components/chui_slideshow/slideshow.js +60 -41
  155. package/framework/components/chui_slideshow/styles.css +18 -12
  156. package/framework/components/chui_spinner/spinner.js +8 -8
  157. package/framework/components/chui_spinner/styles.css +0 -1
  158. package/framework/components/chui_split_button/split_button.js +23 -18
  159. package/framework/components/chui_split_button/styles.css +1 -1
  160. package/framework/components/chui_splitter/splitter.js +35 -28
  161. package/framework/components/chui_statistic/statistic.js +65 -38
  162. package/framework/components/chui_status_bar/status_bar.js +11 -9
  163. package/framework/components/chui_stepper/stepper.js +27 -22
  164. package/framework/components/chui_sticky_bar/sticky_bar.js +9 -4
  165. package/framework/components/chui_sticky_bar/styles.css +3 -1
  166. package/framework/components/chui_tabs/chui_tabs.js +28 -22
  167. package/framework/components/chui_tabs/styles.css +3 -3
  168. package/framework/components/chui_text_editor/styles.css +20 -19
  169. package/framework/components/chui_text_editor/text_editor.js +85 -61
  170. package/framework/components/chui_text_editor/text_editor_panel.js +346 -284
  171. package/framework/components/chui_theme_toggle/theme_toggle.js +27 -22
  172. package/framework/components/chui_timeline/timeline.js +14 -12
  173. package/framework/components/chui_toast_queue/toast_queue.js +52 -46
  174. package/framework/components/chui_toolbar/toolbar.js +20 -13
  175. package/framework/components/chui_tooltip/tooltip.js +37 -24
  176. package/framework/components/chui_tour/styles.css +8 -3
  177. package/framework/components/chui_tour/tour.js +61 -27
  178. package/framework/components/chui_transfer/styles.css +2 -1
  179. package/framework/components/chui_transfer/transfer.js +75 -42
  180. package/framework/components/chui_tree_table/tree_table.js +43 -29
  181. package/framework/components/chui_tree_view/styles.css +4 -2
  182. package/framework/components/chui_tree_view/tree_view.js +142 -99
  183. package/framework/components/chui_watermark/watermark.js +24 -16
  184. package/framework/components/chui_webview/styles.css +2 -2
  185. package/framework/components/chui_webview/webview.js +62 -50
  186. package/framework/components/telegram_bot/chui_telegram_bot.js +71 -64
  187. package/framework/modules/chui_a11y/chui_a11y.js +77 -46
  188. package/framework/modules/chui_animations/animations.js +42 -42
  189. package/framework/modules/chui_animations/styles.css +1 -1
  190. package/framework/modules/chui_bridge/preload.js +56 -26
  191. package/framework/modules/chui_functions.js +52 -50
  192. package/framework/modules/chui_highlight/chui_highlight.js +25 -22
  193. package/framework/modules/chui_i18n/chui_i18n.js +9 -7
  194. package/framework/modules/chui_i18n/locales/a11y.js +5 -5
  195. package/framework/modules/chui_i18n/locales/app_layout.js +5 -5
  196. package/framework/modules/chui_i18n/locales/calendar.js +3 -3
  197. package/framework/modules/chui_i18n/locales/common.js +3 -3
  198. package/framework/modules/chui_i18n/locales/data.js +36 -26
  199. package/framework/modules/chui_i18n/locales/editors.js +40 -13
  200. package/framework/modules/chui_i18n/locales/feedback.js +3 -3
  201. package/framework/modules/chui_i18n/locales/forms.js +8 -8
  202. package/framework/modules/chui_i18n/locales/graphics.js +8 -8
  203. package/framework/modules/chui_i18n/locales/media.js +4 -4
  204. package/framework/modules/chui_i18n/locales/navigation.js +8 -8
  205. package/framework/modules/chui_i18n/locales/validate.js +3 -3
  206. package/framework/modules/chui_json/chui_json.js +9 -9
  207. package/framework/modules/chui_layout/chui_layout.js +12 -10
  208. package/framework/modules/chui_logger/chui_logger.js +29 -25
  209. package/framework/modules/chui_page/page.js +33 -27
  210. package/framework/modules/chui_page/styles.css +3 -26
  211. package/framework/modules/chui_qr/chui_qr.js +158 -67
  212. package/framework/modules/chui_scrollbar/chui_scrollbar.js +35 -24
  213. package/framework/modules/chui_scrollbar/styles.css +3 -1
  214. package/framework/modules/chui_services/chui_channels.js +76 -11
  215. package/framework/modules/chui_services/chui_services.js +39 -31
  216. package/framework/modules/chui_services/desktop.js +149 -30
  217. package/framework/modules/chui_sortable/chui_sortable.js +17 -12
  218. package/framework/modules/chui_validate/chui_validate.js +7 -4
  219. package/framework/tray_bar/chui_menu_items.js +136 -46
  220. package/index.d.ts +4814 -0
  221. package/index.js +449 -334
  222. package/package.json +79 -68
@@ -125,7 +125,8 @@ chui_ap_info chui_label {
125
125
  font-variant-numeric: tabular-nums;
126
126
  flex: none;
127
127
  }
128
- #chui_ap_seek, #chui_ap_volume {
128
+ #chui_ap_seek,
129
+ #chui_ap_volume {
129
130
  margin: 0;
130
131
  -webkit-appearance: none;
131
132
  border-radius: var(--radius_pill);
@@ -145,23 +146,29 @@ chui_ap_info chui_label {
145
146
  }
146
147
 
147
148
  #chui_ap_seek {
148
- background-image: linear-gradient(to right,
149
+ background-image: linear-gradient(
150
+ to right,
149
151
  var(--blue_prime_background) 0 var(--seek-before-width, 0%),
150
- var(--ap_slider_background) var(--seek-before-width, 0%) 100%);
152
+ var(--ap_slider_background) var(--seek-before-width, 0%) 100%
153
+ );
151
154
  }
152
155
 
153
156
  /* Громкость — ступень звука, а не время: заливка нейтральная, чтобы не читалась второй
154
157
  полосой прогресса */
155
158
  #chui_ap_volume {
156
- background-image: linear-gradient(to right,
159
+ background-image: linear-gradient(
160
+ to right,
157
161
  var(--text_color) 0 var(--volume-before-width, 0%),
158
- var(--ap_slider_background) var(--volume-before-width, 0%) 100%);
162
+ var(--ap_slider_background) var(--volume-before-width, 0%) 100%
163
+ );
159
164
  }
160
165
 
161
166
  #chui_ap_volume:disabled {
162
- background-image: linear-gradient(to right,
167
+ background-image: linear-gradient(
168
+ to right,
163
169
  var(--ap_slider_buf_background) 0 var(--volume-before-width, 0%),
164
- var(--ap_slider_background) var(--volume-before-width, 0%) 100%);
170
+ var(--ap_slider_background) var(--volume-before-width, 0%) 100%
171
+ );
165
172
  }
166
173
 
167
174
  #chui_ap_seek::-webkit-slider-runnable-track,
@@ -176,7 +183,8 @@ chui_ap_info chui_label {
176
183
  курсором, и в покое полоса прогресса на нуле читалась пустой серой чертой,
177
184
  а громкость в 100 % — сплошной белой линией: два разных элемента, а не
178
185
  одинаковые ползунки. Ободок цвета подложки нужен там, где заливка белая. */
179
- #chui_ap_seek::-webkit-slider-thumb, #chui_ap_volume::-webkit-slider-thumb {
186
+ #chui_ap_seek::-webkit-slider-thumb,
187
+ #chui_ap_volume::-webkit-slider-thumb {
180
188
  -webkit-appearance: none;
181
189
  border: none;
182
190
  height: 9px;
@@ -206,10 +214,13 @@ chui_ap_main:hover #chui_ap_volume:not(:disabled)::-webkit-slider-thumb,
206
214
  width: 12px;
207
215
  margin-top: calc((var(--player_track_height) - 12px) / 2);
208
216
  background-color: var(--player_thumb_background);
209
- box-shadow: 0 0 0 2px var(--ap_main_background), var(--box_shadow_main);
217
+ box-shadow:
218
+ 0 0 0 2px var(--ap_main_background),
219
+ var(--box_shadow_main);
210
220
  }
211
221
 
212
- #chui_ap_seek:focus, #chui_ap_volume:focus,
222
+ #chui_ap_seek:focus,
223
+ #chui_ap_volume:focus,
213
224
  #chui_ap_seek:focus::-webkit-slider-runnable-track,
214
225
  #chui_ap_volume:focus::-webkit-slider-runnable-track {
215
226
  outline: none;
@@ -217,7 +228,8 @@ chui_ap_main:hover #chui_ap_volume:not(:disabled)::-webkit-slider-thumb,
217
228
  }
218
229
 
219
230
  /* Клавиатурный фокус возвращаем точечно: правило выше снимает UA-обводку */
220
- #chui_ap_seek:focus-visible, #chui_ap_volume:focus-visible {
231
+ #chui_ap_seek:focus-visible,
232
+ #chui_ap_volume:focus-visible {
221
233
  outline: var(--focus_outline);
222
234
  outline-offset: var(--focus_outline_offset);
223
235
  }
@@ -244,7 +256,8 @@ chui_ap_volume_block {
244
256
  /* КНОПКИ: площадка 32px с глифом 18px. Прежде глиф занимал почти всю кнопку
245
257
  (30px в 34px), и она читалась рамкой вокруг значка */
246
258
  chui_ap_play_pause,
247
- chui_ap_fx_icon, chui_ap_volume_icon {
259
+ chui_ap_fx_icon,
260
+ chui_ap_volume_icon {
248
261
  display: flex;
249
262
  align-items: center;
250
263
  justify-content: center;
@@ -278,7 +291,7 @@ chui_ap_play_pause:hover {
278
291
  }
279
292
 
280
293
  chui_ap_play_pause:active {
281
- transform: scale(.96);
294
+ transform: scale(0.96);
282
295
  }
283
296
 
284
297
  /* === ЭКВАЛАЙЗЕР === */
@@ -406,7 +419,7 @@ chui_eq_slider_main slider_label:first-child {
406
419
  color: var(--text_color);
407
420
  text-align: center;
408
421
  opacity: 0;
409
- transition: opacity .12s ease;
422
+ transition: opacity 0.12s ease;
410
423
  pointer-events: none;
411
424
  }
412
425
 
@@ -422,7 +435,7 @@ chui_eq_slider_main:focus-within slider_label:first-child {
422
435
 
423
436
  .chui_ap_equalizer_disabled slider_label {
424
437
  color: var(--text_color_disabled);
425
- opacity: .5;
438
+ opacity: 0.5;
426
439
  }
427
440
 
428
441
  /*
@@ -460,9 +473,11 @@ chui_eq_slider_main:focus-within slider_label:first-child {
460
473
  значении (`--fx-before-width` считает скрипт, как у полос прогресса и громкости) */
461
474
  background-size: 100% calc(100% - var(--fx_knob));
462
475
  background-position: center;
463
- background-image: linear-gradient(to top,
476
+ background-image: linear-gradient(
477
+ to top,
464
478
  var(--blue_prime_background) 0 var(--fx-before-width),
465
- transparent var(--fx-before-width));
479
+ transparent var(--fx-before-width)
480
+ );
466
481
  }
467
482
 
468
483
  /* Дорожка не рисуется: рельс — само поле */
@@ -488,9 +503,11 @@ chui_eq_slider_main:focus-within slider_label:first-child {
488
503
  .eq_slider_test:disabled {
489
504
  cursor: not-allowed;
490
505
  accent-color: var(--text_color_disabled);
491
- background-image: linear-gradient(to top,
506
+ background-image: linear-gradient(
507
+ to top,
492
508
  var(--text_color_disabled) 0 var(--fx-before-width),
493
- transparent var(--fx-before-width));
509
+ transparent var(--fx-before-width)
510
+ );
494
511
  }
495
512
 
496
513
  .eq_slider_test:disabled::-webkit-slider-thumb {
@@ -514,11 +531,13 @@ chui_ap_fx_icon:focus-visible,
514
531
  }
515
532
 
516
533
  /* Наведение: нейтральная площадка — у всех, кроме главной кнопки: она уже светлая */
517
- chui_ap_fx_icon:hover, chui_ap_volume_icon:hover {
534
+ chui_ap_fx_icon:hover,
535
+ chui_ap_volume_icon:hover {
518
536
  background: var(--element_background_hover);
519
537
  }
520
538
 
521
- chui_ap_fx_icon:hover chui_icon, chui_ap_volume_icon:hover chui_icon {
539
+ chui_ap_fx_icon:hover chui_icon,
540
+ chui_ap_volume_icon:hover chui_icon {
522
541
  color: var(--text_color);
523
542
  }
524
543
 
@@ -1,34 +1,45 @@
1
- const {Animation} = require("../../modules/chui_animations/animations");
2
- const {optionOr} = require("../../modules/chui_functions");
3
- const {I18n} = require("../../modules/chui_i18n/chui_i18n");
4
- const {makeKeyboardButton} = require("../../modules/chui_a11y/chui_a11y");
1
+ const { Animation } = require("../../modules/chui_animations/animations");
2
+ const { optionOr } = require("../../modules/chui_functions");
3
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
4
+ const { makeKeyboardButton } = require("../../modules/chui_a11y/chui_a11y");
5
5
  // image-size 2.x отдаёт объект с функцией внутри (сборка ESM + CJS-обёртка), а 1.x — саму
6
6
  // функцию: разворачиваем оба варианта, чтобы модуль не зависел от установленной версии
7
7
  const image_size = require("image-size");
8
8
  const sizeOf = typeof image_size === "function" ? image_size : image_size.imageSize;
9
- const {Icon, Icons} = require("../chui_icons/icons");
9
+ const { Icon, Icons } = require("../chui_icons/icons");
10
10
 
11
11
  class Image {
12
- #chui_image = document.createElement('chui_image');
13
- #image = document.createElement('img');
12
+ #chui_image = document.createElement("chui_image");
13
+ #image = document.createElement("img");
14
14
  #alt = "";
15
15
  #decorative = false;
16
- constructor(options = {
17
- path: String(), base64: String(), httpPath: String(),
18
- width: String(), height: String(),
19
- openPopup: Boolean(), disableMargin: Boolean(),
20
- alt: String(), decorative: Boolean()
21
- }) {
22
- require('../../modules/chui_functions').setStyles(__dirname + "/image_styles.css", 'chUiJS_Image');
16
+ constructor(
17
+ options = {
18
+ path: String(),
19
+ base64: String(),
20
+ httpPath: String(),
21
+ width: String(),
22
+ height: String(),
23
+ openPopup: Boolean(),
24
+ disableMargin: Boolean(),
25
+ alt: String(),
26
+ decorative: Boolean(),
27
+ }
28
+ ) {
29
+ require("../../modules/chui_functions").setStyles(__dirname + "/image_styles.css", "chUiJS_Image");
23
30
  // Внешний отступ снимает класс: его читает CSS
24
31
  if (options.disableMargin) this.#chui_image.classList.add("image_no_margin");
25
32
  // Источник — необязательная опция: пустая заготовка пути раньше читалась как файл (ENOENT)
26
33
  const path = optionOr(options.path, undefined);
27
34
  const base64 = optionOr(options.base64, undefined);
28
35
  const http_path = optionOr(options.httpPath, undefined);
29
- if (path !== undefined) this.#image.setAttribute('src', `data:image/png;base64,${require('fs').readFileSync(path).toString("base64")}`)
30
- if (base64 !== undefined) this.#image.setAttribute('src', `data:image/png;base64,${base64}`);
31
- if (http_path !== undefined) this.#image.setAttribute('src', http_path);
36
+ if (path !== undefined)
37
+ this.#image.setAttribute(
38
+ "src",
39
+ `data:image/png;base64,${require("fs").readFileSync(path).toString("base64")}`
40
+ );
41
+ if (base64 !== undefined) this.#image.setAttribute("src", `data:image/png;base64,${base64}`);
42
+ if (http_path !== undefined) this.#image.setAttribute("src", http_path);
32
43
  if (options.width !== undefined) this.#chui_image.style.width = options.width;
33
44
  if (options.height !== undefined) this.#chui_image.style.height = options.height;
34
45
  if (options.width !== undefined) this.#image.style.width = options.width;
@@ -47,33 +58,52 @@ class Image {
47
58
  let imageSet;
48
59
  // image-size 2.x размеры файла по пути не считает (строку он читал бы как байты),
49
60
  // поэтому файл читаем сами и отдаём буфер — как в ветке base64 ниже
50
- const dimensions = sizeOf(require('fs').readFileSync(options.path));
61
+ const dimensions = sizeOf(require("fs").readFileSync(options.path));
51
62
  if (dimensions.height > dimensions.width) {
52
- imageSet = new Image({ disableMargin: true, openPopup: false, path: options.path, width: "auto", height: "-webkit-fill-available" });
63
+ imageSet = new Image({
64
+ disableMargin: true,
65
+ openPopup: false,
66
+ path: options.path,
67
+ width: "auto",
68
+ height: "-webkit-fill-available",
69
+ });
53
70
  popup = new ImagePopup(imageSet.set(), "auto", "-webkit-fill-available");
54
71
  } else {
55
- imageSet = new Image({ disableMargin: true, openPopup: false, path: options.path, width: "auto", height: "auto" });
72
+ imageSet = new Image({
73
+ disableMargin: true,
74
+ openPopup: false,
75
+ path: options.path,
76
+ width: "auto",
77
+ height: "auto",
78
+ });
56
79
  popup = new ImagePopup(imageSet.set(), "auto", "-webkit-fill-available");
57
80
  }
58
81
  }
59
82
  if (options.base64 !== undefined) {
60
- let image_size; let imageSet; let img = Buffer.from(options.base64, 'base64'); let dimensions = sizeOf(img);
83
+ let image_size;
84
+ let imageSet;
85
+ let img = Buffer.from(options.base64, "base64");
86
+ let dimensions = sizeOf(img);
61
87
  if (dimensions.height > widow_size.height) {
62
- image_size = ["auto", `${widow_size.height}px`]
88
+ image_size = ["auto", `${widow_size.height}px`];
63
89
  } else if (dimensions.width > widow_size.width) {
64
- image_size = [`${widow_size.height}px`, "auto"]
90
+ image_size = [`${widow_size.height}px`, "auto"];
65
91
  } else {
66
- image_size = ["auto", `auto`]
92
+ image_size = ["auto", `auto`];
67
93
  }
68
94
  //
69
- imageSet = new Image({ disableMargin: true, openPopup: false, base64: options.base64, width: image_size[0], height: image_size[1] });
95
+ imageSet = new Image({
96
+ disableMargin: true,
97
+ openPopup: false,
98
+ base64: options.base64,
99
+ width: image_size[0],
100
+ height: image_size[1],
101
+ });
70
102
  popup = new ImagePopup(imageSet.set(), "max-content", "max-content");
71
-
72
-
73
103
  }
74
- document.body.appendChild(popup.set())
104
+ document.body.appendChild(popup.set());
75
105
  popup.open();
76
- })
106
+ });
77
107
  }
78
108
  }
79
109
  setWidth(value) {
@@ -104,20 +134,22 @@ class Image {
104
134
  this.#image.setAttribute("alt", this.#decorative ? "" : this.#alt);
105
135
  return this;
106
136
  }
107
- set() { return this.#chui_image; }
137
+ set() {
138
+ return this.#chui_image;
139
+ }
108
140
  }
109
141
 
110
142
  class ImagePopup {
111
143
  #id = require("randomstring").generate();
112
144
  #chui_image_popup = document.createElement(`chui_image_popup`);
113
- #popup_content = document.createElement('popup_content_test');
114
- #image_popup_content = document.createElement('image_popup_content');
115
- #close_popup = document.createElement("image_popup_close")
145
+ #popup_content = document.createElement("popup_content_test");
146
+ #image_popup_content = document.createElement("image_popup_content");
147
+ #close_popup = document.createElement("image_popup_close");
116
148
  constructor(image, width, height) {
117
- this.#chui_image_popup.id = this.#id
149
+ this.#chui_image_popup.id = this.#id;
118
150
  //ADDS
119
- this.#image_popup_content.style.width = width
120
- this.#image_popup_content.style.height = height
151
+ this.#image_popup_content.style.width = width;
152
+ this.#image_popup_content.style.height = height;
121
153
  this.#image_popup_content.appendChild(image);
122
154
 
123
155
  this.#close_popup.innerHTML = new Icon(Icons.NAVIGATION.CLOSE, "30px", "").getHTML();
@@ -127,7 +159,7 @@ class ImagePopup {
127
159
  this.#close_popup.setAttribute("aria-label", I18n.t("common.close"));
128
160
  this.#close_popup.addEventListener("click", () => this.close());
129
161
 
130
- this.#popup_content.appendChild(this.#image_popup_content)
162
+ this.#popup_content.appendChild(this.#image_popup_content);
131
163
  this.#popup_content.appendChild(this.#close_popup);
132
164
  this.#chui_image_popup.appendChild(this.#popup_content);
133
165
  }
@@ -146,4 +178,4 @@ class ImagePopup {
146
178
  }
147
179
  }
148
180
 
149
- exports.Image = Image;
181
+ exports.Image = Image;
@@ -1,5 +1,5 @@
1
- const { setStyles } = require('../../modules/chui_functions');
2
- const { I18n } = require('../../modules/chui_i18n/chui_i18n');
1
+ const { setStyles } = require("../../modules/chui_functions");
2
+ const { I18n } = require("../../modules/chui_i18n/chui_i18n");
3
3
 
4
4
  /** Минимальная ширина половины кадра, при которой её подпись ещё уместна, % */
5
5
  const BADGE_MIN_PART = 20;
@@ -41,7 +41,7 @@ const BADGE_MIN_PART = 20;
41
41
  class ImageCompare {
42
42
  static ORIENTATION = {
43
43
  HORIZONTAL: "horizontal",
44
- VERTICAL: "vertical"
44
+ VERTICAL: "vertical",
45
45
  };
46
46
  static #counter = 0;
47
47
 
@@ -68,12 +68,25 @@ class ImageCompare {
68
68
  #on_change = undefined;
69
69
  #change_listeners = [];
70
70
 
71
- constructor(options = {
72
- id: String(), title: String(), label: String(), before: String(), after: String(),
73
- beforeAlt: String(), afterAlt: String(), width: String(), height: String(),
74
- orientation: String(), value: Number(), step: Number(), labels: Boolean(),
75
- disabled: Boolean(), onChange: undefined
76
- }) {
71
+ constructor(
72
+ options = {
73
+ id: String(),
74
+ title: String(),
75
+ label: String(),
76
+ before: String(),
77
+ after: String(),
78
+ beforeAlt: String(),
79
+ afterAlt: String(),
80
+ width: String(),
81
+ height: String(),
82
+ orientation: String(),
83
+ value: Number(),
84
+ step: Number(),
85
+ labels: Boolean(),
86
+ disabled: Boolean(),
87
+ onChange: undefined,
88
+ }
89
+ ) {
77
90
  setStyles(__dirname + "/image_compare_styles.css", "chUiJS_ImageCompare");
78
91
  ImageCompare.#counter += 1;
79
92
  this.#id = options.id === undefined ? `chui_image_compare_${ImageCompare.#counter}` : options.id;
@@ -87,8 +100,10 @@ class ImageCompare {
87
100
  if (options.height !== undefined) this.#root.style.setProperty("--image_compare_height", options.height);
88
101
  if (options.value !== undefined) this.#value = this.#clamp(options.value);
89
102
  if (options.step !== undefined) this.#step = Math.abs(Number(options.step) || 1);
90
- this.#orientation = options.orientation === ImageCompare.ORIENTATION.VERTICAL
91
- ? ImageCompare.ORIENTATION.VERTICAL : ImageCompare.ORIENTATION.HORIZONTAL;
103
+ this.#orientation =
104
+ options.orientation === ImageCompare.ORIENTATION.VERTICAL
105
+ ? ImageCompare.ORIENTATION.VERTICAL
106
+ : ImageCompare.ORIENTATION.HORIZONTAL;
92
107
 
93
108
  if (options.title !== undefined) {
94
109
  this.#title.id = `${this.#id}_title`;
@@ -107,7 +122,11 @@ class ImageCompare {
107
122
  this.#handle.setAttribute("aria-valuemin", "0");
108
123
  this.#handle.setAttribute("aria-valuemax", "100");
109
124
  if (options.title !== undefined) this.#handle.setAttribute("aria-labelledby", this.#title.id);
110
- else this.#handle.setAttribute("aria-label", this.#label_text === undefined ? I18n.t("media.imageCompareLabel") : this.#label_text);
125
+ else
126
+ this.#handle.setAttribute(
127
+ "aria-label",
128
+ this.#label_text === undefined ? I18n.t("media.imageCompareLabel") : this.#label_text
129
+ );
111
130
  this.#grip.setAttribute("aria-hidden", "true");
112
131
  this.#grip.innerText = "‹ ›";
113
132
  this.#badge_before.className = "image_compare_badge image_compare_badge_before";
@@ -138,10 +157,18 @@ class ImageCompare {
138
157
 
139
158
  // === ЗНАЧЕНИЕ ===
140
159
  /** Где стоит граница, в процентах от ширины (или высоты) кадра */
141
- getValue() { return this.#value; }
142
- getId() { return this.#id; }
143
- getOrientation() { return this.#orientation; }
144
- isDisabled() { return this.#disabled; }
160
+ getValue() {
161
+ return this.#value;
162
+ }
163
+ getId() {
164
+ return this.#id;
165
+ }
166
+ getOrientation() {
167
+ return this.#orientation;
168
+ }
169
+ isDisabled() {
170
+ return this.#disabled;
171
+ }
145
172
 
146
173
  /** Поставить границу; `silent` — без уведомления слушателей (значение ставит модель) */
147
174
  setValue(value = Number(), silent = Boolean()) {
@@ -154,8 +181,10 @@ class ImageCompare {
154
181
  return this;
155
182
  }
156
183
  setOrientation(orientation = String()) {
157
- this.#orientation = orientation === ImageCompare.ORIENTATION.VERTICAL
158
- ? ImageCompare.ORIENTATION.VERTICAL : ImageCompare.ORIENTATION.HORIZONTAL;
184
+ this.#orientation =
185
+ orientation === ImageCompare.ORIENTATION.VERTICAL
186
+ ? ImageCompare.ORIENTATION.VERTICAL
187
+ : ImageCompare.ORIENTATION.HORIZONTAL;
159
188
  this.#syncOrientation();
160
189
  this.#render();
161
190
  return this;
@@ -183,7 +212,9 @@ class ImageCompare {
183
212
  this.#change_listeners.push(listener);
184
213
  return this;
185
214
  }
186
- set() { return this.#root; }
215
+ set() {
216
+ return this.#root;
217
+ }
187
218
 
188
219
  // === ВНУТРЕННЕЕ ===
189
220
  #emit() {
@@ -214,7 +245,7 @@ class ImageCompare {
214
245
  #render() {
215
246
  const percent = `${this.#value}%`;
216
247
  this.#handle.setAttribute("aria-valuenow", String(this.#value));
217
- this.#handle.setAttribute("aria-valuetext", I18n.t("media.imageCompareValue", {value: this.#value}));
248
+ this.#handle.setAttribute("aria-valuetext", I18n.t("media.imageCompareValue", { value: this.#value }));
218
249
  if (this.#orientation === ImageCompare.ORIENTATION.VERTICAL) {
219
250
  this.#handle.style.top = percent;
220
251
  this.#handle.style.left = "";
@@ -319,4 +350,4 @@ class ImageCompare {
319
350
  };
320
351
  }
321
352
 
322
- exports.ImageCompare = ImageCompare
353
+ exports.ImageCompare = ImageCompare;
@@ -3,7 +3,7 @@ chui_image {
3
3
  width: max-content;
4
4
  border-radius: var(--radius_md);
5
5
  margin: var(--margin);
6
- display: flex
6
+ display: flex;
7
7
  }
8
8
 
9
9
  /* Опция `disableMargin`: внешний отступ снимает класс */
@@ -17,7 +17,7 @@ chui_image img {
17
17
  border-radius: var(--radius_md);
18
18
  /* Волосок вместо рамки: белая картинка не сливается со страницей,
19
19
  а размер от него не меняется */
20
- box-shadow: 0 0 0 1px var(--border_color)
20
+ box-shadow: 0 0 0 1px var(--border_color);
21
21
  }
22
22
 
23
23
  /* IMAGE POPUP */
@@ -33,7 +33,7 @@ chui_image_popup {
33
33
  background-color: var(--header_background);
34
34
  padding: 0;
35
35
  border: none;
36
- backdrop-filter: var(--global_blur)
36
+ backdrop-filter: var(--global_blur);
37
37
  }
38
38
 
39
39
  popup_content_test {