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,73 +1,229 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/password_reveal_controller.ts
3
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
4
+ if (element.getAttribute(name) === value) return false;
5
+ if (value === null) element.removeAttribute(name);
6
+ else element.setAttribute(name, value);
7
+ return true;
8
+ }
4
9
 
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;
17
- }
18
- /** Subscribes to `turbo:before-cache`; call from `connect()`. Idempotent. */
19
- activate() {
20
- const first = _BeforeCacheReset.#subscribers.size === 0;
21
- _BeforeCacheReset.#subscribers.add(this);
22
- if (first) {
23
- document.addEventListener("turbo:before-cache", _BeforeCacheReset.#onBeforeCache);
10
+ function sharedRegistry(key, create) {
11
+ const symbol = Symbol.for(key);
12
+ const scope = globalThis;
13
+ const existing = scope[symbol];
14
+ if (existing !== void 0) return existing;
15
+ const registry2 = create();
16
+ Object.defineProperty(globalThis, symbol, { value: registry2 });
17
+ return registry2;
18
+ }
19
+
20
+ var registry = sharedRegistry(
21
+ "stimeo-ui.attribute-lease.registry.v1",
22
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
23
+ );
24
+ function isAttributeValue(value) {
25
+ return value === null || typeof value === "string";
26
+ }
27
+ function readLeaseRecord(element, record) {
28
+ try {
29
+ const parsed = JSON.parse(element.getAttribute(record) ?? "null");
30
+ if (!Array.isArray(parsed)) return void 0;
31
+ const [original, written, ...rest] = parsed;
32
+ const linked = rest[0] !== false;
33
+ const beneath = linked ? rest : rest.slice(1);
34
+ if (!beneath.every((under) => typeof under === "string")) return void 0;
35
+ return isAttributeValue(original) && isAttributeValue(written) ? { original, written, linked, beneath } : void 0;
36
+ } catch {
37
+ return void 0;
38
+ }
39
+ }
40
+ function attributeStack(element, attribute) {
41
+ const byAttribute = registry.stacks.get(element) ?? /* @__PURE__ */ new Map();
42
+ registry.stacks.set(element, byAttribute);
43
+ const known = byAttribute.get(attribute);
44
+ if (known) return known;
45
+ const found = [];
46
+ for (const record of registry.names.get(attribute) ?? []) {
47
+ const read = readLeaseRecord(element, record);
48
+ if (read) found.push({ ...read, record });
49
+ }
50
+ const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
51
+ const stack = found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
52
+ lease: null,
53
+ record,
54
+ written,
55
+ original,
56
+ linked: linked && index > 0
57
+ }));
58
+ byAttribute.set(attribute, stack);
59
+ return stack;
60
+ }
61
+ function findHold(stack, lease, record) {
62
+ return stack.find((held) => held.lease === lease) ?? stack.find((held) => held.lease === null && held.record === record);
63
+ }
64
+ var AttributeLease = class {
65
+ #attribute;
66
+ #record;
67
+ #base;
68
+ #preserveAuthor;
69
+ #held = /* @__PURE__ */ new Set();
70
+ constructor(attribute, owner, options = {}) {
71
+ this.#attribute = attribute;
72
+ this.#record = `data-${owner}-${attribute}-lease`;
73
+ this.#base = options.base === true;
74
+ this.#preserveAuthor = options.preserveAuthor === true;
75
+ const names = registry.names;
76
+ names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
77
+ }
78
+ write(element, value) {
79
+ const stack = attributeStack(element, this.#attribute);
80
+ const hold = this.#take(stack) ?? this.#acquire(element, stack);
81
+ this.#held.add(element);
82
+ const shows = !this.#covered(element, stack, hold);
83
+ hold.written = value;
84
+ this.#mark(element, stack);
85
+ if (shows) this.#reflect(element, value);
86
+ }
87
+ return(element) {
88
+ const held = this.#held.delete(element);
89
+ const known = registry.stacks.get(element)?.has(this.#attribute);
90
+ const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
91
+ const hold = this.#take(stack);
92
+ if (!hold) return false;
93
+ const carries = element.getAttribute(this.#attribute) === hold.written;
94
+ const owns = carries && !this.#covered(element, stack, hold);
95
+ const index = stack.indexOf(hold);
96
+ stack.splice(index, 1);
97
+ const above = stack[index];
98
+ if (above) above.linked &&= hold.linked;
99
+ this.#mark(element, stack);
100
+ if (!owns) return true;
101
+ const below = hold.linked ? stack[index - 1] : void 0;
102
+ this.#reflect(element, below ? below.written : hold.original);
103
+ return true;
104
+ }
105
+ returnAll() {
106
+ for (const element of Array.from(this.#held)) this.return(element);
107
+ }
108
+ #take(stack) {
109
+ const hold = findHold(stack, this, this.#record);
110
+ if (hold) hold.lease = this;
111
+ return hold;
112
+ }
113
+ #acquire(element, stack) {
114
+ const current = element.getAttribute(this.#attribute);
115
+ const top = stack.at(-1);
116
+ const bottom = stack[0];
117
+ const over = top?.written === current ? top : void 0;
118
+ const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
119
+ const hold = {
120
+ lease: this,
121
+ record: this.#record,
122
+ written: current,
123
+ original: from ? from.original : current,
124
+ linked: !this.#base && over !== void 0
125
+ };
126
+ if (this.#base && bottom) {
127
+ bottom.linked = true;
128
+ stack.unshift(hold);
129
+ } else stack.push(hold);
130
+ return hold;
131
+ }
132
+ #covered(element, stack, hold) {
133
+ const current = element.getAttribute(this.#attribute);
134
+ return stack.slice(stack.indexOf(hold) + 1).some((above) => above.written === current);
135
+ }
136
+ #mark(element, stack) {
137
+ const records = /* @__PURE__ */ new Map([[this.#record, null]]);
138
+ stack.forEach((hold, index) => {
139
+ const names = stack.slice(0, index).map((under) => under.record);
140
+ const beneath = [...new Set(names.reverse())].filter((name) => name !== hold.record);
141
+ const marker = hold.linked || beneath.length === 0 ? [] : [false];
142
+ records.set(
143
+ hold.record,
144
+ hold.written === hold.original && beneath.length === 0 && index === stack.length - 1 ? null : JSON.stringify([hold.original, hold.written, ...marker, ...beneath])
145
+ );
146
+ });
147
+ for (const [name, recorded] of records) {
148
+ setAttributeIfChanged(element, name, recorded);
24
149
  }
25
150
  }
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);
151
+ #reflect(element, value) {
152
+ setAttributeIfChanged(element, this.#attribute, value);
153
+ }
154
+ };
155
+
156
+ var ListenerSet = class {
157
+ #abort = new AbortController();
158
+ add(target, type, handler, options) {
159
+ target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
160
+ }
161
+ dispose() {
162
+ this.#abort.abort();
163
+ this.#abort = new AbortController();
164
+ }
165
+ };
166
+
167
+ function matchesNumberBounds(value, bounds) {
168
+ if (!Number.isFinite(value)) {
169
+ const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
170
+ if (direction === null) return false;
171
+ if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
172
+ }
173
+ if (bounds.min !== void 0 && value < bounds.min) return false;
174
+ if (bounds.max !== void 0 && value > bounds.max) return false;
175
+ if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
176
+ if (bounds.integer && !Number.isInteger(value)) return false;
177
+ if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
178
+ return true;
179
+ }
180
+
181
+ function readNumber(raw, fallback, bounds) {
182
+ return matchesNumberBounds(raw, bounds) ? raw : fallback;
183
+ }
184
+
185
+ var NumberValueReader = class {
186
+ #lastRejected = /* @__PURE__ */ new Map();
187
+ read(owner, name, raw, fallback, bounds) {
188
+ const resolved = readNumber(raw, fallback, bounds);
189
+ if (matchesNumberBounds(raw, bounds)) {
190
+ this.#lastRejected.delete(name);
191
+ return resolved;
192
+ }
193
+ const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
194
+ const literal = owner.element.getAttribute(attribute);
195
+ if (literal === null) {
196
+ this.#lastRejected.delete(name);
197
+ return resolved;
198
+ }
199
+ if (this.#lastRejected.get(name) !== literal) {
200
+ this.#lastRejected.set(name, literal);
201
+ console.warn(
202
+ `Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
203
+ );
204
+ }
205
+ return resolved;
31
206
  }
32
207
  };
33
208
 
34
- // src/utils/safe_timeout.ts
35
209
  var TimerRegistry = class {
36
- /** Live timer ids that have not yet been cleared (or, for timeouts, fired). */
37
210
  ids = /* @__PURE__ */ new Set();
38
- /**
39
- * Cancels a single tracked timer.
40
- *
41
- * No-ops if the id is unknown (already cleared, fired, or never owned by this
42
- * registry), so callers can clear defensively without guarding.
43
- */
44
211
  clear(id) {
45
212
  if (this.ids.delete(id)) {
46
213
  this.cancel(id);
47
214
  }
48
215
  }
49
- /**
50
- * Cancels every tracked timer. Call this from a controller's `disconnect()`
51
- * to guarantee no timer outlives the element.
52
- */
53
216
  clearAll() {
54
217
  for (const id of this.ids) {
55
218
  this.cancel(id);
56
219
  }
57
220
  this.ids.clear();
58
221
  }
59
- /** Number of timers currently tracked (pending). */
60
222
  get size() {
61
223
  return this.ids.size;
62
224
  }
63
225
  };
64
226
  var SafeTimeout = class extends TimerRegistry {
65
- /**
66
- * Schedules `callback` after `delay` ms and returns the timer id.
67
- *
68
- * The id is removed from the registry automatically when the timeout fires,
69
- * so {@link TimerRegistry.size | size} reflects only still-pending timers.
70
- */
71
227
  set(callback, delay) {
72
228
  const id = this.schedule(() => {
73
229
  this.ids.delete(id);
@@ -84,16 +240,20 @@ var SafeTimeout = class extends TimerRegistry {
84
240
  }
85
241
  };
86
242
 
87
- // src/utils/state_regions.ts
88
- var StateRegions = class {
243
+ var StateRegions = class _StateRegions {
244
+ static #registry = sharedRegistry(
245
+ "stimeo-ui.state-regions.registry.v1",
246
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Set() })
247
+ );
89
248
  #whenTrue;
90
249
  #whenFalse;
91
- #taken = /* @__PURE__ */ new WeakSet();
92
- constructor(options) {
250
+ #record;
251
+ constructor(options, owner) {
93
252
  this.#whenTrue = options.whenTrue;
94
253
  this.#whenFalse = options.whenFalse ?? null;
254
+ this.#record = `data-${owner}-hidden-region`;
255
+ _StateRegions.#registry.names.add(this.#record);
95
256
  }
96
- /** Shows the regions inside `host` that belong to `isTrue` and hides the others. */
97
257
  reflect(host, isTrue) {
98
258
  const shown = this.#inside(host, this.#whenTrue());
99
259
  if (!this.#whenFalse) {
@@ -109,111 +269,229 @@ var StateRegions = class {
109
269
  for (const region of shown) this.#write(region, !isTrue);
110
270
  for (const region of hiddenSide) this.#write(region, isTrue);
111
271
  }
112
- /** Writes `hidden` where it moves, noting which regions it takes out of view. */
272
+ release(host) {
273
+ for (const region of [host, ...host.querySelectorAll("*")]) {
274
+ if (!(region instanceof HTMLElement)) continue;
275
+ const stack = this.#held(region);
276
+ const hold = stack && this.#take(stack);
277
+ if (!stack || !hold) continue;
278
+ const owns = region.hidden === hold.written && !this.#covered(region, stack, hold);
279
+ const index = stack.indexOf(hold);
280
+ stack.splice(index, 1);
281
+ const above = stack[index];
282
+ if (above) above.linked &&= hold.linked;
283
+ if (owns) {
284
+ const below = hold.linked ? stack[index - 1] : void 0;
285
+ if (below) {
286
+ if (region.hidden !== below.written) region.hidden = below.written;
287
+ } else {
288
+ setAttributeIfChanged(region, "hidden", hold.authored);
289
+ }
290
+ }
291
+ this.#mark(region, stack);
292
+ }
293
+ }
113
294
  #write(region, hidden) {
114
- if (hidden) this.#taken.add(region);
115
- else this.#taken.delete(region);
116
- if (region.hidden !== hidden) region.hidden = hidden;
295
+ const stack = this.#stack(region);
296
+ const hold = this.#take(stack) ?? this.#acquire(region, stack);
297
+ const shows = !this.#covered(region, stack, hold);
298
+ hold.written = hidden;
299
+ if (shows && region.hidden !== hidden) region.hidden = hidden;
300
+ this.#mark(region, stack);
117
301
  }
118
- /** Returns a region this instance hid; one it never hid keeps what it carries. */
119
302
  #give(region) {
120
- if (this.#taken.delete(region)) region.hidden = false;
303
+ const stack = this.#held(region);
304
+ if (stack && this.#take(stack)?.written) this.#write(region, false);
305
+ }
306
+ #held(region) {
307
+ return _StateRegions.#registry.stacks.has(region) || region.hasAttribute(this.#record) ? this.#stack(region) : void 0;
308
+ }
309
+ #stack(region) {
310
+ const stacks = _StateRegions.#registry.stacks;
311
+ const stack = stacks.get(region) ?? this.#seed(region);
312
+ stacks.set(region, stack);
313
+ return stack;
314
+ }
315
+ #seed(region) {
316
+ const found = [];
317
+ for (const record of _StateRegions.#registry.names) {
318
+ const read = this.#recorded(region, record);
319
+ if (read) found.push({ ...read, record });
320
+ }
321
+ const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
322
+ return found.sort((one, other) => depth(one) - depth(other)).map(({ record, authored, written, linked }, index) => ({
323
+ instance: null,
324
+ record,
325
+ authored,
326
+ written,
327
+ linked: linked && index > 0
328
+ }));
329
+ }
330
+ #take(stack) {
331
+ const hold = stack.find((held) => held.instance === this) ?? stack.find((held) => held.instance === null && held.record === this.#record);
332
+ if (hold) hold.instance = this;
333
+ return hold;
334
+ }
335
+ #covered(region, stack, hold) {
336
+ return stack.slice(stack.indexOf(hold) + 1).some((above) => above.written === region.hidden);
337
+ }
338
+ #acquire(region, stack) {
339
+ const top = stack.at(-1);
340
+ const over = top && region.hidden === top.written ? top : void 0;
341
+ const hold = {
342
+ instance: this,
343
+ record: this.#record,
344
+ authored: over ? over.authored : region.getAttribute("hidden"),
345
+ written: false,
346
+ linked: over !== void 0
347
+ };
348
+ stack.push(hold);
349
+ return hold;
350
+ }
351
+ #mark(region, stack) {
352
+ const records = /* @__PURE__ */ new Map([[this.#record, null]]);
353
+ stack.forEach((hold, index) => {
354
+ const names = stack.slice(0, index).map((under) => under.record);
355
+ const beneath = [...new Set(names.reverse())].filter((name) => name !== hold.record);
356
+ const marker = hold.linked || beneath.length === 0 ? [] : [false];
357
+ records.set(
358
+ hold.record,
359
+ region.getAttribute("hidden") === hold.authored && beneath.length === 0 && index === stack.length - 1 ? null : JSON.stringify([hold.authored, hold.written, ...marker, ...beneath])
360
+ );
361
+ });
362
+ for (const [name, recorded] of records) {
363
+ setAttributeIfChanged(region, name, recorded);
364
+ }
365
+ }
366
+ #recorded(region, name) {
367
+ try {
368
+ const parsed = JSON.parse(region.getAttribute(name) ?? "null");
369
+ if (!Array.isArray(parsed)) return null;
370
+ const [authored, written, ...rest] = parsed;
371
+ if (authored !== null && typeof authored !== "string") return null;
372
+ const linked = rest[0] !== false;
373
+ const beneath = linked ? rest : rest.slice(1);
374
+ if (!beneath.every((under) => typeof under === "string")) return null;
375
+ return typeof written === "boolean" ? { authored, written, linked, beneath } : null;
376
+ } catch {
377
+ return null;
378
+ }
121
379
  }
122
- /** The declared regions that sit within `host`, which may be the host itself. */
123
380
  #inside(host, regions) {
124
381
  return regions.filter((region) => host.contains(region));
125
382
  }
126
383
  };
127
384
 
128
- // src/controllers/password_reveal_controller.ts
129
385
  var MAX_DELAY = 2 ** 31 - 1;
130
- var PasswordRevealController = class extends Controller {
386
+ function maskCopyOf(type, input) {
387
+ const revealed = input.type === "text";
388
+ type.return(input);
389
+ if (revealed && input.type === "password") input.value = "";
390
+ }
391
+ var PasswordRevealController = class _PasswordRevealController extends Controller {
392
+ #numbers = new NumberValueReader();
131
393
  static targets = ["input", "toggle", "onLabel", "offLabel"];
132
394
  static values = {
133
395
  autoHide: { type: Number, default: 0 }
134
396
  };
397
+ static valueConstraints = {
398
+ autoHide: { finite: true, allowInfinity: "positive" }
399
+ };
135
400
  static actions = ["toggle"];
136
401
  static events = ["toggle"];
137
- /** Auto re-mask timer; torn down on disconnect. */
402
+ static #maskedRenders = sharedRegistry(
403
+ "stimeo-ui.password-reveal-render-mask.registry.v1",
404
+ () => /* @__PURE__ */ new WeakMap()
405
+ );
138
406
  #timers = new SafeTimeout();
139
- /**
140
- * Whether this controller is between `connect()` and `disconnect()`.
141
- *
142
- * Target callbacks outlive the controller: Stimulus stops the target observer
143
- * after `disconnect()`, so a field leaving after teardown still reaches
144
- * {@link PasswordRevealController.inputTargetDisconnected}. Arming from there
145
- * would put a timer back that nothing will clear. The element staying in the
146
- * document does not answer this — unloading the controller leaves it there.
147
- */
148
407
  #connected = false;
149
- /** Owns `hidden` on the label pair the toggle button carries. */
150
- #labels = new StateRegions({
151
- whenTrue: () => this.onLabelTargets,
152
- whenFalse: () => this.offLabelTargets
153
- });
154
- /** Masks the field before Turbo copies the page into its snapshot. */
155
- #beforeCache = new BeforeCacheReset(() => this.#rewindToMasked());
408
+ #labels = new StateRegions(
409
+ {
410
+ whenTrue: () => this.onLabelTargets,
411
+ whenFalse: () => this.offLabelTargets
412
+ },
413
+ this.identifier
414
+ );
415
+ #pressed = new AttributeLease("aria-pressed", this.identifier);
416
+ #type = new AttributeLease("type", this.identifier);
417
+ #listeners = new ListenerSet();
418
+ #lived = false;
156
419
  connect() {
157
420
  this.#connected = true;
421
+ if (!this.#lived) this.#maskCopy();
422
+ this.#lived = true;
158
423
  const visible = this.#isVisible;
159
424
  this.#reflect(visible);
160
- this.#beforeCache.activate();
425
+ this.#listeners.add(document, "turbo:before-cache", this.#rewindToMasked);
426
+ _PasswordRevealController.#maskRendersInto(this.element.ownerDocument, this.identifier);
161
427
  this.#arm(visible);
162
428
  }
163
429
  disconnect() {
164
430
  this.#connected = false;
165
431
  this.#timers.clearAll();
166
- this.#beforeCache.deactivate();
432
+ this.#listeners.dispose();
167
433
  }
168
- /** Re-derives the hooks and the re-mask for a field swapped in after connect. */
169
434
  inputTargetConnected() {
435
+ for (const input of this.inputTargets.slice(1)) this.#type.return(input);
170
436
  const visible = this.#connected && this.#isVisible;
171
437
  this.#reflect(visible);
172
438
  this.#arm(visible);
173
439
  }
174
- /**
175
- * Re-derives from whatever field is left rather than assuming none is. A swap
176
- * delivers this callback next to the arrival in either order, so a revealed
177
- * replacement that answered "masked" here would be described as hidden while
178
- * showing the password, and would carry no re-mask.
179
- *
180
- * Teardown is the one case with nothing to derive: target callbacks run after
181
- * `disconnect()`, so the field is still revealed and re-arming from it would
182
- * outlive the controller. A detached root is the signal to stand down.
183
- */
184
- inputTargetDisconnected() {
185
- const visible = this.#connected && this.element.isConnected && this.#isVisible;
440
+ inputTargetDisconnected(input) {
441
+ if (!this.inputTargets.includes(input)) this.#type.return(input);
442
+ if (!this.#connected) return;
443
+ const visible = this.#isVisible;
186
444
  this.#reflect(visible);
187
445
  this.#arm(visible);
188
446
  }
189
- /** Re-derives the pressed state for a button swapped in after connect. */
190
447
  toggleTargetConnected() {
191
448
  this.#reflect(this.#isVisible);
192
449
  }
193
- /** Describes the state to a revealed-side label that arrives after connect. */
450
+ toggleTargetDisconnected(toggle) {
451
+ if (!this.toggleTargets.includes(toggle)) {
452
+ this.#pressed.return(toggle);
453
+ this.#labels.release(toggle);
454
+ }
455
+ if (this.#connected) this.#reflect(this.#isVisible);
456
+ }
194
457
  onLabelTargetConnected() {
195
458
  this.#reflect(this.#isVisible);
196
459
  }
197
- /** Describes the state to a masked-side label that arrives after connect. */
198
460
  offLabelTargetConnected() {
199
461
  this.#reflect(this.#isVisible);
200
462
  }
201
- /** Toggles the input between masked and revealed. Bound via `data-action`. */
202
463
  toggle() {
203
464
  this.#setVisible(!this.#isVisible);
204
465
  }
205
- /** Whether the input is currently revealed (`type="text"`). */
206
466
  get #isVisible() {
207
467
  return this.hasInputTarget && this.inputTarget.type === "text";
208
468
  }
209
- /** Switches the masked/revealed state, preserving focus and caret. */
469
+ #maskCopy() {
470
+ if (this.hasInputTarget) maskCopyOf(this.#type, this.inputTarget);
471
+ }
472
+ static #maskRendersInto(document2, identifier) {
473
+ const masked = _PasswordRevealController.#maskedRenders.get(document2) ?? /* @__PURE__ */ new Set();
474
+ if (masked.has(identifier)) return;
475
+ masked.add(identifier);
476
+ _PasswordRevealController.#maskedRenders.set(document2, masked);
477
+ const type = new AttributeLease("type", identifier);
478
+ document2.addEventListener("turbo:before-render", (event) => {
479
+ const body = event.detail?.newBody;
480
+ if (!(body instanceof Element)) return;
481
+ for (const input of body.querySelectorAll(
482
+ `input[data-${identifier}-type-lease]`
483
+ )) {
484
+ if (input.type === "text") maskCopyOf(type, input);
485
+ }
486
+ });
487
+ }
210
488
  #setVisible(visible) {
211
489
  if (!this.hasInputTarget) return;
212
490
  const input = this.inputTarget;
213
491
  const restoreInputFocus = document.activeElement === input;
214
492
  const selectionStart = input.selectionStart;
215
493
  const selectionEnd = input.selectionEnd;
216
- input.type = visible ? "text" : "password";
494
+ this.#type.write(input, visible ? "text" : "password");
217
495
  if (restoreInputFocus) {
218
496
  input.focus();
219
497
  if (selectionStart !== null && selectionEnd !== null) {
@@ -227,7 +505,6 @@ var PasswordRevealController = class extends Controller {
227
505
  this.dispatch("toggle", { detail: { visible } });
228
506
  this.#arm(visible);
229
507
  }
230
- /** Schedules the auto re-mask for a revealed field, replacing any pending one. */
231
508
  #arm(visible) {
232
509
  this.#timers.clearAll();
233
510
  const delay = this.#autoHideDelay;
@@ -235,39 +512,33 @@ var PasswordRevealController = class extends Controller {
235
512
  this.#timers.set(() => this.#setVisible(false), delay);
236
513
  }
237
514
  }
238
- /**
239
- * The auto re-mask delay, held to what `setTimeout` can carry. Past that limit
240
- * a delay folds to zero, turning "keep it showing" into "hide it at once" —
241
- * the opposite of what the declaration asked for. A value that is no delay at
242
- * all stays out of the positive range {@link PasswordRevealController.#arm}
243
- * requires, so it schedules nothing.
244
- *
245
- * @stimeoRuntimeOnly `autoHide` is the delay of the one re-masking timer it arms.
246
- */
247
515
  get #autoHideDelay() {
248
- return Math.min(this.autoHideValue, MAX_DELAY);
249
- }
250
- /**
251
- * Returns the field to masked before Turbo copies the page. Silent and
252
- * focus-free: the page is about to be frozen, so there is no one to tell and
253
- * nowhere for focus to go.
254
- */
255
- #rewindToMasked() {
516
+ return Math.min(this.#safeAutoHide, MAX_DELAY);
517
+ }
518
+ #rewindToMasked = () => {
256
519
  this.#timers.clearAll();
257
520
  if (!this.hasInputTarget) return;
258
- this.inputTarget.type = "password";
521
+ this.#type.write(this.inputTarget, "password");
259
522
  this.#reflect(false);
260
- }
261
- /** Reflects the visible state onto `aria-pressed`, `data-state` and the labels. */
523
+ };
262
524
  #reflect(visible) {
263
525
  if (this.hasToggleTarget) {
264
- this.toggleTarget.setAttribute("aria-pressed", visible ? "true" : "false");
265
- this.#labels.reflect(this.toggleTarget, visible);
526
+ const toggle = this.toggleTarget;
527
+ this.#pressed.write(toggle, visible ? "true" : "false");
528
+ this.#labels.reflect(toggle, visible);
266
529
  }
267
530
  this.element.setAttribute("data-state", visible ? "visible" : "hidden");
268
531
  }
532
+ get #safeAutoHide() {
533
+ return this.#numbers.read(
534
+ this,
535
+ "autoHide",
536
+ this.autoHideValue,
537
+ _PasswordRevealController.values.autoHide.default,
538
+ _PasswordRevealController.valueConstraints.autoHide
539
+ );
540
+ }
269
541
  };
270
542
 
271
543
  export { PasswordRevealController };
272
- //# sourceMappingURL=password_reveal_controller.js.map
273
544
  //# sourceMappingURL=password_reveal_controller.js.map