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
@@ -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;
@@ -108,6 +209,9 @@ var MicrotaskCoalescer = class {
108
209
  this.#queued = false;
109
210
  this.#generation += 1;
110
211
  }
212
+ get pending() {
213
+ return this.#queued;
214
+ }
111
215
  schedule() {
112
216
  if (!this.#active || this.#queued) return;
113
217
  this.#queued = true;
@@ -138,6 +242,9 @@ var MorphRenderWatcher = class {
138
242
  schedule() {
139
243
  this.#pass.schedule();
140
244
  }
245
+ get pending() {
246
+ return this.#pass.pending;
247
+ }
141
248
  disconnect() {
142
249
  this.#listeners.dispose();
143
250
  this.#pass.cancel();
@@ -197,9 +304,9 @@ var OBSERVED_ATTRIBUTES = [
197
304
  "type",
198
305
  "value"
199
306
  ];
200
- var hasModifier = (event) => event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
201
307
  var RadioGroupController = class extends Controller {
202
308
  #moves = new MoveCounter();
309
+ #connectionGeneration = 0;
203
310
  #moveToken = 0;
204
311
  static targets = ["radio", "field"];
205
312
  static actions = ["onKeydown", "select"];
@@ -209,17 +316,20 @@ var RadioGroupController = class extends Controller {
209
316
  #handledEvents = /* @__PURE__ */ new WeakSet();
210
317
  #managedRadios = /* @__PURE__ */ new Set();
211
318
  #originalTabindex = /* @__PURE__ */ new Map();
212
- #ownedChecked = /* @__PURE__ */ new Set();
213
- #internalCheckedValues = /* @__PURE__ */ new Map();
214
- #internalTabindexValues = /* @__PURE__ */ new Map();
215
- #observer = null;
319
+ #ownedChecked = /* @__PURE__ */ new Map();
320
+ #writtenTabindex = /* @__PURE__ */ new WeakMap();
321
+ #observer = new AuthoredMutationWatcher(
322
+ (records) => this.#handleMutationRecords(records)
323
+ );
216
324
  #committed = NO_SELECTION;
217
325
  #connected = false;
218
326
  #lastOrder = [];
219
327
  #focusedRadio = null;
220
328
  #pendingFocusIndex = null;
221
329
  #preferChecked = false;
330
+ #listeners = new ListenerSet();
222
331
  connect() {
332
+ this.#releaseDefaultsRewrittenWhileAway();
223
333
  const currentRadios = new Set(this.radioTargets);
224
334
  for (const radio of this.#managedRadios) {
225
335
  if (!currentRadios.has(radio)) this.#releaseRadio(radio);
@@ -230,30 +340,23 @@ var RadioGroupController = class extends Controller {
230
340
  this.#reflectField(this.#selectedRadio);
231
341
  this.#committed = this.#settled;
232
342
  this.#lastOrder = this.#managedTargets;
233
- this.element.addEventListener("click", this.#onClickCapture, true);
234
- this.element.addEventListener("keydown", this.#onKeydownCapture, true);
235
- this.element.addEventListener("click", this.#onClick);
236
- this.element.addEventListener("keydown", this.#onKeydown);
237
- this.element.addEventListener("focusin", this.#onFocusin);
238
- this.element.addEventListener("focusout", this.#onFocusout);
343
+ this.#listeners.add(this.element, "click", this.#onClickCapture, { capture: true });
344
+ this.#listeners.add(this.element, "keydown", this.#onKeydownCapture, { capture: true });
345
+ this.#listeners.add(this.element, "click", this.#onClick);
346
+ this.#listeners.add(this.element, "keydown", this.#onKeydown);
347
+ this.#listeners.add(this.element, "focusin", this.#onFocusin);
348
+ this.#listeners.add(this.element, "focusout", this.#onFocusout);
239
349
  this.#connected = true;
240
350
  this.#preferChecked = false;
241
- this.#internalCheckedValues.clear();
242
- this.#internalTabindexValues.clear();
243
351
  this.#reconcile.observe(this.element);
244
352
  this.#observeMutations();
245
353
  }
246
354
  disconnect() {
355
+ this.#connectionGeneration += 1;
247
356
  this.#connected = false;
248
357
  this.#reconcile.disconnect();
249
- this.element.removeEventListener("click", this.#onClickCapture, true);
250
- this.element.removeEventListener("keydown", this.#onKeydownCapture, true);
251
- this.element.removeEventListener("click", this.#onClick);
252
- this.element.removeEventListener("keydown", this.#onKeydown);
253
- this.element.removeEventListener("focusin", this.#onFocusin);
254
- this.element.removeEventListener("focusout", this.#onFocusout);
255
- this.#observer?.disconnect();
256
- this.#observer = null;
358
+ this.#listeners.dispose();
359
+ this.#observer.disconnect();
257
360
  this.#focusedRadio = null;
258
361
  this.#pendingFocusIndex = null;
259
362
  this.#committed = NO_SELECTION;
@@ -338,7 +441,7 @@ var RadioGroupController = class extends Controller {
338
441
  #handleKeydown(event, radio) {
339
442
  if (event.defaultPrevented || !this.#isSupportedHost(radio)) return;
340
443
  if (event.isComposing || isReservedArrowChord(event)) return;
341
- if ((event.key === "Home" || event.key === "End") && hasModifier(event)) return;
444
+ if ((event.key === "Home" || event.key === "End") && hasModifierChord(event)) return;
342
445
  if (event.key === " ") {
343
446
  if (this.#isActivationDisabled(radio)) {
344
447
  event.preventDefault();
@@ -374,6 +477,7 @@ var RadioGroupController = class extends Controller {
374
477
  }
375
478
  #selectRadio(radio, { focus }, reason = "user") {
376
479
  if (!this.#isSupportedHost(radio) || this.#isActivationDisabled(radio)) return;
480
+ const generation = this.#connectionGeneration;
377
481
  const value = this.#radioValue(radio);
378
482
  const changed = this.#committed.radio !== radio || this.#committed.value !== value;
379
483
  for (const item of this.#managedTargets) this.#setChecked(item, item === radio);
@@ -381,17 +485,18 @@ var RadioGroupController = class extends Controller {
381
485
  if (changed) this.#moveToken = this.#moves.record();
382
486
  const token = this.#moveToken;
383
487
  this.#setActive(radio);
384
- const fieldChanged = this.hasFieldTarget && writeField(this.fieldTarget, value);
488
+ const fieldChanged = this.#writeField(value);
489
+ this.#handleMutationRecords(this.#observer.take());
385
490
  if (focus) radio.focus();
386
- if (!this.#connected || !this.#moves.isLatest(token)) return;
491
+ if (generation !== this.#connectionGeneration || !this.#connected || !this.#moves.isLatest(token))
492
+ return;
387
493
  if (changed && fieldChanged) commitField(this.fieldTarget);
388
- if (changed && this.#moves.isLatest(token)) {
494
+ if (changed && generation === this.#connectionGeneration && this.#connected && this.#moves.isLatest(token)) {
389
495
  this.dispatch("change", { detail: { value, radio, reason } });
390
496
  }
391
497
  }
392
498
  #reconcileDom() {
393
- const observer = this.#observer;
394
- this.#handleMutationRecords(observer?.takeRecords() ?? []);
499
+ this.#handleMutationRecords(this.#observer.take());
395
500
  for (const radio of this.radioTargets) this.#reconcileHost(radio, true);
396
501
  this.#normalizeSelection();
397
502
  const pendingFocusIndex = this.#pendingFocusIndex;
@@ -406,9 +511,7 @@ var RadioGroupController = class extends Controller {
406
511
  this.#reflectField(this.#selectedRadio);
407
512
  this.#lastOrder = this.#managedTargets;
408
513
  this.#preferChecked = false;
409
- observer?.takeRecords();
410
- this.#internalCheckedValues.clear();
411
- this.#internalTabindexValues.clear();
514
+ this.#handleMutationRecords(this.#observer.take());
412
515
  const settled = this.#settled;
413
516
  const committed = this.#committed;
414
517
  const changed = settled.radio !== committed.radio || settled.value !== committed.value;
@@ -436,22 +539,19 @@ var RadioGroupController = class extends Controller {
436
539
  this.#managedRadios.delete(radio);
437
540
  const original = this.#originalTabindex.get(radio);
438
541
  if (original === null) {
439
- this.#markInternal(this.#internalTabindexValues, radio, null);
440
- radio.removeAttribute("tabindex");
542
+ this.#writeAttribute(radio, "tabindex", null);
441
543
  } else if (original !== void 0) {
442
- this.#markInternal(this.#internalTabindexValues, radio, original);
443
- radio.setAttribute("tabindex", original);
544
+ this.#writeAttribute(radio, "tabindex", original);
444
545
  }
445
546
  this.#originalTabindex.delete(radio);
446
547
  if (this.#ownedChecked.delete(radio)) {
447
- this.#markInternal(this.#internalCheckedValues, radio, null);
448
- radio.removeAttribute("aria-checked");
548
+ this.#writeAttribute(radio, "aria-checked", null);
449
549
  }
450
550
  }
451
551
  #normalizeChecked(radio) {
452
552
  const value = radio.getAttribute("aria-checked");
453
553
  if (value === null) {
454
- this.#ownedChecked.add(radio);
554
+ this.#ownedChecked.set(radio, "false");
455
555
  this.#setChecked(radio, false);
456
556
  } else if (value !== "true" && value !== "false") {
457
557
  this.#setChecked(radio, false);
@@ -506,7 +606,8 @@ var RadioGroupController = class extends Controller {
506
606
  const index = items.indexOf(radio);
507
607
  this.#roving.setActive(index);
508
608
  for (const item of items) {
509
- this.#markInternal(this.#internalTabindexValues, item, item.getAttribute("tabindex"));
609
+ this.#observer.claimCurrent(item, "tabindex");
610
+ this.#writtenTabindex.set(item, item.getAttribute("tabindex"));
510
611
  }
511
612
  if (focus) radio?.focus();
512
613
  }
@@ -549,58 +650,36 @@ var RadioGroupController = class extends Controller {
549
650
  const target = record.target;
550
651
  const attribute = record.attributeName;
551
652
  if (attribute === "aria-checked") {
552
- const value = target.getAttribute(attribute);
553
- if (this.#matchesInternal(this.#internalCheckedValues, target, value)) continue;
554
653
  this.#ownedChecked.delete(target);
555
654
  this.#preferChecked = true;
556
655
  external = true;
557
656
  } else if (attribute === "tabindex") {
558
657
  const value = target.getAttribute(attribute);
559
- if (this.#matchesInternal(this.#internalTabindexValues, target, value)) continue;
560
658
  if (this.#managedRadios.has(target)) this.#originalTabindex.set(target, value);
561
659
  external = true;
562
660
  } else {
563
661
  external = true;
564
662
  }
565
663
  }
566
- this.#internalTabindexValues.clear();
567
664
  if (external) this.#reconcile.schedule();
568
665
  }
569
- #markInternal(values, target, value) {
570
- const pending = values.get(target);
571
- if (pending) {
572
- pending.value = value;
573
- pending.count += 1;
574
- } else {
575
- values.set(target, { value, count: 1 });
576
- }
577
- }
578
- #matchesInternal(values, target, value) {
579
- const pending = values.get(target);
580
- if (!pending || pending.value !== value) return false;
581
- pending.count -= 1;
582
- if (pending.count === 0) values.delete(target);
583
- return true;
584
- }
585
666
  #observeMutations() {
586
- const observer = new MutationObserver((records) => this.#handleMutationRecords(records));
587
- this.#observer = observer;
588
- this.#observeWith(observer);
589
- }
590
- #observeWith(observer) {
591
- observer.observe(this.element, {
667
+ this.#observer.observe(this.element, {
592
668
  subtree: true,
593
669
  childList: true,
594
- attributes: true,
595
- attributeFilter: OBSERVED_ATTRIBUTES
670
+ attributes: OBSERVED_ATTRIBUTES,
671
+ ancestorAttributes: ["contenteditable", "disabled"]
596
672
  });
597
- let ancestor = this.element.parentElement;
598
- while (ancestor) {
599
- observer.observe(ancestor, {
600
- attributes: true,
601
- attributeFilter: ["contenteditable", "disabled"]
602
- });
603
- ancestor = ancestor.parentElement;
673
+ }
674
+ #releaseDefaultsRewrittenWhileAway() {
675
+ for (const [radio, written] of this.#ownedChecked) {
676
+ const current = radio.getAttribute("aria-checked");
677
+ if (current !== null && current !== written) this.#ownedChecked.delete(radio);
678
+ }
679
+ for (const radio of this.#managedRadios) {
680
+ const written = this.#writtenTabindex.get(radio);
681
+ const current = radio.getAttribute("tabindex");
682
+ if (current !== written) this.#originalTabindex.set(radio, current);
604
683
  }
605
684
  }
606
685
  get #managedTargets() {
@@ -621,23 +700,31 @@ var RadioGroupController = class extends Controller {
621
700
  }
622
701
  #setChecked(radio, checked) {
623
702
  const value = checked ? "true" : "false";
624
- if (radio.getAttribute("aria-checked") === value) return;
625
- this.#markInternal(this.#internalCheckedValues, radio, value);
626
- radio.setAttribute("aria-checked", value);
703
+ if (this.#ownedChecked.has(radio)) this.#ownedChecked.set(radio, value);
704
+ this.#writeAttribute(radio, "aria-checked", value);
627
705
  }
628
706
  #writeTabindex(radio, value) {
629
707
  const serialized = String(value);
630
- this.#markInternal(this.#internalTabindexValues, radio, serialized);
631
- radio.tabIndex = value;
708
+ this.#writtenTabindex.set(radio, serialized);
709
+ this.#writeAttribute(radio, "tabindex", serialized);
710
+ }
711
+ #writeAttribute(target, name, value) {
712
+ setAttributeIfChanged(target, name, value, () => this.#observer.claim(target, name, value));
632
713
  }
633
714
  #reflectField(radio) {
634
- if (!this.hasFieldTarget) return;
635
715
  const value = radio ? this.#radioValue(radio) : "";
636
- writeField(this.fieldTarget, value);
716
+ this.#writeField(value);
637
717
  }
638
718
  #radioValue(radio) {
639
719
  return radio.getAttribute("data-value") ?? "";
640
720
  }
721
+ #writeField(value) {
722
+ if (!this.hasFieldTarget) return false;
723
+ const changed = writeField(this.fieldTarget, value);
724
+ if (changed && this.fieldTarget.type === "hidden")
725
+ this.#observer.claimCurrent(this.fieldTarget, "value");
726
+ return changed;
727
+ }
641
728
  };
642
729
 
643
730
  export { RadioGroupController };