stimeo-ui 0.17.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 (297) hide show
  1. package/CHANGELOG.md +106 -1
  2. package/README.md +19 -10
  3. package/dist/cable/index.d.ts +9 -8
  4. package/dist/cable/index.js +22 -14
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/coerce-JtZVNG5h.d.ts +20 -0
  7. package/dist/controllers/accordion_controller.js +14 -6
  8. package/dist/controllers/accordion_controller.js.map +1 -1
  9. package/dist/controllers/alert_dialog_controller.js +145 -118
  10. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  11. package/dist/controllers/announcer_controller.d.ts +5 -3
  12. package/dist/controllers/announcer_controller.js +113 -17
  13. package/dist/controllers/announcer_controller.js.map +1 -1
  14. package/dist/controllers/auto_submit_controller.js +185 -60
  15. package/dist/controllers/auto_submit_controller.js.map +1 -1
  16. package/dist/controllers/avatar_controller.js +55 -43
  17. package/dist/controllers/avatar_controller.js.map +1 -1
  18. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  19. package/dist/controllers/bulk_select_controller.d.ts +3 -3
  20. package/dist/controllers/bulk_select_controller.js +64 -50
  21. package/dist/controllers/bulk_select_controller.js.map +1 -1
  22. package/dist/controllers/calendar_controller.d.ts +15 -12
  23. package/dist/controllers/calendar_controller.js +55 -53
  24. package/dist/controllers/calendar_controller.js.map +1 -1
  25. package/dist/controllers/carousel_controller.d.ts +9 -5
  26. package/dist/controllers/carousel_controller.js +124 -86
  27. package/dist/controllers/carousel_controller.js.map +1 -1
  28. package/dist/controllers/character_counter_controller.d.ts +27 -6
  29. package/dist/controllers/character_counter_controller.js +291 -95
  30. package/dist/controllers/character_counter_controller.js.map +1 -1
  31. package/dist/controllers/checkbox_controller.js +6 -0
  32. package/dist/controllers/checkbox_controller.js.map +1 -1
  33. package/dist/controllers/clipboard_controller.js +118 -27
  34. package/dist/controllers/clipboard_controller.js.map +1 -1
  35. package/dist/controllers/collapsible_controller.d.ts +1 -1
  36. package/dist/controllers/collapsible_controller.js +52 -49
  37. package/dist/controllers/collapsible_controller.js.map +1 -1
  38. package/dist/controllers/color_picker_controller.js +29 -7
  39. package/dist/controllers/color_picker_controller.js.map +1 -1
  40. package/dist/controllers/combobox_controller.d.ts +1 -1
  41. package/dist/controllers/combobox_controller.js +210 -71
  42. package/dist/controllers/combobox_controller.js.map +1 -1
  43. package/dist/controllers/command_palette_controller.d.ts +9 -9
  44. package/dist/controllers/command_palette_controller.js +289 -140
  45. package/dist/controllers/command_palette_controller.js.map +1 -1
  46. package/dist/controllers/conditional_fields_controller.js +145 -58
  47. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  48. package/dist/controllers/confirm_controller.js +145 -118
  49. package/dist/controllers/confirm_controller.js.map +1 -1
  50. package/dist/controllers/context_menu_controller.d.ts +49 -14
  51. package/dist/controllers/context_menu_controller.js +138 -73
  52. package/dist/controllers/context_menu_controller.js.map +1 -1
  53. package/dist/controllers/count_up_controller.js.map +1 -1
  54. package/dist/controllers/countdown_controller.d.ts +2 -2
  55. package/dist/controllers/countdown_controller.js +109 -21
  56. package/dist/controllers/countdown_controller.js.map +1 -1
  57. package/dist/controllers/currency_input_controller.d.ts +75 -11
  58. package/dist/controllers/currency_input_controller.js +446 -72
  59. package/dist/controllers/currency_input_controller.js.map +1 -1
  60. package/dist/controllers/data_grid_controller.d.ts +10 -8
  61. package/dist/controllers/data_grid_controller.js +134 -28
  62. package/dist/controllers/data_grid_controller.js.map +1 -1
  63. package/dist/controllers/date_range_picker_controller.d.ts +12 -9
  64. package/dist/controllers/date_range_picker_controller.js +93 -72
  65. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  66. package/dist/controllers/dialog_controller.d.ts +4 -5
  67. package/dist/controllers/dialog_controller.js +145 -118
  68. package/dist/controllers/dialog_controller.js.map +1 -1
  69. package/dist/controllers/direct_upload_controller.d.ts +1 -1
  70. package/dist/controllers/direct_upload_controller.js +24 -14
  71. package/dist/controllers/direct_upload_controller.js.map +1 -1
  72. package/dist/controllers/dirty_form_controller.d.ts +6 -1
  73. package/dist/controllers/dirty_form_controller.js +68 -31
  74. package/dist/controllers/dirty_form_controller.js.map +1 -1
  75. package/dist/controllers/dismissible_controller.js +64 -46
  76. package/dist/controllers/dismissible_controller.js.map +1 -1
  77. package/dist/controllers/drawer_controller.js +145 -118
  78. package/dist/controllers/drawer_controller.js.map +1 -1
  79. package/dist/controllers/dropdown_controller.js +76 -63
  80. package/dist/controllers/dropdown_controller.js.map +1 -1
  81. package/dist/controllers/editable_controller.js +199 -62
  82. package/dist/controllers/editable_controller.js.map +1 -1
  83. package/dist/controllers/empty_state_controller.js +13 -6
  84. package/dist/controllers/empty_state_controller.js.map +1 -1
  85. package/dist/controllers/file_dropzone_controller.d.ts +3 -0
  86. package/dist/controllers/file_dropzone_controller.js +55 -48
  87. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  88. package/dist/controllers/filter_controller.js +9 -2
  89. package/dist/controllers/filter_controller.js.map +1 -1
  90. package/dist/controllers/flash_controller.d.ts +4 -4
  91. package/dist/controllers/flash_controller.js +66 -33
  92. package/dist/controllers/flash_controller.js.map +1 -1
  93. package/dist/controllers/focus_controller.d.ts +3 -3
  94. package/dist/controllers/focus_controller.js +39 -14
  95. package/dist/controllers/focus_controller.js.map +1 -1
  96. package/dist/controllers/form_field_controller.js +52 -43
  97. package/dist/controllers/form_field_controller.js.map +1 -1
  98. package/dist/controllers/form_validation_controller.d.ts +3 -3
  99. package/dist/controllers/form_validation_controller.js +18 -11
  100. package/dist/controllers/form_validation_controller.js.map +1 -1
  101. package/dist/controllers/frame_loading_controller.d.ts +13 -12
  102. package/dist/controllers/frame_loading_controller.js +55 -48
  103. package/dist/controllers/frame_loading_controller.js.map +1 -1
  104. package/dist/controllers/highlight_controller.d.ts +5 -4
  105. package/dist/controllers/highlight_controller.js.map +1 -1
  106. package/dist/controllers/hover_card_controller.d.ts +4 -1
  107. package/dist/controllers/hover_card_controller.js +67 -61
  108. package/dist/controllers/hover_card_controller.js.map +1 -1
  109. package/dist/controllers/idle_controller.d.ts +6 -5
  110. package/dist/controllers/idle_controller.js +10 -6
  111. package/dist/controllers/idle_controller.js.map +1 -1
  112. package/dist/controllers/input_mask_controller.d.ts +30 -13
  113. package/dist/controllers/input_mask_controller.js +411 -24
  114. package/dist/controllers/input_mask_controller.js.map +1 -1
  115. package/dist/controllers/intersection_controller.js +3 -0
  116. package/dist/controllers/intersection_controller.js.map +1 -1
  117. package/dist/controllers/lazy_frame_controller.d.ts +3 -2
  118. package/dist/controllers/lazy_frame_controller.js +15 -3
  119. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  120. package/dist/controllers/listbox_controller.d.ts +10 -7
  121. package/dist/controllers/listbox_controller.js +260 -79
  122. package/dist/controllers/listbox_controller.js.map +1 -1
  123. package/dist/controllers/local_time_controller.d.ts +8 -6
  124. package/dist/controllers/local_time_controller.js +48 -13
  125. package/dist/controllers/local_time_controller.js.map +1 -1
  126. package/dist/controllers/masonry_controller.js +11 -4
  127. package/dist/controllers/masonry_controller.js.map +1 -1
  128. package/dist/controllers/menu_controller.d.ts +24 -5
  129. package/dist/controllers/menu_controller.js +138 -82
  130. package/dist/controllers/menu_controller.js.map +1 -1
  131. package/dist/controllers/menubar_controller.d.ts +49 -7
  132. package/dist/controllers/menubar_controller.js +65 -19
  133. package/dist/controllers/menubar_controller.js.map +1 -1
  134. package/dist/controllers/meter_controller.d.ts +13 -20
  135. package/dist/controllers/meter_controller.js +270 -24
  136. package/dist/controllers/meter_controller.js.map +1 -1
  137. package/dist/controllers/multi_select_controller.d.ts +17 -15
  138. package/dist/controllers/multi_select_controller.js +251 -94
  139. package/dist/controllers/multi_select_controller.js.map +1 -1
  140. package/dist/controllers/navigation_menu_controller.d.ts +19 -5
  141. package/dist/controllers/navigation_menu_controller.js +67 -19
  142. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  143. package/dist/controllers/nested_form_controller.js +98 -64
  144. package/dist/controllers/nested_form_controller.js.map +1 -1
  145. package/dist/controllers/network_status_controller.js +70 -52
  146. package/dist/controllers/network_status_controller.js.map +1 -1
  147. package/dist/controllers/number_input_controller.d.ts +24 -6
  148. package/dist/controllers/number_input_controller.js +344 -94
  149. package/dist/controllers/number_input_controller.js.map +1 -1
  150. package/dist/controllers/optimistic_controller.d.ts +8 -5
  151. package/dist/controllers/optimistic_controller.js +29 -11
  152. package/dist/controllers/optimistic_controller.js.map +1 -1
  153. package/dist/controllers/otp_controller.d.ts +35 -4
  154. package/dist/controllers/otp_controller.js +502 -104
  155. package/dist/controllers/otp_controller.js.map +1 -1
  156. package/dist/controllers/overflow_indicator_controller.js +6 -0
  157. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  158. package/dist/controllers/overflow_menu_controller.d.ts +10 -9
  159. package/dist/controllers/overflow_menu_controller.js +136 -21
  160. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  161. package/dist/controllers/pagination_controller.d.ts +3 -2
  162. package/dist/controllers/pagination_controller.js +47 -14
  163. package/dist/controllers/pagination_controller.js.map +1 -1
  164. package/dist/controllers/password_reveal_controller.d.ts +5 -4
  165. package/dist/controllers/password_reveal_controller.js +52 -49
  166. package/dist/controllers/password_reveal_controller.js.map +1 -1
  167. package/dist/controllers/password_strength_controller.d.ts +1 -1
  168. package/dist/controllers/password_strength_controller.js +13 -6
  169. package/dist/controllers/password_strength_controller.js.map +1 -1
  170. package/dist/controllers/persist_controller.js +48 -128
  171. package/dist/controllers/persist_controller.js.map +1 -1
  172. package/dist/controllers/pointer_drag_controller.d.ts +19 -8
  173. package/dist/controllers/pointer_drag_controller.js +249 -23
  174. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  175. package/dist/controllers/popover_controller.d.ts +3 -3
  176. package/dist/controllers/popover_controller.js +82 -65
  177. package/dist/controllers/popover_controller.js.map +1 -1
  178. package/dist/controllers/portal_controller.js +6 -0
  179. package/dist/controllers/portal_controller.js.map +1 -1
  180. package/dist/controllers/preview_guard_controller.js +14 -3
  181. package/dist/controllers/preview_guard_controller.js.map +1 -1
  182. package/dist/controllers/progress_controller.d.ts +9 -19
  183. package/dist/controllers/progress_controller.js +271 -27
  184. package/dist/controllers/progress_controller.js.map +1 -1
  185. package/dist/controllers/radio_group_controller.d.ts +11 -8
  186. package/dist/controllers/radio_group_controller.js +167 -80
  187. package/dist/controllers/radio_group_controller.js.map +1 -1
  188. package/dist/controllers/range_slider_controller.d.ts +4 -3
  189. package/dist/controllers/range_slider_controller.js +27 -7
  190. package/dist/controllers/range_slider_controller.js.map +1 -1
  191. package/dist/controllers/rating_controller.js +93 -57
  192. package/dist/controllers/rating_controller.js.map +1 -1
  193. package/dist/controllers/read_more_controller.js +10 -6
  194. package/dist/controllers/read_more_controller.js.map +1 -1
  195. package/dist/controllers/reading_progress_controller.js +22 -5
  196. package/dist/controllers/reading_progress_controller.js.map +1 -1
  197. package/dist/controllers/relative_time_controller.d.ts +4 -4
  198. package/dist/controllers/relative_time_controller.js +75 -11
  199. package/dist/controllers/relative_time_controller.js.map +1 -1
  200. package/dist/controllers/reset_on_restore_controller.d.ts +3 -3
  201. package/dist/controllers/reset_on_restore_controller.js +6 -0
  202. package/dist/controllers/reset_on_restore_controller.js.map +1 -1
  203. package/dist/controllers/resizable_controller.d.ts +3 -0
  204. package/dist/controllers/resizable_controller.js +55 -22
  205. package/dist/controllers/resizable_controller.js.map +1 -1
  206. package/dist/controllers/roving_controller.d.ts +3 -3
  207. package/dist/controllers/roving_controller.js +10 -4
  208. package/dist/controllers/roving_controller.js.map +1 -1
  209. package/dist/controllers/scroll_area_controller.js +129 -88
  210. package/dist/controllers/scroll_area_controller.js.map +1 -1
  211. package/dist/controllers/scroll_restore_controller.d.ts +3 -3
  212. package/dist/controllers/scroll_restore_controller.js +14 -2
  213. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  214. package/dist/controllers/scroll_visibility_controller.js +93 -60
  215. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  216. package/dist/controllers/scrollspy_controller.js +11 -5
  217. package/dist/controllers/scrollspy_controller.js.map +1 -1
  218. package/dist/controllers/separator_controller.d.ts +1 -1
  219. package/dist/controllers/separator_controller.js +59 -43
  220. package/dist/controllers/separator_controller.js.map +1 -1
  221. package/dist/controllers/sidebar_controller.d.ts +1 -1
  222. package/dist/controllers/sidebar_controller.js +150 -122
  223. package/dist/controllers/sidebar_controller.js.map +1 -1
  224. package/dist/controllers/skeleton_controller.js +55 -48
  225. package/dist/controllers/skeleton_controller.js.map +1 -1
  226. package/dist/controllers/slider_controller.d.ts +2 -1
  227. package/dist/controllers/slider_controller.js +27 -6
  228. package/dist/controllers/slider_controller.js.map +1 -1
  229. package/dist/controllers/smart_sticky_header_controller.d.ts +1 -1
  230. package/dist/controllers/smart_sticky_header_controller.js +13 -5
  231. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  232. package/dist/controllers/sortable_controller.d.ts +4 -4
  233. package/dist/controllers/sortable_controller.js +27 -14
  234. package/dist/controllers/sortable_controller.js.map +1 -1
  235. package/dist/controllers/spinner_controller.js +55 -48
  236. package/dist/controllers/spinner_controller.js.map +1 -1
  237. package/dist/controllers/step_indicator_controller.d.ts +4 -4
  238. package/dist/controllers/step_indicator_controller.js +6 -0
  239. package/dist/controllers/step_indicator_controller.js.map +1 -1
  240. package/dist/controllers/stepper_controller.d.ts +2 -3
  241. package/dist/controllers/stepper_controller.js +6 -0
  242. package/dist/controllers/stepper_controller.js.map +1 -1
  243. package/dist/controllers/stick_to_bottom_controller.d.ts +3 -1
  244. package/dist/controllers/stick_to_bottom_controller.js +19 -8
  245. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  246. package/dist/controllers/sticky_observer_controller.js +49 -43
  247. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  248. package/dist/controllers/submit_once_controller.d.ts +2 -1
  249. package/dist/controllers/submit_once_controller.js +145 -85
  250. package/dist/controllers/submit_once_controller.js.map +1 -1
  251. package/dist/controllers/switch_controller.d.ts +7 -4
  252. package/dist/controllers/switch_controller.js +172 -28
  253. package/dist/controllers/switch_controller.js.map +1 -1
  254. package/dist/controllers/tabs_controller.d.ts +7 -4
  255. package/dist/controllers/tabs_controller.js +6 -1
  256. package/dist/controllers/tabs_controller.js.map +1 -1
  257. package/dist/controllers/tags_input_controller.d.ts +4 -3
  258. package/dist/controllers/tags_input_controller.js +157 -28
  259. package/dist/controllers/tags_input_controller.js.map +1 -1
  260. package/dist/controllers/textarea_autosize_controller.d.ts +1 -1
  261. package/dist/controllers/textarea_autosize_controller.js +40 -19
  262. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  263. package/dist/controllers/theme_controller.d.ts +3 -2
  264. package/dist/controllers/theme_controller.js +10 -4
  265. package/dist/controllers/theme_controller.js.map +1 -1
  266. package/dist/controllers/time_picker_controller.d.ts +38 -5
  267. package/dist/controllers/time_picker_controller.js +192 -54
  268. package/dist/controllers/time_picker_controller.js.map +1 -1
  269. package/dist/controllers/toast_controller.d.ts +4 -5
  270. package/dist/controllers/toast_controller.js +58 -27
  271. package/dist/controllers/toast_controller.js.map +1 -1
  272. package/dist/controllers/toggle_group_controller.d.ts +2 -3
  273. package/dist/controllers/toggle_group_controller.js +158 -56
  274. package/dist/controllers/toggle_group_controller.js.map +1 -1
  275. package/dist/controllers/toolbar_controller.d.ts +8 -6
  276. package/dist/controllers/toolbar_controller.js +150 -21
  277. package/dist/controllers/toolbar_controller.js.map +1 -1
  278. package/dist/controllers/tooltip_controller.d.ts +4 -1
  279. package/dist/controllers/tooltip_controller.js.map +1 -1
  280. package/dist/controllers/transition_controller.js.map +1 -1
  281. package/dist/controllers/tree_view_controller.d.ts +1 -1
  282. package/dist/controllers/tree_view_controller.js +134 -25
  283. package/dist/controllers/tree_view_controller.js.map +1 -1
  284. package/dist/index.d.ts +2 -0
  285. package/dist/index.js +2451 -1312
  286. package/dist/index.js.map +1 -1
  287. package/dist/inspector/cli.d.ts +15 -11
  288. package/dist/inspector/cli.js +16 -3
  289. package/dist/inspector/cli.js.map +1 -1
  290. package/dist/inspector/cli_bin.js +53 -8
  291. package/dist/inspector/cli_bin.js.map +1 -1
  292. package/dist/inspector/examples.json +13 -13
  293. package/dist/inspector/manifest.json +19 -5
  294. package/dist/positioning/index.d.ts +7 -7
  295. package/dist/positioning/index.js +6 -0
  296. package/dist/positioning/index.js.map +1 -1
  297. package/package.json +10 -9
@@ -6,63 +6,182 @@ var COMPOSITION_INPUT_TYPES = /* @__PURE__ */ new Set([
6
6
  "deleteCompositionText",
7
7
  "deleteByComposition"
8
8
  ]);
9
+ function isCompositionInputType(inputType) {
10
+ return inputType !== void 0 && COMPOSITION_INPUT_TYPES.has(inputType);
11
+ }
12
+ var BEFORE_MORPH_ATTRIBUTE = "turbo:before-morph-attribute";
13
+ var textOf = (element) => element.value;
14
+ var holdsFocus = (element) => element instanceof Node && element.getRootNode().activeElement === element;
9
15
  var CompositionTracker = class {
10
16
  #observedTargets = /* @__PURE__ */ new Set();
11
- #activeTargets = /* @__PURE__ */ new Set();
17
+ #composition = null;
12
18
  #onStart;
13
19
  #onEnd;
20
+ #onAbandon;
14
21
  #confirmedTarget = null;
22
+ #keyComposing = false;
23
+ #connected = false;
24
+ #abandoned = null;
15
25
  constructor(options = {}) {
16
26
  this.#onStart = options.onStart;
17
27
  this.#onEnd = options.onEnd;
28
+ this.#onAbandon = options.onAbandon;
18
29
  }
19
30
  observe(target) {
31
+ this.#connected = true;
20
32
  if (this.#observedTargets.has(target)) return;
21
33
  target.addEventListener("compositionstart", this.#handleStart);
22
34
  target.addEventListener("compositionend", this.#handleEnd);
23
- target.addEventListener("keydown", this.#handleKeydown);
35
+ target.addEventListener("keydown", this.#handleKeydown, true);
36
+ target.addEventListener("beforeinput", this.#handleBeforeInput, true);
37
+ target.addEventListener("input", this.#handleInput, true);
38
+ target.addEventListener("blur", this.#handleBlur, true);
39
+ target.addEventListener(BEFORE_MORPH_ATTRIBUTE, this.#handleBeforeMorphAttribute);
24
40
  this.#observedTargets.add(target);
25
41
  }
26
42
  unobserve(target) {
27
43
  if (!this.#observedTargets.delete(target)) return;
28
- target.removeEventListener("compositionstart", this.#handleStart);
29
- target.removeEventListener("compositionend", this.#handleEnd);
30
- target.removeEventListener("keydown", this.#handleKeydown);
31
- this.#activeTargets.delete(target);
44
+ this.#release(target);
45
+ if (this.#composition?.target === target) this.#letGo();
32
46
  if (this.#confirmedTarget === target) this.#confirmedTarget = null;
33
47
  }
34
48
  disconnect() {
35
- for (const target of this.#observedTargets) {
36
- target.removeEventListener("compositionstart", this.#handleStart);
37
- target.removeEventListener("compositionend", this.#handleEnd);
38
- target.removeEventListener("keydown", this.#handleKeydown);
39
- }
49
+ this.#connected = false;
50
+ for (const target of this.#observedTargets) this.#release(target);
40
51
  this.#observedTargets.clear();
41
- this.#activeTargets.clear();
52
+ this.#letGo();
42
53
  this.#confirmedTarget = null;
54
+ this.#keyComposing = false;
55
+ this.#abandoned = null;
43
56
  }
44
57
  isComposing(event) {
45
- return this.#activeTargets.size > 0 || event?.isComposing === true;
58
+ this.#settle();
59
+ return event?.isComposing === true || this.#composition !== null;
60
+ }
61
+ composingElement() {
62
+ this.#settle();
63
+ return this.#composition?.element ?? null;
64
+ }
65
+ owns(event) {
66
+ const element = this.composingElement();
67
+ return event.isComposing === true || element !== null && element === event.target;
46
68
  }
47
69
  consumesConfirmedInput(event) {
48
70
  const confirmed = this.#confirmedTarget;
49
71
  this.#confirmedTarget = null;
50
72
  if (confirmed === null || confirmed !== event.target) return false;
51
73
  const inputType = event.inputType;
52
- return !inputType || COMPOSITION_INPUT_TYPES.has(inputType);
74
+ return !inputType || isCompositionInputType(inputType);
75
+ }
76
+ #release(target) {
77
+ target.removeEventListener("compositionstart", this.#handleStart);
78
+ target.removeEventListener("compositionend", this.#handleEnd);
79
+ target.removeEventListener("keydown", this.#handleKeydown, true);
80
+ target.removeEventListener("beforeinput", this.#handleBeforeInput, true);
81
+ target.removeEventListener("input", this.#handleInput, true);
82
+ target.removeEventListener("blur", this.#handleBlur, true);
83
+ target.removeEventListener(BEFORE_MORPH_ATTRIBUTE, this.#handleBeforeMorphAttribute);
84
+ }
85
+ #letGo() {
86
+ const composition = this.#composition;
87
+ if (composition === null) return;
88
+ if (!holdsFocus(composition.element)) {
89
+ this.#composition = null;
90
+ return;
91
+ }
92
+ queueMicrotask(() => {
93
+ if (this.#composition !== composition || this.#observedTargets.has(composition.target)) {
94
+ return;
95
+ }
96
+ this.#composition = null;
97
+ if (!this.#connected) return;
98
+ this.#abandoned = { element: composition.element, inPlace: true };
99
+ this.#runAbandon();
100
+ });
101
+ }
102
+ #settle() {
103
+ const composition = this.#composition;
104
+ if (composition === null) return;
105
+ const { target, element, text } = composition;
106
+ if (target instanceof Node && element instanceof Node && !target.contains(element)) {
107
+ this.#composition = null;
108
+ } else if (textOf(element) !== text) {
109
+ this.#abandon(false);
110
+ }
111
+ }
112
+ #abandon(inPlace) {
113
+ this.#owe(inPlace);
114
+ this.#composition = null;
115
+ queueMicrotask(this.#runAbandon);
53
116
  }
117
+ #owe(inPlace) {
118
+ const composition = this.#composition;
119
+ if (composition !== null) this.#abandoned = { element: composition.element, inPlace };
120
+ }
121
+ #runAbandon = () => {
122
+ const abandoned = this.#abandoned;
123
+ if (abandoned === null) return;
124
+ this.#abandoned = null;
125
+ this.#onAbandon?.(abandoned.element, abandoned.inPlace);
126
+ };
54
127
  #handleStart = (event) => {
55
128
  this.#confirmedTarget = null;
56
- if (event.currentTarget) this.#activeTargets.add(event.currentTarget);
129
+ this.#settle();
130
+ this.#owe(true);
131
+ const target = event.currentTarget;
132
+ const element = event.target;
133
+ this.#composition = { target, element, text: textOf(element) };
134
+ this.#runAbandon();
57
135
  this.#onStart?.(event);
58
136
  };
59
137
  #handleEnd = (event) => {
60
- if (event.currentTarget) this.#activeTargets.delete(event.currentTarget);
138
+ this.#runAbandon();
139
+ if (this.#composition?.target === event.currentTarget) this.#composition = null;
61
140
  this.#confirmedTarget = event.target;
62
141
  this.#onEnd?.(event);
63
142
  };
64
- #handleKeydown = () => {
143
+ #handleKeydown = (event) => {
144
+ this.#settle();
145
+ this.#runAbandon();
65
146
  this.#confirmedTarget = null;
147
+ this.#keyComposing = event.isComposing === true;
148
+ };
149
+ #handleBeforeInput = (event) => {
150
+ const keyComposing = this.#keyComposing;
151
+ this.#keyComposing = false;
152
+ this.#settle();
153
+ const { isComposing, inputType } = event;
154
+ if (this.#composition !== null && !keyComposing && !isComposing && inputType && !isCompositionInputType(inputType)) {
155
+ this.#abandon(true);
156
+ }
157
+ this.#runAbandon();
158
+ };
159
+ #handleInput = (event) => {
160
+ const composition = this.#composition;
161
+ const { isTrusted, isComposing, inputType } = event;
162
+ if (composition !== null && event.target === composition.element && (isTrusted || isComposing || isCompositionInputType(inputType))) {
163
+ composition.text = textOf(composition.element);
164
+ } else {
165
+ this.#settle();
166
+ }
167
+ this.#runAbandon();
168
+ };
169
+ #handleBlur = (event) => {
170
+ this.#settle();
171
+ this.#runAbandon();
172
+ const composition = this.#composition;
173
+ if (composition === null || composition.target === composition.element) return;
174
+ const { element } = composition;
175
+ if (!(element instanceof Node) || event.target !== element) return;
176
+ const root = element.getRootNode();
177
+ if (root.activeElement !== element) this.#composition = null;
178
+ };
179
+ #handleBeforeMorphAttribute = (event) => {
180
+ this.#settle();
181
+ const composition = this.#composition;
182
+ if (composition?.target !== event.currentTarget || event.target !== composition.element) return;
183
+ const detail = event.detail;
184
+ if (detail?.attributeName === "value") event.preventDefault();
66
185
  };
67
186
  };
68
187
 
@@ -103,10 +222,6 @@ function construct(factory, locale, options, fallbackLocale) {
103
222
  }
104
223
  }
105
224
 
106
- function resolveLocale(element, declared = "") {
107
- return declared || element.closest("[lang]")?.getAttribute("lang") || void 0;
108
- }
109
-
110
225
  var ListenerSet = class {
111
226
  #abort = new AbortController();
112
227
  add(target, type, handler, options) {
@@ -118,6 +233,10 @@ var ListenerSet = class {
118
233
  }
119
234
  };
120
235
 
236
+ function resolveLocale(element, declared = "") {
237
+ return declared || element.closest("[lang]")?.getAttribute("lang") || void 0;
238
+ }
239
+
121
240
  var MicrotaskCoalescer = class {
122
241
  #run;
123
242
  #queued = false;
@@ -134,6 +253,9 @@ var MicrotaskCoalescer = class {
134
253
  this.#queued = false;
135
254
  this.#generation += 1;
136
255
  }
256
+ get pending() {
257
+ return this.#queued;
258
+ }
137
259
  schedule() {
138
260
  if (!this.#active || this.#queued) return;
139
261
  this.#queued = true;
@@ -164,6 +286,9 @@ var MorphRenderWatcher = class {
164
286
  schedule() {
165
287
  this.#pass.schedule();
166
288
  }
289
+ get pending() {
290
+ return this.#pass.pending;
291
+ }
167
292
  disconnect() {
168
293
  this.#listeners.dispose();
169
294
  this.#pass.cancel();
@@ -213,6 +338,94 @@ var NumberValueReader = class {
213
338
  }
214
339
  };
215
340
 
341
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
342
+ if (element.getAttribute(name) === value) return false;
343
+ if (value === null) element.removeAttribute(name);
344
+ else element.setAttribute(name, value);
345
+ return true;
346
+ }
347
+
348
+ var OwnedText = class {
349
+ #attribute;
350
+ #channel;
351
+ #guard;
352
+ #writes = /* @__PURE__ */ new WeakMap();
353
+ constructor(attribute, channel = "text", guard = () => true) {
354
+ this.#attribute = attribute;
355
+ this.#channel = channel;
356
+ this.#guard = guard;
357
+ }
358
+ hasRecord(element) {
359
+ return element.hasAttribute(this.#attribute);
360
+ }
361
+ read(element, evidence = {}) {
362
+ if (evidence.source === "live") return this.#writes.get(element) ?? null;
363
+ const raw = element.getAttribute(this.#attribute);
364
+ if (raw === null) return null;
365
+ try {
366
+ const record = JSON.parse(raw);
367
+ if (!Array.isArray(record) || record.length !== 3 || record[0] !== this.#channel || typeof record[1] !== "string" || typeof record[2] !== "string")
368
+ return null;
369
+ return { original: record[1], written: record[2] };
370
+ } catch {
371
+ return null;
372
+ }
373
+ }
374
+ owns(element, evidence = {}) {
375
+ return this.#ownedRecord(element, evidence) !== null;
376
+ }
377
+ #ownedRecord(element, evidence) {
378
+ const record = this.read(element, evidence);
379
+ if (record === null || !this.#guard(element)) return null;
380
+ if (this.#channel === "text" && element.firstElementChild !== null) return null;
381
+ const current = this.#current(element);
382
+ return current === record.written || evidence.source === "live" && evidence.allowOriginal === true && current === record.original ? record : null;
383
+ }
384
+ write(element, written, original, force = false) {
385
+ const current = this.#current(element);
386
+ if (current === null) return;
387
+ const before = original ?? this.#writes.get(element)?.original ?? this.read(element)?.original ?? current;
388
+ if (force || current !== written) this.#put(element, written);
389
+ this.remember(element, written, before);
390
+ }
391
+ remember(element, written, original) {
392
+ const current = this.#current(element);
393
+ if (current === null) return;
394
+ const before = original ?? this.#writes.get(element)?.original ?? this.read(element)?.original ?? current;
395
+ this.#writes.set(element, { original: before, written });
396
+ setAttributeIfChanged(
397
+ element,
398
+ this.#attribute,
399
+ JSON.stringify([this.#channel, before, written])
400
+ );
401
+ }
402
+ clear(element, evidence = {}) {
403
+ if (!this.owns(element, evidence)) return false;
404
+ if (this.#current(element) !== "") this.#put(element, "");
405
+ this.forget(element);
406
+ return true;
407
+ }
408
+ restore(element, evidence = {}) {
409
+ const record = this.#ownedRecord(element, evidence);
410
+ if (record === null) return false;
411
+ if (this.#current(element) !== record.original) this.#put(element, record.original);
412
+ this.forget(element);
413
+ return true;
414
+ }
415
+ forget(element) {
416
+ setAttributeIfChanged(element, this.#attribute, null);
417
+ this.#writes.delete(element);
418
+ }
419
+ #current(element) {
420
+ if (this.#channel === "text") return element.textContent ?? "";
421
+ return element instanceof HTMLInputElement ? element.value : null;
422
+ }
423
+ #put(element, text) {
424
+ if (this.#channel === "text") element.textContent = text;
425
+ else if (element instanceof HTMLInputElement) element.value = text;
426
+ }
427
+ };
428
+
216
429
  var FALLBACK_LOCALE = "en-US";
217
430
  var CurrencyInputController = class _CurrencyInputController extends Controller {
218
431
  #numbers = new NumberValueReader();
@@ -229,9 +442,17 @@ var CurrencyInputController = class _CurrencyInputController extends Controller
229
442
  static events = ["change", "reconcile"];
230
443
  #lastValue = null;
231
444
  #started = false;
232
- #changeHeld = false;
233
- #composing = null;
234
- #rendered = null;
445
+ #unsettled = null;
446
+ #configured = false;
447
+ #listeners = new ListenerSet();
448
+ #declarationsHeld = false;
449
+ #displayText = new OwnedText(
450
+ `data-${this.identifier}-display-text`,
451
+ "value"
452
+ );
453
+ #renderedDisplay = null;
454
+ #departed = null;
455
+ #formatHeld = null;
235
456
  #locale;
236
457
  #currency = "";
237
458
  #precision = 2;
@@ -242,13 +463,32 @@ var CurrencyInputController = class _CurrencyInputController extends Controller
242
463
  #decimal = ".";
243
464
  #digits = /* @__PURE__ */ new Map();
244
465
  #composition = new CompositionTracker({
245
- onStart: (event) => {
246
- this.#composing = event.currentTarget;
466
+ onEnd: (event) => {
467
+ const display = event.currentTarget;
468
+ if (this.#unsettled === display) this.#unsettled = null;
469
+ const round2 = this.#takeFormatHeld(display);
470
+ if (this.#inCharge(display)) this.#reformat(round2, "edit");
471
+ if (this.#owed(display)) this.#applyValueChange();
472
+ if (round2 && !this.#inCharge(display)) this.#reformat(true, "edit");
247
473
  },
248
- onEnd: () => {
249
- this.#composing = null;
250
- this.#reformat(false, "edit");
251
- this.#applyHeldChange();
474
+ onAbandon: (display, inPlace) => {
475
+ const next = this.#composition.composingElement();
476
+ if (inPlace && next !== null && next !== display) {
477
+ this.#endUntrackedComposition(display);
478
+ } else {
479
+ this.#formatHeld = null;
480
+ }
481
+ if (next === display && inPlace || !this.#owed(display)) return;
482
+ if (next !== null) {
483
+ this.#readPageText(next);
484
+ return;
485
+ }
486
+ if (inPlace) this.#endUntrackedComposition(display);
487
+ if (this.#owed(display)) this.#applyValueChange();
488
+ },
489
+ onStart: (event) => {
490
+ if (this.#unsettled === event.target) this.#unsettled = null;
491
+ if (this.#formatHeld?.heard === false) this.#formatHeld = null;
252
492
  }
253
493
  });
254
494
  localeValueChanged() {
@@ -261,42 +501,56 @@ var CurrencyInputController = class _CurrencyInputController extends Controller
261
501
  this.#applyValueChange();
262
502
  }
263
503
  #applyValueChange() {
504
+ if (!this.#started) return;
505
+ if (this.#holdUnsettled(false)) return;
264
506
  if (this.#composition.isComposing()) {
265
- this.#changeHeld = true;
507
+ this.#declarationsHeld = this.#declarationsChanged();
508
+ this.#resync();
266
509
  return;
267
510
  }
268
- if (!this.#started || !this.hasDisplayTarget) return;
269
- const scan = this.#readDisplay();
511
+ if (!this.hasDisplayTarget) return;
512
+ const { scan, anchor } = this.#readDisplay();
270
513
  if (document.activeElement === this.displayTarget) {
271
514
  const formatted = this.#render(scan.parts);
272
- this.#show(formatted);
515
+ this.#showAtCaret(formatted, anchor);
273
516
  this.#reflect(scan.value, formatted, "reconcile");
274
517
  } else {
275
518
  this.#renderFixed(scan.value, "reconcile");
276
519
  }
277
520
  }
278
- #applyHeldChange() {
279
- if (!this.#changeHeld) return;
280
- this.#changeHeld = false;
281
- this.#applyValueChange();
282
- }
283
521
  #readDisplay() {
284
522
  const text = this.displayTarget.value;
285
- const own = text === this.#rendered ? this.#scan(text) : null;
286
- this.#takeInDeclarations();
287
- return own ?? this.#scan(text);
288
- }
289
- #takeInDeclarations() {
290
- this.#changeHeld = false;
523
+ const own = this.#showsOwnRendering(this.displayTarget) ? this.#read(text) : null;
291
524
  this.#revalidate();
525
+ return own ?? this.#read(text);
526
+ }
527
+ #showsOwnRendering(display) {
528
+ return display === this.#renderedDisplay && this.#displayText.owns(display, { source: "live" });
529
+ }
530
+ #inCharge(source) {
531
+ return source === null || this.hasDisplayTarget && source === this.displayTarget;
532
+ }
533
+ #read(text) {
534
+ return {
535
+ scan: this.#scan(text),
536
+ anchor: this.#significantBefore(text, this.displayTarget.selectionStart)
537
+ };
292
538
  }
293
539
  #morph = new MorphRenderWatcher(() => this.#applyValueChange());
294
540
  connect() {
295
541
  this.#morph.observe(this.element);
542
+ this.#listeners.add(this.element, "turbo:before-morph-attribute", this.#protectUnsettled);
296
543
  this.#started = true;
297
- this.#takeInDeclarations();
544
+ if (!this.#configured) this.#revalidate();
545
+ if (this.#composition.isComposing()) {
546
+ this.#applyValueChange();
547
+ return;
548
+ }
549
+ this.#formatHeld = null;
550
+ if (this.#holdUnsettled(true)) return;
551
+ this.#revalidate();
298
552
  if (!this.hasDisplayTarget) return;
299
- if (this.displayTarget.value === this.#rendered) {
553
+ if (this.#showsOwnRendering(this.displayTarget)) {
300
554
  this.#renderFixed(this.#lastValue, "reconcile");
301
555
  return;
302
556
  }
@@ -306,25 +560,37 @@ var CurrencyInputController = class _CurrencyInputController extends Controller
306
560
  }
307
561
  disconnect() {
308
562
  this.#morph.disconnect();
309
- this.#endUntrackedComposition();
563
+ this.#listeners.dispose();
564
+ const composing = this.#composition.composingElement();
310
565
  this.#composition.disconnect();
566
+ if (this.#composition.composingElement() !== composing) {
567
+ this.#endUntrackedComposition(composing);
568
+ }
311
569
  this.#started = false;
312
570
  }
313
571
  displayTargetConnected(target) {
314
572
  this.#composition.observe(target);
315
573
  if (!this.#started || !this.hasDisplayTarget || this.displayTarget !== target) return;
316
- this.#renderFixed(this.#readDisplay().value, "reconcile");
574
+ this.#applyValueChange();
317
575
  }
318
576
  displayTargetDisconnected(target) {
577
+ if (target === this.#renderedDisplay && !(this.#started && this.hasDisplayTarget && this.displayTarget === target)) {
578
+ this.#departed = target;
579
+ }
580
+ const composing = this.#composition.composingElement() === target;
319
581
  this.#composition.unobserve(target);
320
- if (target === this.#composing) this.#endUntrackedComposition();
582
+ if (composing && this.#composition.composingElement() !== target) {
583
+ this.#endUntrackedComposition(target);
584
+ }
585
+ if (this.#formatHeld?.display === target && this.#composition.composingElement() !== target) {
586
+ this.#formatHeld = null;
587
+ }
321
588
  this.#applyValueChange();
322
589
  }
323
- #endUntrackedComposition() {
324
- const display = this.#composing;
325
- this.#composing = null;
590
+ #endUntrackedComposition(display) {
591
+ const round2 = this.#takeFormatHeld(display);
326
592
  if (this.hasDisplayTarget && this.displayTarget === display) {
327
- this.#reformat(false, "reconcile");
593
+ this.#reformat(round2, "reconcile");
328
594
  }
329
595
  }
330
596
  fieldTargetConnected() {
@@ -340,14 +606,64 @@ var CurrencyInputController = class _CurrencyInputController extends Controller
340
606
  if (this.#started) this.#resync();
341
607
  }
342
608
  onInput(event) {
343
- if (this.#composition.isComposing(event)) return;
609
+ const source = event?.target ?? null;
610
+ if (!this.#inCharge(source)) return;
611
+ this.#holdUnsettled(false);
612
+ if (event && this.#composition.consumesConfirmedInput(event)) return;
613
+ const input = event;
614
+ if (this.#composition.isComposing(input) || isCompositionInputType(input?.inputType)) {
615
+ if (this.#composition.composingElement() === null && this.hasDisplayTarget) {
616
+ this.#beginUnsettled(this.displayTarget);
617
+ }
618
+ return;
619
+ }
620
+ const unsettled = this.#unsettled !== null;
621
+ if (unsettled) {
622
+ if (source !== this.#unsettled || input?.isComposing !== false || !input.inputType) return;
623
+ this.#unsettled = null;
624
+ this.#formatHeld = null;
625
+ }
344
626
  this.#reformat(false, "edit");
627
+ if (unsettled && this.#owed(source)) this.#applyValueChange();
628
+ }
629
+ format(event) {
630
+ if (!this.#inCharge(event?.target ?? null)) return;
631
+ const returned = this.hasDisplayTarget && this.displayTarget === this.#departed;
632
+ this.#holdUnsettled(false);
633
+ if (this.hasDisplayTarget && (this.displayTarget !== this.#renderedDisplay || returned && !this.#showsOwnRendering(this.displayTarget)) && (event?.type === "blur" || event?.type === "focusout") && this.#composition.composingElement() !== this.displayTarget) {
634
+ this.#beginUnsettled(this.displayTarget);
635
+ }
636
+ if (this.#unsettled !== null) {
637
+ this.#formatHeld = { display: this.#unsettled, heard: false };
638
+ return;
639
+ }
640
+ if (this.#composition.isComposing(event)) {
641
+ const composing = this.#composition.composingElement();
642
+ const display = composing ?? event?.target ?? (this.hasDisplayTarget ? this.displayTarget : null);
643
+ this.#formatHeld = display === null ? null : { display, heard: composing !== null };
644
+ if (composing === null && this.hasDisplayTarget && display === this.displayTarget) {
645
+ this.#beginUnsettled(this.displayTarget);
646
+ }
647
+ } else {
648
+ this.#formatHeld = null;
649
+ this.#reformat(true, "edit");
650
+ }
651
+ }
652
+ #takeFormatHeld(display) {
653
+ const held = this.#formatHeld;
654
+ this.#formatHeld = null;
655
+ return held !== null && held.display === display;
345
656
  }
346
- format() {
347
- this.#reformat(true, "edit");
657
+ #readPageText(composing) {
658
+ if (this.#unsettled !== null || !this.#inCharge(composing) || this.#showsOwnRendering(this.displayTarget))
659
+ return;
660
+ const { scan } = this.#readDisplay();
661
+ this.#displayText.remember(this.displayTarget, this.displayTarget.value);
662
+ this.#renderedDisplay = this.displayTarget;
663
+ this.#reflect(scan.value, this.#render(scan.parts), "reconcile");
348
664
  }
349
665
  #reformat(fixedPrecision, cause) {
350
- if (!this.hasDisplayTarget) return;
666
+ if (!this.hasDisplayTarget || this.#unsettled === this.displayTarget) return;
351
667
  const raw = this.displayTarget.value;
352
668
  const { parts, value } = this.#scan(raw);
353
669
  if (fixedPrecision) {
@@ -355,14 +671,16 @@ var CurrencyInputController = class _CurrencyInputController extends Controller
355
671
  return;
356
672
  }
357
673
  const formatted = this.#render(parts);
358
- if (formatted !== raw) {
359
- const caret = this.displayTarget.selectionStart;
360
- const anchor = caret === null ? null : this.#significantBefore(raw, caret);
674
+ this.#showAtCaret(formatted, this.#significantBefore(raw, this.displayTarget.selectionStart));
675
+ this.#reflect(value, formatted, cause);
676
+ }
677
+ #showAtCaret(formatted, anchor) {
678
+ if (formatted !== this.displayTarget.value) {
361
679
  this.displayTarget.value = formatted;
362
680
  if (anchor !== null) this.#restoreCaret(formatted, anchor);
363
681
  }
364
- this.#rendered = formatted;
365
- this.#reflect(value, formatted, cause);
682
+ this.#displayText.remember(this.displayTarget, formatted);
683
+ this.#renderedDisplay = this.displayTarget;
366
684
  }
367
685
  #renderFixed(value, cause) {
368
686
  if (value === null) {
@@ -376,8 +694,8 @@ var CurrencyInputController = class _CurrencyInputController extends Controller
376
694
  this.#reflect(rounded, formatted, cause);
377
695
  }
378
696
  #show(text) {
379
- if (this.displayTarget.value !== text) this.displayTarget.value = text;
380
- this.#rendered = text;
697
+ this.#displayText.write(this.displayTarget, text);
698
+ this.#renderedDisplay = this.displayTarget;
381
699
  }
382
700
  #render(parts) {
383
701
  const int = parts.int === "" ? "" : this.#grouping.format(BigInt(parts.int));
@@ -400,6 +718,7 @@ var CurrencyInputController = class _CurrencyInputController extends Controller
400
718
  }
401
719
  }
402
720
  #significantBefore(text, caret) {
721
+ if (caret === null) return null;
403
722
  let count = 0;
404
723
  let sawSign = false;
405
724
  let sawDigit = false;
@@ -463,22 +782,77 @@ var CurrencyInputController = class _CurrencyInputController extends Controller
463
782
  }
464
783
  #resync() {
465
784
  if (!this.hasDisplayTarget) return;
466
- const value = this.#composition.isComposing() ? this.#lastValue : this.#scan(this.displayTarget.value).value;
785
+ const unsettled = this.#trackUnsettled(false);
786
+ if (this.#renderedDisplay === null) return;
787
+ const value = unsettled || this.#composition.isComposing() ? this.#lastValue : this.#scan(this.displayTarget.value).value;
467
788
  this.#write(value);
468
789
  }
469
- #revalidate() {
790
+ #holdUnsettled(arriving) {
791
+ if (!this.#trackUnsettled(arriving)) return false;
792
+ this.#declarationsHeld = this.#declarationsChanged();
793
+ this.#resync();
794
+ return true;
795
+ }
796
+ #trackUnsettled(arriving) {
797
+ this.#forgetUnsettledOwner();
798
+ if (!this.hasDisplayTarget) return false;
799
+ const display = this.displayTarget;
800
+ const returned = display === this.#departed;
801
+ if (returned) this.#departed = null;
802
+ if (this.#unsettled === null && document.activeElement === display && (arriving || display !== this.#renderedDisplay || returned && !this.#showsOwnRendering(display)) && this.#composition.composingElement() !== display) {
803
+ this.#beginUnsettled(display);
804
+ }
805
+ return this.#unsettled !== null;
806
+ }
807
+ #beginUnsettled(display) {
808
+ if (this.#unsettled === null && this.#renderedDisplay === null && this.#declarationsChanged()) {
809
+ this.#revalidate();
810
+ }
811
+ this.#unsettled = display;
812
+ }
813
+ #forgetUnsettledOwner() {
814
+ if (this.#unsettled !== null && this.hasDisplayTarget && this.#unsettled !== this.displayTarget) {
815
+ if (this.#formatHeld?.display === this.#unsettled) this.#formatHeld = null;
816
+ this.#unsettled = null;
817
+ }
818
+ }
819
+ #protectUnsettled = (event) => {
820
+ this.#holdUnsettled(false);
821
+ if (this.#unsettled === null || event.target !== this.#unsettled) return;
822
+ const detail = event.detail;
823
+ if (detail?.attributeName === "value") event.preventDefault();
824
+ };
825
+ #declared() {
470
826
  const resolved = resolveLocale(this.element, this.localeValue);
471
827
  const usable = intlFormatter(Intl.NumberFormat, resolved, {});
472
- this.#locale = usable === null ? FALLBACK_LOCALE : resolved;
473
- this.#precision = this.#safePrecision;
474
- this.#currency = "";
828
+ const locale = usable === null ? FALLBACK_LOCALE : resolved;
829
+ let currency = "";
475
830
  if (this.currencyValue !== "") {
476
- const declaredCurrency = intlFormatter(Intl.NumberFormat, this.#locale, {
831
+ const declaredCurrency = intlFormatter(Intl.NumberFormat, locale, {
477
832
  style: "currency",
478
833
  currency: this.currencyValue
479
834
  });
480
- if (declaredCurrency !== null) this.#currency = this.currencyValue;
835
+ if (declaredCurrency !== null) currency = this.currencyValue;
481
836
  }
837
+ return { locale, currency, precision: this.#safePrecision };
838
+ }
839
+ #owed(composed) {
840
+ if (this.#declarationsHeld) return true;
841
+ if (!this.hasDisplayTarget) return false;
842
+ const display = this.displayTarget;
843
+ return display !== this.#renderedDisplay || display !== composed && !this.#showsOwnRendering(display);
844
+ }
845
+ #declarationsChanged() {
846
+ const { locale, currency, precision } = this.#declared();
847
+ return locale !== this.#locale || currency !== this.#currency || precision !== this.#precision;
848
+ }
849
+ #revalidate() {
850
+ this.#configured = true;
851
+ this.#declarationsHeld = false;
852
+ const declared = this.#declared();
853
+ this.#locale = declared.locale;
854
+ this.#currency = declared.currency;
855
+ this.#precision = declared.precision;
482
856
  this.#grouping = intlFormatter(
483
857
  Intl.NumberFormat,
484
858
  this.#locale,