stimeo-ui 0.16.0 → 0.17.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 (328) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +8 -1
  3. package/dist/cable/index.d.ts +79 -23
  4. package/dist/cable/index.js +363 -436
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/controllers/accordion_controller.d.ts +4 -2
  7. package/dist/controllers/accordion_controller.js +166 -55
  8. package/dist/controllers/accordion_controller.js.map +1 -1
  9. package/dist/controllers/alert_dialog_controller.d.ts +12 -2
  10. package/dist/controllers/alert_dialog_controller.js +862 -221
  11. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  12. package/dist/controllers/announcer_controller.d.ts +35 -5
  13. package/dist/controllers/announcer_controller.js +135 -198
  14. package/dist/controllers/announcer_controller.js.map +1 -1
  15. package/dist/controllers/aspect_ratio_controller.js +0 -10
  16. package/dist/controllers/aspect_ratio_controller.js.map +1 -1
  17. package/dist/controllers/auto_submit_controller.d.ts +30 -6
  18. package/dist/controllers/auto_submit_controller.js +271 -127
  19. package/dist/controllers/auto_submit_controller.js.map +1 -1
  20. package/dist/controllers/avatar_controller.js +171 -105
  21. package/dist/controllers/avatar_controller.js.map +1 -1
  22. package/dist/controllers/breadcrumb_controller.js +0 -130
  23. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  24. package/dist/controllers/bulk_select_controller.d.ts +18 -0
  25. package/dist/controllers/bulk_select_controller.js +262 -52
  26. package/dist/controllers/bulk_select_controller.js.map +1 -1
  27. package/dist/controllers/calendar_controller.d.ts +24 -5
  28. package/dist/controllers/calendar_controller.js +175 -209
  29. package/dist/controllers/calendar_controller.js.map +1 -1
  30. package/dist/controllers/carousel_controller.d.ts +34 -7
  31. package/dist/controllers/carousel_controller.js +461 -399
  32. package/dist/controllers/carousel_controller.js.map +1 -1
  33. package/dist/controllers/character_counter_controller.d.ts +17 -1
  34. package/dist/controllers/character_counter_controller.js +246 -156
  35. package/dist/controllers/character_counter_controller.js.map +1 -1
  36. package/dist/controllers/checkbox_controller.d.ts +7 -2
  37. package/dist/controllers/checkbox_controller.js +32 -74
  38. package/dist/controllers/checkbox_controller.js.map +1 -1
  39. package/dist/controllers/clipboard_controller.d.ts +16 -5
  40. package/dist/controllers/clipboard_controller.js +168 -147
  41. package/dist/controllers/clipboard_controller.js.map +1 -1
  42. package/dist/controllers/collapsible_controller.d.ts +16 -4
  43. package/dist/controllers/collapsible_controller.js +301 -120
  44. package/dist/controllers/collapsible_controller.js.map +1 -1
  45. package/dist/controllers/color_picker_controller.d.ts +18 -6
  46. package/dist/controllers/color_picker_controller.js +149 -139
  47. package/dist/controllers/color_picker_controller.js.map +1 -1
  48. package/dist/controllers/combobox_controller.d.ts +23 -5
  49. package/dist/controllers/combobox_controller.js +360 -133
  50. package/dist/controllers/combobox_controller.js.map +1 -1
  51. package/dist/controllers/command_palette_controller.d.ts +45 -14
  52. package/dist/controllers/command_palette_controller.js +970 -358
  53. package/dist/controllers/command_palette_controller.js.map +1 -1
  54. package/dist/controllers/conditional_fields_controller.d.ts +15 -2
  55. package/dist/controllers/conditional_fields_controller.js +166 -124
  56. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  57. package/dist/controllers/confirm_controller.d.ts +49 -12
  58. package/dist/controllers/confirm_controller.js +939 -248
  59. package/dist/controllers/confirm_controller.js.map +1 -1
  60. package/dist/controllers/context_menu_controller.d.ts +31 -4
  61. package/dist/controllers/context_menu_controller.js +256 -128
  62. package/dist/controllers/context_menu_controller.js.map +1 -1
  63. package/dist/controllers/count_up_controller.d.ts +13 -1
  64. package/dist/controllers/count_up_controller.js +73 -21
  65. package/dist/controllers/count_up_controller.js.map +1 -1
  66. package/dist/controllers/countdown_controller.d.ts +45 -1
  67. package/dist/controllers/countdown_controller.js +183 -148
  68. package/dist/controllers/countdown_controller.js.map +1 -1
  69. package/dist/controllers/currency_input_controller.d.ts +21 -2
  70. package/dist/controllers/currency_input_controller.js +134 -158
  71. package/dist/controllers/currency_input_controller.js.map +1 -1
  72. package/dist/controllers/data_grid_controller.d.ts +15 -4
  73. package/dist/controllers/data_grid_controller.js +114 -186
  74. package/dist/controllers/data_grid_controller.js.map +1 -1
  75. package/dist/controllers/date_range_picker_controller.d.ts +30 -5
  76. package/dist/controllers/date_range_picker_controller.js +288 -206
  77. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  78. package/dist/controllers/dialog_controller.d.ts +13 -1
  79. package/dist/controllers/dialog_controller.js +858 -223
  80. package/dist/controllers/dialog_controller.js.map +1 -1
  81. package/dist/controllers/direct_upload_controller.d.ts +24 -7
  82. package/dist/controllers/direct_upload_controller.js +73 -153
  83. package/dist/controllers/direct_upload_controller.js.map +1 -1
  84. package/dist/controllers/dirty_form_controller.js +14 -48
  85. package/dist/controllers/dirty_form_controller.js.map +1 -1
  86. package/dist/controllers/dismissible_controller.d.ts +19 -0
  87. package/dist/controllers/dismissible_controller.js +175 -21
  88. package/dist/controllers/dismissible_controller.js.map +1 -1
  89. package/dist/controllers/drawer_controller.d.ts +39 -11
  90. package/dist/controllers/drawer_controller.js +933 -341
  91. package/dist/controllers/drawer_controller.js.map +1 -1
  92. package/dist/controllers/dropdown_controller.d.ts +31 -1
  93. package/dist/controllers/dropdown_controller.js +312 -82
  94. package/dist/controllers/dropdown_controller.js.map +1 -1
  95. package/dist/controllers/editable_controller.d.ts +12 -1
  96. package/dist/controllers/editable_controller.js +158 -68
  97. package/dist/controllers/editable_controller.js.map +1 -1
  98. package/dist/controllers/empty_state_controller.js +67 -53
  99. package/dist/controllers/empty_state_controller.js.map +1 -1
  100. package/dist/controllers/file_dropzone_controller.d.ts +60 -18
  101. package/dist/controllers/file_dropzone_controller.js +311 -207
  102. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  103. package/dist/controllers/filter_controller.js +67 -39
  104. package/dist/controllers/filter_controller.js.map +1 -1
  105. package/dist/controllers/flash_controller.d.ts +31 -8
  106. package/dist/controllers/flash_controller.js +172 -314
  107. package/dist/controllers/flash_controller.js.map +1 -1
  108. package/dist/controllers/focus_controller.d.ts +12 -3
  109. package/dist/controllers/focus_controller.js +654 -240
  110. package/dist/controllers/focus_controller.js.map +1 -1
  111. package/dist/controllers/form_field_controller.js +147 -132
  112. package/dist/controllers/form_field_controller.js.map +1 -1
  113. package/dist/controllers/form_validation_controller.js +13 -86
  114. package/dist/controllers/form_validation_controller.js.map +1 -1
  115. package/dist/controllers/frame_loading_controller.d.ts +41 -9
  116. package/dist/controllers/frame_loading_controller.js +264 -213
  117. package/dist/controllers/frame_loading_controller.js.map +1 -1
  118. package/dist/controllers/highlight_controller.d.ts +22 -2
  119. package/dist/controllers/highlight_controller.js +107 -75
  120. package/dist/controllers/highlight_controller.js.map +1 -1
  121. package/dist/controllers/hover_card_controller.d.ts +56 -3
  122. package/dist/controllers/hover_card_controller.js +309 -118
  123. package/dist/controllers/hover_card_controller.js.map +1 -1
  124. package/dist/controllers/idle_controller.d.ts +42 -1
  125. package/dist/controllers/idle_controller.js +267 -101
  126. package/dist/controllers/idle_controller.js.map +1 -1
  127. package/dist/controllers/input_mask_controller.js +71 -72
  128. package/dist/controllers/input_mask_controller.js.map +1 -1
  129. package/dist/controllers/intersection_controller.d.ts +32 -13
  130. package/dist/controllers/intersection_controller.js +147 -106
  131. package/dist/controllers/intersection_controller.js.map +1 -1
  132. package/dist/controllers/lazy_frame_controller.d.ts +16 -0
  133. package/dist/controllers/lazy_frame_controller.js +9 -65
  134. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  135. package/dist/controllers/listbox_controller.d.ts +34 -2
  136. package/dist/controllers/listbox_controller.js +306 -204
  137. package/dist/controllers/listbox_controller.js.map +1 -1
  138. package/dist/controllers/local_time_controller.d.ts +1 -1
  139. package/dist/controllers/local_time_controller.js +54 -64
  140. package/dist/controllers/local_time_controller.js.map +1 -1
  141. package/dist/controllers/masonry_controller.d.ts +11 -3
  142. package/dist/controllers/masonry_controller.js +70 -93
  143. package/dist/controllers/masonry_controller.js.map +1 -1
  144. package/dist/controllers/menu_controller.d.ts +32 -7
  145. package/dist/controllers/menu_controller.js +214 -156
  146. package/dist/controllers/menu_controller.js.map +1 -1
  147. package/dist/controllers/menubar_controller.d.ts +4 -4
  148. package/dist/controllers/menubar_controller.js +170 -329
  149. package/dist/controllers/menubar_controller.js.map +1 -1
  150. package/dist/controllers/meter_controller.d.ts +20 -0
  151. package/dist/controllers/meter_controller.js +151 -67
  152. package/dist/controllers/meter_controller.js.map +1 -1
  153. package/dist/controllers/multi_select_controller.d.ts +32 -4
  154. package/dist/controllers/multi_select_controller.js +593 -358
  155. package/dist/controllers/multi_select_controller.js.map +1 -1
  156. package/dist/controllers/navigation_menu_controller.d.ts +8 -1
  157. package/dist/controllers/navigation_menu_controller.js +124 -232
  158. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  159. package/dist/controllers/nested_form_controller.d.ts +10 -0
  160. package/dist/controllers/nested_form_controller.js +352 -182
  161. package/dist/controllers/nested_form_controller.js.map +1 -1
  162. package/dist/controllers/network_status_controller.d.ts +23 -0
  163. package/dist/controllers/network_status_controller.js +242 -54
  164. package/dist/controllers/network_status_controller.js.map +1 -1
  165. package/dist/controllers/number_input_controller.d.ts +26 -2
  166. package/dist/controllers/number_input_controller.js +320 -263
  167. package/dist/controllers/number_input_controller.js.map +1 -1
  168. package/dist/controllers/optimistic_controller.js +16 -76
  169. package/dist/controllers/optimistic_controller.js.map +1 -1
  170. package/dist/controllers/otp_controller.d.ts +20 -4
  171. package/dist/controllers/otp_controller.js +198 -193
  172. package/dist/controllers/otp_controller.js.map +1 -1
  173. package/dist/controllers/overflow_indicator_controller.d.ts +5 -0
  174. package/dist/controllers/overflow_indicator_controller.js +116 -113
  175. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  176. package/dist/controllers/overflow_menu_controller.d.ts +48 -11
  177. package/dist/controllers/overflow_menu_controller.js +343 -283
  178. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  179. package/dist/controllers/pagination_controller.d.ts +35 -6
  180. package/dist/controllers/pagination_controller.js +295 -119
  181. package/dist/controllers/pagination_controller.js.map +1 -1
  182. package/dist/controllers/password_reveal_controller.d.ts +45 -8
  183. package/dist/controllers/password_reveal_controller.js +389 -121
  184. package/dist/controllers/password_reveal_controller.js.map +1 -1
  185. package/dist/controllers/password_strength_controller.d.ts +14 -5
  186. package/dist/controllers/password_strength_controller.js +99 -153
  187. package/dist/controllers/password_strength_controller.js.map +1 -1
  188. package/dist/controllers/persist_controller.d.ts +11 -4
  189. package/dist/controllers/persist_controller.js +237 -103
  190. package/dist/controllers/persist_controller.js.map +1 -1
  191. package/dist/controllers/pointer_drag_controller.d.ts +19 -7
  192. package/dist/controllers/pointer_drag_controller.js +185 -165
  193. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  194. package/dist/controllers/popover_controller.d.ts +38 -2
  195. package/dist/controllers/popover_controller.js +236 -97
  196. package/dist/controllers/popover_controller.js.map +1 -1
  197. package/dist/controllers/portal_controller.d.ts +44 -4
  198. package/dist/controllers/portal_controller.js +209 -76
  199. package/dist/controllers/portal_controller.js.map +1 -1
  200. package/dist/controllers/preview_guard_controller.d.ts +10 -4
  201. package/dist/controllers/preview_guard_controller.js +232 -116
  202. package/dist/controllers/preview_guard_controller.js.map +1 -1
  203. package/dist/controllers/progress_controller.d.ts +11 -0
  204. package/dist/controllers/progress_controller.js +125 -56
  205. package/dist/controllers/progress_controller.js.map +1 -1
  206. package/dist/controllers/radio_group_controller.d.ts +14 -5
  207. package/dist/controllers/radio_group_controller.js +117 -137
  208. package/dist/controllers/radio_group_controller.js.map +1 -1
  209. package/dist/controllers/range_slider_controller.d.ts +43 -3
  210. package/dist/controllers/range_slider_controller.js +192 -105
  211. package/dist/controllers/range_slider_controller.js.map +1 -1
  212. package/dist/controllers/rating_controller.d.ts +20 -4
  213. package/dist/controllers/rating_controller.js +418 -207
  214. package/dist/controllers/rating_controller.js.map +1 -1
  215. package/dist/controllers/read_more_controller.d.ts +2 -0
  216. package/dist/controllers/read_more_controller.js +134 -63
  217. package/dist/controllers/read_more_controller.js.map +1 -1
  218. package/dist/controllers/reading_progress_controller.d.ts +1 -1
  219. package/dist/controllers/reading_progress_controller.js +147 -135
  220. package/dist/controllers/reading_progress_controller.js.map +1 -1
  221. package/dist/controllers/relative_time_controller.d.ts +18 -4
  222. package/dist/controllers/relative_time_controller.js +145 -110
  223. package/dist/controllers/relative_time_controller.js.map +1 -1
  224. package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
  225. package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +97 -38
  226. package/dist/controllers/reset_on_restore_controller.js.map +1 -0
  227. package/dist/controllers/resizable_controller.d.ts +28 -2
  228. package/dist/controllers/resizable_controller.js +255 -139
  229. package/dist/controllers/resizable_controller.js.map +1 -1
  230. package/dist/controllers/roving_controller.js +39 -84
  231. package/dist/controllers/roving_controller.js.map +1 -1
  232. package/dist/controllers/scroll_area_controller.d.ts +7 -3
  233. package/dist/controllers/scroll_area_controller.js +428 -225
  234. package/dist/controllers/scroll_area_controller.js.map +1 -1
  235. package/dist/controllers/scroll_restore_controller.js +0 -53
  236. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  237. package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
  238. package/dist/controllers/scroll_visibility_controller.js +395 -145
  239. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  240. package/dist/controllers/scrollspy_controller.d.ts +6 -1
  241. package/dist/controllers/scrollspy_controller.js +181 -242
  242. package/dist/controllers/scrollspy_controller.js.map +1 -1
  243. package/dist/controllers/separator_controller.d.ts +19 -4
  244. package/dist/controllers/separator_controller.js +267 -140
  245. package/dist/controllers/separator_controller.js.map +1 -1
  246. package/dist/controllers/sidebar_controller.d.ts +64 -7
  247. package/dist/controllers/sidebar_controller.js +1023 -386
  248. package/dist/controllers/sidebar_controller.js.map +1 -1
  249. package/dist/controllers/skeleton_controller.d.ts +23 -0
  250. package/dist/controllers/skeleton_controller.js +248 -97
  251. package/dist/controllers/skeleton_controller.js.map +1 -1
  252. package/dist/controllers/slider_controller.d.ts +27 -1
  253. package/dist/controllers/slider_controller.js +159 -79
  254. package/dist/controllers/slider_controller.js.map +1 -1
  255. package/dist/controllers/smart_sticky_header_controller.d.ts +21 -3
  256. package/dist/controllers/smart_sticky_header_controller.js +162 -63
  257. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  258. package/dist/controllers/sortable_controller.js +0 -112
  259. package/dist/controllers/sortable_controller.js.map +1 -1
  260. package/dist/controllers/spinner_controller.d.ts +39 -4
  261. package/dist/controllers/spinner_controller.js +277 -169
  262. package/dist/controllers/spinner_controller.js.map +1 -1
  263. package/dist/controllers/step_indicator_controller.d.ts +5 -0
  264. package/dist/controllers/step_indicator_controller.js +99 -46
  265. package/dist/controllers/step_indicator_controller.js.map +1 -1
  266. package/dist/controllers/stepper_controller.d.ts +12 -3
  267. package/dist/controllers/stepper_controller.js +114 -73
  268. package/dist/controllers/stepper_controller.js.map +1 -1
  269. package/dist/controllers/stick_to_bottom_controller.d.ts +6 -0
  270. package/dist/controllers/stick_to_bottom_controller.js +262 -138
  271. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  272. package/dist/controllers/sticky_observer_controller.d.ts +11 -0
  273. package/dist/controllers/sticky_observer_controller.js +214 -49
  274. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  275. package/dist/controllers/submit_once_controller.d.ts +23 -8
  276. package/dist/controllers/submit_once_controller.js +294 -205
  277. package/dist/controllers/submit_once_controller.js.map +1 -1
  278. package/dist/controllers/switch_controller.d.ts +12 -1
  279. package/dist/controllers/switch_controller.js +33 -60
  280. package/dist/controllers/switch_controller.js.map +1 -1
  281. package/dist/controllers/tabs_controller.d.ts +2 -2
  282. package/dist/controllers/tabs_controller.js +35 -29
  283. package/dist/controllers/tabs_controller.js.map +1 -1
  284. package/dist/controllers/tags_input_controller.d.ts +12 -0
  285. package/dist/controllers/tags_input_controller.js +136 -145
  286. package/dist/controllers/tags_input_controller.js.map +1 -1
  287. package/dist/controllers/textarea_autosize_controller.d.ts +10 -0
  288. package/dist/controllers/textarea_autosize_controller.js +71 -58
  289. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  290. package/dist/controllers/theme_controller.d.ts +21 -9
  291. package/dist/controllers/theme_controller.js +130 -112
  292. package/dist/controllers/theme_controller.js.map +1 -1
  293. package/dist/controllers/time_picker_controller.d.ts +18 -1
  294. package/dist/controllers/time_picker_controller.js +146 -80
  295. package/dist/controllers/time_picker_controller.js.map +1 -1
  296. package/dist/controllers/toast_controller.d.ts +36 -11
  297. package/dist/controllers/toast_controller.js +186 -297
  298. package/dist/controllers/toast_controller.js.map +1 -1
  299. package/dist/controllers/toggle_group_controller.d.ts +12 -3
  300. package/dist/controllers/toggle_group_controller.js +95 -136
  301. package/dist/controllers/toggle_group_controller.js.map +1 -1
  302. package/dist/controllers/toolbar_controller.js +68 -98
  303. package/dist/controllers/toolbar_controller.js.map +1 -1
  304. package/dist/controllers/tooltip_controller.d.ts +45 -3
  305. package/dist/controllers/tooltip_controller.js +158 -124
  306. package/dist/controllers/tooltip_controller.js.map +1 -1
  307. package/dist/controllers/transition_controller.d.ts +22 -4
  308. package/dist/controllers/transition_controller.js +123 -119
  309. package/dist/controllers/transition_controller.js.map +1 -1
  310. package/dist/controllers/tree_view_controller.d.ts +21 -11
  311. package/dist/controllers/tree_view_controller.js +150 -345
  312. package/dist/controllers/tree_view_controller.js.map +1 -1
  313. package/dist/index.d.ts +8 -5
  314. package/dist/index.js +6370 -9346
  315. package/dist/index.js.map +1 -1
  316. package/dist/inspector/cli.d.ts +23 -3
  317. package/dist/inspector/cli.js +92 -37
  318. package/dist/inspector/cli.js.map +1 -1
  319. package/dist/inspector/cli_bin.js +92 -56
  320. package/dist/inspector/cli_bin.js.map +1 -1
  321. package/dist/inspector/examples.json +8 -8
  322. package/dist/inspector/manifest.json +787 -100
  323. package/dist/positioning/index.d.ts +8 -0
  324. package/dist/positioning/index.js +148 -47
  325. package/dist/positioning/index.js.map +1 -1
  326. package/package.json +6 -6
  327. package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
  328. package/dist/controllers/reset_before_cache_controller.js.map +0 -1
@@ -1,121 +1,264 @@
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
+ schedule() {
31
+ if (!this.#active || this.#queued) return;
32
+ this.#queued = true;
33
+ const generation = this.#generation;
34
+ queueMicrotask(() => {
35
+ if (generation !== this.#generation || !this.#queued || !this.#active) return;
36
+ this.#queued = false;
37
+ this.#run();
38
+ });
31
39
  }
32
40
  };
33
41
 
34
- // src/utils/style_property_lease.ts
35
- var StylePropertyLease = class {
42
+ var MorphRenderWatcher = class {
43
+ #listeners = new ListenerSet();
44
+ #pass;
45
+ #element = null;
46
+ #onMorph = () => this.#pass.schedule();
47
+ constructor(run) {
48
+ this.#pass = new MicrotaskCoalescer(run);
49
+ }
50
+ observe(element) {
51
+ if (this.#element === element) return;
52
+ this.disconnect();
53
+ this.#element = element;
54
+ this.#pass.activate();
55
+ this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
56
+ }
57
+ schedule() {
58
+ this.#pass.schedule();
59
+ }
60
+ disconnect() {
61
+ this.#listeners.dispose();
62
+ this.#pass.cancel();
63
+ this.#element = null;
64
+ }
65
+ };
66
+
67
+ function sharedRegistry(key, create) {
68
+ const symbol = Symbol.for(key);
69
+ const scope = globalThis;
70
+ const existing = scope[symbol];
71
+ if (existing !== void 0) return existing;
72
+ const registry = create();
73
+ Object.defineProperty(globalThis, symbol, { value: registry });
74
+ return registry;
75
+ }
76
+
77
+ var StylePropertyLease = class _StylePropertyLease {
78
+ static #registry = sharedRegistry(
79
+ "stimeo-ui.style-property-lease.registry.v1",
80
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
81
+ );
36
82
  #property;
37
- #records = /* @__PURE__ */ new Map();
38
- /** @param property - The CSS property whose temporary values this lease owns. */
39
- constructor(property) {
83
+ #record;
84
+ #held = /* @__PURE__ */ new Set();
85
+ constructor(property, owner) {
40
86
  this.#property = property;
87
+ this.#record = `data-${owner}-style-${property}-lease`;
88
+ const names = _StylePropertyLease.#registry.names;
89
+ names.set(property, (names.get(property) ?? /* @__PURE__ */ new Set()).add(this.#record));
41
90
  }
42
- /** Writes or removes the leased declaration while preserving its authored value. */
43
91
  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);
92
+ const stack = this.#stack(element);
93
+ const hold = this.#take(stack) ?? this.#acquire(element, stack);
94
+ this.#held.add(element);
95
+ const shows = !this.#covered(element, stack, hold);
96
+ hold.writtenValue = value;
97
+ hold.writtenPriority = value === null ? "" : priority;
98
+ this.#mark(element, stack);
99
+ if (shows) this.#show(element, value, hold.writtenPriority);
57
100
  }
58
- /** Returns one lease without overwriting a later consumer declaration. */
59
101
  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
- }
102
+ const held = this.#held.delete(element);
103
+ const known = _StylePropertyLease.#registry.stacks.get(element)?.has(this.#property);
104
+ const stack = held || known || element.hasAttribute(this.#record) ? this.#stack(element) : [];
105
+ const hold = this.#take(stack);
106
+ if (!hold) return;
107
+ const owns = this.#carries(element, hold) && !this.#covered(element, stack, hold);
108
+ const index = stack.indexOf(hold);
109
+ stack.splice(index, 1);
110
+ const above = stack[index];
111
+ if (above) above.linked &&= hold.linked;
112
+ this.#mark(element, stack);
113
+ if (!owns) return;
114
+ const below = hold.linked ? stack[index - 1] : void 0;
115
+ if (below) this.#show(element, below.writtenValue, below.writtenPriority);
116
+ else this.#show(element, hold.originalValue, hold.originalPriority);
68
117
  }
69
- /** Returns every outstanding declaration lease. */
70
118
  returnAll() {
71
- for (const element of Array.from(this.#records.keys())) this.return(element);
119
+ for (const element of Array.from(this.#held)) this.return(element);
120
+ }
121
+ #recorded(element, name) {
122
+ try {
123
+ const parsed = JSON.parse(element.getAttribute(name) ?? "null");
124
+ if (!Array.isArray(parsed)) return null;
125
+ const [originalValue, originalPriority, writtenValue, writtenPriority, ...rest] = parsed;
126
+ if (typeof originalValue !== "string" || typeof originalPriority !== "string") return null;
127
+ if (typeof writtenValue !== "string" && writtenValue !== null) return null;
128
+ if (typeof writtenPriority !== "string") return null;
129
+ const linked = rest[0] !== false;
130
+ const beneath = linked ? rest : rest.slice(1);
131
+ if (!beneath.every((under) => typeof under === "string")) return null;
132
+ return { originalValue, originalPriority, writtenValue, writtenPriority, linked, beneath };
133
+ } catch {
134
+ return null;
135
+ }
72
136
  }
73
- /** Reflects only a real declaration transition. */
74
- #reflect(element, value, priority) {
137
+ #stack(element) {
138
+ const stacks = _StylePropertyLease.#registry.stacks;
139
+ const byProperty = stacks.get(element) ?? /* @__PURE__ */ new Map();
140
+ stacks.set(element, byProperty);
141
+ const stack = byProperty.get(this.#property) ?? this.#seed(element);
142
+ byProperty.set(this.#property, stack);
143
+ return stack;
144
+ }
145
+ #seed(element) {
146
+ const found = [];
147
+ for (const record of _StylePropertyLease.#registry.names.get(this.#property) ?? []) {
148
+ const read = this.#recorded(element, record);
149
+ if (read) found.push({ ...read, record });
150
+ }
151
+ const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
152
+ return found.sort((one, other) => depth(one) - depth(other)).map((entry, index) => ({
153
+ lease: null,
154
+ record: entry.record,
155
+ writtenValue: entry.writtenValue,
156
+ writtenPriority: entry.writtenPriority,
157
+ originalValue: entry.originalValue,
158
+ originalPriority: entry.originalPriority,
159
+ linked: entry.linked && index > 0
160
+ }));
161
+ }
162
+ #take(stack) {
163
+ const hold = stack.find((held) => held.lease === this) ?? stack.find((held) => held.lease === null && held.record === this.#record);
164
+ if (hold) hold.lease = this;
165
+ return hold;
166
+ }
167
+ #acquire(element, stack) {
168
+ const top = stack.at(-1);
169
+ const over = top && this.#carries(element, top) ? top : void 0;
75
170
  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;
171
+ const hold = {
172
+ lease: this,
173
+ record: this.#record,
174
+ writtenValue: null,
175
+ writtenPriority: "",
176
+ originalValue: over ? over.originalValue : style.getPropertyValue(this.#property),
177
+ originalPriority: over ? over.originalPriority : style.getPropertyPriority(this.#property),
178
+ linked: over !== void 0
179
+ };
180
+ stack.push(hold);
181
+ return hold;
182
+ }
183
+ #covered(element, stack, hold) {
184
+ return stack.slice(stack.indexOf(hold) + 1).some((above) => this.#carries(element, above));
185
+ }
186
+ #mark(element, stack) {
187
+ const records = /* @__PURE__ */ new Map([[this.#record, null]]);
188
+ stack.forEach((hold, index) => {
189
+ const names = stack.slice(0, index).map((under) => under.record);
190
+ const beneath = [...new Set(names.reverse())].filter((name) => name !== hold.record);
191
+ const marker = hold.linked || beneath.length === 0 ? [] : [false];
192
+ const { originalValue, originalPriority, writtenValue, writtenPriority } = hold;
193
+ records.set(
194
+ hold.record,
195
+ (writtenValue ?? "") === originalValue && writtenPriority === originalPriority && beneath.length === 0 && index === stack.length - 1 ? null : JSON.stringify([
196
+ originalValue,
197
+ originalPriority,
198
+ writtenValue,
199
+ writtenPriority,
200
+ ...marker,
201
+ ...beneath
202
+ ])
203
+ );
204
+ });
205
+ for (const [name, recorded] of records) {
206
+ if (element.getAttribute(name) === recorded) continue;
207
+ if (recorded === null) element.removeAttribute(name);
208
+ else element.setAttribute(name, recorded);
80
209
  }
81
- if (value === null) style.removeProperty(this.#property);
82
- else style.setProperty(this.#property, value, priority);
210
+ }
211
+ #carries(element, hold) {
212
+ return this.#holds(element, hold.writtenValue ?? "", hold.writtenPriority);
213
+ }
214
+ #holds(element, value, priority) {
215
+ const style = element.style;
216
+ return style.getPropertyValue(this.#property) === value && style.getPropertyPriority(this.#property) === priority;
217
+ }
218
+ #show(element, value, priority) {
219
+ if (this.#holds(element, value ?? "", priority)) return;
220
+ if (value === null) element.style.removeProperty(this.#property);
221
+ else element.style.setProperty(this.#property, value, priority);
83
222
  }
84
223
  };
85
224
 
86
- // src/utils/transient_hooks.ts
87
225
  var TransientHooks = class {
88
226
  #attributes;
89
227
  constructor(options) {
90
228
  this.#attributes = options.attributes;
91
229
  }
92
- /** Drops the declared hooks from `element`; what it carries besides stays. */
93
230
  reset(element) {
94
231
  for (const attribute of this.#attributes) element.removeAttribute(attribute);
95
232
  }
96
233
  };
97
234
 
98
- // src/controllers/preview_guard_controller.ts
99
235
  var TRANSIENT = new TransientHooks({ attributes: ["data-preview-hidden"] });
236
+ var CONTENT_RECORD = "content";
100
237
  var PreviewGuardController = class extends Controller {
101
238
  static values = {
102
239
  placeholder: { type: String, default: "" }
103
240
  };
104
241
  static events = ["hide", "show"];
105
- #visibility = new StylePropertyLease("visibility");
106
- #beforeCache = new BeforeCacheReset(() => this.#restore());
242
+ #visibility = new StylePropertyLease("visibility", this.identifier);
107
243
  #observer = null;
108
244
  #connected = false;
109
245
  #hidden = false;
110
- /** Child nodes a placeholder displaced; non-null marks that content — not visibility — was swapped. */
111
246
  #savedNodes = null;
112
- /** The descendant that held focus when the guard went up, so show can hand it back. */
113
247
  #focused = null;
248
+ #morphRender = new MorphRenderWatcher(() => {
249
+ this.#sync();
250
+ if (this.#hidden) this.#reguard();
251
+ });
114
252
  connect() {
253
+ this.#morphRender.observe(this.element);
115
254
  this.#connected = true;
116
- if (this.#hidden) this.#reguard();
117
- else TRANSIENT.reset(this.element);
118
- this.#beforeCache.activate();
255
+ if (this.#hidden) {
256
+ this.#reguard();
257
+ } else {
258
+ if (this.element.hasAttribute("data-preview-hidden")) this.#restoreRecordedContent();
259
+ this.#visibility.return(this.element);
260
+ TRANSIENT.reset(this.element);
261
+ }
119
262
  if (typeof MutationObserver !== "undefined") {
120
263
  this.#observer = new MutationObserver(() => this.#sync());
121
264
  this.#observer.observe(document.documentElement, {
@@ -126,24 +269,15 @@ var PreviewGuardController = class extends Controller {
126
269
  this.#sync();
127
270
  }
128
271
  disconnect() {
272
+ this.#morphRender.disconnect();
129
273
  this.#connected = false;
130
- this.#beforeCache.deactivate();
131
274
  this.#observer?.disconnect();
132
275
  this.#observer = null;
133
276
  }
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
277
  placeholderValueChanged() {
139
278
  if (!this.#connected || !this.#hidden) return;
140
279
  this.#reguard();
141
280
  }
142
- /**
143
- * Reflects the current `data-turbo-preview` state onto the element.
144
- *
145
- * @stimeoRenderRoot
146
- */
147
281
  #sync() {
148
282
  const previewing = document.documentElement.hasAttribute("data-turbo-preview");
149
283
  if (previewing && !this.#hidden) this.#hide();
@@ -154,30 +288,33 @@ var PreviewGuardController = class extends Controller {
154
288
  this.#applyGuard();
155
289
  this.dispatch("hide", { detail: {} });
156
290
  }
157
- /** Puts the guard up in the form the current `placeholder` calls for. */
158
291
  #applyGuard() {
159
292
  this.#hidden = true;
160
293
  if (this.placeholderValue === "") {
161
294
  this.#visibility.write(this.element, "hidden");
162
295
  } else {
296
+ this.element.setAttribute(this.#contentRecord, JSON.stringify(this.element.innerHTML));
163
297
  this.#savedNodes = document.createDocumentFragment();
164
298
  this.#savedNodes.append(...this.element.childNodes);
165
299
  this.element.textContent = this.placeholderValue;
166
300
  }
167
301
  this.element.setAttribute("data-preview-hidden", "true");
168
302
  }
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
- */
303
+ get #contentRecord() {
304
+ return `data-${this.identifier}-${CONTENT_RECORD}`;
305
+ }
306
+ #restoreRecordedContent() {
307
+ const raw = this.element.getAttribute(this.#contentRecord) ?? "null";
308
+ this.element.removeAttribute(this.#contentRecord);
309
+ let content = null;
310
+ try {
311
+ content = JSON.parse(raw);
312
+ } catch {
313
+ }
314
+ if (typeof content === "string") this.element.innerHTML = content;
315
+ }
180
316
  #reguard() {
317
+ this.element.setAttribute("data-preview-hidden", "true");
181
318
  if (this.#savedNodes && this.placeholderValue !== "") {
182
319
  this.element.textContent = this.placeholderValue;
183
320
  return;
@@ -191,46 +328,26 @@ var PreviewGuardController = class extends Controller {
191
328
  this.#restore();
192
329
  this.dispatch("show", { detail: {} });
193
330
  }
194
- /** Reverts the guard and hands focus back. Used by show and by the snapshot rewind. */
195
331
  #restore() {
196
332
  this.#revert();
197
333
  this.#refocus();
198
334
  }
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
335
  #revert() {
206
336
  this.#hidden = false;
207
337
  if (this.#savedNodes) {
208
338
  this.element.textContent = "";
209
339
  this.element.append(this.#savedNodes);
210
340
  this.#savedNodes = null;
341
+ this.element.removeAttribute(this.#contentRecord);
211
342
  } else {
212
343
  this.#visibility.return(this.element);
213
344
  }
214
345
  this.element.removeAttribute("data-preview-hidden");
215
346
  }
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
347
  #focusedInside() {
224
348
  const active = document.activeElement;
225
349
  return active instanceof HTMLElement && this.element.contains(active) ? active : null;
226
350
  }
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
351
  #refocus() {
235
352
  const target = this.#focused;
236
353
  this.#focused = null;
@@ -240,5 +357,4 @@ var PreviewGuardController = class extends Controller {
240
357
  };
241
358
 
242
359
  export { PreviewGuardController };
243
- //# sourceMappingURL=preview_guard_controller.js.map
244
360
  //# sourceMappingURL=preview_guard_controller.js.map