stimeo-ui 0.16.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 (337) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/README.md +27 -11
  3. package/dist/cable/index.d.ts +88 -31
  4. package/dist/cable/index.js +384 -449
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/coerce-JtZVNG5h.d.ts +20 -0
  7. package/dist/controllers/accordion_controller.d.ts +4 -2
  8. package/dist/controllers/accordion_controller.js +174 -55
  9. package/dist/controllers/accordion_controller.js.map +1 -1
  10. package/dist/controllers/alert_dialog_controller.d.ts +12 -2
  11. package/dist/controllers/alert_dialog_controller.js +903 -235
  12. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  13. package/dist/controllers/announcer_controller.d.ts +37 -5
  14. package/dist/controllers/announcer_controller.js +238 -205
  15. package/dist/controllers/announcer_controller.js.map +1 -1
  16. package/dist/controllers/aspect_ratio_controller.js +0 -10
  17. package/dist/controllers/aspect_ratio_controller.js.map +1 -1
  18. package/dist/controllers/auto_submit_controller.d.ts +30 -6
  19. package/dist/controllers/auto_submit_controller.js +414 -145
  20. package/dist/controllers/auto_submit_controller.js.map +1 -1
  21. package/dist/controllers/avatar_controller.js +185 -107
  22. package/dist/controllers/avatar_controller.js.map +1 -1
  23. package/dist/controllers/breadcrumb_controller.js +0 -130
  24. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  25. package/dist/controllers/bulk_select_controller.d.ts +21 -3
  26. package/dist/controllers/bulk_select_controller.js +282 -58
  27. package/dist/controllers/bulk_select_controller.js.map +1 -1
  28. package/dist/controllers/calendar_controller.d.ts +38 -16
  29. package/dist/controllers/calendar_controller.js +228 -260
  30. package/dist/controllers/calendar_controller.js.map +1 -1
  31. package/dist/controllers/carousel_controller.d.ts +43 -12
  32. package/dist/controllers/carousel_controller.js +536 -436
  33. package/dist/controllers/carousel_controller.js.map +1 -1
  34. package/dist/controllers/character_counter_controller.d.ts +44 -7
  35. package/dist/controllers/character_counter_controller.js +493 -207
  36. package/dist/controllers/character_counter_controller.js.map +1 -1
  37. package/dist/controllers/checkbox_controller.d.ts +7 -2
  38. package/dist/controllers/checkbox_controller.js +38 -74
  39. package/dist/controllers/checkbox_controller.js.map +1 -1
  40. package/dist/controllers/clipboard_controller.d.ts +16 -5
  41. package/dist/controllers/clipboard_controller.js +261 -149
  42. package/dist/controllers/clipboard_controller.js.map +1 -1
  43. package/dist/controllers/collapsible_controller.d.ts +17 -5
  44. package/dist/controllers/collapsible_controller.js +304 -120
  45. package/dist/controllers/collapsible_controller.js.map +1 -1
  46. package/dist/controllers/color_picker_controller.d.ts +18 -6
  47. package/dist/controllers/color_picker_controller.js +178 -146
  48. package/dist/controllers/color_picker_controller.js.map +1 -1
  49. package/dist/controllers/combobox_controller.d.ts +24 -6
  50. package/dist/controllers/combobox_controller.js +522 -156
  51. package/dist/controllers/combobox_controller.js.map +1 -1
  52. package/dist/controllers/command_palette_controller.d.ts +51 -20
  53. package/dist/controllers/command_palette_controller.js +1156 -395
  54. package/dist/controllers/command_palette_controller.js.map +1 -1
  55. package/dist/controllers/conditional_fields_controller.d.ts +15 -2
  56. package/dist/controllers/conditional_fields_controller.js +300 -171
  57. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  58. package/dist/controllers/confirm_controller.d.ts +49 -12
  59. package/dist/controllers/confirm_controller.js +980 -262
  60. package/dist/controllers/confirm_controller.js.map +1 -1
  61. package/dist/controllers/context_menu_controller.d.ts +80 -18
  62. package/dist/controllers/context_menu_controller.js +346 -153
  63. package/dist/controllers/context_menu_controller.js.map +1 -1
  64. package/dist/controllers/count_up_controller.d.ts +13 -1
  65. package/dist/controllers/count_up_controller.js +73 -21
  66. package/dist/controllers/count_up_controller.js.map +1 -1
  67. package/dist/controllers/countdown_controller.d.ts +47 -3
  68. package/dist/controllers/countdown_controller.js +281 -158
  69. package/dist/controllers/countdown_controller.js.map +1 -1
  70. package/dist/controllers/currency_input_controller.d.ts +93 -10
  71. package/dist/controllers/currency_input_controller.js +575 -225
  72. package/dist/controllers/currency_input_controller.js.map +1 -1
  73. package/dist/controllers/data_grid_controller.d.ts +25 -12
  74. package/dist/controllers/data_grid_controller.js +248 -214
  75. package/dist/controllers/data_grid_controller.js.map +1 -1
  76. package/dist/controllers/date_range_picker_controller.d.ts +42 -14
  77. package/dist/controllers/date_range_picker_controller.js +338 -235
  78. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  79. package/dist/controllers/dialog_controller.d.ts +17 -6
  80. package/dist/controllers/dialog_controller.js +899 -237
  81. package/dist/controllers/dialog_controller.js.map +1 -1
  82. package/dist/controllers/direct_upload_controller.d.ts +25 -8
  83. package/dist/controllers/direct_upload_controller.js +97 -167
  84. package/dist/controllers/direct_upload_controller.js.map +1 -1
  85. package/dist/controllers/dirty_form_controller.d.ts +6 -1
  86. package/dist/controllers/dirty_form_controller.js +72 -69
  87. package/dist/controllers/dirty_form_controller.js.map +1 -1
  88. package/dist/controllers/dismissible_controller.d.ts +19 -0
  89. package/dist/controllers/dismissible_controller.js +196 -24
  90. package/dist/controllers/dismissible_controller.js.map +1 -1
  91. package/dist/controllers/drawer_controller.d.ts +39 -11
  92. package/dist/controllers/drawer_controller.js +974 -355
  93. package/dist/controllers/drawer_controller.js.map +1 -1
  94. package/dist/controllers/dropdown_controller.d.ts +31 -1
  95. package/dist/controllers/dropdown_controller.js +339 -96
  96. package/dist/controllers/dropdown_controller.js.map +1 -1
  97. package/dist/controllers/editable_controller.d.ts +12 -1
  98. package/dist/controllers/editable_controller.js +315 -88
  99. package/dist/controllers/editable_controller.js.map +1 -1
  100. package/dist/controllers/empty_state_controller.js +79 -58
  101. package/dist/controllers/empty_state_controller.js.map +1 -1
  102. package/dist/controllers/file_dropzone_controller.d.ts +63 -18
  103. package/dist/controllers/file_dropzone_controller.js +322 -211
  104. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  105. package/dist/controllers/filter_controller.js +77 -42
  106. package/dist/controllers/filter_controller.js.map +1 -1
  107. package/dist/controllers/flash_controller.d.ts +35 -12
  108. package/dist/controllers/flash_controller.js +238 -347
  109. package/dist/controllers/flash_controller.js.map +1 -1
  110. package/dist/controllers/focus_controller.d.ts +15 -6
  111. package/dist/controllers/focus_controller.js +679 -240
  112. package/dist/controllers/focus_controller.js.map +1 -1
  113. package/dist/controllers/form_field_controller.js +156 -132
  114. package/dist/controllers/form_field_controller.js.map +1 -1
  115. package/dist/controllers/form_validation_controller.d.ts +3 -3
  116. package/dist/controllers/form_validation_controller.js +31 -97
  117. package/dist/controllers/form_validation_controller.js.map +1 -1
  118. package/dist/controllers/frame_loading_controller.d.ts +47 -14
  119. package/dist/controllers/frame_loading_controller.js +275 -217
  120. package/dist/controllers/frame_loading_controller.js.map +1 -1
  121. package/dist/controllers/highlight_controller.d.ts +27 -6
  122. package/dist/controllers/highlight_controller.js +107 -75
  123. package/dist/controllers/highlight_controller.js.map +1 -1
  124. package/dist/controllers/hover_card_controller.d.ts +60 -4
  125. package/dist/controllers/hover_card_controller.js +327 -130
  126. package/dist/controllers/hover_card_controller.js.map +1 -1
  127. package/dist/controllers/idle_controller.d.ts +48 -6
  128. package/dist/controllers/idle_controller.js +271 -101
  129. package/dist/controllers/idle_controller.js.map +1 -1
  130. package/dist/controllers/input_mask_controller.d.ts +30 -13
  131. package/dist/controllers/input_mask_controller.js +483 -97
  132. package/dist/controllers/input_mask_controller.js.map +1 -1
  133. package/dist/controllers/intersection_controller.d.ts +32 -13
  134. package/dist/controllers/intersection_controller.js +150 -106
  135. package/dist/controllers/intersection_controller.js.map +1 -1
  136. package/dist/controllers/lazy_frame_controller.d.ts +19 -2
  137. package/dist/controllers/lazy_frame_controller.js +24 -68
  138. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  139. package/dist/controllers/listbox_controller.d.ts +44 -9
  140. package/dist/controllers/listbox_controller.js +523 -240
  141. package/dist/controllers/listbox_controller.js.map +1 -1
  142. package/dist/controllers/local_time_controller.d.ts +9 -7
  143. package/dist/controllers/local_time_controller.js +102 -77
  144. package/dist/controllers/local_time_controller.js.map +1 -1
  145. package/dist/controllers/masonry_controller.d.ts +11 -3
  146. package/dist/controllers/masonry_controller.js +80 -96
  147. package/dist/controllers/masonry_controller.js.map +1 -1
  148. package/dist/controllers/menu_controller.d.ts +55 -11
  149. package/dist/controllers/menu_controller.js +302 -188
  150. package/dist/controllers/menu_controller.js.map +1 -1
  151. package/dist/controllers/menubar_controller.d.ts +51 -9
  152. package/dist/controllers/menubar_controller.js +232 -345
  153. package/dist/controllers/menubar_controller.js.map +1 -1
  154. package/dist/controllers/meter_controller.d.ts +33 -20
  155. package/dist/controllers/meter_controller.js +417 -87
  156. package/dist/controllers/meter_controller.js.map +1 -1
  157. package/dist/controllers/multi_select_controller.d.ts +48 -18
  158. package/dist/controllers/multi_select_controller.js +785 -393
  159. package/dist/controllers/multi_select_controller.js.map +1 -1
  160. package/dist/controllers/navigation_menu_controller.d.ts +27 -6
  161. package/dist/controllers/navigation_menu_controller.js +190 -250
  162. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  163. package/dist/controllers/nested_form_controller.d.ts +10 -0
  164. package/dist/controllers/nested_form_controller.js +396 -192
  165. package/dist/controllers/nested_form_controller.js.map +1 -1
  166. package/dist/controllers/network_status_controller.d.ts +23 -0
  167. package/dist/controllers/network_status_controller.js +268 -62
  168. package/dist/controllers/network_status_controller.js.map +1 -1
  169. package/dist/controllers/number_input_controller.d.ts +50 -8
  170. package/dist/controllers/number_input_controller.js +610 -303
  171. package/dist/controllers/number_input_controller.js.map +1 -1
  172. package/dist/controllers/optimistic_controller.d.ts +8 -5
  173. package/dist/controllers/optimistic_controller.js +45 -87
  174. package/dist/controllers/optimistic_controller.js.map +1 -1
  175. package/dist/controllers/otp_controller.d.ts +55 -8
  176. package/dist/controllers/otp_controller.js +658 -255
  177. package/dist/controllers/otp_controller.js.map +1 -1
  178. package/dist/controllers/overflow_indicator_controller.d.ts +5 -0
  179. package/dist/controllers/overflow_indicator_controller.js +122 -113
  180. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  181. package/dist/controllers/overflow_menu_controller.d.ts +58 -20
  182. package/dist/controllers/overflow_menu_controller.js +470 -295
  183. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  184. package/dist/controllers/pagination_controller.d.ts +37 -7
  185. package/dist/controllers/pagination_controller.js +332 -123
  186. package/dist/controllers/pagination_controller.js.map +1 -1
  187. package/dist/controllers/password_reveal_controller.d.ts +46 -8
  188. package/dist/controllers/password_reveal_controller.js +392 -121
  189. package/dist/controllers/password_reveal_controller.js.map +1 -1
  190. package/dist/controllers/password_strength_controller.d.ts +15 -6
  191. package/dist/controllers/password_strength_controller.js +111 -158
  192. package/dist/controllers/password_strength_controller.js.map +1 -1
  193. package/dist/controllers/persist_controller.d.ts +11 -4
  194. package/dist/controllers/persist_controller.js +165 -111
  195. package/dist/controllers/persist_controller.js.map +1 -1
  196. package/dist/controllers/pointer_drag_controller.d.ts +35 -12
  197. package/dist/controllers/pointer_drag_controller.js +434 -188
  198. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  199. package/dist/controllers/popover_controller.d.ts +41 -5
  200. package/dist/controllers/popover_controller.js +269 -113
  201. package/dist/controllers/popover_controller.js.map +1 -1
  202. package/dist/controllers/portal_controller.d.ts +44 -4
  203. package/dist/controllers/portal_controller.js +215 -76
  204. package/dist/controllers/portal_controller.js.map +1 -1
  205. package/dist/controllers/preview_guard_controller.d.ts +10 -4
  206. package/dist/controllers/preview_guard_controller.js +243 -116
  207. package/dist/controllers/preview_guard_controller.js.map +1 -1
  208. package/dist/controllers/progress_controller.d.ts +20 -19
  209. package/dist/controllers/progress_controller.js +391 -78
  210. package/dist/controllers/progress_controller.js.map +1 -1
  211. package/dist/controllers/radio_group_controller.d.ts +21 -9
  212. package/dist/controllers/radio_group_controller.js +278 -211
  213. package/dist/controllers/radio_group_controller.js.map +1 -1
  214. package/dist/controllers/range_slider_controller.d.ts +47 -6
  215. package/dist/controllers/range_slider_controller.js +220 -113
  216. package/dist/controllers/range_slider_controller.js.map +1 -1
  217. package/dist/controllers/rating_controller.d.ts +20 -4
  218. package/dist/controllers/rating_controller.js +458 -211
  219. package/dist/controllers/rating_controller.js.map +1 -1
  220. package/dist/controllers/read_more_controller.d.ts +2 -0
  221. package/dist/controllers/read_more_controller.js +138 -63
  222. package/dist/controllers/read_more_controller.js.map +1 -1
  223. package/dist/controllers/reading_progress_controller.d.ts +1 -1
  224. package/dist/controllers/reading_progress_controller.js +166 -137
  225. package/dist/controllers/reading_progress_controller.js.map +1 -1
  226. package/dist/controllers/relative_time_controller.d.ts +20 -6
  227. package/dist/controllers/relative_time_controller.js +211 -112
  228. package/dist/controllers/relative_time_controller.js.map +1 -1
  229. package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
  230. package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +103 -38
  231. package/dist/controllers/reset_on_restore_controller.js.map +1 -0
  232. package/dist/controllers/resizable_controller.d.ts +31 -2
  233. package/dist/controllers/resizable_controller.js +299 -150
  234. package/dist/controllers/resizable_controller.js.map +1 -1
  235. package/dist/controllers/roving_controller.d.ts +3 -3
  236. package/dist/controllers/roving_controller.js +49 -88
  237. package/dist/controllers/roving_controller.js.map +1 -1
  238. package/dist/controllers/scroll_area_controller.d.ts +7 -3
  239. package/dist/controllers/scroll_area_controller.js +490 -246
  240. package/dist/controllers/scroll_area_controller.js.map +1 -1
  241. package/dist/controllers/scroll_restore_controller.d.ts +3 -3
  242. package/dist/controllers/scroll_restore_controller.js +14 -55
  243. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  244. package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
  245. package/dist/controllers/scroll_visibility_controller.js +432 -149
  246. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  247. package/dist/controllers/scrollspy_controller.d.ts +6 -1
  248. package/dist/controllers/scrollspy_controller.js +193 -248
  249. package/dist/controllers/scrollspy_controller.js.map +1 -1
  250. package/dist/controllers/separator_controller.d.ts +20 -5
  251. package/dist/controllers/separator_controller.js +285 -142
  252. package/dist/controllers/separator_controller.js.map +1 -1
  253. package/dist/controllers/sidebar_controller.d.ts +65 -8
  254. package/dist/controllers/sidebar_controller.js +1069 -404
  255. package/dist/controllers/sidebar_controller.js.map +1 -1
  256. package/dist/controllers/skeleton_controller.d.ts +23 -0
  257. package/dist/controllers/skeleton_controller.js +259 -101
  258. package/dist/controllers/skeleton_controller.js.map +1 -1
  259. package/dist/controllers/slider_controller.d.ts +29 -2
  260. package/dist/controllers/slider_controller.js +187 -86
  261. package/dist/controllers/slider_controller.js.map +1 -1
  262. package/dist/controllers/smart_sticky_header_controller.d.ts +22 -4
  263. package/dist/controllers/smart_sticky_header_controller.js +173 -66
  264. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  265. package/dist/controllers/sortable_controller.d.ts +4 -4
  266. package/dist/controllers/sortable_controller.js +26 -125
  267. package/dist/controllers/sortable_controller.js.map +1 -1
  268. package/dist/controllers/spinner_controller.d.ts +39 -4
  269. package/dist/controllers/spinner_controller.js +288 -173
  270. package/dist/controllers/spinner_controller.js.map +1 -1
  271. package/dist/controllers/step_indicator_controller.d.ts +9 -4
  272. package/dist/controllers/step_indicator_controller.js +105 -46
  273. package/dist/controllers/step_indicator_controller.js.map +1 -1
  274. package/dist/controllers/stepper_controller.d.ts +14 -6
  275. package/dist/controllers/stepper_controller.js +120 -73
  276. package/dist/controllers/stepper_controller.js.map +1 -1
  277. package/dist/controllers/stick_to_bottom_controller.d.ts +9 -1
  278. package/dist/controllers/stick_to_bottom_controller.js +275 -140
  279. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  280. package/dist/controllers/sticky_observer_controller.d.ts +11 -0
  281. package/dist/controllers/sticky_observer_controller.js +220 -49
  282. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  283. package/dist/controllers/submit_once_controller.d.ts +24 -8
  284. package/dist/controllers/submit_once_controller.js +376 -227
  285. package/dist/controllers/submit_once_controller.js.map +1 -1
  286. package/dist/controllers/switch_controller.d.ts +18 -4
  287. package/dist/controllers/switch_controller.js +201 -84
  288. package/dist/controllers/switch_controller.js.map +1 -1
  289. package/dist/controllers/tabs_controller.d.ts +9 -6
  290. package/dist/controllers/tabs_controller.js +41 -30
  291. package/dist/controllers/tabs_controller.js.map +1 -1
  292. package/dist/controllers/tags_input_controller.d.ts +16 -3
  293. package/dist/controllers/tags_input_controller.js +293 -173
  294. package/dist/controllers/tags_input_controller.js.map +1 -1
  295. package/dist/controllers/textarea_autosize_controller.d.ts +11 -1
  296. package/dist/controllers/textarea_autosize_controller.js +108 -74
  297. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  298. package/dist/controllers/theme_controller.d.ts +24 -11
  299. package/dist/controllers/theme_controller.js +140 -116
  300. package/dist/controllers/theme_controller.js.map +1 -1
  301. package/dist/controllers/time_picker_controller.d.ts +55 -5
  302. package/dist/controllers/time_picker_controller.js +331 -127
  303. package/dist/controllers/time_picker_controller.js.map +1 -1
  304. package/dist/controllers/toast_controller.d.ts +40 -16
  305. package/dist/controllers/toast_controller.js +244 -324
  306. package/dist/controllers/toast_controller.js.map +1 -1
  307. package/dist/controllers/toggle_group_controller.d.ts +14 -6
  308. package/dist/controllers/toggle_group_controller.js +252 -191
  309. package/dist/controllers/toggle_group_controller.js.map +1 -1
  310. package/dist/controllers/toolbar_controller.d.ts +8 -6
  311. package/dist/controllers/toolbar_controller.js +219 -120
  312. package/dist/controllers/toolbar_controller.js.map +1 -1
  313. package/dist/controllers/tooltip_controller.d.ts +49 -4
  314. package/dist/controllers/tooltip_controller.js +158 -124
  315. package/dist/controllers/tooltip_controller.js.map +1 -1
  316. package/dist/controllers/transition_controller.d.ts +22 -4
  317. package/dist/controllers/transition_controller.js +123 -119
  318. package/dist/controllers/transition_controller.js.map +1 -1
  319. package/dist/controllers/tree_view_controller.d.ts +22 -12
  320. package/dist/controllers/tree_view_controller.js +283 -369
  321. package/dist/controllers/tree_view_controller.js.map +1 -1
  322. package/dist/index.d.ts +10 -5
  323. package/dist/index.js +8573 -10410
  324. package/dist/index.js.map +1 -1
  325. package/dist/inspector/cli.d.ts +38 -14
  326. package/dist/inspector/cli.js +108 -40
  327. package/dist/inspector/cli.js.map +1 -1
  328. package/dist/inspector/cli_bin.js +145 -64
  329. package/dist/inspector/cli_bin.js.map +1 -1
  330. package/dist/inspector/examples.json +20 -20
  331. package/dist/inspector/manifest.json +802 -101
  332. package/dist/positioning/index.d.ts +15 -7
  333. package/dist/positioning/index.js +154 -47
  334. package/dist/positioning/index.js.map +1 -1
  335. package/package.json +11 -10
  336. package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
  337. package/dist/controllers/reset_before_cache_controller.js.map +0 -1
@@ -1,104 +1,196 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/separator_controller.ts
4
-
5
- // src/utils/arrow_step.ts
6
3
  function isReservedArrowChord(event, allow = []) {
7
4
  if (!event.key.startsWith("Arrow")) return false;
8
5
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
9
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
+ }
17
+
18
+ function sharedRegistry(key, create) {
19
+ const symbol = Symbol.for(key);
20
+ const scope = globalThis;
21
+ const existing = scope[symbol];
22
+ if (existing !== void 0) return existing;
23
+ const registry2 = create();
24
+ Object.defineProperty(globalThis, symbol, { value: registry2 });
25
+ return registry2;
26
+ }
10
27
 
11
- // src/utils/attribute_lease.ts
28
+ var registry = sharedRegistry(
29
+ "stimeo-ui.attribute-lease.registry.v1",
30
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
31
+ );
32
+ function isAttributeValue(value) {
33
+ return value === null || typeof value === "string";
34
+ }
35
+ function readLeaseRecord(element, record) {
36
+ try {
37
+ const parsed = JSON.parse(element.getAttribute(record) ?? "null");
38
+ if (!Array.isArray(parsed)) return void 0;
39
+ const [original, written, ...rest] = parsed;
40
+ const linked = rest[0] !== false;
41
+ const beneath = linked ? rest : rest.slice(1);
42
+ if (!beneath.every((under) => typeof under === "string")) return void 0;
43
+ return isAttributeValue(original) && isAttributeValue(written) ? { original, written, linked, beneath } : void 0;
44
+ } catch {
45
+ return void 0;
46
+ }
47
+ }
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
+ }
12
72
  var AttributeLease = class {
13
73
  #attribute;
14
- #records = /* @__PURE__ */ new Map();
15
- /** @param attribute - The attribute whose temporary values this lease owns. */
16
- constructor(attribute) {
74
+ #record;
75
+ #base;
76
+ #preserveAuthor;
77
+ #held = /* @__PURE__ */ new Set();
78
+ constructor(attribute, owner, options = {}) {
17
79
  this.#attribute = attribute;
80
+ this.#record = `data-${owner}-${attribute}-lease`;
81
+ this.#base = options.base === true;
82
+ this.#preserveAuthor = options.preserveAuthor === true;
83
+ const names = registry.names;
84
+ names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
18
85
  }
19
- /** Writes or removes the leased attribute while preserving its authored value. */
20
86
  write(element, value) {
21
- const existing = this.#records.get(element);
22
- if (existing) {
23
- existing.written = value;
24
- } else {
25
- this.#records.set(element, {
26
- original: element.getAttribute(this.#attribute),
27
- written: value
28
- });
29
- }
30
- this.#reflect(element, value);
87
+ const stack = attributeStack(element, this.#attribute);
88
+ const hold = this.#take(stack) ?? this.#acquire(element, stack);
89
+ this.#held.add(element);
90
+ const shows = !this.#covered(element, stack, hold);
91
+ hold.written = value;
92
+ this.#mark(element, stack);
93
+ if (shows) this.#reflect(element, value);
31
94
  }
32
- /** Returns one lease without overwriting a value subsequently authored by a consumer. */
33
95
  return(element) {
34
- const record = this.#records.get(element);
35
- if (!record) return;
36
- this.#records.delete(element);
37
- const stillOwned = element.getAttribute(this.#attribute) === record.written;
38
- if (stillOwned) this.#reflect(element, record.original);
96
+ const held = this.#held.delete(element);
97
+ const known = registry.stacks.get(element)?.has(this.#attribute);
98
+ const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
99
+ const hold = this.#take(stack);
100
+ if (!hold) return false;
101
+ const carries = element.getAttribute(this.#attribute) === hold.written;
102
+ const owns = carries && !this.#covered(element, stack, hold);
103
+ const index = stack.indexOf(hold);
104
+ stack.splice(index, 1);
105
+ const above = stack[index];
106
+ if (above) above.linked &&= hold.linked;
107
+ this.#mark(element, stack);
108
+ if (!owns) return true;
109
+ const below = hold.linked ? stack[index - 1] : void 0;
110
+ this.#reflect(element, below ? below.written : hold.original);
111
+ return true;
39
112
  }
40
- /** Reflects only a real value transition, avoiding self-triggered mutation work. */
41
- #reflect(element, value) {
42
- if (element.getAttribute(this.#attribute) === value) return;
43
- if (value === null) element.removeAttribute(this.#attribute);
44
- else element.setAttribute(this.#attribute, value);
45
- }
46
- /** Returns every outstanding lease using the same ownership check as {@link return}. */
47
113
  returnAll() {
48
- for (const element of Array.from(this.#records.keys())) this.return(element);
114
+ for (const element of Array.from(this.#held)) this.return(element);
115
+ }
116
+ #take(stack) {
117
+ const hold = findHold(stack, this, this.#record);
118
+ if (hold) hold.lease = this;
119
+ return hold;
120
+ }
121
+ #acquire(element, stack) {
122
+ const current = element.getAttribute(this.#attribute);
123
+ const top = stack.at(-1);
124
+ const bottom = stack[0];
125
+ const over = top?.written === current ? top : void 0;
126
+ const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
127
+ const hold = {
128
+ lease: this,
129
+ record: this.#record,
130
+ written: current,
131
+ original: from ? from.original : current,
132
+ linked: !this.#base && over !== void 0
133
+ };
134
+ if (this.#base && bottom) {
135
+ bottom.linked = true;
136
+ stack.unshift(hold);
137
+ } else stack.push(hold);
138
+ return hold;
139
+ }
140
+ #covered(element, stack, hold) {
141
+ const current = element.getAttribute(this.#attribute);
142
+ return stack.slice(stack.indexOf(hold) + 1).some((above) => above.written === current);
143
+ }
144
+ #mark(element, stack) {
145
+ const records = /* @__PURE__ */ new Map([[this.#record, null]]);
146
+ stack.forEach((hold, index) => {
147
+ const names = stack.slice(0, index).map((under) => under.record);
148
+ const beneath = [...new Set(names.reverse())].filter((name) => name !== hold.record);
149
+ const marker = hold.linked || beneath.length === 0 ? [] : [false];
150
+ records.set(
151
+ hold.record,
152
+ hold.written === hold.original && beneath.length === 0 && index === stack.length - 1 ? null : JSON.stringify([hold.original, hold.written, ...marker, ...beneath])
153
+ );
154
+ });
155
+ for (const [name, recorded] of records) {
156
+ setAttributeIfChanged(element, name, recorded);
157
+ }
158
+ }
159
+ #reflect(element, value) {
160
+ setAttributeIfChanged(element, this.#attribute, value);
49
161
  }
50
162
  };
51
163
 
52
- // src/utils/before_cache_reset.ts
53
- var BeforeCacheReset = class _BeforeCacheReset {
54
- /** Every subscribed instance, iterated by the one shared document listener. */
55
- static #subscribers = /* @__PURE__ */ new Set();
56
- /** The shared listener; installed while at least one instance is subscribed. */
57
- static #onBeforeCache = () => {
58
- for (const subscriber of _BeforeCacheReset.#subscribers) subscriber.#rewind();
59
- };
60
- #rewind;
61
- /** @param rewind - the pass that returns this controller's state to its initial form. */
62
- constructor(rewind) {
63
- this.#rewind = rewind;
64
- }
65
- /** Subscribes to `turbo:before-cache`; call from `connect()`. Idempotent. */
66
- activate() {
67
- const first = _BeforeCacheReset.#subscribers.size === 0;
68
- _BeforeCacheReset.#subscribers.add(this);
69
- if (first) {
70
- document.addEventListener("turbo:before-cache", _BeforeCacheReset.#onBeforeCache);
71
- }
164
+ var ListenerSet = class {
165
+ #abort = new AbortController();
166
+ add(target, type, handler, options) {
167
+ target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
72
168
  }
73
- /** Unsubscribes; call from `disconnect()`. Safe when never subscribed. */
74
- deactivate() {
75
- _BeforeCacheReset.#subscribers.delete(this);
76
- if (_BeforeCacheReset.#subscribers.size > 0) return;
77
- document.removeEventListener("turbo:before-cache", _BeforeCacheReset.#onBeforeCache);
169
+ dispose() {
170
+ this.#abort.abort();
171
+ this.#abort = new AbortController();
78
172
  }
79
173
  };
80
174
 
81
- // src/utils/microtask_coalescer.ts
82
175
  var MicrotaskCoalescer = class {
83
176
  #run;
84
177
  #queued = false;
85
178
  #active = false;
86
179
  #generation = 0;
87
- /** @param run - the single reconciliation pass, invoked at most once per batch. */
88
180
  constructor(run) {
89
181
  this.#run = run;
90
182
  }
91
- /** Opens the window in which {@link schedule} is honoured; call from `connect()`. */
92
183
  activate() {
93
184
  this.#active = true;
94
185
  }
95
- /** Closes the window and drops any pending pass; call from `disconnect()`. */
96
186
  cancel() {
97
187
  this.#active = false;
98
188
  this.#queued = false;
99
189
  this.#generation += 1;
100
190
  }
101
- /** Requests one pass after the batch settles. Idempotent; inert outside the window. */
191
+ get pending() {
192
+ return this.#queued;
193
+ }
102
194
  schedule() {
103
195
  if (!this.#active || this.#queued) return;
104
196
  this.#queued = true;
@@ -111,7 +203,79 @@ var MicrotaskCoalescer = class {
111
203
  }
112
204
  };
113
205
 
114
- // src/utils/stepped_value.ts
206
+ var MorphRenderWatcher = class {
207
+ #listeners = new ListenerSet();
208
+ #pass;
209
+ #element = null;
210
+ #onMorph = () => this.#pass.schedule();
211
+ constructor(run) {
212
+ this.#pass = new MicrotaskCoalescer(run);
213
+ }
214
+ observe(element) {
215
+ if (this.#element === element) return;
216
+ this.disconnect();
217
+ this.#element = element;
218
+ this.#pass.activate();
219
+ this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
220
+ }
221
+ schedule() {
222
+ this.#pass.schedule();
223
+ }
224
+ get pending() {
225
+ return this.#pass.pending;
226
+ }
227
+ disconnect() {
228
+ this.#listeners.dispose();
229
+ this.#pass.cancel();
230
+ this.#element = null;
231
+ }
232
+ };
233
+
234
+ var NUMBER_BOUNDS = {
235
+ finite: { finite: true },
236
+ positive: { finite: true, exclusiveMin: 0 }};
237
+ function matchesNumberBounds(value, bounds) {
238
+ if (!Number.isFinite(value)) {
239
+ const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
240
+ if (direction === null) return false;
241
+ if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
242
+ }
243
+ if (bounds.min !== void 0 && value < bounds.min) return false;
244
+ if (bounds.max !== void 0 && value > bounds.max) return false;
245
+ if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
246
+ if (bounds.integer && !Number.isInteger(value)) return false;
247
+ if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
248
+ return true;
249
+ }
250
+
251
+ function readNumber(raw, fallback, bounds) {
252
+ return matchesNumberBounds(raw, bounds) ? raw : fallback;
253
+ }
254
+
255
+ var NumberValueReader = class {
256
+ #lastRejected = /* @__PURE__ */ new Map();
257
+ read(owner, name, raw, fallback, bounds) {
258
+ const resolved = readNumber(raw, fallback, bounds);
259
+ if (matchesNumberBounds(raw, bounds)) {
260
+ this.#lastRejected.delete(name);
261
+ return resolved;
262
+ }
263
+ const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
264
+ const literal = owner.element.getAttribute(attribute);
265
+ if (literal === null) {
266
+ this.#lastRejected.delete(name);
267
+ return resolved;
268
+ }
269
+ if (this.#lastRejected.get(name) !== literal) {
270
+ this.#lastRejected.set(name, literal);
271
+ console.warn(
272
+ `Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
273
+ );
274
+ }
275
+ return resolved;
276
+ }
277
+ };
278
+
115
279
  function effectiveStep(step) {
116
280
  return Number.isFinite(step) && step > 0 ? step : 1;
117
281
  }
@@ -217,10 +381,10 @@ function finiteFallback(min, max) {
217
381
  return 0;
218
382
  }
219
383
 
220
- // src/controllers/separator_controller.ts
221
384
  var DEFAULT_MIN = 0;
222
385
  var DEFAULT_MAX = 100;
223
- var SeparatorController = class extends Controller {
386
+ var SeparatorController = class _SeparatorController extends Controller {
387
+ #numbers = new NumberValueReader();
224
388
  static values = {
225
389
  orientation: { type: String, default: "horizontal" },
226
390
  focusable: { type: Boolean, default: false },
@@ -229,76 +393,56 @@ var SeparatorController = class extends Controller {
229
393
  step: { type: Number, default: 1 },
230
394
  value: { type: Number, default: DEFAULT_MIN }
231
395
  };
396
+ static valueConstraints = {
397
+ min: NUMBER_BOUNDS.finite,
398
+ max: NUMBER_BOUNDS.finite,
399
+ step: NUMBER_BOUNDS.positive,
400
+ value: NUMBER_BOUNDS.finite
401
+ };
232
402
  static actions = ["onKeydown"];
233
403
  static events = ["change", "reconcile"];
234
- #role = new AttributeLease("role");
235
- #tabindex = new AttributeLease("tabindex");
236
- #orientation = new AttributeLease("aria-orientation");
237
- #minimum = new AttributeLease("aria-valuemin");
238
- #maximum = new AttributeLease("aria-valuemax");
239
- #current = new AttributeLease("aria-valuenow");
240
- /** Collapses a morph that changes several render Values into one repaint. */
241
- #repaint = new MicrotaskCoalescer(() => this.#render());
242
- /** Restores authored semantics before Turbo snapshots the element. */
243
- #beforeCache = new BeforeCacheReset(() => this.#rewindForCache());
244
- /**
245
- * The baseline a published value is compared with: the value last published
246
- * through `aria-valuenow`, or `null` while this connection has published none.
247
- * It moves to each value a key the user presses or a repaint publishes. While
248
- * nothing is published — the separator is decorative — it keeps the last
249
- * value published, so a value that moved meanwhile is reported once when the
250
- * separator publishes again; one that connected decorative keeps `null`, so
251
- * its first published value is only taken as the baseline.
252
- */
404
+ #role = new AttributeLease("role", this.identifier);
405
+ #tabindex = new AttributeLease("tabindex", this.identifier);
406
+ #orientation = new AttributeLease("aria-orientation", this.identifier);
407
+ #minimum = new AttributeLease("aria-valuemin", this.identifier);
408
+ #maximum = new AttributeLease("aria-valuemax", this.identifier);
409
+ #current = new AttributeLease("aria-valuenow", this.identifier);
410
+ #repaint = new MorphRenderWatcher(() => this.#render());
253
411
  #settled = null;
254
- /**
255
- * Hydrates authored range ARIA into absent Values once and renders them
256
- * without writing the normalized value back. What the first render publishes
257
- * is the baseline, so connecting reports nothing.
258
- */
259
412
  connect() {
260
413
  this.#hydrateValues();
261
- this.#repaint.activate();
262
- this.#beforeCache.activate();
414
+ this.#repaint.observe(this.element);
263
415
  this.#settled = null;
264
416
  this.#render();
265
417
  }
266
- /** Cancels repaint work and returns every semantic attribute this instance controlled. */
267
418
  disconnect() {
268
- this.#repaint.cancel();
269
- this.#beforeCache.deactivate();
419
+ this.#repaint.disconnect();
270
420
  this.#returnAttributes();
271
421
  }
272
- /** Repaints an orientation changed by application code or a Turbo morph. */
273
422
  orientationValueChanged() {
274
423
  this.#repaint.schedule();
275
424
  }
276
- /** Adds or removes the focusable range semantics at runtime. */
277
425
  focusableValueChanged() {
278
426
  this.#repaint.schedule();
279
427
  }
280
- /** Repaints a minimum changed by application code or a Turbo morph. */
281
428
  minValueChanged() {
282
429
  this.#repaint.schedule();
283
430
  }
284
- /** Repaints a maximum changed by application code or a Turbo morph. */
285
431
  maxValueChanged() {
286
432
  this.#repaint.schedule();
287
433
  }
288
- /** Repaints a step changed by application code or a Turbo morph. */
289
434
  stepValueChanged() {
290
435
  this.#repaint.schedule();
291
436
  }
292
- /** Repaints a current value changed by application code or a Turbo morph. */
293
437
  valueValueChanged() {
294
438
  this.#repaint.schedule();
295
439
  }
296
- /** Adjusts the value on arrow / Home / End keys (focusable variant only). */
297
440
  onKeydown(event) {
298
441
  if (isReservedArrowChord(event) || !this.focusableValue) return;
442
+ if ((event.key === "Home" || event.key === "End") && hasModifierChord(event)) return;
299
443
  const horizontal = this.#effectiveOrientation === "horizontal";
300
444
  const range = this.#effectiveRange;
301
- const declared = this.valueValue;
445
+ const declared = this.#safeValue;
302
446
  let next = null;
303
447
  switch (event.key) {
304
448
  case "ArrowUp":
@@ -326,16 +470,6 @@ var SeparatorController = class extends Controller {
326
470
  event.preventDefault();
327
471
  this.#commit(next);
328
472
  }
329
- /**
330
- * Stores a normalized user value, renders immediately, and reports it as
331
- * `change` when it differs from the value last published. The comparison is
332
- * with the value last published, not with the value the key started from, so
333
- * a page write no repaint has published yet is reported once, as this change,
334
- * and a key that ends where the value was last published reports nothing. The
335
- * baseline moves before the render and the report, so neither the repaint the
336
- * Value write schedules nor a move a subscriber makes while `change` is
337
- * dispatched is measured from the value this key replaced.
338
- */
339
473
  #commit(raw) {
340
474
  const value = snapSteppedValue(raw, this.#effectiveRange);
341
475
  const reported = this.#settled;
@@ -344,20 +478,10 @@ var SeparatorController = class extends Controller {
344
478
  this.#render();
345
479
  if (value !== reported) this.dispatch("change", { detail: { value } });
346
480
  }
347
- /**
348
- * Reflects live Values into the connected element without writing them back,
349
- * then compares what it published with the baseline. A decorative separator
350
- * publishes no value (`null` here): the baseline stays the last value
351
- * published. A value is reported once as `reconcile` only when it moved from a
352
- * published baseline, so the first value a connection publishes is only taken
353
- * as the baseline.
354
- *
355
- * @stimeoRenderRoot
356
- */
357
481
  #render() {
358
482
  const range = this.#effectiveRange;
359
483
  const focusable = this.focusableValue;
360
- const published = focusable ? snapSteppedValue(this.valueValue, range) : null;
484
+ const published = focusable ? snapSteppedValue(this.#safeValue, range) : null;
361
485
  this.#role.write(this.element, "separator");
362
486
  this.#orientation.write(this.element, this.#effectiveOrientation);
363
487
  this.#tabindex.write(this.element, focusable ? "0" : null);
@@ -370,27 +494,19 @@ var SeparatorController = class extends Controller {
370
494
  this.dispatch("reconcile", { detail: { value: published } });
371
495
  }
372
496
  }
373
- /** Effective orientation; unknown strings fall back to the horizontal contract. */
374
497
  get #effectiveOrientation() {
375
498
  return this.orientationValue === "vertical" ? "vertical" : "horizontal";
376
499
  }
377
- /** Finite, ordered range shared by rendering and keyboard stepping. */
378
500
  get #effectiveRange() {
379
- const min = Number.isFinite(this.minValue) ? this.minValue : DEFAULT_MIN;
380
- const candidateMax = Number.isFinite(this.maxValue) ? this.maxValue : DEFAULT_MAX;
501
+ const min = this.#safeMin;
502
+ const candidateMax = this.#safeMax;
381
503
  return {
382
504
  min,
383
505
  max: Math.max(min, candidateMax),
384
- step: this.stepValue,
506
+ step: this.#safeStep,
385
507
  base: min
386
508
  };
387
509
  }
388
- /**
389
- * Copies valid authored ARIA into Values only when no explicit Value exists.
390
- * This fill is the one Value write `connect()` makes: it never overwrites a
391
- * declaration, and no Value callback runs it, so a declaration the page
392
- * changes later is only ever read.
393
- */
394
510
  #hydrateValues() {
395
511
  if (!this.#hasInput("orientation")) {
396
512
  const orientation = this.element.getAttribute("aria-orientation");
@@ -405,18 +521,15 @@ var SeparatorController = class extends Controller {
405
521
  const value = this.#finiteAttribute("aria-valuenow");
406
522
  if (!this.#hasInput("value") && value !== null) this.valueValue = value;
407
523
  }
408
- /** Whether the author supplied the namespaced Value instead of using its default. */
409
524
  #hasInput(name) {
410
525
  return this.element.hasAttribute(`data-${this.identifier}-${name}-value`);
411
526
  }
412
- /** Strict finite-number parser for the one-time progressive-enhancement bridge. */
413
527
  #finiteAttribute(name) {
414
528
  const raw = this.element.getAttribute(name);
415
529
  if (raw === null || raw.trim() === "") return null;
416
530
  const value = Number(raw);
417
531
  return Number.isFinite(value) ? value : null;
418
532
  }
419
- /** Returns attributes without overwriting values a consumer changed after render. */
420
533
  #returnAttributes() {
421
534
  this.#role.return(this.element);
422
535
  this.#tabindex.return(this.element);
@@ -425,13 +538,43 @@ var SeparatorController = class extends Controller {
425
538
  this.#maximum.return(this.element);
426
539
  this.#current.return(this.element);
427
540
  }
428
- /** Prevents a queued Value repaint from racing Turbo's restored snapshot. */
429
- #rewindForCache() {
430
- this.#repaint.cancel();
431
- this.#returnAttributes();
541
+ get #safeMin() {
542
+ return this.#numbers.read(
543
+ this,
544
+ "min",
545
+ this.minValue,
546
+ _SeparatorController.values.min.default,
547
+ _SeparatorController.valueConstraints.min
548
+ );
549
+ }
550
+ get #safeMax() {
551
+ return this.#numbers.read(
552
+ this,
553
+ "max",
554
+ this.maxValue,
555
+ _SeparatorController.values.max.default,
556
+ _SeparatorController.valueConstraints.max
557
+ );
558
+ }
559
+ get #safeStep() {
560
+ return this.#numbers.read(
561
+ this,
562
+ "step",
563
+ this.stepValue,
564
+ _SeparatorController.values.step.default,
565
+ _SeparatorController.valueConstraints.step
566
+ );
567
+ }
568
+ get #safeValue() {
569
+ return this.#numbers.read(
570
+ this,
571
+ "value",
572
+ this.valueValue,
573
+ this.#effectiveRange.min,
574
+ _SeparatorController.valueConstraints.value
575
+ );
432
576
  }
433
577
  };
434
578
 
435
579
  export { SeparatorController };
436
- //# sourceMappingURL=separator_controller.js.map
437
580
  //# sourceMappingURL=separator_controller.js.map