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,128 +1,285 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
function setAttributeIfChanged(element, name, value, beforeWrite) {
|
|
4
|
+
if (element.getAttribute(name) === value) return false;
|
|
5
|
+
if (value === null) element.removeAttribute(name);
|
|
6
|
+
else element.setAttribute(name, value);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function sharedRegistry(key, create) {
|
|
11
|
+
const symbol = Symbol.for(key);
|
|
12
|
+
const scope = globalThis;
|
|
13
|
+
const existing = scope[symbol];
|
|
14
|
+
if (existing !== void 0) return existing;
|
|
15
|
+
const registry2 = create();
|
|
16
|
+
Object.defineProperty(globalThis, symbol, { value: registry2 });
|
|
17
|
+
return registry2;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var registry = sharedRegistry(
|
|
21
|
+
"stimeo-ui.attribute-lease.registry.v1",
|
|
22
|
+
() => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
|
|
23
|
+
);
|
|
24
|
+
function isAttributeValue(value) {
|
|
25
|
+
return value === null || typeof value === "string";
|
|
26
|
+
}
|
|
27
|
+
function readLeaseRecord(element, record) {
|
|
28
|
+
try {
|
|
29
|
+
const parsed = JSON.parse(element.getAttribute(record) ?? "null");
|
|
30
|
+
if (!Array.isArray(parsed)) return void 0;
|
|
31
|
+
const [original, written, ...rest] = parsed;
|
|
32
|
+
const linked = rest[0] !== false;
|
|
33
|
+
const beneath = linked ? rest : rest.slice(1);
|
|
34
|
+
if (!beneath.every((under) => typeof under === "string")) return void 0;
|
|
35
|
+
return isAttributeValue(original) && isAttributeValue(written) ? { original, written, linked, beneath } : void 0;
|
|
36
|
+
} catch {
|
|
37
|
+
return void 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function attributeStack(element, attribute) {
|
|
41
|
+
const byAttribute = registry.stacks.get(element) ?? /* @__PURE__ */ new Map();
|
|
42
|
+
registry.stacks.set(element, byAttribute);
|
|
43
|
+
const known = byAttribute.get(attribute);
|
|
44
|
+
if (known) return known;
|
|
45
|
+
const found = [];
|
|
46
|
+
for (const record of registry.names.get(attribute) ?? []) {
|
|
47
|
+
const read = readLeaseRecord(element, record);
|
|
48
|
+
if (read) found.push({ ...read, record });
|
|
49
|
+
}
|
|
50
|
+
const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
|
|
51
|
+
const stack = found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
|
|
52
|
+
lease: null,
|
|
53
|
+
record,
|
|
54
|
+
written,
|
|
55
|
+
original,
|
|
56
|
+
linked: linked && index > 0
|
|
57
|
+
}));
|
|
58
|
+
byAttribute.set(attribute, stack);
|
|
59
|
+
return stack;
|
|
60
|
+
}
|
|
61
|
+
function findHold(stack, lease, record) {
|
|
62
|
+
return stack.find((held) => held.lease === lease) ?? stack.find((held) => held.lease === null && held.record === record);
|
|
63
|
+
}
|
|
64
|
+
var AttributeLease = class {
|
|
65
|
+
#attribute;
|
|
66
|
+
#record;
|
|
67
|
+
#base;
|
|
68
|
+
#preserveAuthor;
|
|
69
|
+
#held = /* @__PURE__ */ new Set();
|
|
70
|
+
constructor(attribute, owner, options = {}) {
|
|
71
|
+
this.#attribute = attribute;
|
|
72
|
+
this.#record = `data-${owner}-${attribute}-lease`;
|
|
73
|
+
this.#base = options.base === true;
|
|
74
|
+
this.#preserveAuthor = options.preserveAuthor === true;
|
|
75
|
+
const names = registry.names;
|
|
76
|
+
names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
|
|
77
|
+
}
|
|
78
|
+
write(element, value) {
|
|
79
|
+
const stack = attributeStack(element, this.#attribute);
|
|
80
|
+
const hold = this.#take(stack) ?? this.#acquire(element, stack);
|
|
81
|
+
this.#held.add(element);
|
|
82
|
+
const shows = !this.#covered(element, stack, hold);
|
|
83
|
+
hold.written = value;
|
|
84
|
+
this.#mark(element, stack);
|
|
85
|
+
if (shows) this.#reflect(element, value);
|
|
86
|
+
}
|
|
87
|
+
return(element) {
|
|
88
|
+
const held = this.#held.delete(element);
|
|
89
|
+
const known = registry.stacks.get(element)?.has(this.#attribute);
|
|
90
|
+
const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
|
|
91
|
+
const hold = this.#take(stack);
|
|
92
|
+
if (!hold) return false;
|
|
93
|
+
const carries = element.getAttribute(this.#attribute) === hold.written;
|
|
94
|
+
const owns = carries && !this.#covered(element, stack, hold);
|
|
95
|
+
const index = stack.indexOf(hold);
|
|
96
|
+
stack.splice(index, 1);
|
|
97
|
+
const above = stack[index];
|
|
98
|
+
if (above) above.linked &&= hold.linked;
|
|
99
|
+
this.#mark(element, stack);
|
|
100
|
+
if (!owns) return true;
|
|
101
|
+
const below = hold.linked ? stack[index - 1] : void 0;
|
|
102
|
+
this.#reflect(element, below ? below.written : hold.original);
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
returnAll() {
|
|
106
|
+
for (const element of Array.from(this.#held)) this.return(element);
|
|
107
|
+
}
|
|
108
|
+
#take(stack) {
|
|
109
|
+
const hold = findHold(stack, this, this.#record);
|
|
110
|
+
if (hold) hold.lease = this;
|
|
111
|
+
return hold;
|
|
112
|
+
}
|
|
113
|
+
#acquire(element, stack) {
|
|
114
|
+
const current = element.getAttribute(this.#attribute);
|
|
115
|
+
const top = stack.at(-1);
|
|
116
|
+
const bottom = stack[0];
|
|
117
|
+
const over = top?.written === current ? top : void 0;
|
|
118
|
+
const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
|
|
119
|
+
const hold = {
|
|
120
|
+
lease: this,
|
|
121
|
+
record: this.#record,
|
|
122
|
+
written: current,
|
|
123
|
+
original: from ? from.original : current,
|
|
124
|
+
linked: !this.#base && over !== void 0
|
|
125
|
+
};
|
|
126
|
+
if (this.#base && bottom) {
|
|
127
|
+
bottom.linked = true;
|
|
128
|
+
stack.unshift(hold);
|
|
129
|
+
} else stack.push(hold);
|
|
130
|
+
return hold;
|
|
131
|
+
}
|
|
132
|
+
#covered(element, stack, hold) {
|
|
133
|
+
const current = element.getAttribute(this.#attribute);
|
|
134
|
+
return stack.slice(stack.indexOf(hold) + 1).some((above) => above.written === current);
|
|
135
|
+
}
|
|
136
|
+
#mark(element, stack) {
|
|
137
|
+
const records = /* @__PURE__ */ new Map([[this.#record, null]]);
|
|
138
|
+
stack.forEach((hold, index) => {
|
|
139
|
+
const names = stack.slice(0, index).map((under) => under.record);
|
|
140
|
+
const beneath = [...new Set(names.reverse())].filter((name) => name !== hold.record);
|
|
141
|
+
const marker = hold.linked || beneath.length === 0 ? [] : [false];
|
|
142
|
+
records.set(
|
|
143
|
+
hold.record,
|
|
144
|
+
hold.written === hold.original && beneath.length === 0 && index === stack.length - 1 ? null : JSON.stringify([hold.original, hold.written, ...marker, ...beneath])
|
|
145
|
+
);
|
|
146
|
+
});
|
|
147
|
+
for (const [name, recorded] of records) {
|
|
148
|
+
setAttributeIfChanged(element, name, recorded);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
#reflect(element, value) {
|
|
152
|
+
setAttributeIfChanged(element, this.#attribute, value);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
4
155
|
|
|
5
|
-
// src/utils/escape_layer.ts
|
|
6
156
|
var EscapeLayer = class _EscapeLayer {
|
|
7
|
-
static #registries =
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
#claims = null;
|
|
13
|
-
/**
|
|
14
|
-
* Activates this layer at the top of its document's Escape stack, installing
|
|
15
|
-
* the document's shared resolver listener if this is its first layer.
|
|
16
|
-
* Re-activating an already-active layer moves it to the top.
|
|
17
|
-
*/
|
|
157
|
+
static #registries = sharedRegistry(
|
|
158
|
+
"stimeo-ui.escape-layer.registry.v1",
|
|
159
|
+
() => /* @__PURE__ */ new WeakMap()
|
|
160
|
+
);
|
|
161
|
+
#active = null;
|
|
18
162
|
activate(ownerDocument = document, options) {
|
|
19
163
|
this.deactivate();
|
|
20
|
-
let
|
|
21
|
-
if (!
|
|
22
|
-
|
|
23
|
-
_EscapeLayer.#registries.set(ownerDocument,
|
|
24
|
-
ownerDocument.addEventListener("keydown",
|
|
164
|
+
let registry2 = _EscapeLayer.#registries.get(ownerDocument);
|
|
165
|
+
if (!registry2) {
|
|
166
|
+
registry2 = _EscapeLayer.#createRegistry();
|
|
167
|
+
_EscapeLayer.#registries.set(ownerDocument, registry2);
|
|
168
|
+
ownerDocument.addEventListener("keydown", registry2.onKeydown);
|
|
25
169
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this.#
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Removes this layer from its document's Escape stack, uninstalling the
|
|
33
|
-
* shared listener when the stack empties. Safe to call when inactive.
|
|
34
|
-
*/
|
|
170
|
+
const entry = { onDismiss: options.onDismiss, claims: options.claims ?? null };
|
|
171
|
+
registry2.stack.push(entry);
|
|
172
|
+
this.#active = { document: ownerDocument, entry };
|
|
173
|
+
}
|
|
35
174
|
deactivate() {
|
|
36
|
-
const
|
|
37
|
-
if (!
|
|
38
|
-
const
|
|
39
|
-
if (
|
|
40
|
-
const index =
|
|
41
|
-
if (index >= 0)
|
|
42
|
-
if (
|
|
43
|
-
|
|
44
|
-
_EscapeLayer.#registries.delete(
|
|
175
|
+
const active = this.#active;
|
|
176
|
+
if (!active) return;
|
|
177
|
+
const registry2 = _EscapeLayer.#registries.get(active.document);
|
|
178
|
+
if (registry2) {
|
|
179
|
+
const index = registry2.stack.lastIndexOf(active.entry);
|
|
180
|
+
if (index >= 0) registry2.stack.splice(index, 1);
|
|
181
|
+
if (registry2.stack.length === 0) {
|
|
182
|
+
active.document.removeEventListener("keydown", registry2.onKeydown);
|
|
183
|
+
_EscapeLayer.#registries.delete(active.document);
|
|
45
184
|
}
|
|
46
185
|
}
|
|
47
|
-
this.#
|
|
48
|
-
|
|
49
|
-
this.#claims = null;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Whether this active layer would own a press right now: it is the topmost
|
|
53
|
-
* layer whose {@link EscapeLayerOptions.claims} passes. Exposed for tests
|
|
54
|
-
* and diagnostics — production dismissal goes through the shared listener.
|
|
55
|
-
*/
|
|
186
|
+
this.#active = null;
|
|
187
|
+
}
|
|
56
188
|
get ownsEscape() {
|
|
57
|
-
const
|
|
58
|
-
if (!
|
|
59
|
-
const
|
|
60
|
-
if (!
|
|
61
|
-
return _EscapeLayer.#resolveOwner(
|
|
189
|
+
const active = this.#active;
|
|
190
|
+
if (!active) return false;
|
|
191
|
+
const registry2 = _EscapeLayer.#registries.get(active.document);
|
|
192
|
+
if (!registry2) return false;
|
|
193
|
+
return _EscapeLayer.#resolveOwner(registry2.stack) === active.entry;
|
|
62
194
|
}
|
|
63
|
-
/** Builds a document's registry with its shared resolver listener. */
|
|
64
195
|
static #createRegistry() {
|
|
65
|
-
const
|
|
196
|
+
const registry2 = {
|
|
66
197
|
stack: [],
|
|
67
198
|
onKeydown: (event) => {
|
|
68
199
|
if (event.key !== "Escape" || event.defaultPrevented || event.isComposing) return;
|
|
69
|
-
const owner = _EscapeLayer.#resolveOwner(
|
|
200
|
+
const owner = _EscapeLayer.#resolveOwner(registry2.stack);
|
|
70
201
|
if (!owner) return;
|
|
71
202
|
event.preventDefault();
|
|
72
|
-
owner
|
|
203
|
+
owner.onDismiss();
|
|
73
204
|
}
|
|
74
205
|
};
|
|
75
|
-
return
|
|
206
|
+
return registry2;
|
|
76
207
|
}
|
|
77
|
-
/** The topmost stack layer whose claims predicate passes, or `null`. */
|
|
78
208
|
static #resolveOwner(stack) {
|
|
79
209
|
for (let index = stack.length - 1; index >= 0; index--) {
|
|
80
210
|
const layer = stack[index];
|
|
81
211
|
if (!layer) continue;
|
|
82
|
-
if (layer
|
|
212
|
+
if (layer.claims && !layer.claims()) continue;
|
|
83
213
|
return layer;
|
|
84
214
|
}
|
|
85
215
|
return null;
|
|
86
216
|
}
|
|
87
217
|
};
|
|
88
218
|
|
|
89
|
-
|
|
219
|
+
var MAX_TIMER_DELAY_MS = 2147483647;
|
|
220
|
+
|
|
221
|
+
var NUMBER_BOUNDS = {
|
|
222
|
+
timer: { finite: true, min: 0, max: MAX_TIMER_DELAY_MS }};
|
|
223
|
+
function matchesNumberBounds(value, bounds) {
|
|
224
|
+
if (!Number.isFinite(value)) {
|
|
225
|
+
const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
|
|
226
|
+
if (direction === null) return false;
|
|
227
|
+
if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
|
|
228
|
+
}
|
|
229
|
+
if (bounds.min !== void 0 && value < bounds.min) return false;
|
|
230
|
+
if (bounds.max !== void 0 && value > bounds.max) return false;
|
|
231
|
+
if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
|
|
232
|
+
if (bounds.integer && !Number.isInteger(value)) return false;
|
|
233
|
+
if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function readNumber(raw, fallback, bounds) {
|
|
238
|
+
return matchesNumberBounds(raw, bounds) ? raw : fallback;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
var NumberValueReader = class {
|
|
242
|
+
#lastRejected = /* @__PURE__ */ new Map();
|
|
243
|
+
read(owner, name, raw, fallback, bounds) {
|
|
244
|
+
const resolved = readNumber(raw, fallback, bounds);
|
|
245
|
+
if (matchesNumberBounds(raw, bounds)) {
|
|
246
|
+
this.#lastRejected.delete(name);
|
|
247
|
+
return resolved;
|
|
248
|
+
}
|
|
249
|
+
const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
|
|
250
|
+
const literal = owner.element.getAttribute(attribute);
|
|
251
|
+
if (literal === null) {
|
|
252
|
+
this.#lastRejected.delete(name);
|
|
253
|
+
return resolved;
|
|
254
|
+
}
|
|
255
|
+
if (this.#lastRejected.get(name) !== literal) {
|
|
256
|
+
this.#lastRejected.set(name, literal);
|
|
257
|
+
console.warn(
|
|
258
|
+
`Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
return resolved;
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
|
|
90
265
|
var TimerRegistry = class {
|
|
91
|
-
/** Live timer ids that have not yet been cleared (or, for timeouts, fired). */
|
|
92
266
|
ids = /* @__PURE__ */ new Set();
|
|
93
|
-
/**
|
|
94
|
-
* Cancels a single tracked timer.
|
|
95
|
-
*
|
|
96
|
-
* No-ops if the id is unknown (already cleared, fired, or never owned by this
|
|
97
|
-
* registry), so callers can clear defensively without guarding.
|
|
98
|
-
*/
|
|
99
267
|
clear(id) {
|
|
100
268
|
if (this.ids.delete(id)) {
|
|
101
269
|
this.cancel(id);
|
|
102
270
|
}
|
|
103
271
|
}
|
|
104
|
-
/**
|
|
105
|
-
* Cancels every tracked timer. Call this from a controller's `disconnect()`
|
|
106
|
-
* to guarantee no timer outlives the element.
|
|
107
|
-
*/
|
|
108
272
|
clearAll() {
|
|
109
273
|
for (const id of this.ids) {
|
|
110
274
|
this.cancel(id);
|
|
111
275
|
}
|
|
112
276
|
this.ids.clear();
|
|
113
277
|
}
|
|
114
|
-
/** Number of timers currently tracked (pending). */
|
|
115
278
|
get size() {
|
|
116
279
|
return this.ids.size;
|
|
117
280
|
}
|
|
118
281
|
};
|
|
119
282
|
var SafeTimeout = class extends TimerRegistry {
|
|
120
|
-
/**
|
|
121
|
-
* Schedules `callback` after `delay` ms and returns the timer id.
|
|
122
|
-
*
|
|
123
|
-
* The id is removed from the registry automatically when the timeout fires,
|
|
124
|
-
* so {@link TimerRegistry.size | size} reflects only still-pending timers.
|
|
125
|
-
*/
|
|
126
283
|
set(callback, delay) {
|
|
127
284
|
const id = this.schedule(() => {
|
|
128
285
|
this.ids.delete(id);
|
|
@@ -139,7 +296,6 @@ var SafeTimeout = class extends TimerRegistry {
|
|
|
139
296
|
}
|
|
140
297
|
};
|
|
141
298
|
|
|
142
|
-
// src/utils/scroll_dismiss.ts
|
|
143
299
|
function observeScrollDismiss(element, onScroll) {
|
|
144
300
|
const targets = [...scrollParents(element), window];
|
|
145
301
|
const handler = () => onScroll();
|
|
@@ -164,7 +320,6 @@ function isScrollable(element) {
|
|
|
164
320
|
return /auto|scroll|overlay/.test(style.overflow + style.overflowX + style.overflowY);
|
|
165
321
|
}
|
|
166
322
|
|
|
167
|
-
// src/utils/state_reason.ts
|
|
168
323
|
var FOCUS_EVENTS = /* @__PURE__ */ new Set(["blur", "focus", "focusin", "focusout"]);
|
|
169
324
|
var POINTER_EVENTS = /* @__PURE__ */ new Set(["mouseenter", "mouseleave", "pointerenter", "pointerleave"]);
|
|
170
325
|
function stateReasonFor(event) {
|
|
@@ -174,129 +329,171 @@ function stateReasonFor(event) {
|
|
|
174
329
|
return "user";
|
|
175
330
|
}
|
|
176
331
|
|
|
177
|
-
|
|
178
|
-
|
|
332
|
+
var HoverCardController = class _HoverCardController extends Controller {
|
|
333
|
+
#numbers = new NumberValueReader();
|
|
179
334
|
static targets = ["trigger", "card"];
|
|
180
335
|
static values = {
|
|
181
336
|
openDelay: { type: Number, default: 300 },
|
|
182
337
|
closeDelay: { type: Number, default: 200 },
|
|
183
338
|
closeOnScroll: { type: Boolean, default: false }
|
|
184
339
|
};
|
|
340
|
+
static valueConstraints = {
|
|
341
|
+
openDelay: NUMBER_BOUNDS.timer,
|
|
342
|
+
closeDelay: NUMBER_BOUNDS.timer
|
|
343
|
+
};
|
|
185
344
|
static actions = ["close", "open"];
|
|
186
345
|
static events = ["close", "open"];
|
|
187
|
-
/** Pending open/close timers, with their IDs reset on every lifecycle boundary. */
|
|
188
346
|
#timers = new SafeTimeout();
|
|
189
|
-
/** Escape-stack membership while open; the shared resolver dismisses via it. */
|
|
190
347
|
#escapeLayer = new EscapeLayer();
|
|
348
|
+
#expanded = new AttributeLease("aria-expanded", this.identifier);
|
|
191
349
|
#pendingOpen = null;
|
|
192
350
|
#pendingClose = null;
|
|
193
|
-
/** Cleanup for the dismiss-on-scroll listeners while open, or `null`. */
|
|
194
351
|
#stopScrollDismiss = null;
|
|
195
|
-
|
|
352
|
+
#shownCard = null;
|
|
353
|
+
#connected = false;
|
|
196
354
|
#reporting = false;
|
|
197
|
-
/** Starts closed and discards any stale pending state from a prior connection. */
|
|
198
355
|
connect() {
|
|
199
|
-
this.#
|
|
200
|
-
this.#cancelClose();
|
|
356
|
+
this.#cancelTimers();
|
|
201
357
|
this.#conceal("api");
|
|
358
|
+
this.#connected = true;
|
|
202
359
|
this.#reporting = true;
|
|
203
360
|
}
|
|
204
|
-
/** Clears timers, the Escape-stack membership, and scroll listeners so nothing outlives the element. */
|
|
205
361
|
disconnect() {
|
|
362
|
+
this.#connected = false;
|
|
206
363
|
this.#reporting = false;
|
|
207
|
-
this.#
|
|
208
|
-
this.#
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
this.#
|
|
364
|
+
this.#cancelTimers();
|
|
365
|
+
this.#release();
|
|
366
|
+
}
|
|
367
|
+
closeOnScrollValueChanged() {
|
|
368
|
+
if (this.#shownCard) this.#syncScrollDismiss();
|
|
369
|
+
}
|
|
370
|
+
cardTargetDisconnected(card) {
|
|
371
|
+
if (card !== this.#shownCard) return;
|
|
372
|
+
if (this.cardTargets.includes(card)) return;
|
|
373
|
+
this.#cancelTimers();
|
|
374
|
+
this.#release();
|
|
375
|
+
card.hidden = true;
|
|
376
|
+
card.setAttribute("data-state", "closed");
|
|
377
|
+
this.#reflectClosed();
|
|
378
|
+
}
|
|
379
|
+
triggerTargetConnected() {
|
|
380
|
+
if (this.#connected) this.#reflectTrigger();
|
|
381
|
+
}
|
|
382
|
+
triggerTargetDisconnected(trigger) {
|
|
383
|
+
if (!this.triggerTargets.includes(trigger)) this.#expanded.return(trigger);
|
|
384
|
+
if (this.#connected) this.#reflectTrigger();
|
|
212
385
|
}
|
|
213
|
-
/** Opens the card, after `openDelay` ms (or immediately at 0). Cancels a pending close. */
|
|
214
386
|
open(event) {
|
|
215
387
|
const reason = stateReasonFor(event);
|
|
216
388
|
this.#cancelClose();
|
|
217
389
|
if (this.#isOpen || this.#pendingOpen !== null) return;
|
|
218
|
-
if (this
|
|
390
|
+
if (this.#safeOpenDelay <= 0) {
|
|
219
391
|
this.#reveal(reason);
|
|
220
392
|
return;
|
|
221
393
|
}
|
|
222
394
|
this.#pendingOpen = this.#timers.set(() => {
|
|
223
395
|
this.#pendingOpen = null;
|
|
224
396
|
this.#reveal(reason);
|
|
225
|
-
}, this
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Schedules the card to close after `closeDelay`. Cancels a pending open. The
|
|
229
|
-
* delayed callback re-checks whether focus has landed inside the controller
|
|
230
|
-
* (e.g. a link in the card) and, if so, aborts the close — covering keyboard
|
|
231
|
-
* traversal that the pointer-only hoverable bridge cannot.
|
|
232
|
-
*/
|
|
397
|
+
}, this.#safeOpenDelay);
|
|
398
|
+
}
|
|
233
399
|
close(event) {
|
|
234
400
|
const reason = stateReasonFor(event);
|
|
235
401
|
this.#cancelOpen();
|
|
236
|
-
if (!this.#
|
|
402
|
+
if (!this.#closable || this.#pendingClose !== null) return;
|
|
237
403
|
this.#pendingClose = this.#timers.set(() => {
|
|
238
404
|
this.#pendingClose = null;
|
|
239
405
|
if (this.element.contains(document.activeElement)) return;
|
|
240
406
|
this.#conceal(reason);
|
|
241
|
-
}, this
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Reveals the card, reflects state, reports a move, and joins the Escape stack.
|
|
245
|
-
*
|
|
246
|
-
* @stimeoRuntimeOnly `closeOnScroll` decides whether this reveal wires the scroll dismissal; what
|
|
247
|
-
* is shown does not depend on it.
|
|
248
|
-
*/
|
|
407
|
+
}, this.#safeCloseDelay);
|
|
408
|
+
}
|
|
249
409
|
#reveal(reason) {
|
|
250
410
|
if (!this.hasCardTarget) return;
|
|
411
|
+
const card = this.cardTarget;
|
|
251
412
|
const was = this.#isOpen;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
if (this.hasTriggerTarget) this.triggerTarget
|
|
413
|
+
card.hidden = false;
|
|
414
|
+
card.setAttribute("data-state", "open");
|
|
415
|
+
if (this.hasTriggerTarget) this.#expanded.write(this.triggerTarget, "true");
|
|
416
|
+
this.#shownCard = card;
|
|
255
417
|
if (!was && this.#reporting) this.dispatch("open", { detail: { reason }, cancelable: false });
|
|
418
|
+
if (this.#shownCard !== card) return;
|
|
256
419
|
this.#escapeLayer.activate(document, { onDismiss: () => this.#dismiss("escape") });
|
|
257
|
-
|
|
258
|
-
this.#stopScrollDismiss = observeScrollDismiss(this.element, () => this.#dismiss("scroll"));
|
|
259
|
-
}
|
|
420
|
+
this.#syncScrollDismiss();
|
|
260
421
|
}
|
|
261
|
-
/** Hides the card, reflects state, reports a move, and leaves the Escape stack. */
|
|
262
422
|
#conceal(reason) {
|
|
263
423
|
const was = this.#isOpen;
|
|
264
|
-
this.#
|
|
265
|
-
this.#
|
|
266
|
-
this.#
|
|
424
|
+
this.#release();
|
|
425
|
+
this.#reflectClosed();
|
|
426
|
+
if (was && this.#reporting) this.dispatch("close", { detail: { reason }, cancelable: false });
|
|
427
|
+
}
|
|
428
|
+
#reflectClosed() {
|
|
267
429
|
if (this.hasCardTarget) {
|
|
268
430
|
this.cardTarget.hidden = true;
|
|
269
431
|
this.cardTarget.setAttribute("data-state", "closed");
|
|
270
432
|
}
|
|
271
|
-
if (this.hasTriggerTarget) this.triggerTarget
|
|
272
|
-
|
|
433
|
+
if (this.hasTriggerTarget) this.#expanded.write(this.triggerTarget, "false");
|
|
434
|
+
}
|
|
435
|
+
#reflectTrigger() {
|
|
436
|
+
if (this.hasTriggerTarget) this.#expanded.write(this.triggerTarget, String(this.#isOpen));
|
|
437
|
+
}
|
|
438
|
+
#release() {
|
|
439
|
+
this.#shownCard = null;
|
|
440
|
+
this.#escapeLayer.deactivate();
|
|
441
|
+
this.#stopScrollDismiss?.();
|
|
442
|
+
this.#stopScrollDismiss = null;
|
|
443
|
+
}
|
|
444
|
+
#syncScrollDismiss() {
|
|
445
|
+
if (this.closeOnScrollValue) {
|
|
446
|
+
this.#stopScrollDismiss ??= observeScrollDismiss(this.element, () => this.#dismiss("scroll"));
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
this.#stopScrollDismiss?.();
|
|
450
|
+
this.#stopScrollDismiss = null;
|
|
273
451
|
}
|
|
274
|
-
/** Cancels pending timers and conceals immediately (shared Escape path). */
|
|
275
452
|
#dismiss(reason) {
|
|
453
|
+
this.#cancelTimers();
|
|
454
|
+
this.#conceal(reason);
|
|
455
|
+
}
|
|
456
|
+
#cancelTimers() {
|
|
276
457
|
this.#cancelOpen();
|
|
277
458
|
this.#cancelClose();
|
|
278
|
-
this.#conceal(reason);
|
|
279
459
|
}
|
|
280
|
-
/** Cancels any pending open timer. */
|
|
281
460
|
#cancelOpen() {
|
|
282
461
|
if (this.#pendingOpen !== null) {
|
|
283
462
|
this.#timers.clear(this.#pendingOpen);
|
|
284
463
|
this.#pendingOpen = null;
|
|
285
464
|
}
|
|
286
465
|
}
|
|
287
|
-
/** Cancels any pending close timer. */
|
|
288
466
|
#cancelClose() {
|
|
289
467
|
if (this.#pendingClose !== null) {
|
|
290
468
|
this.#timers.clear(this.#pendingClose);
|
|
291
469
|
this.#pendingClose = null;
|
|
292
470
|
}
|
|
293
471
|
}
|
|
294
|
-
/** Whether the card is currently visible. */
|
|
295
472
|
get #isOpen() {
|
|
296
473
|
return this.hasCardTarget && !this.cardTarget.hidden;
|
|
297
474
|
}
|
|
475
|
+
get #closable() {
|
|
476
|
+
return this.#isOpen || this.#shownCard !== null;
|
|
477
|
+
}
|
|
478
|
+
get #safeOpenDelay() {
|
|
479
|
+
return this.#numbers.read(
|
|
480
|
+
this,
|
|
481
|
+
"openDelay",
|
|
482
|
+
this.openDelayValue,
|
|
483
|
+
_HoverCardController.values.openDelay.default,
|
|
484
|
+
_HoverCardController.valueConstraints.openDelay
|
|
485
|
+
);
|
|
486
|
+
}
|
|
487
|
+
get #safeCloseDelay() {
|
|
488
|
+
return this.#numbers.read(
|
|
489
|
+
this,
|
|
490
|
+
"closeDelay",
|
|
491
|
+
this.closeDelayValue,
|
|
492
|
+
_HoverCardController.values.closeDelay.default,
|
|
493
|
+
_HoverCardController.valueConstraints.closeDelay
|
|
494
|
+
);
|
|
495
|
+
}
|
|
298
496
|
};
|
|
299
497
|
|
|
300
498
|
export { HoverCardController };
|
|
301
|
-
//# sourceMappingURL=hover_card_controller.js.map
|
|
302
499
|
//# sourceMappingURL=hover_card_controller.js.map
|