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