stimeo-ui 0.17.0 → 0.18.1

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 (299) hide show
  1. package/CHANGELOG.md +136 -2
  2. package/README.md +19 -10
  3. package/dist/cable/index.d.ts +11 -9
  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 +290 -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 +66 -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 +200 -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.d.ts +2 -1
  97. package/dist/controllers/form_field_controller.js +52 -43
  98. package/dist/controllers/form_field_controller.js.map +1 -1
  99. package/dist/controllers/form_validation_controller.d.ts +3 -3
  100. package/dist/controllers/form_validation_controller.js +18 -11
  101. package/dist/controllers/form_validation_controller.js.map +1 -1
  102. package/dist/controllers/frame_loading_controller.d.ts +13 -12
  103. package/dist/controllers/frame_loading_controller.js +55 -48
  104. package/dist/controllers/frame_loading_controller.js.map +1 -1
  105. package/dist/controllers/highlight_controller.d.ts +5 -4
  106. package/dist/controllers/highlight_controller.js.map +1 -1
  107. package/dist/controllers/hover_card_controller.d.ts +4 -1
  108. package/dist/controllers/hover_card_controller.js +67 -61
  109. package/dist/controllers/hover_card_controller.js.map +1 -1
  110. package/dist/controllers/idle_controller.d.ts +6 -5
  111. package/dist/controllers/idle_controller.js +10 -6
  112. package/dist/controllers/idle_controller.js.map +1 -1
  113. package/dist/controllers/input_mask_controller.d.ts +31 -13
  114. package/dist/controllers/input_mask_controller.js +434 -24
  115. package/dist/controllers/input_mask_controller.js.map +1 -1
  116. package/dist/controllers/intersection_controller.js +3 -0
  117. package/dist/controllers/intersection_controller.js.map +1 -1
  118. package/dist/controllers/lazy_frame_controller.d.ts +3 -2
  119. package/dist/controllers/lazy_frame_controller.js +15 -3
  120. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  121. package/dist/controllers/listbox_controller.d.ts +10 -7
  122. package/dist/controllers/listbox_controller.js +260 -79
  123. package/dist/controllers/listbox_controller.js.map +1 -1
  124. package/dist/controllers/local_time_controller.d.ts +8 -6
  125. package/dist/controllers/local_time_controller.js +48 -13
  126. package/dist/controllers/local_time_controller.js.map +1 -1
  127. package/dist/controllers/masonry_controller.js +11 -4
  128. package/dist/controllers/masonry_controller.js.map +1 -1
  129. package/dist/controllers/menu_controller.d.ts +24 -5
  130. package/dist/controllers/menu_controller.js +138 -82
  131. package/dist/controllers/menu_controller.js.map +1 -1
  132. package/dist/controllers/menubar_controller.d.ts +49 -7
  133. package/dist/controllers/menubar_controller.js +65 -19
  134. package/dist/controllers/menubar_controller.js.map +1 -1
  135. package/dist/controllers/meter_controller.d.ts +13 -20
  136. package/dist/controllers/meter_controller.js +270 -24
  137. package/dist/controllers/meter_controller.js.map +1 -1
  138. package/dist/controllers/multi_select_controller.d.ts +19 -16
  139. package/dist/controllers/multi_select_controller.js +272 -95
  140. package/dist/controllers/multi_select_controller.js.map +1 -1
  141. package/dist/controllers/navigation_menu_controller.d.ts +19 -5
  142. package/dist/controllers/navigation_menu_controller.js +67 -19
  143. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  144. package/dist/controllers/nested_form_controller.js +98 -64
  145. package/dist/controllers/nested_form_controller.js.map +1 -1
  146. package/dist/controllers/network_status_controller.js +70 -52
  147. package/dist/controllers/network_status_controller.js.map +1 -1
  148. package/dist/controllers/number_input_controller.d.ts +24 -6
  149. package/dist/controllers/number_input_controller.js +344 -94
  150. package/dist/controllers/number_input_controller.js.map +1 -1
  151. package/dist/controllers/optimistic_controller.d.ts +8 -5
  152. package/dist/controllers/optimistic_controller.js +29 -11
  153. package/dist/controllers/optimistic_controller.js.map +1 -1
  154. package/dist/controllers/otp_controller.d.ts +35 -4
  155. package/dist/controllers/otp_controller.js +502 -104
  156. package/dist/controllers/otp_controller.js.map +1 -1
  157. package/dist/controllers/overflow_indicator_controller.js +6 -0
  158. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  159. package/dist/controllers/overflow_menu_controller.d.ts +10 -9
  160. package/dist/controllers/overflow_menu_controller.js +136 -21
  161. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  162. package/dist/controllers/pagination_controller.d.ts +3 -2
  163. package/dist/controllers/pagination_controller.js +47 -14
  164. package/dist/controllers/pagination_controller.js.map +1 -1
  165. package/dist/controllers/password_reveal_controller.d.ts +5 -4
  166. package/dist/controllers/password_reveal_controller.js +52 -49
  167. package/dist/controllers/password_reveal_controller.js.map +1 -1
  168. package/dist/controllers/password_strength_controller.d.ts +1 -1
  169. package/dist/controllers/password_strength_controller.js +13 -6
  170. package/dist/controllers/password_strength_controller.js.map +1 -1
  171. package/dist/controllers/persist_controller.js +48 -128
  172. package/dist/controllers/persist_controller.js.map +1 -1
  173. package/dist/controllers/pointer_drag_controller.d.ts +20 -8
  174. package/dist/controllers/pointer_drag_controller.js +255 -24
  175. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  176. package/dist/controllers/popover_controller.d.ts +9 -5
  177. package/dist/controllers/popover_controller.js +91 -65
  178. package/dist/controllers/popover_controller.js.map +1 -1
  179. package/dist/controllers/portal_controller.js +6 -0
  180. package/dist/controllers/portal_controller.js.map +1 -1
  181. package/dist/controllers/preview_guard_controller.js +14 -3
  182. package/dist/controllers/preview_guard_controller.js.map +1 -1
  183. package/dist/controllers/progress_controller.d.ts +9 -19
  184. package/dist/controllers/progress_controller.js +271 -27
  185. package/dist/controllers/progress_controller.js.map +1 -1
  186. package/dist/controllers/radio_group_controller.d.ts +11 -8
  187. package/dist/controllers/radio_group_controller.js +167 -80
  188. package/dist/controllers/radio_group_controller.js.map +1 -1
  189. package/dist/controllers/range_slider_controller.d.ts +4 -3
  190. package/dist/controllers/range_slider_controller.js +27 -7
  191. package/dist/controllers/range_slider_controller.js.map +1 -1
  192. package/dist/controllers/rating_controller.js +93 -57
  193. package/dist/controllers/rating_controller.js.map +1 -1
  194. package/dist/controllers/read_more_controller.js +10 -6
  195. package/dist/controllers/read_more_controller.js.map +1 -1
  196. package/dist/controllers/reading_progress_controller.js +22 -5
  197. package/dist/controllers/reading_progress_controller.js.map +1 -1
  198. package/dist/controllers/relative_time_controller.d.ts +4 -4
  199. package/dist/controllers/relative_time_controller.js +75 -11
  200. package/dist/controllers/relative_time_controller.js.map +1 -1
  201. package/dist/controllers/reset_on_restore_controller.d.ts +3 -3
  202. package/dist/controllers/reset_on_restore_controller.js +6 -0
  203. package/dist/controllers/reset_on_restore_controller.js.map +1 -1
  204. package/dist/controllers/resizable_controller.d.ts +3 -0
  205. package/dist/controllers/resizable_controller.js +55 -22
  206. package/dist/controllers/resizable_controller.js.map +1 -1
  207. package/dist/controllers/roving_controller.d.ts +3 -3
  208. package/dist/controllers/roving_controller.js +10 -4
  209. package/dist/controllers/roving_controller.js.map +1 -1
  210. package/dist/controllers/scroll_area_controller.js +129 -88
  211. package/dist/controllers/scroll_area_controller.js.map +1 -1
  212. package/dist/controllers/scroll_restore_controller.d.ts +3 -3
  213. package/dist/controllers/scroll_restore_controller.js +14 -2
  214. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  215. package/dist/controllers/scroll_visibility_controller.js +93 -60
  216. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  217. package/dist/controllers/scrollspy_controller.js +11 -5
  218. package/dist/controllers/scrollspy_controller.js.map +1 -1
  219. package/dist/controllers/separator_controller.d.ts +1 -1
  220. package/dist/controllers/separator_controller.js +59 -43
  221. package/dist/controllers/separator_controller.js.map +1 -1
  222. package/dist/controllers/sidebar_controller.d.ts +1 -1
  223. package/dist/controllers/sidebar_controller.js +150 -122
  224. package/dist/controllers/sidebar_controller.js.map +1 -1
  225. package/dist/controllers/skeleton_controller.js +55 -48
  226. package/dist/controllers/skeleton_controller.js.map +1 -1
  227. package/dist/controllers/slider_controller.d.ts +2 -1
  228. package/dist/controllers/slider_controller.js +27 -6
  229. package/dist/controllers/slider_controller.js.map +1 -1
  230. package/dist/controllers/smart_sticky_header_controller.d.ts +1 -1
  231. package/dist/controllers/smart_sticky_header_controller.js +13 -5
  232. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  233. package/dist/controllers/sortable_controller.d.ts +4 -4
  234. package/dist/controllers/sortable_controller.js +27 -14
  235. package/dist/controllers/sortable_controller.js.map +1 -1
  236. package/dist/controllers/spinner_controller.js +55 -48
  237. package/dist/controllers/spinner_controller.js.map +1 -1
  238. package/dist/controllers/step_indicator_controller.d.ts +4 -4
  239. package/dist/controllers/step_indicator_controller.js +6 -0
  240. package/dist/controllers/step_indicator_controller.js.map +1 -1
  241. package/dist/controllers/stepper_controller.d.ts +2 -3
  242. package/dist/controllers/stepper_controller.js +6 -0
  243. package/dist/controllers/stepper_controller.js.map +1 -1
  244. package/dist/controllers/stick_to_bottom_controller.d.ts +3 -1
  245. package/dist/controllers/stick_to_bottom_controller.js +19 -8
  246. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  247. package/dist/controllers/sticky_observer_controller.js +49 -43
  248. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  249. package/dist/controllers/submit_once_controller.d.ts +2 -1
  250. package/dist/controllers/submit_once_controller.js +145 -85
  251. package/dist/controllers/submit_once_controller.js.map +1 -1
  252. package/dist/controllers/switch_controller.d.ts +7 -4
  253. package/dist/controllers/switch_controller.js +172 -28
  254. package/dist/controllers/switch_controller.js.map +1 -1
  255. package/dist/controllers/tabs_controller.d.ts +7 -4
  256. package/dist/controllers/tabs_controller.js +6 -1
  257. package/dist/controllers/tabs_controller.js.map +1 -1
  258. package/dist/controllers/tags_input_controller.d.ts +4 -3
  259. package/dist/controllers/tags_input_controller.js +157 -28
  260. package/dist/controllers/tags_input_controller.js.map +1 -1
  261. package/dist/controllers/textarea_autosize_controller.d.ts +1 -1
  262. package/dist/controllers/textarea_autosize_controller.js +40 -19
  263. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  264. package/dist/controllers/theme_controller.d.ts +3 -2
  265. package/dist/controllers/theme_controller.js +10 -4
  266. package/dist/controllers/theme_controller.js.map +1 -1
  267. package/dist/controllers/time_picker_controller.d.ts +38 -5
  268. package/dist/controllers/time_picker_controller.js +192 -54
  269. package/dist/controllers/time_picker_controller.js.map +1 -1
  270. package/dist/controllers/toast_controller.d.ts +4 -5
  271. package/dist/controllers/toast_controller.js +58 -27
  272. package/dist/controllers/toast_controller.js.map +1 -1
  273. package/dist/controllers/toggle_group_controller.d.ts +2 -3
  274. package/dist/controllers/toggle_group_controller.js +158 -56
  275. package/dist/controllers/toggle_group_controller.js.map +1 -1
  276. package/dist/controllers/toolbar_controller.d.ts +8 -6
  277. package/dist/controllers/toolbar_controller.js +150 -21
  278. package/dist/controllers/toolbar_controller.js.map +1 -1
  279. package/dist/controllers/tooltip_controller.d.ts +4 -1
  280. package/dist/controllers/tooltip_controller.js.map +1 -1
  281. package/dist/controllers/transition_controller.js.map +1 -1
  282. package/dist/controllers/tree_view_controller.d.ts +1 -1
  283. package/dist/controllers/tree_view_controller.js +134 -25
  284. package/dist/controllers/tree_view_controller.js.map +1 -1
  285. package/dist/index.d.ts +4 -1
  286. package/dist/index.js +2515 -1315
  287. package/dist/index.js.map +1 -1
  288. package/dist/inspector/cli.d.ts +25 -12
  289. package/dist/inspector/cli.js +21 -3
  290. package/dist/inspector/cli.js.map +1 -1
  291. package/dist/inspector/cli_bin.d.ts +1 -1
  292. package/dist/inspector/cli_bin.js +62 -8
  293. package/dist/inspector/cli_bin.js.map +1 -1
  294. package/dist/inspector/examples.json +13 -13
  295. package/dist/inspector/manifest.json +19 -5
  296. package/dist/positioning/index.d.ts +9 -8
  297. package/dist/positioning/index.js +6 -0
  298. package/dist/positioning/index.js.map +1 -1
  299. package/package.json +11 -10
@@ -4,6 +4,9 @@ function isReservedArrowChord(event, allow = []) {
4
4
  if (!event.key.startsWith("Arrow")) return false;
5
5
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
6
6
  }
7
+ function hasModifierChord(event) {
8
+ return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
9
+ }
7
10
 
8
11
  var DetachGate = class _DetachGate {
9
12
  #pending = false;
@@ -50,6 +53,33 @@ function ownerOf(candidates, node) {
50
53
  return candidates[ownerIndex(candidates, node)] ?? null;
51
54
  }
52
55
 
56
+ function unslotted(element) {
57
+ return element.assignedSlot === null && element.parentElement?.shadowRoot != null;
58
+ }
59
+ function flatTreeParent(element) {
60
+ if (unslotted(element)) return null;
61
+ const parent = element.assignedSlot ?? element.parentNode;
62
+ if (parent instanceof ShadowRoot) return parent.host;
63
+ return parent instanceof Element ? parent : null;
64
+ }
65
+ function flatTreeContains(ancestor, element) {
66
+ for (let node = element; node; node = flatTreeParent(node)) {
67
+ if (node === ancestor) return true;
68
+ }
69
+ return false;
70
+ }
71
+ function closestInFlatTree(element, selector) {
72
+ for (let node = element; node; node = flatTreeParent(node)) {
73
+ if (node.matches(selector)) return node;
74
+ }
75
+ return null;
76
+ }
77
+ function deepActiveElement(ownerDocument) {
78
+ let active = ownerDocument.activeElement;
79
+ while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;
80
+ return active;
81
+ }
82
+
53
83
  var ListenerSet = class {
54
84
  #abort = new AbortController();
55
85
  add(target, type, handler, options) {
@@ -77,6 +107,9 @@ var MicrotaskCoalescer = class {
77
107
  this.#queued = false;
78
108
  this.#generation += 1;
79
109
  }
110
+ get pending() {
111
+ return this.#queued;
112
+ }
80
113
  schedule() {
81
114
  if (!this.#active || this.#queued) return;
82
115
  this.#queued = true;
@@ -107,6 +140,9 @@ var MorphRenderWatcher = class {
107
140
  schedule() {
108
141
  this.#pass.schedule();
109
142
  }
143
+ get pending() {
144
+ return this.#pass.pending;
145
+ }
110
146
  disconnect() {
111
147
  this.#listeners.dispose();
112
148
  this.#pass.cancel();
@@ -202,6 +238,143 @@ var OwnedPointerSession = class {
202
238
  };
203
239
  };
204
240
 
241
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
242
+ if (element.getAttribute(name) === value) return false;
243
+ if (value === null) element.removeAttribute(name);
244
+ else element.setAttribute(name, value);
245
+ return true;
246
+ }
247
+
248
+ function queryOpenDescendants(root, selector) {
249
+ const matches = [];
250
+ const roots = [root];
251
+ for (const scope of roots) {
252
+ matches.push(...scope.querySelectorAll(selector));
253
+ if (scope.nodeType === Node.ELEMENT_NODE) {
254
+ const shadow = scope.shadowRoot;
255
+ if (shadow) roots.push(shadow);
256
+ }
257
+ for (const element of scope.querySelectorAll("*")) {
258
+ if (element.shadowRoot) roots.push(element.shadowRoot);
259
+ }
260
+ }
261
+ return matches;
262
+ }
263
+
264
+ function sharedRegistry(key, create) {
265
+ const symbol = Symbol.for(key);
266
+ const scope = globalThis;
267
+ const existing = scope[symbol];
268
+ if (existing !== void 0) return existing;
269
+ const registry = create();
270
+ Object.defineProperty(globalThis, symbol, { value: registry });
271
+ return registry;
272
+ }
273
+
274
+ function holdsFocus(element) {
275
+ return element.matches(":focus") || deepActiveElement(element.ownerDocument) === element;
276
+ }
277
+ var TabindexLoan = class _TabindexLoan {
278
+ static #registry = sharedRegistry(
279
+ "stimeo-ui.tabindex-loan.registry.v1",
280
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Set() })
281
+ );
282
+ #value;
283
+ #record;
284
+ #preserveFocus;
285
+ #lent = /* @__PURE__ */ new Set();
286
+ constructor(value, owner, options = {}) {
287
+ this.#value = value;
288
+ this.#record = `data-${owner}-tabindex-loan`;
289
+ this.#preserveFocus = options.preserveFocus === true;
290
+ _TabindexLoan.#registry.names.add(this.#record);
291
+ }
292
+ lend(element, options = {}) {
293
+ const stack = this.#stack(element);
294
+ const current = element.getAttribute("tabindex");
295
+ const held = stack.find((hold) => hold.loan === this) ?? stack.find(
296
+ (hold) => hold.loan === null && hold.record === this.#record && hold.value === this.#value
297
+ );
298
+ const linked = stack.at(-1)?.value === current;
299
+ if (!held && options.onlyIfUnfocusable && (current !== null || element.tabIndex >= 0)) return;
300
+ if (!held && current !== null && !linked) return;
301
+ this.#lent.add(element);
302
+ if (held) held.loan = this;
303
+ else stack.push({ loan: this, record: this.#record, value: this.#value, linked });
304
+ this.#mark(element, stack);
305
+ if (current === null || !held && current !== this.#value) {
306
+ element.setAttribute("tabindex", this.#value);
307
+ }
308
+ }
309
+ return(element) {
310
+ const stack = this.#stack(element);
311
+ const hold = stack.find((held) => held.loan === this) ?? stack.find(
312
+ (held) => held.loan === null && held.record === this.#record && held.value === this.#value
313
+ );
314
+ if (!hold) return false;
315
+ if (!this.#release(element, stack, hold, this.#preserveFocus)) {
316
+ hold.loan = this;
317
+ this.#lent.add(element);
318
+ return false;
319
+ }
320
+ this.#lent.delete(element);
321
+ return true;
322
+ }
323
+ returnAll() {
324
+ for (const element of Array.from(this.#lent)) this.return(element);
325
+ }
326
+ reclaim(element) {
327
+ if (element.getAttribute(this.#record) !== this.#value) return;
328
+ const stack = this.#stack(element);
329
+ const hold = stack.find((held) => held.loan === null && held.record === this.#record);
330
+ if (hold && !holdsFocus(element)) this.#release(element, stack, hold);
331
+ }
332
+ reclaimWithin(root) {
333
+ for (const element of queryOpenDescendants(root, `[${this.#record}]`)) {
334
+ this.reclaim(element);
335
+ }
336
+ }
337
+ #stack(element) {
338
+ const stacks = _TabindexLoan.#registry.stacks;
339
+ const stack = stacks.get(element) ?? this.#seed(element);
340
+ stacks.set(element, stack);
341
+ return stack;
342
+ }
343
+ #seed(element) {
344
+ const current = element.getAttribute("tabindex");
345
+ const holds = [];
346
+ for (const record of _TabindexLoan.#registry.names) {
347
+ const value = element.getAttribute(record);
348
+ if (value !== null) holds.push({ loan: null, record, value, linked: true });
349
+ }
350
+ holds.sort((one, other) => Number(one.value === current) - Number(other.value === current));
351
+ for (const [index, hold] of holds.entries()) hold.linked = index > 0;
352
+ return holds;
353
+ }
354
+ #release(element, stack, hold, preserveFocus = false) {
355
+ const current = element.getAttribute("tabindex");
356
+ const index = stack.indexOf(hold);
357
+ const owns = current === hold.value && !stack.slice(index + 1).some((above2) => above2.value === current);
358
+ if (owns && preserveFocus && holdsFocus(element)) return false;
359
+ stack.splice(index, 1);
360
+ const above = stack[index];
361
+ if (above) above.linked &&= hold.linked;
362
+ this.#mark(element, stack);
363
+ if (!owns) return true;
364
+ const below = hold.linked ? stack[index - 1] : void 0;
365
+ if (!below) element.removeAttribute("tabindex");
366
+ else if (below.value !== current) element.setAttribute("tabindex", below.value);
367
+ return true;
368
+ }
369
+ #mark(element, stack) {
370
+ const records = /* @__PURE__ */ new Map([[this.#record, null]]);
371
+ for (const hold of stack) records.set(hold.record, hold.value);
372
+ for (const [name, recorded] of records) {
373
+ setAttributeIfChanged(element, name, recorded);
374
+ }
375
+ }
376
+ };
377
+
205
378
  var TransientHooks = class {
206
379
  #attributes;
207
380
  constructor(options) {
@@ -232,9 +405,14 @@ var PointerDragController = class _PointerDragController extends Controller {
232
405
  static actions = ["reset"];
233
406
  static events = ["start", "move", "end", "cancel"];
234
407
  static #TOUCH_ACTION_MARKER = "data-pointer-drag-touch-action";
235
- static #TABINDEX_MARKER = "data-pointer-drag-tabindex";
408
+ #tabindex = new TabindexLoan("0", this.identifier, { preserveFocus: true });
236
409
  #pointer = null;
237
410
  #keyboard = null;
411
+ #connected = false;
412
+ #keyboardFocusSession = null;
413
+ #listeners = new ListenerSet();
414
+ #shadowFocus = new ListenerSet();
415
+ #keyboardFocus = new MicrotaskCoalescer(() => this.#settleKeyboardFocus());
238
416
  #followBase = { x: 0, y: 0 };
239
417
  #gestureFollows = false;
240
418
  #followOutput = null;
@@ -244,19 +422,30 @@ var PointerDragController = class _PointerDragController extends Controller {
244
422
  this.#reflectSession();
245
423
  });
246
424
  connect() {
425
+ this.#connected = true;
247
426
  this.#morphRender.observe(this.element);
248
427
  if (!this.#pointer && !this.#keyboard) this.#followOutput = null;
249
428
  this.#gate.cancel();
250
429
  if (!this.#pointer) TRANSIENT_DRAG.reset(this.element);
251
430
  if (!this.#keyboard) TRANSIENT_GRAB.reset(this.element);
252
- this.element.addEventListener("pointerdown", this.#onPointerDown);
253
- this.element.addEventListener("keydown", this.#onKeydown);
431
+ this.#listeners.add(this.element, "pointerdown", this.#onPointerDown);
432
+ this.#listeners.add(this.element, "keydown", this.#onKeydown);
433
+ this.#listeners.add(this.element, "focusout", this.#onFocusout);
434
+ this.#listeners.add(this.element, "focusin", this.#onFocusin);
435
+ this.#keyboardFocus.activate();
254
436
  if (!this.hasHandleTarget) this.#prepareHandle(this.element);
437
+ if (this.#keyboard) {
438
+ this.#watchShadowFocus(this.#keyboard.handle);
439
+ this.#checkKeyboardFocus(this.#keyboard);
440
+ }
255
441
  }
256
442
  disconnect() {
443
+ this.#connected = false;
257
444
  this.#morphRender.disconnect();
258
- this.element.removeEventListener("pointerdown", this.#onPointerDown);
259
- this.element.removeEventListener("keydown", this.#onKeydown);
445
+ this.#listeners.dispose();
446
+ this.#shadowFocus.dispose();
447
+ this.#keyboardFocus.cancel();
448
+ this.#keyboardFocusSession = null;
260
449
  if (this.#pointer || this.#keyboard) {
261
450
  this.#gate.disconnected(this, () => this.#teardown());
262
451
  return;
@@ -264,9 +453,11 @@ var PointerDragController = class _PointerDragController extends Controller {
264
453
  this.#teardown();
265
454
  }
266
455
  reset() {
456
+ const follows = this.#pointer || this.#keyboard ? this.#gestureFollows : this.followValue;
267
457
  const live = this.#pointer?.started ? this.#pointer.pointerType : this.#keyboard ? "keyboard" : null;
268
458
  if (this.#pointer || this.#keyboard) this.#teardownSessions();
269
459
  if (live) this.#dispatchCancel(live);
460
+ if (!follows) return;
270
461
  this.#followBase = { x: 0, y: 0 };
271
462
  this.#applyFollow(0, 0);
272
463
  }
@@ -276,7 +467,9 @@ var PointerDragController = class _PointerDragController extends Controller {
276
467
  }
277
468
  handleTargetDisconnected(handle) {
278
469
  this.#restoreHandle(handle);
279
- if (this.element.contains(handle)) return;
470
+ if (!this.#connected) return;
471
+ if (this.element.contains(handle) && (this.handleTargets.includes(handle) || DetachGate.isDetached(this)))
472
+ return;
280
473
  const interrupted = this.#pointer?.handle === handle && this.#pointer.started ? this.#pointer.pointerType : this.#keyboard?.handle === handle ? "keyboard" : null;
281
474
  if (this.#pointer?.handle === handle) this.#endPointerSession();
282
475
  if (this.#keyboard?.handle === handle) this.#clearKeyboardSession();
@@ -298,7 +491,8 @@ var PointerDragController = class _PointerDragController extends Controller {
298
491
  }
299
492
  this.#teardownSessions();
300
493
  }
301
- #onPointerDown = (event) => {
494
+ #onPointerDown = (rawEvent) => {
495
+ const event = rawEvent;
302
496
  if (this.disabledValue || this.#pointer || this.#keyboard || event.button !== 0) return;
303
497
  const handle = this.#handleFor(event.target);
304
498
  if (!handle) return;
@@ -353,13 +547,14 @@ var PointerDragController = class _PointerDragController extends Controller {
353
547
  }
354
548
  this.#dispatchCancel(pointerType);
355
549
  }
356
- #onKeydown = (event) => {
550
+ #onKeydown = (rawEvent) => {
551
+ const event = rawEvent;
357
552
  if (this.disabledValue) return;
358
553
  const handle = this.#handleFor(event.target);
359
554
  if (!handle) return;
360
555
  if (event.defaultPrevented) return;
361
556
  if (event.isComposing) return;
362
- if (this.#ownsNativeKeys(event.target, handle)) return;
557
+ if (this.#ownsNativeKeys(event.composedPath()[0] ?? event.target, handle)) return;
363
558
  if (isReservedArrowChord(event)) return;
364
559
  if (event.key === "Escape") {
365
560
  if (this.#pointer?.started) {
@@ -383,6 +578,7 @@ var PointerDragController = class _PointerDragController extends Controller {
383
578
  }
384
579
  if (!this.#keyboard) return;
385
580
  if (event.key === "Home" || event.key === "End") {
581
+ if (hasModifierChord(event)) return;
386
582
  event.preventDefault();
387
583
  return;
388
584
  }
@@ -404,9 +600,50 @@ var PointerDragController = class _PointerDragController extends Controller {
404
600
  }
405
601
  });
406
602
  };
603
+ #onFocusin = () => {
604
+ const session = this.#keyboard;
605
+ if (session) {
606
+ this.#watchShadowFocus(session.handle);
607
+ this.#checkKeyboardFocus(session);
608
+ }
609
+ };
610
+ #watchShadowFocus(handle) {
611
+ const tree = handle.getRootNode();
612
+ let active = tree.activeElement;
613
+ while (active?.shadowRoot) {
614
+ const shadow = active.shadowRoot;
615
+ this.#shadowFocus.add(shadow, "focusin", this.#onFocusin);
616
+ active = shadow.activeElement;
617
+ }
618
+ }
619
+ #onFocusout = (rawEvent) => {
620
+ const destination = rawEvent.relatedTarget;
621
+ const session = this.#keyboard;
622
+ if (session && this.#handleFor(destination) === session.handle && !this.#ownsNativeKeys(destination, session.handle)) {
623
+ return;
624
+ }
625
+ this.#checkKeyboardFocus(this.#keyboard);
626
+ };
627
+ #checkKeyboardFocus(session) {
628
+ this.#keyboardFocusSession = session;
629
+ this.#keyboardFocus.schedule();
630
+ }
631
+ #settleKeyboardFocus() {
632
+ const session = this.#keyboardFocusSession;
633
+ this.#keyboardFocusSession = null;
634
+ if (!session || this.#keyboard !== session || !this.element.isConnected) return;
635
+ const tree = session.handle.getRootNode();
636
+ const active = tree.activeElement ?? null;
637
+ if (this.#handleFor(active) === session.handle && !this.#ownsNativeKeys(active, session.handle)) {
638
+ return;
639
+ }
640
+ this.#clearKeyboardSession();
641
+ this.#dispatchCancel("keyboard");
642
+ }
407
643
  #grabKeyboard(handle) {
408
644
  this.#beginGesture();
409
645
  this.#keyboard = { handle, dx: 0, dy: 0 };
646
+ this.#watchShadowFocus(handle);
410
647
  this.element.setAttribute("data-grabbed", "true");
411
648
  handle.setAttribute("data-grabbed", "true");
412
649
  this.dispatch("start", { detail: { x: 0, y: 0, pointerType: "keyboard" } });
@@ -442,14 +679,17 @@ var PointerDragController = class _PointerDragController extends Controller {
442
679
  this.#pointer?.pointer?.end();
443
680
  }
444
681
  #clearKeyboardSession() {
682
+ this.#shadowFocus.dispose();
445
683
  this.#keyboard?.handle.removeAttribute("data-grabbed");
446
684
  this.#keyboard = null;
685
+ this.#keyboardFocusSession = null;
447
686
  this.element.removeAttribute("data-grabbed");
448
687
  }
449
688
  #teardown() {
450
689
  const interrupted = this.#pointer?.started ? this.#pointer.pointerType : this.#keyboard ? "keyboard" : null;
451
690
  this.#teardownSessions();
452
691
  for (const handle of this.#handles()) this.#restoreHandle(handle);
692
+ this.#tabindex.returnAll();
453
693
  if (interrupted) this.#followReset();
454
694
  if (interrupted && this.element.isConnected) this.#dispatchCancel(interrupted);
455
695
  }
@@ -530,14 +770,13 @@ var PointerDragController = class _PointerDragController extends Controller {
530
770
  handle.style.touchAction = lent;
531
771
  handle.setAttribute(_PointerDragController.#TOUCH_ACTION_MARKER, "true");
532
772
  }
533
- if (handle.tabIndex < 0 && !handle.hasAttribute("tabindex")) {
534
- handle.setAttribute("tabindex", "0");
535
- handle.setAttribute(_PointerDragController.#TABINDEX_MARKER, "true");
536
- }
773
+ this.#tabindex.lend(handle, { onlyIfUnfocusable: true });
537
774
  }
538
775
  #ownsNativeKeys(target, handle) {
539
- const owner = target?.closest(NATIVE_KEY_OWNERS) ?? null;
540
- return owner !== null && owner !== handle && handle.contains(owner);
776
+ let element = target;
777
+ while (element.shadowRoot?.activeElement) element = element.shadowRoot.activeElement;
778
+ const owner = closestInFlatTree(element, NATIVE_KEY_OWNERS);
779
+ return owner !== null && owner !== handle && flatTreeContains(handle, owner);
541
780
  }
542
781
  #restoreHandle(handle) {
543
782
  if (handle.hasAttribute(_PointerDragController.#TOUCH_ACTION_MARKER)) {
@@ -546,15 +785,7 @@ var PointerDragController = class _PointerDragController extends Controller {
546
785
  }
547
786
  handle.removeAttribute(_PointerDragController.#TOUCH_ACTION_MARKER);
548
787
  }
549
- if (handle.hasAttribute(_PointerDragController.#TABINDEX_MARKER)) {
550
- const ours = handle.getAttribute("tabindex") === "0";
551
- if (ours && document.activeElement !== handle) {
552
- handle.removeAttribute("tabindex");
553
- handle.removeAttribute(_PointerDragController.#TABINDEX_MARKER);
554
- return;
555
- }
556
- if (!ours) handle.removeAttribute(_PointerDragController.#TABINDEX_MARKER);
557
- }
788
+ this.#tabindex.return(handle);
558
789
  }
559
790
  get #safeThreshold() {
560
791
  return this.#numbers.read(