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
@@ -38,16 +38,39 @@ declare class SkeletonController extends Controller<HTMLElement> {
38
38
  default: number;
39
39
  };
40
40
  };
41
+ static valueConstraints: {
42
+ minDuration: {
43
+ readonly finite: true;
44
+ readonly min: 0;
45
+ readonly max: 2147483647;
46
+ };
47
+ };
41
48
  static actions: readonly ["ready", "reset"];
42
49
  static events: readonly ["ready"];
43
50
  readonly placeholderTarget: HTMLElement;
51
+ readonly placeholderTargets: HTMLElement[];
44
52
  readonly contentTarget: HTMLElement;
53
+ readonly contentTargets: HTMLElement[];
45
54
  readonly hasPlaceholderTarget: boolean;
46
55
  readonly hasContentTarget: boolean;
47
56
  minDurationValue: number;
48
57
  announceReadyTextValue: string;
49
58
  connect(): void;
50
59
  disconnect(): void;
60
+ /** Shows or hides a placeholder that arrives at runtime as the phase calls for. */
61
+ placeholderTargetConnected(): void;
62
+ /**
63
+ * Gives a placeholder that no longer resolves its own `hidden` back, even after
64
+ * `disconnect()`, and while connected repaints the placeholder that stays.
65
+ */
66
+ placeholderTargetDisconnected(placeholder: HTMLElement): void;
67
+ /** Shows or hides content that arrives at runtime as the phase calls for. */
68
+ contentTargetConnected(): void;
69
+ /**
70
+ * Gives content that no longer resolves its own `hidden` back, even after
71
+ * `disconnect()`, and while connected repaints the content that stays.
72
+ */
73
+ contentTargetDisconnected(content: HTMLElement): void;
51
74
  /** Swaps to the real content. Honors `minDuration` to prevent a flash. */
52
75
  ready(): void;
53
76
  /** Returns to the loading state (e.g. a Turbo Stream re-fetch). */
@@ -1,8 +1,12 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/skeleton_controller.ts
3
+ function fillTemplate(template, values) {
4
+ return template.replace(/\{([a-zA-Z][a-zA-Z0-9]*)\}/g, (match, name) => {
5
+ const replacement = Object.hasOwn(values, name) ? values[name] : void 0;
6
+ return replacement === void 0 ? match : String(replacement);
7
+ });
8
+ }
4
9
 
5
- // src/utils/announce.ts
6
10
  function announce(message, options = {}) {
7
11
  const text = message.trim();
8
12
  if (text.length === 0) return;
@@ -12,95 +16,210 @@ function announce(message, options = {}) {
12
16
  })
13
17
  );
14
18
  }
15
- function fillTemplate(template, values) {
16
- return template.replace(/\{([a-zA-Z][a-zA-Z0-9]*)\}/g, (match, name) => {
17
- const replacement = values[name];
18
- return replacement === void 0 ? match : String(replacement);
19
- });
19
+
20
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
21
+ if (element.getAttribute(name) === value) return false;
22
+ if (value === null) element.removeAttribute(name);
23
+ else element.setAttribute(name, value);
24
+ return true;
25
+ }
26
+
27
+ function sharedRegistry(key, create) {
28
+ const symbol = Symbol.for(key);
29
+ const scope = globalThis;
30
+ const existing = scope[symbol];
31
+ if (existing !== void 0) return existing;
32
+ const registry2 = create();
33
+ Object.defineProperty(globalThis, symbol, { value: registry2 });
34
+ return registry2;
20
35
  }
21
36
 
22
- // src/utils/detach_gate.ts
37
+ var registry = sharedRegistry(
38
+ "stimeo-ui.attribute-lease.registry.v1",
39
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
40
+ );
41
+ function isAttributeValue(value) {
42
+ return value === null || typeof value === "string";
43
+ }
44
+ function readLeaseRecord(element, record) {
45
+ try {
46
+ const parsed = JSON.parse(element.getAttribute(record) ?? "null");
47
+ if (!Array.isArray(parsed)) return void 0;
48
+ const [original, written, ...rest] = parsed;
49
+ const linked = rest[0] !== false;
50
+ const beneath = linked ? rest : rest.slice(1);
51
+ if (!beneath.every((under) => typeof under === "string")) return void 0;
52
+ return isAttributeValue(original) && isAttributeValue(written) ? { original, written, linked, beneath } : void 0;
53
+ } catch {
54
+ return void 0;
55
+ }
56
+ }
57
+ function attributeStack(element, attribute) {
58
+ const byAttribute = registry.stacks.get(element) ?? /* @__PURE__ */ new Map();
59
+ registry.stacks.set(element, byAttribute);
60
+ const known = byAttribute.get(attribute);
61
+ if (known) return known;
62
+ const found = [];
63
+ for (const record of registry.names.get(attribute) ?? []) {
64
+ const read = readLeaseRecord(element, record);
65
+ if (read) found.push({ ...read, record });
66
+ }
67
+ const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
68
+ const stack = found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
69
+ lease: null,
70
+ record,
71
+ written,
72
+ original,
73
+ linked: linked && index > 0
74
+ }));
75
+ byAttribute.set(attribute, stack);
76
+ return stack;
77
+ }
78
+ function findHold(stack, lease, record) {
79
+ return stack.find((held) => held.lease === lease) ?? stack.find((held) => held.lease === null && held.record === record);
80
+ }
81
+ var AttributeLease = class {
82
+ #attribute;
83
+ #record;
84
+ #base;
85
+ #preserveAuthor;
86
+ #held = /* @__PURE__ */ new Set();
87
+ constructor(attribute, owner, options = {}) {
88
+ this.#attribute = attribute;
89
+ this.#record = `data-${owner}-${attribute}-lease`;
90
+ this.#base = options.base === true;
91
+ this.#preserveAuthor = options.preserveAuthor === true;
92
+ const names = registry.names;
93
+ names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
94
+ }
95
+ write(element, value) {
96
+ const stack = attributeStack(element, this.#attribute);
97
+ const hold = this.#take(stack) ?? this.#acquire(element, stack);
98
+ this.#held.add(element);
99
+ const shows = !this.#covered(element, stack, hold);
100
+ hold.written = value;
101
+ this.#mark(element, stack);
102
+ if (shows) this.#reflect(element, value);
103
+ }
104
+ return(element) {
105
+ const held = this.#held.delete(element);
106
+ const known = registry.stacks.get(element)?.has(this.#attribute);
107
+ const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
108
+ const hold = this.#take(stack);
109
+ if (!hold) return false;
110
+ const carries = element.getAttribute(this.#attribute) === hold.written;
111
+ const owns = carries && !this.#covered(element, stack, hold);
112
+ const index = stack.indexOf(hold);
113
+ stack.splice(index, 1);
114
+ const above = stack[index];
115
+ if (above) above.linked &&= hold.linked;
116
+ this.#mark(element, stack);
117
+ if (!owns) return true;
118
+ const below = hold.linked ? stack[index - 1] : void 0;
119
+ this.#reflect(element, below ? below.written : hold.original);
120
+ return true;
121
+ }
122
+ returnAll() {
123
+ for (const element of Array.from(this.#held)) this.return(element);
124
+ }
125
+ #take(stack) {
126
+ const hold = findHold(stack, this, this.#record);
127
+ if (hold) hold.lease = this;
128
+ return hold;
129
+ }
130
+ #acquire(element, stack) {
131
+ const current = element.getAttribute(this.#attribute);
132
+ const top = stack.at(-1);
133
+ const bottom = stack[0];
134
+ const over = top?.written === current ? top : void 0;
135
+ const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
136
+ const hold = {
137
+ lease: this,
138
+ record: this.#record,
139
+ written: current,
140
+ original: from ? from.original : current,
141
+ linked: !this.#base && over !== void 0
142
+ };
143
+ if (this.#base && bottom) {
144
+ bottom.linked = true;
145
+ stack.unshift(hold);
146
+ } else stack.push(hold);
147
+ return hold;
148
+ }
149
+ #covered(element, stack, hold) {
150
+ const current = element.getAttribute(this.#attribute);
151
+ return stack.slice(stack.indexOf(hold) + 1).some((above) => above.written === current);
152
+ }
153
+ #mark(element, stack) {
154
+ const records = /* @__PURE__ */ new Map([[this.#record, null]]);
155
+ stack.forEach((hold, index) => {
156
+ const names = stack.slice(0, index).map((under) => under.record);
157
+ const beneath = [...new Set(names.reverse())].filter((name) => name !== hold.record);
158
+ const marker = hold.linked || beneath.length === 0 ? [] : [false];
159
+ records.set(
160
+ hold.record,
161
+ hold.written === hold.original && beneath.length === 0 && index === stack.length - 1 ? null : JSON.stringify([hold.original, hold.written, ...marker, ...beneath])
162
+ );
163
+ });
164
+ for (const [name, recorded] of records) {
165
+ setAttributeIfChanged(element, name, recorded);
166
+ }
167
+ }
168
+ #reflect(element, value) {
169
+ setAttributeIfChanged(element, this.#attribute, value);
170
+ }
171
+ };
172
+
23
173
  var DetachGate = class _DetachGate {
24
- /** Set while a probe is queued, waiting for a reconnect to cancel it. */
25
174
  #pending = false;
26
- /**
27
- * True while a probe is queued — the last disconnect was ambiguous and no
28
- * reconnect has cancelled it yet. Read it from `connect()` to tell the
29
- * reconnect half of an in-page move from a first connect: a controller whose
30
- * initialisation restarts a measurement (a min-duration floor, an elapsed
31
- * counter) must skip it for the move, where nothing actually restarted.
32
- */
33
175
  get pending() {
34
176
  return this.#pending;
35
177
  }
36
- /**
37
- * True when the disconnect is definitely a real detach — the element left
38
- * the document, or `data-controller` no longer lists the identifier. False
39
- * means ambiguous (in-page move or observed-root exit), NOT "alive".
40
- */
41
178
  static isDetached(host) {
42
- if (!host.element.isConnected) return true;
43
- const tokens = (host.element.getAttribute("data-controller") ?? "").split(/\s+/);
44
- return !tokens.includes(host.identifier);
45
- }
46
- /**
47
- * Call from `disconnect()`: runs `teardown` synchronously on a definite
48
- * detach (fast path), otherwise defers it one microtask — a reconnect
49
- * ({@link cancel} from `connect()`) keeps the state, no reconnect runs it.
50
- * One microtask is the whole probe window: Stimulus reconnects a moved
51
- * element within the same mutation batch, before the checkpoint drains.
52
- */
179
+ return !host.element.isConnected || !_DetachGate.#listed(host);
180
+ }
53
181
  disconnected(host, teardown) {
54
- if (_DetachGate.isDetached(host)) {
182
+ const carried = _DetachGate.#carried(host);
183
+ if (!carried && _DetachGate.isDetached(host)) {
55
184
  this.#pending = false;
56
185
  teardown();
57
186
  return;
58
187
  }
59
188
  this.#pending = true;
60
- queueMicrotask(() => {
189
+ const probe = () => {
61
190
  if (!this.#pending) return;
62
191
  this.#pending = false;
63
192
  teardown();
64
- });
193
+ };
194
+ if (carried) setTimeout(probe, 0);
195
+ else queueMicrotask(probe);
196
+ }
197
+ static #carried(host) {
198
+ const element = host.element;
199
+ return !element.isConnected && element.closest("[data-turbo-permanent]") !== null && _DetachGate.#listed(host);
200
+ }
201
+ static #listed(host) {
202
+ const tokens = (host.element.getAttribute("data-controller") ?? "").split(/\s+/);
203
+ return tokens.includes(host.identifier);
65
204
  }
66
- /**
67
- * Disarms a pending probe. Call from `connect()` (the reconnect that proves
68
- * an in-page move) and from the head of any teardown path not routed through
69
- * {@link disconnected} (disabled-toggle, Escape), so an orphaned probe can
70
- * never run the teardown a second time.
71
- */
72
205
  cancel() {
73
206
  this.#pending = false;
74
207
  }
75
208
  };
76
209
 
77
- // src/utils/min_duration_floor.ts
78
210
  var MinDurationFloor = class {
79
211
  #timers;
80
- /** Pending finish timer id, or `null` when nothing is held back. */
81
212
  #timerId = null;
82
- /** Epoch ms the floor is measured from. */
83
213
  #since = 0;
84
- /** @param timers - the controller's registry; the floor schedules into it. */
85
214
  constructor(timers) {
86
215
  this.#timers = timers;
87
216
  }
88
- /** Starts the floor: call when the state being held becomes visible. */
89
217
  begin() {
90
218
  this.#since = Date.now();
91
219
  }
92
- /** True while a finish is held back waiting for the floor to elapse. */
93
220
  get pending() {
94
221
  return this.#timerId !== null;
95
222
  }
96
- /**
97
- * Runs `finish` once the floor has elapsed, immediately when it already has.
98
- *
99
- * A held-back finish is **replaced**, never stacked: only the most recently
100
- * queued id is cancellable, so a second timer would outlive every cancel and
101
- * end a state that has since restarted. Controllers that want the first signal
102
- * to win guard on {@link pending} before calling.
103
- */
104
223
  schedule(minDuration, finish) {
105
224
  this.cancel();
106
225
  const remaining = minDuration - (Date.now() - this.#since);
@@ -113,7 +232,6 @@ var MinDurationFloor = class {
113
232
  finish();
114
233
  }
115
234
  }
116
- /** Drops a held-back finish. Safe when none is queued, or after a bulk clear. */
117
235
  cancel() {
118
236
  if (this.#timerId !== null) {
119
237
  this.#timers.clear(this.#timerId);
@@ -122,43 +240,70 @@ var MinDurationFloor = class {
122
240
  }
123
241
  };
124
242
 
125
- // src/utils/safe_timeout.ts
243
+ var MAX_TIMER_DELAY_MS = 2147483647;
244
+
245
+ var NUMBER_BOUNDS = {
246
+ timer: { finite: true, min: 0, max: MAX_TIMER_DELAY_MS }};
247
+ function matchesNumberBounds(value, bounds) {
248
+ if (!Number.isFinite(value)) {
249
+ const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
250
+ if (direction === null) return false;
251
+ if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
252
+ }
253
+ if (bounds.min !== void 0 && value < bounds.min) return false;
254
+ if (bounds.max !== void 0 && value > bounds.max) return false;
255
+ if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
256
+ if (bounds.integer && !Number.isInteger(value)) return false;
257
+ if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
258
+ return true;
259
+ }
260
+
261
+ function readNumber(raw, fallback, bounds) {
262
+ return matchesNumberBounds(raw, bounds) ? raw : fallback;
263
+ }
264
+
265
+ var NumberValueReader = class {
266
+ #lastRejected = /* @__PURE__ */ new Map();
267
+ read(owner, name, raw, fallback, bounds) {
268
+ const resolved = readNumber(raw, fallback, bounds);
269
+ if (matchesNumberBounds(raw, bounds)) {
270
+ this.#lastRejected.delete(name);
271
+ return resolved;
272
+ }
273
+ const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
274
+ const literal = owner.element.getAttribute(attribute);
275
+ if (literal === null) {
276
+ this.#lastRejected.delete(name);
277
+ return resolved;
278
+ }
279
+ if (this.#lastRejected.get(name) !== literal) {
280
+ this.#lastRejected.set(name, literal);
281
+ console.warn(
282
+ `Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
283
+ );
284
+ }
285
+ return resolved;
286
+ }
287
+ };
288
+
126
289
  var TimerRegistry = class {
127
- /** Live timer ids that have not yet been cleared (or, for timeouts, fired). */
128
290
  ids = /* @__PURE__ */ new Set();
129
- /**
130
- * Cancels a single tracked timer.
131
- *
132
- * No-ops if the id is unknown (already cleared, fired, or never owned by this
133
- * registry), so callers can clear defensively without guarding.
134
- */
135
291
  clear(id) {
136
292
  if (this.ids.delete(id)) {
137
293
  this.cancel(id);
138
294
  }
139
295
  }
140
- /**
141
- * Cancels every tracked timer. Call this from a controller's `disconnect()`
142
- * to guarantee no timer outlives the element.
143
- */
144
296
  clearAll() {
145
297
  for (const id of this.ids) {
146
298
  this.cancel(id);
147
299
  }
148
300
  this.ids.clear();
149
301
  }
150
- /** Number of timers currently tracked (pending). */
151
302
  get size() {
152
303
  return this.ids.size;
153
304
  }
154
305
  };
155
306
  var SafeTimeout = class extends TimerRegistry {
156
- /**
157
- * Schedules `callback` after `delay` ms and returns the timer id.
158
- *
159
- * The id is removed from the registry automatically when the timeout fires,
160
- * so {@link TimerRegistry.size | size} reflects only still-pending timers.
161
- */
162
307
  set(callback, delay) {
163
308
  const id = this.schedule(() => {
164
309
  this.ids.delete(id);
@@ -175,19 +320,25 @@ var SafeTimeout = class extends TimerRegistry {
175
320
  }
176
321
  };
177
322
 
178
- // src/controllers/skeleton_controller.ts
179
- var SkeletonController = class extends Controller {
323
+ var SkeletonController = class _SkeletonController extends Controller {
324
+ #numbers = new NumberValueReader();
180
325
  static targets = ["placeholder", "content"];
181
326
  static values = {
182
327
  announceReadyText: { type: String, default: "" },
183
328
  minDuration: { type: Number, default: 0 }
184
329
  };
330
+ static valueConstraints = {
331
+ minDuration: NUMBER_BOUNDS.timer
332
+ };
185
333
  static actions = ["ready", "reset"];
186
334
  static events = ["ready"];
187
335
  #timers = new SafeTimeout();
188
336
  #floor = new MinDurationFloor(this.#timers);
189
337
  #gate = new DetachGate();
338
+ #hidden = new AttributeLease("hidden", this.identifier);
339
+ #connected = false;
190
340
  connect() {
341
+ this.#connected = true;
191
342
  const moved = this.#gate.pending;
192
343
  this.#gate.cancel();
193
344
  if (!moved && this.#state !== "ready") {
@@ -195,57 +346,64 @@ var SkeletonController = class extends Controller {
195
346
  }
196
347
  }
197
348
  disconnect() {
349
+ this.#connected = false;
198
350
  this.#gate.disconnected(this, () => this.#teardown());
199
351
  }
200
- /** Swaps to the real content. Honors `minDuration` to prevent a flash. */
352
+ placeholderTargetConnected() {
353
+ if (this.#connected) this.#reflect(this.#state === "ready");
354
+ }
355
+ placeholderTargetDisconnected(placeholder) {
356
+ if (!this.placeholderTargets.includes(placeholder)) this.#hidden.return(placeholder);
357
+ if (this.#connected) this.#reflect(this.#state === "ready");
358
+ }
359
+ contentTargetConnected() {
360
+ if (this.#connected) this.#reflect(this.#state === "ready");
361
+ }
362
+ contentTargetDisconnected(content) {
363
+ if (!this.contentTargets.includes(content)) this.#hidden.return(content);
364
+ if (this.#connected) this.#reflect(this.#state === "ready");
365
+ }
201
366
  ready() {
202
367
  if (this.#state === "ready" || this.#floor.pending) return;
203
- this.#floor.schedule(this.minDurationValue, () => this.#reveal());
368
+ this.#floor.schedule(this.#safeMinDuration, () => this.#reveal());
204
369
  }
205
- /** Returns to the loading state (e.g. a Turbo Stream re-fetch). */
206
370
  reset() {
207
371
  this.#floor.cancel();
208
372
  this.#enterLoading();
209
373
  }
210
- /** Shows the placeholder, hides content, and marks the region busy. */
211
374
  #enterLoading() {
212
375
  this.#floor.begin();
213
- if (this.hasPlaceholderTarget) this.placeholderTarget.hidden = false;
214
- if (this.hasContentTarget) this.contentTarget.hidden = true;
376
+ this.#reflect(false);
215
377
  this.element.setAttribute("aria-busy", "true");
216
378
  this.element.setAttribute("data-state", "loading");
217
379
  }
218
- /**
219
- * Hides the placeholder, shows content, and clears the busy state.
220
- *
221
- * @stimeoRuntimeOnly `announceReadyText` is the wording of the one announcement this reveal
222
- * makes.
223
- */
224
380
  #reveal() {
225
- if (this.hasPlaceholderTarget) this.placeholderTarget.hidden = true;
226
- if (this.hasContentTarget) this.contentTarget.hidden = false;
381
+ this.#reflect(true);
227
382
  this.element.setAttribute("aria-busy", "false");
228
383
  this.element.setAttribute("data-state", "ready");
229
384
  this.dispatch("ready", { detail: {} });
230
385
  announce(fillTemplate(this.announceReadyTextValue, {}));
231
386
  }
232
- /**
233
- * Drops the held reveal on a real detach. The markup keeps whatever it last
234
- * held: an element on its way out of the document has no reader left, and one
235
- * whose `data-controller` dropped the identifier no longer resolves its own
236
- * targets, so the rollback could only ever be partial.
237
- */
387
+ #reflect(ready) {
388
+ if (this.hasPlaceholderTarget) this.#hidden.write(this.placeholderTarget, ready ? "" : null);
389
+ if (this.hasContentTarget) this.#hidden.write(this.contentTarget, ready ? null : "");
390
+ }
238
391
  #teardown() {
239
- this.#gate.cancel();
240
- this.#timers.clearAll();
241
392
  this.#floor.cancel();
242
393
  }
243
- /** Current lifecycle phase as reflected on `data-state`. */
244
394
  get #state() {
245
395
  return this.element.getAttribute("data-state") ?? "loading";
246
396
  }
397
+ get #safeMinDuration() {
398
+ return this.#numbers.read(
399
+ this,
400
+ "minDuration",
401
+ this.minDurationValue,
402
+ _SkeletonController.values.minDuration.default,
403
+ _SkeletonController.valueConstraints.minDuration
404
+ );
405
+ }
247
406
  };
248
407
 
249
408
  export { SkeletonController };
250
- //# sourceMappingURL=skeleton_controller.js.map
251
409
  //# sourceMappingURL=skeleton_controller.js.map