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
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var FOCUS_EVENTS = /* @__PURE__ */ new Set(["blur", "focus", "focusin", "focusout"]);
|
|
4
|
+
var POINTER_EVENTS = /* @__PURE__ */ new Set(["mouseenter", "mouseleave", "pointerenter", "pointerleave"]);
|
|
5
|
+
function stateReasonFor(event) {
|
|
6
|
+
if (!event) return "api";
|
|
7
|
+
if (FOCUS_EVENTS.has(event.type)) return "focus";
|
|
8
|
+
if (POINTER_EVENTS.has(event.type)) return "pointer";
|
|
9
|
+
return "user";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function actionSource(source) {
|
|
13
|
+
if (source instanceof HTMLElement) {
|
|
14
|
+
return { event: null, host: source, origin: source, reason: "api" };
|
|
15
|
+
}
|
|
16
|
+
const event = source ?? null;
|
|
17
|
+
return {
|
|
18
|
+
event,
|
|
19
|
+
host: event?.currentTarget instanceof Element ? event.currentTarget : null,
|
|
20
|
+
origin: event?.target instanceof Element ? event.target : null,
|
|
21
|
+
reason: stateReasonFor(event)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
4
24
|
|
|
5
|
-
// src/utils/focus_candidate.ts
|
|
6
25
|
function inheritsFieldsetDisabled(control) {
|
|
7
26
|
let fieldset = control.closest("fieldset[disabled]");
|
|
8
27
|
while (fieldset) {
|
|
@@ -12,35 +31,60 @@ function inheritsFieldsetDisabled(control) {
|
|
|
12
31
|
}
|
|
13
32
|
return false;
|
|
14
33
|
}
|
|
34
|
+
function unslotted(element) {
|
|
35
|
+
return element.assignedSlot === null && element.parentElement?.shadowRoot != null;
|
|
36
|
+
}
|
|
37
|
+
function flatTreeParent(element) {
|
|
38
|
+
if (unslotted(element)) return null;
|
|
39
|
+
const parent = element.assignedSlot ?? element.parentNode;
|
|
40
|
+
if (parent instanceof ShadowRoot) return parent.host;
|
|
41
|
+
return parent instanceof Element ? parent : null;
|
|
42
|
+
}
|
|
15
43
|
function canTakeFocus(element) {
|
|
16
|
-
|
|
44
|
+
for (let node = element; node; node = flatTreeParent(node)) {
|
|
45
|
+
if (unslotted(node) || node.matches("[hidden], [inert]")) return false;
|
|
46
|
+
}
|
|
17
47
|
if (element instanceof HTMLInputElement && element.type === "hidden") return false;
|
|
18
48
|
if (!("disabled" in element)) return true;
|
|
19
49
|
if (element.disabled) return false;
|
|
20
50
|
return !inheritsFieldsetDisabled(element);
|
|
21
51
|
}
|
|
52
|
+
function deepActiveElement(ownerDocument) {
|
|
53
|
+
let active = ownerDocument.activeElement;
|
|
54
|
+
while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;
|
|
55
|
+
return active;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
var ListenerSet = class {
|
|
59
|
+
#abort = new AbortController();
|
|
60
|
+
add(target, type, handler, options) {
|
|
61
|
+
target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
|
|
62
|
+
}
|
|
63
|
+
dispose() {
|
|
64
|
+
this.#abort.abort();
|
|
65
|
+
this.#abort = new AbortController();
|
|
66
|
+
}
|
|
67
|
+
};
|
|
22
68
|
|
|
23
|
-
// src/utils/microtask_coalescer.ts
|
|
24
69
|
var MicrotaskCoalescer = class {
|
|
25
70
|
#run;
|
|
26
71
|
#queued = false;
|
|
27
72
|
#active = false;
|
|
28
73
|
#generation = 0;
|
|
29
|
-
/** @param run - the single reconciliation pass, invoked at most once per batch. */
|
|
30
74
|
constructor(run) {
|
|
31
75
|
this.#run = run;
|
|
32
76
|
}
|
|
33
|
-
/** Opens the window in which {@link schedule} is honoured; call from `connect()`. */
|
|
34
77
|
activate() {
|
|
35
78
|
this.#active = true;
|
|
36
79
|
}
|
|
37
|
-
/** Closes the window and drops any pending pass; call from `disconnect()`. */
|
|
38
80
|
cancel() {
|
|
39
81
|
this.#active = false;
|
|
40
82
|
this.#queued = false;
|
|
41
83
|
this.#generation += 1;
|
|
42
84
|
}
|
|
43
|
-
|
|
85
|
+
get pending() {
|
|
86
|
+
return this.#queued;
|
|
87
|
+
}
|
|
44
88
|
schedule() {
|
|
45
89
|
if (!this.#active || this.#queued) return;
|
|
46
90
|
this.#queued = true;
|
|
@@ -53,171 +97,329 @@ var MicrotaskCoalescer = class {
|
|
|
53
97
|
}
|
|
54
98
|
};
|
|
55
99
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
};
|
|
64
|
-
#rewind;
|
|
65
|
-
/** @param rewind - the pass that returns this controller's state to its initial form. */
|
|
66
|
-
constructor(rewind) {
|
|
67
|
-
this.#rewind = rewind;
|
|
100
|
+
var MorphRenderWatcher = class {
|
|
101
|
+
#listeners = new ListenerSet();
|
|
102
|
+
#pass;
|
|
103
|
+
#element = null;
|
|
104
|
+
#onMorph = () => this.#pass.schedule();
|
|
105
|
+
constructor(run) {
|
|
106
|
+
this.#pass = new MicrotaskCoalescer(run);
|
|
68
107
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
108
|
+
observe(element) {
|
|
109
|
+
if (this.#element === element) return;
|
|
110
|
+
this.disconnect();
|
|
111
|
+
this.#element = element;
|
|
112
|
+
this.#pass.activate();
|
|
113
|
+
this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
|
|
76
114
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
115
|
+
schedule() {
|
|
116
|
+
this.#pass.schedule();
|
|
117
|
+
}
|
|
118
|
+
get pending() {
|
|
119
|
+
return this.#pass.pending;
|
|
120
|
+
}
|
|
121
|
+
disconnect() {
|
|
122
|
+
this.#listeners.dispose();
|
|
123
|
+
this.#pass.cancel();
|
|
124
|
+
this.#element = null;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
var MoveCounter = class {
|
|
129
|
+
#sequence = 0;
|
|
130
|
+
record() {
|
|
131
|
+
this.#sequence += 1;
|
|
132
|
+
return this.#sequence;
|
|
133
|
+
}
|
|
134
|
+
isLatest(token) {
|
|
135
|
+
return token === this.#sequence;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
var NUMBER_BOUNDS = {
|
|
140
|
+
finite: { finite: true }};
|
|
141
|
+
function matchesNumberBounds(value, bounds) {
|
|
142
|
+
if (!Number.isFinite(value)) {
|
|
143
|
+
const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
|
|
144
|
+
if (direction === null) return false;
|
|
145
|
+
if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
|
|
146
|
+
}
|
|
147
|
+
if (bounds.min !== void 0 && value < bounds.min) return false;
|
|
148
|
+
if (bounds.max !== void 0 && value > bounds.max) return false;
|
|
149
|
+
if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
|
|
150
|
+
if (bounds.integer && !Number.isInteger(value)) return false;
|
|
151
|
+
if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function readNumber(raw, fallback, bounds) {
|
|
156
|
+
return matchesNumberBounds(raw, bounds) ? raw : fallback;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
var NumberValueReader = class {
|
|
160
|
+
#lastRejected = /* @__PURE__ */ new Map();
|
|
161
|
+
read(owner, name, raw, fallback, bounds) {
|
|
162
|
+
const resolved = readNumber(raw, fallback, bounds);
|
|
163
|
+
if (matchesNumberBounds(raw, bounds)) {
|
|
164
|
+
this.#lastRejected.delete(name);
|
|
165
|
+
return resolved;
|
|
166
|
+
}
|
|
167
|
+
const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
|
|
168
|
+
const literal = owner.element.getAttribute(attribute);
|
|
169
|
+
if (literal === null) {
|
|
170
|
+
this.#lastRejected.delete(name);
|
|
171
|
+
return resolved;
|
|
172
|
+
}
|
|
173
|
+
if (this.#lastRejected.get(name) !== literal) {
|
|
174
|
+
this.#lastRejected.set(name, literal);
|
|
175
|
+
console.warn(
|
|
176
|
+
`Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
return resolved;
|
|
82
180
|
}
|
|
83
181
|
};
|
|
84
182
|
|
|
85
|
-
|
|
86
|
-
|
|
183
|
+
function setAttributeIfChanged(element, name, value, beforeWrite) {
|
|
184
|
+
if (element.getAttribute(name) === value) return false;
|
|
185
|
+
if (value === null) element.removeAttribute(name);
|
|
186
|
+
else element.setAttribute(name, value);
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function queryOpenDescendants(root, selector) {
|
|
191
|
+
const matches = [];
|
|
192
|
+
const roots = [root];
|
|
193
|
+
for (const scope of roots) {
|
|
194
|
+
matches.push(...scope.querySelectorAll(selector));
|
|
195
|
+
if (scope.nodeType === Node.ELEMENT_NODE) {
|
|
196
|
+
const shadow = scope.shadowRoot;
|
|
197
|
+
if (shadow) roots.push(shadow);
|
|
198
|
+
}
|
|
199
|
+
for (const element of scope.querySelectorAll("*")) {
|
|
200
|
+
if (element.shadowRoot) roots.push(element.shadowRoot);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return matches;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function sharedRegistry(key, create) {
|
|
207
|
+
const symbol = Symbol.for(key);
|
|
208
|
+
const scope = globalThis;
|
|
209
|
+
const existing = scope[symbol];
|
|
210
|
+
if (existing !== void 0) return existing;
|
|
211
|
+
const registry = create();
|
|
212
|
+
Object.defineProperty(globalThis, symbol, { value: registry });
|
|
213
|
+
return registry;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function holdsFocus(element) {
|
|
217
|
+
return element.matches(":focus") || deepActiveElement(element.ownerDocument) === element;
|
|
218
|
+
}
|
|
219
|
+
var TabindexLoan = class _TabindexLoan {
|
|
220
|
+
static #registry = sharedRegistry(
|
|
221
|
+
"stimeo-ui.tabindex-loan.registry.v1",
|
|
222
|
+
() => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Set() })
|
|
223
|
+
);
|
|
87
224
|
#value;
|
|
225
|
+
#record;
|
|
226
|
+
#preserveFocus;
|
|
88
227
|
#lent = /* @__PURE__ */ new Set();
|
|
89
|
-
|
|
90
|
-
#beforeCache = new BeforeCacheReset(() => this.returnAll());
|
|
91
|
-
/**
|
|
92
|
-
* @param value - the `tabindex` to lend. `"-1"` (the default) is
|
|
93
|
-
* programmatically focusable but not a Tab stop; `"0"` is a real Tab stop,
|
|
94
|
-
* which a scroll region with no focusable content of its own needs.
|
|
95
|
-
*/
|
|
96
|
-
constructor(value = "-1") {
|
|
228
|
+
constructor(value, owner, options = {}) {
|
|
97
229
|
this.#value = value;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
230
|
+
this.#record = `data-${owner}-tabindex-loan`;
|
|
231
|
+
this.#preserveFocus = options.preserveFocus === true;
|
|
232
|
+
_TabindexLoan.#registry.names.add(this.#record);
|
|
233
|
+
}
|
|
234
|
+
lend(element, options = {}) {
|
|
235
|
+
const stack = this.#stack(element);
|
|
236
|
+
const current = element.getAttribute("tabindex");
|
|
237
|
+
const held = stack.find((hold) => hold.loan === this) ?? stack.find(
|
|
238
|
+
(hold) => hold.loan === null && hold.record === this.#record && hold.value === this.#value
|
|
239
|
+
);
|
|
240
|
+
const linked = stack.at(-1)?.value === current;
|
|
241
|
+
if (!held && options.onlyIfUnfocusable && (current !== null || element.tabIndex >= 0)) return;
|
|
242
|
+
if (!held && current !== null && !linked) return;
|
|
103
243
|
this.#lent.add(element);
|
|
104
|
-
|
|
244
|
+
if (held) held.loan = this;
|
|
245
|
+
else stack.push({ loan: this, record: this.#record, value: this.#value, linked });
|
|
246
|
+
this.#mark(element, stack);
|
|
247
|
+
if (current === null || !held && current !== this.#value) {
|
|
248
|
+
element.setAttribute("tabindex", this.#value);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return(element) {
|
|
252
|
+
const stack = this.#stack(element);
|
|
253
|
+
const hold = stack.find((held) => held.loan === this) ?? stack.find(
|
|
254
|
+
(held) => held.loan === null && held.record === this.#record && held.value === this.#value
|
|
255
|
+
);
|
|
256
|
+
if (!hold) return false;
|
|
257
|
+
if (!this.#release(element, stack, hold, this.#preserveFocus)) {
|
|
258
|
+
hold.loan = this;
|
|
259
|
+
this.#lent.add(element);
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
this.#lent.delete(element);
|
|
263
|
+
return true;
|
|
105
264
|
}
|
|
106
|
-
/** Takes back every loan whose value is still the one that was lent. */
|
|
107
265
|
returnAll() {
|
|
108
|
-
for (const element of this.#lent)
|
|
109
|
-
|
|
266
|
+
for (const element of Array.from(this.#lent)) this.return(element);
|
|
267
|
+
}
|
|
268
|
+
reclaim(element) {
|
|
269
|
+
if (element.getAttribute(this.#record) !== this.#value) return;
|
|
270
|
+
const stack = this.#stack(element);
|
|
271
|
+
const hold = stack.find((held) => held.loan === null && held.record === this.#record);
|
|
272
|
+
if (hold && !holdsFocus(element)) this.#release(element, stack, hold);
|
|
273
|
+
}
|
|
274
|
+
reclaimWithin(root) {
|
|
275
|
+
for (const element of queryOpenDescendants(root, `[${this.#record}]`)) {
|
|
276
|
+
this.reclaim(element);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
#stack(element) {
|
|
280
|
+
const stacks = _TabindexLoan.#registry.stacks;
|
|
281
|
+
const stack = stacks.get(element) ?? this.#seed(element);
|
|
282
|
+
stacks.set(element, stack);
|
|
283
|
+
return stack;
|
|
284
|
+
}
|
|
285
|
+
#seed(element) {
|
|
286
|
+
const current = element.getAttribute("tabindex");
|
|
287
|
+
const holds = [];
|
|
288
|
+
for (const record of _TabindexLoan.#registry.names) {
|
|
289
|
+
const value = element.getAttribute(record);
|
|
290
|
+
if (value !== null) holds.push({ loan: null, record, value, linked: true });
|
|
291
|
+
}
|
|
292
|
+
holds.sort((one, other) => Number(one.value === current) - Number(other.value === current));
|
|
293
|
+
for (const [index, hold] of holds.entries()) hold.linked = index > 0;
|
|
294
|
+
return holds;
|
|
295
|
+
}
|
|
296
|
+
#release(element, stack, hold, preserveFocus = false) {
|
|
297
|
+
const current = element.getAttribute("tabindex");
|
|
298
|
+
const index = stack.indexOf(hold);
|
|
299
|
+
const owns = current === hold.value && !stack.slice(index + 1).some((above2) => above2.value === current);
|
|
300
|
+
if (owns && preserveFocus && holdsFocus(element)) return false;
|
|
301
|
+
stack.splice(index, 1);
|
|
302
|
+
const above = stack[index];
|
|
303
|
+
if (above) above.linked &&= hold.linked;
|
|
304
|
+
this.#mark(element, stack);
|
|
305
|
+
if (!owns) return true;
|
|
306
|
+
const below = hold.linked ? stack[index - 1] : void 0;
|
|
307
|
+
if (!below) element.removeAttribute("tabindex");
|
|
308
|
+
else if (below.value !== current) element.setAttribute("tabindex", below.value);
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
#mark(element, stack) {
|
|
312
|
+
const records = /* @__PURE__ */ new Map([[this.#record, null]]);
|
|
313
|
+
for (const hold of stack) records.set(hold.record, hold.value);
|
|
314
|
+
for (const [name, recorded] of records) {
|
|
315
|
+
setAttributeIfChanged(element, name, recorded);
|
|
110
316
|
}
|
|
111
|
-
this.#lent.clear();
|
|
112
|
-
this.#beforeCache.deactivate();
|
|
113
317
|
}
|
|
114
318
|
};
|
|
115
319
|
|
|
116
|
-
|
|
117
|
-
|
|
320
|
+
function targetSelector(identifier, name) {
|
|
321
|
+
return `[data-${identifier}-target~="${name}"]`;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
var PaginationController = class _PaginationController extends Controller {
|
|
325
|
+
#numbers = new NumberValueReader();
|
|
326
|
+
#moves = new MoveCounter();
|
|
327
|
+
#moveToken = 0;
|
|
118
328
|
static targets = ["page", "prev", "next"];
|
|
119
329
|
static values = {
|
|
120
330
|
page: { type: Number, default: 1 },
|
|
121
331
|
total: { type: Number, default: 1 }
|
|
122
332
|
};
|
|
333
|
+
static valueConstraints = {
|
|
334
|
+
page: NUMBER_BOUNDS.finite,
|
|
335
|
+
total: NUMBER_BOUNDS.finite
|
|
336
|
+
};
|
|
123
337
|
static actions = ["next", "prev", "select"];
|
|
124
338
|
static events = ["change", "reconcile"];
|
|
125
|
-
/** Marks a `disabled` this controller applied at a boundary, in its own namespace. */
|
|
126
339
|
get #boundaryAttribute() {
|
|
127
340
|
return `data-${this.identifier}-boundary-disabled`;
|
|
128
341
|
}
|
|
129
|
-
|
|
130
|
-
#
|
|
131
|
-
/**
|
|
132
|
-
* Collapses the Value and target callbacks of one mutation into one pass, and
|
|
133
|
-
* refuses the ones Stimulus delivers before `connect()`, which renders itself.
|
|
134
|
-
*/
|
|
135
|
-
#repaint = new MicrotaskCoalescer(() => this.#reconcilePage());
|
|
136
|
-
/** The page shown last, which the next move of the current page is measured from. */
|
|
342
|
+
#tabindex = new TabindexLoan("-1", this.identifier);
|
|
343
|
+
#repaint = new MorphRenderWatcher(() => this.#reconcilePage());
|
|
137
344
|
#shown = 1;
|
|
138
|
-
/** Renders the initial state from the clamped `page` and `total`. */
|
|
139
345
|
connect() {
|
|
140
|
-
this.#
|
|
346
|
+
this.#tabindex.reclaim(this.element);
|
|
347
|
+
this.#repaint.observe(this.element);
|
|
141
348
|
this.#shown = this.#page;
|
|
142
349
|
this.#render();
|
|
143
350
|
}
|
|
144
|
-
/** Drops a pending pass and reverts the one attribute added outside the state hooks. */
|
|
145
351
|
disconnect() {
|
|
146
|
-
this.#repaint.
|
|
352
|
+
this.#repaint.disconnect();
|
|
147
353
|
this.#tabindex.returnAll();
|
|
148
354
|
}
|
|
149
|
-
/** Re-renders when application code (or a Turbo morph) changes `page` at runtime. */
|
|
150
355
|
pageValueChanged() {
|
|
151
356
|
this.#repaint.schedule();
|
|
152
357
|
}
|
|
153
|
-
/** Re-renders when application code (or a Turbo morph) changes `total` at runtime. */
|
|
154
358
|
totalValueChanged() {
|
|
155
359
|
this.#repaint.schedule();
|
|
156
360
|
}
|
|
157
|
-
/** Syncs a page button appended/replaced at runtime (the consumer owns the list). */
|
|
158
361
|
pageTargetConnected() {
|
|
159
362
|
this.#repaint.schedule();
|
|
160
363
|
}
|
|
161
|
-
/** Syncs a `prev` button appended/replaced at runtime. */
|
|
162
364
|
prevTargetConnected() {
|
|
163
365
|
this.#repaint.schedule();
|
|
164
366
|
}
|
|
165
|
-
|
|
367
|
+
prevTargetDisconnected(button) {
|
|
368
|
+
this.#releaseDeparted(button, this.prevTargets);
|
|
369
|
+
this.#repaint.schedule();
|
|
370
|
+
}
|
|
166
371
|
nextTargetConnected() {
|
|
167
372
|
this.#repaint.schedule();
|
|
168
373
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
374
|
+
nextTargetDisconnected(button) {
|
|
375
|
+
this.#releaseDeparted(button, this.nextTargets);
|
|
376
|
+
this.#repaint.schedule();
|
|
377
|
+
}
|
|
378
|
+
select(source) {
|
|
379
|
+
const { host, origin, reason } = actionSource(source);
|
|
380
|
+
const button = host?.closest(targetSelector(this.identifier, "page"));
|
|
381
|
+
if (!button || !this.pageTargets.includes(button)) return;
|
|
382
|
+
if (origin && origin.closest(`[data-controller~="${this.identifier}"]`) !== this.element)
|
|
383
|
+
return;
|
|
172
384
|
const raw = button.dataset.page;
|
|
173
385
|
if (raw === void 0 || raw.trim() === "") return;
|
|
174
386
|
const page = Number(raw);
|
|
175
387
|
if (!Number.isInteger(page)) return;
|
|
176
|
-
this.#goto(page);
|
|
388
|
+
this.#goto(page, reason);
|
|
177
389
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
this.#goto(this.#page - 1);
|
|
390
|
+
prev(event) {
|
|
391
|
+
this.#goto(this.#page - 1, stateReasonFor(event));
|
|
181
392
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
this.#goto(this.#page + 1);
|
|
393
|
+
next(event) {
|
|
394
|
+
this.#goto(this.#page + 1, stateReasonFor(event));
|
|
185
395
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
if (!Number.isFinite(page)) return;
|
|
189
|
-
const previous = this.#page;
|
|
396
|
+
#goto(page, reason) {
|
|
397
|
+
const previous = this.#shown;
|
|
190
398
|
const target = this.#clamp(page);
|
|
191
|
-
if (target === previous) return;
|
|
399
|
+
if (target === previous && target === this.#page) return;
|
|
192
400
|
this.pageValue = target;
|
|
193
401
|
this.#shown = target;
|
|
402
|
+
const changed = target !== previous;
|
|
403
|
+
if (changed) this.#moveToken = this.#moves.record();
|
|
404
|
+
const token = this.#moveToken;
|
|
194
405
|
this.#render();
|
|
406
|
+
if (!changed || !this.#moves.isLatest(token)) return;
|
|
195
407
|
this.dispatch("change", {
|
|
196
|
-
detail: { page: target, total: this.#total, previous }
|
|
408
|
+
detail: { page: target, total: this.#total, previous, reason }
|
|
197
409
|
});
|
|
198
410
|
}
|
|
199
|
-
/**
|
|
200
|
-
* Renders one settled batch of Value and target changes, and reports a current
|
|
201
|
-
* page that moved from the one shown before as `reconcile`.
|
|
202
|
-
*/
|
|
203
411
|
#reconcilePage() {
|
|
204
412
|
const previous = this.#shown;
|
|
205
413
|
const page = this.#page;
|
|
206
414
|
this.#shown = page;
|
|
415
|
+
const token = this.#moveToken;
|
|
207
416
|
this.#render();
|
|
208
|
-
if (page !== previous) {
|
|
417
|
+
if (page !== previous && this.#moves.isLatest(token)) {
|
|
209
418
|
this.dispatch("reconcile", { detail: { page, total: this.#total, previous } });
|
|
210
419
|
}
|
|
211
420
|
}
|
|
212
|
-
/**
|
|
213
|
-
* Syncs `aria-current` on the page buttons and the prev/next `disabled` state.
|
|
214
|
-
*
|
|
215
|
-
* It reads `page` and `total` through their clamps and never writes either Value,
|
|
216
|
-
* so a declaration outside the range stays in the attributes as the page wrote it.
|
|
217
|
-
*
|
|
218
|
-
* @stimeoRenderRoot
|
|
219
|
-
*/
|
|
220
421
|
#render() {
|
|
422
|
+
const token = this.#moveToken;
|
|
221
423
|
const page = this.#page;
|
|
222
424
|
for (const button of this.pageTargets) {
|
|
223
425
|
if (Number(button.dataset.page) === page) {
|
|
@@ -230,40 +432,35 @@ var PaginationController = class extends Controller {
|
|
|
230
432
|
const next = this.hasNextTarget ? this.nextTarget : null;
|
|
231
433
|
const atStart = page <= 1;
|
|
232
434
|
const atEnd = page >= this.#total;
|
|
233
|
-
const prevStaysDisabled = this.#disabledAfter(prev, atStart);
|
|
234
435
|
const nextStaysDisabled = this.#disabledAfter(next, atEnd);
|
|
235
436
|
this.#release(prev, atStart);
|
|
236
437
|
this.#release(next, atEnd);
|
|
237
438
|
this.#disable(prev, atStart, nextStaysDisabled ? null : next);
|
|
238
|
-
this.#
|
|
439
|
+
if (!this.#moves.isLatest(token)) return;
|
|
440
|
+
this.#disable(next, atEnd, prev);
|
|
239
441
|
}
|
|
240
|
-
/** Whether a boundary button will still be `disabled` once this render applies. */
|
|
241
442
|
#disabledAfter(button, atBoundary) {
|
|
242
443
|
if (!button) return true;
|
|
243
444
|
if (atBoundary) return true;
|
|
244
445
|
return button.disabled && !this.#owns(button);
|
|
245
446
|
}
|
|
246
|
-
|
|
447
|
+
#releaseDeparted(button, targets) {
|
|
448
|
+
if (!targets.includes(button)) this.#release(button, false);
|
|
449
|
+
}
|
|
247
450
|
#release(button, atBoundary) {
|
|
248
451
|
if (!button || atBoundary || !this.#owns(button)) return;
|
|
249
452
|
button.disabled = false;
|
|
250
453
|
button.removeAttribute(this.#boundaryAttribute);
|
|
251
454
|
}
|
|
252
|
-
/**
|
|
253
|
-
* Disables a boundary button, first moving focus off it when it is the active
|
|
254
|
-
* element so disabling never strands focus.
|
|
255
|
-
*/
|
|
256
455
|
#disable(button, atBoundary, opposite) {
|
|
257
456
|
if (!button || !atBoundary) return;
|
|
258
457
|
if (button.disabled && !this.#owns(button)) return;
|
|
458
|
+
const token = this.#moveToken;
|
|
259
459
|
if (button === document.activeElement) this.#moveFocusAwayFrom(opposite);
|
|
460
|
+
if (!this.#moves.isLatest(token)) return;
|
|
260
461
|
button.disabled = true;
|
|
261
462
|
button.setAttribute(this.#boundaryAttribute, "");
|
|
262
463
|
}
|
|
263
|
-
/**
|
|
264
|
-
* Moves focus to `opposite` (already resolved to `null` when it will stay
|
|
265
|
-
* disabled), else to the current page button, else to the landmark itself.
|
|
266
|
-
*/
|
|
267
464
|
#moveFocusAwayFrom(opposite) {
|
|
268
465
|
const page = this.#page;
|
|
269
466
|
const currentPage = this.pageTargets.find(
|
|
@@ -279,26 +476,38 @@ var PaginationController = class extends Controller {
|
|
|
279
476
|
this.#tabindex.lend(this.element);
|
|
280
477
|
this.element.focus();
|
|
281
478
|
}
|
|
282
|
-
/** Total pages, normalized to a finite integer >= 1. */
|
|
283
479
|
get #total() {
|
|
284
|
-
const total = this
|
|
285
|
-
return
|
|
480
|
+
const total = this.#safeTotal;
|
|
481
|
+
return Math.max(1, Math.trunc(total));
|
|
286
482
|
}
|
|
287
|
-
/** The current page, normalized into `[1, total]`. */
|
|
288
483
|
get #page() {
|
|
289
|
-
return this.#clamp(this
|
|
484
|
+
return this.#clamp(this.#safePage);
|
|
290
485
|
}
|
|
291
|
-
/** Constrains `page` to `[1, total]`; a non-finite page falls back to page 1. */
|
|
292
486
|
#clamp(page) {
|
|
293
|
-
if (!Number.isFinite(page)) return 1;
|
|
294
487
|
return Math.min(this.#total, Math.max(1, Math.trunc(page)));
|
|
295
488
|
}
|
|
296
|
-
/** Whether the button's current `disabled` was applied by boundary control. */
|
|
297
489
|
#owns(button) {
|
|
298
490
|
return button.hasAttribute(this.#boundaryAttribute);
|
|
299
491
|
}
|
|
492
|
+
get #safePage() {
|
|
493
|
+
return this.#numbers.read(
|
|
494
|
+
this,
|
|
495
|
+
"page",
|
|
496
|
+
this.pageValue,
|
|
497
|
+
_PaginationController.values.page.default,
|
|
498
|
+
_PaginationController.valueConstraints.page
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
get #safeTotal() {
|
|
502
|
+
return this.#numbers.read(
|
|
503
|
+
this,
|
|
504
|
+
"total",
|
|
505
|
+
this.totalValue,
|
|
506
|
+
_PaginationController.values.total.default,
|
|
507
|
+
_PaginationController.valueConstraints.total
|
|
508
|
+
);
|
|
509
|
+
}
|
|
300
510
|
};
|
|
301
511
|
|
|
302
512
|
export { PaginationController };
|
|
303
|
-
//# sourceMappingURL=pagination_controller.js.map
|
|
304
513
|
//# sourceMappingURL=pagination_controller.js.map
|