stimeo-ui 0.16.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 (337) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/README.md +27 -11
  3. package/dist/cable/index.d.ts +88 -31
  4. package/dist/cable/index.js +384 -449
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/coerce-JtZVNG5h.d.ts +20 -0
  7. package/dist/controllers/accordion_controller.d.ts +4 -2
  8. package/dist/controllers/accordion_controller.js +174 -55
  9. package/dist/controllers/accordion_controller.js.map +1 -1
  10. package/dist/controllers/alert_dialog_controller.d.ts +12 -2
  11. package/dist/controllers/alert_dialog_controller.js +903 -235
  12. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  13. package/dist/controllers/announcer_controller.d.ts +37 -5
  14. package/dist/controllers/announcer_controller.js +238 -205
  15. package/dist/controllers/announcer_controller.js.map +1 -1
  16. package/dist/controllers/aspect_ratio_controller.js +0 -10
  17. package/dist/controllers/aspect_ratio_controller.js.map +1 -1
  18. package/dist/controllers/auto_submit_controller.d.ts +30 -6
  19. package/dist/controllers/auto_submit_controller.js +414 -145
  20. package/dist/controllers/auto_submit_controller.js.map +1 -1
  21. package/dist/controllers/avatar_controller.js +185 -107
  22. package/dist/controllers/avatar_controller.js.map +1 -1
  23. package/dist/controllers/breadcrumb_controller.js +0 -130
  24. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  25. package/dist/controllers/bulk_select_controller.d.ts +21 -3
  26. package/dist/controllers/bulk_select_controller.js +282 -58
  27. package/dist/controllers/bulk_select_controller.js.map +1 -1
  28. package/dist/controllers/calendar_controller.d.ts +38 -16
  29. package/dist/controllers/calendar_controller.js +228 -260
  30. package/dist/controllers/calendar_controller.js.map +1 -1
  31. package/dist/controllers/carousel_controller.d.ts +43 -12
  32. package/dist/controllers/carousel_controller.js +536 -436
  33. package/dist/controllers/carousel_controller.js.map +1 -1
  34. package/dist/controllers/character_counter_controller.d.ts +44 -7
  35. package/dist/controllers/character_counter_controller.js +493 -207
  36. package/dist/controllers/character_counter_controller.js.map +1 -1
  37. package/dist/controllers/checkbox_controller.d.ts +7 -2
  38. package/dist/controllers/checkbox_controller.js +38 -74
  39. package/dist/controllers/checkbox_controller.js.map +1 -1
  40. package/dist/controllers/clipboard_controller.d.ts +16 -5
  41. package/dist/controllers/clipboard_controller.js +261 -149
  42. package/dist/controllers/clipboard_controller.js.map +1 -1
  43. package/dist/controllers/collapsible_controller.d.ts +17 -5
  44. package/dist/controllers/collapsible_controller.js +304 -120
  45. package/dist/controllers/collapsible_controller.js.map +1 -1
  46. package/dist/controllers/color_picker_controller.d.ts +18 -6
  47. package/dist/controllers/color_picker_controller.js +178 -146
  48. package/dist/controllers/color_picker_controller.js.map +1 -1
  49. package/dist/controllers/combobox_controller.d.ts +24 -6
  50. package/dist/controllers/combobox_controller.js +522 -156
  51. package/dist/controllers/combobox_controller.js.map +1 -1
  52. package/dist/controllers/command_palette_controller.d.ts +51 -20
  53. package/dist/controllers/command_palette_controller.js +1156 -395
  54. package/dist/controllers/command_palette_controller.js.map +1 -1
  55. package/dist/controllers/conditional_fields_controller.d.ts +15 -2
  56. package/dist/controllers/conditional_fields_controller.js +300 -171
  57. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  58. package/dist/controllers/confirm_controller.d.ts +49 -12
  59. package/dist/controllers/confirm_controller.js +980 -262
  60. package/dist/controllers/confirm_controller.js.map +1 -1
  61. package/dist/controllers/context_menu_controller.d.ts +80 -18
  62. package/dist/controllers/context_menu_controller.js +346 -153
  63. package/dist/controllers/context_menu_controller.js.map +1 -1
  64. package/dist/controllers/count_up_controller.d.ts +13 -1
  65. package/dist/controllers/count_up_controller.js +73 -21
  66. package/dist/controllers/count_up_controller.js.map +1 -1
  67. package/dist/controllers/countdown_controller.d.ts +47 -3
  68. package/dist/controllers/countdown_controller.js +281 -158
  69. package/dist/controllers/countdown_controller.js.map +1 -1
  70. package/dist/controllers/currency_input_controller.d.ts +93 -10
  71. package/dist/controllers/currency_input_controller.js +575 -225
  72. package/dist/controllers/currency_input_controller.js.map +1 -1
  73. package/dist/controllers/data_grid_controller.d.ts +25 -12
  74. package/dist/controllers/data_grid_controller.js +248 -214
  75. package/dist/controllers/data_grid_controller.js.map +1 -1
  76. package/dist/controllers/date_range_picker_controller.d.ts +42 -14
  77. package/dist/controllers/date_range_picker_controller.js +338 -235
  78. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  79. package/dist/controllers/dialog_controller.d.ts +17 -6
  80. package/dist/controllers/dialog_controller.js +899 -237
  81. package/dist/controllers/dialog_controller.js.map +1 -1
  82. package/dist/controllers/direct_upload_controller.d.ts +25 -8
  83. package/dist/controllers/direct_upload_controller.js +97 -167
  84. package/dist/controllers/direct_upload_controller.js.map +1 -1
  85. package/dist/controllers/dirty_form_controller.d.ts +6 -1
  86. package/dist/controllers/dirty_form_controller.js +72 -69
  87. package/dist/controllers/dirty_form_controller.js.map +1 -1
  88. package/dist/controllers/dismissible_controller.d.ts +19 -0
  89. package/dist/controllers/dismissible_controller.js +196 -24
  90. package/dist/controllers/dismissible_controller.js.map +1 -1
  91. package/dist/controllers/drawer_controller.d.ts +39 -11
  92. package/dist/controllers/drawer_controller.js +974 -355
  93. package/dist/controllers/drawer_controller.js.map +1 -1
  94. package/dist/controllers/dropdown_controller.d.ts +31 -1
  95. package/dist/controllers/dropdown_controller.js +339 -96
  96. package/dist/controllers/dropdown_controller.js.map +1 -1
  97. package/dist/controllers/editable_controller.d.ts +12 -1
  98. package/dist/controllers/editable_controller.js +315 -88
  99. package/dist/controllers/editable_controller.js.map +1 -1
  100. package/dist/controllers/empty_state_controller.js +79 -58
  101. package/dist/controllers/empty_state_controller.js.map +1 -1
  102. package/dist/controllers/file_dropzone_controller.d.ts +63 -18
  103. package/dist/controllers/file_dropzone_controller.js +322 -211
  104. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  105. package/dist/controllers/filter_controller.js +77 -42
  106. package/dist/controllers/filter_controller.js.map +1 -1
  107. package/dist/controllers/flash_controller.d.ts +35 -12
  108. package/dist/controllers/flash_controller.js +238 -347
  109. package/dist/controllers/flash_controller.js.map +1 -1
  110. package/dist/controllers/focus_controller.d.ts +15 -6
  111. package/dist/controllers/focus_controller.js +679 -240
  112. package/dist/controllers/focus_controller.js.map +1 -1
  113. package/dist/controllers/form_field_controller.js +156 -132
  114. package/dist/controllers/form_field_controller.js.map +1 -1
  115. package/dist/controllers/form_validation_controller.d.ts +3 -3
  116. package/dist/controllers/form_validation_controller.js +31 -97
  117. package/dist/controllers/form_validation_controller.js.map +1 -1
  118. package/dist/controllers/frame_loading_controller.d.ts +47 -14
  119. package/dist/controllers/frame_loading_controller.js +275 -217
  120. package/dist/controllers/frame_loading_controller.js.map +1 -1
  121. package/dist/controllers/highlight_controller.d.ts +27 -6
  122. package/dist/controllers/highlight_controller.js +107 -75
  123. package/dist/controllers/highlight_controller.js.map +1 -1
  124. package/dist/controllers/hover_card_controller.d.ts +60 -4
  125. package/dist/controllers/hover_card_controller.js +327 -130
  126. package/dist/controllers/hover_card_controller.js.map +1 -1
  127. package/dist/controllers/idle_controller.d.ts +48 -6
  128. package/dist/controllers/idle_controller.js +271 -101
  129. package/dist/controllers/idle_controller.js.map +1 -1
  130. package/dist/controllers/input_mask_controller.d.ts +30 -13
  131. package/dist/controllers/input_mask_controller.js +483 -97
  132. package/dist/controllers/input_mask_controller.js.map +1 -1
  133. package/dist/controllers/intersection_controller.d.ts +32 -13
  134. package/dist/controllers/intersection_controller.js +150 -106
  135. package/dist/controllers/intersection_controller.js.map +1 -1
  136. package/dist/controllers/lazy_frame_controller.d.ts +19 -2
  137. package/dist/controllers/lazy_frame_controller.js +24 -68
  138. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  139. package/dist/controllers/listbox_controller.d.ts +44 -9
  140. package/dist/controllers/listbox_controller.js +523 -240
  141. package/dist/controllers/listbox_controller.js.map +1 -1
  142. package/dist/controllers/local_time_controller.d.ts +9 -7
  143. package/dist/controllers/local_time_controller.js +102 -77
  144. package/dist/controllers/local_time_controller.js.map +1 -1
  145. package/dist/controllers/masonry_controller.d.ts +11 -3
  146. package/dist/controllers/masonry_controller.js +80 -96
  147. package/dist/controllers/masonry_controller.js.map +1 -1
  148. package/dist/controllers/menu_controller.d.ts +55 -11
  149. package/dist/controllers/menu_controller.js +302 -188
  150. package/dist/controllers/menu_controller.js.map +1 -1
  151. package/dist/controllers/menubar_controller.d.ts +51 -9
  152. package/dist/controllers/menubar_controller.js +232 -345
  153. package/dist/controllers/menubar_controller.js.map +1 -1
  154. package/dist/controllers/meter_controller.d.ts +33 -20
  155. package/dist/controllers/meter_controller.js +417 -87
  156. package/dist/controllers/meter_controller.js.map +1 -1
  157. package/dist/controllers/multi_select_controller.d.ts +48 -18
  158. package/dist/controllers/multi_select_controller.js +785 -393
  159. package/dist/controllers/multi_select_controller.js.map +1 -1
  160. package/dist/controllers/navigation_menu_controller.d.ts +27 -6
  161. package/dist/controllers/navigation_menu_controller.js +190 -250
  162. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  163. package/dist/controllers/nested_form_controller.d.ts +10 -0
  164. package/dist/controllers/nested_form_controller.js +396 -192
  165. package/dist/controllers/nested_form_controller.js.map +1 -1
  166. package/dist/controllers/network_status_controller.d.ts +23 -0
  167. package/dist/controllers/network_status_controller.js +268 -62
  168. package/dist/controllers/network_status_controller.js.map +1 -1
  169. package/dist/controllers/number_input_controller.d.ts +50 -8
  170. package/dist/controllers/number_input_controller.js +610 -303
  171. package/dist/controllers/number_input_controller.js.map +1 -1
  172. package/dist/controllers/optimistic_controller.d.ts +8 -5
  173. package/dist/controllers/optimistic_controller.js +45 -87
  174. package/dist/controllers/optimistic_controller.js.map +1 -1
  175. package/dist/controllers/otp_controller.d.ts +55 -8
  176. package/dist/controllers/otp_controller.js +658 -255
  177. package/dist/controllers/otp_controller.js.map +1 -1
  178. package/dist/controllers/overflow_indicator_controller.d.ts +5 -0
  179. package/dist/controllers/overflow_indicator_controller.js +122 -113
  180. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  181. package/dist/controllers/overflow_menu_controller.d.ts +58 -20
  182. package/dist/controllers/overflow_menu_controller.js +470 -295
  183. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  184. package/dist/controllers/pagination_controller.d.ts +37 -7
  185. package/dist/controllers/pagination_controller.js +332 -123
  186. package/dist/controllers/pagination_controller.js.map +1 -1
  187. package/dist/controllers/password_reveal_controller.d.ts +46 -8
  188. package/dist/controllers/password_reveal_controller.js +392 -121
  189. package/dist/controllers/password_reveal_controller.js.map +1 -1
  190. package/dist/controllers/password_strength_controller.d.ts +15 -6
  191. package/dist/controllers/password_strength_controller.js +111 -158
  192. package/dist/controllers/password_strength_controller.js.map +1 -1
  193. package/dist/controllers/persist_controller.d.ts +11 -4
  194. package/dist/controllers/persist_controller.js +165 -111
  195. package/dist/controllers/persist_controller.js.map +1 -1
  196. package/dist/controllers/pointer_drag_controller.d.ts +35 -12
  197. package/dist/controllers/pointer_drag_controller.js +434 -188
  198. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  199. package/dist/controllers/popover_controller.d.ts +41 -5
  200. package/dist/controllers/popover_controller.js +269 -113
  201. package/dist/controllers/popover_controller.js.map +1 -1
  202. package/dist/controllers/portal_controller.d.ts +44 -4
  203. package/dist/controllers/portal_controller.js +215 -76
  204. package/dist/controllers/portal_controller.js.map +1 -1
  205. package/dist/controllers/preview_guard_controller.d.ts +10 -4
  206. package/dist/controllers/preview_guard_controller.js +243 -116
  207. package/dist/controllers/preview_guard_controller.js.map +1 -1
  208. package/dist/controllers/progress_controller.d.ts +20 -19
  209. package/dist/controllers/progress_controller.js +391 -78
  210. package/dist/controllers/progress_controller.js.map +1 -1
  211. package/dist/controllers/radio_group_controller.d.ts +21 -9
  212. package/dist/controllers/radio_group_controller.js +278 -211
  213. package/dist/controllers/radio_group_controller.js.map +1 -1
  214. package/dist/controllers/range_slider_controller.d.ts +47 -6
  215. package/dist/controllers/range_slider_controller.js +220 -113
  216. package/dist/controllers/range_slider_controller.js.map +1 -1
  217. package/dist/controllers/rating_controller.d.ts +20 -4
  218. package/dist/controllers/rating_controller.js +458 -211
  219. package/dist/controllers/rating_controller.js.map +1 -1
  220. package/dist/controllers/read_more_controller.d.ts +2 -0
  221. package/dist/controllers/read_more_controller.js +138 -63
  222. package/dist/controllers/read_more_controller.js.map +1 -1
  223. package/dist/controllers/reading_progress_controller.d.ts +1 -1
  224. package/dist/controllers/reading_progress_controller.js +166 -137
  225. package/dist/controllers/reading_progress_controller.js.map +1 -1
  226. package/dist/controllers/relative_time_controller.d.ts +20 -6
  227. package/dist/controllers/relative_time_controller.js +211 -112
  228. package/dist/controllers/relative_time_controller.js.map +1 -1
  229. package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
  230. package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +103 -38
  231. package/dist/controllers/reset_on_restore_controller.js.map +1 -0
  232. package/dist/controllers/resizable_controller.d.ts +31 -2
  233. package/dist/controllers/resizable_controller.js +299 -150
  234. package/dist/controllers/resizable_controller.js.map +1 -1
  235. package/dist/controllers/roving_controller.d.ts +3 -3
  236. package/dist/controllers/roving_controller.js +49 -88
  237. package/dist/controllers/roving_controller.js.map +1 -1
  238. package/dist/controllers/scroll_area_controller.d.ts +7 -3
  239. package/dist/controllers/scroll_area_controller.js +490 -246
  240. package/dist/controllers/scroll_area_controller.js.map +1 -1
  241. package/dist/controllers/scroll_restore_controller.d.ts +3 -3
  242. package/dist/controllers/scroll_restore_controller.js +14 -55
  243. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  244. package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
  245. package/dist/controllers/scroll_visibility_controller.js +432 -149
  246. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  247. package/dist/controllers/scrollspy_controller.d.ts +6 -1
  248. package/dist/controllers/scrollspy_controller.js +193 -248
  249. package/dist/controllers/scrollspy_controller.js.map +1 -1
  250. package/dist/controllers/separator_controller.d.ts +20 -5
  251. package/dist/controllers/separator_controller.js +285 -142
  252. package/dist/controllers/separator_controller.js.map +1 -1
  253. package/dist/controllers/sidebar_controller.d.ts +65 -8
  254. package/dist/controllers/sidebar_controller.js +1069 -404
  255. package/dist/controllers/sidebar_controller.js.map +1 -1
  256. package/dist/controllers/skeleton_controller.d.ts +23 -0
  257. package/dist/controllers/skeleton_controller.js +259 -101
  258. package/dist/controllers/skeleton_controller.js.map +1 -1
  259. package/dist/controllers/slider_controller.d.ts +29 -2
  260. package/dist/controllers/slider_controller.js +187 -86
  261. package/dist/controllers/slider_controller.js.map +1 -1
  262. package/dist/controllers/smart_sticky_header_controller.d.ts +22 -4
  263. package/dist/controllers/smart_sticky_header_controller.js +173 -66
  264. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  265. package/dist/controllers/sortable_controller.d.ts +4 -4
  266. package/dist/controllers/sortable_controller.js +26 -125
  267. package/dist/controllers/sortable_controller.js.map +1 -1
  268. package/dist/controllers/spinner_controller.d.ts +39 -4
  269. package/dist/controllers/spinner_controller.js +288 -173
  270. package/dist/controllers/spinner_controller.js.map +1 -1
  271. package/dist/controllers/step_indicator_controller.d.ts +9 -4
  272. package/dist/controllers/step_indicator_controller.js +105 -46
  273. package/dist/controllers/step_indicator_controller.js.map +1 -1
  274. package/dist/controllers/stepper_controller.d.ts +14 -6
  275. package/dist/controllers/stepper_controller.js +120 -73
  276. package/dist/controllers/stepper_controller.js.map +1 -1
  277. package/dist/controllers/stick_to_bottom_controller.d.ts +9 -1
  278. package/dist/controllers/stick_to_bottom_controller.js +275 -140
  279. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  280. package/dist/controllers/sticky_observer_controller.d.ts +11 -0
  281. package/dist/controllers/sticky_observer_controller.js +220 -49
  282. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  283. package/dist/controllers/submit_once_controller.d.ts +24 -8
  284. package/dist/controllers/submit_once_controller.js +376 -227
  285. package/dist/controllers/submit_once_controller.js.map +1 -1
  286. package/dist/controllers/switch_controller.d.ts +18 -4
  287. package/dist/controllers/switch_controller.js +201 -84
  288. package/dist/controllers/switch_controller.js.map +1 -1
  289. package/dist/controllers/tabs_controller.d.ts +9 -6
  290. package/dist/controllers/tabs_controller.js +41 -30
  291. package/dist/controllers/tabs_controller.js.map +1 -1
  292. package/dist/controllers/tags_input_controller.d.ts +16 -3
  293. package/dist/controllers/tags_input_controller.js +293 -173
  294. package/dist/controllers/tags_input_controller.js.map +1 -1
  295. package/dist/controllers/textarea_autosize_controller.d.ts +11 -1
  296. package/dist/controllers/textarea_autosize_controller.js +108 -74
  297. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  298. package/dist/controllers/theme_controller.d.ts +24 -11
  299. package/dist/controllers/theme_controller.js +140 -116
  300. package/dist/controllers/theme_controller.js.map +1 -1
  301. package/dist/controllers/time_picker_controller.d.ts +55 -5
  302. package/dist/controllers/time_picker_controller.js +331 -127
  303. package/dist/controllers/time_picker_controller.js.map +1 -1
  304. package/dist/controllers/toast_controller.d.ts +40 -16
  305. package/dist/controllers/toast_controller.js +244 -324
  306. package/dist/controllers/toast_controller.js.map +1 -1
  307. package/dist/controllers/toggle_group_controller.d.ts +14 -6
  308. package/dist/controllers/toggle_group_controller.js +252 -191
  309. package/dist/controllers/toggle_group_controller.js.map +1 -1
  310. package/dist/controllers/toolbar_controller.d.ts +8 -6
  311. package/dist/controllers/toolbar_controller.js +219 -120
  312. package/dist/controllers/toolbar_controller.js.map +1 -1
  313. package/dist/controllers/tooltip_controller.d.ts +49 -4
  314. package/dist/controllers/tooltip_controller.js +158 -124
  315. package/dist/controllers/tooltip_controller.js.map +1 -1
  316. package/dist/controllers/transition_controller.d.ts +22 -4
  317. package/dist/controllers/transition_controller.js +123 -119
  318. package/dist/controllers/transition_controller.js.map +1 -1
  319. package/dist/controllers/tree_view_controller.d.ts +22 -12
  320. package/dist/controllers/tree_view_controller.js +283 -369
  321. package/dist/controllers/tree_view_controller.js.map +1 -1
  322. package/dist/index.d.ts +10 -5
  323. package/dist/index.js +8573 -10410
  324. package/dist/index.js.map +1 -1
  325. package/dist/inspector/cli.d.ts +38 -14
  326. package/dist/inspector/cli.js +108 -40
  327. package/dist/inspector/cli.js.map +1 -1
  328. package/dist/inspector/cli_bin.js +145 -64
  329. package/dist/inspector/cli_bin.js.map +1 -1
  330. package/dist/inspector/examples.json +20 -20
  331. package/dist/inspector/manifest.json +802 -101
  332. package/dist/positioning/index.d.ts +15 -7
  333. package/dist/positioning/index.js +154 -47
  334. package/dist/positioning/index.js.map +1 -1
  335. package/package.json +11 -10
  336. package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
  337. package/dist/controllers/reset_before_cache_controller.js.map +0 -1
@@ -1,15 +1,109 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/switch_controller.ts
3
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
4
+ if (element.getAttribute(name) === value) return false;
5
+ beforeWrite?.();
6
+ if (value === null) element.removeAttribute(name);
7
+ else element.setAttribute(name, value);
8
+ return true;
9
+ }
10
+
11
+ var AuthoredMutationWatcher = class {
12
+ #onAuthored;
13
+ #claims = null;
14
+ #observer = null;
15
+ constructor(onAuthored) {
16
+ this.#onAuthored = onAuthored;
17
+ }
18
+ observe(root, options) {
19
+ this.disconnect();
20
+ const observer = new MutationObserver((records) => {
21
+ if (this.#observer !== observer) return;
22
+ const authored = this.#filter(records);
23
+ if (authored.length > 0) this.#onAuthored(authored);
24
+ });
25
+ this.#observer = observer;
26
+ this.#claims = { attributes: /* @__PURE__ */ new Map(), children: /* @__PURE__ */ new Map() };
27
+ observer.observe(root, {
28
+ attributes: true,
29
+ attributeFilter: [...options.attributes],
30
+ subtree: options.subtree ?? false,
31
+ childList: options.childList ?? false
32
+ });
33
+ if (options.ancestorAttributes) {
34
+ let ancestor = root.parentElement;
35
+ while (ancestor) {
36
+ observer.observe(ancestor, {
37
+ attributes: true,
38
+ attributeFilter: [...options.ancestorAttributes]
39
+ });
40
+ ancestor = ancestor.parentElement;
41
+ }
42
+ }
43
+ }
44
+ claim(target, name, value) {
45
+ const claims = this.#claims?.attributes;
46
+ let attributes = claims?.get(target);
47
+ if (!attributes) {
48
+ attributes = /* @__PURE__ */ new Map();
49
+ claims?.set(target, attributes);
50
+ }
51
+ const pending = attributes.get(name);
52
+ attributes.set(name, { value, count: (pending?.count ?? 0) + 1 });
53
+ }
54
+ claimCurrent(target, name) {
55
+ this.claim(target, name, target.getAttribute(name));
56
+ }
57
+ claimChildList(target, added, removed) {
58
+ const claims = this.#claims?.children;
59
+ const pending = claims?.get(target) ?? { added: /* @__PURE__ */ new Map(), removed: /* @__PURE__ */ new Map() };
60
+ for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) + 1);
61
+ for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) + 1);
62
+ claims?.set(target, pending);
63
+ }
64
+ take() {
65
+ return this.#filter(this.#observer?.takeRecords() ?? []);
66
+ }
67
+ disconnect() {
68
+ this.#observer?.disconnect();
69
+ this.#observer = null;
70
+ this.#claims = null;
71
+ }
72
+ #filter(records) {
73
+ const authored = records.filter((record) => !this.#consume(record));
74
+ this.#claims?.attributes.clear();
75
+ this.#claims?.children.clear();
76
+ return authored;
77
+ }
78
+ #consume(record) {
79
+ if (record.type === "attributes") {
80
+ const target = record.target;
81
+ const pending2 = this.#claims?.attributes.get(target)?.get(record.attributeName);
82
+ if (!pending2 || pending2.count === 0 || target.getAttribute(record.attributeName) !== pending2.value) {
83
+ return false;
84
+ }
85
+ pending2.count -= 1;
86
+ return true;
87
+ }
88
+ const pending = this.#claims?.children.get(record.target);
89
+ if (!pending) return false;
90
+ const added = [...record.addedNodes];
91
+ const removed = [...record.removedNodes];
92
+ if (added.some((node) => !pending.added.get(node)) || removed.some((node) => !pending.removed.get(node))) {
93
+ return false;
94
+ }
95
+ for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) - 1);
96
+ for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) - 1);
97
+ return true;
98
+ }
99
+ };
4
100
 
5
- // src/utils/default_attribute.ts
6
101
  function setDefaultAttribute(element, name, value) {
7
102
  if (element.hasAttribute(name)) return false;
8
103
  element.setAttribute(name, value);
9
104
  return true;
10
105
  }
11
106
 
12
- // src/utils/field_mirror.ts
13
107
  function writeField(field, value) {
14
108
  if (field.value === value) return false;
15
109
  field.value = value;
@@ -19,7 +113,6 @@ function commitField(target) {
19
113
  target.dispatchEvent(new Event("change", { bubbles: true }));
20
114
  }
21
115
 
22
- // src/utils/focus_candidate.ts
23
116
  function inheritsFieldsetDisabled(control) {
24
117
  let fieldset = control.closest("fieldset[disabled]");
25
118
  while (fieldset) {
@@ -30,7 +123,6 @@ function inheritsFieldsetDisabled(control) {
30
123
  return false;
31
124
  }
32
125
 
33
- // src/utils/interactive_host.ts
34
126
  var INTERACTIVE_HOST_SELECTOR = "button, input, select, textarea, label, a[href], area[href], summary, details, audio[controls], video[controls], iframe, object, embed";
35
127
  function isInteractiveHost(element) {
36
128
  if (element.matches(INTERACTIVE_HOST_SELECTOR)) return true;
@@ -47,27 +139,36 @@ function isInteractiveHost(element) {
47
139
  return false;
48
140
  }
49
141
 
50
- // src/utils/microtask_coalescer.ts
142
+ var ListenerSet = class {
143
+ #abort = new AbortController();
144
+ add(target, type, handler, options) {
145
+ target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
146
+ }
147
+ dispose() {
148
+ this.#abort.abort();
149
+ this.#abort = new AbortController();
150
+ }
151
+ };
152
+
51
153
  var MicrotaskCoalescer = class {
52
154
  #run;
53
155
  #queued = false;
54
156
  #active = false;
55
157
  #generation = 0;
56
- /** @param run - the single reconciliation pass, invoked at most once per batch. */
57
158
  constructor(run) {
58
159
  this.#run = run;
59
160
  }
60
- /** Opens the window in which {@link schedule} is honoured; call from `connect()`. */
61
161
  activate() {
62
162
  this.#active = true;
63
163
  }
64
- /** Closes the window and drops any pending pass; call from `disconnect()`. */
65
164
  cancel() {
66
165
  this.#active = false;
67
166
  this.#queued = false;
68
167
  this.#generation += 1;
69
168
  }
70
- /** Requests one pass after the batch settles. Idempotent; inert outside the window. */
169
+ get pending() {
170
+ return this.#queued;
171
+ }
71
172
  schedule() {
72
173
  if (!this.#active || this.#queued) return;
73
174
  this.#queued = true;
@@ -80,7 +181,45 @@ var MicrotaskCoalescer = class {
80
181
  }
81
182
  };
82
183
 
83
- // src/controllers/switch_controller.ts
184
+ var MorphRenderWatcher = class {
185
+ #listeners = new ListenerSet();
186
+ #pass;
187
+ #element = null;
188
+ #onMorph = () => this.#pass.schedule();
189
+ constructor(run) {
190
+ this.#pass = new MicrotaskCoalescer(run);
191
+ }
192
+ observe(element) {
193
+ if (this.#element === element) return;
194
+ this.disconnect();
195
+ this.#element = element;
196
+ this.#pass.activate();
197
+ this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
198
+ }
199
+ schedule() {
200
+ this.#pass.schedule();
201
+ }
202
+ get pending() {
203
+ return this.#pass.pending;
204
+ }
205
+ disconnect() {
206
+ this.#listeners.dispose();
207
+ this.#pass.cancel();
208
+ this.#element = null;
209
+ }
210
+ };
211
+
212
+ var MoveCounter = class {
213
+ #sequence = 0;
214
+ record() {
215
+ this.#sequence += 1;
216
+ return this.#sequence;
217
+ }
218
+ isLatest(token) {
219
+ return token === this.#sequence;
220
+ }
221
+ };
222
+
84
223
  var OBSERVED_ATTRIBUTES = [
85
224
  "role",
86
225
  "aria-checked",
@@ -92,61 +231,49 @@ var OBSERVED_ATTRIBUTES = [
92
231
  ];
93
232
  var OBSERVED_ANCESTOR_ATTRIBUTES = ["contenteditable"];
94
233
  var SwitchController = class extends Controller {
234
+ #moves = new MoveCounter();
235
+ #connectionGeneration = 0;
95
236
  static targets = ["field"];
96
237
  static actions = ["onKeydown", "toggle"];
97
238
  static events = ["change", "reconcile"];
98
- /** Defaults this instance introduced and may therefore remove safely. */
99
- #ownedDefaults = /* @__PURE__ */ new Set();
100
- /** Controller writes that must not be mistaken for authored morph changes. */
101
- #internalAttributeValues = /* @__PURE__ */ new Map();
102
- /** One pass per batch of retained-element changes and field arrivals. */
103
- #pass = new MicrotaskCoalescer(() => this.#reconcile());
104
- /** The checked state last published: read on connect, then committed or reported. */
239
+ #ownedDefaults = /* @__PURE__ */ new Map();
240
+ #pass = new MorphRenderWatcher(() => this.#reconcile());
105
241
  #committedChecked = false;
106
- #attributeObserver = new MutationObserver((records) => {
242
+ #attributeObserver = new AuthoredMutationWatcher((records) => {
107
243
  this.#releaseAuthoredDefaults(records);
108
244
  this.#pass.schedule();
109
245
  });
110
- /** Blocks disabled pointer/native-key activation before consumer click handlers. */
111
246
  #onClickCapture = (event) => {
112
247
  if (!this.#isSupportedHost || !this.#isActivationDisabled) return;
113
248
  event.preventDefault();
114
249
  event.stopImmediatePropagation();
115
250
  };
116
- /**
117
- * Ensures the switch exposes a role and is keyboard-reachable, and takes the
118
- * state it finds as the one a later move is measured from, reporting nothing.
119
- */
251
+ #listeners = new ListenerSet();
120
252
  connect() {
253
+ this.#releaseDefaultsRewrittenWhileAway();
121
254
  this.#reconcileDefaults();
122
255
  this.#mirrorField(false);
123
256
  this.#committedChecked = this.#checked;
124
- this.element.addEventListener("click", this.#onClickCapture, true);
125
- this.#pass.activate();
257
+ this.#listeners.add(this.element, "click", this.#onClickCapture, { capture: true });
258
+ this.#pass.observe(this.element);
126
259
  this.#observeAttributes();
127
260
  }
128
- /** Fills a form field inserted or replaced at runtime with the current state. */
129
261
  fieldTargetConnected() {
130
262
  this.#pass.schedule();
131
263
  }
132
- /** Releases the click guard, the attribute observer, and a pass still queued. */
264
+ fieldTargetDisconnected() {
265
+ this.#pass.schedule();
266
+ }
133
267
  disconnect() {
134
- this.#pass.cancel();
135
- this.element.removeEventListener("click", this.#onClickCapture, true);
268
+ this.#connectionGeneration += 1;
269
+ this.#pass.disconnect();
270
+ this.#listeners.dispose();
136
271
  this.#attributeObserver.disconnect();
137
- this.#internalAttributeValues.clear();
138
272
  }
139
- /** Toggles the checked state. Bound via `data-action` (click). */
140
273
  toggle() {
141
274
  if (!this.#isSupportedHost || this.#isActivationDisabled) return;
142
275
  this.#commit(!this.#checked);
143
276
  }
144
- /**
145
- * Activates the switch on Space/Enter for non-native hosts and suppresses key
146
- * repeat. Bound via `data-action` (keydown). A native `<button type="button">`
147
- * owns the initial key-to-click synthesis; repeated keydowns are canceled before
148
- * the browser can synthesize additional clicks.
149
- */
150
277
  onKeydown(event) {
151
278
  if (event.defaultPrevented) return;
152
279
  if (!this.#isSupportedHost) return;
@@ -164,29 +291,21 @@ var SwitchController = class extends Controller {
164
291
  if (event.repeat) return;
165
292
  this.toggle();
166
293
  }
167
- /**
168
- * Re-derives the defaults and the field after the page changed the host, then
169
- * reports a checked state that moved. Records still queued are read first, so
170
- * an author's write is not lost when observation is suspended for this pass's
171
- * own writes; observation resumes before the report, so an edit a listener
172
- * makes is seen by the next pass.
173
- */
174
294
  #reconcile() {
175
- this.#releaseAuthoredDefaults(this.#attributeObserver.takeRecords());
176
- this.#attributeObserver.disconnect();
295
+ this.#releaseAuthoredDefaults(this.#attributeObserver.take());
177
296
  this.#reconcileDefaults();
178
297
  this.#mirrorField(false);
179
- this.#observeAttributes();
298
+ const authored = this.#attributeObserver.take();
299
+ this.#releaseAuthoredDefaults(authored);
300
+ if (authored.length > 0) this.#pass.schedule();
180
301
  this.#reportMove();
181
302
  }
182
- /** Reports a checked state that moved since the one this switch last published. */
183
303
  #reportMove() {
184
304
  const checked = this.#checked;
185
305
  if (checked === this.#committedChecked) return;
186
306
  this.#committedChecked = checked;
187
307
  this.dispatch("reconcile", { detail: { checked } });
188
308
  }
189
- /** Re-adds only missing defaults, preserving every authored attribute value. */
190
309
  #reconcileDefaults() {
191
310
  if (!this.#isSupportedHost) {
192
311
  this.#removeOwnedDefaults();
@@ -198,61 +317,50 @@ var SwitchController = class extends Controller {
198
317
  this.#setOwnedDefault("tabindex", "0");
199
318
  }
200
319
  }
201
- /** Mirrors the checked state into the optional form field. */
202
320
  #mirrorField(notify) {
203
321
  if (!this.hasFieldTarget) return;
204
322
  const moved = writeField(this.fieldTarget, this.#checked ? "true" : "false");
205
323
  if (moved && notify) commitField(this.fieldTarget);
206
324
  }
207
- /** Records a newly introduced default without claiming authored markup. */
208
325
  #setOwnedDefault(name, value) {
209
- if (setDefaultAttribute(this.element, name, value)) this.#ownedDefaults.add(name);
326
+ if (setDefaultAttribute(this.element, name, value)) {
327
+ this.#ownedDefaults.set(name, value);
328
+ this.#attributeObserver.claimCurrent(this.element, name);
329
+ }
330
+ }
331
+ #releaseDefaultsRewrittenWhileAway() {
332
+ for (const [name, written] of this.#ownedDefaults) {
333
+ const value = this.element.getAttribute(name);
334
+ if (value !== null && value !== written) this.#ownedDefaults.delete(name);
335
+ }
210
336
  }
211
- /**
212
- * Gives ownership back when a retained-element morph authors a value. Missing
213
- * owned attributes stay owned so reconciliation can restore them.
214
- */
215
337
  #releaseAuthoredDefaults(records) {
216
338
  for (const record of records) {
217
339
  if (record.target === this.element) {
218
340
  const name = record.attributeName;
219
341
  if (name && this.#ownedDefaults.has(name)) {
220
342
  const value = this.element.getAttribute(name);
221
- if (value !== null && this.#internalAttributeValues.get(name) !== value) {
343
+ if (value !== null) {
222
344
  this.#ownedDefaults.delete(name);
223
345
  }
224
346
  }
225
347
  }
226
348
  }
227
- this.#internalAttributeValues.clear();
228
349
  }
229
- /** Removes only defaults introduced by this instance when a host becomes invalid. */
230
350
  #removeOwnedDefaults() {
231
- for (const name of this.#ownedDefaults) this.element.removeAttribute(name);
351
+ for (const name of this.#ownedDefaults.keys()) this.#writeAttribute(name, null);
232
352
  this.#ownedDefaults.clear();
233
- this.#internalAttributeValues.clear();
234
353
  }
235
- /** Watches retained host attributes that Turbo can morph without reconnecting. */
236
354
  #observeAttributes() {
237
355
  this.#attributeObserver.observe(this.element, {
238
- attributes: true,
239
- attributeFilter: OBSERVED_ATTRIBUTES
356
+ attributes: OBSERVED_ATTRIBUTES,
357
+ ancestorAttributes: OBSERVED_ANCESTOR_ATTRIBUTES
240
358
  });
241
- let ancestor = this.element.parentElement;
242
- while (ancestor) {
243
- this.#attributeObserver.observe(ancestor, {
244
- attributes: true,
245
- attributeFilter: OBSERVED_ANCESTOR_ATTRIBUTES
246
- });
247
- ancestor = ancestor.parentElement;
248
- }
249
359
  }
250
- /** Whether the host has one activation model that this controller can own. */
251
360
  get #isSupportedHost() {
252
361
  if (this.element instanceof HTMLButtonElement) return this.element.type === "button";
253
362
  return !isInteractiveHost(this.element);
254
363
  }
255
- /** Whether ARIA or native HTML semantics make the supported switch inoperable. */
256
364
  get #isActivationDisabled() {
257
365
  let current = this.element;
258
366
  while (current) {
@@ -262,25 +370,34 @@ var SwitchController = class extends Controller {
262
370
  if (!(this.element instanceof HTMLButtonElement)) return false;
263
371
  return this.element.disabled || inheritsFieldsetDisabled(this.element);
264
372
  }
265
- /** Whether the switch is currently on. */
266
373
  get #checked() {
267
374
  return this.element.getAttribute("aria-checked") === "true";
268
375
  }
269
- /**
270
- * Applies one toggle the user made. The state is taken as published before
271
- * either report goes out, so a listener that toggles again or writes the
272
- * attribute is measured from it.
273
- */
274
376
  #commit(value) {
377
+ const generation = this.#connectionGeneration;
275
378
  const reflected = value ? "true" : "false";
276
- this.#internalAttributeValues.set("aria-checked", reflected);
277
- this.element.setAttribute("aria-checked", reflected);
379
+ const authored = this.#attributeObserver.take();
380
+ this.#releaseAuthoredDefaults(authored);
381
+ if (authored.length > 0) this.#pass.schedule();
382
+ if (this.#ownedDefaults.has("aria-checked")) this.#ownedDefaults.set("aria-checked", reflected);
383
+ this.#writeAttribute("aria-checked", reflected);
384
+ const changed = value !== this.#committedChecked;
278
385
  this.#committedChecked = value;
386
+ if (!changed) {
387
+ this.#mirrorField(false);
388
+ return;
389
+ }
390
+ const token = this.#moves.record();
279
391
  this.#mirrorField(true);
392
+ if (generation !== this.#connectionGeneration || !this.#moves.isLatest(token)) return;
280
393
  this.dispatch("change", { detail: { checked: value } });
281
394
  }
395
+ #writeAttribute(name, value) {
396
+ setAttributeIfChanged(this.element, name, value, () => {
397
+ this.#attributeObserver.claim(this.element, name, value);
398
+ });
399
+ }
282
400
  };
283
401
 
284
402
  export { SwitchController };
285
- //# sourceMappingURL=switch_controller.js.map
286
403
  //# sourceMappingURL=switch_controller.js.map