stimeo-ui 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +8 -1
  3. package/dist/cable/index.d.ts +79 -23
  4. package/dist/cable/index.js +363 -436
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/controllers/accordion_controller.d.ts +4 -2
  7. package/dist/controllers/accordion_controller.js +166 -55
  8. package/dist/controllers/accordion_controller.js.map +1 -1
  9. package/dist/controllers/alert_dialog_controller.d.ts +12 -2
  10. package/dist/controllers/alert_dialog_controller.js +862 -221
  11. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  12. package/dist/controllers/announcer_controller.d.ts +35 -5
  13. package/dist/controllers/announcer_controller.js +135 -198
  14. package/dist/controllers/announcer_controller.js.map +1 -1
  15. package/dist/controllers/aspect_ratio_controller.js +0 -10
  16. package/dist/controllers/aspect_ratio_controller.js.map +1 -1
  17. package/dist/controllers/auto_submit_controller.d.ts +30 -6
  18. package/dist/controllers/auto_submit_controller.js +271 -127
  19. package/dist/controllers/auto_submit_controller.js.map +1 -1
  20. package/dist/controllers/avatar_controller.js +171 -105
  21. package/dist/controllers/avatar_controller.js.map +1 -1
  22. package/dist/controllers/breadcrumb_controller.js +0 -130
  23. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  24. package/dist/controllers/bulk_select_controller.d.ts +18 -0
  25. package/dist/controllers/bulk_select_controller.js +262 -52
  26. package/dist/controllers/bulk_select_controller.js.map +1 -1
  27. package/dist/controllers/calendar_controller.d.ts +24 -5
  28. package/dist/controllers/calendar_controller.js +175 -209
  29. package/dist/controllers/calendar_controller.js.map +1 -1
  30. package/dist/controllers/carousel_controller.d.ts +34 -7
  31. package/dist/controllers/carousel_controller.js +461 -399
  32. package/dist/controllers/carousel_controller.js.map +1 -1
  33. package/dist/controllers/character_counter_controller.d.ts +17 -1
  34. package/dist/controllers/character_counter_controller.js +246 -156
  35. package/dist/controllers/character_counter_controller.js.map +1 -1
  36. package/dist/controllers/checkbox_controller.d.ts +7 -2
  37. package/dist/controllers/checkbox_controller.js +32 -74
  38. package/dist/controllers/checkbox_controller.js.map +1 -1
  39. package/dist/controllers/clipboard_controller.d.ts +16 -5
  40. package/dist/controllers/clipboard_controller.js +168 -147
  41. package/dist/controllers/clipboard_controller.js.map +1 -1
  42. package/dist/controllers/collapsible_controller.d.ts +16 -4
  43. package/dist/controllers/collapsible_controller.js +301 -120
  44. package/dist/controllers/collapsible_controller.js.map +1 -1
  45. package/dist/controllers/color_picker_controller.d.ts +18 -6
  46. package/dist/controllers/color_picker_controller.js +149 -139
  47. package/dist/controllers/color_picker_controller.js.map +1 -1
  48. package/dist/controllers/combobox_controller.d.ts +23 -5
  49. package/dist/controllers/combobox_controller.js +360 -133
  50. package/dist/controllers/combobox_controller.js.map +1 -1
  51. package/dist/controllers/command_palette_controller.d.ts +45 -14
  52. package/dist/controllers/command_palette_controller.js +970 -358
  53. package/dist/controllers/command_palette_controller.js.map +1 -1
  54. package/dist/controllers/conditional_fields_controller.d.ts +15 -2
  55. package/dist/controllers/conditional_fields_controller.js +166 -124
  56. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  57. package/dist/controllers/confirm_controller.d.ts +49 -12
  58. package/dist/controllers/confirm_controller.js +939 -248
  59. package/dist/controllers/confirm_controller.js.map +1 -1
  60. package/dist/controllers/context_menu_controller.d.ts +31 -4
  61. package/dist/controllers/context_menu_controller.js +256 -128
  62. package/dist/controllers/context_menu_controller.js.map +1 -1
  63. package/dist/controllers/count_up_controller.d.ts +13 -1
  64. package/dist/controllers/count_up_controller.js +73 -21
  65. package/dist/controllers/count_up_controller.js.map +1 -1
  66. package/dist/controllers/countdown_controller.d.ts +45 -1
  67. package/dist/controllers/countdown_controller.js +183 -148
  68. package/dist/controllers/countdown_controller.js.map +1 -1
  69. package/dist/controllers/currency_input_controller.d.ts +21 -2
  70. package/dist/controllers/currency_input_controller.js +134 -158
  71. package/dist/controllers/currency_input_controller.js.map +1 -1
  72. package/dist/controllers/data_grid_controller.d.ts +15 -4
  73. package/dist/controllers/data_grid_controller.js +114 -186
  74. package/dist/controllers/data_grid_controller.js.map +1 -1
  75. package/dist/controllers/date_range_picker_controller.d.ts +30 -5
  76. package/dist/controllers/date_range_picker_controller.js +288 -206
  77. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  78. package/dist/controllers/dialog_controller.d.ts +13 -1
  79. package/dist/controllers/dialog_controller.js +858 -223
  80. package/dist/controllers/dialog_controller.js.map +1 -1
  81. package/dist/controllers/direct_upload_controller.d.ts +24 -7
  82. package/dist/controllers/direct_upload_controller.js +73 -153
  83. package/dist/controllers/direct_upload_controller.js.map +1 -1
  84. package/dist/controllers/dirty_form_controller.js +14 -48
  85. package/dist/controllers/dirty_form_controller.js.map +1 -1
  86. package/dist/controllers/dismissible_controller.d.ts +19 -0
  87. package/dist/controllers/dismissible_controller.js +175 -21
  88. package/dist/controllers/dismissible_controller.js.map +1 -1
  89. package/dist/controllers/drawer_controller.d.ts +39 -11
  90. package/dist/controllers/drawer_controller.js +933 -341
  91. package/dist/controllers/drawer_controller.js.map +1 -1
  92. package/dist/controllers/dropdown_controller.d.ts +31 -1
  93. package/dist/controllers/dropdown_controller.js +312 -82
  94. package/dist/controllers/dropdown_controller.js.map +1 -1
  95. package/dist/controllers/editable_controller.d.ts +12 -1
  96. package/dist/controllers/editable_controller.js +158 -68
  97. package/dist/controllers/editable_controller.js.map +1 -1
  98. package/dist/controllers/empty_state_controller.js +67 -53
  99. package/dist/controllers/empty_state_controller.js.map +1 -1
  100. package/dist/controllers/file_dropzone_controller.d.ts +60 -18
  101. package/dist/controllers/file_dropzone_controller.js +311 -207
  102. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  103. package/dist/controllers/filter_controller.js +67 -39
  104. package/dist/controllers/filter_controller.js.map +1 -1
  105. package/dist/controllers/flash_controller.d.ts +31 -8
  106. package/dist/controllers/flash_controller.js +172 -314
  107. package/dist/controllers/flash_controller.js.map +1 -1
  108. package/dist/controllers/focus_controller.d.ts +12 -3
  109. package/dist/controllers/focus_controller.js +654 -240
  110. package/dist/controllers/focus_controller.js.map +1 -1
  111. package/dist/controllers/form_field_controller.js +147 -132
  112. package/dist/controllers/form_field_controller.js.map +1 -1
  113. package/dist/controllers/form_validation_controller.js +13 -86
  114. package/dist/controllers/form_validation_controller.js.map +1 -1
  115. package/dist/controllers/frame_loading_controller.d.ts +41 -9
  116. package/dist/controllers/frame_loading_controller.js +264 -213
  117. package/dist/controllers/frame_loading_controller.js.map +1 -1
  118. package/dist/controllers/highlight_controller.d.ts +22 -2
  119. package/dist/controllers/highlight_controller.js +107 -75
  120. package/dist/controllers/highlight_controller.js.map +1 -1
  121. package/dist/controllers/hover_card_controller.d.ts +56 -3
  122. package/dist/controllers/hover_card_controller.js +309 -118
  123. package/dist/controllers/hover_card_controller.js.map +1 -1
  124. package/dist/controllers/idle_controller.d.ts +42 -1
  125. package/dist/controllers/idle_controller.js +267 -101
  126. package/dist/controllers/idle_controller.js.map +1 -1
  127. package/dist/controllers/input_mask_controller.js +71 -72
  128. package/dist/controllers/input_mask_controller.js.map +1 -1
  129. package/dist/controllers/intersection_controller.d.ts +32 -13
  130. package/dist/controllers/intersection_controller.js +147 -106
  131. package/dist/controllers/intersection_controller.js.map +1 -1
  132. package/dist/controllers/lazy_frame_controller.d.ts +16 -0
  133. package/dist/controllers/lazy_frame_controller.js +9 -65
  134. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  135. package/dist/controllers/listbox_controller.d.ts +34 -2
  136. package/dist/controllers/listbox_controller.js +306 -204
  137. package/dist/controllers/listbox_controller.js.map +1 -1
  138. package/dist/controllers/local_time_controller.d.ts +1 -1
  139. package/dist/controllers/local_time_controller.js +54 -64
  140. package/dist/controllers/local_time_controller.js.map +1 -1
  141. package/dist/controllers/masonry_controller.d.ts +11 -3
  142. package/dist/controllers/masonry_controller.js +70 -93
  143. package/dist/controllers/masonry_controller.js.map +1 -1
  144. package/dist/controllers/menu_controller.d.ts +32 -7
  145. package/dist/controllers/menu_controller.js +214 -156
  146. package/dist/controllers/menu_controller.js.map +1 -1
  147. package/dist/controllers/menubar_controller.d.ts +4 -4
  148. package/dist/controllers/menubar_controller.js +170 -329
  149. package/dist/controllers/menubar_controller.js.map +1 -1
  150. package/dist/controllers/meter_controller.d.ts +20 -0
  151. package/dist/controllers/meter_controller.js +151 -67
  152. package/dist/controllers/meter_controller.js.map +1 -1
  153. package/dist/controllers/multi_select_controller.d.ts +32 -4
  154. package/dist/controllers/multi_select_controller.js +593 -358
  155. package/dist/controllers/multi_select_controller.js.map +1 -1
  156. package/dist/controllers/navigation_menu_controller.d.ts +8 -1
  157. package/dist/controllers/navigation_menu_controller.js +124 -232
  158. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  159. package/dist/controllers/nested_form_controller.d.ts +10 -0
  160. package/dist/controllers/nested_form_controller.js +352 -182
  161. package/dist/controllers/nested_form_controller.js.map +1 -1
  162. package/dist/controllers/network_status_controller.d.ts +23 -0
  163. package/dist/controllers/network_status_controller.js +242 -54
  164. package/dist/controllers/network_status_controller.js.map +1 -1
  165. package/dist/controllers/number_input_controller.d.ts +26 -2
  166. package/dist/controllers/number_input_controller.js +320 -263
  167. package/dist/controllers/number_input_controller.js.map +1 -1
  168. package/dist/controllers/optimistic_controller.js +16 -76
  169. package/dist/controllers/optimistic_controller.js.map +1 -1
  170. package/dist/controllers/otp_controller.d.ts +20 -4
  171. package/dist/controllers/otp_controller.js +198 -193
  172. package/dist/controllers/otp_controller.js.map +1 -1
  173. package/dist/controllers/overflow_indicator_controller.d.ts +5 -0
  174. package/dist/controllers/overflow_indicator_controller.js +116 -113
  175. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  176. package/dist/controllers/overflow_menu_controller.d.ts +48 -11
  177. package/dist/controllers/overflow_menu_controller.js +343 -283
  178. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  179. package/dist/controllers/pagination_controller.d.ts +35 -6
  180. package/dist/controllers/pagination_controller.js +295 -119
  181. package/dist/controllers/pagination_controller.js.map +1 -1
  182. package/dist/controllers/password_reveal_controller.d.ts +45 -8
  183. package/dist/controllers/password_reveal_controller.js +389 -121
  184. package/dist/controllers/password_reveal_controller.js.map +1 -1
  185. package/dist/controllers/password_strength_controller.d.ts +14 -5
  186. package/dist/controllers/password_strength_controller.js +99 -153
  187. package/dist/controllers/password_strength_controller.js.map +1 -1
  188. package/dist/controllers/persist_controller.d.ts +11 -4
  189. package/dist/controllers/persist_controller.js +237 -103
  190. package/dist/controllers/persist_controller.js.map +1 -1
  191. package/dist/controllers/pointer_drag_controller.d.ts +19 -7
  192. package/dist/controllers/pointer_drag_controller.js +185 -165
  193. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  194. package/dist/controllers/popover_controller.d.ts +38 -2
  195. package/dist/controllers/popover_controller.js +236 -97
  196. package/dist/controllers/popover_controller.js.map +1 -1
  197. package/dist/controllers/portal_controller.d.ts +44 -4
  198. package/dist/controllers/portal_controller.js +209 -76
  199. package/dist/controllers/portal_controller.js.map +1 -1
  200. package/dist/controllers/preview_guard_controller.d.ts +10 -4
  201. package/dist/controllers/preview_guard_controller.js +232 -116
  202. package/dist/controllers/preview_guard_controller.js.map +1 -1
  203. package/dist/controllers/progress_controller.d.ts +11 -0
  204. package/dist/controllers/progress_controller.js +125 -56
  205. package/dist/controllers/progress_controller.js.map +1 -1
  206. package/dist/controllers/radio_group_controller.d.ts +14 -5
  207. package/dist/controllers/radio_group_controller.js +117 -137
  208. package/dist/controllers/radio_group_controller.js.map +1 -1
  209. package/dist/controllers/range_slider_controller.d.ts +43 -3
  210. package/dist/controllers/range_slider_controller.js +192 -105
  211. package/dist/controllers/range_slider_controller.js.map +1 -1
  212. package/dist/controllers/rating_controller.d.ts +20 -4
  213. package/dist/controllers/rating_controller.js +418 -207
  214. package/dist/controllers/rating_controller.js.map +1 -1
  215. package/dist/controllers/read_more_controller.d.ts +2 -0
  216. package/dist/controllers/read_more_controller.js +134 -63
  217. package/dist/controllers/read_more_controller.js.map +1 -1
  218. package/dist/controllers/reading_progress_controller.d.ts +1 -1
  219. package/dist/controllers/reading_progress_controller.js +147 -135
  220. package/dist/controllers/reading_progress_controller.js.map +1 -1
  221. package/dist/controllers/relative_time_controller.d.ts +18 -4
  222. package/dist/controllers/relative_time_controller.js +145 -110
  223. package/dist/controllers/relative_time_controller.js.map +1 -1
  224. package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
  225. package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +97 -38
  226. package/dist/controllers/reset_on_restore_controller.js.map +1 -0
  227. package/dist/controllers/resizable_controller.d.ts +28 -2
  228. package/dist/controllers/resizable_controller.js +255 -139
  229. package/dist/controllers/resizable_controller.js.map +1 -1
  230. package/dist/controllers/roving_controller.js +39 -84
  231. package/dist/controllers/roving_controller.js.map +1 -1
  232. package/dist/controllers/scroll_area_controller.d.ts +7 -3
  233. package/dist/controllers/scroll_area_controller.js +428 -225
  234. package/dist/controllers/scroll_area_controller.js.map +1 -1
  235. package/dist/controllers/scroll_restore_controller.js +0 -53
  236. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  237. package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
  238. package/dist/controllers/scroll_visibility_controller.js +395 -145
  239. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  240. package/dist/controllers/scrollspy_controller.d.ts +6 -1
  241. package/dist/controllers/scrollspy_controller.js +181 -242
  242. package/dist/controllers/scrollspy_controller.js.map +1 -1
  243. package/dist/controllers/separator_controller.d.ts +19 -4
  244. package/dist/controllers/separator_controller.js +267 -140
  245. package/dist/controllers/separator_controller.js.map +1 -1
  246. package/dist/controllers/sidebar_controller.d.ts +64 -7
  247. package/dist/controllers/sidebar_controller.js +1023 -386
  248. package/dist/controllers/sidebar_controller.js.map +1 -1
  249. package/dist/controllers/skeleton_controller.d.ts +23 -0
  250. package/dist/controllers/skeleton_controller.js +248 -97
  251. package/dist/controllers/skeleton_controller.js.map +1 -1
  252. package/dist/controllers/slider_controller.d.ts +27 -1
  253. package/dist/controllers/slider_controller.js +159 -79
  254. package/dist/controllers/slider_controller.js.map +1 -1
  255. package/dist/controllers/smart_sticky_header_controller.d.ts +21 -3
  256. package/dist/controllers/smart_sticky_header_controller.js +162 -63
  257. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  258. package/dist/controllers/sortable_controller.js +0 -112
  259. package/dist/controllers/sortable_controller.js.map +1 -1
  260. package/dist/controllers/spinner_controller.d.ts +39 -4
  261. package/dist/controllers/spinner_controller.js +277 -169
  262. package/dist/controllers/spinner_controller.js.map +1 -1
  263. package/dist/controllers/step_indicator_controller.d.ts +5 -0
  264. package/dist/controllers/step_indicator_controller.js +99 -46
  265. package/dist/controllers/step_indicator_controller.js.map +1 -1
  266. package/dist/controllers/stepper_controller.d.ts +12 -3
  267. package/dist/controllers/stepper_controller.js +114 -73
  268. package/dist/controllers/stepper_controller.js.map +1 -1
  269. package/dist/controllers/stick_to_bottom_controller.d.ts +6 -0
  270. package/dist/controllers/stick_to_bottom_controller.js +262 -138
  271. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  272. package/dist/controllers/sticky_observer_controller.d.ts +11 -0
  273. package/dist/controllers/sticky_observer_controller.js +214 -49
  274. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  275. package/dist/controllers/submit_once_controller.d.ts +23 -8
  276. package/dist/controllers/submit_once_controller.js +294 -205
  277. package/dist/controllers/submit_once_controller.js.map +1 -1
  278. package/dist/controllers/switch_controller.d.ts +12 -1
  279. package/dist/controllers/switch_controller.js +33 -60
  280. package/dist/controllers/switch_controller.js.map +1 -1
  281. package/dist/controllers/tabs_controller.d.ts +2 -2
  282. package/dist/controllers/tabs_controller.js +35 -29
  283. package/dist/controllers/tabs_controller.js.map +1 -1
  284. package/dist/controllers/tags_input_controller.d.ts +12 -0
  285. package/dist/controllers/tags_input_controller.js +136 -145
  286. package/dist/controllers/tags_input_controller.js.map +1 -1
  287. package/dist/controllers/textarea_autosize_controller.d.ts +10 -0
  288. package/dist/controllers/textarea_autosize_controller.js +71 -58
  289. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  290. package/dist/controllers/theme_controller.d.ts +21 -9
  291. package/dist/controllers/theme_controller.js +130 -112
  292. package/dist/controllers/theme_controller.js.map +1 -1
  293. package/dist/controllers/time_picker_controller.d.ts +18 -1
  294. package/dist/controllers/time_picker_controller.js +146 -80
  295. package/dist/controllers/time_picker_controller.js.map +1 -1
  296. package/dist/controllers/toast_controller.d.ts +36 -11
  297. package/dist/controllers/toast_controller.js +186 -297
  298. package/dist/controllers/toast_controller.js.map +1 -1
  299. package/dist/controllers/toggle_group_controller.d.ts +12 -3
  300. package/dist/controllers/toggle_group_controller.js +95 -136
  301. package/dist/controllers/toggle_group_controller.js.map +1 -1
  302. package/dist/controllers/toolbar_controller.js +68 -98
  303. package/dist/controllers/toolbar_controller.js.map +1 -1
  304. package/dist/controllers/tooltip_controller.d.ts +45 -3
  305. package/dist/controllers/tooltip_controller.js +158 -124
  306. package/dist/controllers/tooltip_controller.js.map +1 -1
  307. package/dist/controllers/transition_controller.d.ts +22 -4
  308. package/dist/controllers/transition_controller.js +123 -119
  309. package/dist/controllers/transition_controller.js.map +1 -1
  310. package/dist/controllers/tree_view_controller.d.ts +21 -11
  311. package/dist/controllers/tree_view_controller.js +150 -345
  312. package/dist/controllers/tree_view_controller.js.map +1 -1
  313. package/dist/index.d.ts +8 -5
  314. package/dist/index.js +6370 -9346
  315. package/dist/index.js.map +1 -1
  316. package/dist/inspector/cli.d.ts +23 -3
  317. package/dist/inspector/cli.js +92 -37
  318. package/dist/inspector/cli.js.map +1 -1
  319. package/dist/inspector/cli_bin.js +92 -56
  320. package/dist/inspector/cli_bin.js.map +1 -1
  321. package/dist/inspector/examples.json +8 -8
  322. package/dist/inspector/manifest.json +787 -100
  323. package/dist/positioning/index.d.ts +8 -0
  324. package/dist/positioning/index.js +148 -47
  325. package/dist/positioning/index.js.map +1 -1
  326. package/package.json +6 -6
  327. package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
  328. package/dist/controllers/reset_before_cache_controller.js.map +0 -1
@@ -1,8 +1,5 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/currency_input_controller.ts
4
-
5
- // src/utils/composition_tracker.ts
6
3
  var COMPOSITION_INPUT_TYPES = /* @__PURE__ */ new Set([
7
4
  "insertCompositionText",
8
5
  "insertFromComposition",
@@ -14,13 +11,11 @@ var CompositionTracker = class {
14
11
  #activeTargets = /* @__PURE__ */ new Set();
15
12
  #onStart;
16
13
  #onEnd;
17
- /** The field whose confirming `input` is still owed, while the window is open. */
18
14
  #confirmedTarget = null;
19
15
  constructor(options = {}) {
20
16
  this.#onStart = options.onStart;
21
17
  this.#onEnd = options.onEnd;
22
18
  }
23
- /** Starts lifecycle tracking for `target`; repeated calls are idempotent. */
24
19
  observe(target) {
25
20
  if (this.#observedTargets.has(target)) return;
26
21
  target.addEventListener("compositionstart", this.#handleStart);
@@ -28,7 +23,6 @@ var CompositionTracker = class {
28
23
  target.addEventListener("keydown", this.#handleKeydown);
29
24
  this.#observedTargets.add(target);
30
25
  }
31
- /** Stops tracking one target and clears any active composition it owned. */
32
26
  unobserve(target) {
33
27
  if (!this.#observedTargets.delete(target)) return;
34
28
  target.removeEventListener("compositionstart", this.#handleStart);
@@ -37,7 +31,6 @@ var CompositionTracker = class {
37
31
  this.#activeTargets.delete(target);
38
32
  if (this.#confirmedTarget === target) this.#confirmedTarget = null;
39
33
  }
40
- /** Releases every listener and clears state so reconnect starts cleanly. */
41
34
  disconnect() {
42
35
  for (const target of this.#observedTargets) {
43
36
  target.removeEventListener("compositionstart", this.#handleStart);
@@ -48,16 +41,9 @@ var CompositionTracker = class {
48
41
  this.#activeTargets.clear();
49
42
  this.#confirmedTarget = null;
50
43
  }
51
- /** True when lifecycle tracking or the current event reports composition. */
52
44
  isComposing(event) {
53
45
  return this.#activeTargets.size > 0 || event?.isComposing === true;
54
46
  }
55
- /**
56
- * Whether `event` is the `input` echoing the composition just confirmed.
57
- *
58
- * Asking closes the window either way, so one confirmation is folded at most
59
- * once and a consumer asks once per `input`.
60
- */
61
47
  consumesConfirmedInput(event) {
62
48
  const confirmed = this.#confirmedTarget;
63
49
  this.#confirmedTarget = null;
@@ -75,13 +61,11 @@ var CompositionTracker = class {
75
61
  this.#confirmedTarget = event.target;
76
62
  this.#onEnd?.(event);
77
63
  };
78
- /** A key on an observed field opens an edit of its own, so no echo is owed. */
79
64
  #handleKeydown = () => {
80
65
  this.#confirmedTarget = null;
81
66
  };
82
67
  };
83
68
 
84
- // src/utils/half_width.ts
85
69
  var FULL_WIDTH_SHIFT = 65248;
86
70
  function halfWidthChar(char) {
87
71
  if (char >= "\uFF01" && char <= "\uFF5E") {
@@ -90,7 +74,6 @@ function halfWidthChar(char) {
90
74
  return char === "\u3000" ? " " : char;
91
75
  }
92
76
 
93
- // src/utils/intl_format.ts
94
77
  var formatters = /* @__PURE__ */ new WeakMap();
95
78
  function intlFormatter(factory, locale, options, fallbackLocale) {
96
79
  const cache = cacheFor(factory);
@@ -120,51 +103,144 @@ function construct(factory, locale, options, fallbackLocale) {
120
103
  }
121
104
  }
122
105
 
123
- // src/utils/locale.ts
124
106
  function resolveLocale(element, declared = "") {
125
107
  return declared || element.closest("[lang]")?.getAttribute("lang") || void 0;
126
108
  }
127
109
 
128
- // src/controllers/currency_input_controller.ts
110
+ var ListenerSet = class {
111
+ #abort = new AbortController();
112
+ add(target, type, handler, options) {
113
+ target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
114
+ }
115
+ dispose() {
116
+ this.#abort.abort();
117
+ this.#abort = new AbortController();
118
+ }
119
+ };
120
+
121
+ var MicrotaskCoalescer = class {
122
+ #run;
123
+ #queued = false;
124
+ #active = false;
125
+ #generation = 0;
126
+ constructor(run) {
127
+ this.#run = run;
128
+ }
129
+ activate() {
130
+ this.#active = true;
131
+ }
132
+ cancel() {
133
+ this.#active = false;
134
+ this.#queued = false;
135
+ this.#generation += 1;
136
+ }
137
+ schedule() {
138
+ if (!this.#active || this.#queued) return;
139
+ this.#queued = true;
140
+ const generation = this.#generation;
141
+ queueMicrotask(() => {
142
+ if (generation !== this.#generation || !this.#queued || !this.#active) return;
143
+ this.#queued = false;
144
+ this.#run();
145
+ });
146
+ }
147
+ };
148
+
149
+ var MorphRenderWatcher = class {
150
+ #listeners = new ListenerSet();
151
+ #pass;
152
+ #element = null;
153
+ #onMorph = () => this.#pass.schedule();
154
+ constructor(run) {
155
+ this.#pass = new MicrotaskCoalescer(run);
156
+ }
157
+ observe(element) {
158
+ if (this.#element === element) return;
159
+ this.disconnect();
160
+ this.#element = element;
161
+ this.#pass.activate();
162
+ this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
163
+ }
164
+ schedule() {
165
+ this.#pass.schedule();
166
+ }
167
+ disconnect() {
168
+ this.#listeners.dispose();
169
+ this.#pass.cancel();
170
+ this.#element = null;
171
+ }
172
+ };
173
+
174
+ function matchesNumberBounds(value, bounds) {
175
+ if (!Number.isFinite(value)) {
176
+ const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
177
+ if (direction === null) return false;
178
+ if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
179
+ }
180
+ if (bounds.min !== void 0 && value < bounds.min) return false;
181
+ if (bounds.max !== void 0 && value > bounds.max) return false;
182
+ if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
183
+ if (bounds.integer && !Number.isInteger(value)) return false;
184
+ if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
185
+ return true;
186
+ }
187
+
188
+ function readNumber(raw, fallback, bounds) {
189
+ return matchesNumberBounds(raw, bounds) ? raw : fallback;
190
+ }
191
+
192
+ var NumberValueReader = class {
193
+ #lastRejected = /* @__PURE__ */ new Map();
194
+ read(owner, name, raw, fallback, bounds) {
195
+ const resolved = readNumber(raw, fallback, bounds);
196
+ if (matchesNumberBounds(raw, bounds)) {
197
+ this.#lastRejected.delete(name);
198
+ return resolved;
199
+ }
200
+ const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
201
+ const literal = owner.element.getAttribute(attribute);
202
+ if (literal === null) {
203
+ this.#lastRejected.delete(name);
204
+ return resolved;
205
+ }
206
+ if (this.#lastRejected.get(name) !== literal) {
207
+ this.#lastRejected.set(name, literal);
208
+ console.warn(
209
+ `Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
210
+ );
211
+ }
212
+ return resolved;
213
+ }
214
+ };
215
+
129
216
  var FALLBACK_LOCALE = "en-US";
130
- var CurrencyInputController = class extends Controller {
217
+ var CurrencyInputController = class _CurrencyInputController extends Controller {
218
+ #numbers = new NumberValueReader();
131
219
  static targets = ["display", "field", "srValue"];
132
220
  static values = {
133
221
  locale: { type: String, default: "" },
134
222
  currency: { type: String, default: "" },
135
223
  precision: { type: Number, default: 2 }
136
224
  };
225
+ static valueConstraints = {
226
+ precision: { finite: true, integer: true, min: 0, max: 100 }
227
+ };
137
228
  static actions = ["format", "onInput"];
138
229
  static events = ["change", "reconcile"];
139
- /** The numeric value last committed; both events report only a move away from it. */
140
230
  #lastValue = null;
141
231
  #started = false;
142
- /** A declaration change that arrived mid-composition, applied once nothing composes. */
143
232
  #changeHeld = false;
144
- /** The display a composition is running on, until that composition ends. */
145
233
  #composing = null;
146
- /**
147
- * The display text this controller last rendered. It tells this controller's own
148
- * text, written with the separators in force, from text the page wrote.
149
- */
150
234
  #rendered = null;
151
- /** Validated mirrors of the Values; the hot path never reads a raw Value. */
152
235
  #locale;
153
236
  #currency = "";
154
237
  #precision = 2;
155
- /** Formatters rebuilt when the declarations are taken in, never per keystroke. */
156
238
  #grouping;
157
239
  #fixed;
158
240
  #accessible;
159
241
  #group = ",";
160
242
  #decimal = ".";
161
- /** The locale's non-Latin digits mapped back to ASCII (empty for Latin locales). */
162
243
  #digits = /* @__PURE__ */ new Map();
163
- /**
164
- * Holds mid-composition input so the IME's uncommitted text is never rewritten.
165
- * The confirmed text is formatted once, and a declaration change the composition
166
- * held back is applied after it.
167
- */
168
244
  #composition = new CompositionTracker({
169
245
  onStart: (event) => {
170
246
  this.#composing = event.currentTarget;
@@ -175,10 +251,6 @@ var CurrencyInputController = class extends Controller {
175
251
  this.#applyHeldChange();
176
252
  }
177
253
  });
178
- /**
179
- * Re-validates on declaration changes and re-renders the committed display,
180
- * reporting a value the re-render moved as `reconcile`.
181
- */
182
254
  localeValueChanged() {
183
255
  this.#applyValueChange();
184
256
  }
@@ -188,18 +260,6 @@ var CurrencyInputController = class extends Controller {
188
260
  precisionValueChanged() {
189
261
  this.#applyValueChange();
190
262
  }
191
- /**
192
- * Reads the display with the declarations its text was written for, then
193
- * re-renders it under the new ones — so a locale switch re-interprets the
194
- * value, never the old text with new separators, and text the page wrote for
195
- * the declarations it changes is never read with the old ones.
196
- *
197
- * While the display is composing, its text is the IME's: the change is held,
198
- * configuration and all, until the composition ends, so the confirmed text is
199
- * read with the separators it was typed against before the change applies.
200
- *
201
- * @stimeoRenderRoot
202
- */
203
263
  #applyValueChange() {
204
264
  if (this.#composition.isComposing()) {
205
265
  this.#changeHeld = true;
@@ -215,42 +275,24 @@ var CurrencyInputController = class extends Controller {
215
275
  this.#renderFixed(scan.value, "reconcile");
216
276
  }
217
277
  }
218
- /** Applies a declaration change a composition held back. */
219
278
  #applyHeldChange() {
220
279
  if (!this.#changeHeld) return;
221
280
  this.#changeHeld = false;
222
281
  this.#applyValueChange();
223
282
  }
224
- /**
225
- * Reads the display and takes in the declarations the page carries now. This
226
- * controller's own rendering was written with the separators in force, so it
227
- * is read before they change; any other text is the page's, written for the
228
- * declarations it carries, so it is read after.
229
- */
230
283
  #readDisplay() {
231
284
  const text = this.displayTarget.value;
232
285
  const own = text === this.#rendered ? this.#scan(text) : null;
233
286
  this.#takeInDeclarations();
234
287
  return own ?? this.#scan(text);
235
288
  }
236
- /** Takes in the declarations the page carries now, a change a composition held among them. */
237
289
  #takeInDeclarations() {
238
290
  this.#changeHeld = false;
239
291
  this.#revalidate();
240
292
  }
241
- /**
242
- * Takes in the declarations the page carries now and normalizes the display
243
- * to its fixed-precision form.
244
- *
245
- * A display still showing this controller's own last rendering is not read
246
- * back: its separators may belong to declarations that changed while the
247
- * controller was away, and the committed value is known anyway. That value is
248
- * re-rendered at the current fixed precision, which rounds it whether
249
- * `precision` changed meanwhile or the entry was left unrounded mid-typing, and
250
- * a move the rounding causes is reported as `reconcile`. Any other text is the
251
- * page's, written for the declarations it carries, so it is read with them.
252
- */
293
+ #morph = new MorphRenderWatcher(() => this.#applyValueChange());
253
294
  connect() {
295
+ this.#morph.observe(this.element);
254
296
  this.#started = true;
255
297
  this.#takeInDeclarations();
256
298
  if (!this.hasDisplayTarget) return;
@@ -262,44 +304,22 @@ var CurrencyInputController = class extends Controller {
262
304
  this.#lastValue = value === null ? null : round(value, this.#precision);
263
305
  this.#renderFixed(value, "reconcile");
264
306
  }
265
- /**
266
- * Releases the composition listeners. A composition still running hears no
267
- * `compositionend` once they are gone, so it ends here; a change it held is
268
- * taken in on the next `connect()`.
269
- */
270
307
  disconnect() {
308
+ this.#morph.disconnect();
271
309
  this.#endUntrackedComposition();
272
310
  this.#composition.disconnect();
273
311
  this.#started = false;
274
312
  }
275
- /**
276
- * Tracks composition on an arriving (or swapped-in) display and normalizes it
277
- * under the declarations the page carries now, reading this controller's own
278
- * rendering with the separators it was written under; an amount that differs
279
- * from the committed one is the page's, so it is reported as `reconcile`.
280
- */
281
313
  displayTargetConnected(target) {
282
314
  this.#composition.observe(target);
283
- if (!this.#started) return;
315
+ if (!this.#started || !this.hasDisplayTarget || this.displayTarget !== target) return;
284
316
  this.#renderFixed(this.#readDisplay().value, "reconcile");
285
317
  }
286
- /**
287
- * Stops tracking a display that leaves. A composition running on it hears no
288
- * `compositionend` any more, so it ends here; a change it held waits for the
289
- * next display to be read.
290
- */
291
318
  displayTargetDisconnected(target) {
292
319
  this.#composition.unobserve(target);
293
- this.#endUntrackedComposition();
320
+ if (target === this.#composing) this.#endUntrackedComposition();
321
+ this.#applyValueChange();
294
322
  }
295
- /**
296
- * Ends a composition no `compositionend` will reach. A display still in place —
297
- * one a move re-inserted, or the display of a controller that moves — holds the
298
- * text the composition left, typed against the declarations in force, so it is
299
- * read as `compositionend` would read it and becomes this controller's own
300
- * rendering. The page's move ended the composition, so a value it moves is
301
- * reported as `reconcile`. A display that left takes its composition along.
302
- */
303
323
  #endUntrackedComposition() {
304
324
  const display = this.#composing;
305
325
  this.#composing = null;
@@ -307,28 +327,25 @@ var CurrencyInputController = class extends Controller {
307
327
  this.#reformat(false, "reconcile");
308
328
  }
309
329
  }
310
- /** Syncs a late-arriving hidden field without touching the display or events. */
311
330
  fieldTargetConnected() {
312
331
  if (this.#started) this.#resync();
313
332
  }
314
- /** Syncs a late-arriving screen-reader span the same way. */
333
+ fieldTargetDisconnected() {
334
+ if (this.#started) this.#resync();
335
+ }
315
336
  srValueTargetConnected() {
316
337
  if (this.#started) this.#resync();
317
338
  }
318
- /** Re-groups digits as the user types, preserving the caret position. */
339
+ srValueTargetDisconnected() {
340
+ if (this.#started) this.#resync();
341
+ }
319
342
  onInput(event) {
320
343
  if (this.#composition.isComposing(event)) return;
321
344
  this.#reformat(false, "edit");
322
345
  }
323
- /** Applies the fixed-precision rounding on blur. */
324
346
  format() {
325
347
  this.#reformat(true, "edit");
326
348
  }
327
- /**
328
- * Parses the display value, rewrites it grouped (optionally at fixed
329
- * precision), keeps the caret stable by significant characters, and syncs the
330
- * field, the screen-reader span, and the event `cause` selects.
331
- */
332
349
  #reformat(fixedPrecision, cause) {
333
350
  if (!this.hasDisplayTarget) return;
334
351
  const raw = this.displayTarget.value;
@@ -347,10 +364,6 @@ var CurrencyInputController = class extends Controller {
347
364
  this.#rendered = formatted;
348
365
  this.#reflect(value, formatted, cause);
349
366
  }
350
- /**
351
- * Shows `value` at the fixed precision — an empty display for no value — and
352
- * reports a move under the event `cause` selects.
353
- */
354
367
  #renderFixed(value, cause) {
355
368
  if (value === null) {
356
369
  this.#show("");
@@ -362,20 +375,15 @@ var CurrencyInputController = class extends Controller {
362
375
  this.#show(formatted);
363
376
  this.#reflect(rounded, formatted, cause);
364
377
  }
365
- /** Writes `text` to the display as this controller's own rendering. */
366
378
  #show(text) {
367
- this.displayTarget.value = text;
379
+ if (this.displayTarget.value !== text) this.displayTarget.value = text;
368
380
  this.#rendered = text;
369
381
  }
370
- /**
371
- * The in-progress rendering: grouped integer, sign and fraction as typed.
372
- */
373
382
  #render(parts) {
374
383
  const int = parts.int === "" ? "" : this.#grouping.format(BigInt(parts.int));
375
384
  const frac = parts.hasDot ? this.#decimal + parts.frac : "";
376
385
  return parts.sign + int + frac;
377
386
  }
378
- /** Restores the caret to sit just after the n-th significant character. */
379
387
  #restoreCaret(formatted, significantBefore) {
380
388
  let seen = 0;
381
389
  let position = formatted.length;
@@ -391,11 +399,6 @@ var CurrencyInputController = class extends Controller {
391
399
  } catch {
392
400
  }
393
401
  }
394
- /**
395
- * Counts the characters before `caret` that survive into the rendering,
396
- * applying the same acceptance rules as {@link #scan} — a rejected keystroke
397
- * (a mid-string sign, a second decimal mark) must not shift the anchor.
398
- */
399
402
  #significantBefore(text, caret) {
400
403
  let count = 0;
401
404
  let sawSign = false;
@@ -415,13 +418,11 @@ var CurrencyInputController = class extends Controller {
415
418
  }
416
419
  return count;
417
420
  }
418
- /** Digits, signs, and the decimal mark anchor the caret; grouping does not. */
419
421
  #isSignificant(ch) {
420
422
  if (ch >= "0" && ch <= "9") return true;
421
423
  if (ch === "-" || ch === "+") return true;
422
424
  return ch === this.#decimal || ch === "." && this.#group !== ".";
423
425
  }
424
- /** Writes the normalized value to the field, the SR span, and the empty hook. */
425
426
  #write(value) {
426
427
  const isEmpty = value === null;
427
428
  if (this.hasFieldTarget) this.fieldTarget.value = isEmpty ? "" : String(value);
@@ -430,13 +431,6 @@ var CurrencyInputController = class extends Controller {
430
431
  }
431
432
  this.element.toggleAttribute(`data-${this.identifier}-empty`, isEmpty);
432
433
  }
433
- /**
434
- * {@link #write}, then reports a moved value under the event `cause` selects:
435
- * `change` for the user's edit, `reconcile` for a move the page caused. The
436
- * display may hold an in-progress `-`, but a `null` value always rides with an
437
- * empty `formatted`, whichever event reports it, so consumers can treat the
438
- * pair as cleared.
439
- */
440
434
  #reflect(value, formatted, cause) {
441
435
  this.#write(value);
442
436
  if (value === this.#lastValue) return;
@@ -445,13 +439,6 @@ var CurrencyInputController = class extends Controller {
445
439
  if (cause === "edit") this.dispatch("change", { detail });
446
440
  else this.dispatch("reconcile", { detail });
447
441
  }
448
- /**
449
- * Scans arbitrary input text into its number-shaped parts and value. Keeps
450
- * digits, one leading sign, one decimal mark, and the fraction verbatim;
451
- * everything else (grouping, symbols, words) is dropped. An ASCII "." is only
452
- * a decimal mark where it is not the locale's grouping separator. Precision
453
- * plays no part here — rounding belongs to the blur-time format.
454
- */
455
442
  #scan(text) {
456
443
  let sign = "";
457
444
  let int = "";
@@ -471,32 +458,19 @@ var CurrencyInputController = class extends Controller {
471
458
  const value = Number(`${sign}${int}.${frac}`);
472
459
  return { parts, value: Number.isFinite(value) ? value : null };
473
460
  }
474
- /** Whether `ch` reads as this locale's decimal mark. */
475
461
  #isDecimalMark(ch) {
476
462
  return ch === this.#decimal || ch === "." && this.#group !== ".";
477
463
  }
478
- /**
479
- * Re-syncs field / srValue / hook without dispatching: from the display, or —
480
- * while it is composing, when its text is not committed yet — from the value
481
- * last committed.
482
- */
483
464
  #resync() {
484
465
  if (!this.hasDisplayTarget) return;
485
466
  const value = this.#composition.isComposing() ? this.#lastValue : this.#scan(this.displayTarget.value).value;
486
467
  this.#write(value);
487
468
  }
488
- /**
489
- * Validates the declared Values, falling back to each Value's default when a
490
- * declaration cannot be interpreted (a malformed locale or currency tag, a
491
- * precision outside `Intl`'s 0–100 integer range), and rebuilds the cached
492
- * formatters from the validated set.
493
- */
494
469
  #revalidate() {
495
470
  const resolved = resolveLocale(this.element, this.localeValue);
496
471
  const usable = intlFormatter(Intl.NumberFormat, resolved, {});
497
472
  this.#locale = usable === null ? FALLBACK_LOCALE : resolved;
498
- const precision = this.precisionValue;
499
- this.#precision = Number.isInteger(precision) && precision >= 0 && precision <= 100 ? precision : 2;
473
+ this.#precision = this.#safePrecision;
500
474
  this.#currency = "";
501
475
  if (this.currencyValue !== "") {
502
476
  const declaredCurrency = intlFormatter(Intl.NumberFormat, this.#locale, {
@@ -544,12 +518,6 @@ var CurrencyInputController = class extends Controller {
544
518
  if (digit !== String(i)) this.#digits.set(digit, String(i));
545
519
  }
546
520
  }
547
- /**
548
- * Maps the locale's own digits to ASCII, folds full-width forms (the digits,
549
- * signs, and marks an IME confirms as 0-9+-.,) through the shared
550
- * half-width mapping, and reads U+2212 MINUS SIGN as "-", which some locales'
551
- * formatted output uses for negatives.
552
- */
553
521
  #normalize(text) {
554
522
  let out = "";
555
523
  for (const ch of text) {
@@ -564,6 +532,15 @@ var CurrencyInputController = class extends Controller {
564
532
  }
565
533
  return out;
566
534
  }
535
+ get #safePrecision() {
536
+ return this.#numbers.read(
537
+ this,
538
+ "precision",
539
+ this.precisionValue,
540
+ _CurrencyInputController.values.precision.default,
541
+ _CurrencyInputController.valueConstraints.precision
542
+ );
543
+ }
567
544
  };
568
545
  function round(value, precision) {
569
546
  const factor = 10 ** Math.max(0, precision);
@@ -573,5 +550,4 @@ function round(value, precision) {
573
550
  }
574
551
 
575
552
  export { CurrencyInputController };
576
- //# sourceMappingURL=currency_input_controller.js.map
577
553
  //# sourceMappingURL=currency_input_controller.js.map