stimeo-ui 0.17.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 +106 -1
- package/README.md +19 -10
- package/dist/cable/index.d.ts +9 -8
- package/dist/cable/index.js +22 -14
- package/dist/cable/index.js.map +1 -1
- package/dist/coerce-JtZVNG5h.d.ts +20 -0
- package/dist/controllers/accordion_controller.js +14 -6
- package/dist/controllers/accordion_controller.js.map +1 -1
- package/dist/controllers/alert_dialog_controller.js +145 -118
- package/dist/controllers/alert_dialog_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.d.ts +5 -3
- package/dist/controllers/announcer_controller.js +113 -17
- package/dist/controllers/announcer_controller.js.map +1 -1
- package/dist/controllers/auto_submit_controller.js +185 -60
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.js +55 -43
- package/dist/controllers/avatar_controller.js.map +1 -1
- package/dist/controllers/breadcrumb_controller.js.map +1 -1
- package/dist/controllers/bulk_select_controller.d.ts +3 -3
- package/dist/controllers/bulk_select_controller.js +64 -50
- package/dist/controllers/bulk_select_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +15 -12
- package/dist/controllers/calendar_controller.js +55 -53
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +9 -5
- package/dist/controllers/carousel_controller.js +124 -86
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/character_counter_controller.d.ts +27 -6
- package/dist/controllers/character_counter_controller.js +291 -95
- package/dist/controllers/character_counter_controller.js.map +1 -1
- package/dist/controllers/checkbox_controller.js +6 -0
- package/dist/controllers/checkbox_controller.js.map +1 -1
- package/dist/controllers/clipboard_controller.js +118 -27
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +1 -1
- package/dist/controllers/collapsible_controller.js +52 -49
- package/dist/controllers/collapsible_controller.js.map +1 -1
- package/dist/controllers/color_picker_controller.js +29 -7
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/combobox_controller.d.ts +1 -1
- package/dist/controllers/combobox_controller.js +210 -71
- package/dist/controllers/combobox_controller.js.map +1 -1
- package/dist/controllers/command_palette_controller.d.ts +9 -9
- package/dist/controllers/command_palette_controller.js +289 -140
- package/dist/controllers/command_palette_controller.js.map +1 -1
- package/dist/controllers/conditional_fields_controller.js +145 -58
- package/dist/controllers/conditional_fields_controller.js.map +1 -1
- package/dist/controllers/confirm_controller.js +145 -118
- package/dist/controllers/confirm_controller.js.map +1 -1
- package/dist/controllers/context_menu_controller.d.ts +49 -14
- package/dist/controllers/context_menu_controller.js +138 -73
- package/dist/controllers/context_menu_controller.js.map +1 -1
- package/dist/controllers/count_up_controller.js.map +1 -1
- package/dist/controllers/countdown_controller.d.ts +2 -2
- package/dist/controllers/countdown_controller.js +109 -21
- package/dist/controllers/countdown_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +75 -11
- package/dist/controllers/currency_input_controller.js +446 -72
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/data_grid_controller.d.ts +10 -8
- package/dist/controllers/data_grid_controller.js +134 -28
- package/dist/controllers/data_grid_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +12 -9
- package/dist/controllers/date_range_picker_controller.js +93 -72
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +4 -5
- package/dist/controllers/dialog_controller.js +145 -118
- package/dist/controllers/dialog_controller.js.map +1 -1
- package/dist/controllers/direct_upload_controller.d.ts +1 -1
- package/dist/controllers/direct_upload_controller.js +24 -14
- 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 +68 -31
- package/dist/controllers/dirty_form_controller.js.map +1 -1
- package/dist/controllers/dismissible_controller.js +64 -46
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/drawer_controller.js +145 -118
- package/dist/controllers/drawer_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.js +76 -63
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/editable_controller.js +199 -62
- package/dist/controllers/editable_controller.js.map +1 -1
- package/dist/controllers/empty_state_controller.js +13 -6
- package/dist/controllers/empty_state_controller.js.map +1 -1
- package/dist/controllers/file_dropzone_controller.d.ts +3 -0
- package/dist/controllers/file_dropzone_controller.js +55 -48
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/filter_controller.js +9 -2
- package/dist/controllers/filter_controller.js.map +1 -1
- package/dist/controllers/flash_controller.d.ts +4 -4
- package/dist/controllers/flash_controller.js +66 -33
- package/dist/controllers/flash_controller.js.map +1 -1
- package/dist/controllers/focus_controller.d.ts +3 -3
- package/dist/controllers/focus_controller.js +39 -14
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +52 -43
- 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 +18 -11
- package/dist/controllers/form_validation_controller.js.map +1 -1
- package/dist/controllers/frame_loading_controller.d.ts +13 -12
- package/dist/controllers/frame_loading_controller.js +55 -48
- package/dist/controllers/frame_loading_controller.js.map +1 -1
- package/dist/controllers/highlight_controller.d.ts +5 -4
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/hover_card_controller.d.ts +4 -1
- package/dist/controllers/hover_card_controller.js +67 -61
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +6 -5
- package/dist/controllers/idle_controller.js +10 -6
- 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 +411 -24
- package/dist/controllers/input_mask_controller.js.map +1 -1
- package/dist/controllers/intersection_controller.js +3 -0
- package/dist/controllers/intersection_controller.js.map +1 -1
- package/dist/controllers/lazy_frame_controller.d.ts +3 -2
- package/dist/controllers/lazy_frame_controller.js +15 -3
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/listbox_controller.d.ts +10 -7
- package/dist/controllers/listbox_controller.js +260 -79
- package/dist/controllers/listbox_controller.js.map +1 -1
- package/dist/controllers/local_time_controller.d.ts +8 -6
- package/dist/controllers/local_time_controller.js +48 -13
- package/dist/controllers/local_time_controller.js.map +1 -1
- package/dist/controllers/masonry_controller.js +11 -4
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.d.ts +24 -5
- package/dist/controllers/menu_controller.js +138 -82
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.d.ts +49 -7
- package/dist/controllers/menubar_controller.js +65 -19
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/meter_controller.d.ts +13 -20
- package/dist/controllers/meter_controller.js +270 -24
- package/dist/controllers/meter_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +17 -15
- package/dist/controllers/multi_select_controller.js +251 -94
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.d.ts +19 -5
- package/dist/controllers/navigation_menu_controller.js +67 -19
- package/dist/controllers/navigation_menu_controller.js.map +1 -1
- package/dist/controllers/nested_form_controller.js +98 -64
- package/dist/controllers/nested_form_controller.js.map +1 -1
- package/dist/controllers/network_status_controller.js +70 -52
- package/dist/controllers/network_status_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +24 -6
- package/dist/controllers/number_input_controller.js +344 -94
- 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 +29 -11
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.d.ts +35 -4
- package/dist/controllers/otp_controller.js +502 -104
- package/dist/controllers/otp_controller.js.map +1 -1
- package/dist/controllers/overflow_indicator_controller.js +6 -0
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.d.ts +10 -9
- package/dist/controllers/overflow_menu_controller.js +136 -21
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.d.ts +3 -2
- package/dist/controllers/pagination_controller.js +47 -14
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +5 -4
- package/dist/controllers/password_reveal_controller.js +52 -49
- package/dist/controllers/password_reveal_controller.js.map +1 -1
- package/dist/controllers/password_strength_controller.d.ts +1 -1
- package/dist/controllers/password_strength_controller.js +13 -6
- package/dist/controllers/password_strength_controller.js.map +1 -1
- package/dist/controllers/persist_controller.js +48 -128
- package/dist/controllers/persist_controller.js.map +1 -1
- package/dist/controllers/pointer_drag_controller.d.ts +19 -8
- package/dist/controllers/pointer_drag_controller.js +249 -23
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +3 -3
- package/dist/controllers/popover_controller.js +82 -65
- package/dist/controllers/popover_controller.js.map +1 -1
- package/dist/controllers/portal_controller.js +6 -0
- package/dist/controllers/portal_controller.js.map +1 -1
- package/dist/controllers/preview_guard_controller.js +14 -3
- package/dist/controllers/preview_guard_controller.js.map +1 -1
- package/dist/controllers/progress_controller.d.ts +9 -19
- package/dist/controllers/progress_controller.js +271 -27
- package/dist/controllers/progress_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +11 -8
- package/dist/controllers/radio_group_controller.js +167 -80
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/range_slider_controller.d.ts +4 -3
- package/dist/controllers/range_slider_controller.js +27 -7
- package/dist/controllers/range_slider_controller.js.map +1 -1
- package/dist/controllers/rating_controller.js +93 -57
- package/dist/controllers/rating_controller.js.map +1 -1
- package/dist/controllers/read_more_controller.js +10 -6
- package/dist/controllers/read_more_controller.js.map +1 -1
- package/dist/controllers/reading_progress_controller.js +22 -5
- package/dist/controllers/reading_progress_controller.js.map +1 -1
- package/dist/controllers/relative_time_controller.d.ts +4 -4
- package/dist/controllers/relative_time_controller.js +75 -11
- package/dist/controllers/relative_time_controller.js.map +1 -1
- package/dist/controllers/reset_on_restore_controller.d.ts +3 -3
- package/dist/controllers/reset_on_restore_controller.js +6 -0
- package/dist/controllers/reset_on_restore_controller.js.map +1 -1
- package/dist/controllers/resizable_controller.d.ts +3 -0
- package/dist/controllers/resizable_controller.js +55 -22
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/roving_controller.d.ts +3 -3
- package/dist/controllers/roving_controller.js +10 -4
- package/dist/controllers/roving_controller.js.map +1 -1
- package/dist/controllers/scroll_area_controller.js +129 -88
- 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 -2
- package/dist/controllers/scroll_restore_controller.js.map +1 -1
- package/dist/controllers/scroll_visibility_controller.js +93 -60
- package/dist/controllers/scroll_visibility_controller.js.map +1 -1
- package/dist/controllers/scrollspy_controller.js +11 -5
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/separator_controller.d.ts +1 -1
- package/dist/controllers/separator_controller.js +59 -43
- package/dist/controllers/separator_controller.js.map +1 -1
- package/dist/controllers/sidebar_controller.d.ts +1 -1
- package/dist/controllers/sidebar_controller.js +150 -122
- package/dist/controllers/sidebar_controller.js.map +1 -1
- package/dist/controllers/skeleton_controller.js +55 -48
- package/dist/controllers/skeleton_controller.js.map +1 -1
- package/dist/controllers/slider_controller.d.ts +2 -1
- package/dist/controllers/slider_controller.js +27 -6
- package/dist/controllers/slider_controller.js.map +1 -1
- package/dist/controllers/smart_sticky_header_controller.d.ts +1 -1
- package/dist/controllers/smart_sticky_header_controller.js +13 -5
- 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 +27 -14
- package/dist/controllers/sortable_controller.js.map +1 -1
- package/dist/controllers/spinner_controller.js +55 -48
- package/dist/controllers/spinner_controller.js.map +1 -1
- package/dist/controllers/step_indicator_controller.d.ts +4 -4
- package/dist/controllers/step_indicator_controller.js +6 -0
- package/dist/controllers/step_indicator_controller.js.map +1 -1
- package/dist/controllers/stepper_controller.d.ts +2 -3
- package/dist/controllers/stepper_controller.js +6 -0
- package/dist/controllers/stepper_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.d.ts +3 -1
- package/dist/controllers/stick_to_bottom_controller.js +19 -8
- package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
- package/dist/controllers/sticky_observer_controller.js +49 -43
- package/dist/controllers/sticky_observer_controller.js.map +1 -1
- package/dist/controllers/submit_once_controller.d.ts +2 -1
- package/dist/controllers/submit_once_controller.js +145 -85
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +7 -4
- package/dist/controllers/switch_controller.js +172 -28
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +7 -4
- package/dist/controllers/tabs_controller.js +6 -1
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +4 -3
- package/dist/controllers/tags_input_controller.js +157 -28
- package/dist/controllers/tags_input_controller.js.map +1 -1
- package/dist/controllers/textarea_autosize_controller.d.ts +1 -1
- package/dist/controllers/textarea_autosize_controller.js +40 -19
- package/dist/controllers/textarea_autosize_controller.js.map +1 -1
- package/dist/controllers/theme_controller.d.ts +3 -2
- package/dist/controllers/theme_controller.js +10 -4
- package/dist/controllers/theme_controller.js.map +1 -1
- package/dist/controllers/time_picker_controller.d.ts +38 -5
- package/dist/controllers/time_picker_controller.js +192 -54
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +4 -5
- package/dist/controllers/toast_controller.js +58 -27
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +2 -3
- package/dist/controllers/toggle_group_controller.js +158 -56
- 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 +150 -21
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +4 -1
- package/dist/controllers/tooltip_controller.js.map +1 -1
- package/dist/controllers/transition_controller.js.map +1 -1
- package/dist/controllers/tree_view_controller.d.ts +1 -1
- package/dist/controllers/tree_view_controller.js +134 -25
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2451 -1312
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +15 -11
- package/dist/inspector/cli.js +16 -3
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +53 -8
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +13 -13
- package/dist/inspector/manifest.json +19 -5
- package/dist/positioning/index.d.ts +7 -7
- package/dist/positioning/index.js +6 -0
- package/dist/positioning/index.js.map +1 -1
- package/package.json +10 -9
|
@@ -20,14 +20,13 @@ import { Controller } from '@hotwired/stimulus';
|
|
|
20
20
|
*
|
|
21
21
|
* @remarks
|
|
22
22
|
* Behavior only. The sole visual side effect is locking `document.body`'s scroll
|
|
23
|
-
* while open
|
|
24
|
-
*
|
|
25
|
-
* its content) also closes it.
|
|
23
|
+
* while open; all other styling is the consumer's. Clicking the dialog backdrop
|
|
24
|
+
* (the dialog target itself, outside its content) also closes it.
|
|
26
25
|
*
|
|
27
26
|
* The modal lifecycle — focus trap, scroll lock, background `inert`, focus
|
|
28
27
|
* restore, and teardown reversal — is delegated to the shared `FocusTrap`
|
|
29
|
-
* primitive
|
|
30
|
-
*
|
|
28
|
+
* primitive. This controller only owns *when* to open/close and the
|
|
29
|
+
* dialog-specific backdrop click.
|
|
31
30
|
*
|
|
32
31
|
* Each move of the open state is reported: `stimeo--dialog:open` and
|
|
33
32
|
* `stimeo--dialog:close` dispatch `{ reason: StateReason }`, after the dialog's
|
|
@@ -1,15 +1,26 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
+
function setAttributeIfChanged(element, name, value, beforeWrite) {
|
|
4
|
+
if (element.getAttribute(name) === value) return false;
|
|
5
|
+
if (value === null) element.removeAttribute(name);
|
|
6
|
+
else element.setAttribute(name, value);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
|
|
3
10
|
function sharedRegistry(key, create) {
|
|
4
11
|
const symbol = Symbol.for(key);
|
|
5
12
|
const scope = globalThis;
|
|
6
13
|
const existing = scope[symbol];
|
|
7
14
|
if (existing !== void 0) return existing;
|
|
8
|
-
const
|
|
9
|
-
Object.defineProperty(globalThis, symbol, { value:
|
|
10
|
-
return
|
|
15
|
+
const registry2 = create();
|
|
16
|
+
Object.defineProperty(globalThis, symbol, { value: registry2 });
|
|
17
|
+
return registry2;
|
|
11
18
|
}
|
|
12
19
|
|
|
20
|
+
var registry = sharedRegistry(
|
|
21
|
+
"stimeo-ui.attribute-lease.registry.v1",
|
|
22
|
+
() => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
|
|
23
|
+
);
|
|
13
24
|
function isAttributeValue(value) {
|
|
14
25
|
return value === null || typeof value === "string";
|
|
15
26
|
}
|
|
@@ -26,24 +37,46 @@ function readLeaseRecord(element, record) {
|
|
|
26
37
|
return void 0;
|
|
27
38
|
}
|
|
28
39
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
);
|
|
40
|
+
function attributeStack(element, attribute) {
|
|
41
|
+
const byAttribute = registry.stacks.get(element) ?? /* @__PURE__ */ new Map();
|
|
42
|
+
registry.stacks.set(element, byAttribute);
|
|
43
|
+
const known = byAttribute.get(attribute);
|
|
44
|
+
if (known) return known;
|
|
45
|
+
const found = [];
|
|
46
|
+
for (const record of registry.names.get(attribute) ?? []) {
|
|
47
|
+
const read = readLeaseRecord(element, record);
|
|
48
|
+
if (read) found.push({ ...read, record });
|
|
49
|
+
}
|
|
50
|
+
const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
|
|
51
|
+
const stack = found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
|
|
52
|
+
lease: null,
|
|
53
|
+
record,
|
|
54
|
+
written,
|
|
55
|
+
original,
|
|
56
|
+
linked: linked && index > 0
|
|
57
|
+
}));
|
|
58
|
+
byAttribute.set(attribute, stack);
|
|
59
|
+
return stack;
|
|
60
|
+
}
|
|
61
|
+
function findHold(stack, lease, record) {
|
|
62
|
+
return stack.find((held) => held.lease === lease) ?? stack.find((held) => held.lease === null && held.record === record);
|
|
63
|
+
}
|
|
64
|
+
var AttributeLease = class {
|
|
34
65
|
#attribute;
|
|
35
66
|
#record;
|
|
36
67
|
#base;
|
|
68
|
+
#preserveAuthor;
|
|
37
69
|
#held = /* @__PURE__ */ new Set();
|
|
38
70
|
constructor(attribute, owner, options = {}) {
|
|
39
71
|
this.#attribute = attribute;
|
|
40
72
|
this.#record = `data-${owner}-${attribute}-lease`;
|
|
41
73
|
this.#base = options.base === true;
|
|
42
|
-
|
|
74
|
+
this.#preserveAuthor = options.preserveAuthor === true;
|
|
75
|
+
const names = registry.names;
|
|
43
76
|
names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
|
|
44
77
|
}
|
|
45
78
|
write(element, value) {
|
|
46
|
-
const stack = this.#
|
|
79
|
+
const stack = attributeStack(element, this.#attribute);
|
|
47
80
|
const hold = this.#take(stack) ?? this.#acquire(element, stack);
|
|
48
81
|
this.#held.add(element);
|
|
49
82
|
const shows = !this.#covered(element, stack, hold);
|
|
@@ -53,8 +86,8 @@ var AttributeLease = class _AttributeLease {
|
|
|
53
86
|
}
|
|
54
87
|
return(element) {
|
|
55
88
|
const held = this.#held.delete(element);
|
|
56
|
-
const known =
|
|
57
|
-
const stack = held || known || element.hasAttribute(this.#record) ? this.#
|
|
89
|
+
const known = registry.stacks.get(element)?.has(this.#attribute);
|
|
90
|
+
const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
|
|
58
91
|
const hold = this.#take(stack);
|
|
59
92
|
if (!hold) return false;
|
|
60
93
|
const carries = element.getAttribute(this.#attribute) === hold.written;
|
|
@@ -72,31 +105,8 @@ var AttributeLease = class _AttributeLease {
|
|
|
72
105
|
returnAll() {
|
|
73
106
|
for (const element of Array.from(this.#held)) this.return(element);
|
|
74
107
|
}
|
|
75
|
-
#stack(element) {
|
|
76
|
-
const stacks = _AttributeLease.#registry.stacks;
|
|
77
|
-
const byAttribute = stacks.get(element) ?? /* @__PURE__ */ new Map();
|
|
78
|
-
stacks.set(element, byAttribute);
|
|
79
|
-
const stack = byAttribute.get(this.#attribute) ?? this.#seed(element);
|
|
80
|
-
byAttribute.set(this.#attribute, stack);
|
|
81
|
-
return stack;
|
|
82
|
-
}
|
|
83
|
-
#seed(element) {
|
|
84
|
-
const found = [];
|
|
85
|
-
for (const record of _AttributeLease.#registry.names.get(this.#attribute) ?? []) {
|
|
86
|
-
const read = readLeaseRecord(element, record);
|
|
87
|
-
if (read) found.push({ ...read, record });
|
|
88
|
-
}
|
|
89
|
-
const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
|
|
90
|
-
return found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
|
|
91
|
-
lease: null,
|
|
92
|
-
record,
|
|
93
|
-
written,
|
|
94
|
-
original,
|
|
95
|
-
linked: linked && index > 0
|
|
96
|
-
}));
|
|
97
|
-
}
|
|
98
108
|
#take(stack) {
|
|
99
|
-
const hold = stack
|
|
109
|
+
const hold = findHold(stack, this, this.#record);
|
|
100
110
|
if (hold) hold.lease = this;
|
|
101
111
|
return hold;
|
|
102
112
|
}
|
|
@@ -105,7 +115,7 @@ var AttributeLease = class _AttributeLease {
|
|
|
105
115
|
const top = stack.at(-1);
|
|
106
116
|
const bottom = stack[0];
|
|
107
117
|
const over = top?.written === current ? top : void 0;
|
|
108
|
-
const from = this.#base ? bottom : over;
|
|
118
|
+
const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
|
|
109
119
|
const hold = {
|
|
110
120
|
lease: this,
|
|
111
121
|
record: this.#record,
|
|
@@ -135,15 +145,11 @@ var AttributeLease = class _AttributeLease {
|
|
|
135
145
|
);
|
|
136
146
|
});
|
|
137
147
|
for (const [name, recorded] of records) {
|
|
138
|
-
|
|
139
|
-
if (recorded === null) element.removeAttribute(name);
|
|
140
|
-
else element.setAttribute(name, recorded);
|
|
148
|
+
setAttributeIfChanged(element, name, recorded);
|
|
141
149
|
}
|
|
142
150
|
}
|
|
143
151
|
#reflect(element, value) {
|
|
144
|
-
|
|
145
|
-
if (value === null) element.removeAttribute(this.#attribute);
|
|
146
|
-
else element.setAttribute(this.#attribute, value);
|
|
152
|
+
setAttributeIfChanged(element, this.#attribute, value);
|
|
147
153
|
}
|
|
148
154
|
};
|
|
149
155
|
|
|
@@ -192,25 +198,25 @@ var EscapeLayer = class _EscapeLayer {
|
|
|
192
198
|
#active = null;
|
|
193
199
|
activate(ownerDocument = document, options) {
|
|
194
200
|
this.deactivate();
|
|
195
|
-
let
|
|
196
|
-
if (!
|
|
197
|
-
|
|
198
|
-
_EscapeLayer.#registries.set(ownerDocument,
|
|
199
|
-
ownerDocument.addEventListener("keydown",
|
|
201
|
+
let registry2 = _EscapeLayer.#registries.get(ownerDocument);
|
|
202
|
+
if (!registry2) {
|
|
203
|
+
registry2 = _EscapeLayer.#createRegistry();
|
|
204
|
+
_EscapeLayer.#registries.set(ownerDocument, registry2);
|
|
205
|
+
ownerDocument.addEventListener("keydown", registry2.onKeydown);
|
|
200
206
|
}
|
|
201
207
|
const entry = { onDismiss: options.onDismiss, claims: options.claims ?? null };
|
|
202
|
-
|
|
208
|
+
registry2.stack.push(entry);
|
|
203
209
|
this.#active = { document: ownerDocument, entry };
|
|
204
210
|
}
|
|
205
211
|
deactivate() {
|
|
206
212
|
const active = this.#active;
|
|
207
213
|
if (!active) return;
|
|
208
|
-
const
|
|
209
|
-
if (
|
|
210
|
-
const index =
|
|
211
|
-
if (index >= 0)
|
|
212
|
-
if (
|
|
213
|
-
active.document.removeEventListener("keydown",
|
|
214
|
+
const registry2 = _EscapeLayer.#registries.get(active.document);
|
|
215
|
+
if (registry2) {
|
|
216
|
+
const index = registry2.stack.lastIndexOf(active.entry);
|
|
217
|
+
if (index >= 0) registry2.stack.splice(index, 1);
|
|
218
|
+
if (registry2.stack.length === 0) {
|
|
219
|
+
active.document.removeEventListener("keydown", registry2.onKeydown);
|
|
214
220
|
_EscapeLayer.#registries.delete(active.document);
|
|
215
221
|
}
|
|
216
222
|
}
|
|
@@ -219,22 +225,22 @@ var EscapeLayer = class _EscapeLayer {
|
|
|
219
225
|
get ownsEscape() {
|
|
220
226
|
const active = this.#active;
|
|
221
227
|
if (!active) return false;
|
|
222
|
-
const
|
|
223
|
-
if (!
|
|
224
|
-
return _EscapeLayer.#resolveOwner(
|
|
228
|
+
const registry2 = _EscapeLayer.#registries.get(active.document);
|
|
229
|
+
if (!registry2) return false;
|
|
230
|
+
return _EscapeLayer.#resolveOwner(registry2.stack) === active.entry;
|
|
225
231
|
}
|
|
226
232
|
static #createRegistry() {
|
|
227
|
-
const
|
|
233
|
+
const registry2 = {
|
|
228
234
|
stack: [],
|
|
229
235
|
onKeydown: (event) => {
|
|
230
236
|
if (event.key !== "Escape" || event.defaultPrevented || event.isComposing) return;
|
|
231
|
-
const owner = _EscapeLayer.#resolveOwner(
|
|
237
|
+
const owner = _EscapeLayer.#resolveOwner(registry2.stack);
|
|
232
238
|
if (!owner) return;
|
|
233
239
|
event.preventDefault();
|
|
234
240
|
owner.onDismiss();
|
|
235
241
|
}
|
|
236
242
|
};
|
|
237
|
-
return
|
|
243
|
+
return registry2;
|
|
238
244
|
}
|
|
239
245
|
static #resolveOwner(stack) {
|
|
240
246
|
for (let index = stack.length - 1; index >= 0; index--) {
|
|
@@ -467,6 +473,9 @@ var MicrotaskCoalescer = class {
|
|
|
467
473
|
this.#queued = false;
|
|
468
474
|
this.#generation += 1;
|
|
469
475
|
}
|
|
476
|
+
get pending() {
|
|
477
|
+
return this.#queued;
|
|
478
|
+
}
|
|
470
479
|
schedule() {
|
|
471
480
|
if (!this.#active || this.#queued) return;
|
|
472
481
|
this.#queued = true;
|
|
@@ -495,6 +504,9 @@ function queryOpenDescendants(root, selector) {
|
|
|
495
504
|
return matches;
|
|
496
505
|
}
|
|
497
506
|
|
|
507
|
+
function holdsFocus(element) {
|
|
508
|
+
return element.matches(":focus") || deepActiveElement(element.ownerDocument) === element;
|
|
509
|
+
}
|
|
498
510
|
var TabindexLoan = class _TabindexLoan {
|
|
499
511
|
static #registry = sharedRegistry(
|
|
500
512
|
"stimeo-ui.tabindex-loan.registry.v1",
|
|
@@ -502,19 +514,22 @@ var TabindexLoan = class _TabindexLoan {
|
|
|
502
514
|
);
|
|
503
515
|
#value;
|
|
504
516
|
#record;
|
|
517
|
+
#preserveFocus;
|
|
505
518
|
#lent = /* @__PURE__ */ new Set();
|
|
506
|
-
constructor(value, owner) {
|
|
519
|
+
constructor(value, owner, options = {}) {
|
|
507
520
|
this.#value = value;
|
|
508
521
|
this.#record = `data-${owner}-tabindex-loan`;
|
|
522
|
+
this.#preserveFocus = options.preserveFocus === true;
|
|
509
523
|
_TabindexLoan.#registry.names.add(this.#record);
|
|
510
524
|
}
|
|
511
|
-
lend(element) {
|
|
525
|
+
lend(element, options = {}) {
|
|
512
526
|
const stack = this.#stack(element);
|
|
513
527
|
const current = element.getAttribute("tabindex");
|
|
514
528
|
const held = stack.find((hold) => hold.loan === this) ?? stack.find(
|
|
515
529
|
(hold) => hold.loan === null && hold.record === this.#record && hold.value === this.#value
|
|
516
530
|
);
|
|
517
531
|
const linked = stack.at(-1)?.value === current;
|
|
532
|
+
if (!held && options.onlyIfUnfocusable && (current !== null || element.tabIndex >= 0)) return;
|
|
518
533
|
if (!held && current !== null && !linked) return;
|
|
519
534
|
this.#lent.add(element);
|
|
520
535
|
if (held) held.loan = this;
|
|
@@ -524,19 +539,28 @@ var TabindexLoan = class _TabindexLoan {
|
|
|
524
539
|
element.setAttribute("tabindex", this.#value);
|
|
525
540
|
}
|
|
526
541
|
}
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
542
|
+
return(element) {
|
|
543
|
+
const stack = this.#stack(element);
|
|
544
|
+
const hold = stack.find((held) => held.loan === this) ?? stack.find(
|
|
545
|
+
(held) => held.loan === null && held.record === this.#record && held.value === this.#value
|
|
546
|
+
);
|
|
547
|
+
if (!hold) return false;
|
|
548
|
+
if (!this.#release(element, stack, hold, this.#preserveFocus)) {
|
|
549
|
+
hold.loan = this;
|
|
550
|
+
this.#lent.add(element);
|
|
551
|
+
return false;
|
|
532
552
|
}
|
|
533
|
-
this.#lent.
|
|
553
|
+
this.#lent.delete(element);
|
|
554
|
+
return true;
|
|
555
|
+
}
|
|
556
|
+
returnAll() {
|
|
557
|
+
for (const element of Array.from(this.#lent)) this.return(element);
|
|
534
558
|
}
|
|
535
559
|
reclaim(element) {
|
|
536
560
|
if (element.getAttribute(this.#record) !== this.#value) return;
|
|
537
561
|
const stack = this.#stack(element);
|
|
538
562
|
const hold = stack.find((held) => held.loan === null && held.record === this.#record);
|
|
539
|
-
if (hold && !element
|
|
563
|
+
if (hold && !holdsFocus(element)) this.#release(element, stack, hold);
|
|
540
564
|
}
|
|
541
565
|
reclaimWithin(root) {
|
|
542
566
|
for (const element of queryOpenDescendants(root, `[${this.#record}]`)) {
|
|
@@ -560,26 +584,26 @@ var TabindexLoan = class _TabindexLoan {
|
|
|
560
584
|
for (const [index, hold] of holds.entries()) hold.linked = index > 0;
|
|
561
585
|
return holds;
|
|
562
586
|
}
|
|
563
|
-
#release(element, stack, hold) {
|
|
587
|
+
#release(element, stack, hold, preserveFocus = false) {
|
|
564
588
|
const current = element.getAttribute("tabindex");
|
|
565
589
|
const index = stack.indexOf(hold);
|
|
566
590
|
const owns = current === hold.value && !stack.slice(index + 1).some((above2) => above2.value === current);
|
|
591
|
+
if (owns && preserveFocus && holdsFocus(element)) return false;
|
|
567
592
|
stack.splice(index, 1);
|
|
568
593
|
const above = stack[index];
|
|
569
594
|
if (above) above.linked &&= hold.linked;
|
|
570
595
|
this.#mark(element, stack);
|
|
571
|
-
if (!owns) return;
|
|
596
|
+
if (!owns) return true;
|
|
572
597
|
const below = hold.linked ? stack[index - 1] : void 0;
|
|
573
598
|
if (!below) element.removeAttribute("tabindex");
|
|
574
599
|
else if (below.value !== current) element.setAttribute("tabindex", below.value);
|
|
600
|
+
return true;
|
|
575
601
|
}
|
|
576
602
|
#mark(element, stack) {
|
|
577
603
|
const records = /* @__PURE__ */ new Map([[this.#record, null]]);
|
|
578
604
|
for (const hold of stack) records.set(hold.record, hold.value);
|
|
579
605
|
for (const [name, recorded] of records) {
|
|
580
|
-
|
|
581
|
-
if (recorded === null) element.removeAttribute(name);
|
|
582
|
-
else element.setAttribute(name, recorded);
|
|
606
|
+
setAttributeIfChanged(element, name, recorded);
|
|
583
607
|
}
|
|
584
608
|
}
|
|
585
609
|
};
|
|
@@ -682,23 +706,23 @@ var FocusTrap = class _FocusTrap {
|
|
|
682
706
|
return typeof option === "function" ? option() : option;
|
|
683
707
|
}
|
|
684
708
|
#joinStack() {
|
|
685
|
-
const
|
|
686
|
-
if (
|
|
687
|
-
document.addEventListener("keydown",
|
|
688
|
-
document.addEventListener("turbo:morph",
|
|
689
|
-
document.addEventListener("turbo:morph-element",
|
|
709
|
+
const registry2 = _FocusTrap.#registry(document);
|
|
710
|
+
if (registry2.stack.length === 0) {
|
|
711
|
+
document.addEventListener("keydown", registry2.onKeydown);
|
|
712
|
+
document.addEventListener("turbo:morph", registry2.onMorph);
|
|
713
|
+
document.addEventListener("turbo:morph-element", registry2.onMorph);
|
|
690
714
|
}
|
|
691
|
-
|
|
715
|
+
registry2.stack.push(this.#entry);
|
|
692
716
|
}
|
|
693
717
|
#leaveStack() {
|
|
694
|
-
const
|
|
695
|
-
const index =
|
|
696
|
-
const above =
|
|
697
|
-
|
|
698
|
-
if (
|
|
699
|
-
document.removeEventListener("keydown",
|
|
700
|
-
document.removeEventListener("turbo:morph",
|
|
701
|
-
document.removeEventListener("turbo:morph-element",
|
|
718
|
+
const registry2 = _FocusTrap.#registry(document);
|
|
719
|
+
const index = registry2.stack.indexOf(this.#entry);
|
|
720
|
+
const above = registry2.stack.slice(index + 1);
|
|
721
|
+
registry2.stack.splice(index, 1);
|
|
722
|
+
if (registry2.stack.length === 0) {
|
|
723
|
+
document.removeEventListener("keydown", registry2.onKeydown);
|
|
724
|
+
document.removeEventListener("turbo:morph", registry2.onMorph);
|
|
725
|
+
document.removeEventListener("turbo:morph-element", registry2.onMorph);
|
|
702
726
|
}
|
|
703
727
|
return above;
|
|
704
728
|
}
|
|
@@ -773,22 +797,22 @@ var FocusTrap = class _FocusTrap {
|
|
|
773
797
|
}
|
|
774
798
|
}
|
|
775
799
|
#lockScroll() {
|
|
776
|
-
const
|
|
800
|
+
const registry2 = _FocusTrap.#registry(document);
|
|
777
801
|
const body = document.body;
|
|
778
802
|
if (!body.hasAttribute(OVERFLOW_MARK)) body.setAttribute(OVERFLOW_MARK, body.style.overflow);
|
|
779
|
-
|
|
803
|
+
registry2.scrollLocks.add(this.#entry);
|
|
780
804
|
this.#entry.lockedBody = body;
|
|
781
805
|
body.style.overflow = "hidden";
|
|
782
806
|
}
|
|
783
807
|
#unlockScroll() {
|
|
784
|
-
const
|
|
808
|
+
const registry2 = _FocusTrap.#registry(document);
|
|
785
809
|
const body = this.#entry.lockedBody;
|
|
786
810
|
this.#entry.lockedBody = null;
|
|
787
|
-
if (!
|
|
788
|
-
if (!_FocusTrap.#isLocked(
|
|
811
|
+
if (!registry2.scrollLocks.delete(this.#entry) || !body) return;
|
|
812
|
+
if (!_FocusTrap.#isLocked(registry2, body)) _FocusTrap.#unlock(body);
|
|
789
813
|
}
|
|
790
|
-
static #isLocked(
|
|
791
|
-
return [...
|
|
814
|
+
static #isLocked(registry2, body) {
|
|
815
|
+
return [...registry2.scrollLocks].some((trap) => trap.lockedBody === body);
|
|
792
816
|
}
|
|
793
817
|
static #unlock(body) {
|
|
794
818
|
const saved = body.getAttribute(OVERFLOW_MARK);
|
|
@@ -797,62 +821,62 @@ var FocusTrap = class _FocusTrap {
|
|
|
797
821
|
body.style.overflow = saved;
|
|
798
822
|
}
|
|
799
823
|
static #sweep() {
|
|
800
|
-
const
|
|
824
|
+
const registry2 = _FocusTrap.#registry(document);
|
|
801
825
|
for (const element of queryOpenDescendants(document, `[${INERT_MARK}]`)) {
|
|
802
|
-
if (
|
|
826
|
+
if (registry2.inerted.has(element)) continue;
|
|
803
827
|
element.removeAttribute(INERT_MARK);
|
|
804
828
|
element.inert = false;
|
|
805
829
|
}
|
|
806
|
-
if (!_FocusTrap.#isLocked(
|
|
830
|
+
if (!_FocusTrap.#isLocked(registry2, document.body)) _FocusTrap.#unlock(document.body);
|
|
807
831
|
}
|
|
808
832
|
static #registry(ownerDocument) {
|
|
809
833
|
const existing = _FocusTrap.#registries.get(ownerDocument);
|
|
810
834
|
if (existing) return existing;
|
|
811
|
-
const morphs = new MicrotaskCoalescer(() => _FocusTrap.#reapply(
|
|
835
|
+
const morphs = new MicrotaskCoalescer(() => _FocusTrap.#reapply(registry2));
|
|
812
836
|
morphs.activate();
|
|
813
|
-
const
|
|
837
|
+
const registry2 = {
|
|
814
838
|
stack: [],
|
|
815
|
-
onKeydown: (event) => _FocusTrap.#resolveTab(
|
|
839
|
+
onKeydown: (event) => _FocusTrap.#resolveTab(registry2.stack, event),
|
|
816
840
|
onMorph: () => morphs.schedule(),
|
|
817
841
|
inerted: /* @__PURE__ */ new Set(),
|
|
818
842
|
scrollLocks: /* @__PURE__ */ new Set()
|
|
819
843
|
};
|
|
820
|
-
_FocusTrap.#registries.set(ownerDocument,
|
|
821
|
-
return
|
|
844
|
+
_FocusTrap.#registries.set(ownerDocument, registry2);
|
|
845
|
+
return registry2;
|
|
822
846
|
}
|
|
823
|
-
static #reapply(
|
|
847
|
+
static #reapply(registry2) {
|
|
824
848
|
_FocusTrap.#reconcileBackground(document);
|
|
825
849
|
const body = document.body;
|
|
826
|
-
if (!_FocusTrap.#isLocked(
|
|
850
|
+
if (!_FocusTrap.#isLocked(registry2, body)) return;
|
|
827
851
|
if (!body.hasAttribute(OVERFLOW_MARK)) body.setAttribute(OVERFLOW_MARK, body.style.overflow);
|
|
828
852
|
body.style.overflow = "hidden";
|
|
829
853
|
}
|
|
830
854
|
static #reconcileBackground(ownerDocument) {
|
|
831
|
-
const
|
|
832
|
-
for (const element of
|
|
833
|
-
if (!element.hasAttribute(INERT_MARK))
|
|
855
|
+
const registry2 = _FocusTrap.#registry(ownerDocument);
|
|
856
|
+
for (const element of registry2.inerted) {
|
|
857
|
+
if (!element.hasAttribute(INERT_MARK)) registry2.inerted.delete(element);
|
|
834
858
|
}
|
|
835
|
-
const background = _FocusTrap.#backgroundOf(
|
|
836
|
-
for (const element of
|
|
859
|
+
const background = _FocusTrap.#backgroundOf(registry2);
|
|
860
|
+
for (const element of registry2.inerted) {
|
|
837
861
|
if (background.has(element)) continue;
|
|
838
862
|
element.removeAttribute(INERT_MARK);
|
|
839
863
|
element.inert = false;
|
|
840
|
-
|
|
864
|
+
registry2.inerted.delete(element);
|
|
841
865
|
}
|
|
842
866
|
const added = [];
|
|
843
867
|
for (const element of background) {
|
|
844
|
-
if (
|
|
868
|
+
if (registry2.inerted.has(element)) continue;
|
|
845
869
|
element.setAttribute(INERT_MARK, "");
|
|
846
870
|
element.inert = true;
|
|
847
|
-
|
|
871
|
+
registry2.inerted.add(element);
|
|
848
872
|
added.push(element);
|
|
849
873
|
}
|
|
850
874
|
return added;
|
|
851
875
|
}
|
|
852
|
-
static #backgroundOf(
|
|
853
|
-
const containers =
|
|
876
|
+
static #backgroundOf(registry2) {
|
|
877
|
+
const containers = registry2.stack.map((trap) => trap.container());
|
|
854
878
|
let top = -1;
|
|
855
|
-
|
|
879
|
+
registry2.stack.forEach((trap, index) => {
|
|
856
880
|
if (trap.isolated && containers[index]) top = index;
|
|
857
881
|
});
|
|
858
882
|
const background = /* @__PURE__ */ new Set();
|
|
@@ -867,7 +891,7 @@ var FocusTrap = class _FocusTrap {
|
|
|
867
891
|
const parent = flatTreeParent(node);
|
|
868
892
|
for (const sibling of parent ? flatTreeChildren(parent) : []) {
|
|
869
893
|
if (!(sibling instanceof HTMLElement) || kept.has(sibling)) continue;
|
|
870
|
-
if (sibling.inert && !
|
|
894
|
+
if (sibling.inert && !registry2.inerted.has(sibling)) continue;
|
|
871
895
|
background.add(sibling);
|
|
872
896
|
}
|
|
873
897
|
}
|
|
@@ -975,6 +999,9 @@ var MorphRenderWatcher = class {
|
|
|
975
999
|
schedule() {
|
|
976
1000
|
this.#pass.schedule();
|
|
977
1001
|
}
|
|
1002
|
+
get pending() {
|
|
1003
|
+
return this.#pass.pending;
|
|
1004
|
+
}
|
|
978
1005
|
disconnect() {
|
|
979
1006
|
this.#listeners.dispose();
|
|
980
1007
|
this.#pass.cancel();
|