stimeo-ui 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/README.md +27 -11
  3. package/dist/cable/index.d.ts +88 -31
  4. package/dist/cable/index.js +384 -449
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/coerce-JtZVNG5h.d.ts +20 -0
  7. package/dist/controllers/accordion_controller.d.ts +4 -2
  8. package/dist/controllers/accordion_controller.js +174 -55
  9. package/dist/controllers/accordion_controller.js.map +1 -1
  10. package/dist/controllers/alert_dialog_controller.d.ts +12 -2
  11. package/dist/controllers/alert_dialog_controller.js +903 -235
  12. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  13. package/dist/controllers/announcer_controller.d.ts +37 -5
  14. package/dist/controllers/announcer_controller.js +238 -205
  15. package/dist/controllers/announcer_controller.js.map +1 -1
  16. package/dist/controllers/aspect_ratio_controller.js +0 -10
  17. package/dist/controllers/aspect_ratio_controller.js.map +1 -1
  18. package/dist/controllers/auto_submit_controller.d.ts +30 -6
  19. package/dist/controllers/auto_submit_controller.js +414 -145
  20. package/dist/controllers/auto_submit_controller.js.map +1 -1
  21. package/dist/controllers/avatar_controller.js +185 -107
  22. package/dist/controllers/avatar_controller.js.map +1 -1
  23. package/dist/controllers/breadcrumb_controller.js +0 -130
  24. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  25. package/dist/controllers/bulk_select_controller.d.ts +21 -3
  26. package/dist/controllers/bulk_select_controller.js +282 -58
  27. package/dist/controllers/bulk_select_controller.js.map +1 -1
  28. package/dist/controllers/calendar_controller.d.ts +38 -16
  29. package/dist/controllers/calendar_controller.js +228 -260
  30. package/dist/controllers/calendar_controller.js.map +1 -1
  31. package/dist/controllers/carousel_controller.d.ts +43 -12
  32. package/dist/controllers/carousel_controller.js +536 -436
  33. package/dist/controllers/carousel_controller.js.map +1 -1
  34. package/dist/controllers/character_counter_controller.d.ts +44 -7
  35. package/dist/controllers/character_counter_controller.js +493 -207
  36. package/dist/controllers/character_counter_controller.js.map +1 -1
  37. package/dist/controllers/checkbox_controller.d.ts +7 -2
  38. package/dist/controllers/checkbox_controller.js +38 -74
  39. package/dist/controllers/checkbox_controller.js.map +1 -1
  40. package/dist/controllers/clipboard_controller.d.ts +16 -5
  41. package/dist/controllers/clipboard_controller.js +261 -149
  42. package/dist/controllers/clipboard_controller.js.map +1 -1
  43. package/dist/controllers/collapsible_controller.d.ts +17 -5
  44. package/dist/controllers/collapsible_controller.js +304 -120
  45. package/dist/controllers/collapsible_controller.js.map +1 -1
  46. package/dist/controllers/color_picker_controller.d.ts +18 -6
  47. package/dist/controllers/color_picker_controller.js +178 -146
  48. package/dist/controllers/color_picker_controller.js.map +1 -1
  49. package/dist/controllers/combobox_controller.d.ts +24 -6
  50. package/dist/controllers/combobox_controller.js +522 -156
  51. package/dist/controllers/combobox_controller.js.map +1 -1
  52. package/dist/controllers/command_palette_controller.d.ts +51 -20
  53. package/dist/controllers/command_palette_controller.js +1156 -395
  54. package/dist/controllers/command_palette_controller.js.map +1 -1
  55. package/dist/controllers/conditional_fields_controller.d.ts +15 -2
  56. package/dist/controllers/conditional_fields_controller.js +300 -171
  57. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  58. package/dist/controllers/confirm_controller.d.ts +49 -12
  59. package/dist/controllers/confirm_controller.js +980 -262
  60. package/dist/controllers/confirm_controller.js.map +1 -1
  61. package/dist/controllers/context_menu_controller.d.ts +80 -18
  62. package/dist/controllers/context_menu_controller.js +346 -153
  63. package/dist/controllers/context_menu_controller.js.map +1 -1
  64. package/dist/controllers/count_up_controller.d.ts +13 -1
  65. package/dist/controllers/count_up_controller.js +73 -21
  66. package/dist/controllers/count_up_controller.js.map +1 -1
  67. package/dist/controllers/countdown_controller.d.ts +47 -3
  68. package/dist/controllers/countdown_controller.js +281 -158
  69. package/dist/controllers/countdown_controller.js.map +1 -1
  70. package/dist/controllers/currency_input_controller.d.ts +93 -10
  71. package/dist/controllers/currency_input_controller.js +575 -225
  72. package/dist/controllers/currency_input_controller.js.map +1 -1
  73. package/dist/controllers/data_grid_controller.d.ts +25 -12
  74. package/dist/controllers/data_grid_controller.js +248 -214
  75. package/dist/controllers/data_grid_controller.js.map +1 -1
  76. package/dist/controllers/date_range_picker_controller.d.ts +42 -14
  77. package/dist/controllers/date_range_picker_controller.js +338 -235
  78. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  79. package/dist/controllers/dialog_controller.d.ts +17 -6
  80. package/dist/controllers/dialog_controller.js +899 -237
  81. package/dist/controllers/dialog_controller.js.map +1 -1
  82. package/dist/controllers/direct_upload_controller.d.ts +25 -8
  83. package/dist/controllers/direct_upload_controller.js +97 -167
  84. package/dist/controllers/direct_upload_controller.js.map +1 -1
  85. package/dist/controllers/dirty_form_controller.d.ts +6 -1
  86. package/dist/controllers/dirty_form_controller.js +72 -69
  87. package/dist/controllers/dirty_form_controller.js.map +1 -1
  88. package/dist/controllers/dismissible_controller.d.ts +19 -0
  89. package/dist/controllers/dismissible_controller.js +196 -24
  90. package/dist/controllers/dismissible_controller.js.map +1 -1
  91. package/dist/controllers/drawer_controller.d.ts +39 -11
  92. package/dist/controllers/drawer_controller.js +974 -355
  93. package/dist/controllers/drawer_controller.js.map +1 -1
  94. package/dist/controllers/dropdown_controller.d.ts +31 -1
  95. package/dist/controllers/dropdown_controller.js +339 -96
  96. package/dist/controllers/dropdown_controller.js.map +1 -1
  97. package/dist/controllers/editable_controller.d.ts +12 -1
  98. package/dist/controllers/editable_controller.js +315 -88
  99. package/dist/controllers/editable_controller.js.map +1 -1
  100. package/dist/controllers/empty_state_controller.js +79 -58
  101. package/dist/controllers/empty_state_controller.js.map +1 -1
  102. package/dist/controllers/file_dropzone_controller.d.ts +63 -18
  103. package/dist/controllers/file_dropzone_controller.js +322 -211
  104. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  105. package/dist/controllers/filter_controller.js +77 -42
  106. package/dist/controllers/filter_controller.js.map +1 -1
  107. package/dist/controllers/flash_controller.d.ts +35 -12
  108. package/dist/controllers/flash_controller.js +238 -347
  109. package/dist/controllers/flash_controller.js.map +1 -1
  110. package/dist/controllers/focus_controller.d.ts +15 -6
  111. package/dist/controllers/focus_controller.js +679 -240
  112. package/dist/controllers/focus_controller.js.map +1 -1
  113. package/dist/controllers/form_field_controller.js +156 -132
  114. package/dist/controllers/form_field_controller.js.map +1 -1
  115. package/dist/controllers/form_validation_controller.d.ts +3 -3
  116. package/dist/controllers/form_validation_controller.js +31 -97
  117. package/dist/controllers/form_validation_controller.js.map +1 -1
  118. package/dist/controllers/frame_loading_controller.d.ts +47 -14
  119. package/dist/controllers/frame_loading_controller.js +275 -217
  120. package/dist/controllers/frame_loading_controller.js.map +1 -1
  121. package/dist/controllers/highlight_controller.d.ts +27 -6
  122. package/dist/controllers/highlight_controller.js +107 -75
  123. package/dist/controllers/highlight_controller.js.map +1 -1
  124. package/dist/controllers/hover_card_controller.d.ts +60 -4
  125. package/dist/controllers/hover_card_controller.js +327 -130
  126. package/dist/controllers/hover_card_controller.js.map +1 -1
  127. package/dist/controllers/idle_controller.d.ts +48 -6
  128. package/dist/controllers/idle_controller.js +271 -101
  129. package/dist/controllers/idle_controller.js.map +1 -1
  130. package/dist/controllers/input_mask_controller.d.ts +30 -13
  131. package/dist/controllers/input_mask_controller.js +483 -97
  132. package/dist/controllers/input_mask_controller.js.map +1 -1
  133. package/dist/controllers/intersection_controller.d.ts +32 -13
  134. package/dist/controllers/intersection_controller.js +150 -106
  135. package/dist/controllers/intersection_controller.js.map +1 -1
  136. package/dist/controllers/lazy_frame_controller.d.ts +19 -2
  137. package/dist/controllers/lazy_frame_controller.js +24 -68
  138. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  139. package/dist/controllers/listbox_controller.d.ts +44 -9
  140. package/dist/controllers/listbox_controller.js +523 -240
  141. package/dist/controllers/listbox_controller.js.map +1 -1
  142. package/dist/controllers/local_time_controller.d.ts +9 -7
  143. package/dist/controllers/local_time_controller.js +102 -77
  144. package/dist/controllers/local_time_controller.js.map +1 -1
  145. package/dist/controllers/masonry_controller.d.ts +11 -3
  146. package/dist/controllers/masonry_controller.js +80 -96
  147. package/dist/controllers/masonry_controller.js.map +1 -1
  148. package/dist/controllers/menu_controller.d.ts +55 -11
  149. package/dist/controllers/menu_controller.js +302 -188
  150. package/dist/controllers/menu_controller.js.map +1 -1
  151. package/dist/controllers/menubar_controller.d.ts +51 -9
  152. package/dist/controllers/menubar_controller.js +232 -345
  153. package/dist/controllers/menubar_controller.js.map +1 -1
  154. package/dist/controllers/meter_controller.d.ts +33 -20
  155. package/dist/controllers/meter_controller.js +417 -87
  156. package/dist/controllers/meter_controller.js.map +1 -1
  157. package/dist/controllers/multi_select_controller.d.ts +48 -18
  158. package/dist/controllers/multi_select_controller.js +785 -393
  159. package/dist/controllers/multi_select_controller.js.map +1 -1
  160. package/dist/controllers/navigation_menu_controller.d.ts +27 -6
  161. package/dist/controllers/navigation_menu_controller.js +190 -250
  162. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  163. package/dist/controllers/nested_form_controller.d.ts +10 -0
  164. package/dist/controllers/nested_form_controller.js +396 -192
  165. package/dist/controllers/nested_form_controller.js.map +1 -1
  166. package/dist/controllers/network_status_controller.d.ts +23 -0
  167. package/dist/controllers/network_status_controller.js +268 -62
  168. package/dist/controllers/network_status_controller.js.map +1 -1
  169. package/dist/controllers/number_input_controller.d.ts +50 -8
  170. package/dist/controllers/number_input_controller.js +610 -303
  171. package/dist/controllers/number_input_controller.js.map +1 -1
  172. package/dist/controllers/optimistic_controller.d.ts +8 -5
  173. package/dist/controllers/optimistic_controller.js +45 -87
  174. package/dist/controllers/optimistic_controller.js.map +1 -1
  175. package/dist/controllers/otp_controller.d.ts +55 -8
  176. package/dist/controllers/otp_controller.js +658 -255
  177. package/dist/controllers/otp_controller.js.map +1 -1
  178. package/dist/controllers/overflow_indicator_controller.d.ts +5 -0
  179. package/dist/controllers/overflow_indicator_controller.js +122 -113
  180. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  181. package/dist/controllers/overflow_menu_controller.d.ts +58 -20
  182. package/dist/controllers/overflow_menu_controller.js +470 -295
  183. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  184. package/dist/controllers/pagination_controller.d.ts +37 -7
  185. package/dist/controllers/pagination_controller.js +332 -123
  186. package/dist/controllers/pagination_controller.js.map +1 -1
  187. package/dist/controllers/password_reveal_controller.d.ts +46 -8
  188. package/dist/controllers/password_reveal_controller.js +392 -121
  189. package/dist/controllers/password_reveal_controller.js.map +1 -1
  190. package/dist/controllers/password_strength_controller.d.ts +15 -6
  191. package/dist/controllers/password_strength_controller.js +111 -158
  192. package/dist/controllers/password_strength_controller.js.map +1 -1
  193. package/dist/controllers/persist_controller.d.ts +11 -4
  194. package/dist/controllers/persist_controller.js +165 -111
  195. package/dist/controllers/persist_controller.js.map +1 -1
  196. package/dist/controllers/pointer_drag_controller.d.ts +35 -12
  197. package/dist/controllers/pointer_drag_controller.js +434 -188
  198. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  199. package/dist/controllers/popover_controller.d.ts +41 -5
  200. package/dist/controllers/popover_controller.js +269 -113
  201. package/dist/controllers/popover_controller.js.map +1 -1
  202. package/dist/controllers/portal_controller.d.ts +44 -4
  203. package/dist/controllers/portal_controller.js +215 -76
  204. package/dist/controllers/portal_controller.js.map +1 -1
  205. package/dist/controllers/preview_guard_controller.d.ts +10 -4
  206. package/dist/controllers/preview_guard_controller.js +243 -116
  207. package/dist/controllers/preview_guard_controller.js.map +1 -1
  208. package/dist/controllers/progress_controller.d.ts +20 -19
  209. package/dist/controllers/progress_controller.js +391 -78
  210. package/dist/controllers/progress_controller.js.map +1 -1
  211. package/dist/controllers/radio_group_controller.d.ts +21 -9
  212. package/dist/controllers/radio_group_controller.js +278 -211
  213. package/dist/controllers/radio_group_controller.js.map +1 -1
  214. package/dist/controllers/range_slider_controller.d.ts +47 -6
  215. package/dist/controllers/range_slider_controller.js +220 -113
  216. package/dist/controllers/range_slider_controller.js.map +1 -1
  217. package/dist/controllers/rating_controller.d.ts +20 -4
  218. package/dist/controllers/rating_controller.js +458 -211
  219. package/dist/controllers/rating_controller.js.map +1 -1
  220. package/dist/controllers/read_more_controller.d.ts +2 -0
  221. package/dist/controllers/read_more_controller.js +138 -63
  222. package/dist/controllers/read_more_controller.js.map +1 -1
  223. package/dist/controllers/reading_progress_controller.d.ts +1 -1
  224. package/dist/controllers/reading_progress_controller.js +166 -137
  225. package/dist/controllers/reading_progress_controller.js.map +1 -1
  226. package/dist/controllers/relative_time_controller.d.ts +20 -6
  227. package/dist/controllers/relative_time_controller.js +211 -112
  228. package/dist/controllers/relative_time_controller.js.map +1 -1
  229. package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
  230. package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +103 -38
  231. package/dist/controllers/reset_on_restore_controller.js.map +1 -0
  232. package/dist/controllers/resizable_controller.d.ts +31 -2
  233. package/dist/controllers/resizable_controller.js +299 -150
  234. package/dist/controllers/resizable_controller.js.map +1 -1
  235. package/dist/controllers/roving_controller.d.ts +3 -3
  236. package/dist/controllers/roving_controller.js +49 -88
  237. package/dist/controllers/roving_controller.js.map +1 -1
  238. package/dist/controllers/scroll_area_controller.d.ts +7 -3
  239. package/dist/controllers/scroll_area_controller.js +490 -246
  240. package/dist/controllers/scroll_area_controller.js.map +1 -1
  241. package/dist/controllers/scroll_restore_controller.d.ts +3 -3
  242. package/dist/controllers/scroll_restore_controller.js +14 -55
  243. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  244. package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
  245. package/dist/controllers/scroll_visibility_controller.js +432 -149
  246. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  247. package/dist/controllers/scrollspy_controller.d.ts +6 -1
  248. package/dist/controllers/scrollspy_controller.js +193 -248
  249. package/dist/controllers/scrollspy_controller.js.map +1 -1
  250. package/dist/controllers/separator_controller.d.ts +20 -5
  251. package/dist/controllers/separator_controller.js +285 -142
  252. package/dist/controllers/separator_controller.js.map +1 -1
  253. package/dist/controllers/sidebar_controller.d.ts +65 -8
  254. package/dist/controllers/sidebar_controller.js +1069 -404
  255. package/dist/controllers/sidebar_controller.js.map +1 -1
  256. package/dist/controllers/skeleton_controller.d.ts +23 -0
  257. package/dist/controllers/skeleton_controller.js +259 -101
  258. package/dist/controllers/skeleton_controller.js.map +1 -1
  259. package/dist/controllers/slider_controller.d.ts +29 -2
  260. package/dist/controllers/slider_controller.js +187 -86
  261. package/dist/controllers/slider_controller.js.map +1 -1
  262. package/dist/controllers/smart_sticky_header_controller.d.ts +22 -4
  263. package/dist/controllers/smart_sticky_header_controller.js +173 -66
  264. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  265. package/dist/controllers/sortable_controller.d.ts +4 -4
  266. package/dist/controllers/sortable_controller.js +26 -125
  267. package/dist/controllers/sortable_controller.js.map +1 -1
  268. package/dist/controllers/spinner_controller.d.ts +39 -4
  269. package/dist/controllers/spinner_controller.js +288 -173
  270. package/dist/controllers/spinner_controller.js.map +1 -1
  271. package/dist/controllers/step_indicator_controller.d.ts +9 -4
  272. package/dist/controllers/step_indicator_controller.js +105 -46
  273. package/dist/controllers/step_indicator_controller.js.map +1 -1
  274. package/dist/controllers/stepper_controller.d.ts +14 -6
  275. package/dist/controllers/stepper_controller.js +120 -73
  276. package/dist/controllers/stepper_controller.js.map +1 -1
  277. package/dist/controllers/stick_to_bottom_controller.d.ts +9 -1
  278. package/dist/controllers/stick_to_bottom_controller.js +275 -140
  279. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  280. package/dist/controllers/sticky_observer_controller.d.ts +11 -0
  281. package/dist/controllers/sticky_observer_controller.js +220 -49
  282. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  283. package/dist/controllers/submit_once_controller.d.ts +24 -8
  284. package/dist/controllers/submit_once_controller.js +376 -227
  285. package/dist/controllers/submit_once_controller.js.map +1 -1
  286. package/dist/controllers/switch_controller.d.ts +18 -4
  287. package/dist/controllers/switch_controller.js +201 -84
  288. package/dist/controllers/switch_controller.js.map +1 -1
  289. package/dist/controllers/tabs_controller.d.ts +9 -6
  290. package/dist/controllers/tabs_controller.js +41 -30
  291. package/dist/controllers/tabs_controller.js.map +1 -1
  292. package/dist/controllers/tags_input_controller.d.ts +16 -3
  293. package/dist/controllers/tags_input_controller.js +293 -173
  294. package/dist/controllers/tags_input_controller.js.map +1 -1
  295. package/dist/controllers/textarea_autosize_controller.d.ts +11 -1
  296. package/dist/controllers/textarea_autosize_controller.js +108 -74
  297. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  298. package/dist/controllers/theme_controller.d.ts +24 -11
  299. package/dist/controllers/theme_controller.js +140 -116
  300. package/dist/controllers/theme_controller.js.map +1 -1
  301. package/dist/controllers/time_picker_controller.d.ts +55 -5
  302. package/dist/controllers/time_picker_controller.js +331 -127
  303. package/dist/controllers/time_picker_controller.js.map +1 -1
  304. package/dist/controllers/toast_controller.d.ts +40 -16
  305. package/dist/controllers/toast_controller.js +244 -324
  306. package/dist/controllers/toast_controller.js.map +1 -1
  307. package/dist/controllers/toggle_group_controller.d.ts +14 -6
  308. package/dist/controllers/toggle_group_controller.js +252 -191
  309. package/dist/controllers/toggle_group_controller.js.map +1 -1
  310. package/dist/controllers/toolbar_controller.d.ts +8 -6
  311. package/dist/controllers/toolbar_controller.js +219 -120
  312. package/dist/controllers/toolbar_controller.js.map +1 -1
  313. package/dist/controllers/tooltip_controller.d.ts +49 -4
  314. package/dist/controllers/tooltip_controller.js +158 -124
  315. package/dist/controllers/tooltip_controller.js.map +1 -1
  316. package/dist/controllers/transition_controller.d.ts +22 -4
  317. package/dist/controllers/transition_controller.js +123 -119
  318. package/dist/controllers/transition_controller.js.map +1 -1
  319. package/dist/controllers/tree_view_controller.d.ts +22 -12
  320. package/dist/controllers/tree_view_controller.js +283 -369
  321. package/dist/controllers/tree_view_controller.js.map +1 -1
  322. package/dist/index.d.ts +10 -5
  323. package/dist/index.js +8573 -10410
  324. package/dist/index.js.map +1 -1
  325. package/dist/inspector/cli.d.ts +38 -14
  326. package/dist/inspector/cli.js +108 -40
  327. package/dist/inspector/cli.js.map +1 -1
  328. package/dist/inspector/cli_bin.js +145 -64
  329. package/dist/inspector/cli_bin.js.map +1 -1
  330. package/dist/inspector/examples.json +20 -20
  331. package/dist/inspector/manifest.json +802 -101
  332. package/dist/positioning/index.d.ts +15 -7
  333. package/dist/positioning/index.js +154 -47
  334. package/dist/positioning/index.js.map +1 -1
  335. package/package.json +11 -10
  336. package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
  337. package/dist/controllers/reset_before_cache_controller.js.map +0 -1
@@ -1,13 +1,9 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/slider_controller.ts
4
-
5
- // src/utils/logical_scroll.ts
6
3
  function isRtl(element) {
7
4
  return window.getComputedStyle(element).direction === "rtl";
8
5
  }
9
6
 
10
- // src/utils/arrow_step.ts
11
7
  function logicalArrowKey(key, element) {
12
8
  if (key !== "ArrowRight" && key !== "ArrowLeft") return key;
13
9
  if (!isRtl(element)) return key;
@@ -17,8 +13,17 @@ function isReservedArrowChord(event, allow = []) {
17
13
  if (!event.key.startsWith("Arrow")) return false;
18
14
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
19
15
  }
16
+ function hasModifierChord(event) {
17
+ return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
18
+ }
19
+
20
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
21
+ if (element.getAttribute(name) === value) return false;
22
+ if (value === null) element.removeAttribute(name);
23
+ else element.setAttribute(name, value);
24
+ return true;
25
+ }
20
26
 
21
- // src/utils/field_mirror.ts
22
27
  function writeField(field, value) {
23
28
  if (field.value === value) return false;
24
29
  field.value = value;
@@ -28,27 +33,36 @@ function commitField(target) {
28
33
  target.dispatchEvent(new Event("change", { bubbles: true }));
29
34
  }
30
35
 
31
- // src/utils/microtask_coalescer.ts
36
+ var ListenerSet = class {
37
+ #abort = new AbortController();
38
+ add(target, type, handler, options) {
39
+ target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
40
+ }
41
+ dispose() {
42
+ this.#abort.abort();
43
+ this.#abort = new AbortController();
44
+ }
45
+ };
46
+
32
47
  var MicrotaskCoalescer = class {
33
48
  #run;
34
49
  #queued = false;
35
50
  #active = false;
36
51
  #generation = 0;
37
- /** @param run - the single reconciliation pass, invoked at most once per batch. */
38
52
  constructor(run) {
39
53
  this.#run = run;
40
54
  }
41
- /** Opens the window in which {@link schedule} is honoured; call from `connect()`. */
42
55
  activate() {
43
56
  this.#active = true;
44
57
  }
45
- /** Closes the window and drops any pending pass; call from `disconnect()`. */
46
58
  cancel() {
47
59
  this.#active = false;
48
60
  this.#queued = false;
49
61
  this.#generation += 1;
50
62
  }
51
- /** Requests one pass after the batch settles. Idempotent; inert outside the window. */
63
+ get pending() {
64
+ return this.#queued;
65
+ }
52
66
  schedule() {
53
67
  if (!this.#active || this.#queued) return;
54
68
  this.#queued = true;
@@ -61,7 +75,90 @@ var MicrotaskCoalescer = class {
61
75
  }
62
76
  };
63
77
 
64
- // src/utils/owned_pointer_session.ts
78
+ var MorphRenderWatcher = class {
79
+ #listeners = new ListenerSet();
80
+ #pass;
81
+ #element = null;
82
+ #onMorph = () => this.#pass.schedule();
83
+ constructor(run) {
84
+ this.#pass = new MicrotaskCoalescer(run);
85
+ }
86
+ observe(element) {
87
+ if (this.#element === element) return;
88
+ this.disconnect();
89
+ this.#element = element;
90
+ this.#pass.activate();
91
+ this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
92
+ }
93
+ schedule() {
94
+ this.#pass.schedule();
95
+ }
96
+ get pending() {
97
+ return this.#pass.pending;
98
+ }
99
+ disconnect() {
100
+ this.#listeners.dispose();
101
+ this.#pass.cancel();
102
+ this.#element = null;
103
+ }
104
+ };
105
+
106
+ var MoveCounter = class {
107
+ #sequence = 0;
108
+ record() {
109
+ this.#sequence += 1;
110
+ return this.#sequence;
111
+ }
112
+ isLatest(token) {
113
+ return token === this.#sequence;
114
+ }
115
+ };
116
+
117
+ var NUMBER_BOUNDS = {
118
+ finite: { finite: true },
119
+ positive: { finite: true, exclusiveMin: 0 }};
120
+ function matchesNumberBounds(value, bounds) {
121
+ if (!Number.isFinite(value)) {
122
+ const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
123
+ if (direction === null) return false;
124
+ if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
125
+ }
126
+ if (bounds.min !== void 0 && value < bounds.min) return false;
127
+ if (bounds.max !== void 0 && value > bounds.max) return false;
128
+ if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
129
+ if (bounds.integer && !Number.isInteger(value)) return false;
130
+ if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
131
+ return true;
132
+ }
133
+
134
+ function readNumber(raw, fallback, bounds) {
135
+ return matchesNumberBounds(raw, bounds) ? raw : fallback;
136
+ }
137
+
138
+ var NumberValueReader = class {
139
+ #lastRejected = /* @__PURE__ */ new Map();
140
+ read(owner, name, raw, fallback, bounds) {
141
+ const resolved = readNumber(raw, fallback, bounds);
142
+ if (matchesNumberBounds(raw, bounds)) {
143
+ this.#lastRejected.delete(name);
144
+ return resolved;
145
+ }
146
+ const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
147
+ const literal = owner.element.getAttribute(attribute);
148
+ if (literal === null) {
149
+ this.#lastRejected.delete(name);
150
+ return resolved;
151
+ }
152
+ if (this.#lastRejected.get(name) !== literal) {
153
+ this.#lastRejected.set(name, literal);
154
+ console.warn(
155
+ `Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
156
+ );
157
+ }
158
+ return resolved;
159
+ }
160
+ };
161
+
65
162
  var OwnedPointerSession = class {
66
163
  #pointerId;
67
164
  #owner;
@@ -81,7 +178,6 @@ var OwnedPointerSession = class {
81
178
  } catch {
82
179
  }
83
180
  }
84
- /** Releases capture and listeners, then reports the end exactly once. */
85
181
  end() {
86
182
  this.#finish("teardown");
87
183
  }
@@ -106,11 +202,10 @@ var OwnedPointerSession = class {
106
202
  };
107
203
  };
108
204
 
109
- // src/utils/range.ts
110
205
  function rangeFraction(value, min, max) {
111
206
  const span = max - min;
112
207
  if (!(span > 0)) return 0;
113
- const clamped = Math.min(max, Math.max(min, value));
208
+ const clamped = clampRange(value, min, max);
114
209
  let fraction;
115
210
  if (Number.isFinite(span)) {
116
211
  fraction = (clamped - min) / span;
@@ -121,8 +216,10 @@ function rangeFraction(value, min, max) {
121
216
  if (!Number.isFinite(fraction)) return 0;
122
217
  return Math.min(1, Math.max(0, fraction));
123
218
  }
219
+ function clampRange(value, min, max) {
220
+ return Math.min(max, Math.max(min, value));
221
+ }
124
222
 
125
- // src/utils/stepped_value.ts
126
223
  function effectiveStep(step) {
127
224
  return Number.isFinite(step) && step > 0 ? step : 1;
128
225
  }
@@ -228,9 +325,11 @@ function finiteFallback(min, max) {
228
325
  return 0;
229
326
  }
230
327
 
231
- // src/controllers/slider_controller.ts
232
328
  var FRACTION_PROPERTY = "--stimeo--slider-fraction";
233
- var SliderController = class extends Controller {
329
+ var SliderController = class _SliderController extends Controller {
330
+ #numbers = new NumberValueReader();
331
+ #moves = new MoveCounter();
332
+ #move = 0;
234
333
  static targets = ["track", "thumb", "field"];
235
334
  static values = {
236
335
  min: { type: Number, default: 0 },
@@ -239,81 +338,71 @@ var SliderController = class extends Controller {
239
338
  value: { type: Number, default: 0 },
240
339
  logicalTrack: { type: Boolean, default: false }
241
340
  };
341
+ static valueConstraints = {
342
+ min: NUMBER_BOUNDS.finite,
343
+ max: NUMBER_BOUNDS.finite,
344
+ step: NUMBER_BOUNDS.positive,
345
+ value: NUMBER_BOUNDS.finite
346
+ };
242
347
  static actions = ["onKeydown", "onPointerDown"];
243
348
  static events = ["change", "reconcile"];
244
- /** One initiating pointer owns each live drag and its stable target snapshot. */
245
349
  #drag = null;
246
- /**
247
- * The value last published: taken on connect, then moved by each user commit
248
- * and by each repaint that reports a page-driven move.
249
- */
250
350
  #settled = 0;
251
- /** Collapses a morph that swaps several render Values into one repaint. */
252
- #repaint = new MicrotaskCoalescer(() => this.#render());
253
- /** Whether the consumer declared a mirroring track and the direction mirrors it. */
254
- get #mirrored() {
255
- return this.logicalTrackValue && isRtl(this.element);
256
- }
257
- /**
258
- * Renders the normalized value as the starting position without writing it
259
- * back, and takes it as the baseline, so connecting reports nothing.
260
- */
351
+ #repaint = new MorphRenderWatcher(() => this.#render());
352
+ get #directionElement() {
353
+ return this.hasTrackTarget ? this.trackTarget : this.element;
354
+ }
261
355
  connect() {
262
- this.#repaint.activate();
356
+ this.#repaint.observe(this.element);
263
357
  this.#settled = this.#currentValue();
264
358
  this.#render();
265
359
  }
266
- /** Cancels any active pointer drag so document listeners never leak. */
267
360
  disconnect() {
268
- this.#repaint.cancel();
361
+ this.#repaint.disconnect();
269
362
  this.#endDrag();
270
363
  }
271
- /** Repaints a minimum changed by application code or a Turbo morph. */
272
364
  minValueChanged() {
273
365
  this.#repaint.schedule();
274
366
  }
275
- /** Repaints a maximum changed by application code or a Turbo morph. */
276
367
  maxValueChanged() {
277
368
  this.#repaint.schedule();
278
369
  }
279
- /** Repaints a step changed by application code or a Turbo morph. */
280
370
  stepValueChanged() {
281
371
  this.#repaint.schedule();
282
372
  }
283
- /** Repaints a value changed by application code or a Turbo morph. */
284
373
  valueValueChanged() {
285
374
  this.#repaint.schedule();
286
375
  }
287
- /** Hydrates a thumb inserted or replaced at runtime with the current ARIA state. */
288
376
  thumbTargetConnected(thumb) {
289
377
  const value = this.#currentValue();
290
378
  this.#renderThumb(thumb, value);
291
- this.#renderFraction(value);
292
379
  if (this.#drag && this.#drag.thumb === null) {
293
380
  this.#drag.thumb = thumb;
294
381
  thumb.focus();
295
382
  }
296
383
  this.#repaint.schedule();
297
384
  }
298
- /** Fills a form field inserted or replaced at runtime on the next repaint. */
299
385
  fieldTargetConnected() {
300
386
  this.#repaint.schedule();
301
387
  }
302
- /** Drops the stale focus owner while allowing a live track gesture to continue. */
388
+ fieldTargetDisconnected() {
389
+ this.#repaint.schedule();
390
+ }
303
391
  thumbTargetDisconnected(thumb) {
304
392
  if (this.#drag?.thumb === thumb) this.#drag.thumb = null;
393
+ this.#repaint.schedule();
305
394
  }
306
- /** Ends a gesture whose geometry target disappeared or ceased being a target. */
307
395
  trackTargetDisconnected(track) {
308
396
  if (this.#drag?.track === track) this.#endDrag();
309
397
  }
310
- /** Handles keyboard stepping per the APG slider model. */
311
398
  onKeydown(event) {
312
399
  if (isReservedArrowChord(event)) return;
400
+ if ((event.key === "Home" || event.key === "End" || event.key === "PageUp" || event.key === "PageDown") && hasModifierChord(event))
401
+ return;
313
402
  let next = null;
314
- const declared = this.valueValue;
403
+ const declared = this.#safeValue;
315
404
  const range = this.#steppedRange;
316
- switch (this.#mirrored ? logicalArrowKey(event.key, this.element) : event.key) {
405
+ switch (this.logicalTrackValue ? logicalArrowKey(event.key, this.#directionElement) : event.key) {
317
406
  case "ArrowRight":
318
407
  case "ArrowUp":
319
408
  next = stepSteppedValue(declared, 1, range);
@@ -329,10 +418,10 @@ var SliderController = class extends Controller {
329
418
  next = stepSteppedValue(declared, -10, range);
330
419
  break;
331
420
  case "Home":
332
- next = this.minValue;
421
+ next = this.#safeMin;
333
422
  break;
334
423
  case "End":
335
- next = this.maxValue;
424
+ next = this.#safeMax;
336
425
  break;
337
426
  default:
338
427
  return;
@@ -340,12 +429,11 @@ var SliderController = class extends Controller {
340
429
  event.preventDefault();
341
430
  this.#commit(next);
342
431
  }
343
- /** Begins a pointer drag: sets the value and tracks subsequent movement. */
344
432
  onPointerDown(event) {
345
433
  if (event.button !== 0 || this.#drag || !this.hasTrackTarget || !this.hasThumbTarget) return;
346
434
  const track = this.trackTarget;
347
435
  const thumb = this.thumbTarget;
348
- const mirrored = this.#mirrored;
436
+ const mirrored = this.logicalTrackValue && isRtl(track);
349
437
  const value = this.#valueFromClientX(event.clientX, mirrored, track);
350
438
  if (value === null) return;
351
439
  event.preventDefault();
@@ -367,96 +455,109 @@ var SliderController = class extends Controller {
367
455
  });
368
456
  this.#drag = drag;
369
457
  }
370
- /** Maps a pointer X coordinate to a raw value using a stable track snapshot. */
371
458
  #valueFromClientX(clientX, mirrored, track) {
372
459
  const rect = track.getBoundingClientRect();
373
460
  if (rect.width === 0) return null;
374
461
  const offset = (clientX - rect.left) / rect.width;
375
462
  const fraction = mirrored ? 1 - offset : offset;
376
- return this.minValue + fraction * (this.maxValue - this.minValue);
377
- }
378
- /**
379
- * Stores the normalized value the user moved to, renders it synchronously for
380
- * responsive input, and reports it as `change` when it differs from the value
381
- * last published. The comparison is with the value last published, not with
382
- * the value the move started from, so a page write no repaint has published
383
- * yet is reported once, as this change, and a move that ends where the value
384
- * was last published reports nothing. The baseline moves before either report
385
- * goes out, so the repaint the Value write schedules — and any move a
386
- * subscriber makes while the report is dispatched — is measured from this
387
- * value.
388
- */
463
+ return this.#safeMin + fraction * (this.#safeMax - this.#safeMin);
464
+ }
389
465
  #commit(raw) {
390
466
  const value = snapSteppedValue(raw, this.#steppedRange);
391
467
  const reported = this.#settled;
392
468
  this.#settled = value;
469
+ if (value !== reported) this.#move = this.#moves.record();
470
+ const move = this.#move;
393
471
  if (!Object.is(this.valueValue, value)) this.valueValue = value;
394
472
  this.#renderValue(value);
395
473
  this.#mirrorField(value, true);
474
+ if (!this.#moves.isLatest(move)) return;
396
475
  if (value !== reported) this.dispatch("change", { detail: { value } });
397
476
  }
398
- /** Mirrors `value` into the optional form field, reporting only a user's move. */
399
477
  #mirrorField(value, notify) {
400
478
  if (!this.hasFieldTarget) return;
401
479
  if (writeField(this.fieldTarget, String(value)) && notify) commitField(this.fieldTarget);
402
480
  }
403
- /**
404
- * Reflects the normalized current Value without writing it back. A published
405
- * value that moved from the last one is reported once as `reconcile`; the
406
- * field follows without a native `change`.
407
- *
408
- * @stimeoRenderRoot
409
- */
410
481
  #render() {
411
482
  const value = this.#currentValue();
412
483
  this.#renderValue(value);
413
484
  this.#mirrorField(value, false);
414
485
  if (value === this.#settled) return;
415
486
  this.#settled = value;
487
+ this.#move = this.#moves.record();
416
488
  this.dispatch("reconcile", { detail: { value } });
417
489
  }
418
- /** Reflects one normalized value on the current target and CSS output. */
419
490
  #renderValue(value) {
420
491
  if (this.hasThumbTarget) {
421
492
  this.#renderThumb(this.thumbTarget, value);
422
493
  }
423
494
  this.#renderFraction(value);
424
495
  }
425
- /** Writes only ARIA values that differ, including on a replacement target. */
426
496
  #renderThumb(thumb, value) {
427
497
  const attributes = {
428
- "aria-valuemin": String(this.minValue),
429
- "aria-valuemax": String(this.maxValue),
498
+ "aria-valuemin": String(this.#safeMin),
499
+ "aria-valuemax": String(this.#safeMax),
430
500
  "aria-valuenow": String(value)
431
501
  };
432
502
  for (const [name, next] of Object.entries(attributes)) {
433
- if (thumb.getAttribute(name) !== next) thumb.setAttribute(name, next);
503
+ setAttributeIfChanged(thumb, name, next);
434
504
  }
435
505
  }
436
- /** Writes the behavior-only positioning hook only when its value changed. */
437
506
  #renderFraction(value) {
438
- const fraction = rangeFraction(value, this.minValue, this.maxValue);
507
+ const fraction = rangeFraction(value, this.#safeMin, this.#safeMax);
439
508
  const next = String(fraction);
440
509
  if (this.element.style.getPropertyValue(FRACTION_PROPERTY) !== next) {
441
510
  this.element.style.setProperty(FRACTION_PROPERTY, next);
442
511
  }
443
512
  }
444
- /** Current normalized value derived from the live declarative inputs. */
445
513
  #currentValue() {
446
- return snapSteppedValue(this.valueValue, this.#steppedRange);
514
+ return snapSteppedValue(this.#safeValue, this.#steppedRange);
447
515
  }
448
- /** Shared range configuration; finite endpoints remain allowed off the grid. */
449
516
  get #steppedRange() {
450
- return { min: this.minValue, max: this.maxValue, step: this.stepValue };
517
+ return { min: this.#safeMin, max: this.#safeMax, step: this.#safeStep };
451
518
  }
452
- /** Ends the current pointer session without dispatching another change. */
453
519
  #endDrag() {
454
520
  const drag = this.#drag;
455
521
  this.#drag = null;
456
522
  drag?.pointer?.end();
457
523
  }
524
+ get #safeMin() {
525
+ return this.#numbers.read(
526
+ this,
527
+ "min",
528
+ this.minValue,
529
+ _SliderController.values.min.default,
530
+ _SliderController.valueConstraints.min
531
+ );
532
+ }
533
+ get #safeMax() {
534
+ return this.#numbers.read(
535
+ this,
536
+ "max",
537
+ this.maxValue,
538
+ _SliderController.values.max.default,
539
+ _SliderController.valueConstraints.max
540
+ );
541
+ }
542
+ get #safeStep() {
543
+ return this.#numbers.read(
544
+ this,
545
+ "step",
546
+ this.stepValue,
547
+ _SliderController.values.step.default,
548
+ _SliderController.valueConstraints.step
549
+ );
550
+ }
551
+ get #safeValue() {
552
+ return this.#numbers.read(
553
+ this,
554
+ "value",
555
+ this.valueValue,
556
+ this.#safeMin,
557
+ _SliderController.valueConstraints.value
558
+ );
559
+ }
458
560
  };
459
561
 
460
562
  export { SliderController };
461
- //# sourceMappingURL=slider_controller.js.map
462
563
  //# sourceMappingURL=slider_controller.js.map