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
|
@@ -4,17 +4,31 @@ function isReservedArrowChord(event, allow = []) {
|
|
|
4
4
|
if (!event.key.startsWith("Arrow")) return false;
|
|
5
5
|
return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
|
|
6
6
|
}
|
|
7
|
+
function hasModifierChord(event) {
|
|
8
|
+
return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function setAttributeIfChanged(element, name, value, beforeWrite) {
|
|
12
|
+
if (element.getAttribute(name) === value) return false;
|
|
13
|
+
if (value === null) element.removeAttribute(name);
|
|
14
|
+
else element.setAttribute(name, value);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
7
17
|
|
|
8
18
|
function sharedRegistry(key, create) {
|
|
9
19
|
const symbol = Symbol.for(key);
|
|
10
20
|
const scope = globalThis;
|
|
11
21
|
const existing = scope[symbol];
|
|
12
22
|
if (existing !== void 0) return existing;
|
|
13
|
-
const
|
|
14
|
-
Object.defineProperty(globalThis, symbol, { value:
|
|
15
|
-
return
|
|
23
|
+
const registry2 = create();
|
|
24
|
+
Object.defineProperty(globalThis, symbol, { value: registry2 });
|
|
25
|
+
return registry2;
|
|
16
26
|
}
|
|
17
27
|
|
|
28
|
+
var registry = sharedRegistry(
|
|
29
|
+
"stimeo-ui.attribute-lease.registry.v1",
|
|
30
|
+
() => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
|
|
31
|
+
);
|
|
18
32
|
function isAttributeValue(value) {
|
|
19
33
|
return value === null || typeof value === "string";
|
|
20
34
|
}
|
|
@@ -31,24 +45,46 @@ function readLeaseRecord(element, record) {
|
|
|
31
45
|
return void 0;
|
|
32
46
|
}
|
|
33
47
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
);
|
|
48
|
+
function attributeStack(element, attribute) {
|
|
49
|
+
const byAttribute = registry.stacks.get(element) ?? /* @__PURE__ */ new Map();
|
|
50
|
+
registry.stacks.set(element, byAttribute);
|
|
51
|
+
const known = byAttribute.get(attribute);
|
|
52
|
+
if (known) return known;
|
|
53
|
+
const found = [];
|
|
54
|
+
for (const record of registry.names.get(attribute) ?? []) {
|
|
55
|
+
const read = readLeaseRecord(element, record);
|
|
56
|
+
if (read) found.push({ ...read, record });
|
|
57
|
+
}
|
|
58
|
+
const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
|
|
59
|
+
const stack = found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
|
|
60
|
+
lease: null,
|
|
61
|
+
record,
|
|
62
|
+
written,
|
|
63
|
+
original,
|
|
64
|
+
linked: linked && index > 0
|
|
65
|
+
}));
|
|
66
|
+
byAttribute.set(attribute, stack);
|
|
67
|
+
return stack;
|
|
68
|
+
}
|
|
69
|
+
function findHold(stack, lease, record) {
|
|
70
|
+
return stack.find((held) => held.lease === lease) ?? stack.find((held) => held.lease === null && held.record === record);
|
|
71
|
+
}
|
|
72
|
+
var AttributeLease = class {
|
|
39
73
|
#attribute;
|
|
40
74
|
#record;
|
|
41
75
|
#base;
|
|
76
|
+
#preserveAuthor;
|
|
42
77
|
#held = /* @__PURE__ */ new Set();
|
|
43
78
|
constructor(attribute, owner, options = {}) {
|
|
44
79
|
this.#attribute = attribute;
|
|
45
80
|
this.#record = `data-${owner}-${attribute}-lease`;
|
|
46
81
|
this.#base = options.base === true;
|
|
47
|
-
|
|
82
|
+
this.#preserveAuthor = options.preserveAuthor === true;
|
|
83
|
+
const names = registry.names;
|
|
48
84
|
names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
|
|
49
85
|
}
|
|
50
86
|
write(element, value) {
|
|
51
|
-
const stack = this.#
|
|
87
|
+
const stack = attributeStack(element, this.#attribute);
|
|
52
88
|
const hold = this.#take(stack) ?? this.#acquire(element, stack);
|
|
53
89
|
this.#held.add(element);
|
|
54
90
|
const shows = !this.#covered(element, stack, hold);
|
|
@@ -58,8 +94,8 @@ var AttributeLease = class _AttributeLease {
|
|
|
58
94
|
}
|
|
59
95
|
return(element) {
|
|
60
96
|
const held = this.#held.delete(element);
|
|
61
|
-
const known =
|
|
62
|
-
const stack = held || known || element.hasAttribute(this.#record) ? this.#
|
|
97
|
+
const known = registry.stacks.get(element)?.has(this.#attribute);
|
|
98
|
+
const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
|
|
63
99
|
const hold = this.#take(stack);
|
|
64
100
|
if (!hold) return false;
|
|
65
101
|
const carries = element.getAttribute(this.#attribute) === hold.written;
|
|
@@ -77,31 +113,8 @@ var AttributeLease = class _AttributeLease {
|
|
|
77
113
|
returnAll() {
|
|
78
114
|
for (const element of Array.from(this.#held)) this.return(element);
|
|
79
115
|
}
|
|
80
|
-
#stack(element) {
|
|
81
|
-
const stacks = _AttributeLease.#registry.stacks;
|
|
82
|
-
const byAttribute = stacks.get(element) ?? /* @__PURE__ */ new Map();
|
|
83
|
-
stacks.set(element, byAttribute);
|
|
84
|
-
const stack = byAttribute.get(this.#attribute) ?? this.#seed(element);
|
|
85
|
-
byAttribute.set(this.#attribute, stack);
|
|
86
|
-
return stack;
|
|
87
|
-
}
|
|
88
|
-
#seed(element) {
|
|
89
|
-
const found = [];
|
|
90
|
-
for (const record of _AttributeLease.#registry.names.get(this.#attribute) ?? []) {
|
|
91
|
-
const read = readLeaseRecord(element, record);
|
|
92
|
-
if (read) found.push({ ...read, record });
|
|
93
|
-
}
|
|
94
|
-
const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
|
|
95
|
-
return found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
|
|
96
|
-
lease: null,
|
|
97
|
-
record,
|
|
98
|
-
written,
|
|
99
|
-
original,
|
|
100
|
-
linked: linked && index > 0
|
|
101
|
-
}));
|
|
102
|
-
}
|
|
103
116
|
#take(stack) {
|
|
104
|
-
const hold = stack
|
|
117
|
+
const hold = findHold(stack, this, this.#record);
|
|
105
118
|
if (hold) hold.lease = this;
|
|
106
119
|
return hold;
|
|
107
120
|
}
|
|
@@ -110,7 +123,7 @@ var AttributeLease = class _AttributeLease {
|
|
|
110
123
|
const top = stack.at(-1);
|
|
111
124
|
const bottom = stack[0];
|
|
112
125
|
const over = top?.written === current ? top : void 0;
|
|
113
|
-
const from = this.#base ? bottom : over;
|
|
126
|
+
const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
|
|
114
127
|
const hold = {
|
|
115
128
|
lease: this,
|
|
116
129
|
record: this.#record,
|
|
@@ -140,15 +153,54 @@ var AttributeLease = class _AttributeLease {
|
|
|
140
153
|
);
|
|
141
154
|
});
|
|
142
155
|
for (const [name, recorded] of records) {
|
|
143
|
-
|
|
144
|
-
if (recorded === null) element.removeAttribute(name);
|
|
145
|
-
else element.setAttribute(name, recorded);
|
|
156
|
+
setAttributeIfChanged(element, name, recorded);
|
|
146
157
|
}
|
|
147
158
|
}
|
|
148
159
|
#reflect(element, value) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
160
|
+
setAttributeIfChanged(element, this.#attribute, value);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
var BlurDeferral = class {
|
|
165
|
+
#pending = /* @__PURE__ */ new Map();
|
|
166
|
+
#onRelease;
|
|
167
|
+
constructor(onRelease) {
|
|
168
|
+
this.#onRelease = onRelease;
|
|
169
|
+
}
|
|
170
|
+
get size() {
|
|
171
|
+
return this.#pending.size;
|
|
172
|
+
}
|
|
173
|
+
get elements() {
|
|
174
|
+
return [...this.#pending.keys()];
|
|
175
|
+
}
|
|
176
|
+
has(element) {
|
|
177
|
+
return this.#pending.has(element);
|
|
178
|
+
}
|
|
179
|
+
defer(element) {
|
|
180
|
+
if (this.#pending.has(element)) return;
|
|
181
|
+
const onBlur = () => {
|
|
182
|
+
this.#detach(element);
|
|
183
|
+
this.#onRelease(element);
|
|
184
|
+
};
|
|
185
|
+
this.#pending.set(element, onBlur);
|
|
186
|
+
element.addEventListener("blur", onBlur);
|
|
187
|
+
}
|
|
188
|
+
deferOnly(element) {
|
|
189
|
+
for (const pending of this.elements) {
|
|
190
|
+
if (pending !== element) this.#detach(pending);
|
|
191
|
+
}
|
|
192
|
+
this.defer(element);
|
|
193
|
+
}
|
|
194
|
+
release(element) {
|
|
195
|
+
this.#detach(element);
|
|
196
|
+
}
|
|
197
|
+
releaseAll() {
|
|
198
|
+
for (const element of this.elements) this.#detach(element);
|
|
199
|
+
}
|
|
200
|
+
#detach(element) {
|
|
201
|
+
const onBlur = this.#pending.get(element);
|
|
202
|
+
if (onBlur) element.removeEventListener("blur", onBlur);
|
|
203
|
+
this.#pending.delete(element);
|
|
152
204
|
}
|
|
153
205
|
};
|
|
154
206
|
|
|
@@ -158,63 +210,182 @@ var COMPOSITION_INPUT_TYPES = /* @__PURE__ */ new Set([
|
|
|
158
210
|
"deleteCompositionText",
|
|
159
211
|
"deleteByComposition"
|
|
160
212
|
]);
|
|
213
|
+
function isCompositionInputType(inputType) {
|
|
214
|
+
return inputType !== void 0 && COMPOSITION_INPUT_TYPES.has(inputType);
|
|
215
|
+
}
|
|
216
|
+
var BEFORE_MORPH_ATTRIBUTE = "turbo:before-morph-attribute";
|
|
217
|
+
var textOf = (element) => element.value;
|
|
218
|
+
var holdsFocus = (element) => element instanceof Node && element.getRootNode().activeElement === element;
|
|
161
219
|
var CompositionTracker = class {
|
|
162
220
|
#observedTargets = /* @__PURE__ */ new Set();
|
|
163
|
-
#
|
|
221
|
+
#composition = null;
|
|
164
222
|
#onStart;
|
|
165
223
|
#onEnd;
|
|
224
|
+
#onAbandon;
|
|
166
225
|
#confirmedTarget = null;
|
|
226
|
+
#keyComposing = false;
|
|
227
|
+
#connected = false;
|
|
228
|
+
#abandoned = null;
|
|
167
229
|
constructor(options = {}) {
|
|
168
230
|
this.#onStart = options.onStart;
|
|
169
231
|
this.#onEnd = options.onEnd;
|
|
232
|
+
this.#onAbandon = options.onAbandon;
|
|
170
233
|
}
|
|
171
234
|
observe(target) {
|
|
235
|
+
this.#connected = true;
|
|
172
236
|
if (this.#observedTargets.has(target)) return;
|
|
173
237
|
target.addEventListener("compositionstart", this.#handleStart);
|
|
174
238
|
target.addEventListener("compositionend", this.#handleEnd);
|
|
175
|
-
target.addEventListener("keydown", this.#handleKeydown);
|
|
239
|
+
target.addEventListener("keydown", this.#handleKeydown, true);
|
|
240
|
+
target.addEventListener("beforeinput", this.#handleBeforeInput, true);
|
|
241
|
+
target.addEventListener("input", this.#handleInput, true);
|
|
242
|
+
target.addEventListener("blur", this.#handleBlur, true);
|
|
243
|
+
target.addEventListener(BEFORE_MORPH_ATTRIBUTE, this.#handleBeforeMorphAttribute);
|
|
176
244
|
this.#observedTargets.add(target);
|
|
177
245
|
}
|
|
178
246
|
unobserve(target) {
|
|
179
247
|
if (!this.#observedTargets.delete(target)) return;
|
|
180
|
-
|
|
181
|
-
target
|
|
182
|
-
target.removeEventListener("keydown", this.#handleKeydown);
|
|
183
|
-
this.#activeTargets.delete(target);
|
|
248
|
+
this.#release(target);
|
|
249
|
+
if (this.#composition?.target === target) this.#letGo();
|
|
184
250
|
if (this.#confirmedTarget === target) this.#confirmedTarget = null;
|
|
185
251
|
}
|
|
186
252
|
disconnect() {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
target.removeEventListener("compositionend", this.#handleEnd);
|
|
190
|
-
target.removeEventListener("keydown", this.#handleKeydown);
|
|
191
|
-
}
|
|
253
|
+
this.#connected = false;
|
|
254
|
+
for (const target of this.#observedTargets) this.#release(target);
|
|
192
255
|
this.#observedTargets.clear();
|
|
193
|
-
this.#
|
|
256
|
+
this.#letGo();
|
|
194
257
|
this.#confirmedTarget = null;
|
|
258
|
+
this.#keyComposing = false;
|
|
259
|
+
this.#abandoned = null;
|
|
195
260
|
}
|
|
196
261
|
isComposing(event) {
|
|
197
|
-
|
|
262
|
+
this.#settle();
|
|
263
|
+
return event?.isComposing === true || this.#composition !== null;
|
|
264
|
+
}
|
|
265
|
+
composingElement() {
|
|
266
|
+
this.#settle();
|
|
267
|
+
return this.#composition?.element ?? null;
|
|
268
|
+
}
|
|
269
|
+
owns(event) {
|
|
270
|
+
const element = this.composingElement();
|
|
271
|
+
return event.isComposing === true || element !== null && element === event.target;
|
|
198
272
|
}
|
|
199
273
|
consumesConfirmedInput(event) {
|
|
200
274
|
const confirmed = this.#confirmedTarget;
|
|
201
275
|
this.#confirmedTarget = null;
|
|
202
276
|
if (confirmed === null || confirmed !== event.target) return false;
|
|
203
277
|
const inputType = event.inputType;
|
|
204
|
-
return !inputType ||
|
|
278
|
+
return !inputType || isCompositionInputType(inputType);
|
|
279
|
+
}
|
|
280
|
+
#release(target) {
|
|
281
|
+
target.removeEventListener("compositionstart", this.#handleStart);
|
|
282
|
+
target.removeEventListener("compositionend", this.#handleEnd);
|
|
283
|
+
target.removeEventListener("keydown", this.#handleKeydown, true);
|
|
284
|
+
target.removeEventListener("beforeinput", this.#handleBeforeInput, true);
|
|
285
|
+
target.removeEventListener("input", this.#handleInput, true);
|
|
286
|
+
target.removeEventListener("blur", this.#handleBlur, true);
|
|
287
|
+
target.removeEventListener(BEFORE_MORPH_ATTRIBUTE, this.#handleBeforeMorphAttribute);
|
|
288
|
+
}
|
|
289
|
+
#letGo() {
|
|
290
|
+
const composition = this.#composition;
|
|
291
|
+
if (composition === null) return;
|
|
292
|
+
if (!holdsFocus(composition.element)) {
|
|
293
|
+
this.#composition = null;
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
queueMicrotask(() => {
|
|
297
|
+
if (this.#composition !== composition || this.#observedTargets.has(composition.target)) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
this.#composition = null;
|
|
301
|
+
if (!this.#connected) return;
|
|
302
|
+
this.#abandoned = { element: composition.element, inPlace: true };
|
|
303
|
+
this.#runAbandon();
|
|
304
|
+
});
|
|
205
305
|
}
|
|
306
|
+
#settle() {
|
|
307
|
+
const composition = this.#composition;
|
|
308
|
+
if (composition === null) return;
|
|
309
|
+
const { target, element, text } = composition;
|
|
310
|
+
if (target instanceof Node && element instanceof Node && !target.contains(element)) {
|
|
311
|
+
this.#composition = null;
|
|
312
|
+
} else if (textOf(element) !== text) {
|
|
313
|
+
this.#abandon(false);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
#abandon(inPlace) {
|
|
317
|
+
this.#owe(inPlace);
|
|
318
|
+
this.#composition = null;
|
|
319
|
+
queueMicrotask(this.#runAbandon);
|
|
320
|
+
}
|
|
321
|
+
#owe(inPlace) {
|
|
322
|
+
const composition = this.#composition;
|
|
323
|
+
if (composition !== null) this.#abandoned = { element: composition.element, inPlace };
|
|
324
|
+
}
|
|
325
|
+
#runAbandon = () => {
|
|
326
|
+
const abandoned = this.#abandoned;
|
|
327
|
+
if (abandoned === null) return;
|
|
328
|
+
this.#abandoned = null;
|
|
329
|
+
this.#onAbandon?.(abandoned.element, abandoned.inPlace);
|
|
330
|
+
};
|
|
206
331
|
#handleStart = (event) => {
|
|
207
332
|
this.#confirmedTarget = null;
|
|
208
|
-
|
|
333
|
+
this.#settle();
|
|
334
|
+
this.#owe(true);
|
|
335
|
+
const target = event.currentTarget;
|
|
336
|
+
const element = event.target;
|
|
337
|
+
this.#composition = { target, element, text: textOf(element) };
|
|
338
|
+
this.#runAbandon();
|
|
209
339
|
this.#onStart?.(event);
|
|
210
340
|
};
|
|
211
341
|
#handleEnd = (event) => {
|
|
212
|
-
|
|
342
|
+
this.#runAbandon();
|
|
343
|
+
if (this.#composition?.target === event.currentTarget) this.#composition = null;
|
|
213
344
|
this.#confirmedTarget = event.target;
|
|
214
345
|
this.#onEnd?.(event);
|
|
215
346
|
};
|
|
216
|
-
#handleKeydown = () => {
|
|
347
|
+
#handleKeydown = (event) => {
|
|
348
|
+
this.#settle();
|
|
349
|
+
this.#runAbandon();
|
|
217
350
|
this.#confirmedTarget = null;
|
|
351
|
+
this.#keyComposing = event.isComposing === true;
|
|
352
|
+
};
|
|
353
|
+
#handleBeforeInput = (event) => {
|
|
354
|
+
const keyComposing = this.#keyComposing;
|
|
355
|
+
this.#keyComposing = false;
|
|
356
|
+
this.#settle();
|
|
357
|
+
const { isComposing, inputType } = event;
|
|
358
|
+
if (this.#composition !== null && !keyComposing && !isComposing && inputType && !isCompositionInputType(inputType)) {
|
|
359
|
+
this.#abandon(true);
|
|
360
|
+
}
|
|
361
|
+
this.#runAbandon();
|
|
362
|
+
};
|
|
363
|
+
#handleInput = (event) => {
|
|
364
|
+
const composition = this.#composition;
|
|
365
|
+
const { isTrusted, isComposing, inputType } = event;
|
|
366
|
+
if (composition !== null && event.target === composition.element && (isTrusted || isComposing || isCompositionInputType(inputType))) {
|
|
367
|
+
composition.text = textOf(composition.element);
|
|
368
|
+
} else {
|
|
369
|
+
this.#settle();
|
|
370
|
+
}
|
|
371
|
+
this.#runAbandon();
|
|
372
|
+
};
|
|
373
|
+
#handleBlur = (event) => {
|
|
374
|
+
this.#settle();
|
|
375
|
+
this.#runAbandon();
|
|
376
|
+
const composition = this.#composition;
|
|
377
|
+
if (composition === null || composition.target === composition.element) return;
|
|
378
|
+
const { element } = composition;
|
|
379
|
+
if (!(element instanceof Node) || event.target !== element) return;
|
|
380
|
+
const root = element.getRootNode();
|
|
381
|
+
if (root.activeElement !== element) this.#composition = null;
|
|
382
|
+
};
|
|
383
|
+
#handleBeforeMorphAttribute = (event) => {
|
|
384
|
+
this.#settle();
|
|
385
|
+
const composition = this.#composition;
|
|
386
|
+
if (composition?.target !== event.currentTarget || event.target !== composition.element) return;
|
|
387
|
+
const detail = event.detail;
|
|
388
|
+
if (detail?.attributeName === "value") event.preventDefault();
|
|
218
389
|
};
|
|
219
390
|
};
|
|
220
391
|
|
|
@@ -262,6 +433,9 @@ var MicrotaskCoalescer = class {
|
|
|
262
433
|
this.#queued = false;
|
|
263
434
|
this.#generation += 1;
|
|
264
435
|
}
|
|
436
|
+
get pending() {
|
|
437
|
+
return this.#queued;
|
|
438
|
+
}
|
|
265
439
|
schedule() {
|
|
266
440
|
if (!this.#active || this.#queued) return;
|
|
267
441
|
this.#queued = true;
|
|
@@ -292,6 +466,9 @@ var MorphRenderWatcher = class {
|
|
|
292
466
|
schedule() {
|
|
293
467
|
this.#pass.schedule();
|
|
294
468
|
}
|
|
469
|
+
get pending() {
|
|
470
|
+
return this.#pass.pending;
|
|
471
|
+
}
|
|
295
472
|
disconnect() {
|
|
296
473
|
this.#listeners.dispose();
|
|
297
474
|
this.#pass.cancel();
|
|
@@ -510,6 +687,7 @@ function finiteFallback(min, max) {
|
|
|
510
687
|
}
|
|
511
688
|
|
|
512
689
|
var OWNED_DISABLED = "data-number-input-disabled";
|
|
690
|
+
var sameRange = (shown, declared) => shown?.min === declared.min && shown.max === declared.max && shown.step === declared.step;
|
|
513
691
|
var NumberInputController = class _NumberInputController extends Controller {
|
|
514
692
|
#numbers = new NumberValueReader();
|
|
515
693
|
#moves = new MoveCounter();
|
|
@@ -532,11 +710,16 @@ var NumberInputController = class _NumberInputController extends Controller {
|
|
|
532
710
|
static #HOLD_DELAY_MS = 400;
|
|
533
711
|
static #HOLD_REPEAT_MS = 80;
|
|
534
712
|
static #SUPPRESS_RESET_MS = 250;
|
|
535
|
-
#
|
|
713
|
+
#listeners = new ListenerSet();
|
|
536
714
|
#buttonGuards = /* @__PURE__ */ new Map();
|
|
537
715
|
#composition = new CompositionTracker({
|
|
538
|
-
onEnd: () => {
|
|
539
|
-
if (this
|
|
716
|
+
onEnd: (event) => {
|
|
717
|
+
if (this.hasInputTarget && event.target === this.inputTarget) {
|
|
718
|
+
this.#recordDraft(this.inputTarget);
|
|
719
|
+
}
|
|
720
|
+
},
|
|
721
|
+
onAbandon: () => {
|
|
722
|
+
if (this.#reconcileHeld) this.#reconcile();
|
|
540
723
|
}
|
|
541
724
|
});
|
|
542
725
|
#reconcileHeld = false;
|
|
@@ -544,6 +727,13 @@ var NumberInputController = class _NumberInputController extends Controller {
|
|
|
544
727
|
#ariaValueMin = new AttributeLease("aria-valuemin", this.identifier);
|
|
545
728
|
#ariaValueMax = new AttributeLease("aria-valuemax", this.identifier);
|
|
546
729
|
#lastValue = null;
|
|
730
|
+
#accepted = null;
|
|
731
|
+
#draft = null;
|
|
732
|
+
#parked = new BlurDeferral((input) => {
|
|
733
|
+
if (document.activeElement === input) this.#parked.defer(input);
|
|
734
|
+
else if (this.#draft?.input === input) this.#draft = null;
|
|
735
|
+
});
|
|
736
|
+
#shown = null;
|
|
547
737
|
#connected = false;
|
|
548
738
|
#holdTimeouts = new SafeTimeout();
|
|
549
739
|
#holdIntervals = new SafeInterval();
|
|
@@ -556,13 +746,13 @@ var NumberInputController = class _NumberInputController extends Controller {
|
|
|
556
746
|
#repaint = new MorphRenderWatcher(() => this.#reconcile());
|
|
557
747
|
connect() {
|
|
558
748
|
this.#repaint.observe(this.element);
|
|
559
|
-
this.#globalGuards = new AbortController();
|
|
560
|
-
const { signal } = this.#globalGuards;
|
|
561
749
|
for (const button of this.incrementTargets) this.#wireButton(button, 1);
|
|
562
750
|
for (const button of this.decrementTargets) this.#wireButton(button, -1);
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
751
|
+
this.#listeners.add(window, "pointerup", this.#onPointerEnd);
|
|
752
|
+
this.#listeners.add(window, "pointercancel", this.#onPointerEnd);
|
|
753
|
+
this.#listeners.add(window, "blur", this.#onWindowBlur);
|
|
754
|
+
this.#listeners.add(this.element, "input", this.#onDraftInput);
|
|
755
|
+
this.#listeners.add(this.element, "turbo:before-morph-attribute", this.#onBeforeMorphAttribute);
|
|
566
756
|
this.#reconcile();
|
|
567
757
|
this.#connected = true;
|
|
568
758
|
}
|
|
@@ -570,8 +760,9 @@ var NumberInputController = class _NumberInputController extends Controller {
|
|
|
570
760
|
this.#connected = false;
|
|
571
761
|
this.#repaint.disconnect();
|
|
572
762
|
this.#composition.disconnect();
|
|
573
|
-
this.#
|
|
574
|
-
this.#
|
|
763
|
+
this.#listeners.dispose();
|
|
764
|
+
if (this.#draft?.input !== document.activeElement) this.#draft = null;
|
|
765
|
+
if (this.#draft !== null) this.#parked.deferOnly(this.#draft.input);
|
|
575
766
|
const buttons = /* @__PURE__ */ new Set([
|
|
576
767
|
...this.#buttonGuards.keys(),
|
|
577
768
|
...this.incrementTargets,
|
|
@@ -602,7 +793,11 @@ var NumberInputController = class _NumberInputController extends Controller {
|
|
|
602
793
|
this.#repaint.schedule();
|
|
603
794
|
}
|
|
604
795
|
inputTargetDisconnected(input) {
|
|
796
|
+
const composing = this.#composition.composingElement() === input;
|
|
605
797
|
this.#composition.unobserve(input);
|
|
798
|
+
if (composing && this.#composition.composingElement() === input && this.inputTargets.includes(input)) {
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
606
801
|
this.#releaseInputAria(input);
|
|
607
802
|
this.#stopHold(false);
|
|
608
803
|
this.#repaint.schedule();
|
|
@@ -633,6 +828,25 @@ var NumberInputController = class _NumberInputController extends Controller {
|
|
|
633
828
|
this.#commitStep(-1);
|
|
634
829
|
this.inputTarget.focus();
|
|
635
830
|
}
|
|
831
|
+
#onDraftInput = (event) => {
|
|
832
|
+
if (!this.hasInputTarget) return;
|
|
833
|
+
const input = this.inputTarget;
|
|
834
|
+
if (event.target !== input || document.activeElement !== input) return;
|
|
835
|
+
this.#recordDraft(input);
|
|
836
|
+
};
|
|
837
|
+
#recordDraft(input) {
|
|
838
|
+
this.#draft = this.#accepted?.input === input && input.value !== this.#accepted.text ? { input, text: input.value } : null;
|
|
839
|
+
if (this.#draft === null) this.#resumeHeldReconcile();
|
|
840
|
+
}
|
|
841
|
+
#onBeforeMorphAttribute = (event) => {
|
|
842
|
+
if (!this.hasInputTarget || event.target !== this.inputTarget) return;
|
|
843
|
+
const detail = event.detail;
|
|
844
|
+
if (detail?.attributeName === "value" && this.#isEditing(this.inputTarget))
|
|
845
|
+
event.preventDefault();
|
|
846
|
+
};
|
|
847
|
+
#isEditing(input) {
|
|
848
|
+
return this.#draft?.input === input && this.#accepted?.input === input && document.activeElement === input && input.value === this.#draft.text && input.value !== this.#accepted.text;
|
|
849
|
+
}
|
|
636
850
|
onInput() {
|
|
637
851
|
if (!this.hasInputTarget) return;
|
|
638
852
|
if (this.inputTarget.value.trim() === "") {
|
|
@@ -646,6 +860,8 @@ var NumberInputController = class _NumberInputController extends Controller {
|
|
|
646
860
|
if (!this.hasInputTarget) return;
|
|
647
861
|
if (this.#composition.isComposing(event)) return;
|
|
648
862
|
if (isReservedArrowChord(event)) return;
|
|
863
|
+
if ((event.key === "Home" || event.key === "End" || event.key === "PageUp" || event.key === "PageDown") && hasModifierChord(event))
|
|
864
|
+
return;
|
|
649
865
|
let next = null;
|
|
650
866
|
switch (event.key) {
|
|
651
867
|
case "ArrowUp":
|
|
@@ -773,23 +989,40 @@ var NumberInputController = class _NumberInputController extends Controller {
|
|
|
773
989
|
if (!this.hasInputTarget) return false;
|
|
774
990
|
return this.#commit(stepSteppedValue(this.#currentValue(), count, this.#steppedRange), true);
|
|
775
991
|
}
|
|
992
|
+
#resumeHeldReconcile() {
|
|
993
|
+
if (this.#reconcileHeld) this.#repaint.schedule();
|
|
994
|
+
}
|
|
776
995
|
#reconcile() {
|
|
777
|
-
if (!this.hasInputTarget)
|
|
778
|
-
|
|
779
|
-
this.#
|
|
996
|
+
if (!this.hasInputTarget) {
|
|
997
|
+
if (this.#draft?.input !== document.activeElement) this.#draft = null;
|
|
998
|
+
if (this.#draft !== null) this.#parked.deferOnly(this.#draft.input);
|
|
780
999
|
return;
|
|
781
1000
|
}
|
|
782
|
-
this.#
|
|
1001
|
+
this.#parked.releaseAll();
|
|
783
1002
|
const previous = this.#lastValue;
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
this.#
|
|
787
|
-
|
|
788
|
-
this.#
|
|
789
|
-
if (!this.#moves.isLatest(move)) return;
|
|
1003
|
+
const input = this.inputTarget;
|
|
1004
|
+
if (this.#composition.composingElement() === input || this.#isEditing(input)) {
|
|
1005
|
+
const shown = this.#shown?.input === input ? this.#shown : null;
|
|
1006
|
+
this.#reconcileHeld = shown === null || !sameRange(shown.range, this.#steppedRange);
|
|
1007
|
+
if (shown !== null) this.#show(shown.value, shown.at, shown.range);
|
|
790
1008
|
} else {
|
|
791
|
-
this.#
|
|
792
|
-
this.#
|
|
1009
|
+
this.#draft = null;
|
|
1010
|
+
this.#reconcileHeld = false;
|
|
1011
|
+
const shown = this.#shown;
|
|
1012
|
+
if (shown !== null && this.#accepted?.input === input && input.value === this.#accepted.text && sameRange(shown.range, this.#steppedRange)) {
|
|
1013
|
+
const move = this.#move;
|
|
1014
|
+
this.#show(shown.value, shown.at, shown.range);
|
|
1015
|
+
if (!this.#moves.isLatest(move)) return;
|
|
1016
|
+
} else if (input.value.trim() !== "") {
|
|
1017
|
+
const value = this.#normalize(this.#currentValue());
|
|
1018
|
+
this.#lastValue = value;
|
|
1019
|
+
const move = this.#move;
|
|
1020
|
+
this.#write(value, true);
|
|
1021
|
+
if (!this.#moves.isLatest(move)) return;
|
|
1022
|
+
} else {
|
|
1023
|
+
this.#lastValue = null;
|
|
1024
|
+
this.#reflectEmpty();
|
|
1025
|
+
}
|
|
793
1026
|
}
|
|
794
1027
|
this.#reportMove(previous);
|
|
795
1028
|
}
|
|
@@ -798,38 +1031,55 @@ var NumberInputController = class _NumberInputController extends Controller {
|
|
|
798
1031
|
if (!this.#connected || value === null || value === previous) return;
|
|
799
1032
|
this.dispatch("reconcile", { detail: { value } });
|
|
800
1033
|
}
|
|
801
|
-
#write(value) {
|
|
1034
|
+
#write(value, keepCaret = false) {
|
|
802
1035
|
const input = this.inputTarget;
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
1036
|
+
const text = String(value);
|
|
1037
|
+
if (input.value !== text) {
|
|
1038
|
+
const caret = keepCaret && input === document.activeElement ? input.selectionStart : null;
|
|
1039
|
+
input.value = text;
|
|
1040
|
+
if (caret !== null) {
|
|
1041
|
+
const position = Math.min(caret, text.length);
|
|
1042
|
+
input.setSelectionRange(position, position);
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
this.#draft = null;
|
|
1046
|
+
this.#reconcileHeld = false;
|
|
1047
|
+
this.#accepted = { input, text };
|
|
1048
|
+
this.#show(value, value);
|
|
1049
|
+
}
|
|
1050
|
+
#show(value, at, range = this.#steppedRange) {
|
|
1051
|
+
this.#shown = { input: this.inputTarget, value, at, range };
|
|
1052
|
+
this.#syncInputAria(this.inputTarget, value, range);
|
|
1053
|
+
this.#updateButtons(at, range);
|
|
806
1054
|
}
|
|
807
1055
|
#reflectEmpty() {
|
|
808
|
-
this.#
|
|
809
|
-
this.#
|
|
1056
|
+
this.#draft = null;
|
|
1057
|
+
this.#reconcileHeld = false;
|
|
1058
|
+
this.#accepted = { input: this.inputTarget, text: this.inputTarget.value };
|
|
1059
|
+
this.#show(null, this.#currentValue());
|
|
810
1060
|
}
|
|
811
|
-
#syncInputAria(input, value) {
|
|
1061
|
+
#syncInputAria(input, value, range) {
|
|
812
1062
|
if (input.getAttribute("role") !== "spinbutton") {
|
|
813
1063
|
this.#releaseInputAria(input);
|
|
814
1064
|
return;
|
|
815
1065
|
}
|
|
816
1066
|
this.#ariaValueNow.write(input, value === null ? null : String(value));
|
|
817
|
-
this.#ariaValueMin.write(input, Number.isFinite(
|
|
818
|
-
this.#ariaValueMax.write(input, Number.isFinite(
|
|
1067
|
+
this.#ariaValueMin.write(input, Number.isFinite(range.min) ? String(range.min) : null);
|
|
1068
|
+
this.#ariaValueMax.write(input, Number.isFinite(range.max) ? String(range.max) : null);
|
|
819
1069
|
}
|
|
820
1070
|
#releaseInputAria(input) {
|
|
821
1071
|
this.#ariaValueNow.return(input);
|
|
822
1072
|
this.#ariaValueMin.return(input);
|
|
823
1073
|
this.#ariaValueMax.return(input);
|
|
824
1074
|
}
|
|
825
|
-
#updateButtons(value) {
|
|
1075
|
+
#updateButtons(value, range) {
|
|
826
1076
|
const move = this.#move;
|
|
827
1077
|
for (const button of this.incrementTargets) {
|
|
828
|
-
this.#toggleButton(button, value <
|
|
1078
|
+
this.#toggleButton(button, value < range.max, move);
|
|
829
1079
|
if (!this.#moves.isLatest(move)) return;
|
|
830
1080
|
}
|
|
831
1081
|
for (const button of this.decrementTargets) {
|
|
832
|
-
this.#toggleButton(button, value >
|
|
1082
|
+
this.#toggleButton(button, value > range.min, move);
|
|
833
1083
|
if (!this.#moves.isLatest(move)) return;
|
|
834
1084
|
}
|
|
835
1085
|
}
|