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
@@ -1,5 +1,103 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
4
+ if (element.getAttribute(name) === value) return false;
5
+ beforeWrite?.();
6
+ if (value === null) element.removeAttribute(name);
7
+ else element.setAttribute(name, value);
8
+ return true;
9
+ }
10
+
11
+ var AuthoredMutationWatcher = class {
12
+ #onAuthored;
13
+ #claims = null;
14
+ #observer = null;
15
+ constructor(onAuthored) {
16
+ this.#onAuthored = onAuthored;
17
+ }
18
+ observe(root, options) {
19
+ this.disconnect();
20
+ const observer = new MutationObserver((records) => {
21
+ if (this.#observer !== observer) return;
22
+ const authored = this.#filter(records);
23
+ if (authored.length > 0) this.#onAuthored(authored);
24
+ });
25
+ this.#observer = observer;
26
+ this.#claims = { attributes: /* @__PURE__ */ new Map(), children: /* @__PURE__ */ new Map() };
27
+ observer.observe(root, {
28
+ attributes: true,
29
+ attributeFilter: [...options.attributes],
30
+ subtree: options.subtree ?? false,
31
+ childList: options.childList ?? false
32
+ });
33
+ if (options.ancestorAttributes) {
34
+ let ancestor = root.parentElement;
35
+ while (ancestor) {
36
+ observer.observe(ancestor, {
37
+ attributes: true,
38
+ attributeFilter: [...options.ancestorAttributes]
39
+ });
40
+ ancestor = ancestor.parentElement;
41
+ }
42
+ }
43
+ }
44
+ claim(target, name, value) {
45
+ const claims = this.#claims?.attributes;
46
+ let attributes = claims?.get(target);
47
+ if (!attributes) {
48
+ attributes = /* @__PURE__ */ new Map();
49
+ claims?.set(target, attributes);
50
+ }
51
+ const pending = attributes.get(name);
52
+ attributes.set(name, { value, count: (pending?.count ?? 0) + 1 });
53
+ }
54
+ claimCurrent(target, name) {
55
+ this.claim(target, name, target.getAttribute(name));
56
+ }
57
+ claimChildList(target, added, removed) {
58
+ const claims = this.#claims?.children;
59
+ const pending = claims?.get(target) ?? { added: /* @__PURE__ */ new Map(), removed: /* @__PURE__ */ new Map() };
60
+ for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) + 1);
61
+ for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) + 1);
62
+ claims?.set(target, pending);
63
+ }
64
+ take() {
65
+ return this.#filter(this.#observer?.takeRecords() ?? []);
66
+ }
67
+ disconnect() {
68
+ this.#observer?.disconnect();
69
+ this.#observer = null;
70
+ this.#claims = null;
71
+ }
72
+ #filter(records) {
73
+ const authored = records.filter((record) => !this.#consume(record));
74
+ this.#claims?.attributes.clear();
75
+ this.#claims?.children.clear();
76
+ return authored;
77
+ }
78
+ #consume(record) {
79
+ if (record.type === "attributes") {
80
+ const target = record.target;
81
+ const pending2 = this.#claims?.attributes.get(target)?.get(record.attributeName);
82
+ if (!pending2 || pending2.count === 0 || target.getAttribute(record.attributeName) !== pending2.value) {
83
+ return false;
84
+ }
85
+ pending2.count -= 1;
86
+ return true;
87
+ }
88
+ const pending = this.#claims?.children.get(record.target);
89
+ if (!pending) return false;
90
+ const added = [...record.addedNodes];
91
+ const removed = [...record.removedNodes];
92
+ if (added.some((node) => !pending.added.get(node)) || removed.some((node) => !pending.removed.get(node))) {
93
+ return false;
94
+ }
95
+ for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) - 1);
96
+ for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) - 1);
97
+ return true;
98
+ }
99
+ };
100
+
3
101
  function ownerIndex(candidates, node) {
4
102
  if (!(node instanceof Node)) return -1;
5
103
  return candidates.findIndex((candidate) => candidate.contains(node));
@@ -32,6 +130,11 @@ function canTakeFocus(element) {
32
130
  if (element.disabled) return false;
33
131
  return !inheritsFieldsetDisabled(element);
34
132
  }
133
+ function deepActiveElement(ownerDocument) {
134
+ let active = ownerDocument.activeElement;
135
+ while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;
136
+ return active;
137
+ }
35
138
 
36
139
  var FormResetWatcher = class {
37
140
  #owns;
@@ -100,6 +203,9 @@ var MicrotaskCoalescer = class {
100
203
  this.#queued = false;
101
204
  this.#generation += 1;
102
205
  }
206
+ get pending() {
207
+ return this.#queued;
208
+ }
103
209
  schedule() {
104
210
  if (!this.#active || this.#queued) return;
105
211
  this.#queued = true;
@@ -130,6 +236,9 @@ var MorphRenderWatcher = class {
130
236
  schedule() {
131
237
  this.#pass.schedule();
132
238
  }
239
+ get pending() {
240
+ return this.#pass.pending;
241
+ }
133
242
  disconnect() {
134
243
  this.#listeners.dispose();
135
244
  this.#pass.cancel();
@@ -163,6 +272,9 @@ function sharedRegistry(key, create) {
163
272
  return registry;
164
273
  }
165
274
 
275
+ function holdsFocus(element) {
276
+ return element.matches(":focus") || deepActiveElement(element.ownerDocument) === element;
277
+ }
166
278
  var TabindexLoan = class _TabindexLoan {
167
279
  static #registry = sharedRegistry(
168
280
  "stimeo-ui.tabindex-loan.registry.v1",
@@ -170,19 +282,22 @@ var TabindexLoan = class _TabindexLoan {
170
282
  );
171
283
  #value;
172
284
  #record;
285
+ #preserveFocus;
173
286
  #lent = /* @__PURE__ */ new Set();
174
- constructor(value, owner) {
287
+ constructor(value, owner, options = {}) {
175
288
  this.#value = value;
176
289
  this.#record = `data-${owner}-tabindex-loan`;
290
+ this.#preserveFocus = options.preserveFocus === true;
177
291
  _TabindexLoan.#registry.names.add(this.#record);
178
292
  }
179
- lend(element) {
293
+ lend(element, options = {}) {
180
294
  const stack = this.#stack(element);
181
295
  const current = element.getAttribute("tabindex");
182
296
  const held = stack.find((hold) => hold.loan === this) ?? stack.find(
183
297
  (hold) => hold.loan === null && hold.record === this.#record && hold.value === this.#value
184
298
  );
185
299
  const linked = stack.at(-1)?.value === current;
300
+ if (!held && options.onlyIfUnfocusable && (current !== null || element.tabIndex >= 0)) return;
186
301
  if (!held && current !== null && !linked) return;
187
302
  this.#lent.add(element);
188
303
  if (held) held.loan = this;
@@ -192,19 +307,28 @@ var TabindexLoan = class _TabindexLoan {
192
307
  element.setAttribute("tabindex", this.#value);
193
308
  }
194
309
  }
195
- returnAll() {
196
- for (const element of this.#lent) {
197
- const stack = this.#stack(element);
198
- const hold = stack.find((held) => held.loan === this);
199
- if (hold) this.#release(element, stack, hold);
310
+ return(element) {
311
+ const stack = this.#stack(element);
312
+ const hold = stack.find((held) => held.loan === this) ?? stack.find(
313
+ (held) => held.loan === null && held.record === this.#record && held.value === this.#value
314
+ );
315
+ if (!hold) return false;
316
+ if (!this.#release(element, stack, hold, this.#preserveFocus)) {
317
+ hold.loan = this;
318
+ this.#lent.add(element);
319
+ return false;
200
320
  }
201
- this.#lent.clear();
321
+ this.#lent.delete(element);
322
+ return true;
323
+ }
324
+ returnAll() {
325
+ for (const element of Array.from(this.#lent)) this.return(element);
202
326
  }
203
327
  reclaim(element) {
204
328
  if (element.getAttribute(this.#record) !== this.#value) return;
205
329
  const stack = this.#stack(element);
206
330
  const hold = stack.find((held) => held.loan === null && held.record === this.#record);
207
- if (hold && !element.matches(":focus")) this.#release(element, stack, hold);
331
+ if (hold && !holdsFocus(element)) this.#release(element, stack, hold);
208
332
  }
209
333
  reclaimWithin(root) {
210
334
  for (const element of queryOpenDescendants(root, `[${this.#record}]`)) {
@@ -228,26 +352,26 @@ var TabindexLoan = class _TabindexLoan {
228
352
  for (const [index, hold] of holds.entries()) hold.linked = index > 0;
229
353
  return holds;
230
354
  }
231
- #release(element, stack, hold) {
355
+ #release(element, stack, hold, preserveFocus = false) {
232
356
  const current = element.getAttribute("tabindex");
233
357
  const index = stack.indexOf(hold);
234
358
  const owns = current === hold.value && !stack.slice(index + 1).some((above2) => above2.value === current);
359
+ if (owns && preserveFocus && holdsFocus(element)) return false;
235
360
  stack.splice(index, 1);
236
361
  const above = stack[index];
237
362
  if (above) above.linked &&= hold.linked;
238
363
  this.#mark(element, stack);
239
- if (!owns) return;
364
+ if (!owns) return true;
240
365
  const below = hold.linked ? stack[index - 1] : void 0;
241
366
  if (!below) element.removeAttribute("tabindex");
242
367
  else if (below.value !== current) element.setAttribute("tabindex", below.value);
368
+ return true;
243
369
  }
244
370
  #mark(element, stack) {
245
371
  const records = /* @__PURE__ */ new Map([[this.#record, null]]);
246
372
  for (const hold of stack) records.set(hold.record, hold.value);
247
373
  for (const [name, recorded] of records) {
248
- if (element.getAttribute(name) === recorded) continue;
249
- if (recorded === null) element.removeAttribute(name);
250
- else element.setAttribute(name, recorded);
374
+ setAttributeIfChanged(element, name, recorded);
251
375
  }
252
376
  }
253
377
  };
@@ -277,8 +401,6 @@ var ConditionalFieldsController = class extends Controller {
277
401
  static actions = ["evaluate"];
278
402
  static events = ["change", "reconcile"];
279
403
  #lastVisible = /* @__PURE__ */ new WeakMap();
280
- #internalWrites = /* @__PURE__ */ new WeakMap();
281
- #observing = false;
282
404
  #departed = /* @__PURE__ */ new Set();
283
405
  #concealed = /* @__PURE__ */ new WeakSet();
284
406
  #reconcile = new MorphRenderWatcher(() => this.#reconcileDom());
@@ -288,7 +410,7 @@ var ConditionalFieldsController = class extends Controller {
288
410
  () => this.#reconcile.schedule()
289
411
  );
290
412
  #rootTabindex = new TabindexLoan("-1", this.identifier);
291
- #observer = new MutationObserver((records) => this.#onMutations(records));
413
+ #observer = new AuthoredMutationWatcher((records) => this.#onMutations(records));
292
414
  #onTriggerInput = (event) => {
293
415
  const target = event.target;
294
416
  const triggers = this.triggerTargets;
@@ -299,23 +421,19 @@ var ConditionalFieldsController = class extends Controller {
299
421
  connect() {
300
422
  this.#rootTabindex.reclaim(this.element);
301
423
  this.#lastVisible = /* @__PURE__ */ new WeakMap();
302
- this.#internalWrites = /* @__PURE__ */ new WeakMap();
303
424
  this.#settle();
304
425
  this.#reconcile.observe(this.element);
305
426
  this.#observer.observe(this.element, {
306
- attributes: true,
307
- attributeFilter: OBSERVED_ATTRIBUTES,
427
+ attributes: OBSERVED_ATTRIBUTES,
308
428
  childList: true,
309
429
  subtree: true
310
430
  });
311
- this.#observing = true;
312
431
  this.#listeners.add(this.element, "change", this.#onTriggerInput);
313
432
  this.#listeners.add(this.element, "input", this.#onTriggerInput);
314
433
  this.#formReset.observe();
315
434
  }
316
435
  disconnect() {
317
436
  this.#reconcile.disconnect();
318
- this.#observing = false;
319
437
  this.#observer.disconnect();
320
438
  this.#listeners.dispose();
321
439
  this.#formReset.disconnect();
@@ -468,47 +586,16 @@ var ConditionalFieldsController = class extends Controller {
468
586
  return [...plan].every(([region, visible]) => visible || !region.contains(candidate));
469
587
  }
470
588
  #writeAttribute(element, name, value) {
471
- if (element.getAttribute(name) !== value) {
472
- if (this.#observing) {
473
- let writes = this.#internalWrites.get(element);
474
- if (!writes) {
475
- writes = /* @__PURE__ */ new Map();
476
- this.#internalWrites.set(element, writes);
477
- }
478
- writes.set(name, value);
479
- }
480
- if (value === null) element.removeAttribute(name);
481
- else element.setAttribute(name, value);
482
- }
589
+ setAttributeIfChanged(element, name, value, () => this.#observer.claim(element, name, value));
483
590
  }
484
591
  #onMutations(records) {
485
592
  const triggers = this.triggerTargets;
486
593
  const regions = this.regionTargets;
487
- const touchedWrites = /* @__PURE__ */ new Map();
488
- let needsReconcile = false;
489
- for (const record of records) {
490
- if (record.type === "attributes" && record.target instanceof Element) {
491
- const name = record.attributeName;
492
- const writes = this.#internalWrites.get(record.target);
493
- if (name && writes?.has(name)) {
494
- let names = touchedWrites.get(record.target);
495
- if (!names) {
496
- names = /* @__PURE__ */ new Set();
497
- touchedWrites.set(record.target, names);
498
- }
499
- names.add(name);
500
- if (record.target.getAttribute(name) === writes.get(name)) continue;
501
- }
502
- }
503
- if (record.target instanceof Element && this.#elementAffectsState(record.target, triggers, regions)) {
504
- needsReconcile = true;
505
- }
506
- }
507
- for (const [element, names] of touchedWrites) {
508
- const writes = this.#internalWrites.get(element);
509
- for (const name of names) writes?.delete(name);
594
+ if (records.some(
595
+ (record) => record.target instanceof Element && this.#elementAffectsState(record.target, triggers, regions)
596
+ )) {
597
+ this.#reconcile.schedule();
510
598
  }
511
- if (needsReconcile) this.#reconcile.schedule();
512
599
  }
513
600
  #elementAffectsState(target, triggers, regions) {
514
601
  return ownerIndex(triggers, target) !== -1 || ownerIndex(regions, target) !== -1;