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
@@ -30,6 +30,107 @@ function isReservedArrowChord(event, allow = []) {
30
30
  if (!event.key.startsWith("Arrow")) return false;
31
31
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
32
32
  }
33
+ function hasModifierChord(event) {
34
+ return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
35
+ }
36
+
37
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
38
+ if (element.getAttribute(name) === value) return false;
39
+ beforeWrite?.();
40
+ if (value === null) element.removeAttribute(name);
41
+ else element.setAttribute(name, value);
42
+ return true;
43
+ }
44
+
45
+ var AuthoredMutationWatcher = class {
46
+ #onAuthored;
47
+ #claims = null;
48
+ #observer = null;
49
+ constructor(onAuthored) {
50
+ this.#onAuthored = onAuthored;
51
+ }
52
+ observe(root, options) {
53
+ this.disconnect();
54
+ const observer = new MutationObserver((records) => {
55
+ if (this.#observer !== observer) return;
56
+ const authored = this.#filter(records);
57
+ if (authored.length > 0) this.#onAuthored(authored);
58
+ });
59
+ this.#observer = observer;
60
+ this.#claims = { attributes: /* @__PURE__ */ new Map(), children: /* @__PURE__ */ new Map() };
61
+ observer.observe(root, {
62
+ attributes: true,
63
+ attributeFilter: [...options.attributes],
64
+ subtree: options.subtree ?? false,
65
+ childList: options.childList ?? false
66
+ });
67
+ if (options.ancestorAttributes) {
68
+ let ancestor = root.parentElement;
69
+ while (ancestor) {
70
+ observer.observe(ancestor, {
71
+ attributes: true,
72
+ attributeFilter: [...options.ancestorAttributes]
73
+ });
74
+ ancestor = ancestor.parentElement;
75
+ }
76
+ }
77
+ }
78
+ claim(target, name, value) {
79
+ const claims = this.#claims?.attributes;
80
+ let attributes = claims?.get(target);
81
+ if (!attributes) {
82
+ attributes = /* @__PURE__ */ new Map();
83
+ claims?.set(target, attributes);
84
+ }
85
+ const pending = attributes.get(name);
86
+ attributes.set(name, { value, count: (pending?.count ?? 0) + 1 });
87
+ }
88
+ claimCurrent(target, name) {
89
+ this.claim(target, name, target.getAttribute(name));
90
+ }
91
+ claimChildList(target, added, removed) {
92
+ const claims = this.#claims?.children;
93
+ const pending = claims?.get(target) ?? { added: /* @__PURE__ */ new Map(), removed: /* @__PURE__ */ new Map() };
94
+ for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) + 1);
95
+ for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) + 1);
96
+ claims?.set(target, pending);
97
+ }
98
+ take() {
99
+ return this.#filter(this.#observer?.takeRecords() ?? []);
100
+ }
101
+ disconnect() {
102
+ this.#observer?.disconnect();
103
+ this.#observer = null;
104
+ this.#claims = null;
105
+ }
106
+ #filter(records) {
107
+ const authored = records.filter((record) => !this.#consume(record));
108
+ this.#claims?.attributes.clear();
109
+ this.#claims?.children.clear();
110
+ return authored;
111
+ }
112
+ #consume(record) {
113
+ if (record.type === "attributes") {
114
+ const target = record.target;
115
+ const pending2 = this.#claims?.attributes.get(target)?.get(record.attributeName);
116
+ if (!pending2 || pending2.count === 0 || target.getAttribute(record.attributeName) !== pending2.value) {
117
+ return false;
118
+ }
119
+ pending2.count -= 1;
120
+ return true;
121
+ }
122
+ const pending = this.#claims?.children.get(record.target);
123
+ if (!pending) return false;
124
+ const added = [...record.addedNodes];
125
+ const removed = [...record.removedNodes];
126
+ if (added.some((node) => !pending.added.get(node)) || removed.some((node) => !pending.removed.get(node))) {
127
+ return false;
128
+ }
129
+ for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) - 1);
130
+ for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) - 1);
131
+ return true;
132
+ }
133
+ };
33
134
 
34
135
  function writeField(field, value) {
35
136
  if (field.value === value) return false;
@@ -111,6 +212,9 @@ var MicrotaskCoalescer = class {
111
212
  this.#queued = false;
112
213
  this.#generation += 1;
113
214
  }
215
+ get pending() {
216
+ return this.#queued;
217
+ }
114
218
  schedule() {
115
219
  if (!this.#active || this.#queued) return;
116
220
  this.#queued = true;
@@ -141,6 +245,9 @@ var MorphRenderWatcher = class {
141
245
  schedule() {
142
246
  this.#pass.schedule();
143
247
  }
248
+ get pending() {
249
+ return this.#pass.pending;
250
+ }
144
251
  disconnect() {
145
252
  this.#listeners.dispose();
146
253
  this.#pass.cancel();
@@ -262,19 +369,19 @@ function findTypeaheadMatch(items, from, query, label = (item) => typeaheadLabel
262
369
  }
263
370
 
264
371
  var OBSERVED_ATTRIBUTES = ["aria-selected", "data-value"];
265
- function setAttributeIfChanged(element, name, value) {
266
- if (element.getAttribute(name) !== value) element.setAttribute(name, value);
267
- }
268
372
  var NESTED_INTERACTIVE = INTERACTIVE_HOST_SELECTOR;
269
373
  var TreeViewController = class extends Controller {
270
374
  #moves = new MoveCounter();
375
+ #connectionGeneration = 0;
271
376
  static targets = ["item", "group", "field"];
272
377
  static actions = ["onKeydown", "select", "toggle"];
273
378
  static events = ["select", "toggle", "reconcile"];
274
379
  #roving = new RovingTabindex(() => this.itemTargets);
275
380
  #typeahead = new Typeahead();
276
381
  #reconcile = new MorphRenderWatcher(() => this.#reconcileSelection());
277
- #observer = null;
382
+ #observer = new AuthoredMutationWatcher((records) => {
383
+ if (this.#concernsItems(records)) this.#reconcile.schedule();
384
+ });
278
385
  #settled = { item: null, value: "" };
279
386
  #connected = false;
280
387
  #order = [];
@@ -293,9 +400,10 @@ var TreeViewController = class extends Controller {
293
400
  if (this.#focused === row && row.isConnected) this.#focused = null;
294
401
  });
295
402
  };
403
+ #listeners = new ListenerSet();
296
404
  connect() {
297
- this.element.addEventListener("focusin", this.#onFocusIn);
298
- this.element.addEventListener("focusout", this.#onFocusOut);
405
+ this.#listeners.add(this.element, "focusin", this.#onFocusIn);
406
+ this.#listeners.add(this.element, "focusout", this.#onFocusOut);
299
407
  this.#seedFocused();
300
408
  this.#reconcileExpansion();
301
409
  this.#normalizeSelection();
@@ -314,12 +422,11 @@ var TreeViewController = class extends Controller {
314
422
  this.#reconcile.schedule();
315
423
  }
316
424
  disconnect() {
317
- this.element.removeEventListener("focusin", this.#onFocusIn);
318
- this.element.removeEventListener("focusout", this.#onFocusOut);
425
+ this.#connectionGeneration += 1;
426
+ this.#listeners.dispose();
319
427
  this.#connected = false;
320
428
  this.#reconcile.disconnect();
321
- this.#observer?.disconnect();
322
- this.#observer = null;
429
+ this.#observer.disconnect();
323
430
  this.#typeahead.reset();
324
431
  this.#order = [];
325
432
  this.#focused = null;
@@ -337,7 +444,7 @@ var TreeViewController = class extends Controller {
337
444
  const items = this.itemTargets;
338
445
  const selected = items.find((item) => item.getAttribute("aria-selected") === "true");
339
446
  for (const item of items) {
340
- setAttributeIfChanged(item, "aria-selected", item === selected ? "true" : "false");
447
+ this.#writeSelection(item, item === selected ? "true" : "false");
341
448
  }
342
449
  }
343
450
  #mirrorField(notify) {
@@ -353,7 +460,7 @@ var TreeViewController = class extends Controller {
353
460
  this.#reconcileExpansion();
354
461
  this.#normalizeSelection();
355
462
  this.#normalizeTabStop();
356
- this.#dropOwnRecords();
463
+ this.#flushMutations();
357
464
  this.#mirrorField(false);
358
465
  this.#reportMove();
359
466
  }
@@ -364,22 +471,17 @@ var TreeViewController = class extends Controller {
364
471
  this.dispatch("reconcile", { detail: { item: selection.item } });
365
472
  }
366
473
  #observeItems() {
367
- const observer = new MutationObserver((records) => {
368
- if (this.#concernsItems(records)) this.#reconcile.schedule();
369
- });
370
- observer.observe(this.element, {
474
+ this.#observer.observe(this.element, {
371
475
  subtree: true,
372
- attributes: true,
373
- attributeFilter: OBSERVED_ATTRIBUTES
476
+ attributes: OBSERVED_ATTRIBUTES
374
477
  });
375
- this.#observer = observer;
376
478
  }
377
479
  #concernsItems(records) {
378
480
  const items = new Set(this.itemTargets);
379
481
  return records.some((record) => items.has(record.target));
380
482
  }
381
- #dropOwnRecords() {
382
- this.#observer?.takeRecords();
483
+ #flushMutations() {
484
+ if (this.#concernsItems(this.#observer.take())) this.#reconcile.schedule();
383
485
  }
384
486
  itemTargetDisconnected(item) {
385
487
  if (!this.#connected || !this.element.isConnected) return;
@@ -408,6 +510,7 @@ var TreeViewController = class extends Controller {
408
510
  onKeydown(event) {
409
511
  if (event.defaultPrevented) return;
410
512
  if (isReservedArrowChord(event)) return;
513
+ if ((event.key === "Home" || event.key === "End") && hasModifierChord(event)) return;
411
514
  if (event.isComposing) return;
412
515
  const item = this.#ownerItem(event);
413
516
  if (!item) return;
@@ -553,10 +656,11 @@ var TreeViewController = class extends Controller {
553
656
  }
554
657
  #select(item, reason = "user") {
555
658
  if (this.#isDisabled(item)) return;
659
+ const generation = this.#connectionGeneration;
556
660
  for (const candidate of this.itemTargets) {
557
- setAttributeIfChanged(candidate, "aria-selected", candidate === item ? "true" : "false");
661
+ this.#writeSelection(candidate, candidate === item ? "true" : "false");
558
662
  }
559
- this.#dropOwnRecords();
663
+ this.#flushMutations();
560
664
  const selection = this.#selection();
561
665
  const changed = selection.item !== this.#settled.item || selection.value !== this.#settled.value;
562
666
  this.#settled = selection;
@@ -566,7 +670,7 @@ var TreeViewController = class extends Controller {
566
670
  }
567
671
  const token = this.#moves.record();
568
672
  this.#mirrorField(true);
569
- if (!this.#moves.isLatest(token)) return;
673
+ if (generation !== this.#connectionGeneration || !this.#moves.isLatest(token)) return;
570
674
  this.dispatch("select", { detail: { item, reason } });
571
675
  }
572
676
  #setExpanded(item, group, expanded, reason = "user") {
@@ -631,7 +735,7 @@ var TreeViewController = class extends Controller {
631
735
  }
632
736
  const selected = visible.find((item) => item.getAttribute("aria-selected") === "true");
633
737
  const next = selected ?? visible[0];
634
- this.#roving.setActive(items.findIndex((item) => item === next));
738
+ this.#roving.setActive(items.indexOf(next));
635
739
  }
636
740
  get #visibleItems() {
637
741
  return this.itemTargets.filter((item) => {
@@ -664,6 +768,11 @@ var TreeViewController = class extends Controller {
664
768
  return text;
665
769
  });
666
770
  }
771
+ #writeSelection(target, value) {
772
+ setAttributeIfChanged(target, "aria-selected", value, () => {
773
+ this.#observer.claim(target, "aria-selected", value);
774
+ });
775
+ }
667
776
  };
668
777
 
669
778
  export { TreeViewController };