stimeo-ui 0.15.0 → 0.17.0
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 +209 -0
- package/README.md +128 -1
- package/dist/cable/index.d.ts +79 -23
- package/dist/cable/index.js +392 -417
- package/dist/cable/index.js.map +1 -1
- package/dist/controllers/accordion_controller.d.ts +34 -5
- package/dist/controllers/accordion_controller.js +228 -28
- package/dist/controllers/accordion_controller.js.map +1 -1
- package/dist/controllers/alert_dialog_controller.d.ts +20 -9
- package/dist/controllers/alert_dialog_controller.js +862 -221
- package/dist/controllers/alert_dialog_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.d.ts +38 -7
- package/dist/controllers/announcer_controller.js +135 -191
- package/dist/controllers/announcer_controller.js.map +1 -1
- package/dist/controllers/aspect_ratio_controller.js +0 -10
- package/dist/controllers/aspect_ratio_controller.js.map +1 -1
- package/dist/controllers/auto_submit_controller.d.ts +30 -6
- package/dist/controllers/auto_submit_controller.js +295 -110
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.js +172 -106
- package/dist/controllers/avatar_controller.js.map +1 -1
- package/dist/controllers/breadcrumb_controller.d.ts +10 -7
- package/dist/controllers/breadcrumb_controller.js +0 -129
- package/dist/controllers/breadcrumb_controller.js.map +1 -1
- package/dist/controllers/bulk_select_controller.d.ts +22 -4
- package/dist/controllers/bulk_select_controller.js +264 -53
- package/dist/controllers/bulk_select_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +109 -28
- package/dist/controllers/calendar_controller.js +346 -180
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +99 -27
- package/dist/controllers/carousel_controller.js +587 -300
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/character_counter_controller.d.ts +18 -2
- package/dist/controllers/character_counter_controller.js +271 -143
- package/dist/controllers/character_counter_controller.js.map +1 -1
- package/dist/controllers/checkbox_controller.d.ts +7 -2
- package/dist/controllers/checkbox_controller.js +77 -75
- package/dist/controllers/checkbox_controller.js.map +1 -1
- package/dist/controllers/clipboard_controller.d.ts +44 -7
- package/dist/controllers/clipboard_controller.js +187 -108
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +41 -5
- package/dist/controllers/collapsible_controller.js +374 -108
- package/dist/controllers/collapsible_controller.js.map +1 -1
- package/dist/controllers/color_picker_controller.d.ts +47 -14
- package/dist/controllers/color_picker_controller.js +183 -127
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/combobox_controller.d.ts +33 -6
- package/dist/controllers/combobox_controller.js +426 -109
- package/dist/controllers/combobox_controller.js.map +1 -1
- package/dist/controllers/command_palette_controller.d.ts +45 -14
- package/dist/controllers/command_palette_controller.js +994 -350
- package/dist/controllers/command_palette_controller.js.map +1 -1
- package/dist/controllers/conditional_fields_controller.d.ts +15 -2
- package/dist/controllers/conditional_fields_controller.js +212 -125
- package/dist/controllers/conditional_fields_controller.js.map +1 -1
- package/dist/controllers/confirm_controller.d.ts +49 -12
- package/dist/controllers/confirm_controller.js +939 -245
- package/dist/controllers/confirm_controller.js.map +1 -1
- package/dist/controllers/context_menu_controller.d.ts +36 -3
- package/dist/controllers/context_menu_controller.js +275 -127
- package/dist/controllers/context_menu_controller.js.map +1 -1
- package/dist/controllers/count_up_controller.d.ts +13 -1
- package/dist/controllers/count_up_controller.js +73 -21
- package/dist/controllers/count_up_controller.js.map +1 -1
- package/dist/controllers/countdown_controller.d.ts +75 -2
- package/dist/controllers/countdown_controller.js +235 -97
- package/dist/controllers/countdown_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +93 -15
- package/dist/controllers/currency_input_controller.js +241 -118
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/data_grid_controller.d.ts +78 -22
- package/dist/controllers/data_grid_controller.js +229 -135
- package/dist/controllers/data_grid_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +64 -11
- package/dist/controllers/date_range_picker_controller.js +359 -165
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +22 -3
- package/dist/controllers/dialog_controller.js +887 -225
- package/dist/controllers/dialog_controller.js.map +1 -1
- package/dist/controllers/direct_upload_controller.d.ts +24 -7
- package/dist/controllers/direct_upload_controller.js +80 -142
- package/dist/controllers/direct_upload_controller.js.map +1 -1
- package/dist/controllers/dirty_form_controller.d.ts +2 -2
- package/dist/controllers/dirty_form_controller.js +26 -47
- package/dist/controllers/dirty_form_controller.js.map +1 -1
- package/dist/controllers/dismissible_controller.d.ts +19 -0
- package/dist/controllers/dismissible_controller.js +175 -20
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/drawer_controller.d.ts +52 -16
- package/dist/controllers/drawer_controller.js +963 -336
- package/dist/controllers/drawer_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.d.ts +39 -3
- package/dist/controllers/dropdown_controller.js +342 -85
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/editable_controller.d.ts +12 -1
- package/dist/controllers/editable_controller.js +182 -58
- package/dist/controllers/editable_controller.js.map +1 -1
- package/dist/controllers/empty_state_controller.js +67 -53
- package/dist/controllers/empty_state_controller.js.map +1 -1
- package/dist/controllers/file_dropzone_controller.d.ts +60 -18
- package/dist/controllers/file_dropzone_controller.js +426 -229
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/filter_controller.d.ts +10 -4
- package/dist/controllers/filter_controller.js +78 -36
- package/dist/controllers/filter_controller.js.map +1 -1
- package/dist/controllers/flash_controller.d.ts +57 -14
- package/dist/controllers/flash_controller.js +328 -211
- package/dist/controllers/flash_controller.js.map +1 -1
- package/dist/controllers/focus_controller.d.ts +12 -3
- package/dist/controllers/focus_controller.js +654 -239
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +153 -136
- package/dist/controllers/form_field_controller.js.map +1 -1
- package/dist/controllers/form_validation_controller.js +29 -96
- package/dist/controllers/form_validation_controller.js.map +1 -1
- package/dist/controllers/frame_loading_controller.d.ts +41 -9
- package/dist/controllers/frame_loading_controller.js +263 -198
- package/dist/controllers/frame_loading_controller.js.map +1 -1
- package/dist/controllers/highlight_controller.d.ts +22 -2
- package/dist/controllers/highlight_controller.js +119 -70
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/hover_card_controller.d.ts +65 -4
- package/dist/controllers/hover_card_controller.js +335 -118
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +58 -4
- package/dist/controllers/idle_controller.js +316 -65
- package/dist/controllers/idle_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.d.ts +5 -2
- package/dist/controllers/input_mask_controller.js +116 -61
- package/dist/controllers/input_mask_controller.js.map +1 -1
- package/dist/controllers/intersection_controller.d.ts +32 -13
- package/dist/controllers/intersection_controller.js +147 -103
- package/dist/controllers/intersection_controller.js.map +1 -1
- package/dist/controllers/lazy_frame_controller.d.ts +16 -0
- package/dist/controllers/lazy_frame_controller.js +9 -56
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/listbox_controller.d.ts +84 -10
- package/dist/controllers/listbox_controller.js +413 -153
- package/dist/controllers/listbox_controller.js.map +1 -1
- package/dist/controllers/local_time_controller.d.ts +1 -1
- package/dist/controllers/local_time_controller.js +54 -64
- package/dist/controllers/local_time_controller.js.map +1 -1
- package/dist/controllers/masonry_controller.d.ts +11 -3
- package/dist/controllers/masonry_controller.js +70 -95
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.d.ts +40 -9
- package/dist/controllers/menu_controller.js +254 -167
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.d.ts +15 -4
- package/dist/controllers/menubar_controller.js +206 -331
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/meter_controller.d.ts +20 -0
- package/dist/controllers/meter_controller.js +159 -71
- package/dist/controllers/meter_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +50 -7
- package/dist/controllers/multi_select_controller.js +797 -388
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.d.ts +19 -1
- package/dist/controllers/navigation_menu_controller.js +156 -231
- package/dist/controllers/navigation_menu_controller.js.map +1 -1
- package/dist/controllers/nested_form_controller.d.ts +10 -0
- package/dist/controllers/nested_form_controller.js +373 -174
- package/dist/controllers/nested_form_controller.js.map +1 -1
- package/dist/controllers/network_status_controller.d.ts +23 -0
- package/dist/controllers/network_status_controller.js +241 -45
- package/dist/controllers/network_status_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +62 -10
- package/dist/controllers/number_input_controller.js +387 -227
- package/dist/controllers/number_input_controller.js.map +1 -1
- package/dist/controllers/optimistic_controller.js +28 -75
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.d.ts +38 -7
- package/dist/controllers/otp_controller.js +344 -196
- package/dist/controllers/otp_controller.js.map +1 -1
- package/dist/controllers/overflow_indicator_controller.d.ts +13 -12
- package/dist/controllers/overflow_indicator_controller.js +167 -93
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.d.ts +66 -9
- package/dist/controllers/overflow_menu_controller.js +408 -277
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.d.ts +52 -15
- package/dist/controllers/pagination_controller.js +342 -120
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +60 -9
- package/dist/controllers/password_reveal_controller.js +424 -99
- package/dist/controllers/password_reveal_controller.js.map +1 -1
- package/dist/controllers/password_strength_controller.d.ts +14 -5
- package/dist/controllers/password_strength_controller.js +99 -153
- package/dist/controllers/password_strength_controller.js.map +1 -1
- package/dist/controllers/persist_controller.d.ts +11 -4
- package/dist/controllers/persist_controller.js +252 -96
- package/dist/controllers/persist_controller.js.map +1 -1
- package/dist/controllers/pointer_drag_controller.d.ts +19 -7
- package/dist/controllers/pointer_drag_controller.js +263 -164
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +46 -4
- package/dist/controllers/popover_controller.js +267 -94
- package/dist/controllers/popover_controller.js.map +1 -1
- package/dist/controllers/portal_controller.d.ts +44 -4
- package/dist/controllers/portal_controller.js +209 -72
- package/dist/controllers/portal_controller.js.map +1 -1
- package/dist/controllers/preview_guard_controller.d.ts +10 -4
- package/dist/controllers/preview_guard_controller.js +243 -112
- package/dist/controllers/preview_guard_controller.js.map +1 -1
- package/dist/controllers/progress_controller.d.ts +11 -0
- package/dist/controllers/progress_controller.js +132 -59
- package/dist/controllers/progress_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +19 -8
- package/dist/controllers/radio_group_controller.js +138 -133
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/range_slider_controller.d.ts +92 -4
- package/dist/controllers/range_slider_controller.js +245 -112
- package/dist/controllers/range_slider_controller.js.map +1 -1
- package/dist/controllers/rating_controller.d.ts +33 -6
- package/dist/controllers/rating_controller.js +429 -194
- package/dist/controllers/rating_controller.js.map +1 -1
- package/dist/controllers/read_more_controller.d.ts +26 -2
- package/dist/controllers/read_more_controller.js +185 -47
- package/dist/controllers/read_more_controller.js.map +1 -1
- package/dist/controllers/reading_progress_controller.d.ts +1 -1
- package/dist/controllers/reading_progress_controller.js +147 -135
- package/dist/controllers/reading_progress_controller.js.map +1 -1
- package/dist/controllers/relative_time_controller.d.ts +18 -4
- package/dist/controllers/relative_time_controller.js +145 -110
- package/dist/controllers/relative_time_controller.js.map +1 -1
- package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
- package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +97 -38
- package/dist/controllers/reset_on_restore_controller.js.map +1 -0
- package/dist/controllers/resizable_controller.d.ts +44 -4
- package/dist/controllers/resizable_controller.js +294 -118
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/roving_controller.js +39 -84
- package/dist/controllers/roving_controller.js.map +1 -1
- package/dist/controllers/scroll_area_controller.d.ts +7 -3
- package/dist/controllers/scroll_area_controller.js +428 -221
- package/dist/controllers/scroll_area_controller.js.map +1 -1
- package/dist/controllers/scroll_restore_controller.js +0 -53
- package/dist/controllers/scroll_restore_controller.js.map +1 -1
- package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
- package/dist/controllers/scroll_visibility_controller.js +395 -146
- package/dist/controllers/scroll_visibility_controller.js.map +1 -1
- package/dist/controllers/scrollspy_controller.d.ts +9 -3
- package/dist/controllers/scrollspy_controller.js +181 -236
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/separator_controller.d.ts +59 -17
- package/dist/controllers/separator_controller.js +288 -132
- package/dist/controllers/separator_controller.js.map +1 -1
- package/dist/controllers/sidebar_controller.d.ts +81 -7
- package/dist/controllers/sidebar_controller.js +1071 -375
- package/dist/controllers/sidebar_controller.js.map +1 -1
- package/dist/controllers/skeleton_controller.d.ts +23 -0
- package/dist/controllers/skeleton_controller.js +248 -92
- package/dist/controllers/skeleton_controller.js.map +1 -1
- package/dist/controllers/slider_controller.d.ts +72 -8
- package/dist/controllers/slider_controller.js +211 -96
- package/dist/controllers/slider_controller.js.map +1 -1
- package/dist/controllers/smart_sticky_header_controller.d.ts +21 -3
- package/dist/controllers/smart_sticky_header_controller.js +163 -54
- package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
- package/dist/controllers/sortable_controller.js +13 -110
- package/dist/controllers/sortable_controller.js.map +1 -1
- package/dist/controllers/spinner_controller.d.ts +39 -4
- package/dist/controllers/spinner_controller.js +277 -161
- package/dist/controllers/spinner_controller.js.map +1 -1
- package/dist/controllers/step_indicator_controller.d.ts +24 -17
- package/dist/controllers/step_indicator_controller.js +107 -53
- package/dist/controllers/step_indicator_controller.js.map +1 -1
- package/dist/controllers/stepper_controller.d.ts +43 -9
- package/dist/controllers/stepper_controller.js +171 -48
- package/dist/controllers/stepper_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.d.ts +25 -0
- package/dist/controllers/stick_to_bottom_controller.js +310 -116
- package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
- package/dist/controllers/sticky_observer_controller.d.ts +11 -0
- package/dist/controllers/sticky_observer_controller.js +214 -49
- package/dist/controllers/sticky_observer_controller.js.map +1 -1
- package/dist/controllers/submit_once_controller.d.ts +22 -6
- package/dist/controllers/submit_once_controller.js +294 -192
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +40 -7
- package/dist/controllers/switch_controller.js +107 -43
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +13 -1
- package/dist/controllers/tabs_controller.js +50 -25
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +27 -3
- package/dist/controllers/tags_input_controller.js +290 -149
- package/dist/controllers/tags_input_controller.js.map +1 -1
- package/dist/controllers/textarea_autosize_controller.d.ts +10 -0
- package/dist/controllers/textarea_autosize_controller.js +71 -58
- package/dist/controllers/textarea_autosize_controller.js.map +1 -1
- package/dist/controllers/theme_controller.d.ts +37 -8
- package/dist/controllers/theme_controller.js +148 -80
- package/dist/controllers/theme_controller.js.map +1 -1
- package/dist/controllers/time_picker_controller.d.ts +18 -1
- package/dist/controllers/time_picker_controller.js +162 -81
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +85 -23
- package/dist/controllers/toast_controller.js +365 -193
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +60 -9
- package/dist/controllers/toggle_group_controller.js +194 -99
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.js +92 -90
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +52 -2
- package/dist/controllers/tooltip_controller.js +185 -125
- package/dist/controllers/tooltip_controller.js.map +1 -1
- package/dist/controllers/transition_controller.d.ts +22 -4
- package/dist/controllers/transition_controller.js +123 -115
- package/dist/controllers/transition_controller.js.map +1 -1
- package/dist/controllers/tree_view_controller.d.ts +59 -18
- package/dist/controllers/tree_view_controller.js +248 -290
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.d.ts +33 -3
- package/dist/index.js +8649 -8572
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +95 -9
- package/dist/inspector/cli.js +343 -77
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +390 -96
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +45 -45
- package/dist/inspector/manifest.json +1308 -155
- package/dist/positioning/index.d.ts +8 -0
- package/dist/positioning/index.js +148 -45
- package/dist/positioning/index.js.map +1 -1
- package/package.json +7 -7
- package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
- package/dist/controllers/reset_before_cache_controller.js.map +0 -1
|
@@ -1,30 +1,20 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
-
// src/controllers/overflow_indicator_controller.ts
|
|
4
|
-
|
|
5
|
-
// src/utils/blur_deferral.ts
|
|
6
3
|
var BlurDeferral = class {
|
|
7
|
-
/** Elements currently holding an update back, mapped to their `blur` listener. */
|
|
8
4
|
#pending = /* @__PURE__ */ new Map();
|
|
9
|
-
/** Called after a pending element blurs and has been detached. */
|
|
10
5
|
#onRelease;
|
|
11
|
-
/** @param onRelease - Invoked once `element` actually blurs; never on `release`. */
|
|
12
6
|
constructor(onRelease) {
|
|
13
7
|
this.#onRelease = onRelease;
|
|
14
8
|
}
|
|
15
|
-
/** Number of elements currently holding an update back. */
|
|
16
9
|
get size() {
|
|
17
10
|
return this.#pending.size;
|
|
18
11
|
}
|
|
19
|
-
/** Snapshot of the pending elements, safe to iterate while releasing them. */
|
|
20
12
|
get elements() {
|
|
21
13
|
return [...this.#pending.keys()];
|
|
22
14
|
}
|
|
23
|
-
/** Whether `element` is currently holding an update back. */
|
|
24
15
|
has(element) {
|
|
25
16
|
return this.#pending.has(element);
|
|
26
17
|
}
|
|
27
|
-
/** Holds an update back until `element` blurs. Idempotent (no stacked listeners). */
|
|
28
18
|
defer(element) {
|
|
29
19
|
if (this.#pending.has(element)) return;
|
|
30
20
|
const onBlur = () => {
|
|
@@ -34,22 +24,18 @@ var BlurDeferral = class {
|
|
|
34
24
|
this.#pending.set(element, onBlur);
|
|
35
25
|
element.addEventListener("blur", onBlur);
|
|
36
26
|
}
|
|
37
|
-
/** Defers `element` as the only pending entry, cancelling any others. */
|
|
38
27
|
deferOnly(element) {
|
|
39
28
|
for (const pending of this.elements) {
|
|
40
29
|
if (pending !== element) this.#detach(pending);
|
|
41
30
|
}
|
|
42
31
|
this.defer(element);
|
|
43
32
|
}
|
|
44
|
-
/** Cancels `element`'s deferral without completing it; no-ops when not pending. */
|
|
45
33
|
release(element) {
|
|
46
34
|
this.#detach(element);
|
|
47
35
|
}
|
|
48
|
-
/** Cancels every deferral without completing any of them. */
|
|
49
36
|
releaseAll() {
|
|
50
37
|
for (const element of this.elements) this.#detach(element);
|
|
51
38
|
}
|
|
52
|
-
/** Removes the `blur` listener for `element` and forgets it. */
|
|
53
39
|
#detach(element) {
|
|
54
40
|
const onBlur = this.#pending.get(element);
|
|
55
41
|
if (onBlur) element.removeEventListener("blur", onBlur);
|
|
@@ -57,18 +43,31 @@ var BlurDeferral = class {
|
|
|
57
43
|
}
|
|
58
44
|
};
|
|
59
45
|
|
|
60
|
-
|
|
46
|
+
var FrameCoalescer = class {
|
|
47
|
+
#frame = null;
|
|
48
|
+
schedule(run) {
|
|
49
|
+
if (this.#frame !== null) return;
|
|
50
|
+
this.#frame = requestAnimationFrame(() => {
|
|
51
|
+
this.#frame = null;
|
|
52
|
+
run();
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
cancel() {
|
|
56
|
+
if (this.#frame === null) return;
|
|
57
|
+
cancelAnimationFrame(this.#frame);
|
|
58
|
+
this.#frame = null;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
61
62
|
var LayoutObserver = class {
|
|
62
63
|
#callback;
|
|
63
64
|
#resizeObserverFactory;
|
|
64
65
|
#resizeObserver = null;
|
|
65
66
|
#observingViewport = false;
|
|
66
67
|
#loadContainer = null;
|
|
67
|
-
/** Stable bound handler so add/removeEventListener target the same reference. */
|
|
68
68
|
#handleViewportResize = () => {
|
|
69
69
|
this.#callback();
|
|
70
70
|
};
|
|
71
|
-
/** Stable bound handler for the capture-phase `load`; see {@link observeDescendantLoads}. */
|
|
72
71
|
#handleDescendantLoad = () => {
|
|
73
72
|
this.#callback();
|
|
74
73
|
};
|
|
@@ -76,11 +75,6 @@ var LayoutObserver = class {
|
|
|
76
75
|
this.#callback = callback;
|
|
77
76
|
this.#resizeObserverFactory = options.resizeObserverFactory ?? (typeof ResizeObserver === "undefined" ? null : (cb) => new ResizeObserver(cb));
|
|
78
77
|
}
|
|
79
|
-
/**
|
|
80
|
-
* Starts observing an element's size. Repeated calls observe additional
|
|
81
|
-
* elements through the same shared observer. No-ops when no
|
|
82
|
-
* `ResizeObserver` implementation is available.
|
|
83
|
-
*/
|
|
84
78
|
observe(element) {
|
|
85
79
|
if (!this.#resizeObserverFactory) return;
|
|
86
80
|
if (!this.#resizeObserver) {
|
|
@@ -90,47 +84,28 @@ var LayoutObserver = class {
|
|
|
90
84
|
}
|
|
91
85
|
this.#resizeObserver.observe(element);
|
|
92
86
|
}
|
|
93
|
-
/** Stops observing a single element while leaving any others in place. */
|
|
94
87
|
unobserve(element) {
|
|
95
88
|
this.#resizeObserver?.unobserve(element);
|
|
96
89
|
}
|
|
97
|
-
/** Starts observing viewport resizes. Idempotent: the listener is added once. */
|
|
98
90
|
observeViewport() {
|
|
99
91
|
if (this.#observingViewport) return;
|
|
100
92
|
this.#observingViewport = true;
|
|
101
93
|
window.addEventListener("resize", this.#handleViewportResize);
|
|
102
94
|
}
|
|
103
|
-
/** Stops observing viewport resizes without affecting element observation. */
|
|
104
95
|
unobserveViewport() {
|
|
105
96
|
if (!this.#observingViewport) return;
|
|
106
97
|
this.#observingViewport = false;
|
|
107
98
|
window.removeEventListener("resize", this.#handleViewportResize);
|
|
108
99
|
}
|
|
109
|
-
/**
|
|
110
|
-
* Starts reporting a `load` from anywhere inside `container` — an image or a
|
|
111
|
-
* frame settling changes the box it sits in, and it measures as zero high until
|
|
112
|
-
* then. `load` does not bubble, so the subscription is a capture-phase listener
|
|
113
|
-
* on the container itself and nothing the caller spells.
|
|
114
|
-
*
|
|
115
|
-
* **One container at a time.** A further call moves the observation, so a widget
|
|
116
|
-
* whose content element is swapped at runtime releases the element it let go by
|
|
117
|
-
* naming the new one — there is no second place for the release to drift from.
|
|
118
|
-
*/
|
|
119
100
|
observeDescendantLoads(container) {
|
|
120
101
|
this.unobserveDescendantLoads();
|
|
121
102
|
this.#loadContainer = container;
|
|
122
103
|
container.addEventListener("load", this.#handleDescendantLoad, true);
|
|
123
104
|
}
|
|
124
|
-
/** Stops reporting descendant loads without affecting element or viewport observation. */
|
|
125
105
|
unobserveDescendantLoads() {
|
|
126
106
|
this.#loadContainer?.removeEventListener("load", this.#handleDescendantLoad, true);
|
|
127
107
|
this.#loadContainer = null;
|
|
128
108
|
}
|
|
129
|
-
/**
|
|
130
|
-
* Releases every observation: disconnects the {@link ResizeObserver} and removes
|
|
131
|
-
* the viewport and descendant-load listeners. Safe to call multiple times. Call
|
|
132
|
-
* this from a controller's `disconnect()`.
|
|
133
|
-
*/
|
|
134
109
|
disconnect() {
|
|
135
110
|
this.#resizeObserver?.disconnect();
|
|
136
111
|
this.#resizeObserver = null;
|
|
@@ -139,7 +114,17 @@ var LayoutObserver = class {
|
|
|
139
114
|
}
|
|
140
115
|
};
|
|
141
116
|
|
|
142
|
-
|
|
117
|
+
var ListenerSet = class {
|
|
118
|
+
#abort = new AbortController();
|
|
119
|
+
add(target, type, handler, options) {
|
|
120
|
+
target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
|
|
121
|
+
}
|
|
122
|
+
dispose() {
|
|
123
|
+
this.#abort.abort();
|
|
124
|
+
this.#abort = new AbortController();
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
143
128
|
function isRtl(element) {
|
|
144
129
|
return window.getComputedStyle(element).direction === "rtl";
|
|
145
130
|
}
|
|
@@ -156,45 +141,149 @@ function physicalScrollDelta(element, horizontal, logicalDelta) {
|
|
|
156
141
|
return horizontal && isRtl(element) ? -logicalDelta : logicalDelta;
|
|
157
142
|
}
|
|
158
143
|
|
|
159
|
-
|
|
144
|
+
var MicrotaskCoalescer = class {
|
|
145
|
+
#run;
|
|
146
|
+
#queued = false;
|
|
147
|
+
#active = false;
|
|
148
|
+
#generation = 0;
|
|
149
|
+
constructor(run) {
|
|
150
|
+
this.#run = run;
|
|
151
|
+
}
|
|
152
|
+
activate() {
|
|
153
|
+
this.#active = true;
|
|
154
|
+
}
|
|
155
|
+
cancel() {
|
|
156
|
+
this.#active = false;
|
|
157
|
+
this.#queued = false;
|
|
158
|
+
this.#generation += 1;
|
|
159
|
+
}
|
|
160
|
+
schedule() {
|
|
161
|
+
if (!this.#active || this.#queued) return;
|
|
162
|
+
this.#queued = true;
|
|
163
|
+
const generation = this.#generation;
|
|
164
|
+
queueMicrotask(() => {
|
|
165
|
+
if (generation !== this.#generation || !this.#queued || !this.#active) return;
|
|
166
|
+
this.#queued = false;
|
|
167
|
+
this.#run();
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
var MorphRenderWatcher = class {
|
|
173
|
+
#listeners = new ListenerSet();
|
|
174
|
+
#pass;
|
|
175
|
+
#element = null;
|
|
176
|
+
#onMorph = () => this.#pass.schedule();
|
|
177
|
+
constructor(run) {
|
|
178
|
+
this.#pass = new MicrotaskCoalescer(run);
|
|
179
|
+
}
|
|
180
|
+
observe(element) {
|
|
181
|
+
if (this.#element === element) return;
|
|
182
|
+
this.disconnect();
|
|
183
|
+
this.#element = element;
|
|
184
|
+
this.#pass.activate();
|
|
185
|
+
this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
|
|
186
|
+
}
|
|
187
|
+
schedule() {
|
|
188
|
+
this.#pass.schedule();
|
|
189
|
+
}
|
|
190
|
+
disconnect() {
|
|
191
|
+
this.#listeners.dispose();
|
|
192
|
+
this.#pass.cancel();
|
|
193
|
+
this.#element = null;
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
var NUMBER_BOUNDS = {
|
|
198
|
+
finite: { finite: true }};
|
|
199
|
+
function matchesNumberBounds(value, bounds) {
|
|
200
|
+
if (!Number.isFinite(value)) {
|
|
201
|
+
const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
|
|
202
|
+
if (direction === null) return false;
|
|
203
|
+
if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
|
|
204
|
+
}
|
|
205
|
+
if (bounds.min !== void 0 && value < bounds.min) return false;
|
|
206
|
+
if (bounds.max !== void 0 && value > bounds.max) return false;
|
|
207
|
+
if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
|
|
208
|
+
if (bounds.integer && !Number.isInteger(value)) return false;
|
|
209
|
+
if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function readNumber(raw, fallback, bounds) {
|
|
214
|
+
return matchesNumberBounds(raw, bounds) ? raw : fallback;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
var NumberValueReader = class {
|
|
218
|
+
#lastRejected = /* @__PURE__ */ new Map();
|
|
219
|
+
read(owner, name, raw, fallback, bounds) {
|
|
220
|
+
const resolved = readNumber(raw, fallback, bounds);
|
|
221
|
+
if (matchesNumberBounds(raw, bounds)) {
|
|
222
|
+
this.#lastRejected.delete(name);
|
|
223
|
+
return resolved;
|
|
224
|
+
}
|
|
225
|
+
const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
|
|
226
|
+
const literal = owner.element.getAttribute(attribute);
|
|
227
|
+
if (literal === null) {
|
|
228
|
+
this.#lastRejected.delete(name);
|
|
229
|
+
return resolved;
|
|
230
|
+
}
|
|
231
|
+
if (this.#lastRejected.get(name) !== literal) {
|
|
232
|
+
this.#lastRejected.set(name, literal);
|
|
233
|
+
console.warn(
|
|
234
|
+
`Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
return resolved;
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
|
|
160
241
|
function prefersReducedMotion() {
|
|
161
242
|
return typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
162
243
|
}
|
|
163
244
|
|
|
164
|
-
|
|
165
|
-
var
|
|
166
|
-
|
|
245
|
+
var DIRECTION_PARAM = "direction-param";
|
|
246
|
+
var OverflowIndicatorController = class _OverflowIndicatorController extends Controller {
|
|
247
|
+
#numbers = new NumberValueReader();
|
|
248
|
+
get #directionParam() {
|
|
249
|
+
return `data-${this.identifier}-${DIRECTION_PARAM}`;
|
|
250
|
+
}
|
|
251
|
+
get #directionButtonSelector() {
|
|
252
|
+
return `[${this.#directionParam}]`;
|
|
253
|
+
}
|
|
167
254
|
static targets = ["viewport"];
|
|
168
255
|
static values = {
|
|
169
256
|
orientation: { type: String, default: "horizontal" },
|
|
170
257
|
threshold: { type: Number, default: 1 }
|
|
171
258
|
};
|
|
172
|
-
static
|
|
259
|
+
static valueConstraints = {
|
|
260
|
+
threshold: NUMBER_BOUNDS.finite
|
|
261
|
+
};
|
|
262
|
+
static actions = ["scrollByPage"];
|
|
173
263
|
static events = ["change"];
|
|
174
264
|
#layout = new LayoutObserver(() => {
|
|
175
|
-
if (this.#connected) this
|
|
265
|
+
if (this.#connected) this.#refresh();
|
|
176
266
|
});
|
|
267
|
+
#frames = new FrameCoalescer();
|
|
268
|
+
#viewportListeners = new ListenerSet();
|
|
269
|
+
#onScroll = () => this.#frames.schedule(() => this.#refresh());
|
|
177
270
|
#connected = false;
|
|
178
271
|
#observedViewport = null;
|
|
179
272
|
#observedContent = /* @__PURE__ */ new Set();
|
|
180
273
|
#mutationObserver = null;
|
|
181
|
-
/**
|
|
182
|
-
* Boundary buttons whose native `disabled` is held back while they hold focus.
|
|
183
|
-
*
|
|
184
|
-
* Completing the deferral is what actually disables the button, so the release
|
|
185
|
-
* callback — unlike {@link #cancelPendingButtonDisable} — applies it.
|
|
186
|
-
*/
|
|
187
274
|
#pendingButtonDisables = new BlurDeferral((button) => {
|
|
188
275
|
this.#restorePendingMarkers(button);
|
|
189
276
|
if (!button.disabled) this.#disableButton(button);
|
|
190
277
|
});
|
|
191
|
-
/** Last reported room, so `change` fires only on transitions. */
|
|
192
278
|
#state = null;
|
|
279
|
+
#morphRender = new MorphRenderWatcher(() => this.#refresh());
|
|
193
280
|
connect() {
|
|
281
|
+
this.#morphRender.observe(this.element);
|
|
194
282
|
this.#connected = true;
|
|
195
283
|
this.#syncViewport();
|
|
196
284
|
}
|
|
197
285
|
disconnect() {
|
|
286
|
+
this.#morphRender.disconnect();
|
|
198
287
|
this.#connected = false;
|
|
199
288
|
this.#stopObservingViewport();
|
|
200
289
|
this.#layout.disconnect();
|
|
@@ -209,16 +298,12 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
209
298
|
this.#syncViewport();
|
|
210
299
|
}
|
|
211
300
|
orientationValueChanged() {
|
|
212
|
-
if (this.#connected) this
|
|
301
|
+
if (this.#connected) this.#refresh();
|
|
213
302
|
}
|
|
214
303
|
thresholdValueChanged() {
|
|
215
|
-
if (this.#connected) this
|
|
304
|
+
if (this.#connected) this.#refresh();
|
|
216
305
|
}
|
|
217
|
-
|
|
218
|
-
* Re-measures remaining scroll room and reflects the state hooks.
|
|
219
|
-
* Public so it can be wired to the viewport's `scroll`.
|
|
220
|
-
*/
|
|
221
|
-
update() {
|
|
306
|
+
#refresh() {
|
|
222
307
|
if (!this.hasViewportTarget) return;
|
|
223
308
|
const vp = this.viewportTarget;
|
|
224
309
|
const horizontal = this.orientationValue !== "vertical";
|
|
@@ -234,7 +319,6 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
234
319
|
this.dispatch("change", { detail: { start, end } });
|
|
235
320
|
}
|
|
236
321
|
}
|
|
237
|
-
/** Scrolls one viewport page toward the `direction` param (`start`/`end`). */
|
|
238
322
|
scrollByPage(event) {
|
|
239
323
|
if (!this.hasViewportTarget) return;
|
|
240
324
|
const direction = this.#directionFromEvent(event);
|
|
@@ -252,29 +336,22 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
252
336
|
vp.scrollBy({ top: delta, behavior });
|
|
253
337
|
}
|
|
254
338
|
}
|
|
255
|
-
/** Mirrors remaining room onto any direction buttons by toggling `disabled`. */
|
|
256
339
|
#syncButtons(start, end) {
|
|
257
340
|
for (const button of this.#pendingButtonDisables.elements) {
|
|
258
|
-
if (!button.isConnected || button.closest(
|
|
341
|
+
if (!button.isConnected || button.closest(`[data-controller~='${this.identifier}']`) !== this.element) {
|
|
259
342
|
this.#cancelPendingButtonDisable(button);
|
|
260
343
|
}
|
|
261
344
|
}
|
|
262
|
-
const buttons = this.element.querySelectorAll(
|
|
345
|
+
const buttons = this.element.querySelectorAll(this.#directionButtonSelector);
|
|
263
346
|
for (const button of buttons) {
|
|
264
|
-
if (button.closest(
|
|
347
|
+
if (button.closest(`[data-controller~='${this.identifier}']`) !== this.element) {
|
|
265
348
|
continue;
|
|
266
349
|
}
|
|
267
|
-
const direction = button.getAttribute(
|
|
350
|
+
const direction = button.getAttribute(this.#directionParam);
|
|
268
351
|
if (direction === "start") this.#toggleButton(button, start);
|
|
269
352
|
else if (direction === "end") this.#toggleButton(button, end);
|
|
270
353
|
}
|
|
271
354
|
}
|
|
272
|
-
/**
|
|
273
|
-
* Reflects the remaining room onto a page button's `disabled`, owning only the
|
|
274
|
-
* `disabled` it sets itself via a marker (`data-overflow-indicator-disabled`,
|
|
275
|
-
* like `number-input`/`conditional-fields`). An author-disabled button (e.g. the
|
|
276
|
-
* whole control disabled) is therefore never blindly re-enabled.
|
|
277
|
-
*/
|
|
278
355
|
#toggleButton(button, hasRoom) {
|
|
279
356
|
if (!this.#pendingButtonDisables.has(button) && button.hasAttribute("data-overflow-indicator-pending-disabled")) {
|
|
280
357
|
this.#cancelPendingButtonDisable(button);
|
|
@@ -294,10 +371,6 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
294
371
|
this.#disableButton(button);
|
|
295
372
|
}
|
|
296
373
|
}
|
|
297
|
-
/**
|
|
298
|
-
* Keeps a boundary button focusable until native blur, exposing its temporary
|
|
299
|
-
* inoperability with `aria-disabled` and making its action a no-op meanwhile.
|
|
300
|
-
*/
|
|
301
374
|
#deferButtonDisable(button) {
|
|
302
375
|
if (this.#pendingButtonDisables.has(button)) return;
|
|
303
376
|
button.setAttribute("data-overflow-indicator-pending-disabled", "");
|
|
@@ -312,18 +385,10 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
312
385
|
button.disabled = true;
|
|
313
386
|
button.setAttribute("data-overflow-indicator-disabled", "");
|
|
314
387
|
}
|
|
315
|
-
/** Cancels a pending disable without applying it, restoring the displaced state. */
|
|
316
388
|
#cancelPendingButtonDisable(button) {
|
|
317
389
|
this.#pendingButtonDisables.release(button);
|
|
318
390
|
this.#restorePendingMarkers(button);
|
|
319
391
|
}
|
|
320
|
-
/**
|
|
321
|
-
* Drops the pending marker and gives back the `aria-disabled` it displaced.
|
|
322
|
-
*
|
|
323
|
-
* Reads the displaced value from the DOM rather than memory: a Turbo snapshot is
|
|
324
|
-
* cloned before `disconnect()` runs, so a restored page can arrive with markers
|
|
325
|
-
* this instance never wrote.
|
|
326
|
-
*/
|
|
327
392
|
#restorePendingMarkers(button) {
|
|
328
393
|
button.removeAttribute("data-overflow-indicator-pending-disabled");
|
|
329
394
|
const displaced = button.getAttribute("data-overflow-indicator-aria-disabled");
|
|
@@ -340,7 +405,6 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
340
405
|
this.#cancelPendingButtonDisable(button);
|
|
341
406
|
}
|
|
342
407
|
}
|
|
343
|
-
/** Moves resize/mutation/load observation to the current viewport target. */
|
|
344
408
|
#syncViewport() {
|
|
345
409
|
if (!this.#connected) return;
|
|
346
410
|
const next = this.hasViewportTarget ? this.viewportTarget : null;
|
|
@@ -348,6 +412,7 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
348
412
|
this.#stopObservingViewport();
|
|
349
413
|
if (!next) return;
|
|
350
414
|
this.#observedViewport = next;
|
|
415
|
+
this.#viewportListeners.add(next, "scroll", this.#onScroll, { passive: true });
|
|
351
416
|
this.#layout.observe(next);
|
|
352
417
|
this.#layout.observeViewport();
|
|
353
418
|
this.#layout.observeDescendantLoads(next);
|
|
@@ -356,7 +421,7 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
356
421
|
this.#mutationObserver = new MutationObserver(() => {
|
|
357
422
|
if (!this.#connected || this.#observedViewport !== next) return;
|
|
358
423
|
this.#syncContentObservation();
|
|
359
|
-
this
|
|
424
|
+
this.#refresh();
|
|
360
425
|
});
|
|
361
426
|
this.#mutationObserver.observe(this.element, {
|
|
362
427
|
childList: true,
|
|
@@ -367,9 +432,8 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
367
432
|
});
|
|
368
433
|
}
|
|
369
434
|
this.#state = null;
|
|
370
|
-
this
|
|
435
|
+
this.#refresh();
|
|
371
436
|
}
|
|
372
|
-
/** Observes direct content boxes whose resize can change the viewport's scroll extent. */
|
|
373
437
|
#syncContentObservation() {
|
|
374
438
|
const next = new Set(this.#observedViewport?.children ?? []);
|
|
375
439
|
for (const content of this.#observedContent) {
|
|
@@ -386,6 +450,8 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
386
450
|
}
|
|
387
451
|
}
|
|
388
452
|
#stopObservingViewport() {
|
|
453
|
+
this.#frames.cancel();
|
|
454
|
+
this.#viewportListeners.dispose();
|
|
389
455
|
this.#mutationObserver?.disconnect();
|
|
390
456
|
this.#mutationObserver = null;
|
|
391
457
|
this.#layout.unobserveDescendantLoads();
|
|
@@ -396,16 +462,24 @@ var OverflowIndicatorController = class extends Controller {
|
|
|
396
462
|
this.#layout.unobserveViewport();
|
|
397
463
|
}
|
|
398
464
|
get #threshold() {
|
|
399
|
-
const value = this
|
|
400
|
-
return
|
|
465
|
+
const value = this.#safeThreshold;
|
|
466
|
+
return Math.max(0, value);
|
|
401
467
|
}
|
|
402
468
|
#directionFromEvent(event) {
|
|
403
469
|
const params = event.params;
|
|
404
470
|
const direction = params?.direction;
|
|
405
471
|
return direction === "start" || direction === "end" ? direction : null;
|
|
406
472
|
}
|
|
473
|
+
get #safeThreshold() {
|
|
474
|
+
return this.#numbers.read(
|
|
475
|
+
this,
|
|
476
|
+
"threshold",
|
|
477
|
+
this.thresholdValue,
|
|
478
|
+
_OverflowIndicatorController.values.threshold.default,
|
|
479
|
+
_OverflowIndicatorController.valueConstraints.threshold
|
|
480
|
+
);
|
|
481
|
+
}
|
|
407
482
|
};
|
|
408
483
|
|
|
409
484
|
export { OverflowIndicatorController };
|
|
410
|
-
//# sourceMappingURL=overflow_indicator_controller.js.map
|
|
411
485
|
//# sourceMappingURL=overflow_indicator_controller.js.map
|