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
@@ -31,21 +31,39 @@ function logicalArrowKey(key, element) {
31
31
  if (!isRtl(element)) return key;
32
32
  return key === "ArrowRight" ? "ArrowLeft" : "ArrowRight";
33
33
  }
34
+ function gridDirectionElement(grid, root) {
35
+ const table = grid.closest("table");
36
+ return table !== null && root.contains(table) ? table : grid;
37
+ }
34
38
  function isReservedArrowChord(event, allow = []) {
35
39
  if (!event.key.startsWith("Arrow")) return false;
36
40
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
37
41
  }
42
+ function hasModifierChord(event) {
43
+ return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
44
+ }
45
+
46
+ function setAttributeIfChanged(element, name, value, beforeWrite) {
47
+ if (element.getAttribute(name) === value) return false;
48
+ if (value === null) element.removeAttribute(name);
49
+ else element.setAttribute(name, value);
50
+ return true;
51
+ }
38
52
 
39
53
  function sharedRegistry(key, create) {
40
54
  const symbol = Symbol.for(key);
41
55
  const scope = globalThis;
42
56
  const existing = scope[symbol];
43
57
  if (existing !== void 0) return existing;
44
- const registry = create();
45
- Object.defineProperty(globalThis, symbol, { value: registry });
46
- return registry;
58
+ const registry2 = create();
59
+ Object.defineProperty(globalThis, symbol, { value: registry2 });
60
+ return registry2;
47
61
  }
48
62
 
63
+ var registry = sharedRegistry(
64
+ "stimeo-ui.attribute-lease.registry.v1",
65
+ () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
66
+ );
49
67
  function isAttributeValue(value) {
50
68
  return value === null || typeof value === "string";
51
69
  }
@@ -62,24 +80,46 @@ function readLeaseRecord(element, record) {
62
80
  return void 0;
63
81
  }
64
82
  }
65
- var AttributeLease = class _AttributeLease {
66
- static #registry = sharedRegistry(
67
- "stimeo-ui.attribute-lease.registry.v1",
68
- () => ({ stacks: /* @__PURE__ */ new WeakMap(), names: /* @__PURE__ */ new Map() })
69
- );
83
+ function attributeStack(element, attribute) {
84
+ const byAttribute = registry.stacks.get(element) ?? /* @__PURE__ */ new Map();
85
+ registry.stacks.set(element, byAttribute);
86
+ const known = byAttribute.get(attribute);
87
+ if (known) return known;
88
+ const found = [];
89
+ for (const record of registry.names.get(attribute) ?? []) {
90
+ const read = readLeaseRecord(element, record);
91
+ if (read) found.push({ ...read, record });
92
+ }
93
+ const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
94
+ const stack = found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
95
+ lease: null,
96
+ record,
97
+ written,
98
+ original,
99
+ linked: linked && index > 0
100
+ }));
101
+ byAttribute.set(attribute, stack);
102
+ return stack;
103
+ }
104
+ function findHold(stack, lease, record) {
105
+ return stack.find((held) => held.lease === lease) ?? stack.find((held) => held.lease === null && held.record === record);
106
+ }
107
+ var AttributeLease = class {
70
108
  #attribute;
71
109
  #record;
72
110
  #base;
111
+ #preserveAuthor;
73
112
  #held = /* @__PURE__ */ new Set();
74
113
  constructor(attribute, owner, options = {}) {
75
114
  this.#attribute = attribute;
76
115
  this.#record = `data-${owner}-${attribute}-lease`;
77
116
  this.#base = options.base === true;
78
- const names = _AttributeLease.#registry.names;
117
+ this.#preserveAuthor = options.preserveAuthor === true;
118
+ const names = registry.names;
79
119
  names.set(attribute, (names.get(attribute) ?? /* @__PURE__ */ new Set()).add(this.#record));
80
120
  }
81
121
  write(element, value) {
82
- const stack = this.#stack(element);
122
+ const stack = attributeStack(element, this.#attribute);
83
123
  const hold = this.#take(stack) ?? this.#acquire(element, stack);
84
124
  this.#held.add(element);
85
125
  const shows = !this.#covered(element, stack, hold);
@@ -89,8 +129,8 @@ var AttributeLease = class _AttributeLease {
89
129
  }
90
130
  return(element) {
91
131
  const held = this.#held.delete(element);
92
- const known = _AttributeLease.#registry.stacks.get(element)?.has(this.#attribute);
93
- const stack = held || known || element.hasAttribute(this.#record) ? this.#stack(element) : [];
132
+ const known = registry.stacks.get(element)?.has(this.#attribute);
133
+ const stack = held || known || element.hasAttribute(this.#record) ? attributeStack(element, this.#attribute) : [];
94
134
  const hold = this.#take(stack);
95
135
  if (!hold) return false;
96
136
  const carries = element.getAttribute(this.#attribute) === hold.written;
@@ -108,31 +148,8 @@ var AttributeLease = class _AttributeLease {
108
148
  returnAll() {
109
149
  for (const element of Array.from(this.#held)) this.return(element);
110
150
  }
111
- #stack(element) {
112
- const stacks = _AttributeLease.#registry.stacks;
113
- const byAttribute = stacks.get(element) ?? /* @__PURE__ */ new Map();
114
- stacks.set(element, byAttribute);
115
- const stack = byAttribute.get(this.#attribute) ?? this.#seed(element);
116
- byAttribute.set(this.#attribute, stack);
117
- return stack;
118
- }
119
- #seed(element) {
120
- const found = [];
121
- for (const record of _AttributeLease.#registry.names.get(this.#attribute) ?? []) {
122
- const read = readLeaseRecord(element, record);
123
- if (read) found.push({ ...read, record });
124
- }
125
- const depth = ({ beneath }) => beneath.filter((name) => found.some((other) => other.record === name)).length;
126
- return found.sort((one, other) => depth(one) - depth(other)).map(({ record, written, original, linked }, index) => ({
127
- lease: null,
128
- record,
129
- written,
130
- original,
131
- linked: linked && index > 0
132
- }));
133
- }
134
151
  #take(stack) {
135
- const hold = stack.find((held) => held.lease === this) ?? stack.find((held) => held.lease === null && held.record === this.#record);
152
+ const hold = findHold(stack, this, this.#record);
136
153
  if (hold) hold.lease = this;
137
154
  return hold;
138
155
  }
@@ -141,7 +158,7 @@ var AttributeLease = class _AttributeLease {
141
158
  const top = stack.at(-1);
142
159
  const bottom = stack[0];
143
160
  const over = top?.written === current ? top : void 0;
144
- const from = this.#base ? bottom : over;
161
+ const from = this.#base ? this.#preserveAuthor && !stack.some((held) => held.written === current) ? void 0 : bottom : over;
145
162
  const hold = {
146
163
  lease: this,
147
164
  record: this.#record,
@@ -171,15 +188,11 @@ var AttributeLease = class _AttributeLease {
171
188
  );
172
189
  });
173
190
  for (const [name, recorded] of records) {
174
- if (element.getAttribute(name) === recorded) continue;
175
- if (recorded === null) element.removeAttribute(name);
176
- else element.setAttribute(name, recorded);
191
+ setAttributeIfChanged(element, name, recorded);
177
192
  }
178
193
  }
179
194
  #reflect(element, value) {
180
- if (element.getAttribute(this.#attribute) === value) return;
181
- if (value === null) element.removeAttribute(this.#attribute);
182
- else element.setAttribute(this.#attribute, value);
195
+ setAttributeIfChanged(element, this.#attribute, value);
183
196
  }
184
197
  };
185
198
 
@@ -243,6 +256,30 @@ function parseISOMonthString(monthStr) {
243
256
  function toISOMonthString(date) {
244
257
  return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}`;
245
258
  }
259
+ function monthGridDays(year, month, weekStart) {
260
+ const first = new Date(year, month - 1, 1);
261
+ const offset = (first.getDay() - weekStart + 7) % 7;
262
+ const current = new Date(first);
263
+ current.setDate(first.getDate() - offset);
264
+ const days = [];
265
+ for (let i = 0; i < 42; i++) {
266
+ days.push(new Date(current));
267
+ current.setDate(current.getDate() + 1);
268
+ }
269
+ return days;
270
+ }
271
+ function dateInMonthClamped(date, year, month) {
272
+ const target = new Date(year, month - 1, 1);
273
+ const lastDay = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
274
+ target.setDate(Math.min(date.getDate(), lastDay));
275
+ return target;
276
+ }
277
+ function shiftMonthClamped(date, delta) {
278
+ return dateInMonthClamped(date, date.getFullYear(), date.getMonth() + 1 + delta);
279
+ }
280
+ function shiftYearClamped(date, delta) {
281
+ return dateInMonthClamped(date, date.getFullYear() + delta, date.getMonth() + 1);
282
+ }
246
283
  var MONTH_LABEL_OPTIONS = { month: "long", year: "numeric" };
247
284
  function monthLabelFormatter(locale) {
248
285
  return intlFormatter(Intl.DateTimeFormat, locale, MONTH_LABEL_OPTIONS, "en");
@@ -288,6 +325,9 @@ var MicrotaskCoalescer = class {
288
325
  this.#queued = false;
289
326
  this.#generation += 1;
290
327
  }
328
+ get pending() {
329
+ return this.#queued;
330
+ }
291
331
  schedule() {
292
332
  if (!this.#active || this.#queued) return;
293
333
  this.#queued = true;
@@ -318,6 +358,9 @@ var MorphRenderWatcher = class {
318
358
  schedule() {
319
359
  this.#pass.schedule();
320
360
  }
361
+ get pending() {
362
+ return this.#pass.pending;
363
+ }
321
364
  disconnect() {
322
365
  this.#listeners.dispose();
323
366
  this.#pass.cancel();
@@ -526,6 +569,9 @@ var DateRangePickerController = class extends Controller {
526
569
  onKeydown(event) {
527
570
  if (event.defaultPrevented) return;
528
571
  if (isReservedArrowChord(event)) return;
572
+ if ((event.key === "Home" || event.key === "End") && hasModifierChord(event)) return;
573
+ if ((event.key === "PageUp" || event.key === "PageDown") && (event.ctrlKey || event.altKey || event.metaKey))
574
+ return;
529
575
  const cell = this.#cellFrom(event.target);
530
576
  if (!cell) return;
531
577
  const dateStr = cell.getAttribute("data-date") ?? "";
@@ -546,7 +592,8 @@ var DateRangePickerController = class extends Controller {
546
592
  return;
547
593
  }
548
594
  let next = null;
549
- switch (logicalArrowKey(event.key, this.element)) {
595
+ const directionElement = this.hasGridTarget ? gridDirectionElement(this.gridTarget, this.element) : this.element;
596
+ switch (logicalArrowKey(event.key, directionElement)) {
550
597
  case "ArrowLeft":
551
598
  next = addDays(date, -1);
552
599
  break;
@@ -632,10 +679,8 @@ var DateRangePickerController = class extends Controller {
632
679
  #shiftMonth(delta) {
633
680
  const info = parseISOMonthString(this.#viewMonth);
634
681
  if (!info) return;
635
- const target = new Date(info.year, info.month - 1 + delta, 1);
682
+ const target = dateInMonthClamped(this.#focusedDate, info.year, info.month + delta);
636
683
  this.#viewMonth = toISOMonthString(target);
637
- const lastDay = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
638
- target.setDate(Math.min(this.#focusedDate.getDate(), lastDay));
639
684
  this.#focusedDate = target;
640
685
  this.#render();
641
686
  }
@@ -655,7 +700,7 @@ var DateRangePickerController = class extends Controller {
655
700
  this.monthLabelTarget.textContent = formatter.format(new Date(year, month - 1, 1));
656
701
  }
657
702
  const [rangeStart, rangeEnd] = this.#visualRange();
658
- const days = gridDays(year, month);
703
+ const days = monthGridDays(year, month, 0);
659
704
  const focusedStr = toISODateString(this.#focusedDate);
660
705
  const todayStr = toISODateString(/* @__PURE__ */ new Date());
661
706
  const cells = this.cellTargets;
@@ -794,30 +839,6 @@ function addDays(date, n) {
794
839
  next.setDate(next.getDate() + n);
795
840
  return next;
796
841
  }
797
- function shiftMonthClamped(date, delta) {
798
- const target = new Date(date.getFullYear(), date.getMonth() + delta, 1);
799
- const lastDay = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
800
- target.setDate(Math.min(date.getDate(), lastDay));
801
- return target;
802
- }
803
- function shiftYearClamped(date, delta) {
804
- const target = new Date(date.getFullYear() + delta, date.getMonth(), 1);
805
- const lastDay = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
806
- target.setDate(Math.min(date.getDate(), lastDay));
807
- return target;
808
- }
809
- function gridDays(year, month) {
810
- const first = new Date(year, month - 1, 1);
811
- const start = new Date(first);
812
- start.setDate(first.getDate() - first.getDay());
813
- const days = [];
814
- const current = new Date(start);
815
- for (let i = 0; i < GRID_SIZE; i++) {
816
- days.push(new Date(current));
817
- current.setDate(current.getDate() + 1);
818
- }
819
- return days;
820
- }
821
842
  function normalizeISO(value) {
822
843
  const date = parseISODateString(value.trim());
823
844
  return date ? toISODateString(date) : "";