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
@@ -13,6 +13,107 @@ function isReservedArrowChord(event, allow = []) {
13
13
  if (!event.key.startsWith("Arrow")) return false;
14
14
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
15
15
  }
16
+ function hasModifierChord(event) {
17
+ return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
18
+ }
19
+
20
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
21
+ if (element.getAttribute(name) === value) return false;
22
+ beforeWrite?.();
23
+ if (value === null) element.removeAttribute(name);
24
+ else element.setAttribute(name, value);
25
+ return true;
26
+ }
27
+
28
+ var AuthoredMutationWatcher = class {
29
+ #onAuthored;
30
+ #claims = null;
31
+ #observer = null;
32
+ constructor(onAuthored) {
33
+ this.#onAuthored = onAuthored;
34
+ }
35
+ observe(root, options) {
36
+ this.disconnect();
37
+ const observer = new MutationObserver((records) => {
38
+ if (this.#observer !== observer) return;
39
+ const authored = this.#filter(records);
40
+ if (authored.length > 0) this.#onAuthored(authored);
41
+ });
42
+ this.#observer = observer;
43
+ this.#claims = { attributes: /* @__PURE__ */ new Map(), children: /* @__PURE__ */ new Map() };
44
+ observer.observe(root, {
45
+ attributes: true,
46
+ attributeFilter: [...options.attributes],
47
+ subtree: options.subtree ?? false,
48
+ childList: options.childList ?? false
49
+ });
50
+ if (options.ancestorAttributes) {
51
+ let ancestor = root.parentElement;
52
+ while (ancestor) {
53
+ observer.observe(ancestor, {
54
+ attributes: true,
55
+ attributeFilter: [...options.ancestorAttributes]
56
+ });
57
+ ancestor = ancestor.parentElement;
58
+ }
59
+ }
60
+ }
61
+ claim(target, name, value) {
62
+ const claims = this.#claims?.attributes;
63
+ let attributes = claims?.get(target);
64
+ if (!attributes) {
65
+ attributes = /* @__PURE__ */ new Map();
66
+ claims?.set(target, attributes);
67
+ }
68
+ const pending = attributes.get(name);
69
+ attributes.set(name, { value, count: (pending?.count ?? 0) + 1 });
70
+ }
71
+ claimCurrent(target, name) {
72
+ this.claim(target, name, target.getAttribute(name));
73
+ }
74
+ claimChildList(target, added, removed) {
75
+ const claims = this.#claims?.children;
76
+ const pending = claims?.get(target) ?? { added: /* @__PURE__ */ new Map(), removed: /* @__PURE__ */ new Map() };
77
+ for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) + 1);
78
+ for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) + 1);
79
+ claims?.set(target, pending);
80
+ }
81
+ take() {
82
+ return this.#filter(this.#observer?.takeRecords() ?? []);
83
+ }
84
+ disconnect() {
85
+ this.#observer?.disconnect();
86
+ this.#observer = null;
87
+ this.#claims = null;
88
+ }
89
+ #filter(records) {
90
+ const authored = records.filter((record) => !this.#consume(record));
91
+ this.#claims?.attributes.clear();
92
+ this.#claims?.children.clear();
93
+ return authored;
94
+ }
95
+ #consume(record) {
96
+ if (record.type === "attributes") {
97
+ const target = record.target;
98
+ const pending2 = this.#claims?.attributes.get(target)?.get(record.attributeName);
99
+ if (!pending2 || pending2.count === 0 || target.getAttribute(record.attributeName) !== pending2.value) {
100
+ return false;
101
+ }
102
+ pending2.count -= 1;
103
+ return true;
104
+ }
105
+ const pending = this.#claims?.children.get(record.target);
106
+ if (!pending) return false;
107
+ const added = [...record.addedNodes];
108
+ const removed = [...record.removedNodes];
109
+ if (added.some((node) => !pending.added.get(node)) || removed.some((node) => !pending.removed.get(node))) {
110
+ return false;
111
+ }
112
+ for (const node of added) pending.added.set(node, (pending.added.get(node) ?? 0) - 1);
113
+ for (const node of removed) pending.removed.set(node, (pending.removed.get(node) ?? 0) - 1);
114
+ return true;
115
+ }
116
+ };
16
117
 
17
118
  function writeField(field, value) {
18
119
  if (field.value === value) return false;
@@ -50,6 +151,9 @@ var MicrotaskCoalescer = class {
50
151
  this.#queued = false;
51
152
  this.#generation += 1;
52
153
  }
154
+ get pending() {
155
+ return this.#queued;
156
+ }
53
157
  schedule() {
54
158
  if (!this.#active || this.#queued) return;
55
159
  this.#queued = true;
@@ -80,6 +184,9 @@ var MorphRenderWatcher = class {
80
184
  schedule() {
81
185
  this.#pass.schedule();
82
186
  }
187
+ get pending() {
188
+ return this.#pass.pending;
189
+ }
83
190
  disconnect() {
84
191
  this.#listeners.dispose();
85
192
  this.#pass.cancel();
@@ -151,17 +258,20 @@ var PM = 1;
151
258
  var SECONDS_PER_MINUTE = 60;
152
259
  var SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;
153
260
  var SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
154
- var hasModifier = (event) => event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
155
261
  var TimePickerController = class _TimePickerController extends Controller {
156
262
  #numbers = new NumberValueReader();
157
263
  #moves = new MoveCounter();
264
+ #connectionGeneration = 0;
158
265
  #move = 0;
159
266
  static targets = ["segment", "field"];
160
267
  static values = {
161
268
  hourCycle: { type: Number, default: 24 },
269
+ hour12ZeroBased: { type: Boolean, default: false },
162
270
  step: { type: Number, default: 1 },
163
271
  seconds: { type: Boolean, default: false },
164
- wrap: { type: Boolean, default: true }
272
+ wrap: { type: Boolean, default: true },
273
+ amLabel: { type: String, default: "AM" },
274
+ pmLabel: { type: String, default: "PM" }
165
275
  };
166
276
  static valueConstraints = {
167
277
  hourCycle: { finite: true, allowedValues: [12, 24] },
@@ -174,39 +284,56 @@ var TimePickerController = class _TimePickerController extends Controller {
174
284
  #typeBuffer = "";
175
285
  #typeSegment = null;
176
286
  #lastValue = "";
177
- #observer = null;
178
- #connected = false;
287
+ #renderedHourMode = null;
288
+ #renderedSegments = /* @__PURE__ */ new WeakSet();
289
+ #authoredSegments = /* @__PURE__ */ new Set();
290
+ #observer = new AuthoredMutationWatcher((records) => {
291
+ if (!this.#recordAuthoredSegments(records)) return;
292
+ this.#reconcile.schedule();
293
+ });
179
294
  #domDirty = false;
295
+ #listeners = new ListenerSet();
180
296
  connect() {
181
- this.#connected = true;
182
297
  this.#reconcile.observe(this.element);
183
- this.element.addEventListener("focusout", this.#onFocusOut);
298
+ this.#listeners.add(this.element, "focusout", this.#onFocusOut);
184
299
  this.#domDirty = false;
185
300
  this.#adoptDomState();
186
301
  this.#render();
187
302
  this.#observeMutations();
188
303
  }
189
304
  disconnect() {
190
- this.#connected = false;
305
+ this.#connectionGeneration += 1;
191
306
  this.#reconcile.disconnect();
192
- this.element.removeEventListener("focusout", this.#onFocusOut);
193
- this.#observer?.disconnect();
194
- this.#observer = null;
307
+ this.#listeners.dispose();
308
+ this.#observer.disconnect();
195
309
  this.#domDirty = false;
310
+ this.#renderedHourMode = null;
311
+ this.#renderedSegments = /* @__PURE__ */ new WeakSet();
312
+ this.#authoredSegments.clear();
196
313
  this.#clearTypeBuffer();
197
314
  this.#lastValue = "";
198
315
  }
199
316
  hourCycleValueChanged() {
200
317
  this.#reconcile.schedule();
201
318
  }
319
+ hour12ZeroBasedValueChanged() {
320
+ this.#reconcile.schedule();
321
+ }
202
322
  secondsValueChanged() {
203
323
  this.#reconcile.schedule();
204
324
  }
325
+ amLabelValueChanged() {
326
+ this.#reconcile.schedule();
327
+ }
328
+ pmLabelValueChanged() {
329
+ this.#reconcile.schedule();
330
+ }
205
331
  segmentTargetConnected() {
206
332
  this.#domDirty = true;
207
333
  this.#reconcile.schedule();
208
334
  }
209
- segmentTargetDisconnected() {
335
+ segmentTargetDisconnected(segment) {
336
+ if (segment && !this.segmentTargets.includes(segment)) this.#renderedSegments.delete(segment);
210
337
  this.#domDirty = true;
211
338
  this.#reconcile.schedule();
212
339
  }
@@ -225,8 +352,9 @@ var TimePickerController = class _TimePickerController extends Controller {
225
352
  const kind = this.#kindOf(segment);
226
353
  if (!kind) return;
227
354
  const key = logicalArrowKey(event.key, this.element);
228
- if ((key === "Home" || key === "End") && hasModifier(event)) return;
355
+ if ((key === "Home" || key === "End") && hasModifierChord(event)) return;
229
356
  if (this.#adoptPendingDom()) this.#reconcile.schedule();
357
+ if (this.#renderedHourMode !== this.#hourMode) this.#clearTypeBuffer();
230
358
  switch (key) {
231
359
  case "ArrowUp":
232
360
  event.preventDefault();
@@ -255,7 +383,7 @@ var TimePickerController = class _TimePickerController extends Controller {
255
383
  this.#commitRender();
256
384
  break;
257
385
  default:
258
- if (kind !== "meridiem" && /^[0-9]$/.test(event.key) && !hasModifier(event)) {
386
+ if (kind !== "meridiem" && /^[0-9]$/.test(event.key) && !event.ctrlKey && !event.altKey && !event.metaKey) {
259
387
  event.preventDefault();
260
388
  this.#typeDigit(segment, kind, event.key);
261
389
  return;
@@ -298,7 +426,7 @@ var TimePickerController = class _TimePickerController extends Controller {
298
426
  const candidate = Number(`${this.#typeBuffer}${digit}`);
299
427
  this.#typeBuffer = candidate <= max ? `${this.#typeBuffer}${digit}` : digit;
300
428
  this.#setDisplayed(kind, Number(this.#typeBuffer));
301
- this.#commitRender();
429
+ this.#commitRender(true);
302
430
  if (this.#typeBuffer.length >= 2 || Number(this.#typeBuffer) * 10 > max) {
303
431
  this.#clearTypeBuffer();
304
432
  this.#focusSibling(segment, 1);
@@ -314,21 +442,30 @@ var TimePickerController = class _TimePickerController extends Controller {
314
442
  this.#typeSegment = null;
315
443
  }
316
444
  #adoptPendingDom() {
317
- const pending = this.#observer?.takeRecords() ?? [];
318
- if (pending.some(({ target }) => this.segmentTargets.includes(target))) {
319
- this.#domDirty = true;
320
- }
445
+ this.#recordAuthoredSegments(this.#observer.take());
321
446
  if (!this.#domDirty) return false;
322
447
  this.#domDirty = false;
323
448
  this.#clearTypeBuffer();
324
449
  this.#adoptDomState();
325
450
  return true;
326
451
  }
452
+ #recordAuthoredSegments(records) {
453
+ let changed = false;
454
+ for (const { target } of records) {
455
+ if (!(target instanceof HTMLElement) || !this.segmentTargets.includes(target)) continue;
456
+ this.#authoredSegments.add(target);
457
+ changed = true;
458
+ }
459
+ if (changed) this.#domDirty = true;
460
+ return changed;
461
+ }
327
462
  #reconcileDom() {
328
463
  this.#adoptPendingDom();
329
464
  this.#render();
330
465
  }
331
466
  #adoptDomState() {
467
+ const mode = this.#hourMode;
468
+ const presentationChanged = this.#renderedHourMode !== null && this.#renderedHourMode !== mode;
332
469
  let displayedHour = 0;
333
470
  let meridiem = AM;
334
471
  let minute = 0;
@@ -336,7 +473,15 @@ var TimePickerController = class _TimePickerController extends Controller {
336
473
  for (const segment of this.segmentTargets) {
337
474
  const kind = this.#kindOf(segment);
338
475
  if (!kind) continue;
339
- const value = this.#authoredValue(segment, kind);
476
+ const retained = presentationChanged && this.#renderedSegments.has(segment) && !this.#authoredSegments.has(segment);
477
+ let value;
478
+ if (retained && kind === "hour") {
479
+ value = mode === "h23" ? this.#state.hour : this.#state.hour % 12;
480
+ } else if (retained && kind === "meridiem") {
481
+ value = this.#state.hour >= 12 ? PM : AM;
482
+ } else {
483
+ value = this.#authoredValue(segment, kind);
484
+ }
340
485
  if (kind === "hour") displayedHour = value;
341
486
  else if (kind === "minute") minute = value;
342
487
  else if (kind === "second") second = value;
@@ -347,6 +492,7 @@ var TimePickerController = class _TimePickerController extends Controller {
347
492
  minute,
348
493
  second
349
494
  };
495
+ this.#authoredSegments.clear();
350
496
  }
351
497
  #authoredValue(segment, kind) {
352
498
  const raw = Number(segment.getAttribute("aria-valuenow"));
@@ -371,10 +517,11 @@ var TimePickerController = class _TimePickerController extends Controller {
371
517
  this.#state.minute = Math.floor(seconds % SECONDS_PER_HOUR / SECONDS_PER_MINUTE);
372
518
  this.#state.second = seconds % SECONDS_PER_MINUTE;
373
519
  }
374
- #renderSegments() {
375
- this.#withoutObservation(() => {
376
- for (const segment of this.segmentTargets) this.#renderSegment(segment);
377
- });
520
+ #renderSegments(preserveTypeBuffer = false) {
521
+ const mode = this.#hourMode;
522
+ if (this.#renderedHourMode !== mode && !preserveTypeBuffer) this.#clearTypeBuffer();
523
+ this.#renderedHourMode = mode;
524
+ for (const segment of this.segmentTargets) this.#renderSegment(segment);
378
525
  }
379
526
  #render() {
380
527
  this.#renderSegments();
@@ -387,24 +534,29 @@ var TimePickerController = class _TimePickerController extends Controller {
387
534
  this.dispatch("reconcile", { detail: { value } });
388
535
  }
389
536
  }
390
- #commitRender() {
391
- this.#renderSegments();
537
+ #commitRender(preserveTypeBuffer = false) {
538
+ const generation = this.#connectionGeneration;
539
+ this.#renderSegments(preserveTypeBuffer);
392
540
  const value = this.#composedValue;
393
541
  const changed = value !== this.#lastValue;
394
542
  this.#lastValue = value;
395
543
  if (changed) this.#move = this.#moves.record();
396
544
  const move = this.#move;
397
545
  if (this.#writeField(value)) commitField(this.fieldTarget);
398
- if (!this.#moves.isLatest(move)) return;
546
+ if (generation !== this.#connectionGeneration || !this.#moves.isLatest(move)) return;
399
547
  if (changed) this.dispatch("change", { detail: { value } });
400
548
  }
401
549
  #renderSegment(segment) {
402
550
  const kind = this.#kindOf(segment);
403
551
  if (!kind) return;
552
+ this.#renderedSegments.add(segment);
404
553
  const value = this.#displayValue(kind);
405
- const text = kind === "meridiem" ? value === PM ? "PM" : "AM" : pad(value);
554
+ const text = kind === "meridiem" ? value === PM ? this.pmLabelValue : this.amLabelValue : pad(value);
406
555
  const { min, max } = this.#bounds(kind);
407
- segment.setAttribute("aria-valuenow", String(value));
556
+ const serialized = String(value);
557
+ setAttributeIfChanged(segment, "aria-valuenow", serialized, () => {
558
+ this.#observer.claim(segment, "aria-valuenow", serialized);
559
+ });
408
560
  segment.setAttribute("aria-valuetext", text);
409
561
  segment.setAttribute("aria-valuemin", String(min));
410
562
  segment.setAttribute("aria-valuemax", String(max));
@@ -420,7 +572,10 @@ var TimePickerController = class _TimePickerController extends Controller {
420
572
  }
421
573
  #displayValue(kind) {
422
574
  if (kind === "hour") {
423
- return this.#safeHourCycle === 12 ? this.#state.hour % 12 || 12 : this.#state.hour;
575
+ const mode = this.#hourMode;
576
+ if (mode === "h23") return this.#state.hour;
577
+ const hour = this.#state.hour % 12;
578
+ return mode === "h11" ? hour : hour || 12;
424
579
  }
425
580
  if (kind === "meridiem") return this.#state.hour >= 12 ? PM : AM;
426
581
  return this.#state[kind];
@@ -428,7 +583,8 @@ var TimePickerController = class _TimePickerController extends Controller {
428
583
  #bounds(kind) {
429
584
  switch (kind) {
430
585
  case "hour":
431
- return this.#safeHourCycle === 12 ? { min: 1, max: 12 } : { min: 0, max: 23 };
586
+ if (this.#hourMode === "h23") return { min: 0, max: 23 };
587
+ return this.#hourMode === "h11" ? { min: 0, max: 11 } : { min: 1, max: 12 };
432
588
  case "minute":
433
589
  case "second":
434
590
  return { min: 0, max: 59 };
@@ -437,33 +593,11 @@ var TimePickerController = class _TimePickerController extends Controller {
437
593
  }
438
594
  }
439
595
  #observeMutations() {
440
- const observer = new MutationObserver((records) => {
441
- const changed = records.some(
442
- ({ target }) => target instanceof HTMLElement && this.segmentTargets.includes(target)
443
- );
444
- if (!changed) return;
445
- this.#domDirty = true;
446
- this.#reconcile.schedule();
447
- });
448
- this.#observer = observer;
449
- this.#observeWith(observer);
450
- }
451
- #observeWith(observer) {
452
- observer.observe(this.element, {
596
+ this.#observer.observe(this.element, {
453
597
  subtree: true,
454
- attributes: true,
455
- attributeFilter: ["aria-valuenow", "data-segment"]
598
+ attributes: ["aria-valuenow", "data-segment"]
456
599
  });
457
600
  }
458
- #withoutObservation(run) {
459
- const observer = this.#observer;
460
- observer?.disconnect();
461
- try {
462
- run();
463
- } finally {
464
- if (observer && this.#connected) this.#observeWith(observer);
465
- }
466
- }
467
601
  #kindOf(segment) {
468
602
  const kind = segment.getAttribute("data-segment");
469
603
  if (kind === "hour" || kind === "minute" || kind === "second" || kind === "meridiem") {
@@ -474,6 +608,10 @@ var TimePickerController = class _TimePickerController extends Controller {
474
608
  get #secondsOfDay() {
475
609
  return this.#state.hour * SECONDS_PER_HOUR + this.#state.minute * SECONDS_PER_MINUTE + this.#state.second;
476
610
  }
611
+ get #hourMode() {
612
+ if (this.#safeHourCycle !== 12) return "h23";
613
+ return this.hour12ZeroBasedValue ? "h11" : "h12";
614
+ }
477
615
  get #safeHourCycle() {
478
616
  return this.#numbers.read(
479
617
  this,