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
@@ -8,6 +8,9 @@ function isReservedArrowChord(event, allow = []) {
8
8
  if (!event.key.startsWith("Arrow")) return false;
9
9
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
10
10
  }
11
+ function hasModifierChord(event) {
12
+ return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
13
+ }
11
14
 
12
15
  var COMPOSITION_INPUT_TYPES = /* @__PURE__ */ new Set([
13
16
  "insertCompositionText",
@@ -15,63 +18,182 @@ var COMPOSITION_INPUT_TYPES = /* @__PURE__ */ new Set([
15
18
  "deleteCompositionText",
16
19
  "deleteByComposition"
17
20
  ]);
21
+ function isCompositionInputType(inputType) {
22
+ return inputType !== void 0 && COMPOSITION_INPUT_TYPES.has(inputType);
23
+ }
24
+ var BEFORE_MORPH_ATTRIBUTE = "turbo:before-morph-attribute";
25
+ var textOf = (element) => element.value;
26
+ var holdsFocus = (element) => element instanceof Node && element.getRootNode().activeElement === element;
18
27
  var CompositionTracker = class {
19
28
  #observedTargets = /* @__PURE__ */ new Set();
20
- #activeTargets = /* @__PURE__ */ new Set();
29
+ #composition = null;
21
30
  #onStart;
22
31
  #onEnd;
32
+ #onAbandon;
23
33
  #confirmedTarget = null;
34
+ #keyComposing = false;
35
+ #connected = false;
36
+ #abandoned = null;
24
37
  constructor(options = {}) {
25
38
  this.#onStart = options.onStart;
26
39
  this.#onEnd = options.onEnd;
40
+ this.#onAbandon = options.onAbandon;
27
41
  }
28
42
  observe(target) {
43
+ this.#connected = true;
29
44
  if (this.#observedTargets.has(target)) return;
30
45
  target.addEventListener("compositionstart", this.#handleStart);
31
46
  target.addEventListener("compositionend", this.#handleEnd);
32
- target.addEventListener("keydown", this.#handleKeydown);
47
+ target.addEventListener("keydown", this.#handleKeydown, true);
48
+ target.addEventListener("beforeinput", this.#handleBeforeInput, true);
49
+ target.addEventListener("input", this.#handleInput, true);
50
+ target.addEventListener("blur", this.#handleBlur, true);
51
+ target.addEventListener(BEFORE_MORPH_ATTRIBUTE, this.#handleBeforeMorphAttribute);
33
52
  this.#observedTargets.add(target);
34
53
  }
35
54
  unobserve(target) {
36
55
  if (!this.#observedTargets.delete(target)) return;
37
- target.removeEventListener("compositionstart", this.#handleStart);
38
- target.removeEventListener("compositionend", this.#handleEnd);
39
- target.removeEventListener("keydown", this.#handleKeydown);
40
- this.#activeTargets.delete(target);
56
+ this.#release(target);
57
+ if (this.#composition?.target === target) this.#letGo();
41
58
  if (this.#confirmedTarget === target) this.#confirmedTarget = null;
42
59
  }
43
60
  disconnect() {
44
- for (const target of this.#observedTargets) {
45
- target.removeEventListener("compositionstart", this.#handleStart);
46
- target.removeEventListener("compositionend", this.#handleEnd);
47
- target.removeEventListener("keydown", this.#handleKeydown);
48
- }
61
+ this.#connected = false;
62
+ for (const target of this.#observedTargets) this.#release(target);
49
63
  this.#observedTargets.clear();
50
- this.#activeTargets.clear();
64
+ this.#letGo();
51
65
  this.#confirmedTarget = null;
66
+ this.#keyComposing = false;
67
+ this.#abandoned = null;
52
68
  }
53
69
  isComposing(event) {
54
- return this.#activeTargets.size > 0 || event?.isComposing === true;
70
+ this.#settle();
71
+ return event?.isComposing === true || this.#composition !== null;
72
+ }
73
+ composingElement() {
74
+ this.#settle();
75
+ return this.#composition?.element ?? null;
76
+ }
77
+ owns(event) {
78
+ const element = this.composingElement();
79
+ return event.isComposing === true || element !== null && element === event.target;
55
80
  }
56
81
  consumesConfirmedInput(event) {
57
82
  const confirmed = this.#confirmedTarget;
58
83
  this.#confirmedTarget = null;
59
84
  if (confirmed === null || confirmed !== event.target) return false;
60
85
  const inputType = event.inputType;
61
- return !inputType || COMPOSITION_INPUT_TYPES.has(inputType);
86
+ return !inputType || isCompositionInputType(inputType);
87
+ }
88
+ #release(target) {
89
+ target.removeEventListener("compositionstart", this.#handleStart);
90
+ target.removeEventListener("compositionend", this.#handleEnd);
91
+ target.removeEventListener("keydown", this.#handleKeydown, true);
92
+ target.removeEventListener("beforeinput", this.#handleBeforeInput, true);
93
+ target.removeEventListener("input", this.#handleInput, true);
94
+ target.removeEventListener("blur", this.#handleBlur, true);
95
+ target.removeEventListener(BEFORE_MORPH_ATTRIBUTE, this.#handleBeforeMorphAttribute);
96
+ }
97
+ #letGo() {
98
+ const composition = this.#composition;
99
+ if (composition === null) return;
100
+ if (!holdsFocus(composition.element)) {
101
+ this.#composition = null;
102
+ return;
103
+ }
104
+ queueMicrotask(() => {
105
+ if (this.#composition !== composition || this.#observedTargets.has(composition.target)) {
106
+ return;
107
+ }
108
+ this.#composition = null;
109
+ if (!this.#connected) return;
110
+ this.#abandoned = { element: composition.element, inPlace: true };
111
+ this.#runAbandon();
112
+ });
113
+ }
114
+ #settle() {
115
+ const composition = this.#composition;
116
+ if (composition === null) return;
117
+ const { target, element, text } = composition;
118
+ if (target instanceof Node && element instanceof Node && !target.contains(element)) {
119
+ this.#composition = null;
120
+ } else if (textOf(element) !== text) {
121
+ this.#abandon(false);
122
+ }
123
+ }
124
+ #abandon(inPlace) {
125
+ this.#owe(inPlace);
126
+ this.#composition = null;
127
+ queueMicrotask(this.#runAbandon);
128
+ }
129
+ #owe(inPlace) {
130
+ const composition = this.#composition;
131
+ if (composition !== null) this.#abandoned = { element: composition.element, inPlace };
62
132
  }
133
+ #runAbandon = () => {
134
+ const abandoned = this.#abandoned;
135
+ if (abandoned === null) return;
136
+ this.#abandoned = null;
137
+ this.#onAbandon?.(abandoned.element, abandoned.inPlace);
138
+ };
63
139
  #handleStart = (event) => {
64
140
  this.#confirmedTarget = null;
65
- if (event.currentTarget) this.#activeTargets.add(event.currentTarget);
141
+ this.#settle();
142
+ this.#owe(true);
143
+ const target = event.currentTarget;
144
+ const element = event.target;
145
+ this.#composition = { target, element, text: textOf(element) };
146
+ this.#runAbandon();
66
147
  this.#onStart?.(event);
67
148
  };
68
149
  #handleEnd = (event) => {
69
- if (event.currentTarget) this.#activeTargets.delete(event.currentTarget);
150
+ this.#runAbandon();
151
+ if (this.#composition?.target === event.currentTarget) this.#composition = null;
70
152
  this.#confirmedTarget = event.target;
71
153
  this.#onEnd?.(event);
72
154
  };
73
- #handleKeydown = () => {
155
+ #handleKeydown = (event) => {
156
+ this.#settle();
157
+ this.#runAbandon();
74
158
  this.#confirmedTarget = null;
159
+ this.#keyComposing = event.isComposing === true;
160
+ };
161
+ #handleBeforeInput = (event) => {
162
+ const keyComposing = this.#keyComposing;
163
+ this.#keyComposing = false;
164
+ this.#settle();
165
+ const { isComposing, inputType } = event;
166
+ if (this.#composition !== null && !keyComposing && !isComposing && inputType && !isCompositionInputType(inputType)) {
167
+ this.#abandon(true);
168
+ }
169
+ this.#runAbandon();
170
+ };
171
+ #handleInput = (event) => {
172
+ const composition = this.#composition;
173
+ const { isTrusted, isComposing, inputType } = event;
174
+ if (composition !== null && event.target === composition.element && (isTrusted || isComposing || isCompositionInputType(inputType))) {
175
+ composition.text = textOf(composition.element);
176
+ } else {
177
+ this.#settle();
178
+ }
179
+ this.#runAbandon();
180
+ };
181
+ #handleBlur = (event) => {
182
+ this.#settle();
183
+ this.#runAbandon();
184
+ const composition = this.#composition;
185
+ if (composition === null || composition.target === composition.element) return;
186
+ const { element } = composition;
187
+ if (!(element instanceof Node) || event.target !== element) return;
188
+ const root = element.getRootNode();
189
+ if (root.activeElement !== element) this.#composition = null;
190
+ };
191
+ #handleBeforeMorphAttribute = (event) => {
192
+ this.#settle();
193
+ const composition = this.#composition;
194
+ if (composition?.target !== event.currentTarget || event.target !== composition.element) return;
195
+ const detail = event.detail;
196
+ if (detail?.attributeName === "value") event.preventDefault();
75
197
  };
76
198
  };
77
199
 
@@ -117,6 +239,9 @@ var MicrotaskCoalescer = class {
117
239
  this.#queued = false;
118
240
  this.#generation += 1;
119
241
  }
242
+ get pending() {
243
+ return this.#queued;
244
+ }
120
245
  schedule() {
121
246
  if (!this.#active || this.#queued) return;
122
247
  this.#queued = true;
@@ -147,6 +272,9 @@ var MorphRenderWatcher = class {
147
272
  schedule() {
148
273
  this.#pass.schedule();
149
274
  }
275
+ get pending() {
276
+ return this.#pass.pending;
277
+ }
150
278
  disconnect() {
151
279
  this.#listeners.dispose();
152
280
  this.#pass.cancel();
@@ -191,11 +319,12 @@ var ToolbarController = class extends Controller {
191
319
  #observer = null;
192
320
  #connected = false;
193
321
  #morph = new MorphRenderWatcher(() => this.#ensureTabStop());
322
+ #listeners = new ListenerSet();
194
323
  connect() {
195
324
  this.#morph.observe(this.element);
196
325
  this.#ensureTabStop();
197
- this.element.addEventListener("keydown", this.#onKeydown);
198
- this.element.addEventListener("focusin", this.#onFocusin);
326
+ this.#listeners.add(this.element, "keydown", this.#onKeydown);
327
+ this.#listeners.add(this.element, "focusin", this.#onFocusin);
199
328
  this.#composition.observe(this.element);
200
329
  if (typeof MutationObserver !== "undefined") {
201
330
  const observer = new MutationObserver(() => this.#morph.schedule());
@@ -215,8 +344,7 @@ var ToolbarController = class extends Controller {
215
344
  disconnect() {
216
345
  this.#morph.disconnect();
217
346
  this.#connected = false;
218
- this.element.removeEventListener("keydown", this.#onKeydown);
219
- this.element.removeEventListener("focusin", this.#onFocusin);
347
+ this.#listeners.dispose();
220
348
  this.#composition.disconnect();
221
349
  this.#observer?.disconnect();
222
350
  this.#observer = null;
@@ -245,6 +373,7 @@ var ToolbarController = class extends Controller {
245
373
  #handleKeydown(event) {
246
374
  if (event.defaultPrevented) return;
247
375
  if (isReservedArrowChord(event)) return;
376
+ if ((event.key === "Home" || event.key === "End") && hasModifierChord(event)) return;
248
377
  if (this.#composition.isComposing(event)) return;
249
378
  this.#ensureTabStop();
250
379
  const from = this.#indexOf(event.target);