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,121 +1,275 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/preview_guard_controller.ts
3
+ var ListenerSet = class {
4
+ #abort = new AbortController();
5
+ add(target, type, handler, options) {
6
+ target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
7
+ }
8
+ dispose() {
9
+ this.#abort.abort();
10
+ this.#abort = new AbortController();
11
+ }
12
+ };
4
13
 
5
- // src/utils/before_cache_reset.ts
6
- var BeforeCacheReset = class _BeforeCacheReset {
7
- /** Every subscribed instance, iterated by the one shared document listener. */
8
- static #subscribers = /* @__PURE__ */ new Set();
9
- /** The shared listener; installed while at least one instance is subscribed. */
10
- static #onBeforeCache = () => {
11
- for (const subscriber of _BeforeCacheReset.#subscribers) subscriber.#rewind();
12
- };
13
- #rewind;
14
- /** @param rewind - the pass that returns this controller's state to its initial form. */
15
- constructor(rewind) {
16
- this.#rewind = rewind;
14
+ var MicrotaskCoalescer = class {
15
+ #run;
16
+ #queued = false;
17
+ #active = false;
18
+ #generation = 0;
19
+ constructor(run) {
20
+ this.#run = run;
17
21
  }
18
- /** Subscribes to `turbo:before-cache`; call from `connect()`. Idempotent. */
19
22
  activate() {
20
- const first = _BeforeCacheReset.#subscribers.size === 0;
21
- _BeforeCacheReset.#subscribers.add(this);
22
- if (first) {
23
- document.addEventListener("turbo:before-cache", _BeforeCacheReset.#onBeforeCache);
24
- }
23
+ this.#active = true;
24
+ }
25
+ cancel() {
26
+ this.#active = false;
27
+ this.#queued = false;
28
+ this.#generation += 1;
25
29
  }
26
- /** Unsubscribes; call from `disconnect()`. Safe when never subscribed. */
27
- deactivate() {
28
- _BeforeCacheReset.#subscribers.delete(this);
29
- if (_BeforeCacheReset.#subscribers.size > 0) return;
30
- document.removeEventListener("turbo:before-cache", _BeforeCacheReset.#onBeforeCache);
30
+ get pending() {
31
+ return this.#queued;
32
+ }
33
+ schedule() {
34
+ if (!this.#active || this.#queued) return;
35
+ this.#queued = true;
36
+ const generation = this.#generation;
37
+ queueMicrotask(() => {
38
+ if (generation !== this.#generation || !this.#queued || !this.#active) return;
39
+ this.#queued = false;
40
+ this.#run();
41
+ });
31
42
  }
32
43
  };
33
44
 
34
- // src/utils/style_property_lease.ts
35
- var StylePropertyLease = class {
45
+ var MorphRenderWatcher = class {
46
+ #listeners = new ListenerSet();
47
+ #pass;
48
+ #element = null;
49
+ #onMorph = () => this.#pass.schedule();
50
+ constructor(run) {
51
+ this.#pass = new MicrotaskCoalescer(run);
52
+ }
53
+ observe(element) {
54
+ if (this.#element === element) return;
55
+ this.disconnect();
56
+ this.#element = element;
57
+ this.#pass.activate();
58
+ this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
59
+ }
60
+ schedule() {
61
+ this.#pass.schedule();
62
+ }
63
+ get pending() {
64
+ return this.#pass.pending;
65
+ }
66
+ disconnect() {
67
+ this.#listeners.dispose();
68
+ this.#pass.cancel();
69
+ this.#element = null;
70
+ }
71
+ };
72
+
73
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
74
+ if (element.getAttribute(name) === value) return false;
75
+ if (value === null) element.removeAttribute(name);
76
+ else element.setAttribute(name, value);
77
+ return true;
78
+ }
79
+
80
+ function sharedRegistry(key, create) {
81
+ const symbol = Symbol.for(key);
82
+ const scope = globalThis;
83
+ const existing = scope[symbol];
84
+ if (existing !== void 0) return existing;
85
+ const registry = create();
86
+ Object.defineProperty(globalThis, symbol, { value: registry });
87
+ return registry;
88
+ }
89
+
90
+ var StylePropertyLease = class _StylePropertyLease {
91
+ static #registry = sharedRegistry(
92
+ "stimeo-ui.style-property-lease.registry.v1",
93
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
94
+ );
36
95
  #property;
37
- #records = /* @__PURE__ */ new Map();
38
- /** @param property - The CSS property whose temporary values this lease owns. */
39
- constructor(property) {
96
+ #record;
97
+ #held = /* @__PURE__ */ new Set();
98
+ constructor(property, owner) {
40
99
  this.#property = property;
100
+ this.#record = `data-${owner}-style-${property}-lease`;
101
+ const names = _StylePropertyLease.#registry.names;
102
+ names.set(property, (names.get(property) ?? /* @__PURE__ */ new Set()).add(this.#record));
41
103
  }
42
- /** Writes or removes the leased declaration while preserving its authored value. */
43
104
  write(element, value, priority = "") {
44
- const existing = this.#records.get(element);
45
- if (existing) {
46
- existing.writtenValue = value;
47
- existing.writtenPriority = value === null ? "" : priority;
48
- } else {
49
- this.#records.set(element, {
50
- originalValue: element.style.getPropertyValue(this.#property),
51
- originalPriority: element.style.getPropertyPriority(this.#property),
52
- writtenValue: value,
53
- writtenPriority: value === null ? "" : priority
54
- });
55
- }
56
- this.#reflect(element, value, priority);
105
+ const stack = this.#stack(element);
106
+ const hold = this.#take(stack) ?? this.#acquire(element, stack);
107
+ this.#held.add(element);
108
+ const shows = !this.#covered(element, stack, hold);
109
+ hold.writtenValue = value;
110
+ hold.writtenPriority = value === null ? "" : priority;
111
+ this.#mark(element, stack);
112
+ if (shows) this.#show(element, value, hold.writtenPriority);
57
113
  }
58
- /** Returns one lease without overwriting a later consumer declaration. */
59
114
  return(element) {
60
- const record = this.#records.get(element);
61
- if (!record) return;
62
- this.#records.delete(element);
63
- const style = element.style;
64
- const stillOwned = style.getPropertyValue(this.#property) === (record.writtenValue ?? "") && style.getPropertyPriority(this.#property) === record.writtenPriority;
65
- if (stillOwned) {
66
- this.#reflect(element, record.originalValue, record.originalPriority);
67
- }
115
+ const held = this.#held.delete(element);
116
+ const known = _StylePropertyLease.#registry.stacks.get(element)?.has(this.#property);
117
+ const stack = held || known || element.hasAttribute(this.#record) ? this.#stack(element) : [];
118
+ const hold = this.#take(stack);
119
+ if (!hold) return;
120
+ const owns = this.#carries(element, hold) && !this.#covered(element, stack, hold);
121
+ const index = stack.indexOf(hold);
122
+ stack.splice(index, 1);
123
+ const above = stack[index];
124
+ if (above) above.linked &&= hold.linked;
125
+ this.#mark(element, stack);
126
+ if (!owns) return;
127
+ const below = hold.linked ? stack[index - 1] : void 0;
128
+ if (below) this.#show(element, below.writtenValue, below.writtenPriority);
129
+ else this.#show(element, hold.originalValue, hold.originalPriority);
68
130
  }
69
- /** Returns every outstanding declaration lease. */
70
131
  returnAll() {
71
- for (const element of Array.from(this.#records.keys())) this.return(element);
132
+ for (const element of Array.from(this.#held)) this.return(element);
72
133
  }
73
- /** Reflects only a real declaration transition. */
74
- #reflect(element, value, priority) {
134
+ #recorded(element, name) {
135
+ try {
136
+ const parsed = JSON.parse(element.getAttribute(name) ?? "null");
137
+ if (!Array.isArray(parsed)) return null;
138
+ const [originalValue, originalPriority, writtenValue, writtenPriority, ...rest] = parsed;
139
+ if (typeof originalValue !== "string" || typeof originalPriority !== "string") return null;
140
+ if (typeof writtenValue !== "string" && writtenValue !== null) return null;
141
+ if (typeof writtenPriority !== "string") return null;
142
+ const linked = rest[0] !== false;
143
+ const beneath = linked ? rest : rest.slice(1);
144
+ if (!beneath.every((under) => typeof under === "string")) return null;
145
+ return { originalValue, originalPriority, writtenValue, writtenPriority, linked, beneath };
146
+ } catch {
147
+ return null;
148
+ }
149
+ }
150
+ #stack(element) {
151
+ const stacks = _StylePropertyLease.#registry.stacks;
152
+ const byProperty = stacks.get(element) ?? /* @__PURE__ */ new Map();
153
+ stacks.set(element, byProperty);
154
+ const stack = byProperty.get(this.#property) ?? this.#seed(element);
155
+ byProperty.set(this.#property, stack);
156
+ return stack;
157
+ }
158
+ #seed(element) {
159
+ const found = [];
160
+ for (const record of _StylePropertyLease.#registry.names.get(this.#property) ?? []) {
161
+ const read = this.#recorded(element, record);
162
+ if (read) found.push({ ...read, record });
163
+ }
164
+ const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
165
+ return found.sort((one, other) => depth(one) - depth(other)).map((entry, index) => ({
166
+ lease: null,
167
+ record: entry.record,
168
+ writtenValue: entry.writtenValue,
169
+ writtenPriority: entry.writtenPriority,
170
+ originalValue: entry.originalValue,
171
+ originalPriority: entry.originalPriority,
172
+ linked: entry.linked && index > 0
173
+ }));
174
+ }
175
+ #take(stack) {
176
+ const hold = stack.find((held) => held.lease === this) ?? stack.find((held) => held.lease === null && held.record === this.#record);
177
+ if (hold) hold.lease = this;
178
+ return hold;
179
+ }
180
+ #acquire(element, stack) {
181
+ const top = stack.at(-1);
182
+ const over = top && this.#carries(element, top) ? top : void 0;
75
183
  const style = element.style;
76
- const nextValue = value ?? "";
77
- const nextPriority = value === null ? "" : priority;
78
- if (style.getPropertyValue(this.#property) === nextValue && style.getPropertyPriority(this.#property) === nextPriority) {
79
- return;
184
+ const hold = {
185
+ lease: this,
186
+ record: this.#record,
187
+ writtenValue: null,
188
+ writtenPriority: "",
189
+ originalValue: over ? over.originalValue : style.getPropertyValue(this.#property),
190
+ originalPriority: over ? over.originalPriority : style.getPropertyPriority(this.#property),
191
+ linked: over !== void 0
192
+ };
193
+ stack.push(hold);
194
+ return hold;
195
+ }
196
+ #covered(element, stack, hold) {
197
+ return stack.slice(stack.indexOf(hold) + 1).some((above) => this.#carries(element, above));
198
+ }
199
+ #mark(element, stack) {
200
+ const records = /* @__PURE__ */ new Map([[this.#record, null]]);
201
+ stack.forEach((hold, index) => {
202
+ const names = stack.slice(0, index).map((under) => under.record);
203
+ const beneath = [...new Set(names.reverse())].filter((name) => name !== hold.record);
204
+ const marker = hold.linked || beneath.length === 0 ? [] : [false];
205
+ const { originalValue, originalPriority, writtenValue, writtenPriority } = hold;
206
+ records.set(
207
+ hold.record,
208
+ (writtenValue ?? "") === originalValue && writtenPriority === originalPriority && beneath.length === 0 && index === stack.length - 1 ? null : JSON.stringify([
209
+ originalValue,
210
+ originalPriority,
211
+ writtenValue,
212
+ writtenPriority,
213
+ ...marker,
214
+ ...beneath
215
+ ])
216
+ );
217
+ });
218
+ for (const [name, recorded] of records) {
219
+ setAttributeIfChanged(element, name, recorded);
80
220
  }
81
- if (value === null) style.removeProperty(this.#property);
82
- else style.setProperty(this.#property, value, priority);
221
+ }
222
+ #carries(element, hold) {
223
+ return this.#holds(element, hold.writtenValue ?? "", hold.writtenPriority);
224
+ }
225
+ #holds(element, value, priority) {
226
+ const style = element.style;
227
+ return style.getPropertyValue(this.#property) === value && style.getPropertyPriority(this.#property) === priority;
228
+ }
229
+ #show(element, value, priority) {
230
+ if (this.#holds(element, value ?? "", priority)) return;
231
+ if (value === null) element.style.removeProperty(this.#property);
232
+ else element.style.setProperty(this.#property, value, priority);
83
233
  }
84
234
  };
85
235
 
86
- // src/utils/transient_hooks.ts
87
236
  var TransientHooks = class {
88
237
  #attributes;
89
238
  constructor(options) {
90
239
  this.#attributes = options.attributes;
91
240
  }
92
- /** Drops the declared hooks from `element`; what it carries besides stays. */
93
241
  reset(element) {
94
242
  for (const attribute of this.#attributes) element.removeAttribute(attribute);
95
243
  }
96
244
  };
97
245
 
98
- // src/controllers/preview_guard_controller.ts
99
246
  var TRANSIENT = new TransientHooks({ attributes: ["data-preview-hidden"] });
247
+ var CONTENT_RECORD = "content";
100
248
  var PreviewGuardController = class extends Controller {
101
249
  static values = {
102
250
  placeholder: { type: String, default: "" }
103
251
  };
104
252
  static events = ["hide", "show"];
105
- #visibility = new StylePropertyLease("visibility");
106
- #beforeCache = new BeforeCacheReset(() => this.#restore());
253
+ #visibility = new StylePropertyLease("visibility", this.identifier);
107
254
  #observer = null;
108
255
  #connected = false;
109
256
  #hidden = false;
110
- /** Child nodes a placeholder displaced; non-null marks that content — not visibility — was swapped. */
111
257
  #savedNodes = null;
112
- /** The descendant that held focus when the guard went up, so show can hand it back. */
113
258
  #focused = null;
259
+ #morphRender = new MorphRenderWatcher(() => {
260
+ this.#sync();
261
+ if (this.#hidden) this.#reguard();
262
+ });
114
263
  connect() {
264
+ this.#morphRender.observe(this.element);
115
265
  this.#connected = true;
116
- if (this.#hidden) this.#reguard();
117
- else TRANSIENT.reset(this.element);
118
- this.#beforeCache.activate();
266
+ if (this.#hidden) {
267
+ this.#reguard();
268
+ } else {
269
+ if (this.element.hasAttribute("data-preview-hidden")) this.#restoreRecordedContent();
270
+ this.#visibility.return(this.element);
271
+ TRANSIENT.reset(this.element);
272
+ }
119
273
  if (typeof MutationObserver !== "undefined") {
120
274
  this.#observer = new MutationObserver(() => this.#sync());
121
275
  this.#observer.observe(document.documentElement, {
@@ -126,24 +280,15 @@ var PreviewGuardController = class extends Controller {
126
280
  this.#sync();
127
281
  }
128
282
  disconnect() {
283
+ this.#morphRender.disconnect();
129
284
  this.#connected = false;
130
- this.#beforeCache.deactivate();
131
285
  this.#observer?.disconnect();
132
286
  this.#observer = null;
133
287
  }
134
- /**
135
- * Re-guards to match a `placeholder` changed at runtime — the value is the content on
136
- * display while the guard is up, so a morph that swaps it must not leave the old one.
137
- */
138
288
  placeholderValueChanged() {
139
289
  if (!this.#connected || !this.#hidden) return;
140
290
  this.#reguard();
141
291
  }
142
- /**
143
- * Reflects the current `data-turbo-preview` state onto the element.
144
- *
145
- * @stimeoRenderRoot
146
- */
147
292
  #sync() {
148
293
  const previewing = document.documentElement.hasAttribute("data-turbo-preview");
149
294
  if (previewing && !this.#hidden) this.#hide();
@@ -154,30 +299,33 @@ var PreviewGuardController = class extends Controller {
154
299
  this.#applyGuard();
155
300
  this.dispatch("hide", { detail: {} });
156
301
  }
157
- /** Puts the guard up in the form the current `placeholder` calls for. */
158
302
  #applyGuard() {
159
303
  this.#hidden = true;
160
304
  if (this.placeholderValue === "") {
161
305
  this.#visibility.write(this.element, "hidden");
162
306
  } else {
307
+ this.element.setAttribute(this.#contentRecord, JSON.stringify(this.element.innerHTML));
163
308
  this.#savedNodes = document.createDocumentFragment();
164
309
  this.#savedNodes.append(...this.element.childNodes);
165
310
  this.element.textContent = this.placeholderValue;
166
311
  }
167
312
  this.element.setAttribute("data-preview-hidden", "true");
168
313
  }
169
- /**
170
- * Re-forms a guard that is already up so it matches the current `placeholder`.
171
- *
172
- * No event: `hide` reports that the guard went up, and it has not come down. Swapping
173
- * one stand-in text for another writes only that text — putting the held content back
174
- * first would reconnect the whole subtree for an instant. Only a change of *form* —
175
- * to or from the empty placeholder — has to revert, and the focus the guard is holding
176
- * carries across it rather than being handed back and taken again.
177
- *
178
- * @stimeoRenderRoot
179
- */
314
+ get #contentRecord() {
315
+ return `data-${this.identifier}-${CONTENT_RECORD}`;
316
+ }
317
+ #restoreRecordedContent() {
318
+ const raw = this.element.getAttribute(this.#contentRecord) ?? "null";
319
+ this.element.removeAttribute(this.#contentRecord);
320
+ let content = null;
321
+ try {
322
+ content = JSON.parse(raw);
323
+ } catch {
324
+ }
325
+ if (typeof content === "string") this.element.innerHTML = content;
326
+ }
180
327
  #reguard() {
328
+ this.element.setAttribute("data-preview-hidden", "true");
181
329
  if (this.#savedNodes && this.placeholderValue !== "") {
182
330
  this.element.textContent = this.placeholderValue;
183
331
  return;
@@ -191,46 +339,26 @@ var PreviewGuardController = class extends Controller {
191
339
  this.#restore();
192
340
  this.dispatch("show", { detail: {} });
193
341
  }
194
- /** Reverts the guard and hands focus back. Used by show and by the snapshot rewind. */
195
342
  #restore() {
196
343
  this.#revert();
197
344
  this.#refocus();
198
345
  }
199
- /**
200
- * Puts the element back the way the guard found it.
201
- *
202
- * Every step is a no-op on an element this controller never guarded: the lease returns
203
- * only declarations it recorded, and the hook is removed whether or not it is there.
204
- */
205
346
  #revert() {
206
347
  this.#hidden = false;
207
348
  if (this.#savedNodes) {
208
349
  this.element.textContent = "";
209
350
  this.element.append(this.#savedNodes);
210
351
  this.#savedNodes = null;
352
+ this.element.removeAttribute(this.#contentRecord);
211
353
  } else {
212
354
  this.#visibility.return(this.element);
213
355
  }
214
356
  this.element.removeAttribute("data-preview-hidden");
215
357
  }
216
- /**
217
- * The focused element the guard is about to make unfocusable, if any.
218
- *
219
- * The element itself counts as well as its descendants: guarding takes focus either way
220
- * — a `visibility: hidden` subtree cannot hold it, and a placeholder displaces the nodes
221
- * outright — so the browser drops focus to `<body>` the moment the guard goes up.
222
- */
223
358
  #focusedInside() {
224
359
  const active = document.activeElement;
225
360
  return active instanceof HTMLElement && this.element.contains(active) ? active : null;
226
361
  }
227
- /**
228
- * Hands focus back to the element the guard took it from.
229
- *
230
- * Only when that element is still in the document and focus has not moved on since —
231
- * anything else is the user's or another controller's, and putting it back would be
232
- * taking it.
233
- */
234
362
  #refocus() {
235
363
  const target = this.#focused;
236
364
  this.#focused = null;
@@ -240,5 +368,4 @@ var PreviewGuardController = class extends Controller {
240
368
  };
241
369
 
242
370
  export { PreviewGuardController };
243
- //# sourceMappingURL=preview_guard_controller.js.map
244
371
  //# sourceMappingURL=preview_guard_controller.js.map