stimeo-ui 0.17.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.
Files changed (297) hide show
  1. package/CHANGELOG.md +106 -1
  2. package/README.md +19 -10
  3. package/dist/cable/index.d.ts +9 -8
  4. package/dist/cable/index.js +22 -14
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/coerce-JtZVNG5h.d.ts +20 -0
  7. package/dist/controllers/accordion_controller.js +14 -6
  8. package/dist/controllers/accordion_controller.js.map +1 -1
  9. package/dist/controllers/alert_dialog_controller.js +145 -118
  10. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  11. package/dist/controllers/announcer_controller.d.ts +5 -3
  12. package/dist/controllers/announcer_controller.js +113 -17
  13. package/dist/controllers/announcer_controller.js.map +1 -1
  14. package/dist/controllers/auto_submit_controller.js +185 -60
  15. package/dist/controllers/auto_submit_controller.js.map +1 -1
  16. package/dist/controllers/avatar_controller.js +55 -43
  17. package/dist/controllers/avatar_controller.js.map +1 -1
  18. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  19. package/dist/controllers/bulk_select_controller.d.ts +3 -3
  20. package/dist/controllers/bulk_select_controller.js +64 -50
  21. package/dist/controllers/bulk_select_controller.js.map +1 -1
  22. package/dist/controllers/calendar_controller.d.ts +15 -12
  23. package/dist/controllers/calendar_controller.js +55 -53
  24. package/dist/controllers/calendar_controller.js.map +1 -1
  25. package/dist/controllers/carousel_controller.d.ts +9 -5
  26. package/dist/controllers/carousel_controller.js +124 -86
  27. package/dist/controllers/carousel_controller.js.map +1 -1
  28. package/dist/controllers/character_counter_controller.d.ts +27 -6
  29. package/dist/controllers/character_counter_controller.js +291 -95
  30. package/dist/controllers/character_counter_controller.js.map +1 -1
  31. package/dist/controllers/checkbox_controller.js +6 -0
  32. package/dist/controllers/checkbox_controller.js.map +1 -1
  33. package/dist/controllers/clipboard_controller.js +118 -27
  34. package/dist/controllers/clipboard_controller.js.map +1 -1
  35. package/dist/controllers/collapsible_controller.d.ts +1 -1
  36. package/dist/controllers/collapsible_controller.js +52 -49
  37. package/dist/controllers/collapsible_controller.js.map +1 -1
  38. package/dist/controllers/color_picker_controller.js +29 -7
  39. package/dist/controllers/color_picker_controller.js.map +1 -1
  40. package/dist/controllers/combobox_controller.d.ts +1 -1
  41. package/dist/controllers/combobox_controller.js +210 -71
  42. package/dist/controllers/combobox_controller.js.map +1 -1
  43. package/dist/controllers/command_palette_controller.d.ts +9 -9
  44. package/dist/controllers/command_palette_controller.js +289 -140
  45. package/dist/controllers/command_palette_controller.js.map +1 -1
  46. package/dist/controllers/conditional_fields_controller.js +145 -58
  47. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  48. package/dist/controllers/confirm_controller.js +145 -118
  49. package/dist/controllers/confirm_controller.js.map +1 -1
  50. package/dist/controllers/context_menu_controller.d.ts +49 -14
  51. package/dist/controllers/context_menu_controller.js +138 -73
  52. package/dist/controllers/context_menu_controller.js.map +1 -1
  53. package/dist/controllers/count_up_controller.js.map +1 -1
  54. package/dist/controllers/countdown_controller.d.ts +2 -2
  55. package/dist/controllers/countdown_controller.js +109 -21
  56. package/dist/controllers/countdown_controller.js.map +1 -1
  57. package/dist/controllers/currency_input_controller.d.ts +75 -11
  58. package/dist/controllers/currency_input_controller.js +446 -72
  59. package/dist/controllers/currency_input_controller.js.map +1 -1
  60. package/dist/controllers/data_grid_controller.d.ts +10 -8
  61. package/dist/controllers/data_grid_controller.js +134 -28
  62. package/dist/controllers/data_grid_controller.js.map +1 -1
  63. package/dist/controllers/date_range_picker_controller.d.ts +12 -9
  64. package/dist/controllers/date_range_picker_controller.js +93 -72
  65. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  66. package/dist/controllers/dialog_controller.d.ts +4 -5
  67. package/dist/controllers/dialog_controller.js +145 -118
  68. package/dist/controllers/dialog_controller.js.map +1 -1
  69. package/dist/controllers/direct_upload_controller.d.ts +1 -1
  70. package/dist/controllers/direct_upload_controller.js +24 -14
  71. package/dist/controllers/direct_upload_controller.js.map +1 -1
  72. package/dist/controllers/dirty_form_controller.d.ts +6 -1
  73. package/dist/controllers/dirty_form_controller.js +68 -31
  74. package/dist/controllers/dirty_form_controller.js.map +1 -1
  75. package/dist/controllers/dismissible_controller.js +64 -46
  76. package/dist/controllers/dismissible_controller.js.map +1 -1
  77. package/dist/controllers/drawer_controller.js +145 -118
  78. package/dist/controllers/drawer_controller.js.map +1 -1
  79. package/dist/controllers/dropdown_controller.js +76 -63
  80. package/dist/controllers/dropdown_controller.js.map +1 -1
  81. package/dist/controllers/editable_controller.js +199 -62
  82. package/dist/controllers/editable_controller.js.map +1 -1
  83. package/dist/controllers/empty_state_controller.js +13 -6
  84. package/dist/controllers/empty_state_controller.js.map +1 -1
  85. package/dist/controllers/file_dropzone_controller.d.ts +3 -0
  86. package/dist/controllers/file_dropzone_controller.js +55 -48
  87. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  88. package/dist/controllers/filter_controller.js +9 -2
  89. package/dist/controllers/filter_controller.js.map +1 -1
  90. package/dist/controllers/flash_controller.d.ts +4 -4
  91. package/dist/controllers/flash_controller.js +66 -33
  92. package/dist/controllers/flash_controller.js.map +1 -1
  93. package/dist/controllers/focus_controller.d.ts +3 -3
  94. package/dist/controllers/focus_controller.js +39 -14
  95. package/dist/controllers/focus_controller.js.map +1 -1
  96. package/dist/controllers/form_field_controller.js +52 -43
  97. package/dist/controllers/form_field_controller.js.map +1 -1
  98. package/dist/controllers/form_validation_controller.d.ts +3 -3
  99. package/dist/controllers/form_validation_controller.js +18 -11
  100. package/dist/controllers/form_validation_controller.js.map +1 -1
  101. package/dist/controllers/frame_loading_controller.d.ts +13 -12
  102. package/dist/controllers/frame_loading_controller.js +55 -48
  103. package/dist/controllers/frame_loading_controller.js.map +1 -1
  104. package/dist/controllers/highlight_controller.d.ts +5 -4
  105. package/dist/controllers/highlight_controller.js.map +1 -1
  106. package/dist/controllers/hover_card_controller.d.ts +4 -1
  107. package/dist/controllers/hover_card_controller.js +67 -61
  108. package/dist/controllers/hover_card_controller.js.map +1 -1
  109. package/dist/controllers/idle_controller.d.ts +6 -5
  110. package/dist/controllers/idle_controller.js +10 -6
  111. package/dist/controllers/idle_controller.js.map +1 -1
  112. package/dist/controllers/input_mask_controller.d.ts +30 -13
  113. package/dist/controllers/input_mask_controller.js +411 -24
  114. package/dist/controllers/input_mask_controller.js.map +1 -1
  115. package/dist/controllers/intersection_controller.js +3 -0
  116. package/dist/controllers/intersection_controller.js.map +1 -1
  117. package/dist/controllers/lazy_frame_controller.d.ts +3 -2
  118. package/dist/controllers/lazy_frame_controller.js +15 -3
  119. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  120. package/dist/controllers/listbox_controller.d.ts +10 -7
  121. package/dist/controllers/listbox_controller.js +260 -79
  122. package/dist/controllers/listbox_controller.js.map +1 -1
  123. package/dist/controllers/local_time_controller.d.ts +8 -6
  124. package/dist/controllers/local_time_controller.js +48 -13
  125. package/dist/controllers/local_time_controller.js.map +1 -1
  126. package/dist/controllers/masonry_controller.js +11 -4
  127. package/dist/controllers/masonry_controller.js.map +1 -1
  128. package/dist/controllers/menu_controller.d.ts +24 -5
  129. package/dist/controllers/menu_controller.js +138 -82
  130. package/dist/controllers/menu_controller.js.map +1 -1
  131. package/dist/controllers/menubar_controller.d.ts +49 -7
  132. package/dist/controllers/menubar_controller.js +65 -19
  133. package/dist/controllers/menubar_controller.js.map +1 -1
  134. package/dist/controllers/meter_controller.d.ts +13 -20
  135. package/dist/controllers/meter_controller.js +270 -24
  136. package/dist/controllers/meter_controller.js.map +1 -1
  137. package/dist/controllers/multi_select_controller.d.ts +17 -15
  138. package/dist/controllers/multi_select_controller.js +251 -94
  139. package/dist/controllers/multi_select_controller.js.map +1 -1
  140. package/dist/controllers/navigation_menu_controller.d.ts +19 -5
  141. package/dist/controllers/navigation_menu_controller.js +67 -19
  142. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  143. package/dist/controllers/nested_form_controller.js +98 -64
  144. package/dist/controllers/nested_form_controller.js.map +1 -1
  145. package/dist/controllers/network_status_controller.js +70 -52
  146. package/dist/controllers/network_status_controller.js.map +1 -1
  147. package/dist/controllers/number_input_controller.d.ts +24 -6
  148. package/dist/controllers/number_input_controller.js +344 -94
  149. package/dist/controllers/number_input_controller.js.map +1 -1
  150. package/dist/controllers/optimistic_controller.d.ts +8 -5
  151. package/dist/controllers/optimistic_controller.js +29 -11
  152. package/dist/controllers/optimistic_controller.js.map +1 -1
  153. package/dist/controllers/otp_controller.d.ts +35 -4
  154. package/dist/controllers/otp_controller.js +502 -104
  155. package/dist/controllers/otp_controller.js.map +1 -1
  156. package/dist/controllers/overflow_indicator_controller.js +6 -0
  157. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  158. package/dist/controllers/overflow_menu_controller.d.ts +10 -9
  159. package/dist/controllers/overflow_menu_controller.js +136 -21
  160. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  161. package/dist/controllers/pagination_controller.d.ts +3 -2
  162. package/dist/controllers/pagination_controller.js +47 -14
  163. package/dist/controllers/pagination_controller.js.map +1 -1
  164. package/dist/controllers/password_reveal_controller.d.ts +5 -4
  165. package/dist/controllers/password_reveal_controller.js +52 -49
  166. package/dist/controllers/password_reveal_controller.js.map +1 -1
  167. package/dist/controllers/password_strength_controller.d.ts +1 -1
  168. package/dist/controllers/password_strength_controller.js +13 -6
  169. package/dist/controllers/password_strength_controller.js.map +1 -1
  170. package/dist/controllers/persist_controller.js +48 -128
  171. package/dist/controllers/persist_controller.js.map +1 -1
  172. package/dist/controllers/pointer_drag_controller.d.ts +19 -8
  173. package/dist/controllers/pointer_drag_controller.js +249 -23
  174. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  175. package/dist/controllers/popover_controller.d.ts +3 -3
  176. package/dist/controllers/popover_controller.js +82 -65
  177. package/dist/controllers/popover_controller.js.map +1 -1
  178. package/dist/controllers/portal_controller.js +6 -0
  179. package/dist/controllers/portal_controller.js.map +1 -1
  180. package/dist/controllers/preview_guard_controller.js +14 -3
  181. package/dist/controllers/preview_guard_controller.js.map +1 -1
  182. package/dist/controllers/progress_controller.d.ts +9 -19
  183. package/dist/controllers/progress_controller.js +271 -27
  184. package/dist/controllers/progress_controller.js.map +1 -1
  185. package/dist/controllers/radio_group_controller.d.ts +11 -8
  186. package/dist/controllers/radio_group_controller.js +167 -80
  187. package/dist/controllers/radio_group_controller.js.map +1 -1
  188. package/dist/controllers/range_slider_controller.d.ts +4 -3
  189. package/dist/controllers/range_slider_controller.js +27 -7
  190. package/dist/controllers/range_slider_controller.js.map +1 -1
  191. package/dist/controllers/rating_controller.js +93 -57
  192. package/dist/controllers/rating_controller.js.map +1 -1
  193. package/dist/controllers/read_more_controller.js +10 -6
  194. package/dist/controllers/read_more_controller.js.map +1 -1
  195. package/dist/controllers/reading_progress_controller.js +22 -5
  196. package/dist/controllers/reading_progress_controller.js.map +1 -1
  197. package/dist/controllers/relative_time_controller.d.ts +4 -4
  198. package/dist/controllers/relative_time_controller.js +75 -11
  199. package/dist/controllers/relative_time_controller.js.map +1 -1
  200. package/dist/controllers/reset_on_restore_controller.d.ts +3 -3
  201. package/dist/controllers/reset_on_restore_controller.js +6 -0
  202. package/dist/controllers/reset_on_restore_controller.js.map +1 -1
  203. package/dist/controllers/resizable_controller.d.ts +3 -0
  204. package/dist/controllers/resizable_controller.js +55 -22
  205. package/dist/controllers/resizable_controller.js.map +1 -1
  206. package/dist/controllers/roving_controller.d.ts +3 -3
  207. package/dist/controllers/roving_controller.js +10 -4
  208. package/dist/controllers/roving_controller.js.map +1 -1
  209. package/dist/controllers/scroll_area_controller.js +129 -88
  210. package/dist/controllers/scroll_area_controller.js.map +1 -1
  211. package/dist/controllers/scroll_restore_controller.d.ts +3 -3
  212. package/dist/controllers/scroll_restore_controller.js +14 -2
  213. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  214. package/dist/controllers/scroll_visibility_controller.js +93 -60
  215. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  216. package/dist/controllers/scrollspy_controller.js +11 -5
  217. package/dist/controllers/scrollspy_controller.js.map +1 -1
  218. package/dist/controllers/separator_controller.d.ts +1 -1
  219. package/dist/controllers/separator_controller.js +59 -43
  220. package/dist/controllers/separator_controller.js.map +1 -1
  221. package/dist/controllers/sidebar_controller.d.ts +1 -1
  222. package/dist/controllers/sidebar_controller.js +150 -122
  223. package/dist/controllers/sidebar_controller.js.map +1 -1
  224. package/dist/controllers/skeleton_controller.js +55 -48
  225. package/dist/controllers/skeleton_controller.js.map +1 -1
  226. package/dist/controllers/slider_controller.d.ts +2 -1
  227. package/dist/controllers/slider_controller.js +27 -6
  228. package/dist/controllers/slider_controller.js.map +1 -1
  229. package/dist/controllers/smart_sticky_header_controller.d.ts +1 -1
  230. package/dist/controllers/smart_sticky_header_controller.js +13 -5
  231. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  232. package/dist/controllers/sortable_controller.d.ts +4 -4
  233. package/dist/controllers/sortable_controller.js +27 -14
  234. package/dist/controllers/sortable_controller.js.map +1 -1
  235. package/dist/controllers/spinner_controller.js +55 -48
  236. package/dist/controllers/spinner_controller.js.map +1 -1
  237. package/dist/controllers/step_indicator_controller.d.ts +4 -4
  238. package/dist/controllers/step_indicator_controller.js +6 -0
  239. package/dist/controllers/step_indicator_controller.js.map +1 -1
  240. package/dist/controllers/stepper_controller.d.ts +2 -3
  241. package/dist/controllers/stepper_controller.js +6 -0
  242. package/dist/controllers/stepper_controller.js.map +1 -1
  243. package/dist/controllers/stick_to_bottom_controller.d.ts +3 -1
  244. package/dist/controllers/stick_to_bottom_controller.js +19 -8
  245. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  246. package/dist/controllers/sticky_observer_controller.js +49 -43
  247. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  248. package/dist/controllers/submit_once_controller.d.ts +2 -1
  249. package/dist/controllers/submit_once_controller.js +145 -85
  250. package/dist/controllers/submit_once_controller.js.map +1 -1
  251. package/dist/controllers/switch_controller.d.ts +7 -4
  252. package/dist/controllers/switch_controller.js +172 -28
  253. package/dist/controllers/switch_controller.js.map +1 -1
  254. package/dist/controllers/tabs_controller.d.ts +7 -4
  255. package/dist/controllers/tabs_controller.js +6 -1
  256. package/dist/controllers/tabs_controller.js.map +1 -1
  257. package/dist/controllers/tags_input_controller.d.ts +4 -3
  258. package/dist/controllers/tags_input_controller.js +157 -28
  259. package/dist/controllers/tags_input_controller.js.map +1 -1
  260. package/dist/controllers/textarea_autosize_controller.d.ts +1 -1
  261. package/dist/controllers/textarea_autosize_controller.js +40 -19
  262. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  263. package/dist/controllers/theme_controller.d.ts +3 -2
  264. package/dist/controllers/theme_controller.js +10 -4
  265. package/dist/controllers/theme_controller.js.map +1 -1
  266. package/dist/controllers/time_picker_controller.d.ts +38 -5
  267. package/dist/controllers/time_picker_controller.js +192 -54
  268. package/dist/controllers/time_picker_controller.js.map +1 -1
  269. package/dist/controllers/toast_controller.d.ts +4 -5
  270. package/dist/controllers/toast_controller.js +58 -27
  271. package/dist/controllers/toast_controller.js.map +1 -1
  272. package/dist/controllers/toggle_group_controller.d.ts +2 -3
  273. package/dist/controllers/toggle_group_controller.js +158 -56
  274. package/dist/controllers/toggle_group_controller.js.map +1 -1
  275. package/dist/controllers/toolbar_controller.d.ts +8 -6
  276. package/dist/controllers/toolbar_controller.js +150 -21
  277. package/dist/controllers/toolbar_controller.js.map +1 -1
  278. package/dist/controllers/tooltip_controller.d.ts +4 -1
  279. package/dist/controllers/tooltip_controller.js.map +1 -1
  280. package/dist/controllers/transition_controller.js.map +1 -1
  281. package/dist/controllers/tree_view_controller.d.ts +1 -1
  282. package/dist/controllers/tree_view_controller.js +134 -25
  283. package/dist/controllers/tree_view_controller.js.map +1 -1
  284. package/dist/index.d.ts +2 -0
  285. package/dist/index.js +2451 -1312
  286. package/dist/index.js.map +1 -1
  287. package/dist/inspector/cli.d.ts +15 -11
  288. package/dist/inspector/cli.js +16 -3
  289. package/dist/inspector/cli.js.map +1 -1
  290. package/dist/inspector/cli_bin.js +53 -8
  291. package/dist/inspector/cli_bin.js.map +1 -1
  292. package/dist/inspector/examples.json +13 -13
  293. package/dist/inspector/manifest.json +19 -5
  294. package/dist/positioning/index.d.ts +7 -7
  295. package/dist/positioning/index.js +6 -0
  296. package/dist/positioning/index.js.map +1 -1
  297. package/package.json +10 -9
@@ -37,17 +37,31 @@ function isReservedArrowChord(event, allow = []) {
37
37
  if (!event.key.startsWith("Arrow")) return false;
38
38
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
39
39
  }
40
+ function hasModifierChord(event) {
41
+ return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
42
+ }
43
+
44
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
45
+ if (element.getAttribute(name) === value) return false;
46
+ if (value === null) element.removeAttribute(name);
47
+ else element.setAttribute(name, value);
48
+ return true;
49
+ }
40
50
 
41
51
  function sharedRegistry(key, create) {
42
52
  const symbol = Symbol.for(key);
43
53
  const scope = globalThis;
44
54
  const existing = scope[symbol];
45
55
  if (existing !== void 0) return existing;
46
- const registry = create();
47
- Object.defineProperty(globalThis, symbol, { value: registry });
48
- return registry;
56
+ const registry2 = create();
57
+ Object.defineProperty(globalThis, symbol, { value: registry2 });
58
+ return registry2;
49
59
  }
50
60
 
61
+ var registry = sharedRegistry(
62
+ "stimeo-ui.attribute-lease.registry.v1",
63
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
64
+ );
51
65
  function isAttributeValue(value) {
52
66
  return value === null || typeof value === "string";
53
67
  }
@@ -64,24 +78,46 @@ function readLeaseRecord(element, record) {
64
78
  return void 0;
65
79
  }
66
80
  }
67
- var AttributeLease = class _AttributeLease {
68
- static #registry = sharedRegistry(
69
- "stimeo-ui.attribute-lease.registry.v1",
70
- () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
71
- );
81
+ function attributeStack(element, attribute) {
82
+ const byAttribute = registry.stacks.get(element) ?? /* @__PURE__ */ new Map();
83
+ registry.stacks.set(element, byAttribute);
84
+ const known = byAttribute.get(attribute);
85
+ if (known) return known;
86
+ const found = [];
87
+ for (const record of registry.names.get(attribute) ?? []) {
88
+ const read = readLeaseRecord(element, record);
89
+ if (read) found.push({ ...read, record });
90
+ }
91
+ const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
92
+ const stack = found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
93
+ lease: null,
94
+ record,
95
+ written,
96
+ original,
97
+ linked: linked && index > 0
98
+ }));
99
+ byAttribute.set(attribute, stack);
100
+ return stack;
101
+ }
102
+ function findHold(stack, lease, record) {
103
+ return stack.find((held) => held.lease === lease) ?? stack.find((held) => held.lease === null && held.record === record);
104
+ }
105
+ var AttributeLease = class {
72
106
  #attribute;
73
107
  #record;
74
108
  #base;
109
+ #preserveAuthor;
75
110
  #held = /* @__PURE__ */ new Set();
76
111
  constructor(attribute, owner, options = {}) {
77
112
  this.#attribute = attribute;
78
113
  this.#record = `data-${owner}-${attribute}-lease`;
79
114
  this.#base = options.base === true;
80
- const names = _AttributeLease.#registry.names;
115
+ this.#preserveAuthor = options.preserveAuthor === true;
116
+ const names = registry.names;
81
117
  names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
82
118
  }
83
119
  write(element, value) {
84
- const stack = this.#stack(element);
120
+ const stack = attributeStack(element, this.#attribute);
85
121
  const hold = this.#take(stack) ?? this.#acquire(element, stack);
86
122
  this.#held.add(element);
87
123
  const shows = !this.#covered(element, stack, hold);
@@ -91,8 +127,8 @@ var AttributeLease = class _AttributeLease {
91
127
  }
92
128
  return(element) {
93
129
  const held = this.#held.delete(element);
94
- const known = _AttributeLease.#registry.stacks.get(element)?.has(this.#attribute);
95
- const stack = held || known || element.hasAttribute(this.#record) ? this.#stack(element) : [];
130
+ const known = registry.stacks.get(element)?.has(this.#attribute);
131
+ const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
96
132
  const hold = this.#take(stack);
97
133
  if (!hold) return false;
98
134
  const carries = element.getAttribute(this.#attribute) === hold.written;
@@ -110,31 +146,8 @@ var AttributeLease = class _AttributeLease {
110
146
  returnAll() {
111
147
  for (const element of Array.from(this.#held)) this.return(element);
112
148
  }
113
- #stack(element) {
114
- const stacks = _AttributeLease.#registry.stacks;
115
- const byAttribute = stacks.get(element) ?? /* @__PURE__ */ new Map();
116
- stacks.set(element, byAttribute);
117
- const stack = byAttribute.get(this.#attribute) ?? this.#seed(element);
118
- byAttribute.set(this.#attribute, stack);
119
- return stack;
120
- }
121
- #seed(element) {
122
- const found = [];
123
- for (const record of _AttributeLease.#registry.names.get(this.#attribute) ?? []) {
124
- const read = readLeaseRecord(element, record);
125
- if (read) found.push({ ...read, record });
126
- }
127
- const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
128
- return found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
129
- lease: null,
130
- record,
131
- written,
132
- original,
133
- linked: linked && index > 0
134
- }));
135
- }
136
149
  #take(stack) {
137
- const hold = stack.find((held) => held.lease === this) ?? stack.find((held) => held.lease === null && held.record === this.#record);
150
+ const hold = findHold(stack, this, this.#record);
138
151
  if (hold) hold.lease = this;
139
152
  return hold;
140
153
  }
@@ -143,7 +156,7 @@ var AttributeLease = class _AttributeLease {
143
156
  const top = stack.at(-1);
144
157
  const bottom = stack[0];
145
158
  const over = top?.written === current ? top : void 0;
146
- const from = this.#base ? bottom : over;
159
+ const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
147
160
  const hold = {
148
161
  lease: this,
149
162
  record: this.#record,
@@ -173,15 +186,11 @@ var AttributeLease = class _AttributeLease {
173
186
  );
174
187
  });
175
188
  for (const [name, recorded] of records) {
176
- if (element.getAttribute(name) === recorded) continue;
177
- if (recorded === null) element.removeAttribute(name);
178
- else element.setAttribute(name, recorded);
189
+ setAttributeIfChanged(element, name, recorded);
179
190
  }
180
191
  }
181
192
  #reflect(element, value) {
182
- if (element.getAttribute(this.#attribute) === value) return;
183
- if (value === null) element.removeAttribute(this.#attribute);
184
- else element.setAttribute(this.#attribute, value);
193
+ setAttributeIfChanged(element, this.#attribute, value);
185
194
  }
186
195
  };
187
196
 
@@ -238,6 +247,48 @@ var ListenerSet = class {
238
247
  }
239
248
  };
240
249
 
250
+ var HoverRecheck = class {
251
+ #document;
252
+ #release;
253
+ #listeners = new ListenerSet();
254
+ #pending = /* @__PURE__ */ new Set();
255
+ #tickets = /* @__PURE__ */ new WeakMap();
256
+ constructor(document2, release) {
257
+ this.#document = document2;
258
+ this.#release = release;
259
+ }
260
+ wait(element) {
261
+ this.#pending.add(element);
262
+ this.#tickets.set(element, /* @__PURE__ */ Symbol());
263
+ this.#listeners.add(this.#document, "pointermove", this.#onPointerMove, {
264
+ capture: true,
265
+ passive: true
266
+ });
267
+ }
268
+ cancel(element) {
269
+ this.#tickets.delete(element);
270
+ this.#pending.delete(element);
271
+ if (this.#pending.size === 0) this.#listeners.dispose();
272
+ }
273
+ dispose() {
274
+ this.#listeners.dispose();
275
+ this.#pending.clear();
276
+ this.#tickets = /* @__PURE__ */ new WeakMap();
277
+ }
278
+ #onPointerMove = () => {
279
+ this.#listeners.dispose();
280
+ const waiting = [...this.#pending].map(
281
+ (element) => [element, this.#tickets.get(element)]
282
+ );
283
+ this.#pending.clear();
284
+ for (const [element, ticket] of waiting) {
285
+ if (this.#tickets.get(element) !== ticket) continue;
286
+ if (element.matches(":hover")) continue;
287
+ this.#release(element);
288
+ }
289
+ };
290
+ };
291
+
241
292
  var MicrotaskCoalescer = class {
242
293
  #run;
243
294
  #queued = false;
@@ -254,6 +305,9 @@ var MicrotaskCoalescer = class {
254
305
  this.#queued = false;
255
306
  this.#generation += 1;
256
307
  }
308
+ get pending() {
309
+ return this.#queued;
310
+ }
257
311
  schedule() {
258
312
  if (!this.#active || this.#queued) return;
259
313
  this.#queued = true;
@@ -284,6 +338,9 @@ var MorphRenderWatcher = class {
284
338
  schedule() {
285
339
  this.#pass.schedule();
286
340
  }
341
+ get pending() {
342
+ return this.#pass.pending;
343
+ }
287
344
  disconnect() {
288
345
  this.#listeners.dispose();
289
346
  this.#pass.cancel();
@@ -451,9 +508,8 @@ var StateRegions = class _StateRegions {
451
508
  const below = hold.linked ? stack[index - 1] : void 0;
452
509
  if (below) {
453
510
  if (region.hidden !== below.written) region.hidden = below.written;
454
- } else if (region.getAttribute("hidden") !== hold.authored) {
455
- if (hold.authored === null) region.removeAttribute("hidden");
456
- else region.setAttribute("hidden", hold.authored);
511
+ } else {
512
+ setAttributeIfChanged(region, "hidden", hold.authored);
457
513
  }
458
514
  }
459
515
  this.#mark(region, stack);
@@ -528,9 +584,7 @@ var StateRegions = class _StateRegions {
528
584
  );
529
585
  });
530
586
  for (const [name, recorded] of records) {
531
- if (region.getAttribute(name) === recorded) continue;
532
- if (recorded === null) region.removeAttribute(name);
533
- else region.setAttribute(name, recorded);
587
+ setAttributeIfChanged(region, name, recorded);
534
588
  }
535
589
  }
536
590
  #recorded(region, name) {
@@ -567,6 +621,7 @@ var CarouselController = class _CarouselController extends Controller {
567
621
  "prev",
568
622
  "next",
569
623
  "picker",
624
+ "pickerList",
570
625
  "playToggle",
571
626
  "onLabel",
572
627
  "offLabel"
@@ -604,7 +659,10 @@ var CarouselController = class _CarouselController extends Controller {
604
659
  this.identifier
605
660
  );
606
661
  #gate = new DetachGate();
607
- #pointer = new ListenerSet();
662
+ #pointer = new HoverRecheck(this.element.ownerDocument, () => {
663
+ this.#pointerPaused = false;
664
+ this.#syncTimer();
665
+ });
608
666
  #handledEvents = /* @__PURE__ */ new WeakSet();
609
667
  #connected = false;
610
668
  #index = 0;
@@ -621,11 +679,12 @@ var CarouselController = class _CarouselController extends Controller {
621
679
  this.#hiddenPaused = document.visibilityState === "hidden";
622
680
  this.#syncTimer();
623
681
  };
682
+ #listeners = new ListenerSet();
624
683
  connect() {
625
684
  const moved = this.#gate.pending;
626
685
  this.#gate.cancel();
627
686
  this.#pointerPaused = moved && this.#pointerPaused || this.element.matches(":hover");
628
- if (this.#pointerPaused) this.#awaitPointer();
687
+ if (this.#pointerPaused) this.#pointer.wait(this.element);
629
688
  this.#focusPaused = this.element.contains(document.activeElement);
630
689
  this.#hiddenPaused = document.visibilityState === "hidden";
631
690
  this.#motionHold = prefersReducedMotion();
@@ -635,13 +694,13 @@ var CarouselController = class _CarouselController extends Controller {
635
694
  this.#syncTimer();
636
695
  this.#connected = true;
637
696
  this.#reconcileTargets.observe(this.element);
638
- this.element.addEventListener("click", this.#onClick);
639
- this.element.addEventListener("keydown", this.#onKeydown);
640
- this.element.addEventListener("focusin", this.#onFocusin);
641
- this.element.addEventListener("focusout", this.#onFocusout);
642
- this.element.addEventListener("mouseenter", this.#onMouseenter);
643
- this.element.addEventListener("mouseleave", this.#onMouseleave);
644
- document.addEventListener("visibilitychange", this.#onVisibilityChange);
697
+ this.#listeners.add(this.element, "click", this.#onClick);
698
+ this.#listeners.add(this.element, "keydown", this.#onKeydown);
699
+ this.#listeners.add(this.element, "focusin", this.#onFocusin);
700
+ this.#listeners.add(this.element, "focusout", this.#onFocusout);
701
+ this.#listeners.add(this.element, "mouseenter", this.#onMouseenter);
702
+ this.#listeners.add(this.element, "mouseleave", this.#onMouseleave);
703
+ this.#listeners.add(document, "visibilitychange", this.#onVisibilityChange);
645
704
  this.#observer = new MutationObserver(this.#onAttributeMutations);
646
705
  this.#observer.observe(this.element, {
647
706
  subtree: true,
@@ -652,13 +711,7 @@ var CarouselController = class _CarouselController extends Controller {
652
711
  disconnect() {
653
712
  this.#connected = false;
654
713
  this.#pointer.dispose();
655
- this.element.removeEventListener("click", this.#onClick);
656
- this.element.removeEventListener("keydown", this.#onKeydown);
657
- this.element.removeEventListener("focusin", this.#onFocusin);
658
- this.element.removeEventListener("focusout", this.#onFocusout);
659
- this.element.removeEventListener("mouseenter", this.#onMouseenter);
660
- this.element.removeEventListener("mouseleave", this.#onMouseleave);
661
- document.removeEventListener("visibilitychange", this.#onVisibilityChange);
714
+ this.#listeners.dispose();
662
715
  this.#observer?.disconnect();
663
716
  this.#observer = null;
664
717
  this.#reconcileTargets.disconnect();
@@ -803,18 +856,6 @@ var CarouselController = class _CarouselController extends Controller {
803
856
  this.#setPointerPaused(false);
804
857
  this.#syncTimer();
805
858
  });
806
- #onPointerMove = () => {
807
- this.#pointer.dispose();
808
- if (this.element.matches(":hover")) return;
809
- this.#pointerPaused = false;
810
- this.#syncTimer();
811
- };
812
- #awaitPointer() {
813
- this.#pointer.add(document, "pointermove", this.#onPointerMove, {
814
- capture: true,
815
- passive: true
816
- });
817
- }
818
859
  #setPointerPaused(paused) {
819
860
  this.#pointer.dispose();
820
861
  this.#pointerPaused = paused;
@@ -853,17 +894,20 @@ var CarouselController = class _CarouselController extends Controller {
853
894
  case "ArrowLeft":
854
895
  case "ArrowUp": {
855
896
  event.preventDefault();
856
- const step = logicalArrowStep(event.key, this.element);
897
+ const step = logicalArrowStep(
898
+ event.key,
899
+ this.hasPickerListTarget ? this.pickerListTarget : this.element
900
+ );
857
901
  this.#roving.setActive(rovingMove(current, length, step), { focus: true });
858
902
  return;
859
903
  }
860
904
  case "Home":
861
- if (hasModifier(event)) return;
905
+ if (hasModifierChord(event)) return;
862
906
  event.preventDefault();
863
907
  this.#roving.setActive(0, { focus: true });
864
908
  return;
865
909
  case "End":
866
- if (hasModifier(event)) return;
910
+ if (hasModifierChord(event)) return;
867
911
  event.preventDefault();
868
912
  this.#roving.setActive(length - 1, { focus: true });
869
913
  return;
@@ -1019,15 +1063,9 @@ var CarouselController = class _CarouselController extends Controller {
1019
1063
  function isFocusEvent(event) {
1020
1064
  return event?.type.startsWith("focus") === true;
1021
1065
  }
1022
- function hasModifier(event) {
1023
- return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
1024
- }
1025
1066
  function hits(elements, node) {
1026
1067
  return ownerIndex(elements, node) !== -1;
1027
1068
  }
1028
- function setAttributeIfChanged(element, name, value) {
1029
- if (element.getAttribute(name) !== value) element.setAttribute(name, value);
1030
- }
1031
1069
 
1032
1070
  export { CarouselController };
1033
1071
  //# sourceMappingURL=carousel_controller.js.map