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
@@ -37,6 +37,107 @@ function isReservedArrowChord(event, allow = []) {
37
37
  if (!event.key.startsWith("Arrow")) return false;
38
38
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
39
39
  }
40
+ function hasModifierChord(event) {
41
+ return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
42
+ }
43
+
44
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
45
+ if (element.getAttribute(name) === value) return false;
46
+ beforeWrite?.();
47
+ if (value === null) element.removeAttribute(name);
48
+ else element.setAttribute(name, value);
49
+ return true;
50
+ }
51
+
52
+ var AuthoredMutationWatcher = class {
53
+ #onAuthored;
54
+ #claims = null;
55
+ #observer = null;
56
+ constructor(onAuthored) {
57
+ this.#onAuthored = onAuthored;
58
+ }
59
+ observe(root, options) {
60
+ this.disconnect();
61
+ const observer = new MutationObserver((records) => {
62
+ if (this.#observer !== observer) return;
63
+ const authored = this.#filter(records);
64
+ if (authored.length > 0) this.#onAuthored(authored);
65
+ });
66
+ this.#observer = observer;
67
+ this.#claims = { attributes: /* @__PURE__ */ new Map(), children: /* @__PURE__ */ new Map() };
68
+ observer.observe(root, {
69
+ attributes: true,
70
+ attributeFilter: [...options.attributes],
71
+ subtree: options.subtree ?? false,
72
+ childList: options.childList ?? false
73
+ });
74
+ if (options.ancestorAttributes) {
75
+ let ancestor = root.parentElement;
76
+ while (ancestor) {
77
+ observer.observe(ancestor, {
78
+ attributes: true,
79
+ attributeFilter: [...options.ancestorAttributes]
80
+ });
81
+ ancestor = ancestor.parentElement;
82
+ }
83
+ }
84
+ }
85
+ claim(target, name, value) {
86
+ const claims = this.#claims?.attributes;
87
+ let attributes = claims?.get(target);
88
+ if (!attributes) {
89
+ attributes = /* @__PURE__ */ new Map();
90
+ claims?.set(target, attributes);
91
+ }
92
+ const pending = attributes.get(name);
93
+ attributes.set(name, { value, count: (pending?.count ?? 0) + 1 });
94
+ }
95
+ claimCurrent(target, name) {
96
+ this.claim(target, name, target.getAttribute(name));
97
+ }
98
+ claimChildList(target, added, removed) {
99
+ const claims = this.#claims?.children;
100
+ const pending = claims?.get(target) ?? { added: /* @__PURE__ */ new Map(), removed: /* @__PURE__ */ new Map() };
101
+ for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) + 1);
102
+ for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) + 1);
103
+ claims?.set(target, pending);
104
+ }
105
+ take() {
106
+ return this.#filter(this.#observer?.takeRecords() ?? []);
107
+ }
108
+ disconnect() {
109
+ this.#observer?.disconnect();
110
+ this.#observer = null;
111
+ this.#claims = null;
112
+ }
113
+ #filter(records) {
114
+ const authored = records.filter((record) => !this.#consume(record));
115
+ this.#claims?.attributes.clear();
116
+ this.#claims?.children.clear();
117
+ return authored;
118
+ }
119
+ #consume(record) {
120
+ if (record.type === "attributes") {
121
+ const target = record.target;
122
+ const pending2 = this.#claims?.attributes.get(target)?.get(record.attributeName);
123
+ if (!pending2 || pending2.count === 0 || target.getAttribute(record.attributeName) !== pending2.value) {
124
+ return false;
125
+ }
126
+ pending2.count -= 1;
127
+ return true;
128
+ }
129
+ const pending = this.#claims?.children.get(record.target);
130
+ if (!pending) return false;
131
+ const added = [...record.addedNodes];
132
+ const removed = [...record.removedNodes];
133
+ if (added.some((node) => !pending.added.get(node)) || removed.some((node) => !pending.removed.get(node))) {
134
+ return false;
135
+ }
136
+ for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) - 1);
137
+ for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) - 1);
138
+ return true;
139
+ }
140
+ };
40
141
 
41
142
  function ownerIndex(candidates, node) {
42
143
  if (!(node instanceof Node)) return -1;
@@ -121,6 +222,9 @@ var MicrotaskCoalescer = class {
121
222
  this.#queued = false;
122
223
  this.#generation += 1;
123
224
  }
225
+ get pending() {
226
+ return this.#queued;
227
+ }
124
228
  schedule() {
125
229
  if (!this.#active || this.#queued) return;
126
230
  this.#queued = true;
@@ -151,6 +255,9 @@ var MorphRenderWatcher = class {
151
255
  schedule() {
152
256
  this.#pass.schedule();
153
257
  }
258
+ get pending() {
259
+ return this.#pass.pending;
260
+ }
154
261
  disconnect() {
155
262
  this.#listeners.dispose();
156
263
  this.#pass.cancel();
@@ -206,9 +313,9 @@ var ITEM_ATTRIBUTES = [
206
313
  "contenteditable",
207
314
  "controls"
208
315
  ];
209
- var hasModifier = (event) => event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
210
316
  var ToggleGroupController = class extends Controller {
211
317
  #moves = new MoveCounter();
318
+ #connectionGeneration = 0;
212
319
  static targets = ["item", "fields"];
213
320
  static values = {
214
321
  mode: { type: String, default: "multiple" },
@@ -221,13 +328,17 @@ var ToggleGroupController = class extends Controller {
221
328
  #handledEvents = /* @__PURE__ */ new WeakSet();
222
329
  #managedItems = /* @__PURE__ */ new Set();
223
330
  #originalTabindex = /* @__PURE__ */ new WeakMap();
224
- #ownedPressed = /* @__PURE__ */ new Set();
225
- #internalPressedValues = /* @__PURE__ */ new Map();
331
+ #ownedPressed = /* @__PURE__ */ new Map();
226
332
  #pass = new MorphRenderWatcher(() => this.#reconcileDom());
227
- #observer = null;
333
+ #observer = new AuthoredMutationWatcher((records) => {
334
+ this.#releaseAuthoredPressed(records);
335
+ this.#pass.schedule();
336
+ });
228
337
  #connected = false;
229
338
  #committedValues = [];
339
+ #listeners = new ListenerSet();
230
340
  connect() {
341
+ this.#releaseDefaultsRewrittenWhileAway();
231
342
  const currentItems = new Set(this.itemTargets);
232
343
  for (const item of this.#managedItems) {
233
344
  if (!currentItems.has(item)) this.#releaseItem(item);
@@ -241,26 +352,21 @@ var ToggleGroupController = class extends Controller {
241
352
  this.#ensureTabStop(preferred);
242
353
  this.#mirrorFields(false);
243
354
  this.#committedValues = this.#pressedValues();
244
- this.element.addEventListener("click", this.#onClickCapture, true);
245
- this.element.addEventListener("keydown", this.#onKeydownCapture, true);
246
- this.element.addEventListener("click", this.#onClick);
247
- this.element.addEventListener("keydown", this.#onKeydown);
248
- this.element.addEventListener("focusin", this.#onFocusin);
355
+ this.#listeners.add(this.element, "click", this.#onClickCapture, { capture: true });
356
+ this.#listeners.add(this.element, "keydown", this.#onKeydownCapture, { capture: true });
357
+ this.#listeners.add(this.element, "click", this.#onClick);
358
+ this.#listeners.add(this.element, "keydown", this.#onKeydown);
359
+ this.#listeners.add(this.element, "focusin", this.#onFocusin);
249
360
  this.#connected = true;
250
- this.#internalPressedValues.clear();
251
361
  this.#pass.observe(this.element);
252
362
  this.#observeMutations();
253
363
  }
254
364
  disconnect() {
365
+ this.#connectionGeneration += 1;
255
366
  this.#connected = false;
256
367
  this.#pass.disconnect();
257
- this.element.removeEventListener("click", this.#onClickCapture, true);
258
- this.element.removeEventListener("keydown", this.#onKeydownCapture, true);
259
- this.element.removeEventListener("click", this.#onClick);
260
- this.element.removeEventListener("keydown", this.#onKeydown);
261
- this.element.removeEventListener("focusin", this.#onFocusin);
262
- this.#observer?.disconnect();
263
- this.#observer = null;
368
+ this.#listeners.dispose();
369
+ this.#observer.disconnect();
264
370
  }
265
371
  itemTargetConnected(item) {
266
372
  if (!this.#connected) return;
@@ -327,7 +433,7 @@ var ToggleGroupController = class extends Controller {
327
433
  if (event.defaultPrevented || !this.#isSupportedHost(item)) return;
328
434
  if (event.isComposing) return;
329
435
  if (isReservedArrowChord(event)) return;
330
- if ((event.key === "Home" || event.key === "End") && hasModifier(event)) return;
436
+ if ((event.key === "Home" || event.key === "End") && hasModifierChord(event)) return;
331
437
  if (!this.#managedItems.has(item)) this.#reconcileHost(item, true);
332
438
  this.#ensureTabStop();
333
439
  const items = this.#managedTargets;
@@ -363,6 +469,7 @@ var ToggleGroupController = class extends Controller {
363
469
  }
364
470
  #toggleItem(item, reason = "user") {
365
471
  if (!this.#isSupportedHost(item) || this.#isActivationDisabled(item)) return;
472
+ const generation = this.#connectionGeneration;
366
473
  if (!this.#managedItems.has(item)) this.#reconcileHost(item, true);
367
474
  const willPress = !this.#isPressed(item);
368
475
  if (this.modeValue === "single") {
@@ -382,7 +489,7 @@ var ToggleGroupController = class extends Controller {
382
489
  }
383
490
  const token = this.#moves.record();
384
491
  this.#mirrorFields(true);
385
- if (!this.#moves.isLatest(token)) return;
492
+ if (generation !== this.#connectionGeneration || !this.#moves.isLatest(token)) return;
386
493
  this.dispatch("change", {
387
494
  detail: { value: this.#itemValue(item), pressed: willPress, values: [...values], reason }
388
495
  });
@@ -390,22 +497,21 @@ var ToggleGroupController = class extends Controller {
390
497
  #mirrorFields(notify) {
391
498
  if (!this.hasFieldsTarget) return;
392
499
  const options = { name: this.nameValue, form: this.formValue };
393
- if (writeFields(this.fieldsTarget, this.#pressedValues(), options) && notify) {
394
- commitField(this.fieldsTarget);
395
- }
500
+ const removed = [...this.fieldsTarget.childNodes];
501
+ const changed = writeFields(this.fieldsTarget, this.#pressedValues(), options);
502
+ if (changed)
503
+ this.#observer.claimChildList(this.fieldsTarget, [...this.fieldsTarget.childNodes], removed);
504
+ if (changed && notify) commitField(this.fieldsTarget);
396
505
  }
397
506
  #reconcileDom() {
398
- const observer = this.#observer;
399
- if (observer) {
400
- this.#releaseAuthoredPressed(observer.takeRecords());
401
- observer.disconnect();
402
- }
507
+ this.#releaseAuthoredPressed(this.#observer.take());
403
508
  for (const item of this.itemTargets) this.#reconcileHost(item, true);
404
509
  this.#normalizeSelection();
405
510
  this.#ensureTabStop();
406
511
  this.#mirrorFields(false);
407
- this.#internalPressedValues.clear();
408
- if (observer) this.#observeWith(observer);
512
+ const authored = this.#observer.take();
513
+ this.#releaseAuthoredPressed(authored);
514
+ if (authored.length > 0) this.#pass.schedule();
409
515
  this.#reportMove();
410
516
  }
411
517
  #reportMove() {
@@ -434,16 +540,15 @@ var ToggleGroupController = class extends Controller {
434
540
  const original = this.#originalTabindex.get(item);
435
541
  if (original === null) item.removeAttribute("tabindex");
436
542
  else if (original !== void 0) item.setAttribute("tabindex", original);
437
- if (this.#ownedPressed.delete(item)) item.removeAttribute("aria-pressed");
543
+ if (this.#ownedPressed.delete(item)) this.#writePressed(item, null);
438
544
  }
439
545
  #normalizePressed(item) {
440
546
  const value = item.getAttribute("aria-pressed");
441
547
  if (value === null) {
442
- this.#ownedPressed.add(item);
443
- this.#internalPressedValues.set(item, "false");
444
- item.setAttribute("aria-pressed", "false");
548
+ this.#ownedPressed.set(item, "false");
549
+ this.#writePressed(item, "false");
445
550
  } else if (value !== "true" && value !== "false") {
446
- item.setAttribute("aria-pressed", "false");
551
+ this.#writePressed(item, "false");
447
552
  }
448
553
  }
449
554
  #normalizeSelection() {
@@ -521,34 +626,23 @@ var ToggleGroupController = class extends Controller {
521
626
  if (record.attributeName !== "aria-pressed") continue;
522
627
  const item = record.target;
523
628
  const value = item.getAttribute("aria-pressed");
524
- if (value !== null && this.#internalPressedValues.get(item) !== value) {
629
+ if (value !== null) {
525
630
  this.#ownedPressed.delete(item);
526
631
  }
527
632
  }
528
- this.#internalPressedValues.clear();
529
633
  }
530
634
  #observeMutations() {
531
- const observer = new MutationObserver((records) => {
532
- this.#releaseAuthoredPressed(records);
533
- this.#pass.schedule();
534
- });
535
- this.#observer = observer;
536
- this.#observeWith(observer);
537
- }
538
- #observeWith(observer) {
539
- observer.observe(this.element, {
635
+ this.#observer.observe(this.element, {
540
636
  subtree: true,
541
637
  childList: true,
542
- attributes: true,
543
- attributeFilter: ITEM_ATTRIBUTES
638
+ attributes: ITEM_ATTRIBUTES,
639
+ ancestorAttributes: ["contenteditable", "disabled"]
544
640
  });
545
- let ancestor = this.element.parentElement;
546
- while (ancestor) {
547
- observer.observe(ancestor, {
548
- attributes: true,
549
- attributeFilter: ["contenteditable", "disabled"]
550
- });
551
- ancestor = ancestor.parentElement;
641
+ }
642
+ #releaseDefaultsRewrittenWhileAway() {
643
+ for (const [item, written] of this.#ownedPressed) {
644
+ const current = item.getAttribute("aria-pressed");
645
+ if (current !== null && current !== written) this.#ownedPressed.delete(item);
552
646
  }
553
647
  }
554
648
  get #managedTargets() {
@@ -562,8 +656,8 @@ var ToggleGroupController = class extends Controller {
562
656
  }
563
657
  #setPressed(item, pressed) {
564
658
  const value = pressed ? "true" : "false";
565
- this.#internalPressedValues.set(item, value);
566
- item.setAttribute("aria-pressed", value);
659
+ if (this.#ownedPressed.has(item)) this.#ownedPressed.set(item, value);
660
+ this.#writePressed(item, value);
567
661
  }
568
662
  #pressedValues() {
569
663
  return this.#managedTargets.filter((item) => this.#isPressed(item)).map((item) => this.#itemValue(item));
@@ -571,6 +665,14 @@ var ToggleGroupController = class extends Controller {
571
665
  #itemValue(item) {
572
666
  return item.getAttribute("data-value") ?? "";
573
667
  }
668
+ #writePressed(item, value) {
669
+ setAttributeIfChanged(
670
+ item,
671
+ "aria-pressed",
672
+ value,
673
+ () => this.#observer.claim(item, "aria-pressed", value)
674
+ );
675
+ }
574
676
  };
575
677
 
576
678
  export { ToggleGroupController };