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
package/CHANGELOG.md CHANGED
@@ -7,6 +7,139 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
  While the version is `0.x`, the public API (the `stimeo--*` data attributes) may
8
8
  change between releases.
9
9
 
10
+ ## [Unreleased]
11
+
12
+ ## [0.18.0] - 2026-10-22
13
+
14
+ Minor release with no new components. IME composition, Turbo morphs, and form
15
+ submission now behave consistently across the input components, and several
16
+ contracts change, so read Changed before upgrading. The Inspector manifest moves
17
+ to schema v16; update `stimeo check` and the VS Code extension together and run
18
+ `stimeo check` before deploying.
19
+
20
+ ### Added
21
+
22
+ - time-picker: `amLabel` and `pmLabel` Values set the meridiem text and its
23
+ speech, and `hour12ZeroBased` shows and enters a twelve-hour clock's hours as
24
+ 0–11, as `午前` / `午後` time is written. The submitted value stays on the
25
+ 24-hour clock.
26
+
27
+ ### Changed
28
+
29
+ - **Breaking** input-mask: a synchronized hidden field carries a unique internal
30
+ DOM name; native FormData and native / Turbo submission restore the original
31
+ name, and removing the source submits an empty entry. Find managed fields by id
32
+ or the pairing attribute, use native FormData, and call
33
+ `prepareInputMaskForm(form)` before reading FormData from a new detached form.
34
+ input-mask clears only the raw value it wrote.
35
+ - **Breaking** otp: a pattern drop held for a composition is reported as
36
+ `reconcile` before the edit's own `change` / `complete` / `invalid`, and a
37
+ reconnect under another `pattern` drops what it rejects as `reconcile`. Use the
38
+ edit events for submission.
39
+ - **Breaking** number-input: a range or step change made during IME composition
40
+ applies when the user confirms, reported as `change`; a morph that changes
41
+ neither holds nothing.
42
+ - **Breaking** currency-input: actions and events act only on the first `display`
43
+ target, and a display already focused when the controller connects starts
44
+ formatting at its next ordinary edit or composition end. Render the initial
45
+ hidden and accessible values on the server. `stimeo check` warns about extra
46
+ displays.
47
+ - **Breaking** tabs, calendar, date-range-picker, slider, range-slider,
48
+ color-picker, multi-select, and tags-input read the writing direction from their
49
+ layout targets instead of the root; carousel gains a `pickerList` and
50
+ navigation-menu a `list` target.
51
+ - **Breaking** dirty-form and optimistic accept only the terminal event matching
52
+ the latest start's source and token, and only `success: true` succeeds. For a
53
+ custom save, call `markClean` or dispatch the paired events with `success`.
54
+ - **Breaking** local-time and relative-time read `datetime` strictly: a clock
55
+ without a zone is UTC (relative-time read it as local time), and an incomplete
56
+ or invalid value keeps the current display.
57
+ - **Breaking** presence and typing-indicator templates use `{count}`, `{name}`,
58
+ and `{names}` instead of `%{…}`.
59
+ - **Breaking** modified `Home` / `End` / `PageUp` / `PageDown` go to the browser
60
+ in widgets without a dedicated binding; pointer-drag cancels a keyboard grab
61
+ when focus leaves the handle; time-picker accepts digits typed with `Shift`.
62
+ - **Breaking** progress, meter, pointer-drag, countdown, overflow-menu, listbox,
63
+ submit-once, clipboard, announcer, and currency-input change their ownership
64
+ markers (pointer-drag: `data-stimeo--pointer-drag-tabindex-loan`, listbox:
65
+ `owns-label`); re-render persisted HTML from authored markup. progress and meter
66
+ restore the authored `aria-valuetext` when the template is cleared or the
67
+ controller disconnects.
68
+ - **Breaking** menubar, navigation-menu, menu, and context-menu treat an entry
69
+ inside an `aria-disabled="true"` ancestor as disabled (it stays reachable with
70
+ the arrow keys), and with nested entries refuse an action when any entry holding
71
+ its target is disabled. A click is judged when it reaches the component, so a
72
+ handler inside the component that disables its entry during the click keeps the
73
+ open or close it started; a menubar top it leaves natively `disabled` then has
74
+ its menu closed again, without a `close` event.
75
+ - **Breaking** pointer-drag: `reset()` returns the inline `translate` to the
76
+ origin only when `follow` is on; otherwise it cancels the gesture in flight and
77
+ leaves the author's `translate` alone.
78
+ - toggle-group writes `aria-pressed`, time-picker `aria-valuenow`, and radio-group
79
+ its arrival and release `tabindex` only when the value changes.
80
+ - context-menu: the region contract drops `aria-haspopup`; give the region a role
81
+ and name that fit its content and advertise the key with
82
+ `aria-keyshortcuts="Shift+F10"`.
83
+ - `stimeo check` reports `missing-announcer` for the `stimeo-ui/cable`
84
+ controllers (live-counter, presence, typing-indicator), and the
85
+ `stimeo:install` generator writes commented-out pins and registrations for the
86
+ opt-in `stimeo-ui/cable` and `stimeo-ui/positioning` entry points.
87
+
88
+ ### Removed
89
+
90
+ - character-counter: the `announceTextValueChanged()` callback is gone from the
91
+ shipped types; pending announcements still read the current `announceText`.
92
+
93
+ ### Fixed
94
+
95
+ - IME composition no longer sticks after a page write, a move, or a Turbo morph
96
+ in auto-submit, character-counter, combobox, command-palette, currency-input,
97
+ editable, input-mask, multi-select, number-input, otp, tags-input, and toolbar.
98
+ A morph leaves a field mid-composition alone, and a focused draft survives
99
+ morphs and reconnection.
100
+ - switch, otp, currency-input, and input-mask keep their hidden form values right
101
+ across Turbo morphs and removal.
102
+ - State events and reconciliation stay right when a `change` listener disconnects
103
+ the controller or the page edits state during a repair.
104
+ - Components release what an earlier connection registered when connected twice,
105
+ and keep authored text, ARIA, and tab stops through restores.
106
+ - relative-time follows live `datetime` changes; template substitution leaves
107
+ inherited names such as `{constructor}` unchanged.
108
+ - menubar, navigation-menu, menu, and context-menu refuse a `hidden`, natively
109
+ `disabled`, or `aria-disabled` entry on every route — an explicit element, any
110
+ event, or hover — as a click on it already was; `context-menu#activate` takes
111
+ the optional event.
112
+ - The MCP server accepts JSON-RPC batches in sessions that negotiated protocol
113
+ version 2025-03-26; other versions, and batches before `initialize`, are still
114
+ rejected.
115
+
116
+ ## [0.17.0] - 2026-10-04
117
+
118
+ ### Changed
119
+
120
+ - **Breaking** Replace `reset-before-cache` with `reset-on-restore` (class, export,
121
+ and subpath).
122
+ Reset runs on restoration; remove `dispatchReset` and `:request` bindings.
123
+ Restored drawers and command palettes start closed.
124
+ - **Breaking** Rename calendar, combobox, and command-palette `selectByClick`, and
125
+ tree-view `onClick`, to `select`; replace calendar `selectDayElement` with
126
+ `select(element)`.
127
+ Accordion `toggle`, theme `set`, and scrollspy `scrollTo` require owned targets.
128
+ - **Breaking** State events are silent for unchanged state and superseded pending
129
+ reports.
130
+ For child edits within partial checkbox groups, use the children's native `change`.
131
+ Number Values and action params enforce finite values and their declared domains.
132
+ Update Inspector integrations to schema v15 and run `stimeo check` before deploying.
133
+ - Target actions accept owned elements; user state reports include `detail.reason`.
134
+ Toast duration, persist debounce, and count-up duration changes apply to the next
135
+ operation. Portal destination changes update mounts; Cable params cannot replace
136
+ the declared channel.
137
+
138
+ ### Fixed
139
+
140
+ - Preserve live state across Turbo caching, repair derived state after retained
141
+ morphs, and restore focus reliably across nested layers and Shadow DOM.
142
+
10
143
  ## [0.16.0] - 2026-09-26
11
144
 
12
145
  Minor release with no new components. Widgets now report their own state
@@ -1278,6 +1411,9 @@ Initial public alpha: 101 behavior-only, accessible Stimulus controllers driven
1278
1411
  by `data-*` attributes, shipping no CSS. Published to npm (with provenance) and
1279
1412
  RubyGems.
1280
1413
 
1414
+ [Unreleased]: https://github.com/taiyaky/stimeo-ui/compare/v0.18.0...HEAD
1415
+ [0.18.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.18.0
1416
+ [0.17.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.17.0
1281
1417
  [0.16.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.16.0
1282
1418
  [0.15.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.15.0
1283
1419
  [0.14.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.14.0
package/README.md CHANGED
@@ -15,9 +15,9 @@
15
15
  owns the look entirely.
16
16
 
17
17
  - Lean by design: the **core** needs only `@hotwired/stimulus` at runtime (kept
18
- external in the build). The opt-in `stimeo-ui/positioning` module is the one
19
- exception — it uses `@floating-ui/dom` (an optional **peer dependency**; see the
20
- Peer dependencies note below).
18
+ external in the build). Two opt-in subpaths each add one optional **peer
19
+ dependency**: `stimeo-ui/positioning` (`@floating-ui/dom`) and `stimeo-ui/cable`
20
+ (`@rails/actioncable`); see the Peer dependencies note below.
21
21
  - Accessibility first: every controller follows the relevant WAI-ARIA APG pattern
22
22
  and the related WCAG 2.2 AA criteria.
23
23
  - Public controller identifiers use the `stimeo--` namespace (e.g.
@@ -36,8 +36,12 @@ bin/rails generate stimeo:install
36
36
  ```
37
37
 
38
38
  The generator vendors the prebuilt JS into `vendor/javascript/stimeo/`, pins
39
- `stimeo-ui` in `config/importmap.rb`, and registers all controllers with your
40
- Stimulus application. Then drive components from HTML alone:
39
+ `stimeo-ui` in `config/importmap.rb`, and registers the core controllers with your
40
+ Stimulus application (`app/javascript/controllers/stimeo.js`). It writes the opt-in
41
+ `stimeo-ui/positioning` and `stimeo-ui/cable` entry points into those two files
42
+ commented out; to enable one, uncomment its lines. The cable lines include the pin
43
+ for its `@rails/actioncable` peer; positioning also needs a pin for
44
+ `@floating-ui/dom`. Then drive components from HTML alone:
41
45
 
42
46
  ```erb
43
47
  <div data-controller="stimeo--dropdown">
@@ -58,15 +62,26 @@ import { Application } from "@hotwired/stimulus";
58
62
  import { registerStimeo } from "stimeo-ui";
59
63
 
60
64
  const application = Application.start();
61
- registerStimeo(application); // registers every stimeo--* controller
65
+ registerStimeo(application); // registers every controller of the core entry point
62
66
  ```
63
67
 
68
+ The opt-in `stimeo-ui/positioning` and `stimeo-ui/cable` entry points register
69
+ theirs with `registerPositioning` / `registerCable`.
70
+
64
71
  Need only a few controllers? Import them individually from
65
- `stimeo-ui/controllers/*` and register them under your own identifiers.
72
+ `stimeo-ui/controllers/*` and register them under your own identifiers. Each
73
+ file loads on its own, yet the coordination between components — which layer
74
+ Escape closes, a focus trap's `Tab` and background, the value two components
75
+ lend the same attribute — is kept once per page, whichever files the
76
+ controllers came from, `stimeo-ui` itself included.
77
+ Copies of the same controller also share dirty-form confirmations, highlight
78
+ deadlines and portal origins. Opt-in Cable copies share the consumer, subscriptions
79
+ and peer departure decisions; generated ARIA ids stay distinct across copies too.
66
80
 
67
81
  - **Peer dependencies:** `@hotwired/stimulus` (always), `@floating-ui/dom` (only
68
82
  if you use the opt-in `stimeo-ui/positioning` module — tooltips, popovers, etc.
69
- work without it via the default flow layout).
83
+ work without it via the default flow layout), and `@rails/actioncable` (only if
84
+ you use the opt-in `stimeo-ui/cable` module).
70
85
  - **No CSS is shipped.** Style the components yourself; controllers only toggle
71
86
  ARIA state and `data-*` hooks.
72
87
 
@@ -111,8 +126,9 @@ keep the rules on everywhere else. For Biome:
111
126
  The `eslint-plugin-jsx-a11y` equivalents are
112
127
  `no-noninteractive-element-to-interactive-role`, `no-redundant-roles`,
113
128
  `prefer-tag-over-role`, `interactive-supports-focus`, and
114
- `no-noninteractive-tabindex`. These components' real accessibility is exercised
115
- with axe-core and real screen readers in this project's own test suite.
129
+ `no-noninteractive-tabindex`. This repository's tests check these components
130
+ with axe-core and with a virtual screen reader for speech order; neither stands
131
+ in for a real screen reader on your own pages.
116
132
 
117
133
  ## Composing components
118
134
 
@@ -272,7 +288,7 @@ or in `.mcp.json` (Claude Code) / `.cursor/mcp.json` (Cursor):
272
288
  It exposes four read-only tools — `stimeo_check` (validate a source string),
273
289
  `stimeo_catalog`, `stimeo_controller` (one controller's full contract,
274
290
  accessibility requirements included), and `stimeo_example` (verified example
275
- markup: the official catalog demo under [`examples/`](examples/), bundled at
291
+ markup: the controller's demo under [`examples/`](examples/), bundled at
276
292
  build time and guaranteed to pass the checker) — plus MCP resources
277
293
  (`stimeo://manifest`, `stimeo://examples/<id>`) for preloading context without
278
294
  a tool round-trip. The server reads only its bundled manifest and example
@@ -62,9 +62,10 @@ import { Controller, Application } from '@hotwired/stimulus';
62
62
  * (local-only) counters never disable their triggers. `announceText` is opt-in
63
63
  * and empty by default; when set, reconciled counts reach the page's shared
64
64
  * announcer, debounced so a burst is one message. The subscription follows the
65
- * declaration — a `channel` or `params` change moves it — and is released on
66
- * `disconnect()` (Turbo navigation included) along with any pending
67
- * announcement.
65
+ * declaration — a `channel` or `params` change moves it, once per batch of
66
+ * changes and only when the identifier they name differs from the one it was
67
+ * opened for — and is released on `disconnect()` (Turbo navigation included)
68
+ * along with any pending announcement.
68
69
  */
69
70
  declare class LiveCounterController extends Controller<HTMLElement> {
70
71
  #private;
@@ -96,13 +97,7 @@ declare class LiveCounterController extends Controller<HTMLElement> {
96
97
  paramsValue: string;
97
98
  idValue: string;
98
99
  announceTextValue: string;
99
- /**
100
- * Re-parses the identifier parameters and moves the subscription to the
101
- * identifier they now name.
102
- *
103
- * A malformed declaration falls back to no parameters, so the identifier keeps
104
- * naming the channel instead of the subscription never being created at all.
105
- */
100
+ /** Moves the subscription to the identifier the parameters now name. */
106
101
  paramsValueChanged(): void;
107
102
  /** Moves the subscription when the declaration names a different channel. */
108
103
  channelValueChanged(): void;
@@ -150,7 +145,7 @@ declare class LiveCounterController extends Controller<HTMLElement> {
150
145
  * data-stimeo--presence-channel-value="PresenceChannel"
151
146
  * data-stimeo--presence-params-value='{"room":"doc_7"}'
152
147
  * data-stimeo--presence-id-value="17" data-stimeo--presence-name-value="Alice">
153
- * <span data-stimeo--presence-target="count" data-other="%{count} viewing"></span>
148
+ * <span data-stimeo--presence-target="count" data-other="{count} viewing"></span>
154
149
  * <ul data-stimeo--presence-target="list"></ul>
155
150
  * <template data-stimeo--presence-target="template">
156
151
  * <li><span data-presence-name></span></li>
@@ -174,7 +169,7 @@ declare class LiveCounterController extends Controller<HTMLElement> {
174
169
  * `template` pair, one clone per peer is appended (elements marked
175
170
  * `data-presence-name` receive the name; the clone root is tagged
176
171
  * `data-presence-id`), and the `count` target renders through localizable
177
- * `data-zero` / `data-one` / `data-other` templates (`%{count}`). Richer
172
+ * `data-zero` / `data-one` / `data-other` templates (`{count}`). Richer
178
173
  * per-user rendering (avatars, links) belongs to the consumer via the `join` /
179
174
  * `leave` / `change` events or a server-rendered Turbo Stream. A `template` holds
180
175
  * one root element: the clone appended for a peer, and the node removed when the
@@ -194,9 +189,26 @@ declare class LiveCounterController extends Controller<HTMLElement> {
194
189
  * whatever a Turbo cache snapshot preserved (hooks + rendered clones), renders
195
190
  * the known-empty count (the `data-present*` hooks stay absent until the first
196
191
  * beacon), and the stream re-populates; a `count` or `list` target swapped in by a
197
- * Stream or a morph arrives empty and is drawn from the roster as it connects; the subscription, heartbeat interval,
198
- * per-peer expiry timers, and the `pagehide` listener are all released on
199
- * `disconnect()` (Turbo navigation included).
192
+ * Stream or a morph arrives empty and is drawn from the roster as it connects;
193
+ * the subscription, heartbeat interval, per-peer expiry timers, and the
194
+ * `pagehide` listener are all released on `disconnect()` (Turbo navigation
195
+ * included).
196
+ *
197
+ * The live resources follow the declaration; Values changed together move them
198
+ * once, after the batch, and nothing moves before `connect()` or after
199
+ * `disconnect()`. A `channel` or `params` change moves the subscription: the room
200
+ * being left gets the leaving notice under the same rules as `disconnect()`
201
+ * (confirmed, an own `id`, the last voice for it), and its roster, expiry timers,
202
+ * pending beacon and announcement, throttle window and rejected hook are dropped
203
+ * without an event, as a fresh connection would, since none of them is a fact of
204
+ * the new room. An `id` change keeps the subscription and its roster: the old id's
205
+ * voice is released once (the last voice leaves), the new id beacons at once —
206
+ * which also stands in for a convergence answer still queued — and a peer already
207
+ * listed under the new id is this client now, so it stops being counted without a
208
+ * `leave`: it went nowhere. A `heartbeat` change re-arms the running interval,
209
+ * counted from the change. `timeout` arms each peer's expiry when its beacon
210
+ * arrives, so a change applies from that peer's next beacon and never moves a
211
+ * deadline already set.
200
212
  */
201
213
  declare class PresenceController extends Controller<HTMLElement> {
202
214
  #private;
@@ -235,6 +247,18 @@ declare class PresenceController extends Controller<HTMLElement> {
235
247
  default: string;
236
248
  };
237
249
  };
250
+ static valueConstraints: {
251
+ heartbeat: {
252
+ readonly finite: true;
253
+ readonly exclusiveMin: 0;
254
+ readonly max: 2147483647;
255
+ };
256
+ timeout: {
257
+ readonly finite: true;
258
+ readonly exclusiveMin: 0;
259
+ readonly max: 2147483647;
260
+ };
261
+ };
238
262
  static events: readonly ["join", "leave", "change"];
239
263
  readonly hasCountTarget: boolean;
240
264
  readonly countTarget: HTMLElement;
@@ -250,13 +274,14 @@ declare class PresenceController extends Controller<HTMLElement> {
250
274
  timeoutValue: number;
251
275
  announceJoinTextValue: string;
252
276
  announceLeaveTextValue: string;
253
- /**
254
- * Re-parses the identifier parameters when the declaration changes.
255
- *
256
- * A malformed declaration falls back to no parameters, so the identifier keeps
257
- * naming the channel instead of the subscription never being created at all.
258
- */
277
+ /** Moves the subscription to the declared channel. */
278
+ channelValueChanged(): void;
279
+ /** Moves the subscription to the identifier the parameters name. */
259
280
  paramsValueChanged(): void;
281
+ /** Moves this element's voice to the declared id. */
282
+ idValueChanged(): void;
283
+ /** Re-arms a running heartbeat on the declared period. */
284
+ heartbeatValueChanged(): void;
260
285
  /**
261
286
  * Draws the roster into a list target, which arrives empty from a Turbo Stream
262
287
  * replacement or a morph. Stimulus runs this before `connect()` on the first mount
@@ -264,8 +289,12 @@ declare class PresenceController extends Controller<HTMLElement> {
264
289
  * preserved is what `connect()` goes on to do anyway.
265
290
  */
266
291
  listTargetConnected(): void;
292
+ /** Draws the roster into the list target that stays when an earlier one leaves. */
293
+ listTargetDisconnected(): void;
267
294
  /** Paints the roster size into a count target that arrives blank, for the same reason. */
268
295
  countTargetConnected(): void;
296
+ /** Paints the roster size into the count target that stays when an earlier one leaves. */
297
+ countTargetDisconnected(): void;
269
298
  connect(): void;
270
299
  disconnect(): void;
271
300
  }
@@ -288,7 +317,7 @@ declare class PresenceController extends Controller<HTMLElement> {
288
317
  * data-stimeo--typing-indicator-announce-one-text-value="{name} is typing">
289
318
  * <textarea data-stimeo--typing-indicator-target="input"></textarea>
290
319
  * <p data-stimeo--typing-indicator-target="status"
291
- * data-one="%{name} is typing…" data-many="%{names} are typing…"></p>
320
+ * data-one="{name} is typing…" data-many="{names} are typing…"></p>
292
321
  * </div>
293
322
  *
294
323
  * Server contract (a trivial rebroadcast channel):
@@ -309,8 +338,8 @@ declare class PresenceController extends Controller<HTMLElement> {
309
338
  * @remarks
310
339
  * Behavior only — the indicator's look is the consumer's CSS, keyed off the
311
340
  * `data-typing` hook; the copy is localizable through the `data-one` /
312
- * `data-many` templates (`%{name}` / `%{names}` / `%{count}`, terse English
313
- * fallback — the same channel design as `stimeo--sortable`). The own echo is
341
+ * `data-many` templates (`{name}` / `{names}` / `{count}`), with terse English
342
+ * as the fallback. The own echo is
314
343
  * dropped by comparing the broadcast `name` against `name` (a same-name guard,
315
344
  * not authentication — identity belongs to the server). Sending tracks the full
316
345
  * subscription lifecycle (via the shared confirmation-aware subscription):
@@ -324,6 +353,22 @@ declare class PresenceController extends Controller<HTMLElement> {
324
353
  * from the stream. The subscription, the per-typer timers, and the delegated
325
354
  * `input` listener are all released on `disconnect()` (Turbo navigation
326
355
  * included).
356
+ *
357
+ * The declared `channel` names the subscription: `params` *adds* identifier
358
+ * parameters except `channel`, which is ignored. Without a declared channel
359
+ * nothing is subscribed whatever `params` holds.
360
+ *
361
+ * The subscription follows the declaration: a `channel` or `params` change moves
362
+ * it — once, after the batch, however many of the two changed together, and never
363
+ * before `connect()` or after `disconnect()` — and drops the typers, their expiry
364
+ * timers, a pending announcement, the throttle window and the rejected hook
365
+ * without an event, as a fresh connection would, since none of them is a fact of
366
+ * the new room. A `name` change keeps the subscription and the typers, except one
367
+ * shown under the new name: that is this client now, so it is dropped with its
368
+ * expiry and the display redrawn, without a `change` — it did not stop typing.
369
+ * The own echo is still filtered by the current `name`. `timeout` arms each
370
+ * typer's expiry when its signal arrives, so a change applies from that typer's
371
+ * next signal and never moves a deadline already set.
327
372
  */
328
373
  declare class TypingIndicatorController extends Controller<HTMLElement> {
329
374
  #private;
@@ -358,6 +403,17 @@ declare class TypingIndicatorController extends Controller<HTMLElement> {
358
403
  default: string;
359
404
  };
360
405
  };
406
+ static valueConstraints: {
407
+ timeout: {
408
+ readonly finite: true;
409
+ readonly min: 0;
410
+ readonly max: 2147483647;
411
+ };
412
+ throttle: {
413
+ readonly finite: true;
414
+ readonly min: 0;
415
+ };
416
+ };
361
417
  static events: readonly ["change"];
362
418
  readonly hasStatusTarget: boolean;
363
419
  readonly statusTarget: HTMLElement;
@@ -368,22 +424,23 @@ declare class TypingIndicatorController extends Controller<HTMLElement> {
368
424
  throttleValue: number;
369
425
  announceOneTextValue: string;
370
426
  announceManyTextValue: string;
371
- /**
372
- * Re-parses the identifier parameters when the declaration changes.
373
- *
374
- * A malformed declaration falls back to no parameters, so the identifier keeps
375
- * naming the channel instead of the subscription never being created at all.
376
- */
427
+ /** Moves the subscription to the declared channel. */
428
+ channelValueChanged(): void;
429
+ /** Moves the subscription to the identifier the parameters name. */
377
430
  paramsValueChanged(): void;
431
+ /** Stops showing a typer under the name this client now declares. */
432
+ nameValueChanged(): void;
378
433
  /**
379
434
  * Paints the current copy into a `status` target that arrived at runtime.
380
435
  *
381
436
  * No event: the set of typers did not change, only the element that displays it.
382
437
  * Without this a region swapped in mid-conversation stays empty while `data-typing`
383
438
  * still says someone is typing, leaving the state in the visual hook alone. An empty
384
- * set needs no paint — a fresh region already shows it.
439
+ * set paints the empty copy, so a region that arrives with an old one is cleared.
385
440
  */
386
441
  statusTargetConnected(): void;
442
+ /** Paints the current copy, empty when nobody types, into the `status` target that stays. */
443
+ statusTargetDisconnected(): void;
387
444
  connect(): void;
388
445
  disconnect(): void;
389
446
  }