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,15 +1,109 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
function setAttributeIfChanged(element, name, value, beforeWrite) {
|
|
4
|
+
if (element.getAttribute(name) === value) return false;
|
|
5
|
+
beforeWrite?.();
|
|
6
|
+
if (value === null) element.removeAttribute(name);
|
|
7
|
+
else element.setAttribute(name, value);
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
var AuthoredMutationWatcher = class {
|
|
12
|
+
#onAuthored;
|
|
13
|
+
#claims = null;
|
|
14
|
+
#observer = null;
|
|
15
|
+
constructor(onAuthored) {
|
|
16
|
+
this.#onAuthored = onAuthored;
|
|
17
|
+
}
|
|
18
|
+
observe(root, options) {
|
|
19
|
+
this.disconnect();
|
|
20
|
+
const observer = new MutationObserver((records) => {
|
|
21
|
+
if (this.#observer !== observer) return;
|
|
22
|
+
const authored = this.#filter(records);
|
|
23
|
+
if (authored.length > 0) this.#onAuthored(authored);
|
|
24
|
+
});
|
|
25
|
+
this.#observer = observer;
|
|
26
|
+
this.#claims = { attributes: /* @__PURE__ */ new Map(), children: /* @__PURE__ */ new Map() };
|
|
27
|
+
observer.observe(root, {
|
|
28
|
+
attributes: true,
|
|
29
|
+
attributeFilter: [...options.attributes],
|
|
30
|
+
subtree: options.subtree ?? false,
|
|
31
|
+
childList: options.childList ?? false
|
|
32
|
+
});
|
|
33
|
+
if (options.ancestorAttributes) {
|
|
34
|
+
let ancestor = root.parentElement;
|
|
35
|
+
while (ancestor) {
|
|
36
|
+
observer.observe(ancestor, {
|
|
37
|
+
attributes: true,
|
|
38
|
+
attributeFilter: [...options.ancestorAttributes]
|
|
39
|
+
});
|
|
40
|
+
ancestor = ancestor.parentElement;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
claim(target, name, value) {
|
|
45
|
+
const claims = this.#claims?.attributes;
|
|
46
|
+
let attributes = claims?.get(target);
|
|
47
|
+
if (!attributes) {
|
|
48
|
+
attributes = /* @__PURE__ */ new Map();
|
|
49
|
+
claims?.set(target, attributes);
|
|
50
|
+
}
|
|
51
|
+
const pending = attributes.get(name);
|
|
52
|
+
attributes.set(name, { value, count: (pending?.count ?? 0) + 1 });
|
|
53
|
+
}
|
|
54
|
+
claimCurrent(target, name) {
|
|
55
|
+
this.claim(target, name, target.getAttribute(name));
|
|
56
|
+
}
|
|
57
|
+
claimChildList(target, added, removed) {
|
|
58
|
+
const claims = this.#claims?.children;
|
|
59
|
+
const pending = claims?.get(target) ?? { added: /* @__PURE__ */ new Map(), removed: /* @__PURE__ */ new Map() };
|
|
60
|
+
for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) + 1);
|
|
61
|
+
for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) + 1);
|
|
62
|
+
claims?.set(target, pending);
|
|
63
|
+
}
|
|
64
|
+
take() {
|
|
65
|
+
return this.#filter(this.#observer?.takeRecords() ?? []);
|
|
66
|
+
}
|
|
67
|
+
disconnect() {
|
|
68
|
+
this.#observer?.disconnect();
|
|
69
|
+
this.#observer = null;
|
|
70
|
+
this.#claims = null;
|
|
71
|
+
}
|
|
72
|
+
#filter(records) {
|
|
73
|
+
const authored = records.filter((record) => !this.#consume(record));
|
|
74
|
+
this.#claims?.attributes.clear();
|
|
75
|
+
this.#claims?.children.clear();
|
|
76
|
+
return authored;
|
|
77
|
+
}
|
|
78
|
+
#consume(record) {
|
|
79
|
+
if (record.type === "attributes") {
|
|
80
|
+
const target = record.target;
|
|
81
|
+
const pending2 = this.#claims?.attributes.get(target)?.get(record.attributeName);
|
|
82
|
+
if (!pending2 || pending2.count === 0 || target.getAttribute(record.attributeName) !== pending2.value) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
pending2.count -= 1;
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
const pending = this.#claims?.children.get(record.target);
|
|
89
|
+
if (!pending) return false;
|
|
90
|
+
const added = [...record.addedNodes];
|
|
91
|
+
const removed = [...record.removedNodes];
|
|
92
|
+
if (added.some((node) => !pending.added.get(node)) || removed.some((node) => !pending.removed.get(node))) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) - 1);
|
|
96
|
+
for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) - 1);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
4
100
|
|
|
5
|
-
// src/utils/default_attribute.ts
|
|
6
101
|
function setDefaultAttribute(element, name, value) {
|
|
7
102
|
if (element.hasAttribute(name)) return false;
|
|
8
103
|
element.setAttribute(name, value);
|
|
9
104
|
return true;
|
|
10
105
|
}
|
|
11
106
|
|
|
12
|
-
// src/utils/field_mirror.ts
|
|
13
107
|
function writeField(field, value) {
|
|
14
108
|
if (field.value === value) return false;
|
|
15
109
|
field.value = value;
|
|
@@ -19,7 +113,6 @@ function commitField(target) {
|
|
|
19
113
|
target.dispatchEvent(new Event("change", { bubbles: true }));
|
|
20
114
|
}
|
|
21
115
|
|
|
22
|
-
// src/utils/focus_candidate.ts
|
|
23
116
|
function inheritsFieldsetDisabled(control) {
|
|
24
117
|
let fieldset = control.closest("fieldset[disabled]");
|
|
25
118
|
while (fieldset) {
|
|
@@ -30,7 +123,6 @@ function inheritsFieldsetDisabled(control) {
|
|
|
30
123
|
return false;
|
|
31
124
|
}
|
|
32
125
|
|
|
33
|
-
// src/utils/interactive_host.ts
|
|
34
126
|
var INTERACTIVE_HOST_SELECTOR = "button, input, select, textarea, label, a[href], area[href], summary, details, audio[controls], video[controls], iframe, object, embed";
|
|
35
127
|
function isInteractiveHost(element) {
|
|
36
128
|
if (element.matches(INTERACTIVE_HOST_SELECTOR)) return true;
|
|
@@ -47,27 +139,36 @@ function isInteractiveHost(element) {
|
|
|
47
139
|
return false;
|
|
48
140
|
}
|
|
49
141
|
|
|
50
|
-
|
|
142
|
+
var ListenerSet = class {
|
|
143
|
+
#abort = new AbortController();
|
|
144
|
+
add(target, type, handler, options) {
|
|
145
|
+
target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
|
|
146
|
+
}
|
|
147
|
+
dispose() {
|
|
148
|
+
this.#abort.abort();
|
|
149
|
+
this.#abort = new AbortController();
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
51
153
|
var MicrotaskCoalescer = class {
|
|
52
154
|
#run;
|
|
53
155
|
#queued = false;
|
|
54
156
|
#active = false;
|
|
55
157
|
#generation = 0;
|
|
56
|
-
/** @param run - the single reconciliation pass, invoked at most once per batch. */
|
|
57
158
|
constructor(run) {
|
|
58
159
|
this.#run = run;
|
|
59
160
|
}
|
|
60
|
-
/** Opens the window in which {@link schedule} is honoured; call from `connect()`. */
|
|
61
161
|
activate() {
|
|
62
162
|
this.#active = true;
|
|
63
163
|
}
|
|
64
|
-
/** Closes the window and drops any pending pass; call from `disconnect()`. */
|
|
65
164
|
cancel() {
|
|
66
165
|
this.#active = false;
|
|
67
166
|
this.#queued = false;
|
|
68
167
|
this.#generation += 1;
|
|
69
168
|
}
|
|
70
|
-
|
|
169
|
+
get pending() {
|
|
170
|
+
return this.#queued;
|
|
171
|
+
}
|
|
71
172
|
schedule() {
|
|
72
173
|
if (!this.#active || this.#queued) return;
|
|
73
174
|
this.#queued = true;
|
|
@@ -80,7 +181,45 @@ var MicrotaskCoalescer = class {
|
|
|
80
181
|
}
|
|
81
182
|
};
|
|
82
183
|
|
|
83
|
-
|
|
184
|
+
var MorphRenderWatcher = class {
|
|
185
|
+
#listeners = new ListenerSet();
|
|
186
|
+
#pass;
|
|
187
|
+
#element = null;
|
|
188
|
+
#onMorph = () => this.#pass.schedule();
|
|
189
|
+
constructor(run) {
|
|
190
|
+
this.#pass = new MicrotaskCoalescer(run);
|
|
191
|
+
}
|
|
192
|
+
observe(element) {
|
|
193
|
+
if (this.#element === element) return;
|
|
194
|
+
this.disconnect();
|
|
195
|
+
this.#element = element;
|
|
196
|
+
this.#pass.activate();
|
|
197
|
+
this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
|
|
198
|
+
}
|
|
199
|
+
schedule() {
|
|
200
|
+
this.#pass.schedule();
|
|
201
|
+
}
|
|
202
|
+
get pending() {
|
|
203
|
+
return this.#pass.pending;
|
|
204
|
+
}
|
|
205
|
+
disconnect() {
|
|
206
|
+
this.#listeners.dispose();
|
|
207
|
+
this.#pass.cancel();
|
|
208
|
+
this.#element = null;
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
var MoveCounter = class {
|
|
213
|
+
#sequence = 0;
|
|
214
|
+
record() {
|
|
215
|
+
this.#sequence += 1;
|
|
216
|
+
return this.#sequence;
|
|
217
|
+
}
|
|
218
|
+
isLatest(token) {
|
|
219
|
+
return token === this.#sequence;
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
84
223
|
var OBSERVED_ATTRIBUTES = [
|
|
85
224
|
"role",
|
|
86
225
|
"aria-checked",
|
|
@@ -92,61 +231,49 @@ var OBSERVED_ATTRIBUTES = [
|
|
|
92
231
|
];
|
|
93
232
|
var OBSERVED_ANCESTOR_ATTRIBUTES = ["contenteditable"];
|
|
94
233
|
var SwitchController = class extends Controller {
|
|
234
|
+
#moves = new MoveCounter();
|
|
235
|
+
#connectionGeneration = 0;
|
|
95
236
|
static targets = ["field"];
|
|
96
237
|
static actions = ["onKeydown", "toggle"];
|
|
97
238
|
static events = ["change", "reconcile"];
|
|
98
|
-
|
|
99
|
-
#
|
|
100
|
-
/** Controller writes that must not be mistaken for authored morph changes. */
|
|
101
|
-
#internalAttributeValues = /* @__PURE__ */ new Map();
|
|
102
|
-
/** One pass per batch of retained-element changes and field arrivals. */
|
|
103
|
-
#pass = new MicrotaskCoalescer(() => this.#reconcile());
|
|
104
|
-
/** The checked state last published: read on connect, then committed or reported. */
|
|
239
|
+
#ownedDefaults = /* @__PURE__ */ new Map();
|
|
240
|
+
#pass = new MorphRenderWatcher(() => this.#reconcile());
|
|
105
241
|
#committedChecked = false;
|
|
106
|
-
#attributeObserver = new
|
|
242
|
+
#attributeObserver = new AuthoredMutationWatcher((records) => {
|
|
107
243
|
this.#releaseAuthoredDefaults(records);
|
|
108
244
|
this.#pass.schedule();
|
|
109
245
|
});
|
|
110
|
-
/** Blocks disabled pointer/native-key activation before consumer click handlers. */
|
|
111
246
|
#onClickCapture = (event) => {
|
|
112
247
|
if (!this.#isSupportedHost || !this.#isActivationDisabled) return;
|
|
113
248
|
event.preventDefault();
|
|
114
249
|
event.stopImmediatePropagation();
|
|
115
250
|
};
|
|
116
|
-
|
|
117
|
-
* Ensures the switch exposes a role and is keyboard-reachable, and takes the
|
|
118
|
-
* state it finds as the one a later move is measured from, reporting nothing.
|
|
119
|
-
*/
|
|
251
|
+
#listeners = new ListenerSet();
|
|
120
252
|
connect() {
|
|
253
|
+
this.#releaseDefaultsRewrittenWhileAway();
|
|
121
254
|
this.#reconcileDefaults();
|
|
122
255
|
this.#mirrorField(false);
|
|
123
256
|
this.#committedChecked = this.#checked;
|
|
124
|
-
this.element
|
|
125
|
-
this.#pass.
|
|
257
|
+
this.#listeners.add(this.element, "click", this.#onClickCapture, { capture: true });
|
|
258
|
+
this.#pass.observe(this.element);
|
|
126
259
|
this.#observeAttributes();
|
|
127
260
|
}
|
|
128
|
-
/** Fills a form field inserted or replaced at runtime with the current state. */
|
|
129
261
|
fieldTargetConnected() {
|
|
130
262
|
this.#pass.schedule();
|
|
131
263
|
}
|
|
132
|
-
|
|
264
|
+
fieldTargetDisconnected() {
|
|
265
|
+
this.#pass.schedule();
|
|
266
|
+
}
|
|
133
267
|
disconnect() {
|
|
134
|
-
this.#
|
|
135
|
-
this.
|
|
268
|
+
this.#connectionGeneration += 1;
|
|
269
|
+
this.#pass.disconnect();
|
|
270
|
+
this.#listeners.dispose();
|
|
136
271
|
this.#attributeObserver.disconnect();
|
|
137
|
-
this.#internalAttributeValues.clear();
|
|
138
272
|
}
|
|
139
|
-
/** Toggles the checked state. Bound via `data-action` (click). */
|
|
140
273
|
toggle() {
|
|
141
274
|
if (!this.#isSupportedHost || this.#isActivationDisabled) return;
|
|
142
275
|
this.#commit(!this.#checked);
|
|
143
276
|
}
|
|
144
|
-
/**
|
|
145
|
-
* Activates the switch on Space/Enter for non-native hosts and suppresses key
|
|
146
|
-
* repeat. Bound via `data-action` (keydown). A native `<button type="button">`
|
|
147
|
-
* owns the initial key-to-click synthesis; repeated keydowns are canceled before
|
|
148
|
-
* the browser can synthesize additional clicks.
|
|
149
|
-
*/
|
|
150
277
|
onKeydown(event) {
|
|
151
278
|
if (event.defaultPrevented) return;
|
|
152
279
|
if (!this.#isSupportedHost) return;
|
|
@@ -164,29 +291,21 @@ var SwitchController = class extends Controller {
|
|
|
164
291
|
if (event.repeat) return;
|
|
165
292
|
this.toggle();
|
|
166
293
|
}
|
|
167
|
-
/**
|
|
168
|
-
* Re-derives the defaults and the field after the page changed the host, then
|
|
169
|
-
* reports a checked state that moved. Records still queued are read first, so
|
|
170
|
-
* an author's write is not lost when observation is suspended for this pass's
|
|
171
|
-
* own writes; observation resumes before the report, so an edit a listener
|
|
172
|
-
* makes is seen by the next pass.
|
|
173
|
-
*/
|
|
174
294
|
#reconcile() {
|
|
175
|
-
this.#releaseAuthoredDefaults(this.#attributeObserver.
|
|
176
|
-
this.#attributeObserver.disconnect();
|
|
295
|
+
this.#releaseAuthoredDefaults(this.#attributeObserver.take());
|
|
177
296
|
this.#reconcileDefaults();
|
|
178
297
|
this.#mirrorField(false);
|
|
179
|
-
this.#
|
|
298
|
+
const authored = this.#attributeObserver.take();
|
|
299
|
+
this.#releaseAuthoredDefaults(authored);
|
|
300
|
+
if (authored.length > 0) this.#pass.schedule();
|
|
180
301
|
this.#reportMove();
|
|
181
302
|
}
|
|
182
|
-
/** Reports a checked state that moved since the one this switch last published. */
|
|
183
303
|
#reportMove() {
|
|
184
304
|
const checked = this.#checked;
|
|
185
305
|
if (checked === this.#committedChecked) return;
|
|
186
306
|
this.#committedChecked = checked;
|
|
187
307
|
this.dispatch("reconcile", { detail: { checked } });
|
|
188
308
|
}
|
|
189
|
-
/** Re-adds only missing defaults, preserving every authored attribute value. */
|
|
190
309
|
#reconcileDefaults() {
|
|
191
310
|
if (!this.#isSupportedHost) {
|
|
192
311
|
this.#removeOwnedDefaults();
|
|
@@ -198,61 +317,50 @@ var SwitchController = class extends Controller {
|
|
|
198
317
|
this.#setOwnedDefault("tabindex", "0");
|
|
199
318
|
}
|
|
200
319
|
}
|
|
201
|
-
/** Mirrors the checked state into the optional form field. */
|
|
202
320
|
#mirrorField(notify) {
|
|
203
321
|
if (!this.hasFieldTarget) return;
|
|
204
322
|
const moved = writeField(this.fieldTarget, this.#checked ? "true" : "false");
|
|
205
323
|
if (moved && notify) commitField(this.fieldTarget);
|
|
206
324
|
}
|
|
207
|
-
/** Records a newly introduced default without claiming authored markup. */
|
|
208
325
|
#setOwnedDefault(name, value) {
|
|
209
|
-
if (setDefaultAttribute(this.element, name, value))
|
|
326
|
+
if (setDefaultAttribute(this.element, name, value)) {
|
|
327
|
+
this.#ownedDefaults.set(name, value);
|
|
328
|
+
this.#attributeObserver.claimCurrent(this.element, name);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
#releaseDefaultsRewrittenWhileAway() {
|
|
332
|
+
for (const [name, written] of this.#ownedDefaults) {
|
|
333
|
+
const value = this.element.getAttribute(name);
|
|
334
|
+
if (value !== null && value !== written) this.#ownedDefaults.delete(name);
|
|
335
|
+
}
|
|
210
336
|
}
|
|
211
|
-
/**
|
|
212
|
-
* Gives ownership back when a retained-element morph authors a value. Missing
|
|
213
|
-
* owned attributes stay owned so reconciliation can restore them.
|
|
214
|
-
*/
|
|
215
337
|
#releaseAuthoredDefaults(records) {
|
|
216
338
|
for (const record of records) {
|
|
217
339
|
if (record.target === this.element) {
|
|
218
340
|
const name = record.attributeName;
|
|
219
341
|
if (name && this.#ownedDefaults.has(name)) {
|
|
220
342
|
const value = this.element.getAttribute(name);
|
|
221
|
-
if (value !== null
|
|
343
|
+
if (value !== null) {
|
|
222
344
|
this.#ownedDefaults.delete(name);
|
|
223
345
|
}
|
|
224
346
|
}
|
|
225
347
|
}
|
|
226
348
|
}
|
|
227
|
-
this.#internalAttributeValues.clear();
|
|
228
349
|
}
|
|
229
|
-
/** Removes only defaults introduced by this instance when a host becomes invalid. */
|
|
230
350
|
#removeOwnedDefaults() {
|
|
231
|
-
for (const name of this.#ownedDefaults) this
|
|
351
|
+
for (const name of this.#ownedDefaults.keys()) this.#writeAttribute(name, null);
|
|
232
352
|
this.#ownedDefaults.clear();
|
|
233
|
-
this.#internalAttributeValues.clear();
|
|
234
353
|
}
|
|
235
|
-
/** Watches retained host attributes that Turbo can morph without reconnecting. */
|
|
236
354
|
#observeAttributes() {
|
|
237
355
|
this.#attributeObserver.observe(this.element, {
|
|
238
|
-
attributes:
|
|
239
|
-
|
|
356
|
+
attributes: OBSERVED_ATTRIBUTES,
|
|
357
|
+
ancestorAttributes: OBSERVED_ANCESTOR_ATTRIBUTES
|
|
240
358
|
});
|
|
241
|
-
let ancestor = this.element.parentElement;
|
|
242
|
-
while (ancestor) {
|
|
243
|
-
this.#attributeObserver.observe(ancestor, {
|
|
244
|
-
attributes: true,
|
|
245
|
-
attributeFilter: OBSERVED_ANCESTOR_ATTRIBUTES
|
|
246
|
-
});
|
|
247
|
-
ancestor = ancestor.parentElement;
|
|
248
|
-
}
|
|
249
359
|
}
|
|
250
|
-
/** Whether the host has one activation model that this controller can own. */
|
|
251
360
|
get #isSupportedHost() {
|
|
252
361
|
if (this.element instanceof HTMLButtonElement) return this.element.type === "button";
|
|
253
362
|
return !isInteractiveHost(this.element);
|
|
254
363
|
}
|
|
255
|
-
/** Whether ARIA or native HTML semantics make the supported switch inoperable. */
|
|
256
364
|
get #isActivationDisabled() {
|
|
257
365
|
let current = this.element;
|
|
258
366
|
while (current) {
|
|
@@ -262,25 +370,34 @@ var SwitchController = class extends Controller {
|
|
|
262
370
|
if (!(this.element instanceof HTMLButtonElement)) return false;
|
|
263
371
|
return this.element.disabled || inheritsFieldsetDisabled(this.element);
|
|
264
372
|
}
|
|
265
|
-
/** Whether the switch is currently on. */
|
|
266
373
|
get #checked() {
|
|
267
374
|
return this.element.getAttribute("aria-checked") === "true";
|
|
268
375
|
}
|
|
269
|
-
/**
|
|
270
|
-
* Applies one toggle the user made. The state is taken as published before
|
|
271
|
-
* either report goes out, so a listener that toggles again or writes the
|
|
272
|
-
* attribute is measured from it.
|
|
273
|
-
*/
|
|
274
376
|
#commit(value) {
|
|
377
|
+
const generation = this.#connectionGeneration;
|
|
275
378
|
const reflected = value ? "true" : "false";
|
|
276
|
-
this.#
|
|
277
|
-
this
|
|
379
|
+
const authored = this.#attributeObserver.take();
|
|
380
|
+
this.#releaseAuthoredDefaults(authored);
|
|
381
|
+
if (authored.length > 0) this.#pass.schedule();
|
|
382
|
+
if (this.#ownedDefaults.has("aria-checked")) this.#ownedDefaults.set("aria-checked", reflected);
|
|
383
|
+
this.#writeAttribute("aria-checked", reflected);
|
|
384
|
+
const changed = value !== this.#committedChecked;
|
|
278
385
|
this.#committedChecked = value;
|
|
386
|
+
if (!changed) {
|
|
387
|
+
this.#mirrorField(false);
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const token = this.#moves.record();
|
|
279
391
|
this.#mirrorField(true);
|
|
392
|
+
if (generation !== this.#connectionGeneration || !this.#moves.isLatest(token)) return;
|
|
280
393
|
this.dispatch("change", { detail: { checked: value } });
|
|
281
394
|
}
|
|
395
|
+
#writeAttribute(name, value) {
|
|
396
|
+
setAttributeIfChanged(this.element, name, value, () => {
|
|
397
|
+
this.#attributeObserver.claim(this.element, name, value);
|
|
398
|
+
});
|
|
399
|
+
}
|
|
282
400
|
};
|
|
283
401
|
|
|
284
402
|
export { SwitchController };
|
|
285
|
-
//# sourceMappingURL=switch_controller.js.map
|
|
286
403
|
//# sourceMappingURL=switch_controller.js.map
|