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,13 +1,31 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/theme_controller.ts
3
+ var FOCUS_EVENTS = /* @__PURE__ */ new Set(["blur", "focus", "focusin", "focusout"]);
4
+ var POINTER_EVENTS = /* @__PURE__ */ new Set(["mouseenter", "mouseleave", "pointerenter", "pointerleave"]);
5
+ function stateReasonFor(event) {
6
+ if (!event) return "api";
7
+ if (FOCUS_EVENTS.has(event.type)) return "focus";
8
+ if (POINTER_EVENTS.has(event.type)) return "pointer";
9
+ return "user";
10
+ }
11
+
12
+ function actionSource(source) {
13
+ if (source instanceof HTMLElement) {
14
+ return { event: null, host: source, origin: source, reason: "api" };
15
+ }
16
+ const event = source ?? null;
17
+ return {
18
+ event,
19
+ host: event?.currentTarget instanceof Element ? event.currentTarget : null,
20
+ origin: event?.target instanceof Element ? event.target : null,
21
+ reason: stateReasonFor(event)
22
+ };
23
+ }
4
24
 
5
- // src/utils/logical_scroll.ts
6
25
  function isRtl(element) {
7
26
  return window.getComputedStyle(element).direction === "rtl";
8
27
  }
9
28
 
10
- // src/utils/arrow_step.ts
11
29
  function logicalArrowStep(key, element) {
12
30
  if (key === "ArrowDown") return 1;
13
31
  if (key === "ArrowUp") return -1;
@@ -23,7 +41,6 @@ function hasModifierChord(event) {
23
41
  return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
24
42
  }
25
43
 
26
- // src/utils/declared_value.ts
27
44
  function parseDeclared(raw, parse, fallback) {
28
45
  try {
29
46
  return parse(raw);
@@ -43,31 +60,84 @@ function validSelector(element, raw, fallback) {
43
60
  );
44
61
  }
45
62
 
46
- // src/utils/roving_tabindex.ts
63
+ var ListenerSet = class {
64
+ #abort = new AbortController();
65
+ add(target, type, handler, options) {
66
+ target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
67
+ }
68
+ dispose() {
69
+ this.#abort.abort();
70
+ this.#abort = new AbortController();
71
+ }
72
+ };
73
+
74
+ var MicrotaskCoalescer = class {
75
+ #run;
76
+ #queued = false;
77
+ #active = false;
78
+ #generation = 0;
79
+ constructor(run) {
80
+ this.#run = run;
81
+ }
82
+ activate() {
83
+ this.#active = true;
84
+ }
85
+ cancel() {
86
+ this.#active = false;
87
+ this.#queued = false;
88
+ this.#generation += 1;
89
+ }
90
+ get pending() {
91
+ return this.#queued;
92
+ }
93
+ schedule() {
94
+ if (!this.#active || this.#queued) return;
95
+ this.#queued = true;
96
+ const generation = this.#generation;
97
+ queueMicrotask(() => {
98
+ if (generation !== this.#generation || !this.#queued || !this.#active) return;
99
+ this.#queued = false;
100
+ this.#run();
101
+ });
102
+ }
103
+ };
104
+
105
+ var MorphRenderWatcher = class {
106
+ #listeners = new ListenerSet();
107
+ #pass;
108
+ #element = null;
109
+ #onMorph = () => this.#pass.schedule();
110
+ constructor(run) {
111
+ this.#pass = new MicrotaskCoalescer(run);
112
+ }
113
+ observe(element) {
114
+ if (this.#element === element) return;
115
+ this.disconnect();
116
+ this.#element = element;
117
+ this.#pass.activate();
118
+ this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
119
+ }
120
+ schedule() {
121
+ this.#pass.schedule();
122
+ }
123
+ get pending() {
124
+ return this.#pass.pending;
125
+ }
126
+ disconnect() {
127
+ this.#listeners.dispose();
128
+ this.#pass.cancel();
129
+ this.#element = null;
130
+ }
131
+ };
132
+
47
133
  var RovingTabindex = class {
48
- /** Returns the current ordered item elements; called on every operation. */
49
134
  #getItems;
50
- /**
51
- * @param getItems - Returns the current ordered item elements. Called on every
52
- * operation so the live target list is always used.
53
- */
54
135
  constructor(getItems) {
55
136
  this.#getItems = getItems;
56
137
  }
57
- /** Index of the currently tabbable item (`tabindex="0"`), or `-1` if none. */
58
138
  get activeIndex() {
59
139
  return this.#getItems().findIndex((item) => item.tabIndex === 0);
60
140
  }
61
- /**
62
- * Makes exactly the item at `index` tabbable (`tabindex="0"`) and removes every
63
- * other item from the Tab sequence (`tabindex="-1"`). An out-of-range `index`
64
- * (e.g. `-1`) leaves all items at `-1`, which a controller can use to express
65
- * "nothing is currently tabbable".
66
- *
67
- * @param index - Position of the item to make tabbable.
68
- * @param options - Pass `{ focus: true }` to also move DOM focus to that item,
69
- * and `items` to reuse an event-scoped collection snapshot.
70
- */
71
141
  setActive(index, options = {}) {
72
142
  const { focus = false } = options;
73
143
  const items = options.items ?? this.#getItems();
@@ -83,7 +153,6 @@ function rovingMove(current, length, delta, wrap) {
83
153
  return (next + length) % length;
84
154
  }
85
155
 
86
- // src/utils/safe_storage.ts
87
156
  function readLocalStorage(key) {
88
157
  try {
89
158
  return { ok: true, value: window.localStorage.getItem(key) };
@@ -100,7 +169,10 @@ function writeLocalStorage(key, value) {
100
169
  }
101
170
  }
102
171
 
103
- // src/controllers/theme_controller.ts
172
+ function targetSelector(identifier, name) {
173
+ return `[data-${identifier}-target~="${name}"]`;
174
+ }
175
+
104
176
  var MODES = ["light", "dark", "system"];
105
177
  var isMode = (value) => typeof value === "string" && MODES.includes(value);
106
178
  var DEFAULT_MODE = "system";
@@ -114,30 +186,20 @@ var ThemeController = class extends Controller {
114
186
  };
115
187
  static actions = ["set", "toggle"];
116
188
  static events = ["change", "reconcile"];
117
- /** The OS dark-mode query, watched so `system` tracks live changes. */
118
189
  #media = null;
119
- /** Gate for the target and `mode` callbacks, which Stimulus runs before `connect()`. */
190
+ #listeners = new ListenerSet();
120
191
  #connected = false;
121
- /** The `target` declaration after validation; the default when unparsable. */
122
192
  #targetSelector = DEFAULT_TARGET;
123
- /** Owns the single Tab stop across the option set (APG radiogroup). */
193
+ #storageKeyRead = null;
124
194
  #roving = new RovingTabindex(() => this.optionTargets);
125
- /**
126
- * The pair on screen as last reported or re-seeded, so a move can be told from a
127
- * repeat. Neither side is readable after the fact — assigning the Value updates the
128
- * mode before any comparison, and the OS query has already flipped by the time it
129
- * notifies — so what was reported has to be kept rather than recomputed.
130
- */
131
195
  #published = {
132
196
  mode: DEFAULT_MODE,
133
197
  resolved: "light"
134
198
  };
135
- /** Re-resolves while in `system` mode when the OS preference flips. */
136
199
  #onMediaChange = () => {
137
200
  if (this.#mode !== "system") return;
138
- this.#commit();
201
+ this.#commit("media");
139
202
  };
140
- /** Arrow/Home/End navigation for the radiogroup (APG radio pattern). */
141
203
  #onKeydown = (event) => {
142
204
  if (event.defaultPrevented) return;
143
205
  if (isReservedArrowChord(event)) return;
@@ -169,37 +231,32 @@ var ThemeController = class extends Controller {
169
231
  const mode = this.#optionMode(option);
170
232
  if (mode) this.#setMode(mode);
171
233
  };
234
+ #morph = new MorphRenderWatcher(() => {
235
+ this.#applyTheme();
236
+ this.#reconcileControls();
237
+ });
172
238
  connect() {
239
+ this.#morph.observe(this.element);
240
+ this.#storageKeyRead = this.storageKeyValue;
173
241
  const stored = this.#readStored();
174
242
  if (stored) this.modeValue = stored;
175
243
  this.#media = window.matchMedia?.("(prefers-color-scheme: dark)") ?? null;
176
- this.#media?.addEventListener("change", this.#onMediaChange);
177
- this.element.addEventListener("keydown", this.#onKeydown);
244
+ if (this.#media) this.#listeners.add(this.#media, "change", this.#onMediaChange);
245
+ this.#listeners.add(this.element, "keydown", this.#onKeydown);
178
246
  this.#connected = true;
179
247
  this.#applyTheme();
180
248
  this.#syncControls();
181
249
  this.#published = this.#current;
182
250
  }
183
251
  disconnect() {
252
+ this.#morph.disconnect();
184
253
  this.#connected = false;
185
- this.#media?.removeEventListener("change", this.#onMediaChange);
186
- this.element.removeEventListener("keydown", this.#onKeydown);
254
+ this.#listeners.dispose();
187
255
  }
188
- /** Validates the `target` declaration once, so the render path never parses. */
189
256
  targetValueChanged() {
190
257
  this.#targetSelector = validSelector(this.element, this.targetValue, DEFAULT_TARGET);
258
+ this.#morph.schedule();
191
259
  }
192
- /**
193
- * Re-renders for a `mode` declaration changed after connect — a Turbo morph
194
- * re-rendering the server's markup over the live element, or a script.
195
- *
196
- * A stored choice outranks the declaration: a Value that disagrees with it is written
197
- * back to it, so a morph that brings the server's default never overrides what the
198
- * user saved. Without one, the declaration is applied. Either way storage is left
199
- * alone, and a pair on screen that moved is reported as `reconcile`, not `change` —
200
- * the page moved the declaration, not a selection. The reported pair is re-seeded
201
- * first, so the next selection is compared with what is on screen.
202
- */
203
260
  modeValueChanged() {
204
261
  if (!this.#connected) return;
205
262
  if (this.modeValue === this.#published.mode) return;
@@ -208,67 +265,53 @@ var ThemeController = class extends Controller {
208
265
  this.#applyTheme();
209
266
  this.#reconcileControls();
210
267
  }
211
- /** Re-derives the single Tab stop and ARIA for an option set that changed. */
268
+ storageKeyValueChanged() {
269
+ if (!this.#connected) return;
270
+ const key = this.storageKeyValue;
271
+ if (key === this.#storageKeyRead) return;
272
+ this.#storageKeyRead = key;
273
+ const stored = this.#readStored();
274
+ if (stored === null || stored === this.modeValue) return;
275
+ this.modeValue = stored;
276
+ this.#applyTheme();
277
+ this.#reconcileControls();
278
+ }
212
279
  optionTargetConnected() {
213
- if (this.#connected) this.#reconcileControls();
280
+ if (this.#connected) this.#morph.schedule();
214
281
  }
215
- /** Re-derives them again when an option leaves, so a Tab stop always remains. */
216
282
  optionTargetDisconnected() {
217
- if (this.#connected) this.#reconcileControls();
218
- }
219
- /**
220
- * Selects the mode the activated option declares.
221
- *
222
- * Read through the same lane that decides which option is checked, so the two
223
- * can never disagree about what an option declares.
224
- */
225
- set(event) {
226
- const option = event.currentTarget;
227
- if (!(option instanceof HTMLElement)) return;
283
+ if (this.#connected) this.#morph.schedule();
284
+ }
285
+ set(source) {
286
+ const { host, origin, reason } = actionSource(source);
287
+ const option = host?.closest(targetSelector(this.identifier, "option"));
288
+ if (!option || !this.optionTargets.includes(option)) return;
289
+ if (origin && origin.closest(`[data-controller~="${this.identifier}"]`) !== this.element)
290
+ return;
228
291
  const mode = this.#optionMode(option);
229
- if (mode) this.#setMode(mode);
292
+ if (mode) this.#setMode(mode, reason);
230
293
  }
231
- /** Toggles light↔dark for the 2-value single-button contract. */
232
- toggle() {
233
- this.#setMode(this.#resolved() === "dark" ? "light" : "dark");
294
+ toggle(event) {
295
+ const mode = this.#readStored() ?? this.#mode;
296
+ const dark = mode === "dark" || mode === "system" && this.#media?.matches === true;
297
+ this.#setMode(dark ? "light" : "dark", stateReasonFor(event));
234
298
  }
235
- /** Central mode change: persist, apply to the root, resync controls, announce. */
236
- #setMode(mode) {
299
+ #setMode(mode, reason = "user") {
237
300
  this.modeValue = mode;
238
301
  this.#writeStored(mode);
239
- this.#commit();
240
- }
241
- /**
242
- * Applies the current mode and reports it, but reports only a real move: the
243
- * event means "the selection or the effective theme moved", so re-choosing the
244
- * option already chosen is not one.
245
- */
246
- #commit() {
302
+ this.#commit(reason);
303
+ }
304
+ #commit(reason) {
247
305
  this.#applyTheme();
248
306
  this.#syncControls();
249
307
  const moved = this.#settle();
250
- if (moved) this.dispatch("change", { detail: moved });
251
- }
252
- /**
253
- * Re-derives the controls from the mode on screen for a change the page made — a
254
- * `mode` declaration or an option set — and reports a pair that moved since the
255
- * last report as `reconcile`. An option coming or going moves neither half of the
256
- * pair, so of these changes only a declaration reports.
257
- */
308
+ if (moved) this.dispatch("change", { detail: { ...moved, reason } });
309
+ }
258
310
  #reconcileControls() {
259
311
  this.#syncControls();
260
312
  const moved = this.#settle();
261
313
  if (moved) this.dispatch("reconcile", { detail: moved });
262
314
  }
263
- /**
264
- * Takes the pair on screen as the reported one and returns it when it differs
265
- * from the one reported before, or `null` when neither half moved.
266
- *
267
- * The baseline moves before anything is dispatched, so a listener that selects
268
- * another mode is measured from the pair it was just told about. What is
269
- * returned is a copy: the baseline has to survive a listener that writes to what
270
- * it was handed, or the next unchanged operation reads as a move.
271
- */
272
315
  #settle() {
273
316
  const next = this.#current;
274
317
  const last = this.#published;
@@ -276,15 +319,9 @@ var ThemeController = class extends Controller {
276
319
  if (last.mode === next.mode && last.resolved === next.resolved) return null;
277
320
  return { ...next };
278
321
  }
279
- /** The pair the `change` and `reconcile` details carry, read from current state. */
280
322
  get #current() {
281
323
  return { mode: this.#mode, resolved: this.#resolved() };
282
324
  }
283
- /**
284
- * Writes `data-theme` + `color-scheme` (the resolved theme) onto the target.
285
- *
286
- * @stimeoRenderRoot
287
- */
288
325
  #applyTheme() {
289
326
  const root = this.#targetElement();
290
327
  if (!root) return;
@@ -292,11 +329,6 @@ var ThemeController = class extends Controller {
292
329
  root.setAttribute("data-theme", resolved);
293
330
  root.style.setProperty("color-scheme", resolved);
294
331
  }
295
- /**
296
- * Keeps the radiogroup (aria-checked + roving tabindex) or toggle (aria-pressed) in sync.
297
- *
298
- * @stimeoRenderRoot
299
- */
300
332
  #syncControls() {
301
333
  const options = this.optionTargets;
302
334
  if (options.length > 0) {
@@ -314,43 +346,35 @@ var ThemeController = class extends Controller {
314
346
  this.element.setAttribute("aria-pressed", String(this.#resolved() === "dark"));
315
347
  }
316
348
  }
317
- /** Whether the controller element is the button of the 2-value contract. */
318
349
  get #isToggleButton() {
319
350
  return this.element.tagName === "BUTTON" || this.element.getAttribute("role") === "button";
320
351
  }
321
- /** The selected mode after validation; an unreadable declaration is the default. */
322
352
  get #mode() {
323
353
  return isMode(this.modeValue) ? this.modeValue : DEFAULT_MODE;
324
354
  }
325
- /** The effective theme: the OS preference when `system`, else the mode itself. */
326
355
  #resolved() {
327
356
  const mode = this.#mode;
328
357
  if (mode === "dark") return "dark";
329
358
  if (mode === "light") return "light";
330
359
  return this.#media?.matches ? "dark" : "light";
331
360
  }
332
- /** An option's mode from its `data-value`, or `null` when that is not one of the three. */
333
361
  #optionMode(option) {
334
362
  const mode = option.getAttribute("data-value");
335
363
  return isMode(mode) ? mode : null;
336
364
  }
337
- /** Resolves the state-hook target (`<html>` by default). */
338
365
  #targetElement() {
339
366
  const selector = this.#targetSelector;
340
367
  if (selector === DEFAULT_TARGET || selector === ":root") return document.documentElement;
341
368
  return document.querySelector(selector);
342
369
  }
343
- /** Reads a persisted, validated mode from `localStorage` (null when absent/blocked). */
344
370
  #readStored() {
345
371
  const result = readLocalStorage(this.storageKeyValue);
346
372
  return result.ok && isMode(result.value) ? result.value : null;
347
373
  }
348
- /** Persists the mode, swallowing storage errors (private mode / quota). */
349
374
  #writeStored(mode) {
350
375
  writeLocalStorage(this.storageKeyValue, mode);
351
376
  }
352
377
  };
353
378
 
354
379
  export { ThemeController };
355
- //# sourceMappingURL=theme_controller.js.map
356
380
  //# sourceMappingURL=theme_controller.js.map