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
@@ -4,17 +4,31 @@ function isReservedArrowChord(event, allow = []) {
4
4
  if (!event.key.startsWith("Arrow")) return false;
5
5
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
6
6
  }
7
+ function hasModifierChord(event) {
8
+ return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
9
+ }
10
+
11
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
12
+ if (element.getAttribute(name) === value) return false;
13
+ if (value === null) element.removeAttribute(name);
14
+ else element.setAttribute(name, value);
15
+ return true;
16
+ }
7
17
 
8
18
  function sharedRegistry(key, create) {
9
19
  const symbol = Symbol.for(key);
10
20
  const scope = globalThis;
11
21
  const existing = scope[symbol];
12
22
  if (existing !== void 0) return existing;
13
- const registry = create();
14
- Object.defineProperty(globalThis, symbol, { value: registry });
15
- return registry;
23
+ const registry2 = create();
24
+ Object.defineProperty(globalThis, symbol, { value: registry2 });
25
+ return registry2;
16
26
  }
17
27
 
28
+ var registry = sharedRegistry(
29
+ "stimeo-ui.attribute-lease.registry.v1",
30
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
31
+ );
18
32
  function isAttributeValue(value) {
19
33
  return value === null || typeof value === "string";
20
34
  }
@@ -31,24 +45,46 @@ function readLeaseRecord(element, record) {
31
45
  return void 0;
32
46
  }
33
47
  }
34
- var AttributeLease = class _AttributeLease {
35
- static #registry = sharedRegistry(
36
- "stimeo-ui.attribute-lease.registry.v1",
37
- () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
38
- );
48
+ function attributeStack(element, attribute) {
49
+ const byAttribute = registry.stacks.get(element) ?? /* @__PURE__ */ new Map();
50
+ registry.stacks.set(element, byAttribute);
51
+ const known = byAttribute.get(attribute);
52
+ if (known) return known;
53
+ const found = [];
54
+ for (const record of registry.names.get(attribute) ?? []) {
55
+ const read = readLeaseRecord(element, record);
56
+ if (read) found.push({ ...read, record });
57
+ }
58
+ const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
59
+ const stack = found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
60
+ lease: null,
61
+ record,
62
+ written,
63
+ original,
64
+ linked: linked && index > 0
65
+ }));
66
+ byAttribute.set(attribute, stack);
67
+ return stack;
68
+ }
69
+ function findHold(stack, lease, record) {
70
+ return stack.find((held) => held.lease === lease) ?? stack.find((held) => held.lease === null && held.record === record);
71
+ }
72
+ var AttributeLease = class {
39
73
  #attribute;
40
74
  #record;
41
75
  #base;
76
+ #preserveAuthor;
42
77
  #held = /* @__PURE__ */ new Set();
43
78
  constructor(attribute, owner, options = {}) {
44
79
  this.#attribute = attribute;
45
80
  this.#record = `data-${owner}-${attribute}-lease`;
46
81
  this.#base = options.base === true;
47
- const names = _AttributeLease.#registry.names;
82
+ this.#preserveAuthor = options.preserveAuthor === true;
83
+ const names = registry.names;
48
84
  names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
49
85
  }
50
86
  write(element, value) {
51
- const stack = this.#stack(element);
87
+ const stack = attributeStack(element, this.#attribute);
52
88
  const hold = this.#take(stack) ?? this.#acquire(element, stack);
53
89
  this.#held.add(element);
54
90
  const shows = !this.#covered(element, stack, hold);
@@ -58,8 +94,8 @@ var AttributeLease = class _AttributeLease {
58
94
  }
59
95
  return(element) {
60
96
  const held = this.#held.delete(element);
61
- const known = _AttributeLease.#registry.stacks.get(element)?.has(this.#attribute);
62
- const stack = held || known || element.hasAttribute(this.#record) ? this.#stack(element) : [];
97
+ const known = registry.stacks.get(element)?.has(this.#attribute);
98
+ const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
63
99
  const hold = this.#take(stack);
64
100
  if (!hold) return false;
65
101
  const carries = element.getAttribute(this.#attribute) === hold.written;
@@ -77,31 +113,8 @@ var AttributeLease = class _AttributeLease {
77
113
  returnAll() {
78
114
  for (const element of Array.from(this.#held)) this.return(element);
79
115
  }
80
- #stack(element) {
81
- const stacks = _AttributeLease.#registry.stacks;
82
- const byAttribute = stacks.get(element) ?? /* @__PURE__ */ new Map();
83
- stacks.set(element, byAttribute);
84
- const stack = byAttribute.get(this.#attribute) ?? this.#seed(element);
85
- byAttribute.set(this.#attribute, stack);
86
- return stack;
87
- }
88
- #seed(element) {
89
- const found = [];
90
- for (const record of _AttributeLease.#registry.names.get(this.#attribute) ?? []) {
91
- const read = readLeaseRecord(element, record);
92
- if (read) found.push({ ...read, record });
93
- }
94
- const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
95
- return found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
96
- lease: null,
97
- record,
98
- written,
99
- original,
100
- linked: linked && index > 0
101
- }));
102
- }
103
116
  #take(stack) {
104
- const hold = stack.find((held) => held.lease === this) ?? stack.find((held) => held.lease === null && held.record === this.#record);
117
+ const hold = findHold(stack, this, this.#record);
105
118
  if (hold) hold.lease = this;
106
119
  return hold;
107
120
  }
@@ -110,7 +123,7 @@ var AttributeLease = class _AttributeLease {
110
123
  const top = stack.at(-1);
111
124
  const bottom = stack[0];
112
125
  const over = top?.written === current ? top : void 0;
113
- const from = this.#base ? bottom : over;
126
+ const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
114
127
  const hold = {
115
128
  lease: this,
116
129
  record: this.#record,
@@ -140,15 +153,54 @@ var AttributeLease = class _AttributeLease {
140
153
  );
141
154
  });
142
155
  for (const [name, recorded] of records) {
143
- if (element.getAttribute(name) === recorded) continue;
144
- if (recorded === null) element.removeAttribute(name);
145
- else element.setAttribute(name, recorded);
156
+ setAttributeIfChanged(element, name, recorded);
146
157
  }
147
158
  }
148
159
  #reflect(element, value) {
149
- if (element.getAttribute(this.#attribute) === value) return;
150
- if (value === null) element.removeAttribute(this.#attribute);
151
- else element.setAttribute(this.#attribute, value);
160
+ setAttributeIfChanged(element, this.#attribute, value);
161
+ }
162
+ };
163
+
164
+ var BlurDeferral = class {
165
+ #pending = /* @__PURE__ */ new Map();
166
+ #onRelease;
167
+ constructor(onRelease) {
168
+ this.#onRelease = onRelease;
169
+ }
170
+ get size() {
171
+ return this.#pending.size;
172
+ }
173
+ get elements() {
174
+ return [...this.#pending.keys()];
175
+ }
176
+ has(element) {
177
+ return this.#pending.has(element);
178
+ }
179
+ defer(element) {
180
+ if (this.#pending.has(element)) return;
181
+ const onBlur = () => {
182
+ this.#detach(element);
183
+ this.#onRelease(element);
184
+ };
185
+ this.#pending.set(element, onBlur);
186
+ element.addEventListener("blur", onBlur);
187
+ }
188
+ deferOnly(element) {
189
+ for (const pending of this.elements) {
190
+ if (pending !== element) this.#detach(pending);
191
+ }
192
+ this.defer(element);
193
+ }
194
+ release(element) {
195
+ this.#detach(element);
196
+ }
197
+ releaseAll() {
198
+ for (const element of this.elements) this.#detach(element);
199
+ }
200
+ #detach(element) {
201
+ const onBlur = this.#pending.get(element);
202
+ if (onBlur) element.removeEventListener("blur", onBlur);
203
+ this.#pending.delete(element);
152
204
  }
153
205
  };
154
206
 
@@ -158,63 +210,182 @@ var COMPOSITION_INPUT_TYPES = /* @__PURE__ */ new Set([
158
210
  "deleteCompositionText",
159
211
  "deleteByComposition"
160
212
  ]);
213
+ function isCompositionInputType(inputType) {
214
+ return inputType !== void 0 && COMPOSITION_INPUT_TYPES.has(inputType);
215
+ }
216
+ var BEFORE_MORPH_ATTRIBUTE = "turbo:before-morph-attribute";
217
+ var textOf = (element) => element.value;
218
+ var holdsFocus = (element) => element instanceof Node && element.getRootNode().activeElement === element;
161
219
  var CompositionTracker = class {
162
220
  #observedTargets = /* @__PURE__ */ new Set();
163
- #activeTargets = /* @__PURE__ */ new Set();
221
+ #composition = null;
164
222
  #onStart;
165
223
  #onEnd;
224
+ #onAbandon;
166
225
  #confirmedTarget = null;
226
+ #keyComposing = false;
227
+ #connected = false;
228
+ #abandoned = null;
167
229
  constructor(options = {}) {
168
230
  this.#onStart = options.onStart;
169
231
  this.#onEnd = options.onEnd;
232
+ this.#onAbandon = options.onAbandon;
170
233
  }
171
234
  observe(target) {
235
+ this.#connected = true;
172
236
  if (this.#observedTargets.has(target)) return;
173
237
  target.addEventListener("compositionstart", this.#handleStart);
174
238
  target.addEventListener("compositionend", this.#handleEnd);
175
- target.addEventListener("keydown", this.#handleKeydown);
239
+ target.addEventListener("keydown", this.#handleKeydown, true);
240
+ target.addEventListener("beforeinput", this.#handleBeforeInput, true);
241
+ target.addEventListener("input", this.#handleInput, true);
242
+ target.addEventListener("blur", this.#handleBlur, true);
243
+ target.addEventListener(BEFORE_MORPH_ATTRIBUTE, this.#handleBeforeMorphAttribute);
176
244
  this.#observedTargets.add(target);
177
245
  }
178
246
  unobserve(target) {
179
247
  if (!this.#observedTargets.delete(target)) return;
180
- target.removeEventListener("compositionstart", this.#handleStart);
181
- target.removeEventListener("compositionend", this.#handleEnd);
182
- target.removeEventListener("keydown", this.#handleKeydown);
183
- this.#activeTargets.delete(target);
248
+ this.#release(target);
249
+ if (this.#composition?.target === target) this.#letGo();
184
250
  if (this.#confirmedTarget === target) this.#confirmedTarget = null;
185
251
  }
186
252
  disconnect() {
187
- for (const target of this.#observedTargets) {
188
- target.removeEventListener("compositionstart", this.#handleStart);
189
- target.removeEventListener("compositionend", this.#handleEnd);
190
- target.removeEventListener("keydown", this.#handleKeydown);
191
- }
253
+ this.#connected = false;
254
+ for (const target of this.#observedTargets) this.#release(target);
192
255
  this.#observedTargets.clear();
193
- this.#activeTargets.clear();
256
+ this.#letGo();
194
257
  this.#confirmedTarget = null;
258
+ this.#keyComposing = false;
259
+ this.#abandoned = null;
195
260
  }
196
261
  isComposing(event) {
197
- return this.#activeTargets.size > 0 || event?.isComposing === true;
262
+ this.#settle();
263
+ return event?.isComposing === true || this.#composition !== null;
264
+ }
265
+ composingElement() {
266
+ this.#settle();
267
+ return this.#composition?.element ?? null;
268
+ }
269
+ owns(event) {
270
+ const element = this.composingElement();
271
+ return event.isComposing === true || element !== null && element === event.target;
198
272
  }
199
273
  consumesConfirmedInput(event) {
200
274
  const confirmed = this.#confirmedTarget;
201
275
  this.#confirmedTarget = null;
202
276
  if (confirmed === null || confirmed !== event.target) return false;
203
277
  const inputType = event.inputType;
204
- return !inputType || COMPOSITION_INPUT_TYPES.has(inputType);
278
+ return !inputType || isCompositionInputType(inputType);
279
+ }
280
+ #release(target) {
281
+ target.removeEventListener("compositionstart", this.#handleStart);
282
+ target.removeEventListener("compositionend", this.#handleEnd);
283
+ target.removeEventListener("keydown", this.#handleKeydown, true);
284
+ target.removeEventListener("beforeinput", this.#handleBeforeInput, true);
285
+ target.removeEventListener("input", this.#handleInput, true);
286
+ target.removeEventListener("blur", this.#handleBlur, true);
287
+ target.removeEventListener(BEFORE_MORPH_ATTRIBUTE, this.#handleBeforeMorphAttribute);
288
+ }
289
+ #letGo() {
290
+ const composition = this.#composition;
291
+ if (composition === null) return;
292
+ if (!holdsFocus(composition.element)) {
293
+ this.#composition = null;
294
+ return;
295
+ }
296
+ queueMicrotask(() => {
297
+ if (this.#composition !== composition || this.#observedTargets.has(composition.target)) {
298
+ return;
299
+ }
300
+ this.#composition = null;
301
+ if (!this.#connected) return;
302
+ this.#abandoned = { element: composition.element, inPlace: true };
303
+ this.#runAbandon();
304
+ });
205
305
  }
306
+ #settle() {
307
+ const composition = this.#composition;
308
+ if (composition === null) return;
309
+ const { target, element, text } = composition;
310
+ if (target instanceof Node && element instanceof Node && !target.contains(element)) {
311
+ this.#composition = null;
312
+ } else if (textOf(element) !== text) {
313
+ this.#abandon(false);
314
+ }
315
+ }
316
+ #abandon(inPlace) {
317
+ this.#owe(inPlace);
318
+ this.#composition = null;
319
+ queueMicrotask(this.#runAbandon);
320
+ }
321
+ #owe(inPlace) {
322
+ const composition = this.#composition;
323
+ if (composition !== null) this.#abandoned = { element: composition.element, inPlace };
324
+ }
325
+ #runAbandon = () => {
326
+ const abandoned = this.#abandoned;
327
+ if (abandoned === null) return;
328
+ this.#abandoned = null;
329
+ this.#onAbandon?.(abandoned.element, abandoned.inPlace);
330
+ };
206
331
  #handleStart = (event) => {
207
332
  this.#confirmedTarget = null;
208
- if (event.currentTarget) this.#activeTargets.add(event.currentTarget);
333
+ this.#settle();
334
+ this.#owe(true);
335
+ const target = event.currentTarget;
336
+ const element = event.target;
337
+ this.#composition = { target, element, text: textOf(element) };
338
+ this.#runAbandon();
209
339
  this.#onStart?.(event);
210
340
  };
211
341
  #handleEnd = (event) => {
212
- if (event.currentTarget) this.#activeTargets.delete(event.currentTarget);
342
+ this.#runAbandon();
343
+ if (this.#composition?.target === event.currentTarget) this.#composition = null;
213
344
  this.#confirmedTarget = event.target;
214
345
  this.#onEnd?.(event);
215
346
  };
216
- #handleKeydown = () => {
347
+ #handleKeydown = (event) => {
348
+ this.#settle();
349
+ this.#runAbandon();
217
350
  this.#confirmedTarget = null;
351
+ this.#keyComposing = event.isComposing === true;
352
+ };
353
+ #handleBeforeInput = (event) => {
354
+ const keyComposing = this.#keyComposing;
355
+ this.#keyComposing = false;
356
+ this.#settle();
357
+ const { isComposing, inputType } = event;
358
+ if (this.#composition !== null && !keyComposing && !isComposing && inputType && !isCompositionInputType(inputType)) {
359
+ this.#abandon(true);
360
+ }
361
+ this.#runAbandon();
362
+ };
363
+ #handleInput = (event) => {
364
+ const composition = this.#composition;
365
+ const { isTrusted, isComposing, inputType } = event;
366
+ if (composition !== null && event.target === composition.element && (isTrusted || isComposing || isCompositionInputType(inputType))) {
367
+ composition.text = textOf(composition.element);
368
+ } else {
369
+ this.#settle();
370
+ }
371
+ this.#runAbandon();
372
+ };
373
+ #handleBlur = (event) => {
374
+ this.#settle();
375
+ this.#runAbandon();
376
+ const composition = this.#composition;
377
+ if (composition === null || composition.target === composition.element) return;
378
+ const { element } = composition;
379
+ if (!(element instanceof Node) || event.target !== element) return;
380
+ const root = element.getRootNode();
381
+ if (root.activeElement !== element) this.#composition = null;
382
+ };
383
+ #handleBeforeMorphAttribute = (event) => {
384
+ this.#settle();
385
+ const composition = this.#composition;
386
+ if (composition?.target !== event.currentTarget || event.target !== composition.element) return;
387
+ const detail = event.detail;
388
+ if (detail?.attributeName === "value") event.preventDefault();
218
389
  };
219
390
  };
220
391
 
@@ -262,6 +433,9 @@ var MicrotaskCoalescer = class {
262
433
  this.#queued = false;
263
434
  this.#generation += 1;
264
435
  }
436
+ get pending() {
437
+ return this.#queued;
438
+ }
265
439
  schedule() {
266
440
  if (!this.#active || this.#queued) return;
267
441
  this.#queued = true;
@@ -292,6 +466,9 @@ var MorphRenderWatcher = class {
292
466
  schedule() {
293
467
  this.#pass.schedule();
294
468
  }
469
+ get pending() {
470
+ return this.#pass.pending;
471
+ }
295
472
  disconnect() {
296
473
  this.#listeners.dispose();
297
474
  this.#pass.cancel();
@@ -510,6 +687,7 @@ function finiteFallback(min, max) {
510
687
  }
511
688
 
512
689
  var OWNED_DISABLED = "data-number-input-disabled";
690
+ var sameRange = (shown, declared) => shown?.min === declared.min && shown.max === declared.max && shown.step === declared.step;
513
691
  var NumberInputController = class _NumberInputController extends Controller {
514
692
  #numbers = new NumberValueReader();
515
693
  #moves = new MoveCounter();
@@ -532,11 +710,16 @@ var NumberInputController = class _NumberInputController extends Controller {
532
710
  static #HOLD_DELAY_MS = 400;
533
711
  static #HOLD_REPEAT_MS = 80;
534
712
  static #SUPPRESS_RESET_MS = 250;
535
- #globalGuards = null;
713
+ #listeners = new ListenerSet();
536
714
  #buttonGuards = /* @__PURE__ */ new Map();
537
715
  #composition = new CompositionTracker({
538
- onEnd: () => {
539
- if (this.#reconcileHeld) this.#repaint.schedule();
716
+ onEnd: (event) => {
717
+ if (this.hasInputTarget && event.target === this.inputTarget) {
718
+ this.#recordDraft(this.inputTarget);
719
+ }
720
+ },
721
+ onAbandon: () => {
722
+ if (this.#reconcileHeld) this.#reconcile();
540
723
  }
541
724
  });
542
725
  #reconcileHeld = false;
@@ -544,6 +727,13 @@ var NumberInputController = class _NumberInputController extends Controller {
544
727
  #ariaValueMin = new AttributeLease("aria-valuemin", this.identifier);
545
728
  #ariaValueMax = new AttributeLease("aria-valuemax", this.identifier);
546
729
  #lastValue = null;
730
+ #accepted = null;
731
+ #draft = null;
732
+ #parked = new BlurDeferral((input) => {
733
+ if (document.activeElement === input) this.#parked.defer(input);
734
+ else if (this.#draft?.input === input) this.#draft = null;
735
+ });
736
+ #shown = null;
547
737
  #connected = false;
548
738
  #holdTimeouts = new SafeTimeout();
549
739
  #holdIntervals = new SafeInterval();
@@ -556,13 +746,13 @@ var NumberInputController = class _NumberInputController extends Controller {
556
746
  #repaint = new MorphRenderWatcher(() => this.#reconcile());
557
747
  connect() {
558
748
  this.#repaint.observe(this.element);
559
- this.#globalGuards = new AbortController();
560
- const { signal } = this.#globalGuards;
561
749
  for (const button of this.incrementTargets) this.#wireButton(button, 1);
562
750
  for (const button of this.decrementTargets) this.#wireButton(button, -1);
563
- window.addEventListener("pointerup", this.#onPointerEnd, { signal });
564
- window.addEventListener("pointercancel", this.#onPointerEnd, { signal });
565
- window.addEventListener("blur", this.#onWindowBlur, { signal });
751
+ this.#listeners.add(window, "pointerup", this.#onPointerEnd);
752
+ this.#listeners.add(window, "pointercancel", this.#onPointerEnd);
753
+ this.#listeners.add(window, "blur", this.#onWindowBlur);
754
+ this.#listeners.add(this.element, "input", this.#onDraftInput);
755
+ this.#listeners.add(this.element, "turbo:before-morph-attribute", this.#onBeforeMorphAttribute);
566
756
  this.#reconcile();
567
757
  this.#connected = true;
568
758
  }
@@ -570,8 +760,9 @@ var NumberInputController = class _NumberInputController extends Controller {
570
760
  this.#connected = false;
571
761
  this.#repaint.disconnect();
572
762
  this.#composition.disconnect();
573
- this.#globalGuards?.abort();
574
- this.#globalGuards = null;
763
+ this.#listeners.dispose();
764
+ if (this.#draft?.input !== document.activeElement) this.#draft = null;
765
+ if (this.#draft !== null) this.#parked.deferOnly(this.#draft.input);
575
766
  const buttons = /* @__PURE__ */ new Set([
576
767
  ...this.#buttonGuards.keys(),
577
768
  ...this.incrementTargets,
@@ -602,7 +793,11 @@ var NumberInputController = class _NumberInputController extends Controller {
602
793
  this.#repaint.schedule();
603
794
  }
604
795
  inputTargetDisconnected(input) {
796
+ const composing = this.#composition.composingElement() === input;
605
797
  this.#composition.unobserve(input);
798
+ if (composing && this.#composition.composingElement() === input && this.inputTargets.includes(input)) {
799
+ return;
800
+ }
606
801
  this.#releaseInputAria(input);
607
802
  this.#stopHold(false);
608
803
  this.#repaint.schedule();
@@ -633,6 +828,25 @@ var NumberInputController = class _NumberInputController extends Controller {
633
828
  this.#commitStep(-1);
634
829
  this.inputTarget.focus();
635
830
  }
831
+ #onDraftInput = (event) => {
832
+ if (!this.hasInputTarget) return;
833
+ const input = this.inputTarget;
834
+ if (event.target !== input || document.activeElement !== input) return;
835
+ this.#recordDraft(input);
836
+ };
837
+ #recordDraft(input) {
838
+ this.#draft = this.#accepted?.input === input && input.value !== this.#accepted.text ? { input, text: input.value } : null;
839
+ if (this.#draft === null) this.#resumeHeldReconcile();
840
+ }
841
+ #onBeforeMorphAttribute = (event) => {
842
+ if (!this.hasInputTarget || event.target !== this.inputTarget) return;
843
+ const detail = event.detail;
844
+ if (detail?.attributeName === "value" && this.#isEditing(this.inputTarget))
845
+ event.preventDefault();
846
+ };
847
+ #isEditing(input) {
848
+ return this.#draft?.input === input && this.#accepted?.input === input && document.activeElement === input && input.value === this.#draft.text && input.value !== this.#accepted.text;
849
+ }
636
850
  onInput() {
637
851
  if (!this.hasInputTarget) return;
638
852
  if (this.inputTarget.value.trim() === "") {
@@ -646,6 +860,8 @@ var NumberInputController = class _NumberInputController extends Controller {
646
860
  if (!this.hasInputTarget) return;
647
861
  if (this.#composition.isComposing(event)) return;
648
862
  if (isReservedArrowChord(event)) return;
863
+ if ((event.key === "Home" || event.key === "End" || event.key === "PageUp" || event.key === "PageDown") && hasModifierChord(event))
864
+ return;
649
865
  let next = null;
650
866
  switch (event.key) {
651
867
  case "ArrowUp":
@@ -773,23 +989,40 @@ var NumberInputController = class _NumberInputController extends Controller {
773
989
  if (!this.hasInputTarget) return false;
774
990
  return this.#commit(stepSteppedValue(this.#currentValue(), count, this.#steppedRange), true);
775
991
  }
992
+ #resumeHeldReconcile() {
993
+ if (this.#reconcileHeld) this.#repaint.schedule();
994
+ }
776
995
  #reconcile() {
777
- if (!this.hasInputTarget) return;
778
- if (this.#composition.isComposing()) {
779
- this.#reconcileHeld = true;
996
+ if (!this.hasInputTarget) {
997
+ if (this.#draft?.input !== document.activeElement) this.#draft = null;
998
+ if (this.#draft !== null) this.#parked.deferOnly(this.#draft.input);
780
999
  return;
781
1000
  }
782
- this.#reconcileHeld = false;
1001
+ this.#parked.releaseAll();
783
1002
  const previous = this.#lastValue;
784
- if (this.inputTarget.value.trim() !== "") {
785
- const value = this.#normalize(this.#currentValue());
786
- this.#lastValue = value;
787
- const move = this.#move;
788
- this.#write(value);
789
- if (!this.#moves.isLatest(move)) return;
1003
+ const input = this.inputTarget;
1004
+ if (this.#composition.composingElement() === input || this.#isEditing(input)) {
1005
+ const shown = this.#shown?.input === input ? this.#shown : null;
1006
+ this.#reconcileHeld = shown === null || !sameRange(shown.range, this.#steppedRange);
1007
+ if (shown !== null) this.#show(shown.value, shown.at, shown.range);
790
1008
  } else {
791
- this.#lastValue = null;
792
- this.#reflectEmpty();
1009
+ this.#draft = null;
1010
+ this.#reconcileHeld = false;
1011
+ const shown = this.#shown;
1012
+ if (shown !== null && this.#accepted?.input === input && input.value === this.#accepted.text && sameRange(shown.range, this.#steppedRange)) {
1013
+ const move = this.#move;
1014
+ this.#show(shown.value, shown.at, shown.range);
1015
+ if (!this.#moves.isLatest(move)) return;
1016
+ } else if (input.value.trim() !== "") {
1017
+ const value = this.#normalize(this.#currentValue());
1018
+ this.#lastValue = value;
1019
+ const move = this.#move;
1020
+ this.#write(value, true);
1021
+ if (!this.#moves.isLatest(move)) return;
1022
+ } else {
1023
+ this.#lastValue = null;
1024
+ this.#reflectEmpty();
1025
+ }
793
1026
  }
794
1027
  this.#reportMove(previous);
795
1028
  }
@@ -798,38 +1031,55 @@ var NumberInputController = class _NumberInputController extends Controller {
798
1031
  if (!this.#connected || value === null || value === previous) return;
799
1032
  this.dispatch("reconcile", { detail: { value } });
800
1033
  }
801
- #write(value) {
1034
+ #write(value, keepCaret = false) {
802
1035
  const input = this.inputTarget;
803
- if (input.value !== String(value)) input.value = String(value);
804
- this.#syncInputAria(input, value);
805
- this.#updateButtons(value);
1036
+ const text = String(value);
1037
+ if (input.value !== text) {
1038
+ const caret = keepCaret && input === document.activeElement ? input.selectionStart : null;
1039
+ input.value = text;
1040
+ if (caret !== null) {
1041
+ const position = Math.min(caret, text.length);
1042
+ input.setSelectionRange(position, position);
1043
+ }
1044
+ }
1045
+ this.#draft = null;
1046
+ this.#reconcileHeld = false;
1047
+ this.#accepted = { input, text };
1048
+ this.#show(value, value);
1049
+ }
1050
+ #show(value, at, range = this.#steppedRange) {
1051
+ this.#shown = { input: this.inputTarget, value, at, range };
1052
+ this.#syncInputAria(this.inputTarget, value, range);
1053
+ this.#updateButtons(at, range);
806
1054
  }
807
1055
  #reflectEmpty() {
808
- this.#syncInputAria(this.inputTarget, null);
809
- this.#updateButtons(this.#currentValue());
1056
+ this.#draft = null;
1057
+ this.#reconcileHeld = false;
1058
+ this.#accepted = { input: this.inputTarget, text: this.inputTarget.value };
1059
+ this.#show(null, this.#currentValue());
810
1060
  }
811
- #syncInputAria(input, value) {
1061
+ #syncInputAria(input, value, range) {
812
1062
  if (input.getAttribute("role") !== "spinbutton") {
813
1063
  this.#releaseInputAria(input);
814
1064
  return;
815
1065
  }
816
1066
  this.#ariaValueNow.write(input, value === null ? null : String(value));
817
- this.#ariaValueMin.write(input, Number.isFinite(this.#safeMin) ? String(this.#safeMin) : null);
818
- this.#ariaValueMax.write(input, Number.isFinite(this.#safeMax) ? String(this.#safeMax) : null);
1067
+ this.#ariaValueMin.write(input, Number.isFinite(range.min) ? String(range.min) : null);
1068
+ this.#ariaValueMax.write(input, Number.isFinite(range.max) ? String(range.max) : null);
819
1069
  }
820
1070
  #releaseInputAria(input) {
821
1071
  this.#ariaValueNow.return(input);
822
1072
  this.#ariaValueMin.return(input);
823
1073
  this.#ariaValueMax.return(input);
824
1074
  }
825
- #updateButtons(value) {
1075
+ #updateButtons(value, range) {
826
1076
  const move = this.#move;
827
1077
  for (const button of this.incrementTargets) {
828
- this.#toggleButton(button, value < this.#safeMax, move);
1078
+ this.#toggleButton(button, value < range.max, move);
829
1079
  if (!this.#moves.isLatest(move)) return;
830
1080
  }
831
1081
  for (const button of this.decrementTargets) {
832
- this.#toggleButton(button, value > this.#safeMin, move);
1082
+ this.#toggleButton(button, value > range.min, move);
833
1083
  if (!this.#moves.isLatest(move)) return;
834
1084
  }
835
1085
  }