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
@@ -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,13 @@ 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
+ #keyboardFocusSession = null;
412
+ #listeners = new ListenerSet();
413
+ #shadowFocus = new ListenerSet();
414
+ #keyboardFocus = new MicrotaskCoalescer(() => this.#settleKeyboardFocus());
238
415
  #followBase = { x: 0, y: 0 };
239
416
  #gestureFollows = false;
240
417
  #followOutput = null;
@@ -249,14 +426,23 @@ var PointerDragController = class _PointerDragController extends Controller {
249
426
  this.#gate.cancel();
250
427
  if (!this.#pointer) TRANSIENT_DRAG.reset(this.element);
251
428
  if (!this.#keyboard) TRANSIENT_GRAB.reset(this.element);
252
- this.element.addEventListener("pointerdown", this.#onPointerDown);
253
- this.element.addEventListener("keydown", this.#onKeydown);
429
+ this.#listeners.add(this.element, "pointerdown", this.#onPointerDown);
430
+ this.#listeners.add(this.element, "keydown", this.#onKeydown);
431
+ this.#listeners.add(this.element, "focusout", this.#onFocusout);
432
+ this.#listeners.add(this.element, "focusin", this.#onFocusin);
433
+ this.#keyboardFocus.activate();
254
434
  if (!this.hasHandleTarget) this.#prepareHandle(this.element);
435
+ if (this.#keyboard) {
436
+ this.#watchShadowFocus(this.#keyboard.handle);
437
+ this.#checkKeyboardFocus(this.#keyboard);
438
+ }
255
439
  }
256
440
  disconnect() {
257
441
  this.#morphRender.disconnect();
258
- this.element.removeEventListener("pointerdown", this.#onPointerDown);
259
- this.element.removeEventListener("keydown", this.#onKeydown);
442
+ this.#listeners.dispose();
443
+ this.#shadowFocus.dispose();
444
+ this.#keyboardFocus.cancel();
445
+ this.#keyboardFocusSession = null;
260
446
  if (this.#pointer || this.#keyboard) {
261
447
  this.#gate.disconnected(this, () => this.#teardown());
262
448
  return;
@@ -264,9 +450,11 @@ var PointerDragController = class _PointerDragController extends Controller {
264
450
  this.#teardown();
265
451
  }
266
452
  reset() {
453
+ const follows = this.#pointer || this.#keyboard ? this.#gestureFollows : this.followValue;
267
454
  const live = this.#pointer?.started ? this.#pointer.pointerType : this.#keyboard ? "keyboard" : null;
268
455
  if (this.#pointer || this.#keyboard) this.#teardownSessions();
269
456
  if (live) this.#dispatchCancel(live);
457
+ if (!follows) return;
270
458
  this.#followBase = { x: 0, y: 0 };
271
459
  this.#applyFollow(0, 0);
272
460
  }
@@ -298,7 +486,8 @@ var PointerDragController = class _PointerDragController extends Controller {
298
486
  }
299
487
  this.#teardownSessions();
300
488
  }
301
- #onPointerDown = (event) => {
489
+ #onPointerDown = (rawEvent) => {
490
+ const event = rawEvent;
302
491
  if (this.disabledValue || this.#pointer || this.#keyboard || event.button !== 0) return;
303
492
  const handle = this.#handleFor(event.target);
304
493
  if (!handle) return;
@@ -353,13 +542,14 @@ var PointerDragController = class _PointerDragController extends Controller {
353
542
  }
354
543
  this.#dispatchCancel(pointerType);
355
544
  }
356
- #onKeydown = (event) => {
545
+ #onKeydown = (rawEvent) => {
546
+ const event = rawEvent;
357
547
  if (this.disabledValue) return;
358
548
  const handle = this.#handleFor(event.target);
359
549
  if (!handle) return;
360
550
  if (event.defaultPrevented) return;
361
551
  if (event.isComposing) return;
362
- if (this.#ownsNativeKeys(event.target, handle)) return;
552
+ if (this.#ownsNativeKeys(event.composedPath()[0] ?? event.target, handle)) return;
363
553
  if (isReservedArrowChord(event)) return;
364
554
  if (event.key === "Escape") {
365
555
  if (this.#pointer?.started) {
@@ -383,6 +573,7 @@ var PointerDragController = class _PointerDragController extends Controller {
383
573
  }
384
574
  if (!this.#keyboard) return;
385
575
  if (event.key === "Home" || event.key === "End") {
576
+ if (hasModifierChord(event)) return;
386
577
  event.preventDefault();
387
578
  return;
388
579
  }
@@ -404,9 +595,50 @@ var PointerDragController = class _PointerDragController extends Controller {
404
595
  }
405
596
  });
406
597
  };
598
+ #onFocusin = () => {
599
+ const session = this.#keyboard;
600
+ if (session) {
601
+ this.#watchShadowFocus(session.handle);
602
+ this.#checkKeyboardFocus(session);
603
+ }
604
+ };
605
+ #watchShadowFocus(handle) {
606
+ const tree = handle.getRootNode();
607
+ let active = tree.activeElement;
608
+ while (active?.shadowRoot) {
609
+ const shadow = active.shadowRoot;
610
+ this.#shadowFocus.add(shadow, "focusin", this.#onFocusin);
611
+ active = shadow.activeElement;
612
+ }
613
+ }
614
+ #onFocusout = (rawEvent) => {
615
+ const destination = rawEvent.relatedTarget;
616
+ const session = this.#keyboard;
617
+ if (session && this.#handleFor(destination) === session.handle && !this.#ownsNativeKeys(destination, session.handle)) {
618
+ return;
619
+ }
620
+ this.#checkKeyboardFocus(this.#keyboard);
621
+ };
622
+ #checkKeyboardFocus(session) {
623
+ this.#keyboardFocusSession = session;
624
+ this.#keyboardFocus.schedule();
625
+ }
626
+ #settleKeyboardFocus() {
627
+ const session = this.#keyboardFocusSession;
628
+ this.#keyboardFocusSession = null;
629
+ if (!session || this.#keyboard !== session || !this.element.isConnected) return;
630
+ const tree = session.handle.getRootNode();
631
+ const active = tree.activeElement ?? null;
632
+ if (this.#handleFor(active) === session.handle && !this.#ownsNativeKeys(active, session.handle)) {
633
+ return;
634
+ }
635
+ this.#clearKeyboardSession();
636
+ this.#dispatchCancel("keyboard");
637
+ }
407
638
  #grabKeyboard(handle) {
408
639
  this.#beginGesture();
409
640
  this.#keyboard = { handle, dx: 0, dy: 0 };
641
+ this.#watchShadowFocus(handle);
410
642
  this.element.setAttribute("data-grabbed", "true");
411
643
  handle.setAttribute("data-grabbed", "true");
412
644
  this.dispatch("start", { detail: { x: 0, y: 0, pointerType: "keyboard" } });
@@ -442,14 +674,17 @@ var PointerDragController = class _PointerDragController extends Controller {
442
674
  this.#pointer?.pointer?.end();
443
675
  }
444
676
  #clearKeyboardSession() {
677
+ this.#shadowFocus.dispose();
445
678
  this.#keyboard?.handle.removeAttribute("data-grabbed");
446
679
  this.#keyboard = null;
680
+ this.#keyboardFocusSession = null;
447
681
  this.element.removeAttribute("data-grabbed");
448
682
  }
449
683
  #teardown() {
450
684
  const interrupted = this.#pointer?.started ? this.#pointer.pointerType : this.#keyboard ? "keyboard" : null;
451
685
  this.#teardownSessions();
452
686
  for (const handle of this.#handles()) this.#restoreHandle(handle);
687
+ this.#tabindex.returnAll();
453
688
  if (interrupted) this.#followReset();
454
689
  if (interrupted && this.element.isConnected) this.#dispatchCancel(interrupted);
455
690
  }
@@ -530,14 +765,13 @@ var PointerDragController = class _PointerDragController extends Controller {
530
765
  handle.style.touchAction = lent;
531
766
  handle.setAttribute(_PointerDragController.#TOUCH_ACTION_MARKER, "true");
532
767
  }
533
- if (handle.tabIndex < 0 && !handle.hasAttribute("tabindex")) {
534
- handle.setAttribute("tabindex", "0");
535
- handle.setAttribute(_PointerDragController.#TABINDEX_MARKER, "true");
536
- }
768
+ this.#tabindex.lend(handle, { onlyIfUnfocusable: true });
537
769
  }
538
770
  #ownsNativeKeys(target, handle) {
539
- const owner = target?.closest(NATIVE_KEY_OWNERS) ?? null;
540
- return owner !== null && owner !== handle && handle.contains(owner);
771
+ let element = target;
772
+ while (element.shadowRoot?.activeElement) element = element.shadowRoot.activeElement;
773
+ const owner = closestInFlatTree(element, NATIVE_KEY_OWNERS);
774
+ return owner !== null && owner !== handle && flatTreeContains(handle, owner);
541
775
  }
542
776
  #restoreHandle(handle) {
543
777
  if (handle.hasAttribute(_PointerDragController.#TOUCH_ACTION_MARKER)) {
@@ -546,15 +780,7 @@ var PointerDragController = class _PointerDragController extends Controller {
546
780
  }
547
781
  handle.removeAttribute(_PointerDragController.#TOUCH_ACTION_MARKER);
548
782
  }
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
- }
783
+ this.#tabindex.return(handle);
558
784
  }
559
785
  get #safeThreshold() {
560
786
  return this.#numbers.read(