stimeo-ui 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +209 -0
- package/README.md +128 -1
- package/dist/cable/index.d.ts +79 -23
- package/dist/cable/index.js +392 -417
- package/dist/cable/index.js.map +1 -1
- package/dist/controllers/accordion_controller.d.ts +34 -5
- package/dist/controllers/accordion_controller.js +228 -28
- package/dist/controllers/accordion_controller.js.map +1 -1
- package/dist/controllers/alert_dialog_controller.d.ts +20 -9
- package/dist/controllers/alert_dialog_controller.js +862 -221
- package/dist/controllers/alert_dialog_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.d.ts +38 -7
- package/dist/controllers/announcer_controller.js +135 -191
- 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 +295 -110
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.js +172 -106
- package/dist/controllers/avatar_controller.js.map +1 -1
- package/dist/controllers/breadcrumb_controller.d.ts +10 -7
- package/dist/controllers/breadcrumb_controller.js +0 -129
- package/dist/controllers/breadcrumb_controller.js.map +1 -1
- package/dist/controllers/bulk_select_controller.d.ts +22 -4
- package/dist/controllers/bulk_select_controller.js +264 -53
- package/dist/controllers/bulk_select_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +109 -28
- package/dist/controllers/calendar_controller.js +346 -180
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +99 -27
- package/dist/controllers/carousel_controller.js +587 -300
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/character_counter_controller.d.ts +18 -2
- package/dist/controllers/character_counter_controller.js +271 -143
- 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 +77 -75
- package/dist/controllers/checkbox_controller.js.map +1 -1
- package/dist/controllers/clipboard_controller.d.ts +44 -7
- package/dist/controllers/clipboard_controller.js +187 -108
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +41 -5
- package/dist/controllers/collapsible_controller.js +374 -108
- package/dist/controllers/collapsible_controller.js.map +1 -1
- package/dist/controllers/color_picker_controller.d.ts +47 -14
- package/dist/controllers/color_picker_controller.js +183 -127
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/combobox_controller.d.ts +33 -6
- package/dist/controllers/combobox_controller.js +426 -109
- package/dist/controllers/combobox_controller.js.map +1 -1
- package/dist/controllers/command_palette_controller.d.ts +45 -14
- package/dist/controllers/command_palette_controller.js +994 -350
- 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 +212 -125
- package/dist/controllers/conditional_fields_controller.js.map +1 -1
- package/dist/controllers/confirm_controller.d.ts +49 -12
- package/dist/controllers/confirm_controller.js +939 -245
- package/dist/controllers/confirm_controller.js.map +1 -1
- package/dist/controllers/context_menu_controller.d.ts +36 -3
- package/dist/controllers/context_menu_controller.js +275 -127
- 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 +75 -2
- package/dist/controllers/countdown_controller.js +235 -97
- package/dist/controllers/countdown_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +93 -15
- package/dist/controllers/currency_input_controller.js +241 -118
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/data_grid_controller.d.ts +78 -22
- package/dist/controllers/data_grid_controller.js +229 -135
- package/dist/controllers/data_grid_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +64 -11
- package/dist/controllers/date_range_picker_controller.js +359 -165
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +22 -3
- package/dist/controllers/dialog_controller.js +887 -225
- package/dist/controllers/dialog_controller.js.map +1 -1
- package/dist/controllers/direct_upload_controller.d.ts +24 -7
- package/dist/controllers/direct_upload_controller.js +80 -142
- package/dist/controllers/direct_upload_controller.js.map +1 -1
- package/dist/controllers/dirty_form_controller.d.ts +2 -2
- package/dist/controllers/dirty_form_controller.js +26 -47
- package/dist/controllers/dirty_form_controller.js.map +1 -1
- package/dist/controllers/dismissible_controller.d.ts +19 -0
- package/dist/controllers/dismissible_controller.js +175 -20
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/drawer_controller.d.ts +52 -16
- package/dist/controllers/drawer_controller.js +963 -336
- package/dist/controllers/drawer_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.d.ts +39 -3
- package/dist/controllers/dropdown_controller.js +342 -85
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/editable_controller.d.ts +12 -1
- package/dist/controllers/editable_controller.js +182 -58
- package/dist/controllers/editable_controller.js.map +1 -1
- package/dist/controllers/empty_state_controller.js +67 -53
- package/dist/controllers/empty_state_controller.js.map +1 -1
- package/dist/controllers/file_dropzone_controller.d.ts +60 -18
- package/dist/controllers/file_dropzone_controller.js +426 -229
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/filter_controller.d.ts +10 -4
- package/dist/controllers/filter_controller.js +78 -36
- package/dist/controllers/filter_controller.js.map +1 -1
- package/dist/controllers/flash_controller.d.ts +57 -14
- package/dist/controllers/flash_controller.js +328 -211
- package/dist/controllers/flash_controller.js.map +1 -1
- package/dist/controllers/focus_controller.d.ts +12 -3
- package/dist/controllers/focus_controller.js +654 -239
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +153 -136
- package/dist/controllers/form_field_controller.js.map +1 -1
- package/dist/controllers/form_validation_controller.js +29 -96
- package/dist/controllers/form_validation_controller.js.map +1 -1
- package/dist/controllers/frame_loading_controller.d.ts +41 -9
- package/dist/controllers/frame_loading_controller.js +263 -198
- package/dist/controllers/frame_loading_controller.js.map +1 -1
- package/dist/controllers/highlight_controller.d.ts +22 -2
- package/dist/controllers/highlight_controller.js +119 -70
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/hover_card_controller.d.ts +65 -4
- package/dist/controllers/hover_card_controller.js +335 -118
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +58 -4
- package/dist/controllers/idle_controller.js +316 -65
- package/dist/controllers/idle_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.d.ts +5 -2
- package/dist/controllers/input_mask_controller.js +116 -61
- package/dist/controllers/input_mask_controller.js.map +1 -1
- package/dist/controllers/intersection_controller.d.ts +32 -13
- package/dist/controllers/intersection_controller.js +147 -103
- package/dist/controllers/intersection_controller.js.map +1 -1
- package/dist/controllers/lazy_frame_controller.d.ts +16 -0
- package/dist/controllers/lazy_frame_controller.js +9 -56
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/listbox_controller.d.ts +84 -10
- package/dist/controllers/listbox_controller.js +413 -153
- package/dist/controllers/listbox_controller.js.map +1 -1
- package/dist/controllers/local_time_controller.d.ts +1 -1
- package/dist/controllers/local_time_controller.js +54 -64
- package/dist/controllers/local_time_controller.js.map +1 -1
- package/dist/controllers/masonry_controller.d.ts +11 -3
- package/dist/controllers/masonry_controller.js +70 -95
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.d.ts +40 -9
- package/dist/controllers/menu_controller.js +254 -167
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.d.ts +15 -4
- package/dist/controllers/menubar_controller.js +206 -331
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/meter_controller.d.ts +20 -0
- package/dist/controllers/meter_controller.js +159 -71
- package/dist/controllers/meter_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +50 -7
- package/dist/controllers/multi_select_controller.js +797 -388
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.d.ts +19 -1
- package/dist/controllers/navigation_menu_controller.js +156 -231
- 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 +373 -174
- 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 +241 -45
- package/dist/controllers/network_status_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +62 -10
- package/dist/controllers/number_input_controller.js +387 -227
- package/dist/controllers/number_input_controller.js.map +1 -1
- package/dist/controllers/optimistic_controller.js +28 -75
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.d.ts +38 -7
- package/dist/controllers/otp_controller.js +344 -196
- package/dist/controllers/otp_controller.js.map +1 -1
- package/dist/controllers/overflow_indicator_controller.d.ts +13 -12
- package/dist/controllers/overflow_indicator_controller.js +167 -93
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.d.ts +66 -9
- package/dist/controllers/overflow_menu_controller.js +408 -277
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.d.ts +52 -15
- package/dist/controllers/pagination_controller.js +342 -120
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +60 -9
- package/dist/controllers/password_reveal_controller.js +424 -99
- package/dist/controllers/password_reveal_controller.js.map +1 -1
- package/dist/controllers/password_strength_controller.d.ts +14 -5
- package/dist/controllers/password_strength_controller.js +99 -153
- package/dist/controllers/password_strength_controller.js.map +1 -1
- package/dist/controllers/persist_controller.d.ts +11 -4
- package/dist/controllers/persist_controller.js +252 -96
- package/dist/controllers/persist_controller.js.map +1 -1
- package/dist/controllers/pointer_drag_controller.d.ts +19 -7
- package/dist/controllers/pointer_drag_controller.js +263 -164
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +46 -4
- package/dist/controllers/popover_controller.js +267 -94
- package/dist/controllers/popover_controller.js.map +1 -1
- package/dist/controllers/portal_controller.d.ts +44 -4
- package/dist/controllers/portal_controller.js +209 -72
- 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 -112
- package/dist/controllers/preview_guard_controller.js.map +1 -1
- package/dist/controllers/progress_controller.d.ts +11 -0
- package/dist/controllers/progress_controller.js +132 -59
- package/dist/controllers/progress_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +19 -8
- package/dist/controllers/radio_group_controller.js +138 -133
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/range_slider_controller.d.ts +92 -4
- package/dist/controllers/range_slider_controller.js +245 -112
- package/dist/controllers/range_slider_controller.js.map +1 -1
- package/dist/controllers/rating_controller.d.ts +33 -6
- package/dist/controllers/rating_controller.js +429 -194
- package/dist/controllers/rating_controller.js.map +1 -1
- package/dist/controllers/read_more_controller.d.ts +26 -2
- package/dist/controllers/read_more_controller.js +185 -47
- package/dist/controllers/read_more_controller.js.map +1 -1
- package/dist/controllers/reading_progress_controller.d.ts +1 -1
- package/dist/controllers/reading_progress_controller.js +147 -135
- package/dist/controllers/reading_progress_controller.js.map +1 -1
- package/dist/controllers/relative_time_controller.d.ts +18 -4
- package/dist/controllers/relative_time_controller.js +145 -110
- package/dist/controllers/relative_time_controller.js.map +1 -1
- package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
- package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +97 -38
- package/dist/controllers/reset_on_restore_controller.js.map +1 -0
- package/dist/controllers/resizable_controller.d.ts +44 -4
- package/dist/controllers/resizable_controller.js +294 -118
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/roving_controller.js +39 -84
- package/dist/controllers/roving_controller.js.map +1 -1
- package/dist/controllers/scroll_area_controller.d.ts +7 -3
- package/dist/controllers/scroll_area_controller.js +428 -221
- package/dist/controllers/scroll_area_controller.js.map +1 -1
- package/dist/controllers/scroll_restore_controller.js +0 -53
- package/dist/controllers/scroll_restore_controller.js.map +1 -1
- package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
- package/dist/controllers/scroll_visibility_controller.js +395 -146
- package/dist/controllers/scroll_visibility_controller.js.map +1 -1
- package/dist/controllers/scrollspy_controller.d.ts +9 -3
- package/dist/controllers/scrollspy_controller.js +181 -236
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/separator_controller.d.ts +59 -17
- package/dist/controllers/separator_controller.js +288 -132
- package/dist/controllers/separator_controller.js.map +1 -1
- package/dist/controllers/sidebar_controller.d.ts +81 -7
- package/dist/controllers/sidebar_controller.js +1071 -375
- package/dist/controllers/sidebar_controller.js.map +1 -1
- package/dist/controllers/skeleton_controller.d.ts +23 -0
- package/dist/controllers/skeleton_controller.js +248 -92
- package/dist/controllers/skeleton_controller.js.map +1 -1
- package/dist/controllers/slider_controller.d.ts +72 -8
- package/dist/controllers/slider_controller.js +211 -96
- package/dist/controllers/slider_controller.js.map +1 -1
- package/dist/controllers/smart_sticky_header_controller.d.ts +21 -3
- package/dist/controllers/smart_sticky_header_controller.js +163 -54
- package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
- package/dist/controllers/sortable_controller.js +13 -110
- package/dist/controllers/sortable_controller.js.map +1 -1
- package/dist/controllers/spinner_controller.d.ts +39 -4
- package/dist/controllers/spinner_controller.js +277 -161
- package/dist/controllers/spinner_controller.js.map +1 -1
- package/dist/controllers/step_indicator_controller.d.ts +24 -17
- package/dist/controllers/step_indicator_controller.js +107 -53
- package/dist/controllers/step_indicator_controller.js.map +1 -1
- package/dist/controllers/stepper_controller.d.ts +43 -9
- package/dist/controllers/stepper_controller.js +171 -48
- package/dist/controllers/stepper_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.d.ts +25 -0
- package/dist/controllers/stick_to_bottom_controller.js +310 -116
- package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
- package/dist/controllers/sticky_observer_controller.d.ts +11 -0
- package/dist/controllers/sticky_observer_controller.js +214 -49
- package/dist/controllers/sticky_observer_controller.js.map +1 -1
- package/dist/controllers/submit_once_controller.d.ts +22 -6
- package/dist/controllers/submit_once_controller.js +294 -192
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +40 -7
- package/dist/controllers/switch_controller.js +107 -43
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +13 -1
- package/dist/controllers/tabs_controller.js +50 -25
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +27 -3
- package/dist/controllers/tags_input_controller.js +290 -149
- package/dist/controllers/tags_input_controller.js.map +1 -1
- package/dist/controllers/textarea_autosize_controller.d.ts +10 -0
- package/dist/controllers/textarea_autosize_controller.js +71 -58
- package/dist/controllers/textarea_autosize_controller.js.map +1 -1
- package/dist/controllers/theme_controller.d.ts +37 -8
- package/dist/controllers/theme_controller.js +148 -80
- package/dist/controllers/theme_controller.js.map +1 -1
- package/dist/controllers/time_picker_controller.d.ts +18 -1
- package/dist/controllers/time_picker_controller.js +162 -81
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +85 -23
- package/dist/controllers/toast_controller.js +365 -193
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +60 -9
- package/dist/controllers/toggle_group_controller.js +194 -99
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.js +92 -90
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +52 -2
- package/dist/controllers/tooltip_controller.js +185 -125
- 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 -115
- package/dist/controllers/transition_controller.js.map +1 -1
- package/dist/controllers/tree_view_controller.d.ts +59 -18
- package/dist/controllers/tree_view_controller.js +248 -290
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.d.ts +33 -3
- package/dist/index.js +8649 -8572
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +95 -9
- package/dist/inspector/cli.js +343 -77
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +390 -96
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +45 -45
- package/dist/inspector/manifest.json +1308 -155
- package/dist/positioning/index.d.ts +8 -0
- package/dist/positioning/index.js +148 -45
- package/dist/positioning/index.js.map +1 -1
- package/package.json +7 -7
- package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
- package/dist/controllers/reset_before_cache_controller.js.map +0 -1
|
@@ -28,6 +28,11 @@ type Trigger = HTMLInputElement | HTMLSelectElement;
|
|
|
28
28
|
* another region being hidden in the same pass — the controller root temporarily
|
|
29
29
|
* receives `tabindex="-1"` and focus.
|
|
30
30
|
*
|
|
31
|
+
* An element that stops being a region gets back what this controller wrote on
|
|
32
|
+
* it: `aria-hidden`, `data-visible`, the `hidden` a declared condition set, and
|
|
33
|
+
* the marked `disabled` of each control no hidden region still covers. The
|
|
34
|
+
* `hidden` of a region without a condition and every authored `disabled` stay.
|
|
35
|
+
*
|
|
31
36
|
* `change` and `reconcile` dispatch `{ region, visible }`.
|
|
32
37
|
*
|
|
33
38
|
* @remarks
|
|
@@ -71,8 +76,16 @@ declare class ConditionalFieldsController extends Controller<HTMLElement> {
|
|
|
71
76
|
triggerTargetDisconnected(): void;
|
|
72
77
|
/** Initializes a region target inserted or restored at runtime. */
|
|
73
78
|
regionTargetConnected(): void;
|
|
74
|
-
/**
|
|
75
|
-
|
|
79
|
+
/**
|
|
80
|
+
* Queues a departed region for the return of its written state and reconciles the rest.
|
|
81
|
+
*
|
|
82
|
+
* The return is queued rather than immediate because teardown reports every
|
|
83
|
+
* region as disconnected, and a disconnected controller leaves its derived state
|
|
84
|
+
* in the DOM. The pass that drains the queue skips an element that is still a
|
|
85
|
+
* region, which drops what teardown queued, and keeps a departure queued before
|
|
86
|
+
* a disconnect for the pass after the reconnect.
|
|
87
|
+
*/
|
|
88
|
+
regionTargetDisconnected(region: HTMLElement): void;
|
|
76
89
|
/** Reconciles when application code or a morph changes the match policy. */
|
|
77
90
|
matchValueChanged(): void;
|
|
78
91
|
/** Reconciles control ownership when hidden controls become enabled or excluded. */
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
-
// src/controllers/conditional_fields_controller.ts
|
|
4
|
-
|
|
5
|
-
// src/utils/event_owner.ts
|
|
6
3
|
function ownerIndex(candidates, node) {
|
|
7
4
|
if (!(node instanceof Node)) return -1;
|
|
8
5
|
return candidates.findIndex((candidate) => candidate.contains(node));
|
|
9
6
|
}
|
|
10
7
|
|
|
11
|
-
// src/utils/focus_candidate.ts
|
|
12
8
|
function inheritsFieldsetDisabled(control) {
|
|
13
9
|
let fieldset = control.closest("fieldset[disabled]");
|
|
14
10
|
while (fieldset) {
|
|
@@ -18,59 +14,92 @@ function inheritsFieldsetDisabled(control) {
|
|
|
18
14
|
}
|
|
19
15
|
return false;
|
|
20
16
|
}
|
|
17
|
+
function unslotted(element) {
|
|
18
|
+
return element.assignedSlot === null && element.parentElement?.shadowRoot != null;
|
|
19
|
+
}
|
|
20
|
+
function flatTreeParent(element) {
|
|
21
|
+
if (unslotted(element)) return null;
|
|
22
|
+
const parent = element.assignedSlot ?? element.parentNode;
|
|
23
|
+
if (parent instanceof ShadowRoot) return parent.host;
|
|
24
|
+
return parent instanceof Element ? parent : null;
|
|
25
|
+
}
|
|
21
26
|
function canTakeFocus(element) {
|
|
22
|
-
|
|
27
|
+
for (let node = element; node; node = flatTreeParent(node)) {
|
|
28
|
+
if (unslotted(node) || node.matches("[hidden], [inert]")) return false;
|
|
29
|
+
}
|
|
23
30
|
if (element instanceof HTMLInputElement && element.type === "hidden") return false;
|
|
24
31
|
if (!("disabled" in element)) return true;
|
|
25
32
|
if (element.disabled) return false;
|
|
26
33
|
return !inheritsFieldsetDisabled(element);
|
|
27
34
|
}
|
|
28
35
|
|
|
29
|
-
|
|
36
|
+
var FormResetWatcher = class {
|
|
37
|
+
#owns;
|
|
38
|
+
#onReset;
|
|
39
|
+
#frames = /* @__PURE__ */ new Set();
|
|
40
|
+
#generation = 0;
|
|
41
|
+
constructor(owns, onReset) {
|
|
42
|
+
this.#owns = owns;
|
|
43
|
+
this.#onReset = onReset;
|
|
44
|
+
}
|
|
45
|
+
observe() {
|
|
46
|
+
document.addEventListener("reset", this.#handleReset, true);
|
|
47
|
+
}
|
|
48
|
+
disconnect() {
|
|
49
|
+
document.removeEventListener("reset", this.#handleReset, true);
|
|
50
|
+
this.#generation += 1;
|
|
51
|
+
for (const frame of this.#frames) cancelAnimationFrame(frame);
|
|
52
|
+
this.#frames.clear();
|
|
53
|
+
}
|
|
54
|
+
#handleReset = (event) => {
|
|
55
|
+
const form = event.target;
|
|
56
|
+
if (!(form instanceof HTMLFormElement) || !this.#owns(form)) return;
|
|
57
|
+
const generation = this.#generation;
|
|
58
|
+
queueMicrotask(() => {
|
|
59
|
+
if (generation !== this.#generation) return;
|
|
60
|
+
if (event.eventPhase === Event.NONE) {
|
|
61
|
+
this.#settle(event);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const frame = requestAnimationFrame(() => {
|
|
65
|
+
this.#frames.delete(frame);
|
|
66
|
+
this.#settle(event);
|
|
67
|
+
});
|
|
68
|
+
this.#frames.add(frame);
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
#settle(event) {
|
|
72
|
+
if (!event.defaultPrevented) this.#onReset();
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
30
76
|
var ListenerSet = class {
|
|
31
|
-
/** The generation every `add` joins until the next `dispose()`. */
|
|
32
77
|
#abort = new AbortController();
|
|
33
|
-
/**
|
|
34
|
-
* Attaches `handler` to the open generation, exactly as the caller spelled it.
|
|
35
|
-
*
|
|
36
|
-
* The set supplies the signal, so `options` carries everything else the DOM
|
|
37
|
-
* accepts — `capture` included, which has to match at release time and no
|
|
38
|
-
* longer has a second place to drift from.
|
|
39
|
-
*/
|
|
40
78
|
add(target, type, handler, options) {
|
|
41
79
|
target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
|
|
42
80
|
}
|
|
43
|
-
/**
|
|
44
|
-
* Releases every listener of the open generation, synchronously, and opens the
|
|
45
|
-
* next one. Idempotent, and safe before anything has been added.
|
|
46
|
-
*/
|
|
47
81
|
dispose() {
|
|
48
82
|
this.#abort.abort();
|
|
49
83
|
this.#abort = new AbortController();
|
|
50
84
|
}
|
|
51
85
|
};
|
|
52
86
|
|
|
53
|
-
// src/utils/microtask_coalescer.ts
|
|
54
87
|
var MicrotaskCoalescer = class {
|
|
55
88
|
#run;
|
|
56
89
|
#queued = false;
|
|
57
90
|
#active = false;
|
|
58
91
|
#generation = 0;
|
|
59
|
-
/** @param run - the single reconciliation pass, invoked at most once per batch. */
|
|
60
92
|
constructor(run) {
|
|
61
93
|
this.#run = run;
|
|
62
94
|
}
|
|
63
|
-
/** Opens the window in which {@link schedule} is honoured; call from `connect()`. */
|
|
64
95
|
activate() {
|
|
65
96
|
this.#active = true;
|
|
66
97
|
}
|
|
67
|
-
/** Closes the window and drops any pending pass; call from `disconnect()`. */
|
|
68
98
|
cancel() {
|
|
69
99
|
this.#active = false;
|
|
70
100
|
this.#queued = false;
|
|
71
101
|
this.#generation += 1;
|
|
72
102
|
}
|
|
73
|
-
/** Requests one pass after the batch settles. Idempotent; inert outside the window. */
|
|
74
103
|
schedule() {
|
|
75
104
|
if (!this.#active || this.#queued) return;
|
|
76
105
|
this.#queued = true;
|
|
@@ -83,68 +112,148 @@ var MicrotaskCoalescer = class {
|
|
|
83
112
|
}
|
|
84
113
|
};
|
|
85
114
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
};
|
|
94
|
-
#rewind;
|
|
95
|
-
/** @param rewind - the pass that returns this controller's state to its initial form. */
|
|
96
|
-
constructor(rewind) {
|
|
97
|
-
this.#rewind = rewind;
|
|
115
|
+
var MorphRenderWatcher = class {
|
|
116
|
+
#listeners = new ListenerSet();
|
|
117
|
+
#pass;
|
|
118
|
+
#element = null;
|
|
119
|
+
#onMorph = () => this.#pass.schedule();
|
|
120
|
+
constructor(run) {
|
|
121
|
+
this.#pass = new MicrotaskCoalescer(run);
|
|
98
122
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
123
|
+
observe(element) {
|
|
124
|
+
if (this.#element === element) return;
|
|
125
|
+
this.disconnect();
|
|
126
|
+
this.#element = element;
|
|
127
|
+
this.#pass.activate();
|
|
128
|
+
this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
|
|
129
|
+
}
|
|
130
|
+
schedule() {
|
|
131
|
+
this.#pass.schedule();
|
|
106
132
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
document.removeEventListener("turbo:before-cache", _BeforeCacheReset.#onBeforeCache);
|
|
133
|
+
disconnect() {
|
|
134
|
+
this.#listeners.dispose();
|
|
135
|
+
this.#pass.cancel();
|
|
136
|
+
this.#element = null;
|
|
112
137
|
}
|
|
113
138
|
};
|
|
114
139
|
|
|
115
|
-
|
|
116
|
-
|
|
140
|
+
function queryOpenDescendants(root, selector) {
|
|
141
|
+
const matches = [];
|
|
142
|
+
const roots = [root];
|
|
143
|
+
for (const scope of roots) {
|
|
144
|
+
matches.push(...scope.querySelectorAll(selector));
|
|
145
|
+
if (scope.nodeType === Node.ELEMENT_NODE) {
|
|
146
|
+
const shadow = scope.shadowRoot;
|
|
147
|
+
if (shadow) roots.push(shadow);
|
|
148
|
+
}
|
|
149
|
+
for (const element of scope.querySelectorAll("*")) {
|
|
150
|
+
if (element.shadowRoot) roots.push(element.shadowRoot);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return matches;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function sharedRegistry(key, create) {
|
|
157
|
+
const symbol = Symbol.for(key);
|
|
158
|
+
const scope = globalThis;
|
|
159
|
+
const existing = scope[symbol];
|
|
160
|
+
if (existing !== void 0) return existing;
|
|
161
|
+
const registry = create();
|
|
162
|
+
Object.defineProperty(globalThis, symbol, { value: registry });
|
|
163
|
+
return registry;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
var TabindexLoan = class _TabindexLoan {
|
|
167
|
+
static #registry = sharedRegistry(
|
|
168
|
+
"stimeo-ui.tabindex-loan.registry.v1",
|
|
169
|
+
() => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Set() })
|
|
170
|
+
);
|
|
117
171
|
#value;
|
|
172
|
+
#record;
|
|
118
173
|
#lent = /* @__PURE__ */ new Set();
|
|
119
|
-
|
|
120
|
-
#beforeCache = new BeforeCacheReset(() => this.returnAll());
|
|
121
|
-
/**
|
|
122
|
-
* @param value - the `tabindex` to lend. `"-1"` (the default) is
|
|
123
|
-
* programmatically focusable but not a Tab stop; `"0"` is a real Tab stop,
|
|
124
|
-
* which a scroll region with no focusable content of its own needs.
|
|
125
|
-
*/
|
|
126
|
-
constructor(value = "-1") {
|
|
174
|
+
constructor(value, owner) {
|
|
127
175
|
this.#value = value;
|
|
176
|
+
this.#record = `data-${owner}-tabindex-loan`;
|
|
177
|
+
_TabindexLoan.#registry.names.add(this.#record);
|
|
128
178
|
}
|
|
129
|
-
/** Lends `element` the value; no-ops when it already carries a `tabindex`. */
|
|
130
179
|
lend(element) {
|
|
131
|
-
|
|
132
|
-
element.
|
|
180
|
+
const stack = this.#stack(element);
|
|
181
|
+
const current = element.getAttribute("tabindex");
|
|
182
|
+
const held = stack.find((hold) => hold.loan === this) ?? stack.find(
|
|
183
|
+
(hold) => hold.loan === null && hold.record === this.#record && hold.value === this.#value
|
|
184
|
+
);
|
|
185
|
+
const linked = stack.at(-1)?.value === current;
|
|
186
|
+
if (!held && current !== null && !linked) return;
|
|
133
187
|
this.#lent.add(element);
|
|
134
|
-
|
|
188
|
+
if (held) held.loan = this;
|
|
189
|
+
else stack.push({ loan: this, record: this.#record, value: this.#value, linked });
|
|
190
|
+
this.#mark(element, stack);
|
|
191
|
+
if (current === null || !held && current !== this.#value) {
|
|
192
|
+
element.setAttribute("tabindex", this.#value);
|
|
193
|
+
}
|
|
135
194
|
}
|
|
136
|
-
/** Takes back every loan whose value is still the one that was lent. */
|
|
137
195
|
returnAll() {
|
|
138
196
|
for (const element of this.#lent) {
|
|
139
|
-
|
|
197
|
+
const stack = this.#stack(element);
|
|
198
|
+
const hold = stack.find((held) => held.loan === this);
|
|
199
|
+
if (hold) this.#release(element, stack, hold);
|
|
140
200
|
}
|
|
141
201
|
this.#lent.clear();
|
|
142
|
-
|
|
202
|
+
}
|
|
203
|
+
reclaim(element) {
|
|
204
|
+
if (element.getAttribute(this.#record) !== this.#value) return;
|
|
205
|
+
const stack = this.#stack(element);
|
|
206
|
+
const hold = stack.find((held) => held.loan === null && held.record === this.#record);
|
|
207
|
+
if (hold && !element.matches(":focus")) this.#release(element, stack, hold);
|
|
208
|
+
}
|
|
209
|
+
reclaimWithin(root) {
|
|
210
|
+
for (const element of queryOpenDescendants(root, `[${this.#record}]`)) {
|
|
211
|
+
this.reclaim(element);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
#stack(element) {
|
|
215
|
+
const stacks = _TabindexLoan.#registry.stacks;
|
|
216
|
+
const stack = stacks.get(element) ?? this.#seed(element);
|
|
217
|
+
stacks.set(element, stack);
|
|
218
|
+
return stack;
|
|
219
|
+
}
|
|
220
|
+
#seed(element) {
|
|
221
|
+
const current = element.getAttribute("tabindex");
|
|
222
|
+
const holds = [];
|
|
223
|
+
for (const record of _TabindexLoan.#registry.names) {
|
|
224
|
+
const value = element.getAttribute(record);
|
|
225
|
+
if (value !== null) holds.push({ loan: null, record, value, linked: true });
|
|
226
|
+
}
|
|
227
|
+
holds.sort((one, other) => Number(one.value === current) - Number(other.value === current));
|
|
228
|
+
for (const [index, hold] of holds.entries()) hold.linked = index > 0;
|
|
229
|
+
return holds;
|
|
230
|
+
}
|
|
231
|
+
#release(element, stack, hold) {
|
|
232
|
+
const current = element.getAttribute("tabindex");
|
|
233
|
+
const index = stack.indexOf(hold);
|
|
234
|
+
const owns = current === hold.value && !stack.slice(index + 1).some((above2) => above2.value === current);
|
|
235
|
+
stack.splice(index, 1);
|
|
236
|
+
const above = stack[index];
|
|
237
|
+
if (above) above.linked &&= hold.linked;
|
|
238
|
+
this.#mark(element, stack);
|
|
239
|
+
if (!owns) return;
|
|
240
|
+
const below = hold.linked ? stack[index - 1] : void 0;
|
|
241
|
+
if (!below) element.removeAttribute("tabindex");
|
|
242
|
+
else if (below.value !== current) element.setAttribute("tabindex", below.value);
|
|
243
|
+
}
|
|
244
|
+
#mark(element, stack) {
|
|
245
|
+
const records = /* @__PURE__ */ new Map([[this.#record, null]]);
|
|
246
|
+
for (const hold of stack) records.set(hold.record, hold.value);
|
|
247
|
+
for (const [name, recorded] of records) {
|
|
248
|
+
if (element.getAttribute(name) === recorded) continue;
|
|
249
|
+
if (recorded === null) element.removeAttribute(name);
|
|
250
|
+
else element.setAttribute(name, recorded);
|
|
251
|
+
}
|
|
143
252
|
}
|
|
144
253
|
};
|
|
145
254
|
|
|
146
|
-
// src/controllers/conditional_fields_controller.ts
|
|
147
255
|
var DISABLED_MARKER = "data-conditional-disabled";
|
|
256
|
+
var CONTROLS = "input, textarea, select, button";
|
|
148
257
|
var OBSERVED_ATTRIBUTES = [
|
|
149
258
|
"hidden",
|
|
150
259
|
"aria-hidden",
|
|
@@ -167,19 +276,19 @@ var ConditionalFieldsController = class extends Controller {
|
|
|
167
276
|
};
|
|
168
277
|
static actions = ["evaluate"];
|
|
169
278
|
static events = ["change", "reconcile"];
|
|
170
|
-
/** Logical state last committed for each current region; rebuilt on every connect. */
|
|
171
279
|
#lastVisible = /* @__PURE__ */ new WeakMap();
|
|
172
|
-
/** Controller writes awaiting an observer callback, separated from authored morphs. */
|
|
173
280
|
#internalWrites = /* @__PURE__ */ new WeakMap();
|
|
174
281
|
#observing = false;
|
|
175
|
-
|
|
176
|
-
#
|
|
282
|
+
#departed = /* @__PURE__ */ new Set();
|
|
283
|
+
#concealed = /* @__PURE__ */ new WeakSet();
|
|
284
|
+
#reconcile = new MorphRenderWatcher(() => this.#reconcileDom());
|
|
177
285
|
#listeners = new ListenerSet();
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
286
|
+
#formReset = new FormResetWatcher(
|
|
287
|
+
(form) => this.#hasTriggerOwnedBy(form),
|
|
288
|
+
() => this.#reconcile.schedule()
|
|
289
|
+
);
|
|
290
|
+
#rootTabindex = new TabindexLoan("-1", this.identifier);
|
|
181
291
|
#observer = new MutationObserver((records) => this.#onMutations(records));
|
|
182
|
-
/** Evaluates only events whose source is one of this instance's live trigger targets. */
|
|
183
292
|
#onTriggerInput = (event) => {
|
|
184
293
|
const target = event.target;
|
|
185
294
|
const triggers = this.triggerTargets;
|
|
@@ -187,25 +296,12 @@ var ConditionalFieldsController = class extends Controller {
|
|
|
187
296
|
this.#commitChange(triggers);
|
|
188
297
|
}
|
|
189
298
|
};
|
|
190
|
-
/** Reconciles property-only retained-element changes after Turbo morphs. */
|
|
191
|
-
#onMorph = () => {
|
|
192
|
-
this.#reconcile.schedule();
|
|
193
|
-
};
|
|
194
|
-
/** Reconciles the settled defaults after a non-cancelled owning form reset. */
|
|
195
|
-
#onReset = (event) => {
|
|
196
|
-
const form = event.target;
|
|
197
|
-
if (form instanceof HTMLFormElement && this.#hasTriggerOwnedBy(form)) {
|
|
198
|
-
queueMicrotask(() => {
|
|
199
|
-
if (!event.defaultPrevented) this.#reconcile.schedule();
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
/** Reflects initial live state and opens every retained-DOM reconciliation path. */
|
|
204
299
|
connect() {
|
|
300
|
+
this.#rootTabindex.reclaim(this.element);
|
|
205
301
|
this.#lastVisible = /* @__PURE__ */ new WeakMap();
|
|
206
302
|
this.#internalWrites = /* @__PURE__ */ new WeakMap();
|
|
207
|
-
this.#reconcile.activate();
|
|
208
303
|
this.#settle();
|
|
304
|
+
this.#reconcile.observe(this.element);
|
|
209
305
|
this.#observer.observe(this.element, {
|
|
210
306
|
attributes: true,
|
|
211
307
|
attributeFilter: OBSERVED_ATTRIBUTES,
|
|
@@ -215,54 +311,46 @@ var ConditionalFieldsController = class extends Controller {
|
|
|
215
311
|
this.#observing = true;
|
|
216
312
|
this.#listeners.add(this.element, "change", this.#onTriggerInput);
|
|
217
313
|
this.#listeners.add(this.element, "input", this.#onTriggerInput);
|
|
218
|
-
this.#
|
|
219
|
-
document.addEventListener("reset", this.#onReset, true);
|
|
314
|
+
this.#formReset.observe();
|
|
220
315
|
}
|
|
221
|
-
/** Releases all external resources and returns the temporary focus landmark loan. */
|
|
222
316
|
disconnect() {
|
|
223
|
-
this.#reconcile.
|
|
317
|
+
this.#reconcile.disconnect();
|
|
224
318
|
this.#observing = false;
|
|
225
319
|
this.#observer.disconnect();
|
|
226
320
|
this.#listeners.dispose();
|
|
227
|
-
|
|
321
|
+
this.#formReset.disconnect();
|
|
228
322
|
this.#rootTabindex.returnAll();
|
|
229
323
|
}
|
|
230
|
-
/** Reconciles after a trigger target is inserted or restored. */
|
|
231
324
|
triggerTargetConnected() {
|
|
232
325
|
this.#reconcile.schedule();
|
|
233
326
|
}
|
|
234
|
-
/** Reconciles after a trigger target is removed or replaced. */
|
|
235
327
|
triggerTargetDisconnected() {
|
|
236
328
|
this.#reconcile.schedule();
|
|
237
329
|
}
|
|
238
|
-
/** Initializes a region target inserted or restored at runtime. */
|
|
239
330
|
regionTargetConnected() {
|
|
240
331
|
this.#reconcile.schedule();
|
|
241
332
|
}
|
|
242
|
-
|
|
243
|
-
|
|
333
|
+
regionTargetDisconnected(region) {
|
|
334
|
+
this.#departed.add(region);
|
|
244
335
|
this.#reconcile.schedule();
|
|
245
336
|
}
|
|
246
|
-
/** Reconciles when application code or a morph changes the match policy. */
|
|
247
337
|
matchValueChanged() {
|
|
248
338
|
this.#reconcile.schedule();
|
|
249
339
|
}
|
|
250
|
-
/** Reconciles control ownership when hidden controls become enabled or excluded. */
|
|
251
340
|
disableHiddenValueChanged() {
|
|
252
341
|
this.#reconcile.schedule();
|
|
253
342
|
}
|
|
254
|
-
/** Re-evaluates every region and repairs all reflected DOM state. */
|
|
255
343
|
evaluate() {
|
|
256
344
|
this.#commitChange();
|
|
257
345
|
}
|
|
258
|
-
/**
|
|
259
|
-
* Computes one settled plan, shows destinations before hiding sources, and then
|
|
260
|
-
* returns logical transitions in DOM order after every region is internally coherent.
|
|
261
|
-
*/
|
|
262
346
|
#settle(triggers = this.triggerTargets) {
|
|
263
347
|
const regions = this.regionTargets;
|
|
264
348
|
const plan = /* @__PURE__ */ new Map();
|
|
265
349
|
for (const region of regions) plan.set(region, this.#isVisible(region, triggers));
|
|
350
|
+
for (const departed of this.#departed) {
|
|
351
|
+
if (!plan.has(departed)) this.#release(departed, plan);
|
|
352
|
+
}
|
|
353
|
+
this.#departed.clear();
|
|
266
354
|
const changed = /* @__PURE__ */ new Set();
|
|
267
355
|
const applicationOrder = [
|
|
268
356
|
...regions.filter((region) => plan.get(region) === true),
|
|
@@ -276,19 +364,16 @@ var ConditionalFieldsController = class extends Controller {
|
|
|
276
364
|
}
|
|
277
365
|
return regions.filter((region) => changed.has(region)).map((region) => ({ region, visible: plan.get(region) === true }));
|
|
278
366
|
}
|
|
279
|
-
/** Reports logical transitions caused by user input or the public action. */
|
|
280
367
|
#commitChange(triggers = this.triggerTargets) {
|
|
281
368
|
for (const detail of this.#settle(triggers)) {
|
|
282
369
|
this.dispatch("change", { detail });
|
|
283
370
|
}
|
|
284
371
|
}
|
|
285
|
-
/** Reports logical transitions derived from DOM, lifecycle, reset, or Value state. */
|
|
286
372
|
#reconcileDom() {
|
|
287
373
|
for (const detail of this.#settle()) {
|
|
288
374
|
this.dispatch("reconcile", { detail });
|
|
289
375
|
}
|
|
290
376
|
}
|
|
291
|
-
/** Applies one planned state while keeping event history separate from DOM repair. */
|
|
292
377
|
#applyRegion(region, visible, plan) {
|
|
293
378
|
const previous = this.#lastVisible.get(region) ?? !region.hidden;
|
|
294
379
|
const changed = visible !== previous;
|
|
@@ -298,17 +383,16 @@ var ConditionalFieldsController = class extends Controller {
|
|
|
298
383
|
this.#syncRegionControls(region, visible);
|
|
299
384
|
return changed;
|
|
300
385
|
}
|
|
301
|
-
/** Reflects visibility idempotently, recording writes so the observer ignores its own work. */
|
|
302
386
|
#syncRegionState(region, visible) {
|
|
387
|
+
if (!visible && this.#predicateFor(region) !== null) this.#concealed.add(region);
|
|
388
|
+
else this.#concealed.delete(region);
|
|
303
389
|
this.#writeAttribute(region, "hidden", visible ? null : "");
|
|
304
390
|
this.#writeAttribute(region, "aria-hidden", visible ? null : "true");
|
|
305
391
|
this.#writeAttribute(region, "data-visible", visible ? "true" : null);
|
|
306
392
|
}
|
|
307
|
-
/** Enables/disables descendant controls, touching only state carrying our marker. */
|
|
308
393
|
#syncRegionControls(region, visible) {
|
|
309
394
|
const shouldDisable = !visible && this.disableHiddenValue;
|
|
310
|
-
const
|
|
311
|
-
for (const control of controls) {
|
|
395
|
+
for (const control of region.querySelectorAll(CONTROLS)) {
|
|
312
396
|
const marked = control.hasAttribute(DISABLED_MARKER);
|
|
313
397
|
if (shouldDisable) {
|
|
314
398
|
if (!control.disabled) {
|
|
@@ -318,18 +402,30 @@ var ConditionalFieldsController = class extends Controller {
|
|
|
318
402
|
this.#writeAttribute(control, DISABLED_MARKER, "true");
|
|
319
403
|
}
|
|
320
404
|
} else if (marked) {
|
|
321
|
-
this.#
|
|
322
|
-
|
|
405
|
+
this.#enable(control);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
#enable(control) {
|
|
410
|
+
this.#writeAttribute(control, "disabled", null);
|
|
411
|
+
this.#writeAttribute(control, DISABLED_MARKER, null);
|
|
412
|
+
}
|
|
413
|
+
#release(element, plan) {
|
|
414
|
+
this.#lastVisible.delete(element);
|
|
415
|
+
if (this.#concealed.delete(element)) this.#writeAttribute(element, "hidden", null);
|
|
416
|
+
this.#writeAttribute(element, "aria-hidden", null);
|
|
417
|
+
this.#writeAttribute(element, "data-visible", null);
|
|
418
|
+
for (const control of element.querySelectorAll(CONTROLS)) {
|
|
419
|
+
if (control.hasAttribute(DISABLED_MARKER) && this.#survivesPlan(control, plan)) {
|
|
420
|
+
this.#enable(control);
|
|
323
421
|
}
|
|
324
422
|
}
|
|
325
423
|
}
|
|
326
|
-
/** Whether a region's declared condition holds across `triggers` per `match`. */
|
|
327
424
|
#isVisible(region, triggers) {
|
|
328
425
|
const predicate = this.#predicateFor(region);
|
|
329
426
|
if (predicate === null) return !region.hidden;
|
|
330
427
|
return triggers.length > 0 && (this.matchValue === "all" ? triggers.every(predicate) : triggers.some(predicate));
|
|
331
428
|
}
|
|
332
|
-
/** Builds the deterministic per-trigger predicate from the region's condition. */
|
|
333
429
|
#predicateFor(region) {
|
|
334
430
|
if (region.hasAttribute("data-when-checked")) {
|
|
335
431
|
return (trigger) => this.#isChecked(trigger);
|
|
@@ -346,19 +442,16 @@ var ConditionalFieldsController = class extends Controller {
|
|
|
346
442
|
#isChecked(trigger) {
|
|
347
443
|
return trigger instanceof HTMLInputElement && trigger.checked;
|
|
348
444
|
}
|
|
349
|
-
/** A trigger has a value when a radio/checkbox is selected, or its control value matches. */
|
|
350
445
|
#matchesValue(trigger, wanted) {
|
|
351
446
|
if (trigger instanceof HTMLInputElement && (trigger.type === "checkbox" || trigger.type === "radio")) {
|
|
352
447
|
return trigger.checked && trigger.value === wanted;
|
|
353
448
|
}
|
|
354
449
|
return trigger.value === wanted;
|
|
355
450
|
}
|
|
356
|
-
/** Moves focus to the first safe trigger, or to the controller landmark as a fallback. */
|
|
357
451
|
#retreatFocus(region, plan) {
|
|
358
452
|
const active = document.activeElement;
|
|
359
453
|
if (active && region.contains(active)) this.#moveFocus(plan);
|
|
360
454
|
}
|
|
361
|
-
/** Moves focus after the caller establishes that the active node is being hidden. */
|
|
362
455
|
#moveFocus(plan) {
|
|
363
456
|
const destination = this.triggerTargets.find(
|
|
364
457
|
(trigger) => canTakeFocus(trigger) && this.#survivesPlan(trigger, plan)
|
|
@@ -371,11 +464,9 @@ var ConditionalFieldsController = class extends Controller {
|
|
|
371
464
|
this.#rootTabindex.lend(this.element);
|
|
372
465
|
this.element.focus();
|
|
373
466
|
}
|
|
374
|
-
/** Whether a focus candidate sits outside every region this pass will hide. */
|
|
375
467
|
#survivesPlan(candidate, plan) {
|
|
376
468
|
return [...plan].every(([region, visible]) => visible || !region.contains(candidate));
|
|
377
469
|
}
|
|
378
|
-
/** Records one idempotent attribute write before MutationObserver sees it. */
|
|
379
470
|
#writeAttribute(element, name, value) {
|
|
380
471
|
if (element.getAttribute(name) !== value) {
|
|
381
472
|
if (this.#observing) {
|
|
@@ -390,7 +481,6 @@ var ConditionalFieldsController = class extends Controller {
|
|
|
390
481
|
else element.setAttribute(name, value);
|
|
391
482
|
}
|
|
392
483
|
}
|
|
393
|
-
/** Separates authored records from controller writes and queues one relevant repair. */
|
|
394
484
|
#onMutations(records) {
|
|
395
485
|
const triggers = this.triggerTargets;
|
|
396
486
|
const regions = this.regionTargets;
|
|
@@ -420,16 +510,13 @@ var ConditionalFieldsController = class extends Controller {
|
|
|
420
510
|
}
|
|
421
511
|
if (needsReconcile) this.#reconcile.schedule();
|
|
422
512
|
}
|
|
423
|
-
/** Whether an authored mutation target belongs to a trigger, region, or managed control. */
|
|
424
513
|
#elementAffectsState(target, triggers, regions) {
|
|
425
514
|
return ownerIndex(triggers, target) !== -1 || ownerIndex(regions, target) !== -1;
|
|
426
515
|
}
|
|
427
|
-
/** Whether a form owns at least one current trigger, including `form=` associations. */
|
|
428
516
|
#hasTriggerOwnedBy(form) {
|
|
429
517
|
return this.triggerTargets.some((trigger) => trigger.form === form);
|
|
430
518
|
}
|
|
431
519
|
};
|
|
432
520
|
|
|
433
521
|
export { ConditionalFieldsController };
|
|
434
|
-
//# sourceMappingURL=conditional_fields_controller.js.map
|
|
435
522
|
//# sourceMappingURL=conditional_fields_controller.js.map
|