stimeo-ui 0.16.0 → 0.17.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 (328) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +8 -1
  3. package/dist/cable/index.d.ts +79 -23
  4. package/dist/cable/index.js +363 -436
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/controllers/accordion_controller.d.ts +4 -2
  7. package/dist/controllers/accordion_controller.js +166 -55
  8. package/dist/controllers/accordion_controller.js.map +1 -1
  9. package/dist/controllers/alert_dialog_controller.d.ts +12 -2
  10. package/dist/controllers/alert_dialog_controller.js +862 -221
  11. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  12. package/dist/controllers/announcer_controller.d.ts +35 -5
  13. package/dist/controllers/announcer_controller.js +135 -198
  14. package/dist/controllers/announcer_controller.js.map +1 -1
  15. package/dist/controllers/aspect_ratio_controller.js +0 -10
  16. package/dist/controllers/aspect_ratio_controller.js.map +1 -1
  17. package/dist/controllers/auto_submit_controller.d.ts +30 -6
  18. package/dist/controllers/auto_submit_controller.js +271 -127
  19. package/dist/controllers/auto_submit_controller.js.map +1 -1
  20. package/dist/controllers/avatar_controller.js +171 -105
  21. package/dist/controllers/avatar_controller.js.map +1 -1
  22. package/dist/controllers/breadcrumb_controller.js +0 -130
  23. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  24. package/dist/controllers/bulk_select_controller.d.ts +18 -0
  25. package/dist/controllers/bulk_select_controller.js +262 -52
  26. package/dist/controllers/bulk_select_controller.js.map +1 -1
  27. package/dist/controllers/calendar_controller.d.ts +24 -5
  28. package/dist/controllers/calendar_controller.js +175 -209
  29. package/dist/controllers/calendar_controller.js.map +1 -1
  30. package/dist/controllers/carousel_controller.d.ts +34 -7
  31. package/dist/controllers/carousel_controller.js +461 -399
  32. package/dist/controllers/carousel_controller.js.map +1 -1
  33. package/dist/controllers/character_counter_controller.d.ts +17 -1
  34. package/dist/controllers/character_counter_controller.js +246 -156
  35. package/dist/controllers/character_counter_controller.js.map +1 -1
  36. package/dist/controllers/checkbox_controller.d.ts +7 -2
  37. package/dist/controllers/checkbox_controller.js +32 -74
  38. package/dist/controllers/checkbox_controller.js.map +1 -1
  39. package/dist/controllers/clipboard_controller.d.ts +16 -5
  40. package/dist/controllers/clipboard_controller.js +168 -147
  41. package/dist/controllers/clipboard_controller.js.map +1 -1
  42. package/dist/controllers/collapsible_controller.d.ts +16 -4
  43. package/dist/controllers/collapsible_controller.js +301 -120
  44. package/dist/controllers/collapsible_controller.js.map +1 -1
  45. package/dist/controllers/color_picker_controller.d.ts +18 -6
  46. package/dist/controllers/color_picker_controller.js +149 -139
  47. package/dist/controllers/color_picker_controller.js.map +1 -1
  48. package/dist/controllers/combobox_controller.d.ts +23 -5
  49. package/dist/controllers/combobox_controller.js +360 -133
  50. package/dist/controllers/combobox_controller.js.map +1 -1
  51. package/dist/controllers/command_palette_controller.d.ts +45 -14
  52. package/dist/controllers/command_palette_controller.js +970 -358
  53. package/dist/controllers/command_palette_controller.js.map +1 -1
  54. package/dist/controllers/conditional_fields_controller.d.ts +15 -2
  55. package/dist/controllers/conditional_fields_controller.js +166 -124
  56. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  57. package/dist/controllers/confirm_controller.d.ts +49 -12
  58. package/dist/controllers/confirm_controller.js +939 -248
  59. package/dist/controllers/confirm_controller.js.map +1 -1
  60. package/dist/controllers/context_menu_controller.d.ts +31 -4
  61. package/dist/controllers/context_menu_controller.js +256 -128
  62. package/dist/controllers/context_menu_controller.js.map +1 -1
  63. package/dist/controllers/count_up_controller.d.ts +13 -1
  64. package/dist/controllers/count_up_controller.js +73 -21
  65. package/dist/controllers/count_up_controller.js.map +1 -1
  66. package/dist/controllers/countdown_controller.d.ts +45 -1
  67. package/dist/controllers/countdown_controller.js +183 -148
  68. package/dist/controllers/countdown_controller.js.map +1 -1
  69. package/dist/controllers/currency_input_controller.d.ts +21 -2
  70. package/dist/controllers/currency_input_controller.js +134 -158
  71. package/dist/controllers/currency_input_controller.js.map +1 -1
  72. package/dist/controllers/data_grid_controller.d.ts +15 -4
  73. package/dist/controllers/data_grid_controller.js +114 -186
  74. package/dist/controllers/data_grid_controller.js.map +1 -1
  75. package/dist/controllers/date_range_picker_controller.d.ts +30 -5
  76. package/dist/controllers/date_range_picker_controller.js +288 -206
  77. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  78. package/dist/controllers/dialog_controller.d.ts +13 -1
  79. package/dist/controllers/dialog_controller.js +858 -223
  80. package/dist/controllers/dialog_controller.js.map +1 -1
  81. package/dist/controllers/direct_upload_controller.d.ts +24 -7
  82. package/dist/controllers/direct_upload_controller.js +73 -153
  83. package/dist/controllers/direct_upload_controller.js.map +1 -1
  84. package/dist/controllers/dirty_form_controller.js +14 -48
  85. package/dist/controllers/dirty_form_controller.js.map +1 -1
  86. package/dist/controllers/dismissible_controller.d.ts +19 -0
  87. package/dist/controllers/dismissible_controller.js +175 -21
  88. package/dist/controllers/dismissible_controller.js.map +1 -1
  89. package/dist/controllers/drawer_controller.d.ts +39 -11
  90. package/dist/controllers/drawer_controller.js +933 -341
  91. package/dist/controllers/drawer_controller.js.map +1 -1
  92. package/dist/controllers/dropdown_controller.d.ts +31 -1
  93. package/dist/controllers/dropdown_controller.js +312 -82
  94. package/dist/controllers/dropdown_controller.js.map +1 -1
  95. package/dist/controllers/editable_controller.d.ts +12 -1
  96. package/dist/controllers/editable_controller.js +158 -68
  97. package/dist/controllers/editable_controller.js.map +1 -1
  98. package/dist/controllers/empty_state_controller.js +67 -53
  99. package/dist/controllers/empty_state_controller.js.map +1 -1
  100. package/dist/controllers/file_dropzone_controller.d.ts +60 -18
  101. package/dist/controllers/file_dropzone_controller.js +311 -207
  102. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  103. package/dist/controllers/filter_controller.js +67 -39
  104. package/dist/controllers/filter_controller.js.map +1 -1
  105. package/dist/controllers/flash_controller.d.ts +31 -8
  106. package/dist/controllers/flash_controller.js +172 -314
  107. package/dist/controllers/flash_controller.js.map +1 -1
  108. package/dist/controllers/focus_controller.d.ts +12 -3
  109. package/dist/controllers/focus_controller.js +654 -240
  110. package/dist/controllers/focus_controller.js.map +1 -1
  111. package/dist/controllers/form_field_controller.js +147 -132
  112. package/dist/controllers/form_field_controller.js.map +1 -1
  113. package/dist/controllers/form_validation_controller.js +13 -86
  114. package/dist/controllers/form_validation_controller.js.map +1 -1
  115. package/dist/controllers/frame_loading_controller.d.ts +41 -9
  116. package/dist/controllers/frame_loading_controller.js +264 -213
  117. package/dist/controllers/frame_loading_controller.js.map +1 -1
  118. package/dist/controllers/highlight_controller.d.ts +22 -2
  119. package/dist/controllers/highlight_controller.js +107 -75
  120. package/dist/controllers/highlight_controller.js.map +1 -1
  121. package/dist/controllers/hover_card_controller.d.ts +56 -3
  122. package/dist/controllers/hover_card_controller.js +309 -118
  123. package/dist/controllers/hover_card_controller.js.map +1 -1
  124. package/dist/controllers/idle_controller.d.ts +42 -1
  125. package/dist/controllers/idle_controller.js +267 -101
  126. package/dist/controllers/idle_controller.js.map +1 -1
  127. package/dist/controllers/input_mask_controller.js +71 -72
  128. package/dist/controllers/input_mask_controller.js.map +1 -1
  129. package/dist/controllers/intersection_controller.d.ts +32 -13
  130. package/dist/controllers/intersection_controller.js +147 -106
  131. package/dist/controllers/intersection_controller.js.map +1 -1
  132. package/dist/controllers/lazy_frame_controller.d.ts +16 -0
  133. package/dist/controllers/lazy_frame_controller.js +9 -65
  134. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  135. package/dist/controllers/listbox_controller.d.ts +34 -2
  136. package/dist/controllers/listbox_controller.js +306 -204
  137. package/dist/controllers/listbox_controller.js.map +1 -1
  138. package/dist/controllers/local_time_controller.d.ts +1 -1
  139. package/dist/controllers/local_time_controller.js +54 -64
  140. package/dist/controllers/local_time_controller.js.map +1 -1
  141. package/dist/controllers/masonry_controller.d.ts +11 -3
  142. package/dist/controllers/masonry_controller.js +70 -93
  143. package/dist/controllers/masonry_controller.js.map +1 -1
  144. package/dist/controllers/menu_controller.d.ts +32 -7
  145. package/dist/controllers/menu_controller.js +214 -156
  146. package/dist/controllers/menu_controller.js.map +1 -1
  147. package/dist/controllers/menubar_controller.d.ts +4 -4
  148. package/dist/controllers/menubar_controller.js +170 -329
  149. package/dist/controllers/menubar_controller.js.map +1 -1
  150. package/dist/controllers/meter_controller.d.ts +20 -0
  151. package/dist/controllers/meter_controller.js +151 -67
  152. package/dist/controllers/meter_controller.js.map +1 -1
  153. package/dist/controllers/multi_select_controller.d.ts +32 -4
  154. package/dist/controllers/multi_select_controller.js +593 -358
  155. package/dist/controllers/multi_select_controller.js.map +1 -1
  156. package/dist/controllers/navigation_menu_controller.d.ts +8 -1
  157. package/dist/controllers/navigation_menu_controller.js +124 -232
  158. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  159. package/dist/controllers/nested_form_controller.d.ts +10 -0
  160. package/dist/controllers/nested_form_controller.js +352 -182
  161. package/dist/controllers/nested_form_controller.js.map +1 -1
  162. package/dist/controllers/network_status_controller.d.ts +23 -0
  163. package/dist/controllers/network_status_controller.js +242 -54
  164. package/dist/controllers/network_status_controller.js.map +1 -1
  165. package/dist/controllers/number_input_controller.d.ts +26 -2
  166. package/dist/controllers/number_input_controller.js +320 -263
  167. package/dist/controllers/number_input_controller.js.map +1 -1
  168. package/dist/controllers/optimistic_controller.js +16 -76
  169. package/dist/controllers/optimistic_controller.js.map +1 -1
  170. package/dist/controllers/otp_controller.d.ts +20 -4
  171. package/dist/controllers/otp_controller.js +198 -193
  172. package/dist/controllers/otp_controller.js.map +1 -1
  173. package/dist/controllers/overflow_indicator_controller.d.ts +5 -0
  174. package/dist/controllers/overflow_indicator_controller.js +116 -113
  175. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  176. package/dist/controllers/overflow_menu_controller.d.ts +48 -11
  177. package/dist/controllers/overflow_menu_controller.js +343 -283
  178. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  179. package/dist/controllers/pagination_controller.d.ts +35 -6
  180. package/dist/controllers/pagination_controller.js +295 -119
  181. package/dist/controllers/pagination_controller.js.map +1 -1
  182. package/dist/controllers/password_reveal_controller.d.ts +45 -8
  183. package/dist/controllers/password_reveal_controller.js +389 -121
  184. package/dist/controllers/password_reveal_controller.js.map +1 -1
  185. package/dist/controllers/password_strength_controller.d.ts +14 -5
  186. package/dist/controllers/password_strength_controller.js +99 -153
  187. package/dist/controllers/password_strength_controller.js.map +1 -1
  188. package/dist/controllers/persist_controller.d.ts +11 -4
  189. package/dist/controllers/persist_controller.js +237 -103
  190. package/dist/controllers/persist_controller.js.map +1 -1
  191. package/dist/controllers/pointer_drag_controller.d.ts +19 -7
  192. package/dist/controllers/pointer_drag_controller.js +185 -165
  193. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  194. package/dist/controllers/popover_controller.d.ts +38 -2
  195. package/dist/controllers/popover_controller.js +236 -97
  196. package/dist/controllers/popover_controller.js.map +1 -1
  197. package/dist/controllers/portal_controller.d.ts +44 -4
  198. package/dist/controllers/portal_controller.js +209 -76
  199. package/dist/controllers/portal_controller.js.map +1 -1
  200. package/dist/controllers/preview_guard_controller.d.ts +10 -4
  201. package/dist/controllers/preview_guard_controller.js +232 -116
  202. package/dist/controllers/preview_guard_controller.js.map +1 -1
  203. package/dist/controllers/progress_controller.d.ts +11 -0
  204. package/dist/controllers/progress_controller.js +125 -56
  205. package/dist/controllers/progress_controller.js.map +1 -1
  206. package/dist/controllers/radio_group_controller.d.ts +14 -5
  207. package/dist/controllers/radio_group_controller.js +117 -137
  208. package/dist/controllers/radio_group_controller.js.map +1 -1
  209. package/dist/controllers/range_slider_controller.d.ts +43 -3
  210. package/dist/controllers/range_slider_controller.js +192 -105
  211. package/dist/controllers/range_slider_controller.js.map +1 -1
  212. package/dist/controllers/rating_controller.d.ts +20 -4
  213. package/dist/controllers/rating_controller.js +418 -207
  214. package/dist/controllers/rating_controller.js.map +1 -1
  215. package/dist/controllers/read_more_controller.d.ts +2 -0
  216. package/dist/controllers/read_more_controller.js +134 -63
  217. package/dist/controllers/read_more_controller.js.map +1 -1
  218. package/dist/controllers/reading_progress_controller.d.ts +1 -1
  219. package/dist/controllers/reading_progress_controller.js +147 -135
  220. package/dist/controllers/reading_progress_controller.js.map +1 -1
  221. package/dist/controllers/relative_time_controller.d.ts +18 -4
  222. package/dist/controllers/relative_time_controller.js +145 -110
  223. package/dist/controllers/relative_time_controller.js.map +1 -1
  224. package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
  225. package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +97 -38
  226. package/dist/controllers/reset_on_restore_controller.js.map +1 -0
  227. package/dist/controllers/resizable_controller.d.ts +28 -2
  228. package/dist/controllers/resizable_controller.js +255 -139
  229. package/dist/controllers/resizable_controller.js.map +1 -1
  230. package/dist/controllers/roving_controller.js +39 -84
  231. package/dist/controllers/roving_controller.js.map +1 -1
  232. package/dist/controllers/scroll_area_controller.d.ts +7 -3
  233. package/dist/controllers/scroll_area_controller.js +428 -225
  234. package/dist/controllers/scroll_area_controller.js.map +1 -1
  235. package/dist/controllers/scroll_restore_controller.js +0 -53
  236. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  237. package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
  238. package/dist/controllers/scroll_visibility_controller.js +395 -145
  239. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  240. package/dist/controllers/scrollspy_controller.d.ts +6 -1
  241. package/dist/controllers/scrollspy_controller.js +181 -242
  242. package/dist/controllers/scrollspy_controller.js.map +1 -1
  243. package/dist/controllers/separator_controller.d.ts +19 -4
  244. package/dist/controllers/separator_controller.js +267 -140
  245. package/dist/controllers/separator_controller.js.map +1 -1
  246. package/dist/controllers/sidebar_controller.d.ts +64 -7
  247. package/dist/controllers/sidebar_controller.js +1023 -386
  248. package/dist/controllers/sidebar_controller.js.map +1 -1
  249. package/dist/controllers/skeleton_controller.d.ts +23 -0
  250. package/dist/controllers/skeleton_controller.js +248 -97
  251. package/dist/controllers/skeleton_controller.js.map +1 -1
  252. package/dist/controllers/slider_controller.d.ts +27 -1
  253. package/dist/controllers/slider_controller.js +159 -79
  254. package/dist/controllers/slider_controller.js.map +1 -1
  255. package/dist/controllers/smart_sticky_header_controller.d.ts +21 -3
  256. package/dist/controllers/smart_sticky_header_controller.js +162 -63
  257. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  258. package/dist/controllers/sortable_controller.js +0 -112
  259. package/dist/controllers/sortable_controller.js.map +1 -1
  260. package/dist/controllers/spinner_controller.d.ts +39 -4
  261. package/dist/controllers/spinner_controller.js +277 -169
  262. package/dist/controllers/spinner_controller.js.map +1 -1
  263. package/dist/controllers/step_indicator_controller.d.ts +5 -0
  264. package/dist/controllers/step_indicator_controller.js +99 -46
  265. package/dist/controllers/step_indicator_controller.js.map +1 -1
  266. package/dist/controllers/stepper_controller.d.ts +12 -3
  267. package/dist/controllers/stepper_controller.js +114 -73
  268. package/dist/controllers/stepper_controller.js.map +1 -1
  269. package/dist/controllers/stick_to_bottom_controller.d.ts +6 -0
  270. package/dist/controllers/stick_to_bottom_controller.js +262 -138
  271. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  272. package/dist/controllers/sticky_observer_controller.d.ts +11 -0
  273. package/dist/controllers/sticky_observer_controller.js +214 -49
  274. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  275. package/dist/controllers/submit_once_controller.d.ts +23 -8
  276. package/dist/controllers/submit_once_controller.js +294 -205
  277. package/dist/controllers/submit_once_controller.js.map +1 -1
  278. package/dist/controllers/switch_controller.d.ts +12 -1
  279. package/dist/controllers/switch_controller.js +33 -60
  280. package/dist/controllers/switch_controller.js.map +1 -1
  281. package/dist/controllers/tabs_controller.d.ts +2 -2
  282. package/dist/controllers/tabs_controller.js +35 -29
  283. package/dist/controllers/tabs_controller.js.map +1 -1
  284. package/dist/controllers/tags_input_controller.d.ts +12 -0
  285. package/dist/controllers/tags_input_controller.js +136 -145
  286. package/dist/controllers/tags_input_controller.js.map +1 -1
  287. package/dist/controllers/textarea_autosize_controller.d.ts +10 -0
  288. package/dist/controllers/textarea_autosize_controller.js +71 -58
  289. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  290. package/dist/controllers/theme_controller.d.ts +21 -9
  291. package/dist/controllers/theme_controller.js +130 -112
  292. package/dist/controllers/theme_controller.js.map +1 -1
  293. package/dist/controllers/time_picker_controller.d.ts +18 -1
  294. package/dist/controllers/time_picker_controller.js +146 -80
  295. package/dist/controllers/time_picker_controller.js.map +1 -1
  296. package/dist/controllers/toast_controller.d.ts +36 -11
  297. package/dist/controllers/toast_controller.js +186 -297
  298. package/dist/controllers/toast_controller.js.map +1 -1
  299. package/dist/controllers/toggle_group_controller.d.ts +12 -3
  300. package/dist/controllers/toggle_group_controller.js +95 -136
  301. package/dist/controllers/toggle_group_controller.js.map +1 -1
  302. package/dist/controllers/toolbar_controller.js +68 -98
  303. package/dist/controllers/toolbar_controller.js.map +1 -1
  304. package/dist/controllers/tooltip_controller.d.ts +45 -3
  305. package/dist/controllers/tooltip_controller.js +158 -124
  306. package/dist/controllers/tooltip_controller.js.map +1 -1
  307. package/dist/controllers/transition_controller.d.ts +22 -4
  308. package/dist/controllers/transition_controller.js +123 -119
  309. package/dist/controllers/transition_controller.js.map +1 -1
  310. package/dist/controllers/tree_view_controller.d.ts +21 -11
  311. package/dist/controllers/tree_view_controller.js +150 -345
  312. package/dist/controllers/tree_view_controller.js.map +1 -1
  313. package/dist/index.d.ts +8 -5
  314. package/dist/index.js +6370 -9346
  315. package/dist/index.js.map +1 -1
  316. package/dist/inspector/cli.d.ts +23 -3
  317. package/dist/inspector/cli.js +92 -37
  318. package/dist/inspector/cli.js.map +1 -1
  319. package/dist/inspector/cli_bin.js +92 -56
  320. package/dist/inspector/cli_bin.js.map +1 -1
  321. package/dist/inspector/examples.json +8 -8
  322. package/dist/inspector/manifest.json +787 -100
  323. package/dist/positioning/index.d.ts +8 -0
  324. package/dist/positioning/index.js +148 -47
  325. package/dist/positioning/index.js.map +1 -1
  326. package/package.json +6 -6
  327. package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
  328. package/dist/controllers/reset_before_cache_controller.js.map +0 -1
@@ -1,8 +1,5 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/direct_upload_controller.ts
4
-
5
- // src/utils/announce.ts
6
3
  function announce(message, options = {}) {
7
4
  const text = message.trim();
8
5
  if (text.length === 0) return;
@@ -19,36 +16,6 @@ function fillTemplate(template, values) {
19
16
  });
20
17
  }
21
18
 
22
- // src/utils/before_cache_reset.ts
23
- var BeforeCacheReset = class _BeforeCacheReset {
24
- /** Every subscribed instance, iterated by the one shared document listener. */
25
- static #subscribers = /* @__PURE__ */ new Set();
26
- /** The shared listener; installed while at least one instance is subscribed. */
27
- static #onBeforeCache = () => {
28
- for (const subscriber of _BeforeCacheReset.#subscribers) subscriber.#rewind();
29
- };
30
- #rewind;
31
- /** @param rewind - the pass that returns this controller's state to its initial form. */
32
- constructor(rewind) {
33
- this.#rewind = rewind;
34
- }
35
- /** Subscribes to `turbo:before-cache`; call from `connect()`. Idempotent. */
36
- activate() {
37
- const first = _BeforeCacheReset.#subscribers.size === 0;
38
- _BeforeCacheReset.#subscribers.add(this);
39
- if (first) {
40
- document.addEventListener("turbo:before-cache", _BeforeCacheReset.#onBeforeCache);
41
- }
42
- }
43
- /** Unsubscribes; call from `disconnect()`. Safe when never subscribed. */
44
- deactivate() {
45
- _BeforeCacheReset.#subscribers.delete(this);
46
- if (_BeforeCacheReset.#subscribers.size > 0) return;
47
- document.removeEventListener("turbo:before-cache", _BeforeCacheReset.#onBeforeCache);
48
- }
49
- };
50
-
51
- // src/utils/declared_value.ts
52
19
  function parseDeclared(raw, parse, fallback) {
53
20
  try {
54
21
  return parse(raw);
@@ -68,43 +35,24 @@ function validSelector(element, raw, fallback) {
68
35
  );
69
36
  }
70
37
 
71
- // src/utils/safe_timeout.ts
72
38
  var TimerRegistry = class {
73
- /** Live timer ids that have not yet been cleared (or, for timeouts, fired). */
74
39
  ids = /* @__PURE__ */ new Set();
75
- /**
76
- * Cancels a single tracked timer.
77
- *
78
- * No-ops if the id is unknown (already cleared, fired, or never owned by this
79
- * registry), so callers can clear defensively without guarding.
80
- */
81
40
  clear(id) {
82
41
  if (this.ids.delete(id)) {
83
42
  this.cancel(id);
84
43
  }
85
44
  }
86
- /**
87
- * Cancels every tracked timer. Call this from a controller's `disconnect()`
88
- * to guarantee no timer outlives the element.
89
- */
90
45
  clearAll() {
91
46
  for (const id of this.ids) {
92
47
  this.cancel(id);
93
48
  }
94
49
  this.ids.clear();
95
50
  }
96
- /** Number of timers currently tracked (pending). */
97
51
  get size() {
98
52
  return this.ids.size;
99
53
  }
100
54
  };
101
55
  var SafeTimeout = class extends TimerRegistry {
102
- /**
103
- * Schedules `callback` after `delay` ms and returns the timer id.
104
- *
105
- * The id is removed from the registry automatically when the timeout fires,
106
- * so {@link TimerRegistry.size | size} reflects only still-pending timers.
107
- */
108
56
  set(callback, delay) {
109
57
  const id = this.schedule(() => {
110
58
  this.ids.delete(id);
@@ -121,14 +69,37 @@ var SafeTimeout = class extends TimerRegistry {
121
69
  }
122
70
  };
123
71
 
124
- // src/utils/template_row.ts
72
+ var KeyedTimers = class {
73
+ #timers = new SafeTimeout();
74
+ #pending = /* @__PURE__ */ new Map();
75
+ set(key, callback, delay) {
76
+ this.clear(key);
77
+ const id = this.#timers.set(() => {
78
+ this.#pending.delete(key);
79
+ callback();
80
+ }, delay);
81
+ this.#pending.set(key, id);
82
+ }
83
+ clear(key) {
84
+ this.#timers.clear(this.#pending.get(key) ?? -1);
85
+ this.#pending.delete(key);
86
+ }
87
+ clearAll() {
88
+ this.#timers.clearAll();
89
+ this.#pending.clear();
90
+ }
91
+ has(key) {
92
+ return this.#pending.has(key);
93
+ }
94
+ };
95
+
125
96
  function cloneTemplateRoot(template) {
126
97
  const root = template.content.firstElementChild;
127
98
  return root instanceof HTMLElement ? root.cloneNode(true) : null;
128
99
  }
129
100
 
130
- // src/controllers/direct_upload_controller.ts
131
101
  var REMOVE_DELAY = 4e3;
102
+ var GENERATED_ATTRIBUTE = "generated";
132
103
  var DirectUploadController = class extends Controller {
133
104
  static targets = ["list", "row"];
134
105
  static values = {
@@ -138,10 +109,9 @@ var DirectUploadController = class extends Controller {
138
109
  scope: { type: String, default: "" }
139
110
  };
140
111
  static events = ["progress", "done", "error", "reconcile"];
141
- #timeouts = new SafeTimeout();
112
+ #removals = new KeyedTimers();
142
113
  #rows = /* @__PURE__ */ new Map();
143
- #beforeCache = new BeforeCacheReset(() => this.#rewindForCache());
144
- /** The validated `scope` selector; a broken declaration falls back to `""`. */
114
+ #connected = false;
145
115
  #scopeSelector = "";
146
116
  #onInitialize = (event) => {
147
117
  if (!this.#inScope(event)) return;
@@ -165,26 +135,47 @@ var DirectUploadController = class extends Controller {
165
135
  this.#complete(this.#key(detail.id), this.#name(detail));
166
136
  };
167
137
  connect() {
138
+ this.#connected = true;
168
139
  document.addEventListener("direct-upload:initialize", this.#onInitialize);
169
140
  document.addEventListener("direct-upload:progress", this.#onProgress);
170
141
  document.addEventListener("direct-upload:error", this.#onError);
171
142
  document.addEventListener("direct-upload:end", this.#onEnd);
172
- this.#beforeCache.activate();
173
- this.#rescheduleRemovals();
143
+ this.#discardInherited();
144
+ this.#syncRemovals();
174
145
  }
175
146
  disconnect() {
147
+ this.#connected = false;
176
148
  document.removeEventListener("direct-upload:initialize", this.#onInitialize);
177
149
  document.removeEventListener("direct-upload:progress", this.#onProgress);
178
150
  document.removeEventListener("direct-upload:error", this.#onError);
179
151
  document.removeEventListener("direct-upload:end", this.#onEnd);
180
- this.#beforeCache.deactivate();
181
- this.#timeouts.clearAll();
152
+ this.#removals.clearAll();
153
+ }
154
+ get #generatedAttribute() {
155
+ return `data-${this.identifier}-${GENERATED_ATTRIBUTE}`;
156
+ }
157
+ #discardInherited() {
158
+ if (this.#rows.size > 0 || !this.hasListTarget) return;
159
+ const ids = [];
160
+ for (const row of Array.from(this.listTarget.children)) {
161
+ const id = row.getAttribute(this.#generatedAttribute);
162
+ if (id === null) continue;
163
+ row.remove();
164
+ ids.push(id);
165
+ }
166
+ if (ids.length === 0) return;
167
+ this.#syncAggregate();
168
+ this.dispatch("reconcile", { detail: { ids } });
182
169
  }
183
- /** Validates `scope` once so the per-event path never parses or throws. */
184
170
  scopeValueChanged() {
185
171
  this.#scopeSelector = validSelector(this.element, this.scopeValue, "");
186
172
  }
187
- /** Updates a row's progress and the aggregate, emitting `progress`. */
173
+ removeOnDoneValueChanged() {
174
+ if (this.#connected) this.#syncRemovals();
175
+ }
176
+ listTargetDisconnected() {
177
+ if (this.#connected) this.#syncAggregate();
178
+ }
188
179
  #updateProgress(id, percent, name) {
189
180
  const row = this.#rowFor(id, name);
190
181
  if (row === null || this.#isSettled(row)) return;
@@ -192,12 +183,6 @@ var DirectUploadController = class extends Controller {
192
183
  this.#syncAggregate();
193
184
  this.dispatch("progress", { detail: { id, percent: clamped } });
194
185
  }
195
- /**
196
- * Marks a not-yet-settled row done at 100%, announces it, and emits `done`.
197
- *
198
- * @stimeoRuntimeOnly `announceDoneText` words the one announcement of this completion and
199
- * `removeOnDone` decides whether it arms the row's removal.
200
- */
201
186
  #complete(id, name) {
202
187
  const row = this.#rowFor(id, name);
203
188
  if (row === null || this.#isSettled(row)) return;
@@ -206,18 +191,8 @@ var DirectUploadController = class extends Controller {
206
191
  this.#syncAggregate();
207
192
  this.#announce(this.announceDoneTextValue, name, row);
208
193
  this.dispatch("done", { detail: { id } });
209
- if (this.removeOnDoneValue) {
210
- this.#timeouts.set(() => this.#removeRow(id), REMOVE_DELAY);
211
- }
194
+ if (this.removeOnDoneValue) this.#scheduleRemoval(id, row);
212
195
  }
213
- /**
214
- * Marks a not-yet-settled row failed, announces it, and emits `error`.
215
- * Returns whether the failure is rendered by this widget (used to decide the
216
- * `direct-upload:error` default), which also holds when the row already
217
- * displays an earlier failure.
218
- *
219
- * @stimeoRuntimeOnly `announceErrorText` words the one announcement of this failure.
220
- */
221
196
  #fail(id, error, name) {
222
197
  const row = this.#rowFor(id, name);
223
198
  if (row === null) return false;
@@ -227,27 +202,25 @@ var DirectUploadController = class extends Controller {
227
202
  this.dispatch("error", { detail: { id, error } });
228
203
  return true;
229
204
  }
230
- /** Whether the row reached a terminal state; settled rows are never rewritten. */
231
205
  #isSettled(row) {
232
206
  const state = row.getAttribute("data-upload-state");
233
207
  return state === "done" || state === "error";
234
208
  }
235
- /**
236
- * Re-arms `removeOnDone` for completed rows after a reconnect.
237
- *
238
- * @stimeoRuntimeOnly `removeOnDone` decides whether reconnecting arms the removal of finished
239
- * rows again.
240
- */
241
- #rescheduleRemovals() {
242
- if (!this.removeOnDoneValue) return;
209
+ #syncRemovals() {
210
+ if (!this.removeOnDoneValue) {
211
+ this.#removals.clearAll();
212
+ return;
213
+ }
243
214
  this.#prune();
244
215
  for (const [id, row] of this.#rows) {
245
- if (row.getAttribute("data-upload-state") === "done") {
246
- this.#timeouts.set(() => this.#removeRow(id), REMOVE_DELAY);
216
+ if (row.getAttribute("data-upload-state") === "done" && !this.#removals.has(id)) {
217
+ this.#scheduleRemoval(id, row);
247
218
  }
248
219
  }
249
220
  }
250
- /** Returns the live row for `id`, creating (and labeling) one on first sight. */
221
+ #scheduleRemoval(id, row) {
222
+ this.#removals.set(id, () => this.#removeRow(row), REMOVE_DELAY);
223
+ }
251
224
  #rowFor(id, name) {
252
225
  const key = this.#key(id);
253
226
  const existing = this.#rows.get(key);
@@ -256,13 +229,13 @@ var DirectUploadController = class extends Controller {
256
229
  this.#applyName(existing, name);
257
230
  return existing;
258
231
  }
259
- existing.remove();
260
- this.#rows.delete(key);
232
+ this.#retire(key, existing);
261
233
  }
262
234
  if (!this.hasRowTarget || !this.hasListTarget) return null;
263
235
  const clone = cloneTemplateRoot(this.rowTarget);
264
236
  if (!clone) return null;
265
237
  this.#applyName(clone, name);
238
+ clone.setAttribute(this.#generatedAttribute, key);
266
239
  clone.setAttribute("data-upload-state", "uploading");
267
240
  this.#applyProgress(clone, 0);
268
241
  this.listTarget.appendChild(clone);
@@ -270,20 +243,12 @@ var DirectUploadController = class extends Controller {
270
243
  this.#syncAggregate();
271
244
  return clone;
272
245
  }
273
- /**
274
- * Writes the event's file name into `[data-field="name"]` and, unless the row
275
- * already carries a non-blank `aria-label` — authored on the template or
276
- * applied by an earlier event — makes it the accessible name too. The visible
277
- * name never depends on the label: an authored label keeps its wording while
278
- * the field still shows which file this row tracks.
279
- */
280
246
  #applyName(row, name) {
281
247
  if (name.length === 0) return;
282
248
  this.#setField(row, "name", name);
283
249
  if ((row.getAttribute("aria-label") ?? "").trim().length > 0) return;
284
250
  row.setAttribute("aria-label", name);
285
251
  }
286
- /** Writes one progress value to every per-row hook; returns the clamped percent. */
287
252
  #applyProgress(row, percent) {
288
253
  const clamped = Math.max(0, Math.min(100, Math.round(percent)));
289
254
  row.setAttribute("aria-valuenow", String(clamped));
@@ -292,17 +257,10 @@ var DirectUploadController = class extends Controller {
292
257
  this.#setField(row, "percent", `${clamped}%`);
293
258
  return clamped;
294
259
  }
295
- #removeRow(id) {
296
- const row = this.#rows.get(id);
297
- if (row === void 0) return;
260
+ #removeRow(row) {
298
261
  row.remove();
299
- this.#rows.delete(id);
300
262
  this.#syncAggregate();
301
263
  }
302
- /**
303
- * Reflects the average progress across live rows on the controller element,
304
- * withdrawing both hooks once no rows remain.
305
- */
306
264
  #syncAggregate() {
307
265
  this.#prune();
308
266
  if (this.#rows.size === 0) {
@@ -318,50 +276,21 @@ var DirectUploadController = class extends Controller {
318
276
  this.element.setAttribute("data-upload-progress", String(overall));
319
277
  this.element.style.setProperty("--stimeo--upload-progress", `${overall}%`);
320
278
  }
321
- /**
322
- * Whether a bookkept row is still this widget's live UI: connected, and — when
323
- * a `list` target is present — inside the *current* one, so re-pointing the
324
- * target attribute at a new element retires rows kept alive in the old list.
325
- */
326
279
  #tracksRow(row) {
327
280
  if (!row.isConnected) return false;
328
281
  return !this.hasListTarget || this.listTarget.contains(row);
329
282
  }
330
- /**
331
- * Retires rows that left the live UI (list swap, external removal). A retired
332
- * clone is removed outright — generated rows only ever live under the current
333
- * `list`, so the before-cache rewind never has an untracked leftover to miss.
334
- */
335
283
  #prune() {
336
284
  for (const [id, row] of this.#rows) {
337
285
  if (this.#tracksRow(row)) continue;
338
- row.remove();
339
- this.#rows.delete(id);
286
+ this.#retire(id, row);
340
287
  }
341
288
  }
342
- /**
343
- * Rewinds for the snapshot and reports what that discarded. An upload in flight
344
- * cannot survive the navigation, so a consumer mirroring the rows would keep a
345
- * progress bar that never resolves.
346
- */
347
- #rewindForCache() {
348
- const ids = [...this.#rows.keys()];
349
- this.#reset();
350
- if (ids.length > 0) this.dispatch("reconcile", { detail: { ids } });
351
- }
352
- #reset() {
353
- for (const row of this.#rows.values()) row.remove();
354
- this.#rows.clear();
355
- this.#timeouts.clearAll();
356
- this.#syncAggregate();
289
+ #retire(id, row) {
290
+ row.remove();
291
+ this.#rows.delete(id);
292
+ this.#removals.clear(id);
357
293
  }
358
- /**
359
- * Sends one consumer-worded message to the page's shared announcer. `{name}`
360
- * resolves to the row's displayed name first — the event that settles an
361
- * upload may omit the file although an earlier event already named the row —
362
- * then the event's own name, then the accessible name (which an authored
363
- * label owns, so it is the last resort, not the primary source).
364
- */
365
294
  #announce(template, name, row) {
366
295
  const stored = this.#field(row, "name")?.textContent ?? "";
367
296
  const label = stored.length > 0 ? stored : name.length > 0 ? name : row.getAttribute("aria-label") ?? "";
@@ -377,17 +306,9 @@ var DirectUploadController = class extends Controller {
377
306
  #detail(event) {
378
307
  return event.detail ?? {};
379
308
  }
380
- /** The event's file name, or `""` when it carries none. */
381
309
  #name(detail) {
382
310
  return detail.file?.name ?? "";
383
311
  }
384
- /**
385
- * Whether an event belongs to this controller. With `scope` set, only events
386
- * whose target (the file input) sits inside an element matching `scope` are
387
- * handled, so several upload widgets on one page do not cross-populate.
388
- * Resolved with `closest()` from the target itself, so the chatty `progress`
389
- * stream never pays a document-wide query. Empty `scope` handles all.
390
- */
391
312
  #inScope(event) {
392
313
  if (this.#scopeSelector.length === 0) return true;
393
314
  const target = event.target;
@@ -399,5 +320,4 @@ var DirectUploadController = class extends Controller {
399
320
  };
400
321
 
401
322
  export { DirectUploadController };
402
- //# sourceMappingURL=direct_upload_controller.js.map
403
323
  //# sourceMappingURL=direct_upload_controller.js.map