stimeo-ui 0.16.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +136 -0
- package/README.md +27 -11
- package/dist/cable/index.d.ts +88 -31
- package/dist/cable/index.js +384 -449
- package/dist/cable/index.js.map +1 -1
- package/dist/coerce-JtZVNG5h.d.ts +20 -0
- package/dist/controllers/accordion_controller.d.ts +4 -2
- package/dist/controllers/accordion_controller.js +174 -55
- package/dist/controllers/accordion_controller.js.map +1 -1
- package/dist/controllers/alert_dialog_controller.d.ts +12 -2
- package/dist/controllers/alert_dialog_controller.js +903 -235
- package/dist/controllers/alert_dialog_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.d.ts +37 -5
- package/dist/controllers/announcer_controller.js +238 -205
- package/dist/controllers/announcer_controller.js.map +1 -1
- package/dist/controllers/aspect_ratio_controller.js +0 -10
- package/dist/controllers/aspect_ratio_controller.js.map +1 -1
- package/dist/controllers/auto_submit_controller.d.ts +30 -6
- package/dist/controllers/auto_submit_controller.js +414 -145
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.js +185 -107
- package/dist/controllers/avatar_controller.js.map +1 -1
- package/dist/controllers/breadcrumb_controller.js +0 -130
- package/dist/controllers/breadcrumb_controller.js.map +1 -1
- package/dist/controllers/bulk_select_controller.d.ts +21 -3
- package/dist/controllers/bulk_select_controller.js +282 -58
- package/dist/controllers/bulk_select_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +38 -16
- package/dist/controllers/calendar_controller.js +228 -260
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +43 -12
- package/dist/controllers/carousel_controller.js +536 -436
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/character_counter_controller.d.ts +44 -7
- package/dist/controllers/character_counter_controller.js +493 -207
- package/dist/controllers/character_counter_controller.js.map +1 -1
- package/dist/controllers/checkbox_controller.d.ts +7 -2
- package/dist/controllers/checkbox_controller.js +38 -74
- package/dist/controllers/checkbox_controller.js.map +1 -1
- package/dist/controllers/clipboard_controller.d.ts +16 -5
- package/dist/controllers/clipboard_controller.js +261 -149
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +17 -5
- package/dist/controllers/collapsible_controller.js +304 -120
- package/dist/controllers/collapsible_controller.js.map +1 -1
- package/dist/controllers/color_picker_controller.d.ts +18 -6
- package/dist/controllers/color_picker_controller.js +178 -146
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/combobox_controller.d.ts +24 -6
- package/dist/controllers/combobox_controller.js +522 -156
- package/dist/controllers/combobox_controller.js.map +1 -1
- package/dist/controllers/command_palette_controller.d.ts +51 -20
- package/dist/controllers/command_palette_controller.js +1156 -395
- package/dist/controllers/command_palette_controller.js.map +1 -1
- package/dist/controllers/conditional_fields_controller.d.ts +15 -2
- package/dist/controllers/conditional_fields_controller.js +300 -171
- package/dist/controllers/conditional_fields_controller.js.map +1 -1
- package/dist/controllers/confirm_controller.d.ts +49 -12
- package/dist/controllers/confirm_controller.js +980 -262
- package/dist/controllers/confirm_controller.js.map +1 -1
- package/dist/controllers/context_menu_controller.d.ts +80 -18
- package/dist/controllers/context_menu_controller.js +346 -153
- package/dist/controllers/context_menu_controller.js.map +1 -1
- package/dist/controllers/count_up_controller.d.ts +13 -1
- package/dist/controllers/count_up_controller.js +73 -21
- package/dist/controllers/count_up_controller.js.map +1 -1
- package/dist/controllers/countdown_controller.d.ts +47 -3
- package/dist/controllers/countdown_controller.js +281 -158
- package/dist/controllers/countdown_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +93 -10
- package/dist/controllers/currency_input_controller.js +575 -225
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/data_grid_controller.d.ts +25 -12
- package/dist/controllers/data_grid_controller.js +248 -214
- package/dist/controllers/data_grid_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +42 -14
- package/dist/controllers/date_range_picker_controller.js +338 -235
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +17 -6
- package/dist/controllers/dialog_controller.js +899 -237
- package/dist/controllers/dialog_controller.js.map +1 -1
- package/dist/controllers/direct_upload_controller.d.ts +25 -8
- package/dist/controllers/direct_upload_controller.js +97 -167
- package/dist/controllers/direct_upload_controller.js.map +1 -1
- package/dist/controllers/dirty_form_controller.d.ts +6 -1
- package/dist/controllers/dirty_form_controller.js +72 -69
- package/dist/controllers/dirty_form_controller.js.map +1 -1
- package/dist/controllers/dismissible_controller.d.ts +19 -0
- package/dist/controllers/dismissible_controller.js +196 -24
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/drawer_controller.d.ts +39 -11
- package/dist/controllers/drawer_controller.js +974 -355
- package/dist/controllers/drawer_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.d.ts +31 -1
- package/dist/controllers/dropdown_controller.js +339 -96
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/editable_controller.d.ts +12 -1
- package/dist/controllers/editable_controller.js +315 -88
- package/dist/controllers/editable_controller.js.map +1 -1
- package/dist/controllers/empty_state_controller.js +79 -58
- package/dist/controllers/empty_state_controller.js.map +1 -1
- package/dist/controllers/file_dropzone_controller.d.ts +63 -18
- package/dist/controllers/file_dropzone_controller.js +322 -211
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/filter_controller.js +77 -42
- package/dist/controllers/filter_controller.js.map +1 -1
- package/dist/controllers/flash_controller.d.ts +35 -12
- package/dist/controllers/flash_controller.js +238 -347
- package/dist/controllers/flash_controller.js.map +1 -1
- package/dist/controllers/focus_controller.d.ts +15 -6
- package/dist/controllers/focus_controller.js +679 -240
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +156 -132
- package/dist/controllers/form_field_controller.js.map +1 -1
- package/dist/controllers/form_validation_controller.d.ts +3 -3
- package/dist/controllers/form_validation_controller.js +31 -97
- package/dist/controllers/form_validation_controller.js.map +1 -1
- package/dist/controllers/frame_loading_controller.d.ts +47 -14
- package/dist/controllers/frame_loading_controller.js +275 -217
- package/dist/controllers/frame_loading_controller.js.map +1 -1
- package/dist/controllers/highlight_controller.d.ts +27 -6
- package/dist/controllers/highlight_controller.js +107 -75
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/hover_card_controller.d.ts +60 -4
- package/dist/controllers/hover_card_controller.js +327 -130
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +48 -6
- package/dist/controllers/idle_controller.js +271 -101
- package/dist/controllers/idle_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.d.ts +30 -13
- package/dist/controllers/input_mask_controller.js +483 -97
- package/dist/controllers/input_mask_controller.js.map +1 -1
- package/dist/controllers/intersection_controller.d.ts +32 -13
- package/dist/controllers/intersection_controller.js +150 -106
- package/dist/controllers/intersection_controller.js.map +1 -1
- package/dist/controllers/lazy_frame_controller.d.ts +19 -2
- package/dist/controllers/lazy_frame_controller.js +24 -68
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/listbox_controller.d.ts +44 -9
- package/dist/controllers/listbox_controller.js +523 -240
- package/dist/controllers/listbox_controller.js.map +1 -1
- package/dist/controllers/local_time_controller.d.ts +9 -7
- package/dist/controllers/local_time_controller.js +102 -77
- package/dist/controllers/local_time_controller.js.map +1 -1
- package/dist/controllers/masonry_controller.d.ts +11 -3
- package/dist/controllers/masonry_controller.js +80 -96
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.d.ts +55 -11
- package/dist/controllers/menu_controller.js +302 -188
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.d.ts +51 -9
- package/dist/controllers/menubar_controller.js +232 -345
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/meter_controller.d.ts +33 -20
- package/dist/controllers/meter_controller.js +417 -87
- package/dist/controllers/meter_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +48 -18
- package/dist/controllers/multi_select_controller.js +785 -393
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.d.ts +27 -6
- package/dist/controllers/navigation_menu_controller.js +190 -250
- package/dist/controllers/navigation_menu_controller.js.map +1 -1
- package/dist/controllers/nested_form_controller.d.ts +10 -0
- package/dist/controllers/nested_form_controller.js +396 -192
- package/dist/controllers/nested_form_controller.js.map +1 -1
- package/dist/controllers/network_status_controller.d.ts +23 -0
- package/dist/controllers/network_status_controller.js +268 -62
- package/dist/controllers/network_status_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +50 -8
- package/dist/controllers/number_input_controller.js +610 -303
- package/dist/controllers/number_input_controller.js.map +1 -1
- package/dist/controllers/optimistic_controller.d.ts +8 -5
- package/dist/controllers/optimistic_controller.js +45 -87
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.d.ts +55 -8
- package/dist/controllers/otp_controller.js +658 -255
- package/dist/controllers/otp_controller.js.map +1 -1
- package/dist/controllers/overflow_indicator_controller.d.ts +5 -0
- package/dist/controllers/overflow_indicator_controller.js +122 -113
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.d.ts +58 -20
- package/dist/controllers/overflow_menu_controller.js +470 -295
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.d.ts +37 -7
- package/dist/controllers/pagination_controller.js +332 -123
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +46 -8
- package/dist/controllers/password_reveal_controller.js +392 -121
- package/dist/controllers/password_reveal_controller.js.map +1 -1
- package/dist/controllers/password_strength_controller.d.ts +15 -6
- package/dist/controllers/password_strength_controller.js +111 -158
- package/dist/controllers/password_strength_controller.js.map +1 -1
- package/dist/controllers/persist_controller.d.ts +11 -4
- package/dist/controllers/persist_controller.js +165 -111
- package/dist/controllers/persist_controller.js.map +1 -1
- package/dist/controllers/pointer_drag_controller.d.ts +35 -12
- package/dist/controllers/pointer_drag_controller.js +434 -188
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +41 -5
- package/dist/controllers/popover_controller.js +269 -113
- package/dist/controllers/popover_controller.js.map +1 -1
- package/dist/controllers/portal_controller.d.ts +44 -4
- package/dist/controllers/portal_controller.js +215 -76
- package/dist/controllers/portal_controller.js.map +1 -1
- package/dist/controllers/preview_guard_controller.d.ts +10 -4
- package/dist/controllers/preview_guard_controller.js +243 -116
- package/dist/controllers/preview_guard_controller.js.map +1 -1
- package/dist/controllers/progress_controller.d.ts +20 -19
- package/dist/controllers/progress_controller.js +391 -78
- package/dist/controllers/progress_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +21 -9
- package/dist/controllers/radio_group_controller.js +278 -211
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/range_slider_controller.d.ts +47 -6
- package/dist/controllers/range_slider_controller.js +220 -113
- package/dist/controllers/range_slider_controller.js.map +1 -1
- package/dist/controllers/rating_controller.d.ts +20 -4
- package/dist/controllers/rating_controller.js +458 -211
- package/dist/controllers/rating_controller.js.map +1 -1
- package/dist/controllers/read_more_controller.d.ts +2 -0
- package/dist/controllers/read_more_controller.js +138 -63
- package/dist/controllers/read_more_controller.js.map +1 -1
- package/dist/controllers/reading_progress_controller.d.ts +1 -1
- package/dist/controllers/reading_progress_controller.js +166 -137
- package/dist/controllers/reading_progress_controller.js.map +1 -1
- package/dist/controllers/relative_time_controller.d.ts +20 -6
- package/dist/controllers/relative_time_controller.js +211 -112
- package/dist/controllers/relative_time_controller.js.map +1 -1
- package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
- package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +103 -38
- package/dist/controllers/reset_on_restore_controller.js.map +1 -0
- package/dist/controllers/resizable_controller.d.ts +31 -2
- package/dist/controllers/resizable_controller.js +299 -150
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/roving_controller.d.ts +3 -3
- package/dist/controllers/roving_controller.js +49 -88
- package/dist/controllers/roving_controller.js.map +1 -1
- package/dist/controllers/scroll_area_controller.d.ts +7 -3
- package/dist/controllers/scroll_area_controller.js +490 -246
- package/dist/controllers/scroll_area_controller.js.map +1 -1
- package/dist/controllers/scroll_restore_controller.d.ts +3 -3
- package/dist/controllers/scroll_restore_controller.js +14 -55
- package/dist/controllers/scroll_restore_controller.js.map +1 -1
- package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
- package/dist/controllers/scroll_visibility_controller.js +432 -149
- package/dist/controllers/scroll_visibility_controller.js.map +1 -1
- package/dist/controllers/scrollspy_controller.d.ts +6 -1
- package/dist/controllers/scrollspy_controller.js +193 -248
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/separator_controller.d.ts +20 -5
- package/dist/controllers/separator_controller.js +285 -142
- package/dist/controllers/separator_controller.js.map +1 -1
- package/dist/controllers/sidebar_controller.d.ts +65 -8
- package/dist/controllers/sidebar_controller.js +1069 -404
- package/dist/controllers/sidebar_controller.js.map +1 -1
- package/dist/controllers/skeleton_controller.d.ts +23 -0
- package/dist/controllers/skeleton_controller.js +259 -101
- package/dist/controllers/skeleton_controller.js.map +1 -1
- package/dist/controllers/slider_controller.d.ts +29 -2
- package/dist/controllers/slider_controller.js +187 -86
- package/dist/controllers/slider_controller.js.map +1 -1
- package/dist/controllers/smart_sticky_header_controller.d.ts +22 -4
- package/dist/controllers/smart_sticky_header_controller.js +173 -66
- package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
- package/dist/controllers/sortable_controller.d.ts +4 -4
- package/dist/controllers/sortable_controller.js +26 -125
- package/dist/controllers/sortable_controller.js.map +1 -1
- package/dist/controllers/spinner_controller.d.ts +39 -4
- package/dist/controllers/spinner_controller.js +288 -173
- package/dist/controllers/spinner_controller.js.map +1 -1
- package/dist/controllers/step_indicator_controller.d.ts +9 -4
- package/dist/controllers/step_indicator_controller.js +105 -46
- package/dist/controllers/step_indicator_controller.js.map +1 -1
- package/dist/controllers/stepper_controller.d.ts +14 -6
- package/dist/controllers/stepper_controller.js +120 -73
- package/dist/controllers/stepper_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.d.ts +9 -1
- package/dist/controllers/stick_to_bottom_controller.js +275 -140
- package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
- package/dist/controllers/sticky_observer_controller.d.ts +11 -0
- package/dist/controllers/sticky_observer_controller.js +220 -49
- package/dist/controllers/sticky_observer_controller.js.map +1 -1
- package/dist/controllers/submit_once_controller.d.ts +24 -8
- package/dist/controllers/submit_once_controller.js +376 -227
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +18 -4
- package/dist/controllers/switch_controller.js +201 -84
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +9 -6
- package/dist/controllers/tabs_controller.js +41 -30
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +16 -3
- package/dist/controllers/tags_input_controller.js +293 -173
- package/dist/controllers/tags_input_controller.js.map +1 -1
- package/dist/controllers/textarea_autosize_controller.d.ts +11 -1
- package/dist/controllers/textarea_autosize_controller.js +108 -74
- package/dist/controllers/textarea_autosize_controller.js.map +1 -1
- package/dist/controllers/theme_controller.d.ts +24 -11
- package/dist/controllers/theme_controller.js +140 -116
- package/dist/controllers/theme_controller.js.map +1 -1
- package/dist/controllers/time_picker_controller.d.ts +55 -5
- package/dist/controllers/time_picker_controller.js +331 -127
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +40 -16
- package/dist/controllers/toast_controller.js +244 -324
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +14 -6
- package/dist/controllers/toggle_group_controller.js +252 -191
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.d.ts +8 -6
- package/dist/controllers/toolbar_controller.js +219 -120
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +49 -4
- package/dist/controllers/tooltip_controller.js +158 -124
- package/dist/controllers/tooltip_controller.js.map +1 -1
- package/dist/controllers/transition_controller.d.ts +22 -4
- package/dist/controllers/transition_controller.js +123 -119
- package/dist/controllers/transition_controller.js.map +1 -1
- package/dist/controllers/tree_view_controller.d.ts +22 -12
- package/dist/controllers/tree_view_controller.js +283 -369
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.js +8573 -10410
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +38 -14
- package/dist/inspector/cli.js +108 -40
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +145 -64
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +20 -20
- package/dist/inspector/manifest.json +802 -101
- package/dist/positioning/index.d.ts +15 -7
- package/dist/positioning/index.js +154 -47
- package/dist/positioning/index.js.map +1 -1
- package/package.json +11 -10
- package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
- package/dist/controllers/reset_before_cache_controller.js.map +0 -1
|
@@ -1,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,34 +16,190 @@ 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;
|
|
35
|
+
}
|
|
36
|
+
|
|
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);
|
|
20
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
|
+
|
|
173
|
+
var ListenerSet = class {
|
|
174
|
+
#abort = new AbortController();
|
|
175
|
+
add(target, type, handler, options) {
|
|
176
|
+
target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
|
|
177
|
+
}
|
|
178
|
+
dispose() {
|
|
179
|
+
this.#abort.abort();
|
|
180
|
+
this.#abort = new AbortController();
|
|
181
|
+
}
|
|
182
|
+
};
|
|
21
183
|
|
|
22
|
-
// src/utils/microtask_coalescer.ts
|
|
23
184
|
var MicrotaskCoalescer = class {
|
|
24
185
|
#run;
|
|
25
186
|
#queued = false;
|
|
26
187
|
#active = false;
|
|
27
188
|
#generation = 0;
|
|
28
|
-
/** @param run - the single reconciliation pass, invoked at most once per batch. */
|
|
29
189
|
constructor(run) {
|
|
30
190
|
this.#run = run;
|
|
31
191
|
}
|
|
32
|
-
/** Opens the window in which {@link schedule} is honoured; call from `connect()`. */
|
|
33
192
|
activate() {
|
|
34
193
|
this.#active = true;
|
|
35
194
|
}
|
|
36
|
-
/** Closes the window and drops any pending pass; call from `disconnect()`. */
|
|
37
195
|
cancel() {
|
|
38
196
|
this.#active = false;
|
|
39
197
|
this.#queued = false;
|
|
40
198
|
this.#generation += 1;
|
|
41
199
|
}
|
|
42
|
-
|
|
200
|
+
get pending() {
|
|
201
|
+
return this.#queued;
|
|
202
|
+
}
|
|
43
203
|
schedule() {
|
|
44
204
|
if (!this.#active || this.#queued) return;
|
|
45
205
|
this.#queued = true;
|
|
@@ -52,26 +212,95 @@ var MicrotaskCoalescer = class {
|
|
|
52
212
|
}
|
|
53
213
|
};
|
|
54
214
|
|
|
55
|
-
|
|
56
|
-
|
|
215
|
+
var MorphRenderWatcher = class {
|
|
216
|
+
#listeners = new ListenerSet();
|
|
217
|
+
#pass;
|
|
218
|
+
#element = null;
|
|
219
|
+
#onMorph = () => this.#pass.schedule();
|
|
220
|
+
constructor(run) {
|
|
221
|
+
this.#pass = new MicrotaskCoalescer(run);
|
|
222
|
+
}
|
|
223
|
+
observe(element) {
|
|
224
|
+
if (this.#element === element) return;
|
|
225
|
+
this.disconnect();
|
|
226
|
+
this.#element = element;
|
|
227
|
+
this.#pass.activate();
|
|
228
|
+
this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
|
|
229
|
+
}
|
|
230
|
+
schedule() {
|
|
231
|
+
this.#pass.schedule();
|
|
232
|
+
}
|
|
233
|
+
get pending() {
|
|
234
|
+
return this.#pass.pending;
|
|
235
|
+
}
|
|
236
|
+
disconnect() {
|
|
237
|
+
this.#listeners.dispose();
|
|
238
|
+
this.#pass.cancel();
|
|
239
|
+
this.#element = null;
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
var NUMBER_BOUNDS = {
|
|
244
|
+
nonNegative: { finite: true, min: 0 }};
|
|
245
|
+
function matchesNumberBounds(value, bounds) {
|
|
246
|
+
if (!Number.isFinite(value)) {
|
|
247
|
+
const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
|
|
248
|
+
if (direction === null) return false;
|
|
249
|
+
if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
|
|
250
|
+
}
|
|
251
|
+
if (bounds.min !== void 0 && value < bounds.min) return false;
|
|
252
|
+
if (bounds.max !== void 0 && value > bounds.max) return false;
|
|
253
|
+
if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
|
|
254
|
+
if (bounds.integer && !Number.isInteger(value)) return false;
|
|
255
|
+
if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function readNumber(raw, fallback, bounds) {
|
|
260
|
+
return matchesNumberBounds(raw, bounds) ? raw : fallback;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
var NumberValueReader = class {
|
|
264
|
+
#lastRejected = /* @__PURE__ */ new Map();
|
|
265
|
+
read(owner, name, raw, fallback, bounds) {
|
|
266
|
+
const resolved = readNumber(raw, fallback, bounds);
|
|
267
|
+
if (matchesNumberBounds(raw, bounds)) {
|
|
268
|
+
this.#lastRejected.delete(name);
|
|
269
|
+
return resolved;
|
|
270
|
+
}
|
|
271
|
+
const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
|
|
272
|
+
const literal = owner.element.getAttribute(attribute);
|
|
273
|
+
if (literal === null) {
|
|
274
|
+
this.#lastRejected.delete(name);
|
|
275
|
+
return resolved;
|
|
276
|
+
}
|
|
277
|
+
if (this.#lastRejected.get(name) !== literal) {
|
|
278
|
+
this.#lastRejected.set(name, literal);
|
|
279
|
+
console.warn(
|
|
280
|
+
`Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
return resolved;
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
var BulkSelectController = class _BulkSelectController extends Controller {
|
|
288
|
+
#numbers = new NumberValueReader();
|
|
57
289
|
static targets = ["all", "item", "bar", "count", "selectAllPages"];
|
|
58
290
|
static values = {
|
|
59
291
|
totalCount: { type: Number, default: 0 },
|
|
60
292
|
announceText: { type: String, default: "" }
|
|
61
293
|
};
|
|
294
|
+
static valueConstraints = {
|
|
295
|
+
totalCount: NUMBER_BOUNDS.nonNegative
|
|
296
|
+
};
|
|
62
297
|
static actions = ["clear", "selectAllPages"];
|
|
63
298
|
static events = ["change", "reconcile"];
|
|
64
|
-
/** All-pages mode is a transient UI state, mirrored to `data-all-pages` so a
|
|
65
|
-
* `connect()` over markup that already carries the attribute rehydrates the
|
|
66
|
-
* mode — a morph, a Turbo Stream, a server that renders it back, or a restore
|
|
67
|
-
* visit, whose cached snapshot carries the attribute too. */
|
|
68
299
|
#allPagesMode = false;
|
|
69
|
-
/** Last emitted figures, so a recompute reports only on a real change. */
|
|
70
300
|
#lastCount = -1;
|
|
71
301
|
#lastAllPages = false;
|
|
72
|
-
|
|
73
|
-
#
|
|
74
|
-
/** Delegated `change` handler covering the select-all box and every row. */
|
|
302
|
+
#reconcile = new MorphRenderWatcher(() => this.#reconcileNow());
|
|
303
|
+
#barHidden = new AttributeLease("hidden", this.identifier);
|
|
75
304
|
#onChange = (event) => {
|
|
76
305
|
const target = event.target;
|
|
77
306
|
if (!target) return;
|
|
@@ -82,41 +311,48 @@ var BulkSelectController = class extends Controller {
|
|
|
82
311
|
this.#reportChange(this.#recompute());
|
|
83
312
|
}
|
|
84
313
|
};
|
|
314
|
+
#listeners = new ListenerSet();
|
|
85
315
|
connect() {
|
|
86
316
|
this.#allPagesMode = this.element.dataset.allPages === "true";
|
|
87
|
-
this.#reconcile.
|
|
88
|
-
this.element
|
|
317
|
+
this.#reconcile.observe(this.element);
|
|
318
|
+
this.#listeners.add(this.element, "change", this.#onChange);
|
|
89
319
|
this.#recompute();
|
|
90
320
|
}
|
|
91
321
|
disconnect() {
|
|
92
|
-
this.
|
|
93
|
-
this.#reconcile.
|
|
322
|
+
this.#listeners.dispose();
|
|
323
|
+
this.#reconcile.disconnect();
|
|
94
324
|
}
|
|
95
|
-
/** Repairs the figures for a row that arrived at runtime. */
|
|
96
325
|
itemTargetConnected() {
|
|
97
326
|
this.#reconcile.schedule();
|
|
98
327
|
}
|
|
99
|
-
/** Repairs the figures after a row leaves, so a removed selection stops counting. */
|
|
100
328
|
itemTargetDisconnected() {
|
|
101
329
|
this.#reconcile.schedule();
|
|
102
330
|
}
|
|
103
|
-
/** Reflects the current selection onto a select-all box added at runtime. */
|
|
104
331
|
allTargetConnected() {
|
|
105
332
|
this.#reconcile.schedule();
|
|
106
333
|
}
|
|
107
|
-
/** Repairs the figures after the select-all box leaves. */
|
|
108
334
|
allTargetDisconnected() {
|
|
109
335
|
this.#reconcile.schedule();
|
|
110
336
|
}
|
|
111
|
-
|
|
337
|
+
barTargetConnected() {
|
|
338
|
+
this.#reconcile.schedule();
|
|
339
|
+
}
|
|
340
|
+
barTargetDisconnected(bar) {
|
|
341
|
+
if (!this.barTargets.includes(bar)) this.#barHidden.return(bar);
|
|
342
|
+
this.#reconcile.schedule();
|
|
343
|
+
}
|
|
344
|
+
countTargetConnected() {
|
|
345
|
+
this.#reconcile.schedule();
|
|
346
|
+
}
|
|
347
|
+
countTargetDisconnected() {
|
|
348
|
+
this.#reconcile.schedule();
|
|
349
|
+
}
|
|
112
350
|
totalCountValueChanged() {
|
|
113
351
|
this.#reconcile.schedule();
|
|
114
352
|
}
|
|
115
|
-
/** Repaints so wording changed at runtime is used by the next announcement. */
|
|
116
353
|
announceTextValueChanged() {
|
|
117
354
|
this.#reconcile.schedule();
|
|
118
355
|
}
|
|
119
|
-
/** Clears every selection (rows + select-all) and exits all-pages mode. */
|
|
120
356
|
clear() {
|
|
121
357
|
for (const item of this.itemTargets) item.checked = false;
|
|
122
358
|
if (this.hasAllTarget) {
|
|
@@ -126,23 +362,14 @@ var BulkSelectController = class extends Controller {
|
|
|
126
362
|
this.#exitAllPages();
|
|
127
363
|
this.#reportChange(this.#recompute());
|
|
128
364
|
}
|
|
129
|
-
/**
|
|
130
|
-
* Enters "select all across pages" mode: the count shows `totalCount`, and every
|
|
131
|
-
* row on this page is checked.
|
|
132
|
-
*
|
|
133
|
-
* The mode's claim is that the whole set is selected, so leaving a visible row
|
|
134
|
-
* unchecked would put the page and the count in open disagreement.
|
|
135
|
-
*/
|
|
136
365
|
selectAllPages() {
|
|
137
366
|
this.#allPagesMode = true;
|
|
138
367
|
this.#checkEveryRow();
|
|
139
368
|
this.#reportChange(this.#recompute());
|
|
140
369
|
}
|
|
141
|
-
/** Marks every row on this page selected. */
|
|
142
370
|
#checkEveryRow() {
|
|
143
371
|
for (const item of this.itemTargets) item.checked = true;
|
|
144
372
|
}
|
|
145
|
-
/** Mirrors the select-all box to every row, then recomputes. */
|
|
146
373
|
#applyAll() {
|
|
147
374
|
if (!this.hasAllTarget) return;
|
|
148
375
|
const { checked } = this.allTarget;
|
|
@@ -153,7 +380,6 @@ var BulkSelectController = class extends Controller {
|
|
|
153
380
|
#exitAllPages() {
|
|
154
381
|
this.#allPagesMode = false;
|
|
155
382
|
}
|
|
156
|
-
/** Repairs the derived state after the page moved rows or a render input. */
|
|
157
383
|
#reconcileNow() {
|
|
158
384
|
if (this.#allPagesMode) this.#checkEveryRow();
|
|
159
385
|
const detail = this.#recompute();
|
|
@@ -161,28 +387,18 @@ var BulkSelectController = class extends Controller {
|
|
|
161
387
|
this.dispatch("reconcile", { detail });
|
|
162
388
|
this.#announce(detail);
|
|
163
389
|
}
|
|
164
|
-
/** Reports a selection the user moved. */
|
|
165
390
|
#reportChange(detail) {
|
|
166
391
|
if (!detail) return;
|
|
167
392
|
this.dispatch("change", { detail });
|
|
168
393
|
this.#announce(detail);
|
|
169
394
|
}
|
|
170
|
-
/** Hands the count to the shared announcer, worded by the consumer. */
|
|
171
395
|
#announce(detail) {
|
|
172
396
|
announce(fillTemplate(this.announceTextValue, { count: detail.count }));
|
|
173
397
|
}
|
|
174
|
-
/** The declared `totalCount`, or the default `0` in place of a non-finite one. */
|
|
175
398
|
get #totalCount() {
|
|
176
|
-
const declared = this
|
|
177
|
-
return
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Recomputes the count, the select-all checked/indeterminate state, and the bar
|
|
181
|
-
* visibility from the current DOM. Returns the figures when the emitted count or
|
|
182
|
-
* all-pages flag actually moved, and `null` when they did not.
|
|
183
|
-
*
|
|
184
|
-
* @stimeoRenderRoot
|
|
185
|
-
*/
|
|
399
|
+
const declared = this.#safeTotalCount;
|
|
400
|
+
return declared;
|
|
401
|
+
}
|
|
186
402
|
#recompute() {
|
|
187
403
|
const items = this.itemTargets;
|
|
188
404
|
const total = items.length;
|
|
@@ -198,7 +414,7 @@ var BulkSelectController = class extends Controller {
|
|
|
198
414
|
if (!show && this.hasAllTarget && this.barTarget.contains(document.activeElement)) {
|
|
199
415
|
this.allTarget.focus();
|
|
200
416
|
}
|
|
201
|
-
this.barTarget
|
|
417
|
+
this.#barHidden.write(this.barTarget, show ? null : "");
|
|
202
418
|
}
|
|
203
419
|
if (this.hasCountTarget) this.countTarget.textContent = String(count);
|
|
204
420
|
this.element.setAttribute("data-selected-count", String(checked));
|
|
@@ -209,8 +425,16 @@ var BulkSelectController = class extends Controller {
|
|
|
209
425
|
this.#lastAllPages = allPages;
|
|
210
426
|
return changed ? { count, allPages } : null;
|
|
211
427
|
}
|
|
428
|
+
get #safeTotalCount() {
|
|
429
|
+
return this.#numbers.read(
|
|
430
|
+
this,
|
|
431
|
+
"totalCount",
|
|
432
|
+
this.totalCountValue,
|
|
433
|
+
_BulkSelectController.values.totalCount.default,
|
|
434
|
+
_BulkSelectController.valueConstraints.totalCount
|
|
435
|
+
);
|
|
436
|
+
}
|
|
212
437
|
};
|
|
213
438
|
|
|
214
439
|
export { BulkSelectController };
|
|
215
|
-
//# sourceMappingURL=bulk_select_controller.js.map
|
|
216
440
|
//# sourceMappingURL=bulk_select_controller.js.map
|