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.
- package/CHANGELOG.md +113 -0
- package/README.md +43 -632
- package/framework/appLayout/default/chui_app_layout.js +314 -273
- package/framework/appLayout/default/global_style.css +93 -53
- package/framework/components/chui_accordion/accordion.js +29 -26
- package/framework/components/chui_accordion/styles.css +6 -5
- package/framework/components/chui_action_sheet/action_sheet.js +59 -33
- package/framework/components/chui_action_sheet/styles.css +2 -1
- package/framework/components/chui_affix/affix.js +11 -6
- package/framework/components/chui_alert/alert.js +23 -14
- package/framework/components/chui_avatar/avatar.js +23 -22
- package/framework/components/chui_avatar_group/avatar_group.js +21 -19
- package/framework/components/chui_backtop/backtop.js +35 -19
- package/framework/components/chui_badge/badge.js +15 -13
- package/framework/components/chui_breadcrumb/breadcrumb.js +15 -13
- package/framework/components/chui_button/button.js +42 -22
- package/framework/components/chui_button/styles.css +2 -2
- package/framework/components/chui_calendar/calendar.js +12 -10
- package/framework/components/chui_card/card.js +43 -23
- package/framework/components/chui_chat/chat.js +72 -33
- package/framework/components/chui_clipboard_history/clipboard_history.js +30 -21
- package/framework/components/chui_clipboard_history/styles.css +4 -2
- package/framework/components/chui_code/code.js +2 -2
- package/framework/components/chui_code/styles.css +2 -2
- package/framework/components/chui_code_editor/code_editor.js +47 -31
- package/framework/components/chui_code_editor/styles.css +3 -2
- package/framework/components/chui_command_palette/command_palette.js +60 -37
- package/framework/components/chui_console/console.js +5 -5
- package/framework/components/chui_console/styles.css +1 -1
- package/framework/components/chui_content_block/content_block.js +33 -19
- package/framework/components/chui_content_block/styles.css +2 -2
- package/framework/components/chui_context_menu/context_menu.js +9 -4
- package/framework/components/chui_custom_element/custom_element.js +22 -15
- package/framework/components/chui_data_grid/data_grid.js +396 -234
- package/framework/components/chui_data_grid/styles.css +10 -8
- package/framework/components/chui_descriptions/descriptions.js +34 -17
- package/framework/components/chui_details/details.js +32 -26
- package/framework/components/chui_details/styles.css +5 -4
- package/framework/components/chui_diff_viewer/diff_viewer.js +91 -66
- package/framework/components/chui_diff_viewer/styles.css +1 -1
- package/framework/components/chui_divider/divider.js +13 -11
- package/framework/components/chui_drawer/drawer.js +27 -25
- package/framework/components/chui_drop_zone/drop_zone.js +31 -21
- package/framework/components/chui_empty_state/empty_state.js +20 -15
- package/framework/components/chui_fieldset/fieldset.js +37 -20
- package/framework/components/chui_fieldset/styles.css +1 -1
- package/framework/components/chui_file_explorer/file_explorer.js +157 -86
- package/framework/components/chui_file_explorer/styles.css +2 -1
- package/framework/components/chui_form/form.js +31 -19
- package/framework/components/chui_form/styles.css +1 -1
- package/framework/components/chui_gantt/gantt.js +64 -40
- package/framework/components/chui_graphs/graphs.js +301 -200
- package/framework/components/chui_graphs/styles.css +1 -1
- package/framework/components/chui_hero/hero.js +40 -22
- package/framework/components/chui_html_block/html_block.js +6 -6
- package/framework/components/chui_html_block/styles.css +2 -2
- package/framework/components/chui_hx/hx.js +3 -3
- package/framework/components/chui_hx/styles.css +11 -4
- package/framework/components/chui_icons/icons.js +2109 -2109
- package/framework/components/chui_icons/styles.css +2 -2
- package/framework/components/chui_inputs/chui_check_box/check_box.js +31 -19
- package/framework/components/chui_inputs/chui_check_box/styles.css +18 -18
- package/framework/components/chui_inputs/chui_chips/chips.js +50 -40
- package/framework/components/chui_inputs/chui_chips/styles.css +4 -2
- package/framework/components/chui_inputs/chui_color_picker/color_picker.js +36 -24
- package/framework/components/chui_inputs/chui_combo_box/combo_box.js +100 -82
- package/framework/components/chui_inputs/chui_combo_box/styles.css +14 -12
- package/framework/components/chui_inputs/chui_date/date.js +102 -66
- package/framework/components/chui_inputs/chui_date/styles.css +12 -11
- package/framework/components/chui_inputs/chui_date_range/date_range.js +40 -29
- package/framework/components/chui_inputs/chui_datetime/datetime.js +35 -27
- package/framework/components/chui_inputs/chui_email/email.js +43 -31
- package/framework/components/chui_inputs/chui_email/styles.css +5 -5
- package/framework/components/chui_inputs/chui_file/file.js +68 -41
- package/framework/components/chui_inputs/chui_file/styles.css +13 -12
- package/framework/components/chui_inputs/chui_hotkey/hotkey.js +61 -36
- package/framework/components/chui_inputs/chui_masked/masked.js +39 -28
- package/framework/components/chui_inputs/chui_mention/mention.js +77 -30
- package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +173 -153
- package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +9 -7
- package/framework/components/chui_inputs/chui_number/number.js +58 -41
- package/framework/components/chui_inputs/chui_number/styles.css +7 -7
- package/framework/components/chui_inputs/chui_otp/otp.js +38 -29
- package/framework/components/chui_inputs/chui_password/password.js +58 -36
- package/framework/components/chui_inputs/chui_password/styles.css +8 -8
- package/framework/components/chui_inputs/chui_radio_button/radio_button.js +37 -25
- package/framework/components/chui_inputs/chui_radio_button/styles.css +20 -20
- package/framework/components/chui_inputs/chui_rating/rating.js +26 -22
- package/framework/components/chui_inputs/chui_select_box/select_box.js +102 -78
- package/framework/components/chui_inputs/chui_select_box/styles.css +11 -11
- package/framework/components/chui_inputs/chui_slider/slider.js +29 -26
- package/framework/components/chui_inputs/chui_slider/styles.css +2 -1
- package/framework/components/chui_inputs/chui_text/styles.css +8 -8
- package/framework/components/chui_inputs/chui_text/text.js +65 -44
- package/framework/components/chui_inputs/chui_text_area/styles.css +6 -6
- package/framework/components/chui_inputs/chui_text_area/text_area.js +51 -28
- package/framework/components/chui_inputs/chui_time/styles.css +5 -3
- package/framework/components/chui_inputs/chui_time/time.js +38 -27
- package/framework/components/chui_inputs/chui_toggle/styles.css +3 -3
- package/framework/components/chui_inputs/chui_toggle/toggle.js +16 -16
- package/framework/components/chui_json_editor/json_editor.js +53 -43
- package/framework/components/chui_json_viewer/json_viewer.js +52 -33
- package/framework/components/chui_json_viewer/styles.css +3 -2
- package/framework/components/chui_kanban/kanban.js +52 -34
- package/framework/components/chui_kbd/kbd.js +12 -10
- package/framework/components/chui_label/label.js +14 -12
- package/framework/components/chui_label/styles.css +2 -2
- package/framework/components/chui_link/link.js +27 -20
- package/framework/components/chui_list/list.js +31 -27
- package/framework/components/chui_list/styles.css +2 -1
- package/framework/components/chui_markdown_editor/markdown_editor.js +60 -44
- package/framework/components/chui_media/audio.js +326 -227
- package/framework/components/chui_media/audio_styles.css +40 -21
- package/framework/components/chui_media/image.js +70 -38
- package/framework/components/chui_media/image_compare.js +52 -21
- package/framework/components/chui_media/image_styles.css +3 -3
- package/framework/components/chui_media/video.js +155 -62
- package/framework/components/chui_media/video_styles.css +33 -16
- package/framework/components/chui_menu_bar/menu_bar.js +26 -24
- package/framework/components/chui_menu_bar/styles.css +4 -2
- package/framework/components/chui_modal/modal.js +44 -43
- package/framework/components/chui_modal/styles.css +3 -2
- package/framework/components/chui_notification/notification.js +50 -34
- package/framework/components/chui_notification/notification_download.js +31 -25
- package/framework/components/chui_notification/notification_download_progress.css +3 -2
- package/framework/components/chui_notification/notification_download_progress.js +47 -41
- package/framework/components/chui_notification/notification_update.js +23 -16
- package/framework/components/chui_notification/status_plate.js +2 -2
- package/framework/components/chui_notification/styles_download.css +1 -1
- package/framework/components/chui_notification/styles_update.css +1 -1
- package/framework/components/chui_org_chart/org_chart.js +74 -35
- package/framework/components/chui_pagination/pagination.js +62 -27
- package/framework/components/chui_paragraph/paragraph.js +2 -2
- package/framework/components/chui_paragraph/styles.css +1 -1
- package/framework/components/chui_popover/popover.js +49 -28
- package/framework/components/chui_popups/popups.js +137 -108
- package/framework/components/chui_popups/styles.css +2 -2
- package/framework/components/chui_print_button/print_button.js +33 -23
- package/framework/components/chui_progress_bar/progress_bar.js +23 -15
- package/framework/components/chui_progress_bar/styles.css +2 -2
- package/framework/components/chui_progress_ring/progress_ring.js +17 -15
- package/framework/components/chui_qrcode/qrcode.js +75 -31
- package/framework/components/chui_query_builder/query_builder.js +216 -123
- package/framework/components/chui_radio_group/radio_group.js +36 -26
- package/framework/components/chui_radio_group/styles.css +1 -1
- package/framework/components/chui_result/result.js +26 -16
- package/framework/components/chui_scheduler/scheduler.js +57 -35
- package/framework/components/chui_scheduler/styles.css +6 -2
- package/framework/components/chui_segmented_control/segmented_control.js +27 -21
- package/framework/components/chui_settings/settings.js +122 -48
- package/framework/components/chui_shortcut_help/shortcut_help.js +55 -32
- package/framework/components/chui_sidebar_nav/sidebar_nav.js +33 -23
- package/framework/components/chui_skeleton/skeleton.js +29 -24
- package/framework/components/chui_slideshow/slideshow.js +60 -41
- package/framework/components/chui_slideshow/styles.css +18 -12
- package/framework/components/chui_spinner/spinner.js +8 -8
- package/framework/components/chui_spinner/styles.css +0 -1
- package/framework/components/chui_split_button/split_button.js +23 -18
- package/framework/components/chui_split_button/styles.css +1 -1
- package/framework/components/chui_splitter/splitter.js +35 -28
- package/framework/components/chui_statistic/statistic.js +65 -38
- package/framework/components/chui_status_bar/status_bar.js +11 -9
- package/framework/components/chui_stepper/stepper.js +27 -22
- package/framework/components/chui_sticky_bar/sticky_bar.js +9 -4
- package/framework/components/chui_sticky_bar/styles.css +3 -1
- package/framework/components/chui_tabs/chui_tabs.js +28 -22
- package/framework/components/chui_tabs/styles.css +3 -3
- package/framework/components/chui_text_editor/styles.css +20 -19
- package/framework/components/chui_text_editor/text_editor.js +85 -61
- package/framework/components/chui_text_editor/text_editor_panel.js +346 -284
- package/framework/components/chui_theme_toggle/theme_toggle.js +27 -22
- package/framework/components/chui_timeline/timeline.js +14 -12
- package/framework/components/chui_toast_queue/toast_queue.js +52 -46
- package/framework/components/chui_toolbar/toolbar.js +20 -13
- package/framework/components/chui_tooltip/tooltip.js +37 -24
- package/framework/components/chui_tour/styles.css +8 -3
- package/framework/components/chui_tour/tour.js +61 -27
- package/framework/components/chui_transfer/styles.css +2 -1
- package/framework/components/chui_transfer/transfer.js +75 -42
- package/framework/components/chui_tree_table/tree_table.js +43 -29
- package/framework/components/chui_tree_view/styles.css +4 -2
- package/framework/components/chui_tree_view/tree_view.js +142 -99
- package/framework/components/chui_watermark/watermark.js +24 -16
- package/framework/components/chui_webview/styles.css +2 -2
- package/framework/components/chui_webview/webview.js +62 -50
- package/framework/components/telegram_bot/chui_telegram_bot.js +71 -64
- package/framework/modules/chui_a11y/chui_a11y.js +77 -46
- package/framework/modules/chui_animations/animations.js +42 -42
- package/framework/modules/chui_animations/styles.css +1 -1
- package/framework/modules/chui_bridge/preload.js +56 -26
- package/framework/modules/chui_functions.js +52 -50
- package/framework/modules/chui_highlight/chui_highlight.js +25 -22
- package/framework/modules/chui_i18n/chui_i18n.js +9 -7
- package/framework/modules/chui_i18n/locales/a11y.js +5 -5
- package/framework/modules/chui_i18n/locales/app_layout.js +5 -5
- package/framework/modules/chui_i18n/locales/calendar.js +3 -3
- package/framework/modules/chui_i18n/locales/common.js +3 -3
- package/framework/modules/chui_i18n/locales/data.js +36 -26
- package/framework/modules/chui_i18n/locales/editors.js +40 -13
- package/framework/modules/chui_i18n/locales/feedback.js +3 -3
- package/framework/modules/chui_i18n/locales/forms.js +8 -8
- package/framework/modules/chui_i18n/locales/graphics.js +8 -8
- package/framework/modules/chui_i18n/locales/media.js +4 -4
- package/framework/modules/chui_i18n/locales/navigation.js +8 -8
- package/framework/modules/chui_i18n/locales/validate.js +3 -3
- package/framework/modules/chui_json/chui_json.js +9 -9
- package/framework/modules/chui_layout/chui_layout.js +12 -10
- package/framework/modules/chui_logger/chui_logger.js +29 -25
- package/framework/modules/chui_page/page.js +33 -27
- package/framework/modules/chui_page/styles.css +3 -26
- package/framework/modules/chui_qr/chui_qr.js +158 -67
- package/framework/modules/chui_scrollbar/chui_scrollbar.js +35 -24
- package/framework/modules/chui_scrollbar/styles.css +3 -1
- package/framework/modules/chui_services/chui_channels.js +76 -11
- package/framework/modules/chui_services/chui_services.js +39 -31
- package/framework/modules/chui_services/desktop.js +149 -30
- package/framework/modules/chui_sortable/chui_sortable.js +17 -12
- package/framework/modules/chui_validate/chui_validate.js +7 -4
- package/framework/tray_bar/chui_menu_items.js +136 -46
- package/index.d.ts +4814 -0
- package/index.js +449 -334
- 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,
|
|
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(
|
|
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(
|
|
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(
|
|
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,
|
|
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:
|
|
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,
|
|
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,
|
|
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,
|
|
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(
|
|
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(
|
|
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,
|
|
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,
|
|
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(
|
|
13
|
-
#image = document.createElement(
|
|
12
|
+
#chui_image = document.createElement("chui_image");
|
|
13
|
+
#image = document.createElement("img");
|
|
14
14
|
#alt = "";
|
|
15
15
|
#decorative = false;
|
|
16
|
-
constructor(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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)
|
|
30
|
-
|
|
31
|
-
|
|
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(
|
|
61
|
+
const dimensions = sizeOf(require("fs").readFileSync(options.path));
|
|
51
62
|
if (dimensions.height > dimensions.width) {
|
|
52
|
-
imageSet = new Image({
|
|
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({
|
|
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;
|
|
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({
|
|
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() {
|
|
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(
|
|
114
|
-
#image_popup_content = document.createElement(
|
|
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(
|
|
2
|
-
const { I18n } = require(
|
|
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(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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 =
|
|
91
|
-
|
|
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
|
|
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() {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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 =
|
|
158
|
-
|
|
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() {
|
|
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 {
|