stimeo-ui 0.15.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 (332) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/README.md +128 -1
  3. package/dist/cable/index.d.ts +79 -23
  4. package/dist/cable/index.js +392 -417
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/controllers/accordion_controller.d.ts +34 -5
  7. package/dist/controllers/accordion_controller.js +228 -28
  8. package/dist/controllers/accordion_controller.js.map +1 -1
  9. package/dist/controllers/alert_dialog_controller.d.ts +20 -9
  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 +38 -7
  13. package/dist/controllers/announcer_controller.js +135 -191
  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 +295 -110
  19. package/dist/controllers/auto_submit_controller.js.map +1 -1
  20. package/dist/controllers/avatar_controller.js +172 -106
  21. package/dist/controllers/avatar_controller.js.map +1 -1
  22. package/dist/controllers/breadcrumb_controller.d.ts +10 -7
  23. package/dist/controllers/breadcrumb_controller.js +0 -129
  24. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  25. package/dist/controllers/bulk_select_controller.d.ts +22 -4
  26. package/dist/controllers/bulk_select_controller.js +264 -53
  27. package/dist/controllers/bulk_select_controller.js.map +1 -1
  28. package/dist/controllers/calendar_controller.d.ts +109 -28
  29. package/dist/controllers/calendar_controller.js +346 -180
  30. package/dist/controllers/calendar_controller.js.map +1 -1
  31. package/dist/controllers/carousel_controller.d.ts +99 -27
  32. package/dist/controllers/carousel_controller.js +587 -300
  33. package/dist/controllers/carousel_controller.js.map +1 -1
  34. package/dist/controllers/character_counter_controller.d.ts +18 -2
  35. package/dist/controllers/character_counter_controller.js +271 -143
  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 +77 -75
  39. package/dist/controllers/checkbox_controller.js.map +1 -1
  40. package/dist/controllers/clipboard_controller.d.ts +44 -7
  41. package/dist/controllers/clipboard_controller.js +187 -108
  42. package/dist/controllers/clipboard_controller.js.map +1 -1
  43. package/dist/controllers/collapsible_controller.d.ts +41 -5
  44. package/dist/controllers/collapsible_controller.js +374 -108
  45. package/dist/controllers/collapsible_controller.js.map +1 -1
  46. package/dist/controllers/color_picker_controller.d.ts +47 -14
  47. package/dist/controllers/color_picker_controller.js +183 -127
  48. package/dist/controllers/color_picker_controller.js.map +1 -1
  49. package/dist/controllers/combobox_controller.d.ts +33 -6
  50. package/dist/controllers/combobox_controller.js +426 -109
  51. package/dist/controllers/combobox_controller.js.map +1 -1
  52. package/dist/controllers/command_palette_controller.d.ts +45 -14
  53. package/dist/controllers/command_palette_controller.js +994 -350
  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 +212 -125
  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 +939 -245
  60. package/dist/controllers/confirm_controller.js.map +1 -1
  61. package/dist/controllers/context_menu_controller.d.ts +36 -3
  62. package/dist/controllers/context_menu_controller.js +275 -127
  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 +75 -2
  68. package/dist/controllers/countdown_controller.js +235 -97
  69. package/dist/controllers/countdown_controller.js.map +1 -1
  70. package/dist/controllers/currency_input_controller.d.ts +93 -15
  71. package/dist/controllers/currency_input_controller.js +241 -118
  72. package/dist/controllers/currency_input_controller.js.map +1 -1
  73. package/dist/controllers/data_grid_controller.d.ts +78 -22
  74. package/dist/controllers/data_grid_controller.js +229 -135
  75. package/dist/controllers/data_grid_controller.js.map +1 -1
  76. package/dist/controllers/date_range_picker_controller.d.ts +64 -11
  77. package/dist/controllers/date_range_picker_controller.js +359 -165
  78. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  79. package/dist/controllers/dialog_controller.d.ts +22 -3
  80. package/dist/controllers/dialog_controller.js +887 -225
  81. package/dist/controllers/dialog_controller.js.map +1 -1
  82. package/dist/controllers/direct_upload_controller.d.ts +24 -7
  83. package/dist/controllers/direct_upload_controller.js +80 -142
  84. package/dist/controllers/direct_upload_controller.js.map +1 -1
  85. package/dist/controllers/dirty_form_controller.d.ts +2 -2
  86. package/dist/controllers/dirty_form_controller.js +26 -47
  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 +175 -20
  90. package/dist/controllers/dismissible_controller.js.map +1 -1
  91. package/dist/controllers/drawer_controller.d.ts +52 -16
  92. package/dist/controllers/drawer_controller.js +963 -336
  93. package/dist/controllers/drawer_controller.js.map +1 -1
  94. package/dist/controllers/dropdown_controller.d.ts +39 -3
  95. package/dist/controllers/dropdown_controller.js +342 -85
  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 +182 -58
  99. package/dist/controllers/editable_controller.js.map +1 -1
  100. package/dist/controllers/empty_state_controller.js +67 -53
  101. package/dist/controllers/empty_state_controller.js.map +1 -1
  102. package/dist/controllers/file_dropzone_controller.d.ts +60 -18
  103. package/dist/controllers/file_dropzone_controller.js +426 -229
  104. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  105. package/dist/controllers/filter_controller.d.ts +10 -4
  106. package/dist/controllers/filter_controller.js +78 -36
  107. package/dist/controllers/filter_controller.js.map +1 -1
  108. package/dist/controllers/flash_controller.d.ts +57 -14
  109. package/dist/controllers/flash_controller.js +328 -211
  110. package/dist/controllers/flash_controller.js.map +1 -1
  111. package/dist/controllers/focus_controller.d.ts +12 -3
  112. package/dist/controllers/focus_controller.js +654 -239
  113. package/dist/controllers/focus_controller.js.map +1 -1
  114. package/dist/controllers/form_field_controller.js +153 -136
  115. package/dist/controllers/form_field_controller.js.map +1 -1
  116. package/dist/controllers/form_validation_controller.js +29 -96
  117. package/dist/controllers/form_validation_controller.js.map +1 -1
  118. package/dist/controllers/frame_loading_controller.d.ts +41 -9
  119. package/dist/controllers/frame_loading_controller.js +263 -198
  120. package/dist/controllers/frame_loading_controller.js.map +1 -1
  121. package/dist/controllers/highlight_controller.d.ts +22 -2
  122. package/dist/controllers/highlight_controller.js +119 -70
  123. package/dist/controllers/highlight_controller.js.map +1 -1
  124. package/dist/controllers/hover_card_controller.d.ts +65 -4
  125. package/dist/controllers/hover_card_controller.js +335 -118
  126. package/dist/controllers/hover_card_controller.js.map +1 -1
  127. package/dist/controllers/idle_controller.d.ts +58 -4
  128. package/dist/controllers/idle_controller.js +316 -65
  129. package/dist/controllers/idle_controller.js.map +1 -1
  130. package/dist/controllers/input_mask_controller.d.ts +5 -2
  131. package/dist/controllers/input_mask_controller.js +116 -61
  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 +147 -103
  135. package/dist/controllers/intersection_controller.js.map +1 -1
  136. package/dist/controllers/lazy_frame_controller.d.ts +16 -0
  137. package/dist/controllers/lazy_frame_controller.js +9 -56
  138. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  139. package/dist/controllers/listbox_controller.d.ts +84 -10
  140. package/dist/controllers/listbox_controller.js +413 -153
  141. package/dist/controllers/listbox_controller.js.map +1 -1
  142. package/dist/controllers/local_time_controller.d.ts +1 -1
  143. package/dist/controllers/local_time_controller.js +54 -64
  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 +70 -95
  147. package/dist/controllers/masonry_controller.js.map +1 -1
  148. package/dist/controllers/menu_controller.d.ts +40 -9
  149. package/dist/controllers/menu_controller.js +254 -167
  150. package/dist/controllers/menu_controller.js.map +1 -1
  151. package/dist/controllers/menubar_controller.d.ts +15 -4
  152. package/dist/controllers/menubar_controller.js +206 -331
  153. package/dist/controllers/menubar_controller.js.map +1 -1
  154. package/dist/controllers/meter_controller.d.ts +20 -0
  155. package/dist/controllers/meter_controller.js +159 -71
  156. package/dist/controllers/meter_controller.js.map +1 -1
  157. package/dist/controllers/multi_select_controller.d.ts +50 -7
  158. package/dist/controllers/multi_select_controller.js +797 -388
  159. package/dist/controllers/multi_select_controller.js.map +1 -1
  160. package/dist/controllers/navigation_menu_controller.d.ts +19 -1
  161. package/dist/controllers/navigation_menu_controller.js +156 -231
  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 +373 -174
  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 +241 -45
  168. package/dist/controllers/network_status_controller.js.map +1 -1
  169. package/dist/controllers/number_input_controller.d.ts +62 -10
  170. package/dist/controllers/number_input_controller.js +387 -227
  171. package/dist/controllers/number_input_controller.js.map +1 -1
  172. package/dist/controllers/optimistic_controller.js +28 -75
  173. package/dist/controllers/optimistic_controller.js.map +1 -1
  174. package/dist/controllers/otp_controller.d.ts +38 -7
  175. package/dist/controllers/otp_controller.js +344 -196
  176. package/dist/controllers/otp_controller.js.map +1 -1
  177. package/dist/controllers/overflow_indicator_controller.d.ts +13 -12
  178. package/dist/controllers/overflow_indicator_controller.js +167 -93
  179. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  180. package/dist/controllers/overflow_menu_controller.d.ts +66 -9
  181. package/dist/controllers/overflow_menu_controller.js +408 -277
  182. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  183. package/dist/controllers/pagination_controller.d.ts +52 -15
  184. package/dist/controllers/pagination_controller.js +342 -120
  185. package/dist/controllers/pagination_controller.js.map +1 -1
  186. package/dist/controllers/password_reveal_controller.d.ts +60 -9
  187. package/dist/controllers/password_reveal_controller.js +424 -99
  188. package/dist/controllers/password_reveal_controller.js.map +1 -1
  189. package/dist/controllers/password_strength_controller.d.ts +14 -5
  190. package/dist/controllers/password_strength_controller.js +99 -153
  191. package/dist/controllers/password_strength_controller.js.map +1 -1
  192. package/dist/controllers/persist_controller.d.ts +11 -4
  193. package/dist/controllers/persist_controller.js +252 -96
  194. package/dist/controllers/persist_controller.js.map +1 -1
  195. package/dist/controllers/pointer_drag_controller.d.ts +19 -7
  196. package/dist/controllers/pointer_drag_controller.js +263 -164
  197. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  198. package/dist/controllers/popover_controller.d.ts +46 -4
  199. package/dist/controllers/popover_controller.js +267 -94
  200. package/dist/controllers/popover_controller.js.map +1 -1
  201. package/dist/controllers/portal_controller.d.ts +44 -4
  202. package/dist/controllers/portal_controller.js +209 -72
  203. package/dist/controllers/portal_controller.js.map +1 -1
  204. package/dist/controllers/preview_guard_controller.d.ts +10 -4
  205. package/dist/controllers/preview_guard_controller.js +243 -112
  206. package/dist/controllers/preview_guard_controller.js.map +1 -1
  207. package/dist/controllers/progress_controller.d.ts +11 -0
  208. package/dist/controllers/progress_controller.js +132 -59
  209. package/dist/controllers/progress_controller.js.map +1 -1
  210. package/dist/controllers/radio_group_controller.d.ts +19 -8
  211. package/dist/controllers/radio_group_controller.js +138 -133
  212. package/dist/controllers/radio_group_controller.js.map +1 -1
  213. package/dist/controllers/range_slider_controller.d.ts +92 -4
  214. package/dist/controllers/range_slider_controller.js +245 -112
  215. package/dist/controllers/range_slider_controller.js.map +1 -1
  216. package/dist/controllers/rating_controller.d.ts +33 -6
  217. package/dist/controllers/rating_controller.js +429 -194
  218. package/dist/controllers/rating_controller.js.map +1 -1
  219. package/dist/controllers/read_more_controller.d.ts +26 -2
  220. package/dist/controllers/read_more_controller.js +185 -47
  221. package/dist/controllers/read_more_controller.js.map +1 -1
  222. package/dist/controllers/reading_progress_controller.d.ts +1 -1
  223. package/dist/controllers/reading_progress_controller.js +147 -135
  224. package/dist/controllers/reading_progress_controller.js.map +1 -1
  225. package/dist/controllers/relative_time_controller.d.ts +18 -4
  226. package/dist/controllers/relative_time_controller.js +145 -110
  227. package/dist/controllers/relative_time_controller.js.map +1 -1
  228. package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
  229. package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +97 -38
  230. package/dist/controllers/reset_on_restore_controller.js.map +1 -0
  231. package/dist/controllers/resizable_controller.d.ts +44 -4
  232. package/dist/controllers/resizable_controller.js +294 -118
  233. package/dist/controllers/resizable_controller.js.map +1 -1
  234. package/dist/controllers/roving_controller.js +39 -84
  235. package/dist/controllers/roving_controller.js.map +1 -1
  236. package/dist/controllers/scroll_area_controller.d.ts +7 -3
  237. package/dist/controllers/scroll_area_controller.js +428 -221
  238. package/dist/controllers/scroll_area_controller.js.map +1 -1
  239. package/dist/controllers/scroll_restore_controller.js +0 -53
  240. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  241. package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
  242. package/dist/controllers/scroll_visibility_controller.js +395 -146
  243. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  244. package/dist/controllers/scrollspy_controller.d.ts +9 -3
  245. package/dist/controllers/scrollspy_controller.js +181 -236
  246. package/dist/controllers/scrollspy_controller.js.map +1 -1
  247. package/dist/controllers/separator_controller.d.ts +59 -17
  248. package/dist/controllers/separator_controller.js +288 -132
  249. package/dist/controllers/separator_controller.js.map +1 -1
  250. package/dist/controllers/sidebar_controller.d.ts +81 -7
  251. package/dist/controllers/sidebar_controller.js +1071 -375
  252. package/dist/controllers/sidebar_controller.js.map +1 -1
  253. package/dist/controllers/skeleton_controller.d.ts +23 -0
  254. package/dist/controllers/skeleton_controller.js +248 -92
  255. package/dist/controllers/skeleton_controller.js.map +1 -1
  256. package/dist/controllers/slider_controller.d.ts +72 -8
  257. package/dist/controllers/slider_controller.js +211 -96
  258. package/dist/controllers/slider_controller.js.map +1 -1
  259. package/dist/controllers/smart_sticky_header_controller.d.ts +21 -3
  260. package/dist/controllers/smart_sticky_header_controller.js +163 -54
  261. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  262. package/dist/controllers/sortable_controller.js +13 -110
  263. package/dist/controllers/sortable_controller.js.map +1 -1
  264. package/dist/controllers/spinner_controller.d.ts +39 -4
  265. package/dist/controllers/spinner_controller.js +277 -161
  266. package/dist/controllers/spinner_controller.js.map +1 -1
  267. package/dist/controllers/step_indicator_controller.d.ts +24 -17
  268. package/dist/controllers/step_indicator_controller.js +107 -53
  269. package/dist/controllers/step_indicator_controller.js.map +1 -1
  270. package/dist/controllers/stepper_controller.d.ts +43 -9
  271. package/dist/controllers/stepper_controller.js +171 -48
  272. package/dist/controllers/stepper_controller.js.map +1 -1
  273. package/dist/controllers/stick_to_bottom_controller.d.ts +25 -0
  274. package/dist/controllers/stick_to_bottom_controller.js +310 -116
  275. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  276. package/dist/controllers/sticky_observer_controller.d.ts +11 -0
  277. package/dist/controllers/sticky_observer_controller.js +214 -49
  278. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  279. package/dist/controllers/submit_once_controller.d.ts +22 -6
  280. package/dist/controllers/submit_once_controller.js +294 -192
  281. package/dist/controllers/submit_once_controller.js.map +1 -1
  282. package/dist/controllers/switch_controller.d.ts +40 -7
  283. package/dist/controllers/switch_controller.js +107 -43
  284. package/dist/controllers/switch_controller.js.map +1 -1
  285. package/dist/controllers/tabs_controller.d.ts +13 -1
  286. package/dist/controllers/tabs_controller.js +50 -25
  287. package/dist/controllers/tabs_controller.js.map +1 -1
  288. package/dist/controllers/tags_input_controller.d.ts +27 -3
  289. package/dist/controllers/tags_input_controller.js +290 -149
  290. package/dist/controllers/tags_input_controller.js.map +1 -1
  291. package/dist/controllers/textarea_autosize_controller.d.ts +10 -0
  292. package/dist/controllers/textarea_autosize_controller.js +71 -58
  293. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  294. package/dist/controllers/theme_controller.d.ts +37 -8
  295. package/dist/controllers/theme_controller.js +148 -80
  296. package/dist/controllers/theme_controller.js.map +1 -1
  297. package/dist/controllers/time_picker_controller.d.ts +18 -1
  298. package/dist/controllers/time_picker_controller.js +162 -81
  299. package/dist/controllers/time_picker_controller.js.map +1 -1
  300. package/dist/controllers/toast_controller.d.ts +85 -23
  301. package/dist/controllers/toast_controller.js +365 -193
  302. package/dist/controllers/toast_controller.js.map +1 -1
  303. package/dist/controllers/toggle_group_controller.d.ts +60 -9
  304. package/dist/controllers/toggle_group_controller.js +194 -99
  305. package/dist/controllers/toggle_group_controller.js.map +1 -1
  306. package/dist/controllers/toolbar_controller.js +92 -90
  307. package/dist/controllers/toolbar_controller.js.map +1 -1
  308. package/dist/controllers/tooltip_controller.d.ts +52 -2
  309. package/dist/controllers/tooltip_controller.js +185 -125
  310. package/dist/controllers/tooltip_controller.js.map +1 -1
  311. package/dist/controllers/transition_controller.d.ts +22 -4
  312. package/dist/controllers/transition_controller.js +123 -115
  313. package/dist/controllers/transition_controller.js.map +1 -1
  314. package/dist/controllers/tree_view_controller.d.ts +59 -18
  315. package/dist/controllers/tree_view_controller.js +248 -290
  316. package/dist/controllers/tree_view_controller.js.map +1 -1
  317. package/dist/index.d.ts +33 -3
  318. package/dist/index.js +8649 -8572
  319. package/dist/index.js.map +1 -1
  320. package/dist/inspector/cli.d.ts +95 -9
  321. package/dist/inspector/cli.js +343 -77
  322. package/dist/inspector/cli.js.map +1 -1
  323. package/dist/inspector/cli_bin.js +390 -96
  324. package/dist/inspector/cli_bin.js.map +1 -1
  325. package/dist/inspector/examples.json +45 -45
  326. package/dist/inspector/manifest.json +1308 -155
  327. package/dist/positioning/index.d.ts +8 -0
  328. package/dist/positioning/index.js +148 -45
  329. package/dist/positioning/index.js.map +1 -1
  330. package/package.json +7 -7
  331. package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
  332. package/dist/controllers/reset_before_cache_controller.js.map +0 -1
@@ -1,30 +1,20 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/overflow_indicator_controller.ts
4
-
5
- // src/utils/blur_deferral.ts
6
3
  var BlurDeferral = class {
7
- /** Elements currently holding an update back, mapped to their `blur` listener. */
8
4
  #pending = /* @__PURE__ */ new Map();
9
- /** Called after a pending element blurs and has been detached. */
10
5
  #onRelease;
11
- /** @param onRelease - Invoked once `element` actually blurs; never on `release`. */
12
6
  constructor(onRelease) {
13
7
  this.#onRelease = onRelease;
14
8
  }
15
- /** Number of elements currently holding an update back. */
16
9
  get size() {
17
10
  return this.#pending.size;
18
11
  }
19
- /** Snapshot of the pending elements, safe to iterate while releasing them. */
20
12
  get elements() {
21
13
  return [...this.#pending.keys()];
22
14
  }
23
- /** Whether `element` is currently holding an update back. */
24
15
  has(element) {
25
16
  return this.#pending.has(element);
26
17
  }
27
- /** Holds an update back until `element` blurs. Idempotent (no stacked listeners). */
28
18
  defer(element) {
29
19
  if (this.#pending.has(element)) return;
30
20
  const onBlur = () => {
@@ -34,22 +24,18 @@ var BlurDeferral = class {
34
24
  this.#pending.set(element, onBlur);
35
25
  element.addEventListener("blur", onBlur);
36
26
  }
37
- /** Defers `element` as the only pending entry, cancelling any others. */
38
27
  deferOnly(element) {
39
28
  for (const pending of this.elements) {
40
29
  if (pending !== element) this.#detach(pending);
41
30
  }
42
31
  this.defer(element);
43
32
  }
44
- /** Cancels `element`'s deferral without completing it; no-ops when not pending. */
45
33
  release(element) {
46
34
  this.#detach(element);
47
35
  }
48
- /** Cancels every deferral without completing any of them. */
49
36
  releaseAll() {
50
37
  for (const element of this.elements) this.#detach(element);
51
38
  }
52
- /** Removes the `blur` listener for `element` and forgets it. */
53
39
  #detach(element) {
54
40
  const onBlur = this.#pending.get(element);
55
41
  if (onBlur) element.removeEventListener("blur", onBlur);
@@ -57,18 +43,31 @@ var BlurDeferral = class {
57
43
  }
58
44
  };
59
45
 
60
- // src/utils/layout_observer.ts
46
+ var FrameCoalescer = class {
47
+ #frame = null;
48
+ schedule(run) {
49
+ if (this.#frame !== null) return;
50
+ this.#frame = requestAnimationFrame(() => {
51
+ this.#frame = null;
52
+ run();
53
+ });
54
+ }
55
+ cancel() {
56
+ if (this.#frame === null) return;
57
+ cancelAnimationFrame(this.#frame);
58
+ this.#frame = null;
59
+ }
60
+ };
61
+
61
62
  var LayoutObserver = class {
62
63
  #callback;
63
64
  #resizeObserverFactory;
64
65
  #resizeObserver = null;
65
66
  #observingViewport = false;
66
67
  #loadContainer = null;
67
- /** Stable bound handler so add/removeEventListener target the same reference. */
68
68
  #handleViewportResize = () => {
69
69
  this.#callback();
70
70
  };
71
- /** Stable bound handler for the capture-phase `load`; see {@link observeDescendantLoads}. */
72
71
  #handleDescendantLoad = () => {
73
72
  this.#callback();
74
73
  };
@@ -76,11 +75,6 @@ var LayoutObserver = class {
76
75
  this.#callback = callback;
77
76
  this.#resizeObserverFactory = options.resizeObserverFactory ?? (typeof ResizeObserver === "undefined" ? null : (cb) => new ResizeObserver(cb));
78
77
  }
79
- /**
80
- * Starts observing an element's size. Repeated calls observe additional
81
- * elements through the same shared observer. No-ops when no
82
- * `ResizeObserver` implementation is available.
83
- */
84
78
  observe(element) {
85
79
  if (!this.#resizeObserverFactory) return;
86
80
  if (!this.#resizeObserver) {
@@ -90,47 +84,28 @@ var LayoutObserver = class {
90
84
  }
91
85
  this.#resizeObserver.observe(element);
92
86
  }
93
- /** Stops observing a single element while leaving any others in place. */
94
87
  unobserve(element) {
95
88
  this.#resizeObserver?.unobserve(element);
96
89
  }
97
- /** Starts observing viewport resizes. Idempotent: the listener is added once. */
98
90
  observeViewport() {
99
91
  if (this.#observingViewport) return;
100
92
  this.#observingViewport = true;
101
93
  window.addEventListener("resize", this.#handleViewportResize);
102
94
  }
103
- /** Stops observing viewport resizes without affecting element observation. */
104
95
  unobserveViewport() {
105
96
  if (!this.#observingViewport) return;
106
97
  this.#observingViewport = false;
107
98
  window.removeEventListener("resize", this.#handleViewportResize);
108
99
  }
109
- /**
110
- * Starts reporting a `load` from anywhere inside `container` — an image or a
111
- * frame settling changes the box it sits in, and it measures as zero high until
112
- * then. `load` does not bubble, so the subscription is a capture-phase listener
113
- * on the container itself and nothing the caller spells.
114
- *
115
- * **One container at a time.** A further call moves the observation, so a widget
116
- * whose content element is swapped at runtime releases the element it let go by
117
- * naming the new one — there is no second place for the release to drift from.
118
- */
119
100
  observeDescendantLoads(container) {
120
101
  this.unobserveDescendantLoads();
121
102
  this.#loadContainer = container;
122
103
  container.addEventListener("load", this.#handleDescendantLoad, true);
123
104
  }
124
- /** Stops reporting descendant loads without affecting element or viewport observation. */
125
105
  unobserveDescendantLoads() {
126
106
  this.#loadContainer?.removeEventListener("load", this.#handleDescendantLoad, true);
127
107
  this.#loadContainer = null;
128
108
  }
129
- /**
130
- * Releases every observation: disconnects the {@link ResizeObserver} and removes
131
- * the viewport and descendant-load listeners. Safe to call multiple times. Call
132
- * this from a controller's `disconnect()`.
133
- */
134
109
  disconnect() {
135
110
  this.#resizeObserver?.disconnect();
136
111
  this.#resizeObserver = null;
@@ -139,7 +114,17 @@ var LayoutObserver = class {
139
114
  }
140
115
  };
141
116
 
142
- // src/utils/logical_scroll.ts
117
+ var ListenerSet = class {
118
+ #abort = new AbortController();
119
+ add(target, type, handler, options) {
120
+ target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
121
+ }
122
+ dispose() {
123
+ this.#abort.abort();
124
+ this.#abort = new AbortController();
125
+ }
126
+ };
127
+
143
128
  function isRtl(element) {
144
129
  return window.getComputedStyle(element).direction === "rtl";
145
130
  }
@@ -156,45 +141,149 @@ function physicalScrollDelta(element, horizontal, logicalDelta) {
156
141
  return horizontal && isRtl(element) ? -logicalDelta : logicalDelta;
157
142
  }
158
143
 
159
- // src/utils/reduced_motion.ts
144
+ var MicrotaskCoalescer = class {
145
+ #run;
146
+ #queued = false;
147
+ #active = false;
148
+ #generation = 0;
149
+ constructor(run) {
150
+ this.#run = run;
151
+ }
152
+ activate() {
153
+ this.#active = true;
154
+ }
155
+ cancel() {
156
+ this.#active = false;
157
+ this.#queued = false;
158
+ this.#generation += 1;
159
+ }
160
+ schedule() {
161
+ if (!this.#active || this.#queued) return;
162
+ this.#queued = true;
163
+ const generation = this.#generation;
164
+ queueMicrotask(() => {
165
+ if (generation !== this.#generation || !this.#queued || !this.#active) return;
166
+ this.#queued = false;
167
+ this.#run();
168
+ });
169
+ }
170
+ };
171
+
172
+ var MorphRenderWatcher = class {
173
+ #listeners = new ListenerSet();
174
+ #pass;
175
+ #element = null;
176
+ #onMorph = () => this.#pass.schedule();
177
+ constructor(run) {
178
+ this.#pass = new MicrotaskCoalescer(run);
179
+ }
180
+ observe(element) {
181
+ if (this.#element === element) return;
182
+ this.disconnect();
183
+ this.#element = element;
184
+ this.#pass.activate();
185
+ this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
186
+ }
187
+ schedule() {
188
+ this.#pass.schedule();
189
+ }
190
+ disconnect() {
191
+ this.#listeners.dispose();
192
+ this.#pass.cancel();
193
+ this.#element = null;
194
+ }
195
+ };
196
+
197
+ var NUMBER_BOUNDS = {
198
+ finite: { finite: true }};
199
+ function matchesNumberBounds(value, bounds) {
200
+ if (!Number.isFinite(value)) {
201
+ const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
202
+ if (direction === null) return false;
203
+ if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
204
+ }
205
+ if (bounds.min !== void 0 && value < bounds.min) return false;
206
+ if (bounds.max !== void 0 && value > bounds.max) return false;
207
+ if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
208
+ if (bounds.integer && !Number.isInteger(value)) return false;
209
+ if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
210
+ return true;
211
+ }
212
+
213
+ function readNumber(raw, fallback, bounds) {
214
+ return matchesNumberBounds(raw, bounds) ? raw : fallback;
215
+ }
216
+
217
+ var NumberValueReader = class {
218
+ #lastRejected = /* @__PURE__ */ new Map();
219
+ read(owner, name, raw, fallback, bounds) {
220
+ const resolved = readNumber(raw, fallback, bounds);
221
+ if (matchesNumberBounds(raw, bounds)) {
222
+ this.#lastRejected.delete(name);
223
+ return resolved;
224
+ }
225
+ const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
226
+ const literal = owner.element.getAttribute(attribute);
227
+ if (literal === null) {
228
+ this.#lastRejected.delete(name);
229
+ return resolved;
230
+ }
231
+ if (this.#lastRejected.get(name) !== literal) {
232
+ this.#lastRejected.set(name, literal);
233
+ console.warn(
234
+ `Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
235
+ );
236
+ }
237
+ return resolved;
238
+ }
239
+ };
240
+
160
241
  function prefersReducedMotion() {
161
242
  return typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
162
243
  }
163
244
 
164
- // src/controllers/overflow_indicator_controller.ts
165
- var DIRECTION_BUTTON_SELECTOR = "[data-stimeo--overflow-indicator-direction-param]";
166
- var OverflowIndicatorController = class extends Controller {
245
+ var DIRECTION_PARAM = "direction-param";
246
+ var OverflowIndicatorController = class _OverflowIndicatorController extends Controller {
247
+ #numbers = new NumberValueReader();
248
+ get #directionParam() {
249
+ return `data-${this.identifier}-${DIRECTION_PARAM}`;
250
+ }
251
+ get #directionButtonSelector() {
252
+ return `[${this.#directionParam}]`;
253
+ }
167
254
  static targets = ["viewport"];
168
255
  static values = {
169
256
  orientation: { type: String, default: "horizontal" },
170
257
  threshold: { type: Number, default: 1 }
171
258
  };
172
- static actions = ["scrollByPage", "update"];
259
+ static valueConstraints = {
260
+ threshold: NUMBER_BOUNDS.finite
261
+ };
262
+ static actions = ["scrollByPage"];
173
263
  static events = ["change"];
174
264
  #layout = new LayoutObserver(() => {
175
- if (this.#connected) this.update();
265
+ if (this.#connected) this.#refresh();
176
266
  });
267
+ #frames = new FrameCoalescer();
268
+ #viewportListeners = new ListenerSet();
269
+ #onScroll = () => this.#frames.schedule(() => this.#refresh());
177
270
  #connected = false;
178
271
  #observedViewport = null;
179
272
  #observedContent = /* @__PURE__ */ new Set();
180
273
  #mutationObserver = null;
181
- /**
182
- * Boundary buttons whose native `disabled` is held back while they hold focus.
183
- *
184
- * Completing the deferral is what actually disables the button, so the release
185
- * callback — unlike {@link #cancelPendingButtonDisable} — applies it.
186
- */
187
274
  #pendingButtonDisables = new BlurDeferral((button) => {
188
275
  this.#restorePendingMarkers(button);
189
276
  if (!button.disabled) this.#disableButton(button);
190
277
  });
191
- /** Last reported room, so `change` fires only on transitions. */
192
278
  #state = null;
279
+ #morphRender = new MorphRenderWatcher(() => this.#refresh());
193
280
  connect() {
281
+ this.#morphRender.observe(this.element);
194
282
  this.#connected = true;
195
283
  this.#syncViewport();
196
284
  }
197
285
  disconnect() {
286
+ this.#morphRender.disconnect();
198
287
  this.#connected = false;
199
288
  this.#stopObservingViewport();
200
289
  this.#layout.disconnect();
@@ -209,16 +298,12 @@ var OverflowIndicatorController = class extends Controller {
209
298
  this.#syncViewport();
210
299
  }
211
300
  orientationValueChanged() {
212
- if (this.#connected) this.update();
301
+ if (this.#connected) this.#refresh();
213
302
  }
214
303
  thresholdValueChanged() {
215
- if (this.#connected) this.update();
304
+ if (this.#connected) this.#refresh();
216
305
  }
217
- /**
218
- * Re-measures remaining scroll room and reflects the state hooks.
219
- * Public so it can be wired to the viewport's `scroll`.
220
- */
221
- update() {
306
+ #refresh() {
222
307
  if (!this.hasViewportTarget) return;
223
308
  const vp = this.viewportTarget;
224
309
  const horizontal = this.orientationValue !== "vertical";
@@ -234,7 +319,6 @@ var OverflowIndicatorController = class extends Controller {
234
319
  this.dispatch("change", { detail: { start, end } });
235
320
  }
236
321
  }
237
- /** Scrolls one viewport page toward the `direction` param (`start`/`end`). */
238
322
  scrollByPage(event) {
239
323
  if (!this.hasViewportTarget) return;
240
324
  const direction = this.#directionFromEvent(event);
@@ -252,29 +336,22 @@ var OverflowIndicatorController = class extends Controller {
252
336
  vp.scrollBy({ top: delta, behavior });
253
337
  }
254
338
  }
255
- /** Mirrors remaining room onto any direction buttons by toggling `disabled`. */
256
339
  #syncButtons(start, end) {
257
340
  for (const button of this.#pendingButtonDisables.elements) {
258
- if (!button.isConnected || button.closest("[data-controller~='stimeo--overflow-indicator']") !== this.element) {
341
+ if (!button.isConnected || button.closest(`[data-controller~='${this.identifier}']`) !== this.element) {
259
342
  this.#cancelPendingButtonDisable(button);
260
343
  }
261
344
  }
262
- const buttons = this.element.querySelectorAll(DIRECTION_BUTTON_SELECTOR);
345
+ const buttons = this.element.querySelectorAll(this.#directionButtonSelector);
263
346
  for (const button of buttons) {
264
- if (button.closest("[data-controller~='stimeo--overflow-indicator']") !== this.element) {
347
+ if (button.closest(`[data-controller~='${this.identifier}']`) !== this.element) {
265
348
  continue;
266
349
  }
267
- const direction = button.getAttribute("data-stimeo--overflow-indicator-direction-param");
350
+ const direction = button.getAttribute(this.#directionParam);
268
351
  if (direction === "start") this.#toggleButton(button, start);
269
352
  else if (direction === "end") this.#toggleButton(button, end);
270
353
  }
271
354
  }
272
- /**
273
- * Reflects the remaining room onto a page button's `disabled`, owning only the
274
- * `disabled` it sets itself via a marker (`data-overflow-indicator-disabled`,
275
- * like `number-input`/`conditional-fields`). An author-disabled button (e.g. the
276
- * whole control disabled) is therefore never blindly re-enabled.
277
- */
278
355
  #toggleButton(button, hasRoom) {
279
356
  if (!this.#pendingButtonDisables.has(button) && button.hasAttribute("data-overflow-indicator-pending-disabled")) {
280
357
  this.#cancelPendingButtonDisable(button);
@@ -294,10 +371,6 @@ var OverflowIndicatorController = class extends Controller {
294
371
  this.#disableButton(button);
295
372
  }
296
373
  }
297
- /**
298
- * Keeps a boundary button focusable until native blur, exposing its temporary
299
- * inoperability with `aria-disabled` and making its action a no-op meanwhile.
300
- */
301
374
  #deferButtonDisable(button) {
302
375
  if (this.#pendingButtonDisables.has(button)) return;
303
376
  button.setAttribute("data-overflow-indicator-pending-disabled", "");
@@ -312,18 +385,10 @@ var OverflowIndicatorController = class extends Controller {
312
385
  button.disabled = true;
313
386
  button.setAttribute("data-overflow-indicator-disabled", "");
314
387
  }
315
- /** Cancels a pending disable without applying it, restoring the displaced state. */
316
388
  #cancelPendingButtonDisable(button) {
317
389
  this.#pendingButtonDisables.release(button);
318
390
  this.#restorePendingMarkers(button);
319
391
  }
320
- /**
321
- * Drops the pending marker and gives back the `aria-disabled` it displaced.
322
- *
323
- * Reads the displaced value from the DOM rather than memory: a Turbo snapshot is
324
- * cloned before `disconnect()` runs, so a restored page can arrive with markers
325
- * this instance never wrote.
326
- */
327
392
  #restorePendingMarkers(button) {
328
393
  button.removeAttribute("data-overflow-indicator-pending-disabled");
329
394
  const displaced = button.getAttribute("data-overflow-indicator-aria-disabled");
@@ -340,7 +405,6 @@ var OverflowIndicatorController = class extends Controller {
340
405
  this.#cancelPendingButtonDisable(button);
341
406
  }
342
407
  }
343
- /** Moves resize/mutation/load observation to the current viewport target. */
344
408
  #syncViewport() {
345
409
  if (!this.#connected) return;
346
410
  const next = this.hasViewportTarget ? this.viewportTarget : null;
@@ -348,6 +412,7 @@ var OverflowIndicatorController = class extends Controller {
348
412
  this.#stopObservingViewport();
349
413
  if (!next) return;
350
414
  this.#observedViewport = next;
415
+ this.#viewportListeners.add(next, "scroll", this.#onScroll, { passive: true });
351
416
  this.#layout.observe(next);
352
417
  this.#layout.observeViewport();
353
418
  this.#layout.observeDescendantLoads(next);
@@ -356,7 +421,7 @@ var OverflowIndicatorController = class extends Controller {
356
421
  this.#mutationObserver = new MutationObserver(() => {
357
422
  if (!this.#connected || this.#observedViewport !== next) return;
358
423
  this.#syncContentObservation();
359
- this.update();
424
+ this.#refresh();
360
425
  });
361
426
  this.#mutationObserver.observe(this.element, {
362
427
  childList: true,
@@ -367,9 +432,8 @@ var OverflowIndicatorController = class extends Controller {
367
432
  });
368
433
  }
369
434
  this.#state = null;
370
- this.update();
435
+ this.#refresh();
371
436
  }
372
- /** Observes direct content boxes whose resize can change the viewport's scroll extent. */
373
437
  #syncContentObservation() {
374
438
  const next = new Set(this.#observedViewport?.children ?? []);
375
439
  for (const content of this.#observedContent) {
@@ -386,6 +450,8 @@ var OverflowIndicatorController = class extends Controller {
386
450
  }
387
451
  }
388
452
  #stopObservingViewport() {
453
+ this.#frames.cancel();
454
+ this.#viewportListeners.dispose();
389
455
  this.#mutationObserver?.disconnect();
390
456
  this.#mutationObserver = null;
391
457
  this.#layout.unobserveDescendantLoads();
@@ -396,16 +462,24 @@ var OverflowIndicatorController = class extends Controller {
396
462
  this.#layout.unobserveViewport();
397
463
  }
398
464
  get #threshold() {
399
- const value = this.thresholdValue;
400
- return Number.isFinite(value) ? Math.max(0, value) : 1;
465
+ const value = this.#safeThreshold;
466
+ return Math.max(0, value);
401
467
  }
402
468
  #directionFromEvent(event) {
403
469
  const params = event.params;
404
470
  const direction = params?.direction;
405
471
  return direction === "start" || direction === "end" ? direction : null;
406
472
  }
473
+ get #safeThreshold() {
474
+ return this.#numbers.read(
475
+ this,
476
+ "threshold",
477
+ this.thresholdValue,
478
+ _OverflowIndicatorController.values.threshold.default,
479
+ _OverflowIndicatorController.valueConstraints.threshold
480
+ );
481
+ }
407
482
  };
408
483
 
409
484
  export { OverflowIndicatorController };
410
- //# sourceMappingURL=overflow_indicator_controller.js.map
411
485
  //# sourceMappingURL=overflow_indicator_controller.js.map