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
@@ -50,6 +50,11 @@ declare class OverflowIndicatorController extends Controller<HTMLElement> {
50
50
  default: number;
51
51
  };
52
52
  };
53
+ static valueConstraints: {
54
+ threshold: {
55
+ readonly finite: true;
56
+ };
57
+ };
53
58
  static actions: readonly ["scrollByPage"];
54
59
  static events: readonly ["change"];
55
60
  readonly viewportTarget: HTMLElement;
@@ -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,14 +43,8 @@ var BlurDeferral = class {
57
43
  }
58
44
  };
59
45
 
60
- // src/utils/frame_coalescer.ts
61
46
  var FrameCoalescer = class {
62
47
  #frame = null;
63
- /**
64
- * Runs `run` on the next frame, unless a frame is already pending — the first
65
- * request of a burst wins and the rest are dropped. The pending frame is
66
- * released before `run`, so `run` may request the next one.
67
- */
68
48
  schedule(run) {
69
49
  if (this.#frame !== null) return;
70
50
  this.#frame = requestAnimationFrame(() => {
@@ -72,14 +52,6 @@ var FrameCoalescer = class {
72
52
  run();
73
53
  });
74
54
  }
75
- /**
76
- * Drops the pending frame, and reaches the platform only when there is one.
77
- *
78
- * There is no handle value that stands for "nothing pending":
79
- * `cancelAnimationFrame` takes an `unsigned long`, so a negative placeholder
80
- * arrives as a large positive number that the same allocator can hand out, and
81
- * an idle cancel would then drop a frame belonging to someone else.
82
- */
83
55
  cancel() {
84
56
  if (this.#frame === null) return;
85
57
  cancelAnimationFrame(this.#frame);
@@ -87,18 +59,15 @@ var FrameCoalescer = class {
87
59
  }
88
60
  };
89
61
 
90
- // src/utils/layout_observer.ts
91
62
  var LayoutObserver = class {
92
63
  #callback;
93
64
  #resizeObserverFactory;
94
65
  #resizeObserver = null;
95
66
  #observingViewport = false;
96
67
  #loadContainer = null;
97
- /** Stable bound handler so add/removeEventListener target the same reference. */
98
68
  #handleViewportResize = () => {
99
69
  this.#callback();
100
70
  };
101
- /** Stable bound handler for the capture-phase `load`; see {@link observeDescendantLoads}. */
102
71
  #handleDescendantLoad = () => {
103
72
  this.#callback();
104
73
  };
@@ -106,11 +75,6 @@ var LayoutObserver = class {
106
75
  this.#callback = callback;
107
76
  this.#resizeObserverFactory = options.resizeObserverFactory ?? (typeof ResizeObserver === "undefined" ? null : (cb) => new ResizeObserver(cb));
108
77
  }
109
- /**
110
- * Starts observing an element's size. Repeated calls observe additional
111
- * elements through the same shared observer. No-ops when no
112
- * `ResizeObserver` implementation is available.
113
- */
114
78
  observe(element) {
115
79
  if (!this.#resizeObserverFactory) return;
116
80
  if (!this.#resizeObserver) {
@@ -120,47 +84,28 @@ var LayoutObserver = class {
120
84
  }
121
85
  this.#resizeObserver.observe(element);
122
86
  }
123
- /** Stops observing a single element while leaving any others in place. */
124
87
  unobserve(element) {
125
88
  this.#resizeObserver?.unobserve(element);
126
89
  }
127
- /** Starts observing viewport resizes. Idempotent: the listener is added once. */
128
90
  observeViewport() {
129
91
  if (this.#observingViewport) return;
130
92
  this.#observingViewport = true;
131
93
  window.addEventListener("resize", this.#handleViewportResize);
132
94
  }
133
- /** Stops observing viewport resizes without affecting element observation. */
134
95
  unobserveViewport() {
135
96
  if (!this.#observingViewport) return;
136
97
  this.#observingViewport = false;
137
98
  window.removeEventListener("resize", this.#handleViewportResize);
138
99
  }
139
- /**
140
- * Starts reporting a `load` from anywhere inside `container` — an image or a
141
- * frame settling changes the box it sits in, and it measures as zero high until
142
- * then. `load` does not bubble, so the subscription is a capture-phase listener
143
- * on the container itself and nothing the caller spells.
144
- *
145
- * **One container at a time.** A further call moves the observation, so a widget
146
- * whose content element is swapped at runtime releases the element it let go by
147
- * naming the new one — there is no second place for the release to drift from.
148
- */
149
100
  observeDescendantLoads(container) {
150
101
  this.unobserveDescendantLoads();
151
102
  this.#loadContainer = container;
152
103
  container.addEventListener("load", this.#handleDescendantLoad, true);
153
104
  }
154
- /** Stops reporting descendant loads without affecting element or viewport observation. */
155
105
  unobserveDescendantLoads() {
156
106
  this.#loadContainer?.removeEventListener("load", this.#handleDescendantLoad, true);
157
107
  this.#loadContainer = null;
158
108
  }
159
- /**
160
- * Releases every observation: disconnects the {@link ResizeObserver} and removes
161
- * the viewport and descendant-load listeners. Safe to call multiple times. Call
162
- * this from a controller's `disconnect()`.
163
- */
164
109
  disconnect() {
165
110
  this.#resizeObserver?.disconnect();
166
111
  this.#resizeObserver = null;
@@ -169,31 +114,17 @@ var LayoutObserver = class {
169
114
  }
170
115
  };
171
116
 
172
- // src/utils/listener_set.ts
173
117
  var ListenerSet = class {
174
- /** The generation every `add` joins until the next `dispose()`. */
175
118
  #abort = new AbortController();
176
- /**
177
- * Attaches `handler` to the open generation, exactly as the caller spelled it.
178
- *
179
- * The set supplies the signal, so `options` carries everything else the DOM
180
- * accepts — `capture` included, which has to match at release time and no
181
- * longer has a second place to drift from.
182
- */
183
119
  add(target, type, handler, options) {
184
120
  target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
185
121
  }
186
- /**
187
- * Releases every listener of the open generation, synchronously, and opens the
188
- * next one. Idempotent, and safe before anything has been added.
189
- */
190
122
  dispose() {
191
123
  this.#abort.abort();
192
124
  this.#abort = new AbortController();
193
125
  }
194
126
  };
195
127
 
196
- // src/utils/logical_scroll.ts
197
128
  function isRtl(element) {
198
129
  return window.getComputedStyle(element).direction === "rtl";
199
130
  }
@@ -210,19 +141,119 @@ function physicalScrollDelta(element, horizontal, logicalDelta) {
210
141
  return horizontal && isRtl(element) ? -logicalDelta : logicalDelta;
211
142
  }
212
143
 
213
- // 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
+ get pending() {
161
+ return this.#queued;
162
+ }
163
+ schedule() {
164
+ if (!this.#active || this.#queued) return;
165
+ this.#queued = true;
166
+ const generation = this.#generation;
167
+ queueMicrotask(() => {
168
+ if (generation !== this.#generation || !this.#queued || !this.#active) return;
169
+ this.#queued = false;
170
+ this.#run();
171
+ });
172
+ }
173
+ };
174
+
175
+ var MorphRenderWatcher = class {
176
+ #listeners = new ListenerSet();
177
+ #pass;
178
+ #element = null;
179
+ #onMorph = () => this.#pass.schedule();
180
+ constructor(run) {
181
+ this.#pass = new MicrotaskCoalescer(run);
182
+ }
183
+ observe(element) {
184
+ if (this.#element === element) return;
185
+ this.disconnect();
186
+ this.#element = element;
187
+ this.#pass.activate();
188
+ this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
189
+ }
190
+ schedule() {
191
+ this.#pass.schedule();
192
+ }
193
+ get pending() {
194
+ return this.#pass.pending;
195
+ }
196
+ disconnect() {
197
+ this.#listeners.dispose();
198
+ this.#pass.cancel();
199
+ this.#element = null;
200
+ }
201
+ };
202
+
203
+ var NUMBER_BOUNDS = {
204
+ finite: { finite: true }};
205
+ function matchesNumberBounds(value, bounds) {
206
+ if (!Number.isFinite(value)) {
207
+ const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
208
+ if (direction === null) return false;
209
+ if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
210
+ }
211
+ if (bounds.min !== void 0 && value < bounds.min) return false;
212
+ if (bounds.max !== void 0 && value > bounds.max) return false;
213
+ if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
214
+ if (bounds.integer && !Number.isInteger(value)) return false;
215
+ if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
216
+ return true;
217
+ }
218
+
219
+ function readNumber(raw, fallback, bounds) {
220
+ return matchesNumberBounds(raw, bounds) ? raw : fallback;
221
+ }
222
+
223
+ var NumberValueReader = class {
224
+ #lastRejected = /* @__PURE__ */ new Map();
225
+ read(owner, name, raw, fallback, bounds) {
226
+ const resolved = readNumber(raw, fallback, bounds);
227
+ if (matchesNumberBounds(raw, bounds)) {
228
+ this.#lastRejected.delete(name);
229
+ return resolved;
230
+ }
231
+ const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
232
+ const literal = owner.element.getAttribute(attribute);
233
+ if (literal === null) {
234
+ this.#lastRejected.delete(name);
235
+ return resolved;
236
+ }
237
+ if (this.#lastRejected.get(name) !== literal) {
238
+ this.#lastRejected.set(name, literal);
239
+ console.warn(
240
+ `Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
241
+ );
242
+ }
243
+ return resolved;
244
+ }
245
+ };
246
+
214
247
  function prefersReducedMotion() {
215
248
  return typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
216
249
  }
217
250
 
218
- // src/controllers/overflow_indicator_controller.ts
219
251
  var DIRECTION_PARAM = "direction-param";
220
- var OverflowIndicatorController = class extends Controller {
221
- /** The direction param above, in the namespace this controller is registered under. */
252
+ var OverflowIndicatorController = class _OverflowIndicatorController extends Controller {
253
+ #numbers = new NumberValueReader();
222
254
  get #directionParam() {
223
255
  return `data-${this.identifier}-${DIRECTION_PARAM}`;
224
256
  }
225
- /** Selects every button carrying that param. */
226
257
  get #directionButtonSelector() {
227
258
  return `[${this.#directionParam}]`;
228
259
  }
@@ -231,37 +262,34 @@ var OverflowIndicatorController = class extends Controller {
231
262
  orientation: { type: String, default: "horizontal" },
232
263
  threshold: { type: Number, default: 1 }
233
264
  };
265
+ static valueConstraints = {
266
+ threshold: NUMBER_BOUNDS.finite
267
+ };
234
268
  static actions = ["scrollByPage"];
235
269
  static events = ["change"];
236
270
  #layout = new LayoutObserver(() => {
237
271
  if (this.#connected) this.#refresh();
238
272
  });
239
- /** Folds a burst of scrolls into one measurement per frame. */
240
273
  #frames = new FrameCoalescer();
241
- /** Holds the viewport's scroll listener for exactly as long as that viewport. */
242
274
  #viewportListeners = new ListenerSet();
243
275
  #onScroll = () => this.#frames.schedule(() => this.#refresh());
244
276
  #connected = false;
245
277
  #observedViewport = null;
246
278
  #observedContent = /* @__PURE__ */ new Set();
247
279
  #mutationObserver = null;
248
- /**
249
- * Boundary buttons whose native `disabled` is held back while they hold focus.
250
- *
251
- * Completing the deferral is what actually disables the button, so the release
252
- * callback — unlike {@link #cancelPendingButtonDisable} — applies it.
253
- */
254
280
  #pendingButtonDisables = new BlurDeferral((button) => {
255
281
  this.#restorePendingMarkers(button);
256
282
  if (!button.disabled) this.#disableButton(button);
257
283
  });
258
- /** Last reported room, so `change` fires only on transitions. */
259
284
  #state = null;
285
+ #morphRender = new MorphRenderWatcher(() => this.#refresh());
260
286
  connect() {
287
+ this.#morphRender.observe(this.element);
261
288
  this.#connected = true;
262
289
  this.#syncViewport();
263
290
  }
264
291
  disconnect() {
292
+ this.#morphRender.disconnect();
265
293
  this.#connected = false;
266
294
  this.#stopObservingViewport();
267
295
  this.#layout.disconnect();
@@ -281,11 +309,6 @@ var OverflowIndicatorController = class extends Controller {
281
309
  thresholdValueChanged() {
282
310
  if (this.#connected) this.#refresh();
283
311
  }
284
- /**
285
- * Re-measures remaining scroll room and reflects the state hooks.
286
- *
287
- * @stimeoRenderRoot
288
- */
289
312
  #refresh() {
290
313
  if (!this.hasViewportTarget) return;
291
314
  const vp = this.viewportTarget;
@@ -302,7 +325,6 @@ var OverflowIndicatorController = class extends Controller {
302
325
  this.dispatch("change", { detail: { start, end } });
303
326
  }
304
327
  }
305
- /** Scrolls one viewport page toward the `direction` param (`start`/`end`). */
306
328
  scrollByPage(event) {
307
329
  if (!this.hasViewportTarget) return;
308
330
  const direction = this.#directionFromEvent(event);
@@ -320,7 +342,6 @@ var OverflowIndicatorController = class extends Controller {
320
342
  vp.scrollBy({ top: delta, behavior });
321
343
  }
322
344
  }
323
- /** Mirrors remaining room onto any direction buttons by toggling `disabled`. */
324
345
  #syncButtons(start, end) {
325
346
  for (const button of this.#pendingButtonDisables.elements) {
326
347
  if (!button.isConnected || button.closest(`[data-controller~='${this.identifier}']`) !== this.element) {
@@ -337,12 +358,6 @@ var OverflowIndicatorController = class extends Controller {
337
358
  else if (direction === "end") this.#toggleButton(button, end);
338
359
  }
339
360
  }
340
- /**
341
- * Reflects the remaining room onto a page button's `disabled`, owning only the
342
- * `disabled` it sets itself via a marker (`data-overflow-indicator-disabled`,
343
- * like `number-input`/`conditional-fields`). An author-disabled button (e.g. the
344
- * whole control disabled) is therefore never blindly re-enabled.
345
- */
346
361
  #toggleButton(button, hasRoom) {
347
362
  if (!this.#pendingButtonDisables.has(button) && button.hasAttribute("data-overflow-indicator-pending-disabled")) {
348
363
  this.#cancelPendingButtonDisable(button);
@@ -362,10 +377,6 @@ var OverflowIndicatorController = class extends Controller {
362
377
  this.#disableButton(button);
363
378
  }
364
379
  }
365
- /**
366
- * Keeps a boundary button focusable until native blur, exposing its temporary
367
- * inoperability with `aria-disabled` and making its action a no-op meanwhile.
368
- */
369
380
  #deferButtonDisable(button) {
370
381
  if (this.#pendingButtonDisables.has(button)) return;
371
382
  button.setAttribute("data-overflow-indicator-pending-disabled", "");
@@ -380,18 +391,10 @@ var OverflowIndicatorController = class extends Controller {
380
391
  button.disabled = true;
381
392
  button.setAttribute("data-overflow-indicator-disabled", "");
382
393
  }
383
- /** Cancels a pending disable without applying it, restoring the displaced state. */
384
394
  #cancelPendingButtonDisable(button) {
385
395
  this.#pendingButtonDisables.release(button);
386
396
  this.#restorePendingMarkers(button);
387
397
  }
388
- /**
389
- * Drops the pending marker and gives back the `aria-disabled` it displaced.
390
- *
391
- * Reads the displaced value from the DOM rather than memory: a Turbo snapshot is
392
- * cloned before `disconnect()` runs, so a restored page can arrive with markers
393
- * this instance never wrote.
394
- */
395
398
  #restorePendingMarkers(button) {
396
399
  button.removeAttribute("data-overflow-indicator-pending-disabled");
397
400
  const displaced = button.getAttribute("data-overflow-indicator-aria-disabled");
@@ -408,7 +411,6 @@ var OverflowIndicatorController = class extends Controller {
408
411
  this.#cancelPendingButtonDisable(button);
409
412
  }
410
413
  }
411
- /** Moves resize/mutation/load observation to the current viewport target. */
412
414
  #syncViewport() {
413
415
  if (!this.#connected) return;
414
416
  const next = this.hasViewportTarget ? this.viewportTarget : null;
@@ -438,7 +440,6 @@ var OverflowIndicatorController = class extends Controller {
438
440
  this.#state = null;
439
441
  this.#refresh();
440
442
  }
441
- /** Observes direct content boxes whose resize can change the viewport's scroll extent. */
442
443
  #syncContentObservation() {
443
444
  const next = new Set(this.#observedViewport?.children ?? []);
444
445
  for (const content of this.#observedContent) {
@@ -467,16 +468,24 @@ var OverflowIndicatorController = class extends Controller {
467
468
  this.#layout.unobserveViewport();
468
469
  }
469
470
  get #threshold() {
470
- const value = this.thresholdValue;
471
- return Number.isFinite(value) ? Math.max(0, value) : 1;
471
+ const value = this.#safeThreshold;
472
+ return Math.max(0, value);
472
473
  }
473
474
  #directionFromEvent(event) {
474
475
  const params = event.params;
475
476
  const direction = params?.direction;
476
477
  return direction === "start" || direction === "end" ? direction : null;
477
478
  }
479
+ get #safeThreshold() {
480
+ return this.#numbers.read(
481
+ this,
482
+ "threshold",
483
+ this.thresholdValue,
484
+ _OverflowIndicatorController.values.threshold.default,
485
+ _OverflowIndicatorController.valueConstraints.threshold
486
+ );
487
+ }
478
488
  };
479
489
 
480
490
  export { OverflowIndicatorController };
481
- //# sourceMappingURL=overflow_indicator_controller.js.map
482
491
  //# sourceMappingURL=overflow_indicator_controller.js.map