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
|
@@ -38,16 +38,39 @@ declare class SkeletonController extends Controller<HTMLElement> {
|
|
|
38
38
|
default: number;
|
|
39
39
|
};
|
|
40
40
|
};
|
|
41
|
+
static valueConstraints: {
|
|
42
|
+
minDuration: {
|
|
43
|
+
readonly finite: true;
|
|
44
|
+
readonly min: 0;
|
|
45
|
+
readonly max: 2147483647;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
41
48
|
static actions: readonly ["ready", "reset"];
|
|
42
49
|
static events: readonly ["ready"];
|
|
43
50
|
readonly placeholderTarget: HTMLElement;
|
|
51
|
+
readonly placeholderTargets: HTMLElement[];
|
|
44
52
|
readonly contentTarget: HTMLElement;
|
|
53
|
+
readonly contentTargets: HTMLElement[];
|
|
45
54
|
readonly hasPlaceholderTarget: boolean;
|
|
46
55
|
readonly hasContentTarget: boolean;
|
|
47
56
|
minDurationValue: number;
|
|
48
57
|
announceReadyTextValue: string;
|
|
49
58
|
connect(): void;
|
|
50
59
|
disconnect(): void;
|
|
60
|
+
/** Shows or hides a placeholder that arrives at runtime as the phase calls for. */
|
|
61
|
+
placeholderTargetConnected(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Gives a placeholder that no longer resolves its own `hidden` back, even after
|
|
64
|
+
* `disconnect()`, and while connected repaints the placeholder that stays.
|
|
65
|
+
*/
|
|
66
|
+
placeholderTargetDisconnected(placeholder: HTMLElement): void;
|
|
67
|
+
/** Shows or hides content that arrives at runtime as the phase calls for. */
|
|
68
|
+
contentTargetConnected(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Gives content that no longer resolves its own `hidden` back, even after
|
|
71
|
+
* `disconnect()`, and while connected repaints the content that stays.
|
|
72
|
+
*/
|
|
73
|
+
contentTargetDisconnected(content: HTMLElement): void;
|
|
51
74
|
/** Swaps to the real content. Honors `minDuration` to prevent a flash. */
|
|
52
75
|
ready(): void;
|
|
53
76
|
/** Returns to the loading state (e.g. a Turbo Stream re-fetch). */
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
function fillTemplate(template, values) {
|
|
4
|
+
return template.replace(/\{([a-zA-Z][a-zA-Z0-9]*)\}/g, (match, name) => {
|
|
5
|
+
const replacement = Object.hasOwn(values, name) ? values[name] : void 0;
|
|
6
|
+
return replacement === void 0 ? match : String(replacement);
|
|
7
|
+
});
|
|
8
|
+
}
|
|
4
9
|
|
|
5
|
-
// src/utils/announce.ts
|
|
6
10
|
function announce(message, options = {}) {
|
|
7
11
|
const text = message.trim();
|
|
8
12
|
if (text.length === 0) return;
|
|
@@ -12,95 +16,210 @@ function announce(message, options = {}) {
|
|
|
12
16
|
})
|
|
13
17
|
);
|
|
14
18
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
|
|
20
|
+
function setAttributeIfChanged(element, name, value, beforeWrite) {
|
|
21
|
+
if (element.getAttribute(name) === value) return false;
|
|
22
|
+
if (value === null) element.removeAttribute(name);
|
|
23
|
+
else element.setAttribute(name, value);
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function sharedRegistry(key, create) {
|
|
28
|
+
const symbol = Symbol.for(key);
|
|
29
|
+
const scope = globalThis;
|
|
30
|
+
const existing = scope[symbol];
|
|
31
|
+
if (existing !== void 0) return existing;
|
|
32
|
+
const registry2 = create();
|
|
33
|
+
Object.defineProperty(globalThis, symbol, { value: registry2 });
|
|
34
|
+
return registry2;
|
|
20
35
|
}
|
|
21
36
|
|
|
22
|
-
|
|
37
|
+
var registry = sharedRegistry(
|
|
38
|
+
"stimeo-ui.attribute-lease.registry.v1",
|
|
39
|
+
() => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
|
|
40
|
+
);
|
|
41
|
+
function isAttributeValue(value) {
|
|
42
|
+
return value === null || typeof value === "string";
|
|
43
|
+
}
|
|
44
|
+
function readLeaseRecord(element, record) {
|
|
45
|
+
try {
|
|
46
|
+
const parsed = JSON.parse(element.getAttribute(record) ?? "null");
|
|
47
|
+
if (!Array.isArray(parsed)) return void 0;
|
|
48
|
+
const [original, written, ...rest] = parsed;
|
|
49
|
+
const linked = rest[0] !== false;
|
|
50
|
+
const beneath = linked ? rest : rest.slice(1);
|
|
51
|
+
if (!beneath.every((under) => typeof under === "string")) return void 0;
|
|
52
|
+
return isAttributeValue(original) && isAttributeValue(written) ? { original, written, linked, beneath } : void 0;
|
|
53
|
+
} catch {
|
|
54
|
+
return void 0;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function attributeStack(element, attribute) {
|
|
58
|
+
const byAttribute = registry.stacks.get(element) ?? /* @__PURE__ */ new Map();
|
|
59
|
+
registry.stacks.set(element, byAttribute);
|
|
60
|
+
const known = byAttribute.get(attribute);
|
|
61
|
+
if (known) return known;
|
|
62
|
+
const found = [];
|
|
63
|
+
for (const record of registry.names.get(attribute) ?? []) {
|
|
64
|
+
const read = readLeaseRecord(element, record);
|
|
65
|
+
if (read) found.push({ ...read, record });
|
|
66
|
+
}
|
|
67
|
+
const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
|
|
68
|
+
const stack = found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
|
|
69
|
+
lease: null,
|
|
70
|
+
record,
|
|
71
|
+
written,
|
|
72
|
+
original,
|
|
73
|
+
linked: linked && index > 0
|
|
74
|
+
}));
|
|
75
|
+
byAttribute.set(attribute, stack);
|
|
76
|
+
return stack;
|
|
77
|
+
}
|
|
78
|
+
function findHold(stack, lease, record) {
|
|
79
|
+
return stack.find((held) => held.lease === lease) ?? stack.find((held) => held.lease === null && held.record === record);
|
|
80
|
+
}
|
|
81
|
+
var AttributeLease = class {
|
|
82
|
+
#attribute;
|
|
83
|
+
#record;
|
|
84
|
+
#base;
|
|
85
|
+
#preserveAuthor;
|
|
86
|
+
#held = /* @__PURE__ */ new Set();
|
|
87
|
+
constructor(attribute, owner, options = {}) {
|
|
88
|
+
this.#attribute = attribute;
|
|
89
|
+
this.#record = `data-${owner}-${attribute}-lease`;
|
|
90
|
+
this.#base = options.base === true;
|
|
91
|
+
this.#preserveAuthor = options.preserveAuthor === true;
|
|
92
|
+
const names = registry.names;
|
|
93
|
+
names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
|
|
94
|
+
}
|
|
95
|
+
write(element, value) {
|
|
96
|
+
const stack = attributeStack(element, this.#attribute);
|
|
97
|
+
const hold = this.#take(stack) ?? this.#acquire(element, stack);
|
|
98
|
+
this.#held.add(element);
|
|
99
|
+
const shows = !this.#covered(element, stack, hold);
|
|
100
|
+
hold.written = value;
|
|
101
|
+
this.#mark(element, stack);
|
|
102
|
+
if (shows) this.#reflect(element, value);
|
|
103
|
+
}
|
|
104
|
+
return(element) {
|
|
105
|
+
const held = this.#held.delete(element);
|
|
106
|
+
const known = registry.stacks.get(element)?.has(this.#attribute);
|
|
107
|
+
const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
|
|
108
|
+
const hold = this.#take(stack);
|
|
109
|
+
if (!hold) return false;
|
|
110
|
+
const carries = element.getAttribute(this.#attribute) === hold.written;
|
|
111
|
+
const owns = carries && !this.#covered(element, stack, hold);
|
|
112
|
+
const index = stack.indexOf(hold);
|
|
113
|
+
stack.splice(index, 1);
|
|
114
|
+
const above = stack[index];
|
|
115
|
+
if (above) above.linked &&= hold.linked;
|
|
116
|
+
this.#mark(element, stack);
|
|
117
|
+
if (!owns) return true;
|
|
118
|
+
const below = hold.linked ? stack[index - 1] : void 0;
|
|
119
|
+
this.#reflect(element, below ? below.written : hold.original);
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
returnAll() {
|
|
123
|
+
for (const element of Array.from(this.#held)) this.return(element);
|
|
124
|
+
}
|
|
125
|
+
#take(stack) {
|
|
126
|
+
const hold = findHold(stack, this, this.#record);
|
|
127
|
+
if (hold) hold.lease = this;
|
|
128
|
+
return hold;
|
|
129
|
+
}
|
|
130
|
+
#acquire(element, stack) {
|
|
131
|
+
const current = element.getAttribute(this.#attribute);
|
|
132
|
+
const top = stack.at(-1);
|
|
133
|
+
const bottom = stack[0];
|
|
134
|
+
const over = top?.written === current ? top : void 0;
|
|
135
|
+
const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
|
|
136
|
+
const hold = {
|
|
137
|
+
lease: this,
|
|
138
|
+
record: this.#record,
|
|
139
|
+
written: current,
|
|
140
|
+
original: from ? from.original : current,
|
|
141
|
+
linked: !this.#base && over !== void 0
|
|
142
|
+
};
|
|
143
|
+
if (this.#base && bottom) {
|
|
144
|
+
bottom.linked = true;
|
|
145
|
+
stack.unshift(hold);
|
|
146
|
+
} else stack.push(hold);
|
|
147
|
+
return hold;
|
|
148
|
+
}
|
|
149
|
+
#covered(element, stack, hold) {
|
|
150
|
+
const current = element.getAttribute(this.#attribute);
|
|
151
|
+
return stack.slice(stack.indexOf(hold) + 1).some((above) => above.written === current);
|
|
152
|
+
}
|
|
153
|
+
#mark(element, stack) {
|
|
154
|
+
const records = /* @__PURE__ */ new Map([[this.#record, null]]);
|
|
155
|
+
stack.forEach((hold, index) => {
|
|
156
|
+
const names = stack.slice(0, index).map((under) => under.record);
|
|
157
|
+
const beneath = [...new Set(names.reverse())].filter((name) => name !== hold.record);
|
|
158
|
+
const marker = hold.linked || beneath.length === 0 ? [] : [false];
|
|
159
|
+
records.set(
|
|
160
|
+
hold.record,
|
|
161
|
+
hold.written === hold.original && beneath.length === 0 && index === stack.length - 1 ? null : JSON.stringify([hold.original, hold.written, ...marker, ...beneath])
|
|
162
|
+
);
|
|
163
|
+
});
|
|
164
|
+
for (const [name, recorded] of records) {
|
|
165
|
+
setAttributeIfChanged(element, name, recorded);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
#reflect(element, value) {
|
|
169
|
+
setAttributeIfChanged(element, this.#attribute, value);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
23
173
|
var DetachGate = class _DetachGate {
|
|
24
|
-
/** Set while a probe is queued, waiting for a reconnect to cancel it. */
|
|
25
174
|
#pending = false;
|
|
26
|
-
/**
|
|
27
|
-
* True while a probe is queued — the last disconnect was ambiguous and no
|
|
28
|
-
* reconnect has cancelled it yet. Read it from `connect()` to tell the
|
|
29
|
-
* reconnect half of an in-page move from a first connect: a controller whose
|
|
30
|
-
* initialisation restarts a measurement (a min-duration floor, an elapsed
|
|
31
|
-
* counter) must skip it for the move, where nothing actually restarted.
|
|
32
|
-
*/
|
|
33
175
|
get pending() {
|
|
34
176
|
return this.#pending;
|
|
35
177
|
}
|
|
36
|
-
/**
|
|
37
|
-
* True when the disconnect is definitely a real detach — the element left
|
|
38
|
-
* the document, or `data-controller` no longer lists the identifier. False
|
|
39
|
-
* means ambiguous (in-page move or observed-root exit), NOT "alive".
|
|
40
|
-
*/
|
|
41
178
|
static isDetached(host) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return !tokens.includes(host.identifier);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Call from `disconnect()`: runs `teardown` synchronously on a definite
|
|
48
|
-
* detach (fast path), otherwise defers it one microtask — a reconnect
|
|
49
|
-
* ({@link cancel} from `connect()`) keeps the state, no reconnect runs it.
|
|
50
|
-
* One microtask is the whole probe window: Stimulus reconnects a moved
|
|
51
|
-
* element within the same mutation batch, before the checkpoint drains.
|
|
52
|
-
*/
|
|
179
|
+
return !host.element.isConnected || !_DetachGate.#listed(host);
|
|
180
|
+
}
|
|
53
181
|
disconnected(host, teardown) {
|
|
54
|
-
|
|
182
|
+
const carried = _DetachGate.#carried(host);
|
|
183
|
+
if (!carried && _DetachGate.isDetached(host)) {
|
|
55
184
|
this.#pending = false;
|
|
56
185
|
teardown();
|
|
57
186
|
return;
|
|
58
187
|
}
|
|
59
188
|
this.#pending = true;
|
|
60
|
-
|
|
189
|
+
const probe = () => {
|
|
61
190
|
if (!this.#pending) return;
|
|
62
191
|
this.#pending = false;
|
|
63
192
|
teardown();
|
|
64
|
-
}
|
|
193
|
+
};
|
|
194
|
+
if (carried) setTimeout(probe, 0);
|
|
195
|
+
else queueMicrotask(probe);
|
|
196
|
+
}
|
|
197
|
+
static #carried(host) {
|
|
198
|
+
const element = host.element;
|
|
199
|
+
return !element.isConnected && element.closest("[data-turbo-permanent]") !== null && _DetachGate.#listed(host);
|
|
200
|
+
}
|
|
201
|
+
static #listed(host) {
|
|
202
|
+
const tokens = (host.element.getAttribute("data-controller") ?? "").split(/\s+/);
|
|
203
|
+
return tokens.includes(host.identifier);
|
|
65
204
|
}
|
|
66
|
-
/**
|
|
67
|
-
* Disarms a pending probe. Call from `connect()` (the reconnect that proves
|
|
68
|
-
* an in-page move) and from the head of any teardown path not routed through
|
|
69
|
-
* {@link disconnected} (disabled-toggle, Escape), so an orphaned probe can
|
|
70
|
-
* never run the teardown a second time.
|
|
71
|
-
*/
|
|
72
205
|
cancel() {
|
|
73
206
|
this.#pending = false;
|
|
74
207
|
}
|
|
75
208
|
};
|
|
76
209
|
|
|
77
|
-
// src/utils/min_duration_floor.ts
|
|
78
210
|
var MinDurationFloor = class {
|
|
79
211
|
#timers;
|
|
80
|
-
/** Pending finish timer id, or `null` when nothing is held back. */
|
|
81
212
|
#timerId = null;
|
|
82
|
-
/** Epoch ms the floor is measured from. */
|
|
83
213
|
#since = 0;
|
|
84
|
-
/** @param timers - the controller's registry; the floor schedules into it. */
|
|
85
214
|
constructor(timers) {
|
|
86
215
|
this.#timers = timers;
|
|
87
216
|
}
|
|
88
|
-
/** Starts the floor: call when the state being held becomes visible. */
|
|
89
217
|
begin() {
|
|
90
218
|
this.#since = Date.now();
|
|
91
219
|
}
|
|
92
|
-
/** True while a finish is held back waiting for the floor to elapse. */
|
|
93
220
|
get pending() {
|
|
94
221
|
return this.#timerId !== null;
|
|
95
222
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Runs `finish` once the floor has elapsed, immediately when it already has.
|
|
98
|
-
*
|
|
99
|
-
* A held-back finish is **replaced**, never stacked: only the most recently
|
|
100
|
-
* queued id is cancellable, so a second timer would outlive every cancel and
|
|
101
|
-
* end a state that has since restarted. Controllers that want the first signal
|
|
102
|
-
* to win guard on {@link pending} before calling.
|
|
103
|
-
*/
|
|
104
223
|
schedule(minDuration, finish) {
|
|
105
224
|
this.cancel();
|
|
106
225
|
const remaining = minDuration - (Date.now() - this.#since);
|
|
@@ -113,7 +232,6 @@ var MinDurationFloor = class {
|
|
|
113
232
|
finish();
|
|
114
233
|
}
|
|
115
234
|
}
|
|
116
|
-
/** Drops a held-back finish. Safe when none is queued, or after a bulk clear. */
|
|
117
235
|
cancel() {
|
|
118
236
|
if (this.#timerId !== null) {
|
|
119
237
|
this.#timers.clear(this.#timerId);
|
|
@@ -122,43 +240,70 @@ var MinDurationFloor = class {
|
|
|
122
240
|
}
|
|
123
241
|
};
|
|
124
242
|
|
|
125
|
-
|
|
243
|
+
var MAX_TIMER_DELAY_MS = 2147483647;
|
|
244
|
+
|
|
245
|
+
var NUMBER_BOUNDS = {
|
|
246
|
+
timer: { finite: true, min: 0, max: MAX_TIMER_DELAY_MS }};
|
|
247
|
+
function matchesNumberBounds(value, bounds) {
|
|
248
|
+
if (!Number.isFinite(value)) {
|
|
249
|
+
const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
|
|
250
|
+
if (direction === null) return false;
|
|
251
|
+
if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
|
|
252
|
+
}
|
|
253
|
+
if (bounds.min !== void 0 && value < bounds.min) return false;
|
|
254
|
+
if (bounds.max !== void 0 && value > bounds.max) return false;
|
|
255
|
+
if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
|
|
256
|
+
if (bounds.integer && !Number.isInteger(value)) return false;
|
|
257
|
+
if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function readNumber(raw, fallback, bounds) {
|
|
262
|
+
return matchesNumberBounds(raw, bounds) ? raw : fallback;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
var NumberValueReader = class {
|
|
266
|
+
#lastRejected = /* @__PURE__ */ new Map();
|
|
267
|
+
read(owner, name, raw, fallback, bounds) {
|
|
268
|
+
const resolved = readNumber(raw, fallback, bounds);
|
|
269
|
+
if (matchesNumberBounds(raw, bounds)) {
|
|
270
|
+
this.#lastRejected.delete(name);
|
|
271
|
+
return resolved;
|
|
272
|
+
}
|
|
273
|
+
const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
|
|
274
|
+
const literal = owner.element.getAttribute(attribute);
|
|
275
|
+
if (literal === null) {
|
|
276
|
+
this.#lastRejected.delete(name);
|
|
277
|
+
return resolved;
|
|
278
|
+
}
|
|
279
|
+
if (this.#lastRejected.get(name) !== literal) {
|
|
280
|
+
this.#lastRejected.set(name, literal);
|
|
281
|
+
console.warn(
|
|
282
|
+
`Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
return resolved;
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
|
|
126
289
|
var TimerRegistry = class {
|
|
127
|
-
/** Live timer ids that have not yet been cleared (or, for timeouts, fired). */
|
|
128
290
|
ids = /* @__PURE__ */ new Set();
|
|
129
|
-
/**
|
|
130
|
-
* Cancels a single tracked timer.
|
|
131
|
-
*
|
|
132
|
-
* No-ops if the id is unknown (already cleared, fired, or never owned by this
|
|
133
|
-
* registry), so callers can clear defensively without guarding.
|
|
134
|
-
*/
|
|
135
291
|
clear(id) {
|
|
136
292
|
if (this.ids.delete(id)) {
|
|
137
293
|
this.cancel(id);
|
|
138
294
|
}
|
|
139
295
|
}
|
|
140
|
-
/**
|
|
141
|
-
* Cancels every tracked timer. Call this from a controller's `disconnect()`
|
|
142
|
-
* to guarantee no timer outlives the element.
|
|
143
|
-
*/
|
|
144
296
|
clearAll() {
|
|
145
297
|
for (const id of this.ids) {
|
|
146
298
|
this.cancel(id);
|
|
147
299
|
}
|
|
148
300
|
this.ids.clear();
|
|
149
301
|
}
|
|
150
|
-
/** Number of timers currently tracked (pending). */
|
|
151
302
|
get size() {
|
|
152
303
|
return this.ids.size;
|
|
153
304
|
}
|
|
154
305
|
};
|
|
155
306
|
var SafeTimeout = class extends TimerRegistry {
|
|
156
|
-
/**
|
|
157
|
-
* Schedules `callback` after `delay` ms and returns the timer id.
|
|
158
|
-
*
|
|
159
|
-
* The id is removed from the registry automatically when the timeout fires,
|
|
160
|
-
* so {@link TimerRegistry.size | size} reflects only still-pending timers.
|
|
161
|
-
*/
|
|
162
307
|
set(callback, delay) {
|
|
163
308
|
const id = this.schedule(() => {
|
|
164
309
|
this.ids.delete(id);
|
|
@@ -175,19 +320,25 @@ var SafeTimeout = class extends TimerRegistry {
|
|
|
175
320
|
}
|
|
176
321
|
};
|
|
177
322
|
|
|
178
|
-
|
|
179
|
-
|
|
323
|
+
var SkeletonController = class _SkeletonController extends Controller {
|
|
324
|
+
#numbers = new NumberValueReader();
|
|
180
325
|
static targets = ["placeholder", "content"];
|
|
181
326
|
static values = {
|
|
182
327
|
announceReadyText: { type: String, default: "" },
|
|
183
328
|
minDuration: { type: Number, default: 0 }
|
|
184
329
|
};
|
|
330
|
+
static valueConstraints = {
|
|
331
|
+
minDuration: NUMBER_BOUNDS.timer
|
|
332
|
+
};
|
|
185
333
|
static actions = ["ready", "reset"];
|
|
186
334
|
static events = ["ready"];
|
|
187
335
|
#timers = new SafeTimeout();
|
|
188
336
|
#floor = new MinDurationFloor(this.#timers);
|
|
189
337
|
#gate = new DetachGate();
|
|
338
|
+
#hidden = new AttributeLease("hidden", this.identifier);
|
|
339
|
+
#connected = false;
|
|
190
340
|
connect() {
|
|
341
|
+
this.#connected = true;
|
|
191
342
|
const moved = this.#gate.pending;
|
|
192
343
|
this.#gate.cancel();
|
|
193
344
|
if (!moved && this.#state !== "ready") {
|
|
@@ -195,57 +346,64 @@ var SkeletonController = class extends Controller {
|
|
|
195
346
|
}
|
|
196
347
|
}
|
|
197
348
|
disconnect() {
|
|
349
|
+
this.#connected = false;
|
|
198
350
|
this.#gate.disconnected(this, () => this.#teardown());
|
|
199
351
|
}
|
|
200
|
-
|
|
352
|
+
placeholderTargetConnected() {
|
|
353
|
+
if (this.#connected) this.#reflect(this.#state === "ready");
|
|
354
|
+
}
|
|
355
|
+
placeholderTargetDisconnected(placeholder) {
|
|
356
|
+
if (!this.placeholderTargets.includes(placeholder)) this.#hidden.return(placeholder);
|
|
357
|
+
if (this.#connected) this.#reflect(this.#state === "ready");
|
|
358
|
+
}
|
|
359
|
+
contentTargetConnected() {
|
|
360
|
+
if (this.#connected) this.#reflect(this.#state === "ready");
|
|
361
|
+
}
|
|
362
|
+
contentTargetDisconnected(content) {
|
|
363
|
+
if (!this.contentTargets.includes(content)) this.#hidden.return(content);
|
|
364
|
+
if (this.#connected) this.#reflect(this.#state === "ready");
|
|
365
|
+
}
|
|
201
366
|
ready() {
|
|
202
367
|
if (this.#state === "ready" || this.#floor.pending) return;
|
|
203
|
-
this.#floor.schedule(this
|
|
368
|
+
this.#floor.schedule(this.#safeMinDuration, () => this.#reveal());
|
|
204
369
|
}
|
|
205
|
-
/** Returns to the loading state (e.g. a Turbo Stream re-fetch). */
|
|
206
370
|
reset() {
|
|
207
371
|
this.#floor.cancel();
|
|
208
372
|
this.#enterLoading();
|
|
209
373
|
}
|
|
210
|
-
/** Shows the placeholder, hides content, and marks the region busy. */
|
|
211
374
|
#enterLoading() {
|
|
212
375
|
this.#floor.begin();
|
|
213
|
-
|
|
214
|
-
if (this.hasContentTarget) this.contentTarget.hidden = true;
|
|
376
|
+
this.#reflect(false);
|
|
215
377
|
this.element.setAttribute("aria-busy", "true");
|
|
216
378
|
this.element.setAttribute("data-state", "loading");
|
|
217
379
|
}
|
|
218
|
-
/**
|
|
219
|
-
* Hides the placeholder, shows content, and clears the busy state.
|
|
220
|
-
*
|
|
221
|
-
* @stimeoRuntimeOnly `announceReadyText` is the wording of the one announcement this reveal
|
|
222
|
-
* makes.
|
|
223
|
-
*/
|
|
224
380
|
#reveal() {
|
|
225
|
-
|
|
226
|
-
if (this.hasContentTarget) this.contentTarget.hidden = false;
|
|
381
|
+
this.#reflect(true);
|
|
227
382
|
this.element.setAttribute("aria-busy", "false");
|
|
228
383
|
this.element.setAttribute("data-state", "ready");
|
|
229
384
|
this.dispatch("ready", { detail: {} });
|
|
230
385
|
announce(fillTemplate(this.announceReadyTextValue, {}));
|
|
231
386
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
* targets, so the rollback could only ever be partial.
|
|
237
|
-
*/
|
|
387
|
+
#reflect(ready) {
|
|
388
|
+
if (this.hasPlaceholderTarget) this.#hidden.write(this.placeholderTarget, ready ? "" : null);
|
|
389
|
+
if (this.hasContentTarget) this.#hidden.write(this.contentTarget, ready ? null : "");
|
|
390
|
+
}
|
|
238
391
|
#teardown() {
|
|
239
|
-
this.#gate.cancel();
|
|
240
|
-
this.#timers.clearAll();
|
|
241
392
|
this.#floor.cancel();
|
|
242
393
|
}
|
|
243
|
-
/** Current lifecycle phase as reflected on `data-state`. */
|
|
244
394
|
get #state() {
|
|
245
395
|
return this.element.getAttribute("data-state") ?? "loading";
|
|
246
396
|
}
|
|
397
|
+
get #safeMinDuration() {
|
|
398
|
+
return this.#numbers.read(
|
|
399
|
+
this,
|
|
400
|
+
"minDuration",
|
|
401
|
+
this.minDurationValue,
|
|
402
|
+
_SkeletonController.values.minDuration.default,
|
|
403
|
+
_SkeletonController.valueConstraints.minDuration
|
|
404
|
+
);
|
|
405
|
+
}
|
|
247
406
|
};
|
|
248
407
|
|
|
249
408
|
export { SkeletonController };
|
|
250
|
-
//# sourceMappingURL=skeleton_controller.js.map
|
|
251
409
|
//# sourceMappingURL=skeleton_controller.js.map
|