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
@@ -35,6 +35,11 @@ function canTakeFocus(element) {
35
35
  if (element.disabled) return false;
36
36
  return !inheritsFieldsetDisabled(element);
37
37
  }
38
+ function deepActiveElement(ownerDocument) {
39
+ let active = ownerDocument.activeElement;
40
+ while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;
41
+ return active;
42
+ }
38
43
 
39
44
  var LayoutObserver = class {
40
45
  #callback;
@@ -118,6 +123,9 @@ var MicrotaskCoalescer = class {
118
123
  this.#queued = false;
119
124
  this.#generation += 1;
120
125
  }
126
+ get pending() {
127
+ return this.#queued;
128
+ }
121
129
  schedule() {
122
130
  if (!this.#active || this.#queued) return;
123
131
  this.#queued = true;
@@ -148,6 +156,9 @@ var MorphRenderWatcher = class {
148
156
  schedule() {
149
157
  this.#pass.schedule();
150
158
  }
159
+ get pending() {
160
+ return this.#pass.pending;
161
+ }
151
162
  disconnect() {
152
163
  this.#listeners.dispose();
153
164
  this.#pass.cancel();
@@ -201,6 +212,94 @@ var NumberValueReader = class {
201
212
  }
202
213
  };
203
214
 
215
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
216
+ if (element.getAttribute(name) === value) return false;
217
+ if (value === null) element.removeAttribute(name);
218
+ else element.setAttribute(name, value);
219
+ return true;
220
+ }
221
+
222
+ var OwnedText = class {
223
+ #attribute;
224
+ #channel;
225
+ #guard;
226
+ #writes = /* @__PURE__ */ new WeakMap();
227
+ constructor(attribute, channel = "text", guard = () => true) {
228
+ this.#attribute = attribute;
229
+ this.#channel = channel;
230
+ this.#guard = guard;
231
+ }
232
+ hasRecord(element) {
233
+ return element.hasAttribute(this.#attribute);
234
+ }
235
+ read(element, evidence = {}) {
236
+ if (evidence.source === "live") return this.#writes.get(element) ?? null;
237
+ const raw = element.getAttribute(this.#attribute);
238
+ if (raw === null) return null;
239
+ try {
240
+ const record = JSON.parse(raw);
241
+ if (!Array.isArray(record) || record.length !== 3 || record[0] !== this.#channel || typeof record[1] !== "string" || typeof record[2] !== "string")
242
+ return null;
243
+ return { original: record[1], written: record[2] };
244
+ } catch {
245
+ return null;
246
+ }
247
+ }
248
+ owns(element, evidence = {}) {
249
+ return this.#ownedRecord(element, evidence) !== null;
250
+ }
251
+ #ownedRecord(element, evidence) {
252
+ const record = this.read(element, evidence);
253
+ if (record === null || !this.#guard(element)) return null;
254
+ if (this.#channel === "text" && element.firstElementChild !== null) return null;
255
+ const current = this.#current(element);
256
+ return current === record.written || evidence.source === "live" && evidence.allowOriginal === true && current === record.original ? record : null;
257
+ }
258
+ write(element, written, original, force = false) {
259
+ const current = this.#current(element);
260
+ if (current === null) return;
261
+ const before = original ?? this.#writes.get(element)?.original ?? this.read(element)?.original ?? current;
262
+ if (force || current !== written) this.#put(element, written);
263
+ this.remember(element, written, before);
264
+ }
265
+ remember(element, written, original) {
266
+ const current = this.#current(element);
267
+ if (current === null) return;
268
+ const before = original ?? this.#writes.get(element)?.original ?? this.read(element)?.original ?? current;
269
+ this.#writes.set(element, { original: before, written });
270
+ setAttributeIfChanged(
271
+ element,
272
+ this.#attribute,
273
+ JSON.stringify([this.#channel, before, written])
274
+ );
275
+ }
276
+ clear(element, evidence = {}) {
277
+ if (!this.owns(element, evidence)) return false;
278
+ if (this.#current(element) !== "") this.#put(element, "");
279
+ this.forget(element);
280
+ return true;
281
+ }
282
+ restore(element, evidence = {}) {
283
+ const record = this.#ownedRecord(element, evidence);
284
+ if (record === null) return false;
285
+ if (this.#current(element) !== record.original) this.#put(element, record.original);
286
+ this.forget(element);
287
+ return true;
288
+ }
289
+ forget(element) {
290
+ setAttributeIfChanged(element, this.#attribute, null);
291
+ this.#writes.delete(element);
292
+ }
293
+ #current(element) {
294
+ if (this.#channel === "text") return element.textContent ?? "";
295
+ return element instanceof HTMLInputElement ? element.value : null;
296
+ }
297
+ #put(element, text) {
298
+ if (this.#channel === "text") element.textContent = text;
299
+ else if (element instanceof HTMLInputElement) element.value = text;
300
+ }
301
+ };
302
+
204
303
  var TimerRegistry = class {
205
304
  ids = /* @__PURE__ */ new Set();
206
305
  clear(id) {
@@ -261,6 +360,9 @@ function sharedRegistry(key, create) {
261
360
  return registry;
262
361
  }
263
362
 
363
+ function holdsFocus(element) {
364
+ return element.matches(":focus") || deepActiveElement(element.ownerDocument) === element;
365
+ }
264
366
  var TabindexLoan = class _TabindexLoan {
265
367
  static #registry = sharedRegistry(
266
368
  "stimeo-ui.tabindex-loan.registry.v1",
@@ -268,19 +370,22 @@ var TabindexLoan = class _TabindexLoan {
268
370
  );
269
371
  #value;
270
372
  #record;
373
+ #preserveFocus;
271
374
  #lent = /* @__PURE__ */ new Set();
272
- constructor(value, owner) {
375
+ constructor(value, owner, options = {}) {
273
376
  this.#value = value;
274
377
  this.#record = `data-${owner}-tabindex-loan`;
378
+ this.#preserveFocus = options.preserveFocus === true;
275
379
  _TabindexLoan.#registry.names.add(this.#record);
276
380
  }
277
- lend(element) {
381
+ lend(element, options = {}) {
278
382
  const stack = this.#stack(element);
279
383
  const current = element.getAttribute("tabindex");
280
384
  const held = stack.find((hold) => hold.loan === this) ?? stack.find(
281
385
  (hold) => hold.loan === null && hold.record === this.#record && hold.value === this.#value
282
386
  );
283
387
  const linked = stack.at(-1)?.value === current;
388
+ if (!held && options.onlyIfUnfocusable && (current !== null || element.tabIndex >= 0)) return;
284
389
  if (!held && current !== null && !linked) return;
285
390
  this.#lent.add(element);
286
391
  if (held) held.loan = this;
@@ -290,19 +395,28 @@ var TabindexLoan = class _TabindexLoan {
290
395
  element.setAttribute("tabindex", this.#value);
291
396
  }
292
397
  }
293
- returnAll() {
294
- for (const element of this.#lent) {
295
- const stack = this.#stack(element);
296
- const hold = stack.find((held) => held.loan === this);
297
- if (hold) this.#release(element, stack, hold);
398
+ return(element) {
399
+ const stack = this.#stack(element);
400
+ const hold = stack.find((held) => held.loan === this) ?? stack.find(
401
+ (held) => held.loan === null && held.record === this.#record && held.value === this.#value
402
+ );
403
+ if (!hold) return false;
404
+ if (!this.#release(element, stack, hold, this.#preserveFocus)) {
405
+ hold.loan = this;
406
+ this.#lent.add(element);
407
+ return false;
298
408
  }
299
- this.#lent.clear();
409
+ this.#lent.delete(element);
410
+ return true;
411
+ }
412
+ returnAll() {
413
+ for (const element of Array.from(this.#lent)) this.return(element);
300
414
  }
301
415
  reclaim(element) {
302
416
  if (element.getAttribute(this.#record) !== this.#value) return;
303
417
  const stack = this.#stack(element);
304
418
  const hold = stack.find((held) => held.loan === null && held.record === this.#record);
305
- if (hold && !element.matches(":focus")) this.#release(element, stack, hold);
419
+ if (hold && !holdsFocus(element)) this.#release(element, stack, hold);
306
420
  }
307
421
  reclaimWithin(root) {
308
422
  for (const element of queryOpenDescendants(root, `[${this.#record}]`)) {
@@ -326,26 +440,26 @@ var TabindexLoan = class _TabindexLoan {
326
440
  for (const [index, hold] of holds.entries()) hold.linked = index > 0;
327
441
  return holds;
328
442
  }
329
- #release(element, stack, hold) {
443
+ #release(element, stack, hold, preserveFocus = false) {
330
444
  const current = element.getAttribute("tabindex");
331
445
  const index = stack.indexOf(hold);
332
446
  const owns = current === hold.value && !stack.slice(index + 1).some((above2) => above2.value === current);
447
+ if (owns && preserveFocus && holdsFocus(element)) return false;
333
448
  stack.splice(index, 1);
334
449
  const above = stack[index];
335
450
  if (above) above.linked &&= hold.linked;
336
451
  this.#mark(element, stack);
337
- if (!owns) return;
452
+ if (!owns) return true;
338
453
  const below = hold.linked ? stack[index - 1] : void 0;
339
454
  if (!below) element.removeAttribute("tabindex");
340
455
  else if (below.value !== current) element.setAttribute("tabindex", below.value);
456
+ return true;
341
457
  }
342
458
  #mark(element, stack) {
343
459
  const records = /* @__PURE__ */ new Map([[this.#record, null]]);
344
460
  for (const hold of stack) records.set(hold.record, hold.value);
345
461
  for (const [name, recorded] of records) {
346
- if (element.getAttribute(name) === recorded) continue;
347
- if (recorded === null) element.removeAttribute(name);
348
- else element.setAttribute(name, recorded);
462
+ setAttributeIfChanged(element, name, recorded);
349
463
  }
350
464
  }
351
465
  };
@@ -360,6 +474,11 @@ var MENU_TARGET = "data-stimeo--menu-target";
360
474
  var BOOKKEEPING = [BANKED, INDEX, SAVED_ROLE, SAVED_TABINDEX, SAVED_MENU_TARGET];
361
475
  var OWNED_LABEL = "owns-label";
362
476
  var OverflowMenuController = class _OverflowMenuController extends Controller {
477
+ #labelText = new OwnedText(
478
+ this.#attr(OWNED_LABEL),
479
+ "text",
480
+ (trigger) => this.#carriesOnlyText(trigger)
481
+ );
363
482
  #numbers = new NumberValueReader();
364
483
  #attr(name) {
365
484
  return `data-${this.identifier}-${name}`;
@@ -643,17 +762,13 @@ var OverflowMenuController = class _OverflowMenuController extends Controller {
643
762
  this.#releaseLabel(trigger);
644
763
  return;
645
764
  }
646
- if (owned && trigger.textContent === label) return;
647
- trigger.textContent = label;
648
- trigger.setAttribute(this.#attr(OWNED_LABEL), label);
765
+ this.#labelText.write(trigger, label);
649
766
  }
650
767
  #ownsLabel(trigger) {
651
- return trigger.getAttribute(this.#attr(OWNED_LABEL)) === trigger.textContent && this.#carriesOnlyText(trigger);
768
+ return this.#labelText.owns(trigger);
652
769
  }
653
770
  #releaseLabel(trigger) {
654
- if (!this.#ownsLabel(trigger)) return;
655
- trigger.textContent = "";
656
- trigger.removeAttribute(this.#attr(OWNED_LABEL));
771
+ this.#labelText.clear(trigger);
657
772
  }
658
773
  #isBareTrigger(trigger) {
659
774
  return (trigger.textContent ?? "").trim() === "" && this.#carriesOnlyText(trigger);