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,10 +31,17 @@ 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
+ }
38
45
 
39
46
  var formatters = /* @__PURE__ */ new WeakMap();
40
47
  function intlFormatter(factory, locale, options, fallbackLocale) {
@@ -96,6 +103,30 @@ function parseISOMonthString(monthStr) {
96
103
  function toISOMonthString(date) {
97
104
  return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}`;
98
105
  }
106
+ function monthGridDays(year, month, weekStart) {
107
+ const first = new Date(year, month - 1, 1);
108
+ const offset = (first.getDay() - weekStart + 7) % 7;
109
+ const current = new Date(first);
110
+ current.setDate(first.getDate() - offset);
111
+ const days = [];
112
+ for (let i = 0; i < 42; i++) {
113
+ days.push(new Date(current));
114
+ current.setDate(current.getDate() + 1);
115
+ }
116
+ return days;
117
+ }
118
+ function dateInMonthClamped(date, year, month) {
119
+ const target = new Date(year, month - 1, 1);
120
+ const lastDay = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
121
+ target.setDate(Math.min(date.getDate(), lastDay));
122
+ return target;
123
+ }
124
+ function shiftMonthClamped(date, delta) {
125
+ return dateInMonthClamped(date, date.getFullYear(), date.getMonth() + 1 + delta);
126
+ }
127
+ function shiftYearClamped(date, delta) {
128
+ return dateInMonthClamped(date, date.getFullYear() + delta, date.getMonth() + 1);
129
+ }
99
130
  var MONTH_LABEL_OPTIONS = { month: "long", year: "numeric" };
100
131
  function monthLabelFormatter(locale) {
101
132
  return intlFormatter(Intl.DateTimeFormat, locale, MONTH_LABEL_OPTIONS, "en");
@@ -130,6 +161,9 @@ var MicrotaskCoalescer = class {
130
161
  this.#queued = false;
131
162
  this.#generation += 1;
132
163
  }
164
+ get pending() {
165
+ return this.#queued;
166
+ }
133
167
  schedule() {
134
168
  if (!this.#active || this.#queued) return;
135
169
  this.#queued = true;
@@ -171,6 +205,9 @@ var MorphRenderWatcher = class {
171
205
  schedule() {
172
206
  this.#pass.schedule();
173
207
  }
208
+ get pending() {
209
+ return this.#pass.pending;
210
+ }
174
211
  disconnect() {
175
212
  this.#listeners.dispose();
176
213
  this.#pass.cancel();
@@ -253,7 +290,7 @@ var CalendarController = class _CalendarController extends Controller {
253
290
  #monthMoves = 0;
254
291
  #paintedDates = /* @__PURE__ */ new WeakMap();
255
292
  #opened = false;
256
- #movedByUser = false;
293
+ #ownMove = false;
257
294
  #repaint = new MorphRenderWatcher(() => {
258
295
  this.#repaintKeepingFocus();
259
296
  });
@@ -319,6 +356,9 @@ var CalendarController = class _CalendarController extends Controller {
319
356
  onKeydown(event) {
320
357
  if (event.defaultPrevented) return;
321
358
  if (isReservedArrowChord(event)) return;
359
+ if ((event.key === "Home" || event.key === "End") && hasModifierChord(event)) return;
360
+ if ((event.key === "PageUp" || event.key === "PageDown") && (event.ctrlKey || event.altKey || event.metaKey))
361
+ return;
322
362
  const dayElement = event.target?.closest(
323
363
  targetSelector(this.identifier, "day")
324
364
  );
@@ -327,7 +367,8 @@ var CalendarController = class _CalendarController extends Controller {
327
367
  if (!date) return;
328
368
  let handled = true;
329
369
  let nextDate = new Date(date);
330
- switch (logicalArrowKey(event.key, this.element)) {
370
+ const directionElement = this.hasGridTarget ? gridDirectionElement(this.gridTarget, this.element) : this.element;
371
+ switch (logicalArrowKey(event.key, directionElement)) {
331
372
  case "ArrowLeft":
332
373
  nextDate.setDate(nextDate.getDate() - 1);
333
374
  break;
@@ -342,16 +383,16 @@ var CalendarController = class _CalendarController extends Controller {
342
383
  break;
343
384
  case "PageUp":
344
385
  if (event.shiftKey) {
345
- nextDate = this.#calculateShiftedYearDate(date, -1);
386
+ nextDate = shiftYearClamped(date, -1);
346
387
  } else {
347
- nextDate = this.#calculateShiftedMonthDate(date, -1);
388
+ nextDate = shiftMonthClamped(date, -1);
348
389
  }
349
390
  break;
350
391
  case "PageDown":
351
392
  if (event.shiftKey) {
352
- nextDate = this.#calculateShiftedYearDate(date, 1);
393
+ nextDate = shiftYearClamped(date, 1);
353
394
  } else {
354
- nextDate = this.#calculateShiftedMonthDate(date, 1);
395
+ nextDate = shiftMonthClamped(date, 1);
355
396
  }
356
397
  break;
357
398
  case "Home":
@@ -400,7 +441,7 @@ var CalendarController = class _CalendarController extends Controller {
400
441
  const locale = resolveLocale(this.element, this.localeValue);
401
442
  this.labelTarget.textContent = monthLabelFormatter(locale).format(monthStart);
402
443
  }
403
- const days = this.#calculateGridDays(year, month);
444
+ const days = monthGridDays(year, month, this.#safeWeekStart);
404
445
  const dayElements = this.dayTargets;
405
446
  const consumerDisabled = /* @__PURE__ */ new Map();
406
447
  for (const el of dayElements) {
@@ -513,8 +554,8 @@ var CalendarController = class _CalendarController extends Controller {
513
554
  return true;
514
555
  }
515
556
  #mirrorFields(painted, selection, reconciled) {
516
- const byUser = this.#movedByUser;
517
- this.#movedByUser = false;
557
+ const ownMove = this.#ownMove;
558
+ this.#ownMove = false;
518
559
  const moved = [];
519
560
  if (this.hasFieldTarget && this.#writeField(this.fieldTarget, selection) && !reconciled) {
520
561
  moved.push([this.fieldTarget, selection, this.#fieldWrites.get(this.fieldTarget) ?? 0]);
@@ -526,7 +567,7 @@ var CalendarController = class _CalendarController extends Controller {
526
567
  this.#fieldWrites.get(this.monthFieldTarget) ?? 0
527
568
  ]);
528
569
  }
529
- return byUser ? moved : [];
570
+ return ownMove ? moved : [];
530
571
  }
531
572
  #selectDay(dayElement, reason) {
532
573
  if (dayElement.getAttribute("aria-disabled") === "true") return;
@@ -535,7 +576,7 @@ var CalendarController = class _CalendarController extends Controller {
535
576
  this.selectedValue = dateStr;
536
577
  const selected = parseISODateString(dateStr);
537
578
  if (selected) this.focusedDate = selected;
538
- this.#movedByUser = true;
579
+ this.#ownMove = true;
539
580
  const changed = dateStr !== this.#published;
540
581
  if (changed) this.#selectionMoves += 1;
541
582
  const move = this.#selectionMoves;
@@ -547,7 +588,7 @@ var CalendarController = class _CalendarController extends Controller {
547
588
  #focusAndNavigateToDate(date) {
548
589
  this.focusedDate = date;
549
590
  const targetMonthStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}`;
550
- this.#movedByUser = true;
591
+ this.#ownMove = true;
551
592
  if (targetMonthStr !== this.#monthRequest) {
552
593
  this.monthValue = targetMonthStr;
553
594
  if (targetMonthStr !== this.#paintedMonth) return;
@@ -573,7 +614,7 @@ var CalendarController = class _CalendarController extends Controller {
573
614
  #shiftMonth(delta) {
574
615
  const monthInfo = parseISOMonthString(this.#monthRequest);
575
616
  if (!monthInfo) return;
576
- this.#movedByUser = true;
617
+ this.#ownMove = true;
577
618
  const nextMonthDate = new Date(monthInfo.year, monthInfo.month - 1 + delta, 1);
578
619
  this.monthValue = `${nextMonthDate.getFullYear()}-${String(nextMonthDate.getMonth() + 1).padStart(2, "0")}`;
579
620
  if (this.monthValue === this.#paintedMonth) {
@@ -581,28 +622,6 @@ var CalendarController = class _CalendarController extends Controller {
581
622
  this.#repaintKeepingFocus();
582
623
  }
583
624
  }
584
- #calculateShiftedMonthDate(baseDate, delta) {
585
- const targetDate = new Date(baseDate.getFullYear(), baseDate.getMonth() + delta, 1);
586
- const lastDayInTarget = new Date(
587
- targetDate.getFullYear(),
588
- targetDate.getMonth() + 1,
589
- 0
590
- ).getDate();
591
- const clampedDay = Math.min(baseDate.getDate(), lastDayInTarget);
592
- targetDate.setDate(clampedDay);
593
- return targetDate;
594
- }
595
- #calculateShiftedYearDate(baseDate, delta) {
596
- const targetDate = new Date(baseDate.getFullYear() + delta, baseDate.getMonth(), 1);
597
- const lastDayInTarget = new Date(
598
- targetDate.getFullYear(),
599
- targetDate.getMonth() + 1,
600
- 0
601
- ).getDate();
602
- const clampedDay = Math.min(baseDate.getDate(), lastDayInTarget);
603
- targetDate.setDate(clampedDay);
604
- return targetDate;
605
- }
606
625
  #getStartOfWeekDate(date) {
607
626
  const currentDay = date.getDay();
608
627
  const shift = (currentDay - this.#safeWeekStart + 7) % 7;
@@ -640,27 +659,10 @@ var CalendarController = class _CalendarController extends Controller {
640
659
  if (today.getFullYear() === monthInfo.year && today.getMonth() === monthInfo.month - 1) {
641
660
  this.focusedDate = today;
642
661
  } else {
643
- const targetDate = new Date(monthInfo.year, monthInfo.month - 1, 1);
644
- const lastDayInTarget = new Date(monthInfo.year, monthInfo.month, 0).getDate();
645
- const clampedDay = Math.min(this.focusedDate.getDate(), lastDayInTarget);
646
- targetDate.setDate(clampedDay);
647
- this.focusedDate = targetDate;
662
+ this.focusedDate = dateInMonthClamped(this.focusedDate, monthInfo.year, monthInfo.month);
648
663
  }
649
664
  }
650
665
  }
651
- #calculateGridDays(year, month) {
652
- const firstDay = new Date(year, month - 1, 1);
653
- const dayOfWeek = firstDay.getDay();
654
- const offset = (dayOfWeek - this.#safeWeekStart + 7) % 7;
655
- const days = [];
656
- const current = new Date(firstDay);
657
- current.setDate(firstDay.getDate() - offset);
658
- for (let i = 0; i < 42; i++) {
659
- days.push(new Date(current));
660
- current.setDate(current.getDate() + 1);
661
- }
662
- return days;
663
- }
664
666
  get #safeWeekStart() {
665
667
  return this.#numbers.read(
666
668
  this,