stimeo-ui 0.16.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 +31 -0
- package/README.md +8 -1
- package/dist/cable/index.d.ts +79 -23
- package/dist/cable/index.js +363 -436
- package/dist/cable/index.js.map +1 -1
- package/dist/controllers/accordion_controller.d.ts +4 -2
- package/dist/controllers/accordion_controller.js +166 -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 +862 -221
- package/dist/controllers/alert_dialog_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.d.ts +35 -5
- package/dist/controllers/announcer_controller.js +135 -198
- 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 +271 -127
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.js +171 -105
- 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 +18 -0
- package/dist/controllers/bulk_select_controller.js +262 -52
- package/dist/controllers/bulk_select_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +24 -5
- package/dist/controllers/calendar_controller.js +175 -209
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +34 -7
- package/dist/controllers/carousel_controller.js +461 -399
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/character_counter_controller.d.ts +17 -1
- package/dist/controllers/character_counter_controller.js +246 -156
- 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 +32 -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 +168 -147
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +16 -4
- package/dist/controllers/collapsible_controller.js +301 -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 +149 -139
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/combobox_controller.d.ts +23 -5
- package/dist/controllers/combobox_controller.js +360 -133
- 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 +970 -358
- 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 +166 -124
- 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 -248
- package/dist/controllers/confirm_controller.js.map +1 -1
- package/dist/controllers/context_menu_controller.d.ts +31 -4
- package/dist/controllers/context_menu_controller.js +256 -128
- 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 +45 -1
- package/dist/controllers/countdown_controller.js +183 -148
- package/dist/controllers/countdown_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +21 -2
- package/dist/controllers/currency_input_controller.js +134 -158
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/data_grid_controller.d.ts +15 -4
- package/dist/controllers/data_grid_controller.js +114 -186
- package/dist/controllers/data_grid_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +30 -5
- package/dist/controllers/date_range_picker_controller.js +288 -206
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +13 -1
- package/dist/controllers/dialog_controller.js +858 -223
- 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 +73 -153
- package/dist/controllers/direct_upload_controller.js.map +1 -1
- package/dist/controllers/dirty_form_controller.js +14 -48
- 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 -21
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/drawer_controller.d.ts +39 -11
- package/dist/controllers/drawer_controller.js +933 -341
- package/dist/controllers/drawer_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.d.ts +31 -1
- package/dist/controllers/dropdown_controller.js +312 -82
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/editable_controller.d.ts +12 -1
- package/dist/controllers/editable_controller.js +158 -68
- 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 +311 -207
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/filter_controller.js +67 -39
- package/dist/controllers/filter_controller.js.map +1 -1
- package/dist/controllers/flash_controller.d.ts +31 -8
- package/dist/controllers/flash_controller.js +172 -314
- 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 -240
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +147 -132
- package/dist/controllers/form_field_controller.js.map +1 -1
- package/dist/controllers/form_validation_controller.js +13 -86
- 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 +264 -213
- 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 +107 -75
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/hover_card_controller.d.ts +56 -3
- package/dist/controllers/hover_card_controller.js +309 -118
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +42 -1
- package/dist/controllers/idle_controller.js +267 -101
- package/dist/controllers/idle_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.js +71 -72
- 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 -106
- 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 -65
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/listbox_controller.d.ts +34 -2
- package/dist/controllers/listbox_controller.js +306 -204
- 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 -93
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.d.ts +32 -7
- package/dist/controllers/menu_controller.js +214 -156
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.d.ts +4 -4
- package/dist/controllers/menubar_controller.js +170 -329
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/meter_controller.d.ts +20 -0
- package/dist/controllers/meter_controller.js +151 -67
- package/dist/controllers/meter_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +32 -4
- package/dist/controllers/multi_select_controller.js +593 -358
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.d.ts +8 -1
- package/dist/controllers/navigation_menu_controller.js +124 -232
- 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 +352 -182
- 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 +242 -54
- package/dist/controllers/network_status_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +26 -2
- package/dist/controllers/number_input_controller.js +320 -263
- package/dist/controllers/number_input_controller.js.map +1 -1
- package/dist/controllers/optimistic_controller.js +16 -76
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.d.ts +20 -4
- package/dist/controllers/otp_controller.js +198 -193
- 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 +116 -113
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.d.ts +48 -11
- package/dist/controllers/overflow_menu_controller.js +343 -283
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.d.ts +35 -6
- package/dist/controllers/pagination_controller.js +295 -119
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +45 -8
- package/dist/controllers/password_reveal_controller.js +389 -121
- 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 +237 -103
- 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 +185 -165
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +38 -2
- package/dist/controllers/popover_controller.js +236 -97
- 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 -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 +232 -116
- 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 +125 -56
- package/dist/controllers/progress_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +14 -5
- package/dist/controllers/radio_group_controller.js +117 -137
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/range_slider_controller.d.ts +43 -3
- package/dist/controllers/range_slider_controller.js +192 -105
- 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 +418 -207
- 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 +134 -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 +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 +28 -2
- package/dist/controllers/resizable_controller.js +255 -139
- 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 -225
- 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 -145
- 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 +181 -242
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/separator_controller.d.ts +19 -4
- package/dist/controllers/separator_controller.js +267 -140
- package/dist/controllers/separator_controller.js.map +1 -1
- package/dist/controllers/sidebar_controller.d.ts +64 -7
- package/dist/controllers/sidebar_controller.js +1023 -386
- 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 -97
- package/dist/controllers/skeleton_controller.js.map +1 -1
- package/dist/controllers/slider_controller.d.ts +27 -1
- package/dist/controllers/slider_controller.js +159 -79
- 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 +162 -63
- package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
- package/dist/controllers/sortable_controller.js +0 -112
- 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 -169
- package/dist/controllers/spinner_controller.js.map +1 -1
- package/dist/controllers/step_indicator_controller.d.ts +5 -0
- package/dist/controllers/step_indicator_controller.js +99 -46
- package/dist/controllers/step_indicator_controller.js.map +1 -1
- package/dist/controllers/stepper_controller.d.ts +12 -3
- package/dist/controllers/stepper_controller.js +114 -73
- package/dist/controllers/stepper_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.d.ts +6 -0
- package/dist/controllers/stick_to_bottom_controller.js +262 -138
- 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 +23 -8
- package/dist/controllers/submit_once_controller.js +294 -205
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +12 -1
- package/dist/controllers/switch_controller.js +33 -60
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +2 -2
- package/dist/controllers/tabs_controller.js +35 -29
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +12 -0
- package/dist/controllers/tags_input_controller.js +136 -145
- 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 +21 -9
- package/dist/controllers/theme_controller.js +130 -112
- 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 +146 -80
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +36 -11
- package/dist/controllers/toast_controller.js +186 -297
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +12 -3
- package/dist/controllers/toggle_group_controller.js +95 -136
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.js +68 -98
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +45 -3
- 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 +21 -11
- package/dist/controllers/tree_view_controller.js +150 -345
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.js +6370 -9346
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +23 -3
- package/dist/inspector/cli.js +92 -37
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +92 -56
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +8 -8
- package/dist/inspector/manifest.json +787 -100
- package/dist/positioning/index.d.ts +8 -0
- package/dist/positioning/index.js +148 -47
- package/dist/positioning/index.js.map +1 -1
- package/package.json +6 -6
- package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
- package/dist/controllers/reset_before_cache_controller.js.map +0 -1
|
@@ -1,69 +1,47 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
-
// src/controllers/pointer_drag_controller.ts
|
|
4
|
-
|
|
5
|
-
// src/utils/arrow_step.ts
|
|
6
3
|
function isReservedArrowChord(event, allow = []) {
|
|
7
4
|
if (!event.key.startsWith("Arrow")) return false;
|
|
8
5
|
return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
|
|
9
6
|
}
|
|
10
7
|
|
|
11
|
-
// src/utils/detach_gate.ts
|
|
12
8
|
var DetachGate = class _DetachGate {
|
|
13
|
-
/** Set while a probe is queued, waiting for a reconnect to cancel it. */
|
|
14
9
|
#pending = false;
|
|
15
|
-
/**
|
|
16
|
-
* True while a probe is queued — the last disconnect was ambiguous and no
|
|
17
|
-
* reconnect has cancelled it yet. Read it from `connect()` to tell the
|
|
18
|
-
* reconnect half of an in-page move from a first connect: a controller whose
|
|
19
|
-
* initialisation restarts a measurement (a min-duration floor, an elapsed
|
|
20
|
-
* counter) must skip it for the move, where nothing actually restarted.
|
|
21
|
-
*/
|
|
22
10
|
get pending() {
|
|
23
11
|
return this.#pending;
|
|
24
12
|
}
|
|
25
|
-
/**
|
|
26
|
-
* True when the disconnect is definitely a real detach — the element left
|
|
27
|
-
* the document, or `data-controller` no longer lists the identifier. False
|
|
28
|
-
* means ambiguous (in-page move or observed-root exit), NOT "alive".
|
|
29
|
-
*/
|
|
30
13
|
static isDetached(host) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return !tokens.includes(host.identifier);
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Call from `disconnect()`: runs `teardown` synchronously on a definite
|
|
37
|
-
* detach (fast path), otherwise defers it one microtask — a reconnect
|
|
38
|
-
* ({@link cancel} from `connect()`) keeps the state, no reconnect runs it.
|
|
39
|
-
* One microtask is the whole probe window: Stimulus reconnects a moved
|
|
40
|
-
* element within the same mutation batch, before the checkpoint drains.
|
|
41
|
-
*/
|
|
14
|
+
return !host.element.isConnected || !_DetachGate.#listed(host);
|
|
15
|
+
}
|
|
42
16
|
disconnected(host, teardown) {
|
|
43
|
-
|
|
17
|
+
const carried = _DetachGate.#carried(host);
|
|
18
|
+
if (!carried && _DetachGate.isDetached(host)) {
|
|
44
19
|
this.#pending = false;
|
|
45
20
|
teardown();
|
|
46
21
|
return;
|
|
47
22
|
}
|
|
48
23
|
this.#pending = true;
|
|
49
|
-
|
|
24
|
+
const probe = () => {
|
|
50
25
|
if (!this.#pending) return;
|
|
51
26
|
this.#pending = false;
|
|
52
27
|
teardown();
|
|
53
|
-
}
|
|
28
|
+
};
|
|
29
|
+
if (carried) setTimeout(probe, 0);
|
|
30
|
+
else queueMicrotask(probe);
|
|
31
|
+
}
|
|
32
|
+
static #carried(host) {
|
|
33
|
+
const element = host.element;
|
|
34
|
+
return !element.isConnected && element.closest("[data-turbo-permanent]") !== null && _DetachGate.#listed(host);
|
|
35
|
+
}
|
|
36
|
+
static #listed(host) {
|
|
37
|
+
const tokens = (host.element.getAttribute("data-controller") ?? "").split(/\s+/);
|
|
38
|
+
return tokens.includes(host.identifier);
|
|
54
39
|
}
|
|
55
|
-
/**
|
|
56
|
-
* Disarms a pending probe. Call from `connect()` (the reconnect that proves
|
|
57
|
-
* an in-page move) and from the head of any teardown path not routed through
|
|
58
|
-
* {@link disconnected} (disabled-toggle, Escape), so an orphaned probe can
|
|
59
|
-
* never run the teardown a second time.
|
|
60
|
-
*/
|
|
61
40
|
cancel() {
|
|
62
41
|
this.#pending = false;
|
|
63
42
|
}
|
|
64
43
|
};
|
|
65
44
|
|
|
66
|
-
// src/utils/event_owner.ts
|
|
67
45
|
function ownerIndex(candidates, node) {
|
|
68
46
|
if (!(node instanceof Node)) return -1;
|
|
69
47
|
return candidates.findIndex((candidate) => candidate.contains(node));
|
|
@@ -72,7 +50,115 @@ function ownerOf(candidates, node) {
|
|
|
72
50
|
return candidates[ownerIndex(candidates, node)] ?? null;
|
|
73
51
|
}
|
|
74
52
|
|
|
75
|
-
|
|
53
|
+
var ListenerSet = class {
|
|
54
|
+
#abort = new AbortController();
|
|
55
|
+
add(target, type, handler, options) {
|
|
56
|
+
target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
|
|
57
|
+
}
|
|
58
|
+
dispose() {
|
|
59
|
+
this.#abort.abort();
|
|
60
|
+
this.#abort = new AbortController();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
var MicrotaskCoalescer = class {
|
|
65
|
+
#run;
|
|
66
|
+
#queued = false;
|
|
67
|
+
#active = false;
|
|
68
|
+
#generation = 0;
|
|
69
|
+
constructor(run) {
|
|
70
|
+
this.#run = run;
|
|
71
|
+
}
|
|
72
|
+
activate() {
|
|
73
|
+
this.#active = true;
|
|
74
|
+
}
|
|
75
|
+
cancel() {
|
|
76
|
+
this.#active = false;
|
|
77
|
+
this.#queued = false;
|
|
78
|
+
this.#generation += 1;
|
|
79
|
+
}
|
|
80
|
+
schedule() {
|
|
81
|
+
if (!this.#active || this.#queued) return;
|
|
82
|
+
this.#queued = true;
|
|
83
|
+
const generation = this.#generation;
|
|
84
|
+
queueMicrotask(() => {
|
|
85
|
+
if (generation !== this.#generation || !this.#queued || !this.#active) return;
|
|
86
|
+
this.#queued = false;
|
|
87
|
+
this.#run();
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
var MorphRenderWatcher = class {
|
|
93
|
+
#listeners = new ListenerSet();
|
|
94
|
+
#pass;
|
|
95
|
+
#element = null;
|
|
96
|
+
#onMorph = () => this.#pass.schedule();
|
|
97
|
+
constructor(run) {
|
|
98
|
+
this.#pass = new MicrotaskCoalescer(run);
|
|
99
|
+
}
|
|
100
|
+
observe(element) {
|
|
101
|
+
if (this.#element === element) return;
|
|
102
|
+
this.disconnect();
|
|
103
|
+
this.#element = element;
|
|
104
|
+
this.#pass.activate();
|
|
105
|
+
this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
|
|
106
|
+
}
|
|
107
|
+
schedule() {
|
|
108
|
+
this.#pass.schedule();
|
|
109
|
+
}
|
|
110
|
+
disconnect() {
|
|
111
|
+
this.#listeners.dispose();
|
|
112
|
+
this.#pass.cancel();
|
|
113
|
+
this.#element = null;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
var NUMBER_BOUNDS = {
|
|
118
|
+
nonNegative: { finite: true, min: 0 },
|
|
119
|
+
positive: { finite: true, exclusiveMin: 0 }};
|
|
120
|
+
function matchesNumberBounds(value, bounds) {
|
|
121
|
+
if (!Number.isFinite(value)) {
|
|
122
|
+
const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
|
|
123
|
+
if (direction === null) return false;
|
|
124
|
+
if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
|
|
125
|
+
}
|
|
126
|
+
if (bounds.min !== void 0 && value < bounds.min) return false;
|
|
127
|
+
if (bounds.max !== void 0 && value > bounds.max) return false;
|
|
128
|
+
if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
|
|
129
|
+
if (bounds.integer && !Number.isInteger(value)) return false;
|
|
130
|
+
if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function readNumber(raw, fallback, bounds) {
|
|
135
|
+
return matchesNumberBounds(raw, bounds) ? raw : fallback;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
var NumberValueReader = class {
|
|
139
|
+
#lastRejected = /* @__PURE__ */ new Map();
|
|
140
|
+
read(owner, name, raw, fallback, bounds) {
|
|
141
|
+
const resolved = readNumber(raw, fallback, bounds);
|
|
142
|
+
if (matchesNumberBounds(raw, bounds)) {
|
|
143
|
+
this.#lastRejected.delete(name);
|
|
144
|
+
return resolved;
|
|
145
|
+
}
|
|
146
|
+
const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
|
|
147
|
+
const literal = owner.element.getAttribute(attribute);
|
|
148
|
+
if (literal === null) {
|
|
149
|
+
this.#lastRejected.delete(name);
|
|
150
|
+
return resolved;
|
|
151
|
+
}
|
|
152
|
+
if (this.#lastRejected.get(name) !== literal) {
|
|
153
|
+
this.#lastRejected.set(name, literal);
|
|
154
|
+
console.warn(
|
|
155
|
+
`Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
return resolved;
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
76
162
|
var OwnedPointerSession = class {
|
|
77
163
|
#pointerId;
|
|
78
164
|
#owner;
|
|
@@ -92,7 +178,6 @@ var OwnedPointerSession = class {
|
|
|
92
178
|
} catch {
|
|
93
179
|
}
|
|
94
180
|
}
|
|
95
|
-
/** Releases capture and listeners, then reports the end exactly once. */
|
|
96
181
|
end() {
|
|
97
182
|
this.#finish("teardown");
|
|
98
183
|
}
|
|
@@ -117,23 +202,21 @@ var OwnedPointerSession = class {
|
|
|
117
202
|
};
|
|
118
203
|
};
|
|
119
204
|
|
|
120
|
-
// src/utils/transient_hooks.ts
|
|
121
205
|
var TransientHooks = class {
|
|
122
206
|
#attributes;
|
|
123
207
|
constructor(options) {
|
|
124
208
|
this.#attributes = options.attributes;
|
|
125
209
|
}
|
|
126
|
-
/** Drops the declared hooks from `element`; what it carries besides stays. */
|
|
127
210
|
reset(element) {
|
|
128
211
|
for (const attribute of this.#attributes) element.removeAttribute(attribute);
|
|
129
212
|
}
|
|
130
213
|
};
|
|
131
214
|
|
|
132
|
-
// src/controllers/pointer_drag_controller.ts
|
|
133
215
|
var TRANSIENT_DRAG = new TransientHooks({ attributes: ["data-dragging"] });
|
|
134
216
|
var TRANSIENT_GRAB = new TransientHooks({ attributes: ["data-grabbed"] });
|
|
135
217
|
var NATIVE_KEY_OWNERS = "input, textarea, select, button, a[href], summary, [contenteditable]";
|
|
136
218
|
var PointerDragController = class _PointerDragController extends Controller {
|
|
219
|
+
#numbers = new NumberValueReader();
|
|
137
220
|
static targets = ["handle"];
|
|
138
221
|
static values = {
|
|
139
222
|
axis: { type: String, default: "both" },
|
|
@@ -142,30 +225,36 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
142
225
|
disabled: { type: Boolean, default: false },
|
|
143
226
|
follow: { type: Boolean, default: false }
|
|
144
227
|
};
|
|
228
|
+
static valueConstraints = {
|
|
229
|
+
threshold: NUMBER_BOUNDS.nonNegative,
|
|
230
|
+
keyboardStep: NUMBER_BOUNDS.positive
|
|
231
|
+
};
|
|
145
232
|
static actions = ["reset"];
|
|
146
233
|
static events = ["start", "move", "end", "cancel"];
|
|
147
|
-
/** Marker attribute recording that this controller set the touch-action. */
|
|
148
234
|
static #TOUCH_ACTION_MARKER = "data-pointer-drag-touch-action";
|
|
149
|
-
/** Marker attribute recording that this controller set `tabindex`. */
|
|
150
235
|
static #TABINDEX_MARKER = "data-pointer-drag-tabindex";
|
|
151
236
|
#pointer = null;
|
|
152
237
|
#keyboard = null;
|
|
153
|
-
/** Committed follow offset from past drops; a new drag's deltas add onto it. */
|
|
154
238
|
#followBase = { x: 0, y: 0 };
|
|
155
|
-
|
|
239
|
+
#gestureFollows = false;
|
|
240
|
+
#followOutput = null;
|
|
156
241
|
#gate = new DetachGate();
|
|
242
|
+
#morphRender = new MorphRenderWatcher(() => {
|
|
243
|
+
for (const handle of this.#handles()) this.#prepareHandle(handle);
|
|
244
|
+
this.#reflectSession();
|
|
245
|
+
});
|
|
157
246
|
connect() {
|
|
247
|
+
this.#morphRender.observe(this.element);
|
|
248
|
+
if (!this.#pointer && !this.#keyboard) this.#followOutput = null;
|
|
158
249
|
this.#gate.cancel();
|
|
159
250
|
if (!this.#pointer) TRANSIENT_DRAG.reset(this.element);
|
|
160
251
|
if (!this.#keyboard) TRANSIENT_GRAB.reset(this.element);
|
|
161
|
-
if (this.followValue && !this.#pointer && !this.#keyboard) {
|
|
162
|
-
this.#followBase = this.#parseFollowBase();
|
|
163
|
-
}
|
|
164
252
|
this.element.addEventListener("pointerdown", this.#onPointerDown);
|
|
165
253
|
this.element.addEventListener("keydown", this.#onKeydown);
|
|
166
254
|
if (!this.hasHandleTarget) this.#prepareHandle(this.element);
|
|
167
255
|
}
|
|
168
256
|
disconnect() {
|
|
257
|
+
this.#morphRender.disconnect();
|
|
169
258
|
this.element.removeEventListener("pointerdown", this.#onPointerDown);
|
|
170
259
|
this.element.removeEventListener("keydown", this.#onKeydown);
|
|
171
260
|
if (this.#pointer || this.#keyboard) {
|
|
@@ -174,16 +263,6 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
174
263
|
}
|
|
175
264
|
this.#teardown();
|
|
176
265
|
}
|
|
177
|
-
/**
|
|
178
|
-
* Returns the element to its origin: drops the committed follow offset and the
|
|
179
|
-
* inline `translate` that carries it.
|
|
180
|
-
*
|
|
181
|
-
* In follow mode the inline `translate` belongs to this controller, and the
|
|
182
|
-
* committed offset lives in a field the DOM cannot reach — so a consumer that
|
|
183
|
-
* wants the element back at the start, or that has written a position of its
|
|
184
|
-
* own, needs this to make the two agree again. An in-flight drag is cancelled
|
|
185
|
-
* first, or its deltas would land on top of the offset just cleared.
|
|
186
|
-
*/
|
|
187
266
|
reset() {
|
|
188
267
|
const live = this.#pointer?.started ? this.#pointer.pointerType : this.#keyboard ? "keyboard" : null;
|
|
189
268
|
if (this.#pointer || this.#keyboard) this.#teardownSessions();
|
|
@@ -204,13 +283,6 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
204
283
|
if (!this.hasHandleTarget) this.#prepareHandle(this.element);
|
|
205
284
|
if (interrupted) this.#dispatchCancel(interrupted);
|
|
206
285
|
}
|
|
207
|
-
/**
|
|
208
|
-
* Re-derives the handles' touch-action when the axis changes.
|
|
209
|
-
*
|
|
210
|
-
* Two layers, like the `tabindex` loan: the marker says the value was once
|
|
211
|
-
* ours, and the current inline value says it still is. A consumer that wrote
|
|
212
|
-
* its own `touch-action` after connect keeps it.
|
|
213
|
-
*/
|
|
214
286
|
axisValueChanged(_value, previousValue) {
|
|
215
287
|
const lent = this.#touchActionFor(previousValue ?? this.axisValue);
|
|
216
288
|
for (const handle of this.#handles()) {
|
|
@@ -219,7 +291,6 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
219
291
|
handle.style.touchAction = this.#touchActionForAxis();
|
|
220
292
|
}
|
|
221
293
|
}
|
|
222
|
-
/** Cancels any in-flight session when the controller is disabled mid-drag. */
|
|
223
294
|
disabledValueChanged() {
|
|
224
295
|
if (!this.disabledValue) return;
|
|
225
296
|
if (this.#pointer?.started || this.#keyboard) {
|
|
@@ -227,17 +298,13 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
227
298
|
}
|
|
228
299
|
this.#teardownSessions();
|
|
229
300
|
}
|
|
230
|
-
/**
|
|
231
|
-
* Arms a pointer drag on a handle; `start` waits for the threshold.
|
|
232
|
-
*
|
|
233
|
-
* @stimeoRuntimeOnly `disabled` decides whether this one pointer press starts a gesture.
|
|
234
|
-
*/
|
|
235
301
|
#onPointerDown = (event) => {
|
|
236
302
|
if (this.disabledValue || this.#pointer || this.#keyboard || event.button !== 0) return;
|
|
237
303
|
const handle = this.#handleFor(event.target);
|
|
238
304
|
if (!handle) return;
|
|
239
305
|
event.preventDefault();
|
|
240
306
|
handle.focus();
|
|
307
|
+
this.#beginGesture();
|
|
241
308
|
const session = {
|
|
242
309
|
pointer: null,
|
|
243
310
|
handle,
|
|
@@ -254,18 +321,13 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
254
321
|
});
|
|
255
322
|
this.#pointer = session;
|
|
256
323
|
};
|
|
257
|
-
/**
|
|
258
|
-
* Applies one tracked move: threshold, hooks, follow offset, events.
|
|
259
|
-
*
|
|
260
|
-
* @stimeoRuntimeOnly `threshold` decides when this one pointer move starts the drag.
|
|
261
|
-
*/
|
|
262
324
|
#trackMove(session, event) {
|
|
263
325
|
const [dx, dy] = this.#filterAxis(
|
|
264
326
|
event.clientX - session.originX,
|
|
265
327
|
event.clientY - session.originY
|
|
266
328
|
);
|
|
267
329
|
if (!session.started) {
|
|
268
|
-
if (Math.hypot(dx, dy) < this
|
|
330
|
+
if (Math.hypot(dx, dy) < this.#safeThreshold) return;
|
|
269
331
|
session.started = true;
|
|
270
332
|
this.element.setAttribute("data-dragging", "true");
|
|
271
333
|
this.dispatch("start", {
|
|
@@ -279,13 +341,6 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
279
341
|
detail: { dx, dy, x: event.clientX, y: event.clientY, pointerType: session.pointerType }
|
|
280
342
|
});
|
|
281
343
|
}
|
|
282
|
-
/**
|
|
283
|
-
* Closes the session and reports only the outcome the caller does not own.
|
|
284
|
-
*
|
|
285
|
-
* A teardown (detach, Escape, mid-drag disable, `reset`) is announced by the
|
|
286
|
-
* path that asked for it, so this one stays silent; `pointerup` below the
|
|
287
|
-
* threshold was a plain click, and `pointercancel` is an OS gesture takeover.
|
|
288
|
-
*/
|
|
289
344
|
#finishPointer(session, kind) {
|
|
290
345
|
const { started, dx, dy, pointerType } = session;
|
|
291
346
|
this.#pointer = null;
|
|
@@ -298,12 +353,6 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
298
353
|
}
|
|
299
354
|
this.#dispatchCancel(pointerType);
|
|
300
355
|
}
|
|
301
|
-
/**
|
|
302
|
-
* Keyboard alternative: Space/Enter grab & drop, arrows move, Escape cancels.
|
|
303
|
-
*
|
|
304
|
-
* @stimeoRuntimeOnly `disabled` decides whether this one key is taken and `keyboardStep` is the
|
|
305
|
-
* distance of one keyboard move.
|
|
306
|
-
*/
|
|
307
356
|
#onKeydown = (event) => {
|
|
308
357
|
if (this.disabledValue) return;
|
|
309
358
|
const handle = this.#handleFor(event.target);
|
|
@@ -355,8 +404,8 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
355
404
|
}
|
|
356
405
|
});
|
|
357
406
|
};
|
|
358
|
-
/** Enters the grabbed mode: `data-grabbed` on element + handle, then `start`. */
|
|
359
407
|
#grabKeyboard(handle) {
|
|
408
|
+
this.#beginGesture();
|
|
360
409
|
this.#keyboard = { handle, dx: 0, dy: 0 };
|
|
361
410
|
this.element.setAttribute("data-grabbed", "true");
|
|
362
411
|
handle.setAttribute("data-grabbed", "true");
|
|
@@ -369,9 +418,8 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
369
418
|
this.#followCommit(session.dx, session.dy);
|
|
370
419
|
this.dispatch("end", { detail: { dx: session.dx, dy: session.dy, pointerType: "keyboard" } });
|
|
371
420
|
}
|
|
372
|
-
/** Maps an arrow key to a raw (unfiltered) `keyboardStep` delta. */
|
|
373
421
|
#keyboardDelta(key) {
|
|
374
|
-
const step = this
|
|
422
|
+
const step = this.#safeKeyboardStep;
|
|
375
423
|
switch (key) {
|
|
376
424
|
case "ArrowRight":
|
|
377
425
|
return [step, 0];
|
|
@@ -385,17 +433,11 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
385
433
|
return null;
|
|
386
434
|
}
|
|
387
435
|
}
|
|
388
|
-
/**
|
|
389
|
-
* Zeroes the delta on the locked axis (`axis` = x | y | both).
|
|
390
|
-
*
|
|
391
|
-
* @stimeoRuntimeOnly `axis` filters the offset of one move to the allowed direction.
|
|
392
|
-
*/
|
|
393
436
|
#filterAxis(dx, dy) {
|
|
394
437
|
if (this.axisValue === "x") return [dx, 0];
|
|
395
438
|
if (this.axisValue === "y") return [0, dy];
|
|
396
439
|
return [dx, dy];
|
|
397
440
|
}
|
|
398
|
-
/** Silently closes a live pointer session; the caller announces the outcome. */
|
|
399
441
|
#endPointerSession() {
|
|
400
442
|
this.#pointer?.pointer?.end();
|
|
401
443
|
}
|
|
@@ -404,28 +446,13 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
404
446
|
this.#keyboard = null;
|
|
405
447
|
this.element.removeAttribute("data-grabbed");
|
|
406
448
|
}
|
|
407
|
-
/**
|
|
408
|
-
* Full teardown for a controller whose element is going away or lost its
|
|
409
|
-
* controller. Into a dead (detached) tree it is silent — consumers restore
|
|
410
|
-
* from their own `connect()`, not from a cancel event. But a detach that
|
|
411
|
-
* KEEPS the element (Turbo morph, `data-controller` removed) leaves the
|
|
412
|
-
* consumers alive and listening: an in-flight session must end in `cancel`
|
|
413
|
-
* there, or a composer like sortable strands its one-at-a-time session
|
|
414
|
-
* bookkeeping forever.
|
|
415
|
-
*/
|
|
416
449
|
#teardown() {
|
|
417
|
-
this.#gate.cancel();
|
|
418
450
|
const interrupted = this.#pointer?.started ? this.#pointer.pointerType : this.#keyboard ? "keyboard" : null;
|
|
419
451
|
this.#teardownSessions();
|
|
420
452
|
for (const handle of this.#handles()) this.#restoreHandle(handle);
|
|
421
|
-
this.#followReset();
|
|
453
|
+
if (interrupted) this.#followReset();
|
|
422
454
|
if (interrupted && this.element.isConnected) this.#dispatchCancel(interrupted);
|
|
423
455
|
}
|
|
424
|
-
/**
|
|
425
|
-
* Silently tears down whatever session is live (disconnect / disabled /
|
|
426
|
-
* Escape). Composed from the two single-session teardowns so pointer and
|
|
427
|
-
* keyboard cleanup cannot diverge as either path evolves.
|
|
428
|
-
*/
|
|
429
456
|
#teardownSessions() {
|
|
430
457
|
this.#endPointerSession();
|
|
431
458
|
this.#clearKeyboardSession();
|
|
@@ -434,63 +461,52 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
434
461
|
this.#followReset();
|
|
435
462
|
this.dispatch("cancel", { detail: { pointerType } });
|
|
436
463
|
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
* offset itself comes from the gesture.
|
|
442
|
-
*/
|
|
464
|
+
#beginGesture() {
|
|
465
|
+
this.#gestureFollows = this.followValue;
|
|
466
|
+
if (this.#gestureFollows) this.#followBase = this.#parseFollowBase();
|
|
467
|
+
}
|
|
443
468
|
#followMove(dx, dy) {
|
|
444
|
-
if (!this
|
|
469
|
+
if (!this.#gestureFollows) return;
|
|
445
470
|
this.#applyFollow(this.#followBase.x + dx, this.#followBase.y + dy);
|
|
446
471
|
}
|
|
447
|
-
/**
|
|
448
|
-
* Folds a drop's deltas into the committed base offset (follow only).
|
|
449
|
-
*
|
|
450
|
-
* @stimeoRuntimeOnly `follow` decides whether the end of this one gesture keeps the offset as a
|
|
451
|
-
* translate.
|
|
452
|
-
*/
|
|
453
472
|
#followCommit(dx, dy) {
|
|
454
|
-
if (!this
|
|
473
|
+
if (!this.#gestureFollows) return;
|
|
455
474
|
this.#followBase = { x: this.#followBase.x + dx, y: this.#followBase.y + dy };
|
|
456
475
|
this.#applyFollow(this.#followBase.x, this.#followBase.y);
|
|
457
476
|
}
|
|
458
|
-
/**
|
|
459
|
-
* Snaps back to the committed position (follow only) — the cancel contract.
|
|
460
|
-
*
|
|
461
|
-
* @stimeoRuntimeOnly `follow` decides whether cancelling this one gesture clears the translate it
|
|
462
|
-
* wrote.
|
|
463
|
-
*/
|
|
464
477
|
#followReset() {
|
|
465
|
-
if (!this
|
|
478
|
+
if (!this.#gestureFollows) return;
|
|
466
479
|
this.#applyFollow(this.#followBase.x, this.#followBase.y);
|
|
467
480
|
}
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
481
|
+
#reflectSession() {
|
|
482
|
+
if (this.#pointer?.started) this.element.setAttribute("data-dragging", "true");
|
|
483
|
+
else this.element.removeAttribute("data-dragging");
|
|
484
|
+
if (this.#keyboard) {
|
|
485
|
+
this.element.setAttribute("data-grabbed", "true");
|
|
486
|
+
this.#keyboard.handle.setAttribute("data-grabbed", "true");
|
|
487
|
+
} else {
|
|
488
|
+
this.element.removeAttribute("data-grabbed");
|
|
489
|
+
for (const handle of this.#handles()) handle.removeAttribute("data-grabbed");
|
|
490
|
+
}
|
|
491
|
+
const follows = this.#pointer || this.#keyboard ? this.#gestureFollows : this.followValue;
|
|
492
|
+
if (follows && this.#followOutput) {
|
|
493
|
+
this.#applyFollow(this.#followOutput.x, this.#followOutput.y);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
473
496
|
#applyFollow(x, y) {
|
|
497
|
+
this.#followOutput = { x, y };
|
|
474
498
|
if (x === 0 && y === 0) this.element.style.removeProperty("translate");
|
|
475
499
|
else this.element.style.setProperty("translate", `${x}px ${y}px`);
|
|
476
500
|
}
|
|
477
|
-
/**
|
|
478
|
-
* Reads a committed follow offset back from the inline `translate`. Only the
|
|
479
|
-
* controller's own `<x>px <y>px` shape is recognized; anything else (an
|
|
480
|
-
* authored percentage, `none`, an empty string) starts the base at 0 — follow
|
|
481
|
-
* mode owns this property, per the class contract.
|
|
482
|
-
*/
|
|
483
501
|
#parseFollowBase() {
|
|
484
502
|
const raw = this.element.style.getPropertyValue("translate").trim();
|
|
485
503
|
const match = /^(-?\d+(?:\.\d+)?)px(?:\s+(-?\d+(?:\.\d+)?)px)?$/.exec(raw);
|
|
486
504
|
if (!match) return { x: 0, y: 0 };
|
|
487
505
|
return { x: Number(match[1]), y: Number(match[2] ?? "0") };
|
|
488
506
|
}
|
|
489
|
-
/** The active handles: the `handle` targets, else the element itself. */
|
|
490
507
|
#handles() {
|
|
491
508
|
return this.hasHandleTarget ? this.handleTargets : [this.element];
|
|
492
509
|
}
|
|
493
|
-
/** Resolves the handle owning an event target (the handle or a descendant). */
|
|
494
510
|
#handleFor(target) {
|
|
495
511
|
return ownerOf(this.#handles(), target);
|
|
496
512
|
}
|
|
@@ -499,25 +515,14 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
499
515
|
if (type === "touch" || type === "pen") return type;
|
|
500
516
|
return "mouse";
|
|
501
517
|
}
|
|
502
|
-
/** `touch-action` that lets the page keep panning on the locked axis only. */
|
|
503
518
|
#touchActionForAxis() {
|
|
504
519
|
return this.#touchActionFor(this.axisValue);
|
|
505
520
|
}
|
|
506
|
-
/** The `touch-action` an `axis` declaration lends, for any axis value. */
|
|
507
521
|
#touchActionFor(axis) {
|
|
508
522
|
if (axis === "x") return "pan-y";
|
|
509
523
|
if (axis === "y") return "pan-x";
|
|
510
524
|
return "none";
|
|
511
525
|
}
|
|
512
|
-
/**
|
|
513
|
-
* Establishes the handle contract: a `touch-action` derived from `axis`
|
|
514
|
-
* (marker-guarded so an authored inline value wins and reconnects stay
|
|
515
|
-
* idempotent) and focusability for the keyboard path (`tabindex="0"` only when
|
|
516
|
-
* the author supplied none — prefer a real `<button>` handle). Both additions
|
|
517
|
-
* are marker-owned so `#restoreHandle` reverts them symmetrically on teardown.
|
|
518
|
-
*
|
|
519
|
-
* @stimeoRenderRoot
|
|
520
|
-
*/
|
|
521
526
|
#prepareHandle(handle) {
|
|
522
527
|
const lent = this.#touchActionForAxis();
|
|
523
528
|
const marked = handle.hasAttribute(_PointerDragController.#TOUCH_ACTION_MARKER);
|
|
@@ -530,12 +535,10 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
530
535
|
handle.setAttribute(_PointerDragController.#TABINDEX_MARKER, "true");
|
|
531
536
|
}
|
|
532
537
|
}
|
|
533
|
-
/** Whether the key belongs to a native control or editing surface in the handle. */
|
|
534
538
|
#ownsNativeKeys(target, handle) {
|
|
535
539
|
const owner = target?.closest(NATIVE_KEY_OWNERS) ?? null;
|
|
536
540
|
return owner !== null && owner !== handle && handle.contains(owner);
|
|
537
541
|
}
|
|
538
|
-
/** Reverts the marker-owned touch-action + tabindex (authored values untouched). */
|
|
539
542
|
#restoreHandle(handle) {
|
|
540
543
|
if (handle.hasAttribute(_PointerDragController.#TOUCH_ACTION_MARKER)) {
|
|
541
544
|
if (handle.style.touchAction === this.#touchActionForAxis()) {
|
|
@@ -553,8 +556,25 @@ var PointerDragController = class _PointerDragController extends Controller {
|
|
|
553
556
|
if (!ours) handle.removeAttribute(_PointerDragController.#TABINDEX_MARKER);
|
|
554
557
|
}
|
|
555
558
|
}
|
|
559
|
+
get #safeThreshold() {
|
|
560
|
+
return this.#numbers.read(
|
|
561
|
+
this,
|
|
562
|
+
"threshold",
|
|
563
|
+
this.thresholdValue,
|
|
564
|
+
_PointerDragController.values.threshold.default,
|
|
565
|
+
_PointerDragController.valueConstraints.threshold
|
|
566
|
+
);
|
|
567
|
+
}
|
|
568
|
+
get #safeKeyboardStep() {
|
|
569
|
+
return this.#numbers.read(
|
|
570
|
+
this,
|
|
571
|
+
"keyboardStep",
|
|
572
|
+
this.keyboardStepValue,
|
|
573
|
+
_PointerDragController.values.keyboardStep.default,
|
|
574
|
+
_PointerDragController.valueConstraints.keyboardStep
|
|
575
|
+
);
|
|
576
|
+
}
|
|
556
577
|
};
|
|
557
578
|
|
|
558
579
|
export { PointerDragController };
|
|
559
|
-
//# sourceMappingURL=pointer_drag_controller.js.map
|
|
560
580
|
//# sourceMappingURL=pointer_drag_controller.js.map
|