stimeo-ui 0.17.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 (297) hide show
  1. package/CHANGELOG.md +106 -1
  2. package/README.md +19 -10
  3. package/dist/cable/index.d.ts +9 -8
  4. package/dist/cable/index.js +22 -14
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/coerce-JtZVNG5h.d.ts +20 -0
  7. package/dist/controllers/accordion_controller.js +14 -6
  8. package/dist/controllers/accordion_controller.js.map +1 -1
  9. package/dist/controllers/alert_dialog_controller.js +145 -118
  10. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  11. package/dist/controllers/announcer_controller.d.ts +5 -3
  12. package/dist/controllers/announcer_controller.js +113 -17
  13. package/dist/controllers/announcer_controller.js.map +1 -1
  14. package/dist/controllers/auto_submit_controller.js +185 -60
  15. package/dist/controllers/auto_submit_controller.js.map +1 -1
  16. package/dist/controllers/avatar_controller.js +55 -43
  17. package/dist/controllers/avatar_controller.js.map +1 -1
  18. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  19. package/dist/controllers/bulk_select_controller.d.ts +3 -3
  20. package/dist/controllers/bulk_select_controller.js +64 -50
  21. package/dist/controllers/bulk_select_controller.js.map +1 -1
  22. package/dist/controllers/calendar_controller.d.ts +15 -12
  23. package/dist/controllers/calendar_controller.js +55 -53
  24. package/dist/controllers/calendar_controller.js.map +1 -1
  25. package/dist/controllers/carousel_controller.d.ts +9 -5
  26. package/dist/controllers/carousel_controller.js +124 -86
  27. package/dist/controllers/carousel_controller.js.map +1 -1
  28. package/dist/controllers/character_counter_controller.d.ts +27 -6
  29. package/dist/controllers/character_counter_controller.js +291 -95
  30. package/dist/controllers/character_counter_controller.js.map +1 -1
  31. package/dist/controllers/checkbox_controller.js +6 -0
  32. package/dist/controllers/checkbox_controller.js.map +1 -1
  33. package/dist/controllers/clipboard_controller.js +118 -27
  34. package/dist/controllers/clipboard_controller.js.map +1 -1
  35. package/dist/controllers/collapsible_controller.d.ts +1 -1
  36. package/dist/controllers/collapsible_controller.js +52 -49
  37. package/dist/controllers/collapsible_controller.js.map +1 -1
  38. package/dist/controllers/color_picker_controller.js +29 -7
  39. package/dist/controllers/color_picker_controller.js.map +1 -1
  40. package/dist/controllers/combobox_controller.d.ts +1 -1
  41. package/dist/controllers/combobox_controller.js +210 -71
  42. package/dist/controllers/combobox_controller.js.map +1 -1
  43. package/dist/controllers/command_palette_controller.d.ts +9 -9
  44. package/dist/controllers/command_palette_controller.js +289 -140
  45. package/dist/controllers/command_palette_controller.js.map +1 -1
  46. package/dist/controllers/conditional_fields_controller.js +145 -58
  47. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  48. package/dist/controllers/confirm_controller.js +145 -118
  49. package/dist/controllers/confirm_controller.js.map +1 -1
  50. package/dist/controllers/context_menu_controller.d.ts +49 -14
  51. package/dist/controllers/context_menu_controller.js +138 -73
  52. package/dist/controllers/context_menu_controller.js.map +1 -1
  53. package/dist/controllers/count_up_controller.js.map +1 -1
  54. package/dist/controllers/countdown_controller.d.ts +2 -2
  55. package/dist/controllers/countdown_controller.js +109 -21
  56. package/dist/controllers/countdown_controller.js.map +1 -1
  57. package/dist/controllers/currency_input_controller.d.ts +75 -11
  58. package/dist/controllers/currency_input_controller.js +446 -72
  59. package/dist/controllers/currency_input_controller.js.map +1 -1
  60. package/dist/controllers/data_grid_controller.d.ts +10 -8
  61. package/dist/controllers/data_grid_controller.js +134 -28
  62. package/dist/controllers/data_grid_controller.js.map +1 -1
  63. package/dist/controllers/date_range_picker_controller.d.ts +12 -9
  64. package/dist/controllers/date_range_picker_controller.js +93 -72
  65. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  66. package/dist/controllers/dialog_controller.d.ts +4 -5
  67. package/dist/controllers/dialog_controller.js +145 -118
  68. package/dist/controllers/dialog_controller.js.map +1 -1
  69. package/dist/controllers/direct_upload_controller.d.ts +1 -1
  70. package/dist/controllers/direct_upload_controller.js +24 -14
  71. package/dist/controllers/direct_upload_controller.js.map +1 -1
  72. package/dist/controllers/dirty_form_controller.d.ts +6 -1
  73. package/dist/controllers/dirty_form_controller.js +68 -31
  74. package/dist/controllers/dirty_form_controller.js.map +1 -1
  75. package/dist/controllers/dismissible_controller.js +64 -46
  76. package/dist/controllers/dismissible_controller.js.map +1 -1
  77. package/dist/controllers/drawer_controller.js +145 -118
  78. package/dist/controllers/drawer_controller.js.map +1 -1
  79. package/dist/controllers/dropdown_controller.js +76 -63
  80. package/dist/controllers/dropdown_controller.js.map +1 -1
  81. package/dist/controllers/editable_controller.js +199 -62
  82. package/dist/controllers/editable_controller.js.map +1 -1
  83. package/dist/controllers/empty_state_controller.js +13 -6
  84. package/dist/controllers/empty_state_controller.js.map +1 -1
  85. package/dist/controllers/file_dropzone_controller.d.ts +3 -0
  86. package/dist/controllers/file_dropzone_controller.js +55 -48
  87. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  88. package/dist/controllers/filter_controller.js +9 -2
  89. package/dist/controllers/filter_controller.js.map +1 -1
  90. package/dist/controllers/flash_controller.d.ts +4 -4
  91. package/dist/controllers/flash_controller.js +66 -33
  92. package/dist/controllers/flash_controller.js.map +1 -1
  93. package/dist/controllers/focus_controller.d.ts +3 -3
  94. package/dist/controllers/focus_controller.js +39 -14
  95. package/dist/controllers/focus_controller.js.map +1 -1
  96. package/dist/controllers/form_field_controller.js +52 -43
  97. package/dist/controllers/form_field_controller.js.map +1 -1
  98. package/dist/controllers/form_validation_controller.d.ts +3 -3
  99. package/dist/controllers/form_validation_controller.js +18 -11
  100. package/dist/controllers/form_validation_controller.js.map +1 -1
  101. package/dist/controllers/frame_loading_controller.d.ts +13 -12
  102. package/dist/controllers/frame_loading_controller.js +55 -48
  103. package/dist/controllers/frame_loading_controller.js.map +1 -1
  104. package/dist/controllers/highlight_controller.d.ts +5 -4
  105. package/dist/controllers/highlight_controller.js.map +1 -1
  106. package/dist/controllers/hover_card_controller.d.ts +4 -1
  107. package/dist/controllers/hover_card_controller.js +67 -61
  108. package/dist/controllers/hover_card_controller.js.map +1 -1
  109. package/dist/controllers/idle_controller.d.ts +6 -5
  110. package/dist/controllers/idle_controller.js +10 -6
  111. package/dist/controllers/idle_controller.js.map +1 -1
  112. package/dist/controllers/input_mask_controller.d.ts +30 -13
  113. package/dist/controllers/input_mask_controller.js +411 -24
  114. package/dist/controllers/input_mask_controller.js.map +1 -1
  115. package/dist/controllers/intersection_controller.js +3 -0
  116. package/dist/controllers/intersection_controller.js.map +1 -1
  117. package/dist/controllers/lazy_frame_controller.d.ts +3 -2
  118. package/dist/controllers/lazy_frame_controller.js +15 -3
  119. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  120. package/dist/controllers/listbox_controller.d.ts +10 -7
  121. package/dist/controllers/listbox_controller.js +260 -79
  122. package/dist/controllers/listbox_controller.js.map +1 -1
  123. package/dist/controllers/local_time_controller.d.ts +8 -6
  124. package/dist/controllers/local_time_controller.js +48 -13
  125. package/dist/controllers/local_time_controller.js.map +1 -1
  126. package/dist/controllers/masonry_controller.js +11 -4
  127. package/dist/controllers/masonry_controller.js.map +1 -1
  128. package/dist/controllers/menu_controller.d.ts +24 -5
  129. package/dist/controllers/menu_controller.js +138 -82
  130. package/dist/controllers/menu_controller.js.map +1 -1
  131. package/dist/controllers/menubar_controller.d.ts +49 -7
  132. package/dist/controllers/menubar_controller.js +65 -19
  133. package/dist/controllers/menubar_controller.js.map +1 -1
  134. package/dist/controllers/meter_controller.d.ts +13 -20
  135. package/dist/controllers/meter_controller.js +270 -24
  136. package/dist/controllers/meter_controller.js.map +1 -1
  137. package/dist/controllers/multi_select_controller.d.ts +17 -15
  138. package/dist/controllers/multi_select_controller.js +251 -94
  139. package/dist/controllers/multi_select_controller.js.map +1 -1
  140. package/dist/controllers/navigation_menu_controller.d.ts +19 -5
  141. package/dist/controllers/navigation_menu_controller.js +67 -19
  142. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  143. package/dist/controllers/nested_form_controller.js +98 -64
  144. package/dist/controllers/nested_form_controller.js.map +1 -1
  145. package/dist/controllers/network_status_controller.js +70 -52
  146. package/dist/controllers/network_status_controller.js.map +1 -1
  147. package/dist/controllers/number_input_controller.d.ts +24 -6
  148. package/dist/controllers/number_input_controller.js +344 -94
  149. package/dist/controllers/number_input_controller.js.map +1 -1
  150. package/dist/controllers/optimistic_controller.d.ts +8 -5
  151. package/dist/controllers/optimistic_controller.js +29 -11
  152. package/dist/controllers/optimistic_controller.js.map +1 -1
  153. package/dist/controllers/otp_controller.d.ts +35 -4
  154. package/dist/controllers/otp_controller.js +502 -104
  155. package/dist/controllers/otp_controller.js.map +1 -1
  156. package/dist/controllers/overflow_indicator_controller.js +6 -0
  157. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  158. package/dist/controllers/overflow_menu_controller.d.ts +10 -9
  159. package/dist/controllers/overflow_menu_controller.js +136 -21
  160. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  161. package/dist/controllers/pagination_controller.d.ts +3 -2
  162. package/dist/controllers/pagination_controller.js +47 -14
  163. package/dist/controllers/pagination_controller.js.map +1 -1
  164. package/dist/controllers/password_reveal_controller.d.ts +5 -4
  165. package/dist/controllers/password_reveal_controller.js +52 -49
  166. package/dist/controllers/password_reveal_controller.js.map +1 -1
  167. package/dist/controllers/password_strength_controller.d.ts +1 -1
  168. package/dist/controllers/password_strength_controller.js +13 -6
  169. package/dist/controllers/password_strength_controller.js.map +1 -1
  170. package/dist/controllers/persist_controller.js +48 -128
  171. package/dist/controllers/persist_controller.js.map +1 -1
  172. package/dist/controllers/pointer_drag_controller.d.ts +19 -8
  173. package/dist/controllers/pointer_drag_controller.js +249 -23
  174. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  175. package/dist/controllers/popover_controller.d.ts +3 -3
  176. package/dist/controllers/popover_controller.js +82 -65
  177. package/dist/controllers/popover_controller.js.map +1 -1
  178. package/dist/controllers/portal_controller.js +6 -0
  179. package/dist/controllers/portal_controller.js.map +1 -1
  180. package/dist/controllers/preview_guard_controller.js +14 -3
  181. package/dist/controllers/preview_guard_controller.js.map +1 -1
  182. package/dist/controllers/progress_controller.d.ts +9 -19
  183. package/dist/controllers/progress_controller.js +271 -27
  184. package/dist/controllers/progress_controller.js.map +1 -1
  185. package/dist/controllers/radio_group_controller.d.ts +11 -8
  186. package/dist/controllers/radio_group_controller.js +167 -80
  187. package/dist/controllers/radio_group_controller.js.map +1 -1
  188. package/dist/controllers/range_slider_controller.d.ts +4 -3
  189. package/dist/controllers/range_slider_controller.js +27 -7
  190. package/dist/controllers/range_slider_controller.js.map +1 -1
  191. package/dist/controllers/rating_controller.js +93 -57
  192. package/dist/controllers/rating_controller.js.map +1 -1
  193. package/dist/controllers/read_more_controller.js +10 -6
  194. package/dist/controllers/read_more_controller.js.map +1 -1
  195. package/dist/controllers/reading_progress_controller.js +22 -5
  196. package/dist/controllers/reading_progress_controller.js.map +1 -1
  197. package/dist/controllers/relative_time_controller.d.ts +4 -4
  198. package/dist/controllers/relative_time_controller.js +75 -11
  199. package/dist/controllers/relative_time_controller.js.map +1 -1
  200. package/dist/controllers/reset_on_restore_controller.d.ts +3 -3
  201. package/dist/controllers/reset_on_restore_controller.js +6 -0
  202. package/dist/controllers/reset_on_restore_controller.js.map +1 -1
  203. package/dist/controllers/resizable_controller.d.ts +3 -0
  204. package/dist/controllers/resizable_controller.js +55 -22
  205. package/dist/controllers/resizable_controller.js.map +1 -1
  206. package/dist/controllers/roving_controller.d.ts +3 -3
  207. package/dist/controllers/roving_controller.js +10 -4
  208. package/dist/controllers/roving_controller.js.map +1 -1
  209. package/dist/controllers/scroll_area_controller.js +129 -88
  210. package/dist/controllers/scroll_area_controller.js.map +1 -1
  211. package/dist/controllers/scroll_restore_controller.d.ts +3 -3
  212. package/dist/controllers/scroll_restore_controller.js +14 -2
  213. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  214. package/dist/controllers/scroll_visibility_controller.js +93 -60
  215. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  216. package/dist/controllers/scrollspy_controller.js +11 -5
  217. package/dist/controllers/scrollspy_controller.js.map +1 -1
  218. package/dist/controllers/separator_controller.d.ts +1 -1
  219. package/dist/controllers/separator_controller.js +59 -43
  220. package/dist/controllers/separator_controller.js.map +1 -1
  221. package/dist/controllers/sidebar_controller.d.ts +1 -1
  222. package/dist/controllers/sidebar_controller.js +150 -122
  223. package/dist/controllers/sidebar_controller.js.map +1 -1
  224. package/dist/controllers/skeleton_controller.js +55 -48
  225. package/dist/controllers/skeleton_controller.js.map +1 -1
  226. package/dist/controllers/slider_controller.d.ts +2 -1
  227. package/dist/controllers/slider_controller.js +27 -6
  228. package/dist/controllers/slider_controller.js.map +1 -1
  229. package/dist/controllers/smart_sticky_header_controller.d.ts +1 -1
  230. package/dist/controllers/smart_sticky_header_controller.js +13 -5
  231. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  232. package/dist/controllers/sortable_controller.d.ts +4 -4
  233. package/dist/controllers/sortable_controller.js +27 -14
  234. package/dist/controllers/sortable_controller.js.map +1 -1
  235. package/dist/controllers/spinner_controller.js +55 -48
  236. package/dist/controllers/spinner_controller.js.map +1 -1
  237. package/dist/controllers/step_indicator_controller.d.ts +4 -4
  238. package/dist/controllers/step_indicator_controller.js +6 -0
  239. package/dist/controllers/step_indicator_controller.js.map +1 -1
  240. package/dist/controllers/stepper_controller.d.ts +2 -3
  241. package/dist/controllers/stepper_controller.js +6 -0
  242. package/dist/controllers/stepper_controller.js.map +1 -1
  243. package/dist/controllers/stick_to_bottom_controller.d.ts +3 -1
  244. package/dist/controllers/stick_to_bottom_controller.js +19 -8
  245. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  246. package/dist/controllers/sticky_observer_controller.js +49 -43
  247. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  248. package/dist/controllers/submit_once_controller.d.ts +2 -1
  249. package/dist/controllers/submit_once_controller.js +145 -85
  250. package/dist/controllers/submit_once_controller.js.map +1 -1
  251. package/dist/controllers/switch_controller.d.ts +7 -4
  252. package/dist/controllers/switch_controller.js +172 -28
  253. package/dist/controllers/switch_controller.js.map +1 -1
  254. package/dist/controllers/tabs_controller.d.ts +7 -4
  255. package/dist/controllers/tabs_controller.js +6 -1
  256. package/dist/controllers/tabs_controller.js.map +1 -1
  257. package/dist/controllers/tags_input_controller.d.ts +4 -3
  258. package/dist/controllers/tags_input_controller.js +157 -28
  259. package/dist/controllers/tags_input_controller.js.map +1 -1
  260. package/dist/controllers/textarea_autosize_controller.d.ts +1 -1
  261. package/dist/controllers/textarea_autosize_controller.js +40 -19
  262. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  263. package/dist/controllers/theme_controller.d.ts +3 -2
  264. package/dist/controllers/theme_controller.js +10 -4
  265. package/dist/controllers/theme_controller.js.map +1 -1
  266. package/dist/controllers/time_picker_controller.d.ts +38 -5
  267. package/dist/controllers/time_picker_controller.js +192 -54
  268. package/dist/controllers/time_picker_controller.js.map +1 -1
  269. package/dist/controllers/toast_controller.d.ts +4 -5
  270. package/dist/controllers/toast_controller.js +58 -27
  271. package/dist/controllers/toast_controller.js.map +1 -1
  272. package/dist/controllers/toggle_group_controller.d.ts +2 -3
  273. package/dist/controllers/toggle_group_controller.js +158 -56
  274. package/dist/controllers/toggle_group_controller.js.map +1 -1
  275. package/dist/controllers/toolbar_controller.d.ts +8 -6
  276. package/dist/controllers/toolbar_controller.js +150 -21
  277. package/dist/controllers/toolbar_controller.js.map +1 -1
  278. package/dist/controllers/tooltip_controller.d.ts +4 -1
  279. package/dist/controllers/tooltip_controller.js.map +1 -1
  280. package/dist/controllers/transition_controller.js.map +1 -1
  281. package/dist/controllers/tree_view_controller.d.ts +1 -1
  282. package/dist/controllers/tree_view_controller.js +134 -25
  283. package/dist/controllers/tree_view_controller.js.map +1 -1
  284. package/dist/index.d.ts +2 -0
  285. package/dist/index.js +2451 -1312
  286. package/dist/index.js.map +1 -1
  287. package/dist/inspector/cli.d.ts +15 -11
  288. package/dist/inspector/cli.js +16 -3
  289. package/dist/inspector/cli.js.map +1 -1
  290. package/dist/inspector/cli_bin.js +53 -8
  291. package/dist/inspector/cli_bin.js.map +1 -1
  292. package/dist/inspector/examples.json +13 -13
  293. package/dist/inspector/manifest.json +19 -5
  294. package/dist/positioning/index.d.ts +7 -7
  295. package/dist/positioning/index.js +6 -0
  296. package/dist/positioning/index.js.map +1 -1
  297. package/package.json +10 -9
@@ -1,15 +1,26 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
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
+ }
9
+
3
10
  function sharedRegistry(key, create) {
4
11
  const symbol = Symbol.for(key);
5
12
  const scope = globalThis;
6
13
  const existing = scope[symbol];
7
14
  if (existing !== void 0) return existing;
8
- const registry = create();
9
- Object.defineProperty(globalThis, symbol, { value: registry });
10
- return registry;
15
+ const registry2 = create();
16
+ Object.defineProperty(globalThis, symbol, { value: registry2 });
17
+ return registry2;
11
18
  }
12
19
 
20
+ var registry = sharedRegistry(
21
+ "stimeo-ui.attribute-lease.registry.v1",
22
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
23
+ );
13
24
  function isAttributeValue(value) {
14
25
  return value === null || typeof value === "string";
15
26
  }
@@ -26,24 +37,46 @@ function readLeaseRecord(element, record) {
26
37
  return void 0;
27
38
  }
28
39
  }
29
- var AttributeLease = class _AttributeLease {
30
- static #registry = sharedRegistry(
31
- "stimeo-ui.attribute-lease.registry.v1",
32
- () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
33
- );
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 {
34
65
  #attribute;
35
66
  #record;
36
67
  #base;
68
+ #preserveAuthor;
37
69
  #held = /* @__PURE__ */ new Set();
38
70
  constructor(attribute, owner, options = {}) {
39
71
  this.#attribute = attribute;
40
72
  this.#record = `data-${owner}-${attribute}-lease`;
41
73
  this.#base = options.base === true;
42
- const names = _AttributeLease.#registry.names;
74
+ this.#preserveAuthor = options.preserveAuthor === true;
75
+ const names = registry.names;
43
76
  names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
44
77
  }
45
78
  write(element, value) {
46
- const stack = this.#stack(element);
79
+ const stack = attributeStack(element, this.#attribute);
47
80
  const hold = this.#take(stack) ?? this.#acquire(element, stack);
48
81
  this.#held.add(element);
49
82
  const shows = !this.#covered(element, stack, hold);
@@ -53,8 +86,8 @@ var AttributeLease = class _AttributeLease {
53
86
  }
54
87
  return(element) {
55
88
  const held = this.#held.delete(element);
56
- const known = _AttributeLease.#registry.stacks.get(element)?.has(this.#attribute);
57
- const stack = held || known || element.hasAttribute(this.#record) ? this.#stack(element) : [];
89
+ const known = registry.stacks.get(element)?.has(this.#attribute);
90
+ const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
58
91
  const hold = this.#take(stack);
59
92
  if (!hold) return false;
60
93
  const carries = element.getAttribute(this.#attribute) === hold.written;
@@ -72,31 +105,8 @@ var AttributeLease = class _AttributeLease {
72
105
  returnAll() {
73
106
  for (const element of Array.from(this.#held)) this.return(element);
74
107
  }
75
- #stack(element) {
76
- const stacks = _AttributeLease.#registry.stacks;
77
- const byAttribute = stacks.get(element) ?? /* @__PURE__ */ new Map();
78
- stacks.set(element, byAttribute);
79
- const stack = byAttribute.get(this.#attribute) ?? this.#seed(element);
80
- byAttribute.set(this.#attribute, stack);
81
- return stack;
82
- }
83
- #seed(element) {
84
- const found = [];
85
- for (const record of _AttributeLease.#registry.names.get(this.#attribute) ?? []) {
86
- const read = readLeaseRecord(element, record);
87
- if (read) found.push({ ...read, record });
88
- }
89
- const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
90
- return found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
91
- lease: null,
92
- record,
93
- written,
94
- original,
95
- linked: linked && index > 0
96
- }));
97
- }
98
108
  #take(stack) {
99
- const hold = stack.find((held) => held.lease === this) ?? stack.find((held) => held.lease === null && held.record === this.#record);
109
+ const hold = findHold(stack, this, this.#record);
100
110
  if (hold) hold.lease = this;
101
111
  return hold;
102
112
  }
@@ -105,7 +115,7 @@ var AttributeLease = class _AttributeLease {
105
115
  const top = stack.at(-1);
106
116
  const bottom = stack[0];
107
117
  const over = top?.written === current ? top : void 0;
108
- const from = this.#base ? bottom : over;
118
+ const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
109
119
  const hold = {
110
120
  lease: this,
111
121
  record: this.#record,
@@ -135,15 +145,11 @@ var AttributeLease = class _AttributeLease {
135
145
  );
136
146
  });
137
147
  for (const [name, recorded] of records) {
138
- if (element.getAttribute(name) === recorded) continue;
139
- if (recorded === null) element.removeAttribute(name);
140
- else element.setAttribute(name, recorded);
148
+ setAttributeIfChanged(element, name, recorded);
141
149
  }
142
150
  }
143
151
  #reflect(element, value) {
144
- if (element.getAttribute(this.#attribute) === value) return;
145
- if (value === null) element.removeAttribute(this.#attribute);
146
- else element.setAttribute(this.#attribute, value);
152
+ setAttributeIfChanged(element, this.#attribute, value);
147
153
  }
148
154
  };
149
155
 
@@ -192,25 +198,25 @@ var EscapeLayer = class _EscapeLayer {
192
198
  #active = null;
193
199
  activate(ownerDocument = document, options) {
194
200
  this.deactivate();
195
- let registry = _EscapeLayer.#registries.get(ownerDocument);
196
- if (!registry) {
197
- registry = _EscapeLayer.#createRegistry();
198
- _EscapeLayer.#registries.set(ownerDocument, registry);
199
- ownerDocument.addEventListener("keydown", registry.onKeydown);
201
+ let registry2 = _EscapeLayer.#registries.get(ownerDocument);
202
+ if (!registry2) {
203
+ registry2 = _EscapeLayer.#createRegistry();
204
+ _EscapeLayer.#registries.set(ownerDocument, registry2);
205
+ ownerDocument.addEventListener("keydown", registry2.onKeydown);
200
206
  }
201
207
  const entry = { onDismiss: options.onDismiss, claims: options.claims ?? null };
202
- registry.stack.push(entry);
208
+ registry2.stack.push(entry);
203
209
  this.#active = { document: ownerDocument, entry };
204
210
  }
205
211
  deactivate() {
206
212
  const active = this.#active;
207
213
  if (!active) return;
208
- const registry = _EscapeLayer.#registries.get(active.document);
209
- if (registry) {
210
- const index = registry.stack.lastIndexOf(active.entry);
211
- if (index >= 0) registry.stack.splice(index, 1);
212
- if (registry.stack.length === 0) {
213
- active.document.removeEventListener("keydown", registry.onKeydown);
214
+ const registry2 = _EscapeLayer.#registries.get(active.document);
215
+ if (registry2) {
216
+ const index = registry2.stack.lastIndexOf(active.entry);
217
+ if (index >= 0) registry2.stack.splice(index, 1);
218
+ if (registry2.stack.length === 0) {
219
+ active.document.removeEventListener("keydown", registry2.onKeydown);
214
220
  _EscapeLayer.#registries.delete(active.document);
215
221
  }
216
222
  }
@@ -219,22 +225,22 @@ var EscapeLayer = class _EscapeLayer {
219
225
  get ownsEscape() {
220
226
  const active = this.#active;
221
227
  if (!active) return false;
222
- const registry = _EscapeLayer.#registries.get(active.document);
223
- if (!registry) return false;
224
- return _EscapeLayer.#resolveOwner(registry.stack) === active.entry;
228
+ const registry2 = _EscapeLayer.#registries.get(active.document);
229
+ if (!registry2) return false;
230
+ return _EscapeLayer.#resolveOwner(registry2.stack) === active.entry;
225
231
  }
226
232
  static #createRegistry() {
227
- const registry = {
233
+ const registry2 = {
228
234
  stack: [],
229
235
  onKeydown: (event) => {
230
236
  if (event.key !== "Escape" || event.defaultPrevented || event.isComposing) return;
231
- const owner = _EscapeLayer.#resolveOwner(registry.stack);
237
+ const owner = _EscapeLayer.#resolveOwner(registry2.stack);
232
238
  if (!owner) return;
233
239
  event.preventDefault();
234
240
  owner.onDismiss();
235
241
  }
236
242
  };
237
- return registry;
243
+ return registry2;
238
244
  }
239
245
  static #resolveOwner(stack) {
240
246
  for (let index = stack.length - 1; index >= 0; index--) {
@@ -467,6 +473,9 @@ var MicrotaskCoalescer = class {
467
473
  this.#queued = false;
468
474
  this.#generation += 1;
469
475
  }
476
+ get pending() {
477
+ return this.#queued;
478
+ }
470
479
  schedule() {
471
480
  if (!this.#active || this.#queued) return;
472
481
  this.#queued = true;
@@ -495,6 +504,9 @@ function queryOpenDescendants(root, selector) {
495
504
  return matches;
496
505
  }
497
506
 
507
+ function holdsFocus(element) {
508
+ return element.matches(":focus") || deepActiveElement(element.ownerDocument) === element;
509
+ }
498
510
  var TabindexLoan = class _TabindexLoan {
499
511
  static #registry = sharedRegistry(
500
512
  "stimeo-ui.tabindex-loan.registry.v1",
@@ -502,19 +514,22 @@ var TabindexLoan = class _TabindexLoan {
502
514
  );
503
515
  #value;
504
516
  #record;
517
+ #preserveFocus;
505
518
  #lent = /* @__PURE__ */ new Set();
506
- constructor(value, owner) {
519
+ constructor(value, owner, options = {}) {
507
520
  this.#value = value;
508
521
  this.#record = `data-${owner}-tabindex-loan`;
522
+ this.#preserveFocus = options.preserveFocus === true;
509
523
  _TabindexLoan.#registry.names.add(this.#record);
510
524
  }
511
- lend(element) {
525
+ lend(element, options = {}) {
512
526
  const stack = this.#stack(element);
513
527
  const current = element.getAttribute("tabindex");
514
528
  const held = stack.find((hold) => hold.loan === this) ?? stack.find(
515
529
  (hold) => hold.loan === null && hold.record === this.#record && hold.value === this.#value
516
530
  );
517
531
  const linked = stack.at(-1)?.value === current;
532
+ if (!held && options.onlyIfUnfocusable && (current !== null || element.tabIndex >= 0)) return;
518
533
  if (!held && current !== null && !linked) return;
519
534
  this.#lent.add(element);
520
535
  if (held) held.loan = this;
@@ -524,19 +539,28 @@ var TabindexLoan = class _TabindexLoan {
524
539
  element.setAttribute("tabindex", this.#value);
525
540
  }
526
541
  }
527
- returnAll() {
528
- for (const element of this.#lent) {
529
- const stack = this.#stack(element);
530
- const hold = stack.find((held) => held.loan === this);
531
- if (hold) this.#release(element, stack, hold);
542
+ return(element) {
543
+ const stack = this.#stack(element);
544
+ const hold = stack.find((held) => held.loan === this) ?? stack.find(
545
+ (held) => held.loan === null && held.record === this.#record && held.value === this.#value
546
+ );
547
+ if (!hold) return false;
548
+ if (!this.#release(element, stack, hold, this.#preserveFocus)) {
549
+ hold.loan = this;
550
+ this.#lent.add(element);
551
+ return false;
532
552
  }
533
- this.#lent.clear();
553
+ this.#lent.delete(element);
554
+ return true;
555
+ }
556
+ returnAll() {
557
+ for (const element of Array.from(this.#lent)) this.return(element);
534
558
  }
535
559
  reclaim(element) {
536
560
  if (element.getAttribute(this.#record) !== this.#value) return;
537
561
  const stack = this.#stack(element);
538
562
  const hold = stack.find((held) => held.loan === null && held.record === this.#record);
539
- if (hold && !element.matches(":focus")) this.#release(element, stack, hold);
563
+ if (hold && !holdsFocus(element)) this.#release(element, stack, hold);
540
564
  }
541
565
  reclaimWithin(root) {
542
566
  for (const element of queryOpenDescendants(root, `[${this.#record}]`)) {
@@ -560,26 +584,26 @@ var TabindexLoan = class _TabindexLoan {
560
584
  for (const [index, hold] of holds.entries()) hold.linked = index > 0;
561
585
  return holds;
562
586
  }
563
- #release(element, stack, hold) {
587
+ #release(element, stack, hold, preserveFocus = false) {
564
588
  const current = element.getAttribute("tabindex");
565
589
  const index = stack.indexOf(hold);
566
590
  const owns = current === hold.value && !stack.slice(index + 1).some((above2) => above2.value === current);
591
+ if (owns && preserveFocus && holdsFocus(element)) return false;
567
592
  stack.splice(index, 1);
568
593
  const above = stack[index];
569
594
  if (above) above.linked &&= hold.linked;
570
595
  this.#mark(element, stack);
571
- if (!owns) return;
596
+ if (!owns) return true;
572
597
  const below = hold.linked ? stack[index - 1] : void 0;
573
598
  if (!below) element.removeAttribute("tabindex");
574
599
  else if (below.value !== current) element.setAttribute("tabindex", below.value);
600
+ return true;
575
601
  }
576
602
  #mark(element, stack) {
577
603
  const records = /* @__PURE__ */ new Map([[this.#record, null]]);
578
604
  for (const hold of stack) records.set(hold.record, hold.value);
579
605
  for (const [name, recorded] of records) {
580
- if (element.getAttribute(name) === recorded) continue;
581
- if (recorded === null) element.removeAttribute(name);
582
- else element.setAttribute(name, recorded);
606
+ setAttributeIfChanged(element, name, recorded);
583
607
  }
584
608
  }
585
609
  };
@@ -682,23 +706,23 @@ var FocusTrap = class _FocusTrap {
682
706
  return typeof option === "function" ? option() : option;
683
707
  }
684
708
  #joinStack() {
685
- const registry = _FocusTrap.#registry(document);
686
- if (registry.stack.length === 0) {
687
- document.addEventListener("keydown", registry.onKeydown);
688
- document.addEventListener("turbo:morph", registry.onMorph);
689
- document.addEventListener("turbo:morph-element", registry.onMorph);
709
+ const registry2 = _FocusTrap.#registry(document);
710
+ if (registry2.stack.length === 0) {
711
+ document.addEventListener("keydown", registry2.onKeydown);
712
+ document.addEventListener("turbo:morph", registry2.onMorph);
713
+ document.addEventListener("turbo:morph-element", registry2.onMorph);
690
714
  }
691
- registry.stack.push(this.#entry);
715
+ registry2.stack.push(this.#entry);
692
716
  }
693
717
  #leaveStack() {
694
- const registry = _FocusTrap.#registry(document);
695
- const index = registry.stack.indexOf(this.#entry);
696
- const above = registry.stack.slice(index + 1);
697
- registry.stack.splice(index, 1);
698
- if (registry.stack.length === 0) {
699
- document.removeEventListener("keydown", registry.onKeydown);
700
- document.removeEventListener("turbo:morph", registry.onMorph);
701
- document.removeEventListener("turbo:morph-element", registry.onMorph);
718
+ const registry2 = _FocusTrap.#registry(document);
719
+ const index = registry2.stack.indexOf(this.#entry);
720
+ const above = registry2.stack.slice(index + 1);
721
+ registry2.stack.splice(index, 1);
722
+ if (registry2.stack.length === 0) {
723
+ document.removeEventListener("keydown", registry2.onKeydown);
724
+ document.removeEventListener("turbo:morph", registry2.onMorph);
725
+ document.removeEventListener("turbo:morph-element", registry2.onMorph);
702
726
  }
703
727
  return above;
704
728
  }
@@ -773,22 +797,22 @@ var FocusTrap = class _FocusTrap {
773
797
  }
774
798
  }
775
799
  #lockScroll() {
776
- const registry = _FocusTrap.#registry(document);
800
+ const registry2 = _FocusTrap.#registry(document);
777
801
  const body = document.body;
778
802
  if (!body.hasAttribute(OVERFLOW_MARK)) body.setAttribute(OVERFLOW_MARK, body.style.overflow);
779
- registry.scrollLocks.add(this.#entry);
803
+ registry2.scrollLocks.add(this.#entry);
780
804
  this.#entry.lockedBody = body;
781
805
  body.style.overflow = "hidden";
782
806
  }
783
807
  #unlockScroll() {
784
- const registry = _FocusTrap.#registry(document);
808
+ const registry2 = _FocusTrap.#registry(document);
785
809
  const body = this.#entry.lockedBody;
786
810
  this.#entry.lockedBody = null;
787
- if (!registry.scrollLocks.delete(this.#entry) || !body) return;
788
- if (!_FocusTrap.#isLocked(registry, body)) _FocusTrap.#unlock(body);
811
+ if (!registry2.scrollLocks.delete(this.#entry) || !body) return;
812
+ if (!_FocusTrap.#isLocked(registry2, body)) _FocusTrap.#unlock(body);
789
813
  }
790
- static #isLocked(registry, body) {
791
- return [...registry.scrollLocks].some((trap) => trap.lockedBody === body);
814
+ static #isLocked(registry2, body) {
815
+ return [...registry2.scrollLocks].some((trap) => trap.lockedBody === body);
792
816
  }
793
817
  static #unlock(body) {
794
818
  const saved = body.getAttribute(OVERFLOW_MARK);
@@ -797,62 +821,62 @@ var FocusTrap = class _FocusTrap {
797
821
  body.style.overflow = saved;
798
822
  }
799
823
  static #sweep() {
800
- const registry = _FocusTrap.#registry(document);
824
+ const registry2 = _FocusTrap.#registry(document);
801
825
  for (const element of queryOpenDescendants(document, `[${INERT_MARK}]`)) {
802
- if (registry.inerted.has(element)) continue;
826
+ if (registry2.inerted.has(element)) continue;
803
827
  element.removeAttribute(INERT_MARK);
804
828
  element.inert = false;
805
829
  }
806
- if (!_FocusTrap.#isLocked(registry, document.body)) _FocusTrap.#unlock(document.body);
830
+ if (!_FocusTrap.#isLocked(registry2, document.body)) _FocusTrap.#unlock(document.body);
807
831
  }
808
832
  static #registry(ownerDocument) {
809
833
  const existing = _FocusTrap.#registries.get(ownerDocument);
810
834
  if (existing) return existing;
811
- const morphs = new MicrotaskCoalescer(() => _FocusTrap.#reapply(registry));
835
+ const morphs = new MicrotaskCoalescer(() => _FocusTrap.#reapply(registry2));
812
836
  morphs.activate();
813
- const registry = {
837
+ const registry2 = {
814
838
  stack: [],
815
- onKeydown: (event) => _FocusTrap.#resolveTab(registry.stack, event),
839
+ onKeydown: (event) => _FocusTrap.#resolveTab(registry2.stack, event),
816
840
  onMorph: () => morphs.schedule(),
817
841
  inerted: /* @__PURE__ */ new Set(),
818
842
  scrollLocks: /* @__PURE__ */ new Set()
819
843
  };
820
- _FocusTrap.#registries.set(ownerDocument, registry);
821
- return registry;
844
+ _FocusTrap.#registries.set(ownerDocument, registry2);
845
+ return registry2;
822
846
  }
823
- static #reapply(registry) {
847
+ static #reapply(registry2) {
824
848
  _FocusTrap.#reconcileBackground(document);
825
849
  const body = document.body;
826
- if (!_FocusTrap.#isLocked(registry, body)) return;
850
+ if (!_FocusTrap.#isLocked(registry2, body)) return;
827
851
  if (!body.hasAttribute(OVERFLOW_MARK)) body.setAttribute(OVERFLOW_MARK, body.style.overflow);
828
852
  body.style.overflow = "hidden";
829
853
  }
830
854
  static #reconcileBackground(ownerDocument) {
831
- const registry = _FocusTrap.#registry(ownerDocument);
832
- for (const element of registry.inerted) {
833
- if (!element.hasAttribute(INERT_MARK)) registry.inerted.delete(element);
855
+ const registry2 = _FocusTrap.#registry(ownerDocument);
856
+ for (const element of registry2.inerted) {
857
+ if (!element.hasAttribute(INERT_MARK)) registry2.inerted.delete(element);
834
858
  }
835
- const background = _FocusTrap.#backgroundOf(registry);
836
- for (const element of registry.inerted) {
859
+ const background = _FocusTrap.#backgroundOf(registry2);
860
+ for (const element of registry2.inerted) {
837
861
  if (background.has(element)) continue;
838
862
  element.removeAttribute(INERT_MARK);
839
863
  element.inert = false;
840
- registry.inerted.delete(element);
864
+ registry2.inerted.delete(element);
841
865
  }
842
866
  const added = [];
843
867
  for (const element of background) {
844
- if (registry.inerted.has(element)) continue;
868
+ if (registry2.inerted.has(element)) continue;
845
869
  element.setAttribute(INERT_MARK, "");
846
870
  element.inert = true;
847
- registry.inerted.add(element);
871
+ registry2.inerted.add(element);
848
872
  added.push(element);
849
873
  }
850
874
  return added;
851
875
  }
852
- static #backgroundOf(registry) {
853
- const containers = registry.stack.map((trap) => trap.container());
876
+ static #backgroundOf(registry2) {
877
+ const containers = registry2.stack.map((trap) => trap.container());
854
878
  let top = -1;
855
- registry.stack.forEach((trap, index) => {
879
+ registry2.stack.forEach((trap, index) => {
856
880
  if (trap.isolated && containers[index]) top = index;
857
881
  });
858
882
  const background = /* @__PURE__ */ new Set();
@@ -867,7 +891,7 @@ var FocusTrap = class _FocusTrap {
867
891
  const parent = flatTreeParent(node);
868
892
  for (const sibling of parent ? flatTreeChildren(parent) : []) {
869
893
  if (!(sibling instanceof HTMLElement) || kept.has(sibling)) continue;
870
- if (sibling.inert && !registry.inerted.has(sibling)) continue;
894
+ if (sibling.inert && !registry2.inerted.has(sibling)) continue;
871
895
  background.add(sibling);
872
896
  }
873
897
  }
@@ -975,6 +999,9 @@ var MorphRenderWatcher = class {
975
999
  schedule() {
976
1000
  this.#pass.schedule();
977
1001
  }
1002
+ get pending() {
1003
+ return this.#pass.pending;
1004
+ }
978
1005
  disconnect() {
979
1006
  this.#listeners.dispose();
980
1007
  this.#pass.cancel();