stimeo-ui 0.16.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 +31 -0
- package/README.md +8 -1
- package/dist/cable/index.d.ts +79 -23
- package/dist/cable/index.js +363 -436
- package/dist/cable/index.js.map +1 -1
- package/dist/controllers/accordion_controller.d.ts +4 -2
- package/dist/controllers/accordion_controller.js +166 -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 +862 -221
- package/dist/controllers/alert_dialog_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.d.ts +35 -5
- package/dist/controllers/announcer_controller.js +135 -198
- 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 +271 -127
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.js +171 -105
- 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 +18 -0
- package/dist/controllers/bulk_select_controller.js +262 -52
- package/dist/controllers/bulk_select_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +24 -5
- package/dist/controllers/calendar_controller.js +175 -209
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +34 -7
- package/dist/controllers/carousel_controller.js +461 -399
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/character_counter_controller.d.ts +17 -1
- package/dist/controllers/character_counter_controller.js +246 -156
- 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 +32 -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 +168 -147
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +16 -4
- package/dist/controllers/collapsible_controller.js +301 -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 +149 -139
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/combobox_controller.d.ts +23 -5
- package/dist/controllers/combobox_controller.js +360 -133
- 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 +970 -358
- 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 +166 -124
- 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 -248
- package/dist/controllers/confirm_controller.js.map +1 -1
- package/dist/controllers/context_menu_controller.d.ts +31 -4
- package/dist/controllers/context_menu_controller.js +256 -128
- 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 +45 -1
- package/dist/controllers/countdown_controller.js +183 -148
- package/dist/controllers/countdown_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +21 -2
- package/dist/controllers/currency_input_controller.js +134 -158
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/data_grid_controller.d.ts +15 -4
- package/dist/controllers/data_grid_controller.js +114 -186
- package/dist/controllers/data_grid_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +30 -5
- package/dist/controllers/date_range_picker_controller.js +288 -206
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +13 -1
- package/dist/controllers/dialog_controller.js +858 -223
- 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 +73 -153
- package/dist/controllers/direct_upload_controller.js.map +1 -1
- package/dist/controllers/dirty_form_controller.js +14 -48
- 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 -21
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/drawer_controller.d.ts +39 -11
- package/dist/controllers/drawer_controller.js +933 -341
- package/dist/controllers/drawer_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.d.ts +31 -1
- package/dist/controllers/dropdown_controller.js +312 -82
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/editable_controller.d.ts +12 -1
- package/dist/controllers/editable_controller.js +158 -68
- 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 +311 -207
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/filter_controller.js +67 -39
- package/dist/controllers/filter_controller.js.map +1 -1
- package/dist/controllers/flash_controller.d.ts +31 -8
- package/dist/controllers/flash_controller.js +172 -314
- 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 -240
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +147 -132
- package/dist/controllers/form_field_controller.js.map +1 -1
- package/dist/controllers/form_validation_controller.js +13 -86
- 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 +264 -213
- 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 +107 -75
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/hover_card_controller.d.ts +56 -3
- package/dist/controllers/hover_card_controller.js +309 -118
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +42 -1
- package/dist/controllers/idle_controller.js +267 -101
- package/dist/controllers/idle_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.js +71 -72
- 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 -106
- 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 -65
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/listbox_controller.d.ts +34 -2
- package/dist/controllers/listbox_controller.js +306 -204
- 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 -93
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.d.ts +32 -7
- package/dist/controllers/menu_controller.js +214 -156
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.d.ts +4 -4
- package/dist/controllers/menubar_controller.js +170 -329
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/meter_controller.d.ts +20 -0
- package/dist/controllers/meter_controller.js +151 -67
- package/dist/controllers/meter_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +32 -4
- package/dist/controllers/multi_select_controller.js +593 -358
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.d.ts +8 -1
- package/dist/controllers/navigation_menu_controller.js +124 -232
- 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 +352 -182
- 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 +242 -54
- package/dist/controllers/network_status_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +26 -2
- package/dist/controllers/number_input_controller.js +320 -263
- package/dist/controllers/number_input_controller.js.map +1 -1
- package/dist/controllers/optimistic_controller.js +16 -76
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.d.ts +20 -4
- package/dist/controllers/otp_controller.js +198 -193
- 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 +116 -113
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.d.ts +48 -11
- package/dist/controllers/overflow_menu_controller.js +343 -283
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.d.ts +35 -6
- package/dist/controllers/pagination_controller.js +295 -119
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +45 -8
- package/dist/controllers/password_reveal_controller.js +389 -121
- 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 +237 -103
- 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 +185 -165
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +38 -2
- package/dist/controllers/popover_controller.js +236 -97
- 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 -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 +232 -116
- 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 +125 -56
- package/dist/controllers/progress_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +14 -5
- package/dist/controllers/radio_group_controller.js +117 -137
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/range_slider_controller.d.ts +43 -3
- package/dist/controllers/range_slider_controller.js +192 -105
- 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 +418 -207
- 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 +134 -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 +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 +28 -2
- package/dist/controllers/resizable_controller.js +255 -139
- 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 -225
- 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 -145
- 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 +181 -242
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/separator_controller.d.ts +19 -4
- package/dist/controllers/separator_controller.js +267 -140
- package/dist/controllers/separator_controller.js.map +1 -1
- package/dist/controllers/sidebar_controller.d.ts +64 -7
- package/dist/controllers/sidebar_controller.js +1023 -386
- 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 -97
- package/dist/controllers/skeleton_controller.js.map +1 -1
- package/dist/controllers/slider_controller.d.ts +27 -1
- package/dist/controllers/slider_controller.js +159 -79
- 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 +162 -63
- package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
- package/dist/controllers/sortable_controller.js +0 -112
- 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 -169
- package/dist/controllers/spinner_controller.js.map +1 -1
- package/dist/controllers/step_indicator_controller.d.ts +5 -0
- package/dist/controllers/step_indicator_controller.js +99 -46
- package/dist/controllers/step_indicator_controller.js.map +1 -1
- package/dist/controllers/stepper_controller.d.ts +12 -3
- package/dist/controllers/stepper_controller.js +114 -73
- package/dist/controllers/stepper_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.d.ts +6 -0
- package/dist/controllers/stick_to_bottom_controller.js +262 -138
- 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 +23 -8
- package/dist/controllers/submit_once_controller.js +294 -205
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +12 -1
- package/dist/controllers/switch_controller.js +33 -60
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +2 -2
- package/dist/controllers/tabs_controller.js +35 -29
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +12 -0
- package/dist/controllers/tags_input_controller.js +136 -145
- 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 +21 -9
- package/dist/controllers/theme_controller.js +130 -112
- 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 +146 -80
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +36 -11
- package/dist/controllers/toast_controller.js +186 -297
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +12 -3
- package/dist/controllers/toggle_group_controller.js +95 -136
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.js +68 -98
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +45 -3
- 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 +21 -11
- package/dist/controllers/tree_view_controller.js +150 -345
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.js +6370 -9346
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +23 -3
- package/dist/inspector/cli.js +92 -37
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +92 -56
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +8 -8
- package/dist/inspector/manifest.json +787 -100
- package/dist/positioning/index.d.ts +8 -0
- package/dist/positioning/index.js +148 -47
- package/dist/positioning/index.js.map +1 -1
- package/package.json +6 -6
- package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
- package/dist/controllers/reset_before_cache_controller.js.map +0 -1
|
@@ -1,73 +1,62 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
static
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
/** Subscribes to `turbo:before-cache`; call from `connect()`. Idempotent. */
|
|
19
|
-
activate() {
|
|
20
|
-
const first = _BeforeCacheReset.#subscribers.size === 0;
|
|
21
|
-
_BeforeCacheReset.#subscribers.add(this);
|
|
22
|
-
if (first) {
|
|
23
|
-
document.addEventListener("turbo:before-cache", _BeforeCacheReset.#onBeforeCache);
|
|
3
|
+
var DetachGate = class _DetachGate {
|
|
4
|
+
#pending = false;
|
|
5
|
+
get pending() {
|
|
6
|
+
return this.#pending;
|
|
7
|
+
}
|
|
8
|
+
static isDetached(host) {
|
|
9
|
+
return !host.element.isConnected || !_DetachGate.#listed(host);
|
|
10
|
+
}
|
|
11
|
+
disconnected(host, teardown) {
|
|
12
|
+
const carried = _DetachGate.#carried(host);
|
|
13
|
+
if (!carried && _DetachGate.isDetached(host)) {
|
|
14
|
+
this.#pending = false;
|
|
15
|
+
teardown();
|
|
16
|
+
return;
|
|
24
17
|
}
|
|
18
|
+
this.#pending = true;
|
|
19
|
+
const probe = () => {
|
|
20
|
+
if (!this.#pending) return;
|
|
21
|
+
this.#pending = false;
|
|
22
|
+
teardown();
|
|
23
|
+
};
|
|
24
|
+
if (carried) setTimeout(probe, 0);
|
|
25
|
+
else queueMicrotask(probe);
|
|
26
|
+
}
|
|
27
|
+
static #carried(host) {
|
|
28
|
+
const element = host.element;
|
|
29
|
+
return !element.isConnected && element.closest("[data-turbo-permanent]") !== null && _DetachGate.#listed(host);
|
|
30
|
+
}
|
|
31
|
+
static #listed(host) {
|
|
32
|
+
const tokens = (host.element.getAttribute("data-controller") ?? "").split(/\s+/);
|
|
33
|
+
return tokens.includes(host.identifier);
|
|
25
34
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
_BeforeCacheReset.#subscribers.delete(this);
|
|
29
|
-
if (_BeforeCacheReset.#subscribers.size > 0) return;
|
|
30
|
-
document.removeEventListener("turbo:before-cache", _BeforeCacheReset.#onBeforeCache);
|
|
35
|
+
cancel() {
|
|
36
|
+
this.#pending = false;
|
|
31
37
|
}
|
|
32
38
|
};
|
|
33
39
|
|
|
34
|
-
|
|
40
|
+
var MAX_TIMER_DELAY_MS = 2147483647;
|
|
41
|
+
|
|
35
42
|
var TimerRegistry = class {
|
|
36
|
-
/** Live timer ids that have not yet been cleared (or, for timeouts, fired). */
|
|
37
43
|
ids = /* @__PURE__ */ new Set();
|
|
38
|
-
/**
|
|
39
|
-
* Cancels a single tracked timer.
|
|
40
|
-
*
|
|
41
|
-
* No-ops if the id is unknown (already cleared, fired, or never owned by this
|
|
42
|
-
* registry), so callers can clear defensively without guarding.
|
|
43
|
-
*/
|
|
44
44
|
clear(id) {
|
|
45
45
|
if (this.ids.delete(id)) {
|
|
46
46
|
this.cancel(id);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Cancels every tracked timer. Call this from a controller's `disconnect()`
|
|
51
|
-
* to guarantee no timer outlives the element.
|
|
52
|
-
*/
|
|
53
49
|
clearAll() {
|
|
54
50
|
for (const id of this.ids) {
|
|
55
51
|
this.cancel(id);
|
|
56
52
|
}
|
|
57
53
|
this.ids.clear();
|
|
58
54
|
}
|
|
59
|
-
/** Number of timers currently tracked (pending). */
|
|
60
55
|
get size() {
|
|
61
56
|
return this.ids.size;
|
|
62
57
|
}
|
|
63
58
|
};
|
|
64
59
|
var SafeTimeout = class extends TimerRegistry {
|
|
65
|
-
/**
|
|
66
|
-
* Schedules `callback` after `delay` ms and returns the timer id.
|
|
67
|
-
*
|
|
68
|
-
* The id is removed from the registry automatically when the timeout fires,
|
|
69
|
-
* so {@link TimerRegistry.size | size} reflects only still-pending timers.
|
|
70
|
-
*/
|
|
71
60
|
set(callback, delay) {
|
|
72
61
|
const id = this.schedule(() => {
|
|
73
62
|
this.ids.delete(id);
|
|
@@ -84,16 +73,9 @@ var SafeTimeout = class extends TimerRegistry {
|
|
|
84
73
|
}
|
|
85
74
|
};
|
|
86
75
|
|
|
87
|
-
// src/utils/keyed_timers.ts
|
|
88
76
|
var KeyedTimers = class {
|
|
89
77
|
#timers = new SafeTimeout();
|
|
90
|
-
/** The pending timer of each key; an entry lives exactly as long as its timer. */
|
|
91
78
|
#pending = /* @__PURE__ */ new Map();
|
|
92
|
-
/**
|
|
93
|
-
* Arms `callback` after `delay` ms for `key`, cancelling the timer `key` had
|
|
94
|
-
* pending. The entry is dropped before the callback runs, so the callback sees
|
|
95
|
-
* the key unarmed and may arm it again for the next round.
|
|
96
|
-
*/
|
|
97
79
|
set(key, callback, delay) {
|
|
98
80
|
this.clear(key);
|
|
99
81
|
const id = this.#timers.set(() => {
|
|
@@ -102,52 +84,35 @@ var KeyedTimers = class {
|
|
|
102
84
|
}, delay);
|
|
103
85
|
this.#pending.set(key, id);
|
|
104
86
|
}
|
|
105
|
-
/**
|
|
106
|
-
* Cancels `key`'s pending timer, if it has one.
|
|
107
|
-
*
|
|
108
|
-
* A timer id is a positive integer, so `-1` stands for "nothing pending" and
|
|
109
|
-
* the registry ignores an id it does not own — the unarmed case needs no
|
|
110
|
-
* branch of its own, and no other key's timer can be reached from here.
|
|
111
|
-
*/
|
|
112
87
|
clear(key) {
|
|
113
88
|
this.#timers.clear(this.#pending.get(key) ?? -1);
|
|
114
89
|
this.#pending.delete(key);
|
|
115
90
|
}
|
|
116
|
-
/**
|
|
117
|
-
* Cancels every pending timer and forgets every key. Call this from a
|
|
118
|
-
* controller's `disconnect()` so no timer, and no entry, outlives the element.
|
|
119
|
-
*/
|
|
120
91
|
clearAll() {
|
|
121
92
|
this.#timers.clearAll();
|
|
122
93
|
this.#pending.clear();
|
|
123
94
|
}
|
|
124
|
-
/** Whether `key` has a timer pending. */
|
|
125
95
|
has(key) {
|
|
126
96
|
return this.#pending.has(key);
|
|
127
97
|
}
|
|
128
98
|
};
|
|
129
99
|
|
|
130
|
-
// src/utils/microtask_coalescer.ts
|
|
131
100
|
var MicrotaskCoalescer = class {
|
|
132
101
|
#run;
|
|
133
102
|
#queued = false;
|
|
134
103
|
#active = false;
|
|
135
104
|
#generation = 0;
|
|
136
|
-
/** @param run - the single reconciliation pass, invoked at most once per batch. */
|
|
137
105
|
constructor(run) {
|
|
138
106
|
this.#run = run;
|
|
139
107
|
}
|
|
140
|
-
/** Opens the window in which {@link schedule} is honoured; call from `connect()`. */
|
|
141
108
|
activate() {
|
|
142
109
|
this.#active = true;
|
|
143
110
|
}
|
|
144
|
-
/** Closes the window and drops any pending pass; call from `disconnect()`. */
|
|
145
111
|
cancel() {
|
|
146
112
|
this.#active = false;
|
|
147
113
|
this.#queued = false;
|
|
148
114
|
this.#generation += 1;
|
|
149
115
|
}
|
|
150
|
-
/** Requests one pass after the batch settles. Idempotent; inert outside the window. */
|
|
151
116
|
schedule() {
|
|
152
117
|
if (!this.#active || this.#queued) return;
|
|
153
118
|
this.#queued = true;
|
|
@@ -160,49 +125,81 @@ var MicrotaskCoalescer = class {
|
|
|
160
125
|
}
|
|
161
126
|
};
|
|
162
127
|
|
|
163
|
-
|
|
128
|
+
var NUMBER_BOUNDS = {
|
|
129
|
+
timer: { finite: true, min: 0, max: MAX_TIMER_DELAY_MS }};
|
|
130
|
+
function matchesNumberBounds(value, bounds) {
|
|
131
|
+
if (!Number.isFinite(value)) {
|
|
132
|
+
const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
|
|
133
|
+
if (direction === null) return false;
|
|
134
|
+
if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
|
|
135
|
+
}
|
|
136
|
+
if (bounds.min !== void 0 && value < bounds.min) return false;
|
|
137
|
+
if (bounds.max !== void 0 && value > bounds.max) return false;
|
|
138
|
+
if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
|
|
139
|
+
if (bounds.integer && !Number.isInteger(value)) return false;
|
|
140
|
+
if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function readNumber(raw, fallback, bounds) {
|
|
145
|
+
return matchesNumberBounds(raw, bounds) ? raw : fallback;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
var NumberValueReader = class {
|
|
149
|
+
#lastRejected = /* @__PURE__ */ new Map();
|
|
150
|
+
read(owner, name, raw, fallback, bounds) {
|
|
151
|
+
const resolved = readNumber(raw, fallback, bounds);
|
|
152
|
+
if (matchesNumberBounds(raw, bounds)) {
|
|
153
|
+
this.#lastRejected.delete(name);
|
|
154
|
+
return resolved;
|
|
155
|
+
}
|
|
156
|
+
const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
|
|
157
|
+
const literal = owner.element.getAttribute(attribute);
|
|
158
|
+
if (literal === null) {
|
|
159
|
+
this.#lastRejected.delete(name);
|
|
160
|
+
return resolved;
|
|
161
|
+
}
|
|
162
|
+
if (this.#lastRejected.get(name) !== literal) {
|
|
163
|
+
this.#lastRejected.set(name, literal);
|
|
164
|
+
console.warn(
|
|
165
|
+
`Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
return resolved;
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
164
172
|
var LEVELS = ["polite", "assertive"];
|
|
165
|
-
var
|
|
173
|
+
var STAND_IN = "stand-in";
|
|
174
|
+
var ANNOUNCED = "announced";
|
|
175
|
+
var AnnouncerController = class _AnnouncerController extends Controller {
|
|
176
|
+
#numbers = new NumberValueReader();
|
|
166
177
|
static targets = ["polite", "assertive"];
|
|
167
178
|
static values = {
|
|
168
179
|
clearAfter: { type: Number, default: 1e3 },
|
|
169
180
|
dedupeReannounce: { type: Boolean, default: true }
|
|
170
181
|
};
|
|
182
|
+
static valueConstraints = {
|
|
183
|
+
clearAfter: NUMBER_BOUNDS.timer
|
|
184
|
+
};
|
|
171
185
|
static actions = ["announce"];
|
|
172
|
-
/** Drain timers, which belong to a politeness level rather than to a region. */
|
|
173
186
|
#timers = new SafeTimeout();
|
|
174
|
-
|
|
175
|
-
* The one timer a region may have outstanding — its dedupe re-set, then its
|
|
176
|
-
* auto-clear. A region carries at most one, and the registry releases the
|
|
177
|
-
* previous one whenever a newer message takes the region over.
|
|
178
|
-
*/
|
|
187
|
+
#gate = new DetachGate();
|
|
179
188
|
#regionTimers = new KeyedTimers();
|
|
180
|
-
/** Live regions generated to stand in for absent targets, for teardown. */
|
|
181
189
|
#generated = /* @__PURE__ */ new Map();
|
|
182
|
-
|
|
190
|
+
get #standIn() {
|
|
191
|
+
return `data-${this.identifier}-${STAND_IN}`;
|
|
192
|
+
}
|
|
193
|
+
get #announced() {
|
|
194
|
+
return `data-${this.identifier}-${ANNOUNCED}`;
|
|
195
|
+
}
|
|
183
196
|
#queues = /* @__PURE__ */ new Map();
|
|
184
|
-
/** Politeness levels whose next drain is already armed. */
|
|
185
197
|
#draining = /* @__PURE__ */ new Set();
|
|
186
|
-
/** Collapses a batch of target callbacks (and morph removals) into one pass. */
|
|
187
198
|
#reconcile = new MicrotaskCoalescer(() => this.#reconcileRegions());
|
|
188
|
-
/**
|
|
189
|
-
* Watches the host's own children for a generated region disappearing. A morph
|
|
190
|
-
* drops it — the server's HTML never had it — and no target callback reports
|
|
191
|
-
* that, because a generated region carries no target attribute. `subtree` stays
|
|
192
|
-
* off so writing a message inside a region does not re-enter this pass.
|
|
193
|
-
*/
|
|
194
199
|
#hostWatch = new MutationObserver(() => {
|
|
195
200
|
this.#reconcile.schedule();
|
|
196
201
|
});
|
|
197
|
-
/** Rewinds to an announceable initial state for the snapshot; see the remarks. */
|
|
198
|
-
#beforeCache = new BeforeCacheReset(() => this.#rewindForCache());
|
|
199
|
-
/**
|
|
200
|
-
* Guards against handling the same CustomEvent twice. An event dispatched on
|
|
201
|
-
* the controller element with `bubbles: true` reaches both the element and the
|
|
202
|
-
* `window` listener; this WeakSet ensures it announces only once.
|
|
203
|
-
*/
|
|
204
202
|
#handled = /* @__PURE__ */ new WeakSet();
|
|
205
|
-
/** Receives programmatic announcements at the element or bubbled to `window`. */
|
|
206
203
|
#onAnnounceEvent = (event) => {
|
|
207
204
|
if (this.#handled.has(event)) return;
|
|
208
205
|
this.#handled.add(event);
|
|
@@ -212,17 +209,23 @@ var AnnouncerController = class extends Controller {
|
|
|
212
209
|
this.#announce(message, this.#assertiveFromDetail(detail));
|
|
213
210
|
};
|
|
214
211
|
connect() {
|
|
212
|
+
const moved = this.#gate.pending;
|
|
213
|
+
this.#gate.cancel();
|
|
214
|
+
if (moved) return;
|
|
215
215
|
this.#reconcile.activate();
|
|
216
|
-
this.#
|
|
216
|
+
this.#dropInheritedStandIns();
|
|
217
|
+
this.#emptyInheritedMessages();
|
|
217
218
|
this.#reconcileRegions();
|
|
218
219
|
this.#hostWatch.observe(this.element, { childList: true });
|
|
219
220
|
this.element.addEventListener("stimeo--announcer:announce", this.#onAnnounceEvent);
|
|
220
221
|
window.addEventListener("stimeo--announcer:announce", this.#onAnnounceEvent);
|
|
221
222
|
}
|
|
222
223
|
disconnect() {
|
|
224
|
+
this.#gate.disconnected(this, () => this.#teardown());
|
|
225
|
+
}
|
|
226
|
+
#teardown() {
|
|
223
227
|
this.#reconcile.cancel();
|
|
224
228
|
this.#hostWatch.disconnect();
|
|
225
|
-
this.#beforeCache.deactivate();
|
|
226
229
|
this.element.removeEventListener("stimeo--announcer:announce", this.#onAnnounceEvent);
|
|
227
230
|
window.removeEventListener("stimeo--announcer:announce", this.#onAnnounceEvent);
|
|
228
231
|
this.#timers.clearAll();
|
|
@@ -231,39 +234,23 @@ var AnnouncerController = class extends Controller {
|
|
|
231
234
|
this.#draining.clear();
|
|
232
235
|
this.#removeGenerated();
|
|
233
236
|
}
|
|
234
|
-
/** Retires the stand-in once the consumer supplies a polite region. */
|
|
235
237
|
politeTargetConnected() {
|
|
236
238
|
this.#reconcile.schedule();
|
|
237
239
|
}
|
|
238
|
-
/** Materialises a stand-in once the consumer's polite region goes away. */
|
|
239
240
|
politeTargetDisconnected() {
|
|
240
241
|
this.#reconcile.schedule();
|
|
241
242
|
}
|
|
242
|
-
/** Retires the stand-in once the consumer supplies an assertive region. */
|
|
243
243
|
assertiveTargetConnected() {
|
|
244
244
|
this.#reconcile.schedule();
|
|
245
245
|
}
|
|
246
|
-
/** Materialises a stand-in once the consumer's assertive region goes away. */
|
|
247
246
|
assertiveTargetDisconnected() {
|
|
248
247
|
this.#reconcile.schedule();
|
|
249
248
|
}
|
|
250
|
-
/**
|
|
251
|
-
* Brings the region set back to exactly one region per politeness and reports
|
|
252
|
-
* whether anything had to be created.
|
|
253
|
-
*
|
|
254
|
-
* A region created here is not written to in the same task: assistive tech
|
|
255
|
-
* reports changes to regions it already knows about, so {@link drain} waits a
|
|
256
|
-
* task whenever this says a region is new.
|
|
257
|
-
*/
|
|
258
249
|
#reconcileRegions() {
|
|
259
250
|
let created = false;
|
|
260
251
|
for (const level of LEVELS) {
|
|
261
252
|
if (this.#hasTargetFor(level)) {
|
|
262
|
-
|
|
263
|
-
if (generated) {
|
|
264
|
-
generated.remove();
|
|
265
|
-
this.#generated.delete(level);
|
|
266
|
-
}
|
|
253
|
+
this.#generated.get(level)?.remove();
|
|
267
254
|
continue;
|
|
268
255
|
}
|
|
269
256
|
const existing = this.#generated.get(level);
|
|
@@ -273,38 +260,33 @@ var AnnouncerController = class extends Controller {
|
|
|
273
260
|
}
|
|
274
261
|
return created;
|
|
275
262
|
}
|
|
276
|
-
/** Whether the consumer supplied a target for `level`. */
|
|
277
263
|
#hasTargetFor(level) {
|
|
278
264
|
return level === "assertive" ? this.hasAssertiveTarget : this.hasPoliteTarget;
|
|
279
265
|
}
|
|
280
|
-
/** Builds a visually hidden live region for `level` and attaches it. */
|
|
281
266
|
#createRegion(level) {
|
|
282
267
|
const region = document.createElement("div");
|
|
283
268
|
region.setAttribute("aria-live", level);
|
|
284
269
|
region.setAttribute("aria-atomic", "true");
|
|
270
|
+
region.setAttribute(this.#standIn, "");
|
|
285
271
|
visuallyHide(region);
|
|
286
272
|
this.element.appendChild(region);
|
|
287
273
|
return region;
|
|
288
274
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
region.
|
|
275
|
+
#dropInheritedStandIns() {
|
|
276
|
+
for (const child of Array.from(this.element.children)) {
|
|
277
|
+
if (child.hasAttribute(this.#standIn)) child.remove();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
#emptyInheritedMessages() {
|
|
281
|
+
for (const region of [...this.politeTargets, ...this.assertiveTargets]) {
|
|
282
|
+
if (!region.hasAttribute(this.#announced)) continue;
|
|
283
|
+
region.replaceChildren();
|
|
284
|
+
region.removeAttribute(this.#announced);
|
|
298
285
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
* (`message`, plus optional `assertive`) for attribute-only triggers, falling
|
|
304
|
-
* back to a CustomEvent `detail` when the same handler is wired to an event.
|
|
305
|
-
* An empty/non-string message is ignored so untrusted payloads cannot blank
|
|
306
|
-
* the region.
|
|
307
|
-
*/
|
|
286
|
+
}
|
|
287
|
+
#removeGenerated() {
|
|
288
|
+
for (const region of this.#generated.values()) region.remove();
|
|
289
|
+
}
|
|
308
290
|
announce(event) {
|
|
309
291
|
const params = event.params;
|
|
310
292
|
const fromParam = params?.message;
|
|
@@ -313,13 +295,6 @@ var AnnouncerController = class extends Controller {
|
|
|
313
295
|
const assertive = params?.assertive === true || this.#assertiveFromDetail(event.detail);
|
|
314
296
|
this.#announce(message, assertive);
|
|
315
297
|
}
|
|
316
|
-
/**
|
|
317
|
-
* Queues `message` for its politeness and arms the drain.
|
|
318
|
-
*
|
|
319
|
-
* Queuing is what makes a burst audible: assistive tech announces the changes it
|
|
320
|
-
* observes, so several messages written into one region within a single task are
|
|
321
|
-
* one change and only the last is read.
|
|
322
|
-
*/
|
|
323
298
|
#announce(message, assertive) {
|
|
324
299
|
const level = assertive ? "assertive" : "polite";
|
|
325
300
|
const queue = this.#queues.get(level);
|
|
@@ -330,7 +305,6 @@ var AnnouncerController = class extends Controller {
|
|
|
330
305
|
}
|
|
331
306
|
this.#scheduleDrain(level);
|
|
332
307
|
}
|
|
333
|
-
/** Arms one drain pass for `level`; further messages ride the pass already armed. */
|
|
334
308
|
#scheduleDrain(level) {
|
|
335
309
|
if (this.#draining.has(level)) return;
|
|
336
310
|
this.#draining.add(level);
|
|
@@ -339,28 +313,17 @@ var AnnouncerController = class extends Controller {
|
|
|
339
313
|
this.#drain(level);
|
|
340
314
|
}, 0);
|
|
341
315
|
}
|
|
342
|
-
/**
|
|
343
|
-
* Writes one queued message, then arms the next pass while the queue holds more.
|
|
344
|
-
*
|
|
345
|
-
* Two steps take a whole pass without consuming the message: materialising a
|
|
346
|
-
* region (it has to be in the accessibility tree before the text arrives) and
|
|
347
|
-
* emptying a region that already holds this exact text (an unchanged node is not
|
|
348
|
-
* re-read, so `dedupeReannounce` clears first and writes on the following pass).
|
|
349
|
-
*
|
|
350
|
-
* @stimeoRuntimeOnly `dedupeReannounce` decides whether one queued message is spoken again; the
|
|
351
|
-
* region's text is the message itself.
|
|
352
|
-
*/
|
|
353
316
|
#drain(level) {
|
|
354
317
|
const queue = this.#queues.get(level);
|
|
355
318
|
const message = queue?.[0];
|
|
356
319
|
if (queue === void 0 || message === void 0) return;
|
|
357
|
-
|
|
320
|
+
const created = this.#reconcileRegions();
|
|
321
|
+
const region = this.#regionFor(level);
|
|
322
|
+
if (created || region === void 0) {
|
|
358
323
|
this.#scheduleDrain(level);
|
|
359
324
|
return;
|
|
360
325
|
}
|
|
361
|
-
const region = this.#regionFor(level);
|
|
362
326
|
if (this.dedupeReannounceValue && region.textContent === message) {
|
|
363
|
-
this.#regionTimers.clear(region);
|
|
364
327
|
region.textContent = "";
|
|
365
328
|
this.#scheduleDrain(level);
|
|
366
329
|
return;
|
|
@@ -368,60 +331,27 @@ var AnnouncerController = class extends Controller {
|
|
|
368
331
|
queue.shift();
|
|
369
332
|
this.#regionTimers.clear(region);
|
|
370
333
|
region.textContent = message;
|
|
334
|
+
region.setAttribute(this.#announced, "");
|
|
371
335
|
this.#scheduleClear(region, message);
|
|
372
336
|
if (queue.length > 0) this.#scheduleDrain(level);
|
|
373
337
|
}
|
|
374
|
-
/**
|
|
375
|
-
* Clears the region after `clearAfter` ms, unless a newer message replaced it.
|
|
376
|
-
*
|
|
377
|
-
* @stimeoRuntimeOnly `clearAfter` is the delay of the one clearing timer this call arms.
|
|
378
|
-
*/
|
|
379
338
|
#scheduleClear(region, message) {
|
|
380
|
-
if (this
|
|
339
|
+
if (this.#safeClearAfter <= 0) return;
|
|
381
340
|
this.#regionTimers.set(
|
|
382
341
|
region,
|
|
383
342
|
() => {
|
|
384
|
-
if (region.textContent
|
|
343
|
+
if (region.textContent !== message) return;
|
|
344
|
+
region.textContent = "";
|
|
345
|
+
region.removeAttribute(this.#announced);
|
|
385
346
|
},
|
|
386
|
-
this
|
|
347
|
+
this.#safeClearAfter
|
|
387
348
|
);
|
|
388
349
|
}
|
|
389
|
-
/**
|
|
390
|
-
* Resolves the live region for a politeness level.
|
|
391
|
-
*
|
|
392
|
-
* The remembered stand-in is used only while it is still in the document: a morph
|
|
393
|
-
* can drop it, and writing into the detached node would announce nothing at all.
|
|
394
|
-
*/
|
|
395
350
|
#regionFor(level) {
|
|
396
351
|
if (level === "assertive" && this.hasAssertiveTarget) return this.assertiveTarget;
|
|
397
352
|
if (level === "polite" && this.hasPoliteTarget) return this.politeTarget;
|
|
398
|
-
|
|
399
|
-
if (existing?.isConnected) return existing;
|
|
400
|
-
const region = this.#createRegion(level);
|
|
401
|
-
this.#generated.set(level, region);
|
|
402
|
-
return region;
|
|
353
|
+
return this.#generated.get(level);
|
|
403
354
|
}
|
|
404
|
-
/**
|
|
405
|
-
* Restores the announceable initial state for the snapshot Turbo is about to
|
|
406
|
-
* take: queued and displayed messages go, generated regions go, and the live
|
|
407
|
-
* page — which keeps running when a visit is aborted — gets its regions back on
|
|
408
|
-
* the next task, after the clone.
|
|
409
|
-
*/
|
|
410
|
-
#rewindForCache() {
|
|
411
|
-
this.#queues.clear();
|
|
412
|
-
this.#draining.clear();
|
|
413
|
-
this.#timers.clearAll();
|
|
414
|
-
this.#regionTimers.clearAll();
|
|
415
|
-
for (const level of LEVELS) {
|
|
416
|
-
if (this.#hasTargetFor(level)) {
|
|
417
|
-
const target = level === "assertive" ? this.assertiveTarget : this.politeTarget;
|
|
418
|
-
target.textContent = "";
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
this.#removeGenerated();
|
|
422
|
-
this.#timers.set(() => this.#reconcileRegions(), 0);
|
|
423
|
-
}
|
|
424
|
-
/** Extracts a non-empty string `message` from a CustomEvent detail, else null. */
|
|
425
355
|
#messageFromDetail(detail) {
|
|
426
356
|
if (detail && typeof detail === "object" && "message" in detail) {
|
|
427
357
|
const value = detail.message;
|
|
@@ -429,10 +359,18 @@ var AnnouncerController = class extends Controller {
|
|
|
429
359
|
}
|
|
430
360
|
return null;
|
|
431
361
|
}
|
|
432
|
-
/** Reads an `assertive === true` flag from a CustomEvent detail (default polite). */
|
|
433
362
|
#assertiveFromDetail(detail) {
|
|
434
363
|
return !!detail && typeof detail === "object" && detail.assertive === true;
|
|
435
364
|
}
|
|
365
|
+
get #safeClearAfter() {
|
|
366
|
+
return this.#numbers.read(
|
|
367
|
+
this,
|
|
368
|
+
"clearAfter",
|
|
369
|
+
this.clearAfterValue,
|
|
370
|
+
_AnnouncerController.values.clearAfter.default,
|
|
371
|
+
_AnnouncerController.valueConstraints.clearAfter
|
|
372
|
+
);
|
|
373
|
+
}
|
|
436
374
|
};
|
|
437
375
|
function visuallyHide(node) {
|
|
438
376
|
const { style } = node;
|
|
@@ -449,5 +387,4 @@ function visuallyHide(node) {
|
|
|
449
387
|
}
|
|
450
388
|
|
|
451
389
|
export { AnnouncerController, visuallyHide };
|
|
452
|
-
//# sourceMappingURL=announcer_controller.js.map
|
|
453
390
|
//# sourceMappingURL=announcer_controller.js.map
|