@salt-ds/lab 1.0.0-alpha.67 → 1.0.0-alpha.69

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 (547) hide show
  1. package/CHANGELOG.md +179 -0
  2. package/css/salt-lab.css +24 -190
  3. package/dist-cjs/breadcrumbs/internal/BreadcrumbsContext.js.map +1 -1
  4. package/dist-cjs/button-bar/ButtonBar.js.map +1 -1
  5. package/dist-cjs/button-bar/OrderedButton.js.map +1 -1
  6. package/dist-cjs/button-bar/internal/useDescendant.js.map +1 -1
  7. package/dist-cjs/calendar/Calendar.js +23 -8
  8. package/dist-cjs/calendar/Calendar.js.map +1 -1
  9. package/dist-cjs/calendar/CalendarGrid.js +56 -80
  10. package/dist-cjs/calendar/CalendarGrid.js.map +1 -1
  11. package/dist-cjs/calendar/CalendarMonthHeader.css.js +6 -0
  12. package/dist-cjs/calendar/CalendarMonthHeader.css.js.map +1 -0
  13. package/dist-cjs/calendar/CalendarMonthHeader.js +48 -0
  14. package/dist-cjs/calendar/CalendarMonthHeader.js.map +1 -0
  15. package/dist-cjs/calendar/CalendarNavigation.js +30 -39
  16. package/dist-cjs/calendar/CalendarNavigation.js.map +1 -1
  17. package/dist-cjs/calendar/CalendarWeekHeader.js +2 -6
  18. package/dist-cjs/calendar/CalendarWeekHeader.js.map +1 -1
  19. package/dist-cjs/calendar/internal/CalendarContext.js +3 -1
  20. package/dist-cjs/calendar/internal/CalendarContext.js.map +1 -1
  21. package/dist-cjs/calendar/internal/CalendarDay.css.js +1 -1
  22. package/dist-cjs/calendar/internal/CalendarDay.js +88 -76
  23. package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -1
  24. package/dist-cjs/calendar/internal/CalendarMonth.js +13 -23
  25. package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -1
  26. package/dist-cjs/calendar/internal/useFocusManagement.js +5 -6
  27. package/dist-cjs/calendar/internal/useFocusManagement.js.map +1 -1
  28. package/dist-cjs/calendar/internal/utils.js +8 -12
  29. package/dist-cjs/calendar/internal/utils.js.map +1 -1
  30. package/dist-cjs/calendar/useCalendar.js +69 -109
  31. package/dist-cjs/calendar/useCalendar.js.map +1 -1
  32. package/dist-cjs/calendar/useCalendarDay.js +21 -18
  33. package/dist-cjs/calendar/useCalendarDay.js.map +1 -1
  34. package/dist-cjs/calendar/useCalendarSelection.js +146 -34
  35. package/dist-cjs/calendar/useCalendarSelection.js.map +1 -1
  36. package/dist-cjs/carousel/CarouselContext.js.map +1 -1
  37. package/dist-cjs/carousel/CarouselControls.js.map +1 -1
  38. package/dist-cjs/carousel/CarouselReducer.js.map +1 -1
  39. package/dist-cjs/carousel/CarouselSlide.js.map +1 -1
  40. package/dist-cjs/carousel/CarouselSlider.js.map +1 -1
  41. package/dist-cjs/cascading-menu/CascadingMenu.js.map +1 -1
  42. package/dist-cjs/cascading-menu/CascadingMenuItem.js.map +1 -1
  43. package/dist-cjs/cascading-menu/CascadingMenuList.js.map +1 -1
  44. package/dist-cjs/cascading-menu/internal/keydownHandlers.js.map +1 -1
  45. package/dist-cjs/cascading-menu/internal/useClickAway.js.map +1 -1
  46. package/dist-cjs/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
  47. package/dist-cjs/cascading-menu/internal/useMouseHandlers.js.map +1 -1
  48. package/dist-cjs/cascading-menu/internal/useStateReducer.js.map +1 -1
  49. package/dist-cjs/cascading-menu/stateChangeTypes.js +0 -1
  50. package/dist-cjs/cascading-menu/stateChangeTypes.js.map +1 -1
  51. package/dist-cjs/color-chooser/Color.js.map +1 -1
  52. package/dist-cjs/color-chooser/ColorChooser.js.map +1 -1
  53. package/dist-cjs/color-chooser/ColorHelpers.js.map +1 -1
  54. package/dist-cjs/color-chooser/ColorPicker.js.map +1 -1
  55. package/dist-cjs/color-chooser/DictTabs.js.map +1 -1
  56. package/dist-cjs/color-chooser/HexInput.js.map +1 -1
  57. package/dist-cjs/color-chooser/Swatch.js.map +1 -1
  58. package/dist-cjs/color-chooser/Swatches.js.map +1 -1
  59. package/dist-cjs/color-chooser/SwatchesPicker.js.map +1 -1
  60. package/dist-cjs/combo-box/ComboBox.js +0 -2
  61. package/dist-cjs/combo-box/ComboBox.js.map +1 -1
  62. package/dist-cjs/combo-box/useCombobox.js.map +1 -1
  63. package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js +0 -4
  64. package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
  65. package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js +0 -4
  66. package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
  67. package/dist-cjs/combo-box-deprecated/internal/useComboBox.js.map +1 -1
  68. package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
  69. package/dist-cjs/combo-box-deprecated/internal/usePopperStatus.js.map +1 -1
  70. package/dist-cjs/common-hooks/calcPreferredHeight.js.map +1 -1
  71. package/dist-cjs/common-hooks/collectionProvider.js.map +1 -1
  72. package/dist-cjs/common-hooks/list-dom-utils.js.map +1 -1
  73. package/dist-cjs/common-hooks/selectionTypes.js.map +1 -1
  74. package/dist-cjs/common-hooks/useCollapsibleGroups.js.map +1 -1
  75. package/dist-cjs/common-hooks/useCollectionItems.js.map +1 -1
  76. package/dist-cjs/common-hooks/useImperativeScrollingAPI.js.map +1 -1
  77. package/dist-cjs/common-hooks/useKeyboardNavigation.js.map +1 -1
  78. package/dist-cjs/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
  79. package/dist-cjs/common-hooks/useSelection.js.map +1 -1
  80. package/dist-cjs/common-hooks/useTypeahead.js +1 -1
  81. package/dist-cjs/common-hooks/useTypeahead.js.map +1 -1
  82. package/dist-cjs/common-hooks/useViewportTracking.js.map +1 -1
  83. package/dist-cjs/common-hooks/utils/collection-item-utils.js.map +1 -1
  84. package/dist-cjs/contact-details/ContactPrimaryInfo.js.map +1 -1
  85. package/dist-cjs/contact-details/ContactSecondaryInfo.js.map +1 -1
  86. package/dist-cjs/contact-details/ContactTertiaryInfo.js.map +1 -1
  87. package/dist-cjs/contact-details/internal/ContactDetailsContext.js.map +1 -1
  88. package/dist-cjs/content-status/internal/StatusIndicator.js.map +1 -1
  89. package/dist-cjs/date-input/DateInputRange.js +61 -51
  90. package/dist-cjs/date-input/DateInputRange.js.map +1 -1
  91. package/dist-cjs/date-input/DateInputSingle.js +33 -18
  92. package/dist-cjs/date-input/DateInputSingle.js.map +1 -1
  93. package/dist-cjs/date-picker/DatePicker.js +9 -1
  94. package/dist-cjs/date-picker/DatePicker.js.map +1 -1
  95. package/dist-cjs/date-picker/DatePickerActions.js.map +1 -1
  96. package/dist-cjs/date-picker/DatePickerContext.js.map +1 -1
  97. package/dist-cjs/date-picker/DatePickerHelperText.css.js +6 -0
  98. package/dist-cjs/date-picker/DatePickerHelperText.css.js.map +1 -0
  99. package/dist-cjs/date-picker/DatePickerHelperText.js +36 -0
  100. package/dist-cjs/date-picker/DatePickerHelperText.js.map +1 -0
  101. package/dist-cjs/date-picker/DatePickerOverlay.js.map +1 -1
  102. package/dist-cjs/date-picker/DatePickerOverlayProvider.js +40 -16
  103. package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -1
  104. package/dist-cjs/date-picker/DatePickerPanel.css.js +1 -1
  105. package/dist-cjs/date-picker/DatePickerRangeGridPanel.js +247 -0
  106. package/dist-cjs/date-picker/DatePickerRangeGridPanel.js.map +1 -0
  107. package/dist-cjs/date-picker/DatePickerRangeInput.js +38 -6
  108. package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -1
  109. package/dist-cjs/date-picker/DatePickerRangePanel.js +188 -32
  110. package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -1
  111. package/dist-cjs/date-picker/DatePickerSingleGridPanel.js +255 -0
  112. package/dist-cjs/date-picker/DatePickerSingleGridPanel.js.map +1 -0
  113. package/dist-cjs/date-picker/DatePickerSingleInput.js +13 -5
  114. package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -1
  115. package/dist-cjs/date-picker/DatePickerSinglePanel.js +6 -105
  116. package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +1 -1
  117. package/dist-cjs/date-picker/DatePickerTrigger.js.map +1 -1
  118. package/dist-cjs/date-picker/useDatePicker.js +71 -11
  119. package/dist-cjs/date-picker/useDatePicker.js.map +1 -1
  120. package/dist-cjs/date-picker/useFocusOut.js +43 -0
  121. package/dist-cjs/date-picker/useFocusOut.js.map +1 -0
  122. package/dist-cjs/date-picker/useKeyboard.js +4 -5
  123. package/dist-cjs/date-picker/useKeyboard.js.map +1 -1
  124. package/dist-cjs/deck-item/DeckItem.js.map +1 -1
  125. package/dist-cjs/deck-layout/DeckLayout.js.map +1 -1
  126. package/dist-cjs/dropdown/Dropdown.js +0 -1
  127. package/dist-cjs/dropdown/Dropdown.js.map +1 -1
  128. package/dist-cjs/dropdown/DropdownBase.js +0 -1
  129. package/dist-cjs/dropdown/DropdownBase.js.map +1 -1
  130. package/dist-cjs/dropdown/DropdownButton.js.map +1 -1
  131. package/dist-cjs/dropdown/useClickAway.js.map +1 -1
  132. package/dist-cjs/dropdown/useDropdown.js.map +1 -1
  133. package/dist-cjs/dropdown/useDropdownBase.js.map +1 -1
  134. package/dist-cjs/editable-label/EditableLabel.js.map +1 -1
  135. package/dist-cjs/form-field-legacy/FormFieldLegacy.js.map +1 -1
  136. package/dist-cjs/form-field-legacy/StatusIndicator.js.map +1 -1
  137. package/dist-cjs/formatted-input/FormattedInput.js.map +1 -1
  138. package/dist-cjs/index.js +8 -8
  139. package/dist-cjs/input-legacy/InputLegacy.js.map +1 -1
  140. package/dist-cjs/input-legacy/useCursorOnFocus.js.map +1 -1
  141. package/dist-cjs/list/Highlighter.js.map +1 -1
  142. package/dist-cjs/list/List.js.map +1 -1
  143. package/dist-cjs/list/ListItem.js.map +1 -1
  144. package/dist-cjs/list/VirtualizedList.js.map +1 -1
  145. package/dist-cjs/list/useList.js +0 -1
  146. package/dist-cjs/list/useList.js.map +1 -1
  147. package/dist-cjs/list/useListHeight.js.map +1 -1
  148. package/dist-cjs/list-deprecated/ListBase.js +1 -3
  149. package/dist-cjs/list-deprecated/ListBase.js.map +1 -1
  150. package/dist-cjs/list-deprecated/ListItem.js.map +1 -1
  151. package/dist-cjs/list-deprecated/ListItemBase.js.map +1 -1
  152. package/dist-cjs/list-deprecated/ListItemContext.js.map +1 -1
  153. package/dist-cjs/list-deprecated/internal/DescendantContext.js.map +1 -1
  154. package/dist-cjs/list-deprecated/internal/calcPreferredListHeight.js.map +1 -1
  155. package/dist-cjs/list-deprecated/internal/useWidth.js.map +1 -1
  156. package/dist-cjs/list-deprecated/useList.js.map +1 -1
  157. package/dist-cjs/list-deprecated/useListItem.js.map +1 -1
  158. package/dist-cjs/list-deprecated/useTypeSelect.js.map +1 -1
  159. package/dist-cjs/list-next/ListItemNext.js.map +1 -1
  160. package/dist-cjs/list-next/ListNext.js.map +1 -1
  161. package/dist-cjs/list-next/ListNextContext.js.map +1 -1
  162. package/dist-cjs/list-next/useList.js.map +1 -1
  163. package/dist-cjs/localization-provider/LocalizationProvider.js +5 -2
  164. package/dist-cjs/localization-provider/LocalizationProvider.js.map +1 -1
  165. package/dist-cjs/menu-button/MenuButton.js.map +1 -1
  166. package/dist-cjs/metric/MetricContent.js.map +1 -1
  167. package/dist-cjs/number-input/NumberInput.js.map +1 -1
  168. package/dist-cjs/number-input/useNumberInput.js.map +1 -1
  169. package/dist-cjs/query-input/internal/CategoryListContext.js.map +1 -1
  170. package/dist-cjs/query-input/internal/CategoryListItem.js.map +1 -1
  171. package/dist-cjs/query-input/internal/usePopperStatus.js +2 -2
  172. package/dist-cjs/query-input/internal/usePopperStatus.js.map +1 -1
  173. package/dist-cjs/query-input/useQueryInput.js +0 -1
  174. package/dist-cjs/query-input/useQueryInput.js.map +1 -1
  175. package/dist-cjs/responsive/OverflowReducer.js +1 -3
  176. package/dist-cjs/responsive/OverflowReducer.js.map +1 -1
  177. package/dist-cjs/responsive/useDynamicCollapse.js.map +1 -1
  178. package/dist-cjs/responsive/useInstantCollapse.js.map +1 -1
  179. package/dist-cjs/responsive/useOverflow.js.map +1 -1
  180. package/dist-cjs/responsive/useOverflowCollectionItems.js.map +1 -1
  181. package/dist-cjs/responsive/useOverflowLayout.js +0 -3
  182. package/dist-cjs/responsive/useOverflowLayout.js.map +1 -1
  183. package/dist-cjs/responsive/useReclaimSpace.js.map +1 -1
  184. package/dist-cjs/responsive/useResizeObserver.js.map +1 -1
  185. package/dist-cjs/responsive/useWidth.js.map +1 -1
  186. package/dist-cjs/responsive/utils.js.map +1 -1
  187. package/dist-cjs/search-input/SearchInput.js.map +1 -1
  188. package/dist-cjs/tabs/Tab.js.map +1 -1
  189. package/dist-cjs/tabs/Tabs.js.map +1 -1
  190. package/dist-cjs/tabs/Tabstrip.js +0 -1
  191. package/dist-cjs/tabs/Tabstrip.js.map +1 -1
  192. package/dist-cjs/tabs/drag-drop/useDragDropNaturalMovement.js.map +1 -1
  193. package/dist-cjs/tabs/drag-drop/useDragSpacers.js.map +1 -1
  194. package/dist-cjs/tabs/useEditableItem.js.map +1 -1
  195. package/dist-cjs/tabs/useKeyboardNavigation.js.map +1 -1
  196. package/dist-cjs/tabs/useSelection.js.map +1 -1
  197. package/dist-cjs/tabs/useTabs.js.map +1 -1
  198. package/dist-cjs/tabs/useTabstrip.js.map +1 -1
  199. package/dist-cjs/tabs-next/TabListNext.js.map +1 -1
  200. package/dist-cjs/tabs-next/TabNext.js.map +1 -1
  201. package/dist-cjs/tabs-next/TabNextAction.js.map +1 -1
  202. package/dist-cjs/tabs-next/TabNextContext.js.map +1 -1
  203. package/dist-cjs/tabs-next/TabNextPanel.js.map +1 -1
  204. package/dist-cjs/tabs-next/TabNextTrigger.js.map +1 -1
  205. package/dist-cjs/tabs-next/TabOverflowList.js.map +1 -1
  206. package/dist-cjs/tabs-next/TabsNext.js.map +1 -1
  207. package/dist-cjs/tabs-next/TabsNextContext.js.map +1 -1
  208. package/dist-cjs/tabs-next/hooks/useCollection.js +2 -2
  209. package/dist-cjs/tabs-next/hooks/useCollection.js.map +1 -1
  210. package/dist-cjs/tabs-next/hooks/useFocusOutside.js.map +1 -1
  211. package/dist-cjs/tabs-next/hooks/useOverflow.js.map +1 -1
  212. package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js.map +1 -1
  213. package/dist-cjs/tokenized-input/TokenizedInputBase.js.map +1 -1
  214. package/dist-cjs/tokenized-input/internal/InputPill.js.map +1 -1
  215. package/dist-cjs/tokenized-input/internal/getCursorPosition.js.map +1 -1
  216. package/dist-cjs/tokenized-input/internal/useResizeObserver.js.map +1 -1
  217. package/dist-cjs/tokenized-input/useTokenizedInput.js.map +1 -1
  218. package/dist-cjs/tokenized-input-next/TokenizedInputNext.js.map +1 -1
  219. package/dist-cjs/tokenized-input-next/internal/InputPill.js.map +1 -1
  220. package/dist-cjs/tokenized-input-next/internal/useResizeObserver.js.map +1 -1
  221. package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js +1 -1
  222. package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js.map +1 -1
  223. package/dist-cjs/toolbar/Tooltray.js.map +1 -1
  224. package/dist-cjs/toolbar/internal/renderToolbarItems.js.map +1 -1
  225. package/dist-cjs/toolbar/internal/renderTrayTools.js.map +1 -1
  226. package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  227. package/dist-cjs/toolbar/toolbar-field/useToolbarField.js.map +1 -1
  228. package/dist-cjs/tree/Tree.js +2 -6
  229. package/dist-cjs/tree/Tree.js.map +1 -1
  230. package/dist-cjs/tree/TreeNode.js.map +1 -1
  231. package/dist-cjs/tree/use-tree-keyboard-navigation.js.map +1 -1
  232. package/dist-cjs/tree/useTree.js.map +1 -1
  233. package/dist-cjs/utils/useClickOutside.js.map +1 -1
  234. package/dist-cjs/utils/useSlideSelection.js.map +1 -1
  235. package/dist-cjs/window/ElectronWindow.js.map +1 -1
  236. package/dist-es/breadcrumbs/internal/BreadcrumbsContext.js.map +1 -1
  237. package/dist-es/button-bar/ButtonBar.js.map +1 -1
  238. package/dist-es/button-bar/OrderedButton.js.map +1 -1
  239. package/dist-es/button-bar/internal/useDescendant.js.map +1 -1
  240. package/dist-es/calendar/Calendar.js +24 -9
  241. package/dist-es/calendar/Calendar.js.map +1 -1
  242. package/dist-es/calendar/CalendarGrid.js +59 -83
  243. package/dist-es/calendar/CalendarGrid.js.map +1 -1
  244. package/dist-es/calendar/CalendarMonthHeader.css.js +4 -0
  245. package/dist-es/calendar/CalendarMonthHeader.css.js.map +1 -0
  246. package/dist-es/calendar/CalendarMonthHeader.js +46 -0
  247. package/dist-es/calendar/CalendarMonthHeader.js.map +1 -0
  248. package/dist-es/calendar/CalendarNavigation.js +30 -39
  249. package/dist-es/calendar/CalendarNavigation.js.map +1 -1
  250. package/dist-es/calendar/CalendarWeekHeader.js +2 -6
  251. package/dist-es/calendar/CalendarWeekHeader.js.map +1 -1
  252. package/dist-es/calendar/internal/CalendarContext.js +3 -1
  253. package/dist-es/calendar/internal/CalendarContext.js.map +1 -1
  254. package/dist-es/calendar/internal/CalendarDay.css.js +1 -1
  255. package/dist-es/calendar/internal/CalendarDay.js +90 -78
  256. package/dist-es/calendar/internal/CalendarDay.js.map +1 -1
  257. package/dist-es/calendar/internal/CalendarMonth.js +13 -23
  258. package/dist-es/calendar/internal/CalendarMonth.js.map +1 -1
  259. package/dist-es/calendar/internal/useFocusManagement.js +5 -6
  260. package/dist-es/calendar/internal/useFocusManagement.js.map +1 -1
  261. package/dist-es/calendar/internal/utils.js +8 -12
  262. package/dist-es/calendar/internal/utils.js.map +1 -1
  263. package/dist-es/calendar/useCalendar.js +72 -112
  264. package/dist-es/calendar/useCalendar.js.map +1 -1
  265. package/dist-es/calendar/useCalendarDay.js +21 -18
  266. package/dist-es/calendar/useCalendarDay.js.map +1 -1
  267. package/dist-es/calendar/useCalendarSelection.js +146 -34
  268. package/dist-es/calendar/useCalendarSelection.js.map +1 -1
  269. package/dist-es/carousel/CarouselContext.js.map +1 -1
  270. package/dist-es/carousel/CarouselControls.js.map +1 -1
  271. package/dist-es/carousel/CarouselReducer.js.map +1 -1
  272. package/dist-es/carousel/CarouselSlide.js.map +1 -1
  273. package/dist-es/carousel/CarouselSlider.js.map +1 -1
  274. package/dist-es/cascading-menu/CascadingMenu.js.map +1 -1
  275. package/dist-es/cascading-menu/CascadingMenuItem.js.map +1 -1
  276. package/dist-es/cascading-menu/CascadingMenuList.js.map +1 -1
  277. package/dist-es/cascading-menu/internal/keydownHandlers.js.map +1 -1
  278. package/dist-es/cascading-menu/internal/useClickAway.js.map +1 -1
  279. package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
  280. package/dist-es/cascading-menu/internal/useMouseHandlers.js.map +1 -1
  281. package/dist-es/cascading-menu/internal/useStateReducer.js.map +1 -1
  282. package/dist-es/cascading-menu/stateChangeTypes.js +0 -1
  283. package/dist-es/cascading-menu/stateChangeTypes.js.map +1 -1
  284. package/dist-es/color-chooser/Color.js.map +1 -1
  285. package/dist-es/color-chooser/ColorChooser.js.map +1 -1
  286. package/dist-es/color-chooser/ColorHelpers.js.map +1 -1
  287. package/dist-es/color-chooser/ColorPicker.js.map +1 -1
  288. package/dist-es/color-chooser/DictTabs.js.map +1 -1
  289. package/dist-es/color-chooser/HexInput.js.map +1 -1
  290. package/dist-es/color-chooser/Swatch.js.map +1 -1
  291. package/dist-es/color-chooser/Swatches.js.map +1 -1
  292. package/dist-es/color-chooser/SwatchesPicker.js.map +1 -1
  293. package/dist-es/combo-box/ComboBox.js +0 -2
  294. package/dist-es/combo-box/ComboBox.js.map +1 -1
  295. package/dist-es/combo-box/useCombobox.js.map +1 -1
  296. package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js +1 -5
  297. package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
  298. package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js +1 -5
  299. package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
  300. package/dist-es/combo-box-deprecated/internal/useComboBox.js +1 -1
  301. package/dist-es/combo-box-deprecated/internal/useComboBox.js.map +1 -1
  302. package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js +1 -1
  303. package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
  304. package/dist-es/combo-box-deprecated/internal/usePopperStatus.js.map +1 -1
  305. package/dist-es/common-hooks/calcPreferredHeight.js.map +1 -1
  306. package/dist-es/common-hooks/collectionProvider.js +1 -1
  307. package/dist-es/common-hooks/collectionProvider.js.map +1 -1
  308. package/dist-es/common-hooks/list-dom-utils.js.map +1 -1
  309. package/dist-es/common-hooks/selectionTypes.js.map +1 -1
  310. package/dist-es/common-hooks/useCollapsibleGroups.js.map +1 -1
  311. package/dist-es/common-hooks/useCollectionItems.js +1 -1
  312. package/dist-es/common-hooks/useCollectionItems.js.map +1 -1
  313. package/dist-es/common-hooks/useImperativeScrollingAPI.js.map +1 -1
  314. package/dist-es/common-hooks/useKeyboardNavigation.js +1 -1
  315. package/dist-es/common-hooks/useKeyboardNavigation.js.map +1 -1
  316. package/dist-es/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
  317. package/dist-es/common-hooks/useSelection.js.map +1 -1
  318. package/dist-es/common-hooks/useTypeahead.js +1 -1
  319. package/dist-es/common-hooks/useTypeahead.js.map +1 -1
  320. package/dist-es/common-hooks/useViewportTracking.js.map +1 -1
  321. package/dist-es/common-hooks/utils/collection-item-utils.js.map +1 -1
  322. package/dist-es/contact-details/ContactPrimaryInfo.js.map +1 -1
  323. package/dist-es/contact-details/ContactSecondaryInfo.js.map +1 -1
  324. package/dist-es/contact-details/ContactTertiaryInfo.js.map +1 -1
  325. package/dist-es/contact-details/internal/ContactDetailsContext.js.map +1 -1
  326. package/dist-es/content-status/internal/StatusIndicator.js.map +1 -1
  327. package/dist-es/date-input/DateInputRange.js +61 -51
  328. package/dist-es/date-input/DateInputRange.js.map +1 -1
  329. package/dist-es/date-input/DateInputSingle.js +34 -19
  330. package/dist-es/date-input/DateInputSingle.js.map +1 -1
  331. package/dist-es/date-picker/DatePicker.js +9 -1
  332. package/dist-es/date-picker/DatePicker.js.map +1 -1
  333. package/dist-es/date-picker/DatePickerActions.js.map +1 -1
  334. package/dist-es/date-picker/DatePickerContext.js.map +1 -1
  335. package/dist-es/date-picker/DatePickerHelperText.css.js +4 -0
  336. package/dist-es/date-picker/DatePickerHelperText.css.js.map +1 -0
  337. package/dist-es/date-picker/DatePickerHelperText.js +34 -0
  338. package/dist-es/date-picker/DatePickerHelperText.js.map +1 -0
  339. package/dist-es/date-picker/DatePickerOverlay.js.map +1 -1
  340. package/dist-es/date-picker/DatePickerOverlayProvider.js +41 -17
  341. package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -1
  342. package/dist-es/date-picker/DatePickerPanel.css.js +1 -1
  343. package/dist-es/date-picker/DatePickerRangeGridPanel.js +245 -0
  344. package/dist-es/date-picker/DatePickerRangeGridPanel.js.map +1 -0
  345. package/dist-es/date-picker/DatePickerRangeInput.js +39 -7
  346. package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -1
  347. package/dist-es/date-picker/DatePickerRangePanel.js +190 -34
  348. package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -1
  349. package/dist-es/date-picker/DatePickerSingleGridPanel.js +253 -0
  350. package/dist-es/date-picker/DatePickerSingleGridPanel.js.map +1 -0
  351. package/dist-es/date-picker/DatePickerSingleInput.js +13 -5
  352. package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -1
  353. package/dist-es/date-picker/DatePickerSinglePanel.js +8 -107
  354. package/dist-es/date-picker/DatePickerSinglePanel.js.map +1 -1
  355. package/dist-es/date-picker/DatePickerTrigger.js.map +1 -1
  356. package/dist-es/date-picker/useDatePicker.js +71 -11
  357. package/dist-es/date-picker/useDatePicker.js.map +1 -1
  358. package/dist-es/date-picker/useFocusOut.js +41 -0
  359. package/dist-es/date-picker/useFocusOut.js.map +1 -0
  360. package/dist-es/date-picker/useKeyboard.js +4 -5
  361. package/dist-es/date-picker/useKeyboard.js.map +1 -1
  362. package/dist-es/deck-item/DeckItem.js.map +1 -1
  363. package/dist-es/deck-layout/DeckLayout.js.map +1 -1
  364. package/dist-es/dropdown/Dropdown.js +0 -1
  365. package/dist-es/dropdown/Dropdown.js.map +1 -1
  366. package/dist-es/dropdown/DropdownBase.js +1 -2
  367. package/dist-es/dropdown/DropdownBase.js.map +1 -1
  368. package/dist-es/dropdown/DropdownButton.js.map +1 -1
  369. package/dist-es/dropdown/useClickAway.js.map +1 -1
  370. package/dist-es/dropdown/useDropdown.js.map +1 -1
  371. package/dist-es/dropdown/useDropdownBase.js.map +1 -1
  372. package/dist-es/editable-label/EditableLabel.js.map +1 -1
  373. package/dist-es/form-field-legacy/FormFieldLegacy.js.map +1 -1
  374. package/dist-es/form-field-legacy/StatusIndicator.js +1 -1
  375. package/dist-es/form-field-legacy/StatusIndicator.js.map +1 -1
  376. package/dist-es/formatted-input/FormattedInput.js +1 -1
  377. package/dist-es/formatted-input/FormattedInput.js.map +1 -1
  378. package/dist-es/index.js +4 -4
  379. package/dist-es/input-legacy/InputLegacy.js.map +1 -1
  380. package/dist-es/input-legacy/useCursorOnFocus.js.map +1 -1
  381. package/dist-es/list/Highlighter.js.map +1 -1
  382. package/dist-es/list/List.js.map +1 -1
  383. package/dist-es/list/ListItem.js.map +1 -1
  384. package/dist-es/list/VirtualizedList.js.map +1 -1
  385. package/dist-es/list/useList.js +0 -1
  386. package/dist-es/list/useList.js.map +1 -1
  387. package/dist-es/list/useListHeight.js.map +1 -1
  388. package/dist-es/list-deprecated/ListBase.js +1 -3
  389. package/dist-es/list-deprecated/ListBase.js.map +1 -1
  390. package/dist-es/list-deprecated/ListItem.js.map +1 -1
  391. package/dist-es/list-deprecated/ListItemBase.js.map +1 -1
  392. package/dist-es/list-deprecated/ListItemContext.js.map +1 -1
  393. package/dist-es/list-deprecated/internal/DescendantContext.js.map +1 -1
  394. package/dist-es/list-deprecated/internal/calcPreferredListHeight.js.map +1 -1
  395. package/dist-es/list-deprecated/internal/useWidth.js.map +1 -1
  396. package/dist-es/list-deprecated/useList.js.map +1 -1
  397. package/dist-es/list-deprecated/useListItem.js.map +1 -1
  398. package/dist-es/list-deprecated/useTypeSelect.js.map +1 -1
  399. package/dist-es/list-next/ListItemNext.js.map +1 -1
  400. package/dist-es/list-next/ListNext.js.map +1 -1
  401. package/dist-es/list-next/ListNextContext.js.map +1 -1
  402. package/dist-es/list-next/useList.js.map +1 -1
  403. package/dist-es/localization-provider/LocalizationProvider.js +6 -3
  404. package/dist-es/localization-provider/LocalizationProvider.js.map +1 -1
  405. package/dist-es/menu-button/MenuButton.js.map +1 -1
  406. package/dist-es/metric/MetricContent.js +2 -2
  407. package/dist-es/metric/MetricContent.js.map +1 -1
  408. package/dist-es/number-input/NumberInput.js +1 -1
  409. package/dist-es/number-input/NumberInput.js.map +1 -1
  410. package/dist-es/number-input/useNumberInput.js.map +1 -1
  411. package/dist-es/query-input/internal/CategoryListContext.js.map +1 -1
  412. package/dist-es/query-input/internal/CategoryListItem.js.map +1 -1
  413. package/dist-es/query-input/internal/usePopperStatus.js +2 -2
  414. package/dist-es/query-input/internal/usePopperStatus.js.map +1 -1
  415. package/dist-es/query-input/useQueryInput.js +0 -1
  416. package/dist-es/query-input/useQueryInput.js.map +1 -1
  417. package/dist-es/responsive/OverflowReducer.js +1 -3
  418. package/dist-es/responsive/OverflowReducer.js.map +1 -1
  419. package/dist-es/responsive/useDynamicCollapse.js.map +1 -1
  420. package/dist-es/responsive/useInstantCollapse.js.map +1 -1
  421. package/dist-es/responsive/useOverflow.js +1 -1
  422. package/dist-es/responsive/useOverflow.js.map +1 -1
  423. package/dist-es/responsive/useOverflowCollectionItems.js.map +1 -1
  424. package/dist-es/responsive/useOverflowLayout.js +0 -3
  425. package/dist-es/responsive/useOverflowLayout.js.map +1 -1
  426. package/dist-es/responsive/useReclaimSpace.js.map +1 -1
  427. package/dist-es/responsive/useResizeObserver.js.map +1 -1
  428. package/dist-es/responsive/useWidth.js.map +1 -1
  429. package/dist-es/responsive/utils.js.map +1 -1
  430. package/dist-es/search-input/SearchInput.js.map +1 -1
  431. package/dist-es/tabs/Tab.js.map +1 -1
  432. package/dist-es/tabs/Tabs.js.map +1 -1
  433. package/dist-es/tabs/Tabstrip.js +0 -1
  434. package/dist-es/tabs/Tabstrip.js.map +1 -1
  435. package/dist-es/tabs/drag-drop/useDragDropNaturalMovement.js +1 -1
  436. package/dist-es/tabs/drag-drop/useDragDropNaturalMovement.js.map +1 -1
  437. package/dist-es/tabs/drag-drop/useDragSpacers.js.map +1 -1
  438. package/dist-es/tabs/useEditableItem.js.map +1 -1
  439. package/dist-es/tabs/useKeyboardNavigation.js +1 -1
  440. package/dist-es/tabs/useKeyboardNavigation.js.map +1 -1
  441. package/dist-es/tabs/useSelection.js.map +1 -1
  442. package/dist-es/tabs/useTabs.js.map +1 -1
  443. package/dist-es/tabs/useTabstrip.js.map +1 -1
  444. package/dist-es/tabs-next/TabListNext.js.map +1 -1
  445. package/dist-es/tabs-next/TabNext.js.map +1 -1
  446. package/dist-es/tabs-next/TabNextAction.js.map +1 -1
  447. package/dist-es/tabs-next/TabNextContext.js.map +1 -1
  448. package/dist-es/tabs-next/TabNextPanel.js.map +1 -1
  449. package/dist-es/tabs-next/TabNextTrigger.js.map +1 -1
  450. package/dist-es/tabs-next/TabOverflowList.js.map +1 -1
  451. package/dist-es/tabs-next/TabsNext.js.map +1 -1
  452. package/dist-es/tabs-next/TabsNextContext.js.map +1 -1
  453. package/dist-es/tabs-next/hooks/useCollection.js +2 -2
  454. package/dist-es/tabs-next/hooks/useCollection.js.map +1 -1
  455. package/dist-es/tabs-next/hooks/useFocusOutside.js.map +1 -1
  456. package/dist-es/tabs-next/hooks/useOverflow.js.map +1 -1
  457. package/dist-es/tabs-next/hooks/useRestoreActiveTab.js.map +1 -1
  458. package/dist-es/tokenized-input/TokenizedInputBase.js.map +1 -1
  459. package/dist-es/tokenized-input/internal/InputPill.js.map +1 -1
  460. package/dist-es/tokenized-input/internal/getCursorPosition.js.map +1 -1
  461. package/dist-es/tokenized-input/internal/useResizeObserver.js.map +1 -1
  462. package/dist-es/tokenized-input/useTokenizedInput.js.map +1 -1
  463. package/dist-es/tokenized-input-next/TokenizedInputNext.js.map +1 -1
  464. package/dist-es/tokenized-input-next/internal/InputPill.js.map +1 -1
  465. package/dist-es/tokenized-input-next/internal/useResizeObserver.js.map +1 -1
  466. package/dist-es/tokenized-input-next/useTokenizedInputNext.js +1 -1
  467. package/dist-es/tokenized-input-next/useTokenizedInputNext.js.map +1 -1
  468. package/dist-es/toolbar/Tooltray.js.map +1 -1
  469. package/dist-es/toolbar/internal/renderToolbarItems.js.map +1 -1
  470. package/dist-es/toolbar/internal/renderTrayTools.js.map +1 -1
  471. package/dist-es/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  472. package/dist-es/toolbar/toolbar-field/useToolbarField.js.map +1 -1
  473. package/dist-es/tree/Tree.js +2 -6
  474. package/dist-es/tree/Tree.js.map +1 -1
  475. package/dist-es/tree/TreeNode.js.map +1 -1
  476. package/dist-es/tree/use-tree-keyboard-navigation.js.map +1 -1
  477. package/dist-es/tree/useTree.js.map +1 -1
  478. package/dist-es/utils/useClickOutside.js.map +1 -1
  479. package/dist-es/utils/useSlideSelection.js.map +1 -1
  480. package/dist-es/window/ElectronWindow.js +1 -1
  481. package/dist-es/window/ElectronWindow.js.map +1 -1
  482. package/dist-types/calendar/Calendar.d.ts +22 -3
  483. package/dist-types/calendar/CalendarGrid.d.ts +19 -3
  484. package/dist-types/calendar/CalendarMonthHeader.d.ts +18 -0
  485. package/dist-types/calendar/CalendarNavigation.d.ts +9 -0
  486. package/dist-types/calendar/index.d.ts +1 -0
  487. package/dist-types/calendar/internal/CalendarDay.d.ts +25 -6
  488. package/dist-types/calendar/internal/CalendarMonth.d.ts +2 -6
  489. package/dist-types/calendar/internal/utils.d.ts +3 -7
  490. package/dist-types/calendar/useCalendar.d.ts +34 -30
  491. package/dist-types/calendar/useCalendarDay.d.ts +3 -2
  492. package/dist-types/calendar/useCalendarSelection.d.ts +60 -8
  493. package/dist-types/date-input/DateInputRange.d.ts +12 -8
  494. package/dist-types/date-input/DateInputSingle.d.ts +12 -8
  495. package/dist-types/date-picker/DatePicker.d.ts +14 -6
  496. package/dist-types/date-picker/DatePickerContext.d.ts +29 -1
  497. package/dist-types/date-picker/DatePickerHelperText.d.ts +4 -0
  498. package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +9 -2
  499. package/dist-types/date-picker/DatePickerRangeGridPanel.d.ts +17 -0
  500. package/dist-types/date-picker/DatePickerRangeInput.d.ts +1 -0
  501. package/dist-types/date-picker/DatePickerRangePanel.d.ts +24 -20
  502. package/dist-types/date-picker/DatePickerSingleGridPanel.d.ts +65 -0
  503. package/dist-types/date-picker/DatePickerSingleInput.d.ts +1 -0
  504. package/dist-types/date-picker/DatePickerSinglePanel.d.ts +6 -48
  505. package/dist-types/date-picker/index.d.ts +4 -1
  506. package/dist-types/date-picker/useDatePicker.d.ts +29 -9
  507. package/dist-types/date-picker/useFocusOut.d.ts +9 -0
  508. package/dist-types/date-picker/useKeyboard.d.ts +7 -1
  509. package/dist-types/index.d.ts +0 -1
  510. package/package.json +3 -4
  511. package/dist-cjs/calendar/CalendarGrid.css.js +0 -6
  512. package/dist-cjs/calendar/CalendarGrid.css.js.map +0 -1
  513. package/dist-cjs/combo-box-deprecated/internal/getAnnouncement.js +0 -8
  514. package/dist-cjs/combo-box-deprecated/internal/getAnnouncement.js.map +0 -1
  515. package/dist-cjs/splitter/SplitHandle.css.js +0 -6
  516. package/dist-cjs/splitter/SplitHandle.css.js.map +0 -1
  517. package/dist-cjs/splitter/SplitHandle.js +0 -60
  518. package/dist-cjs/splitter/SplitHandle.js.map +0 -1
  519. package/dist-cjs/splitter/SplitPanel.css.js +0 -6
  520. package/dist-cjs/splitter/SplitPanel.css.js.map +0 -1
  521. package/dist-cjs/splitter/SplitPanel.js +0 -37
  522. package/dist-cjs/splitter/SplitPanel.js.map +0 -1
  523. package/dist-cjs/splitter/Splitter.js +0 -31
  524. package/dist-cjs/splitter/Splitter.js.map +0 -1
  525. package/dist-cjs/splitter/utils.js +0 -18
  526. package/dist-cjs/splitter/utils.js.map +0 -1
  527. package/dist-es/calendar/CalendarGrid.css.js +0 -4
  528. package/dist-es/calendar/CalendarGrid.css.js.map +0 -1
  529. package/dist-es/combo-box-deprecated/internal/getAnnouncement.js +0 -6
  530. package/dist-es/combo-box-deprecated/internal/getAnnouncement.js.map +0 -1
  531. package/dist-es/splitter/SplitHandle.css.js +0 -4
  532. package/dist-es/splitter/SplitHandle.css.js.map +0 -1
  533. package/dist-es/splitter/SplitHandle.js +0 -58
  534. package/dist-es/splitter/SplitHandle.js.map +0 -1
  535. package/dist-es/splitter/SplitPanel.css.js +0 -4
  536. package/dist-es/splitter/SplitPanel.css.js.map +0 -1
  537. package/dist-es/splitter/SplitPanel.js +0 -35
  538. package/dist-es/splitter/SplitPanel.js.map +0 -1
  539. package/dist-es/splitter/Splitter.js +0 -27
  540. package/dist-es/splitter/Splitter.js.map +0 -1
  541. package/dist-es/splitter/utils.js +0 -15
  542. package/dist-es/splitter/utils.js.map +0 -1
  543. package/dist-types/splitter/SplitHandle.d.ts +0 -21
  544. package/dist-types/splitter/SplitPanel.d.ts +0 -10
  545. package/dist-types/splitter/Splitter.d.ts +0 -22
  546. package/dist-types/splitter/index.d.ts +0 -4
  547. package/dist-types/splitter/utils.d.ts +0 -4
@@ -1,7 +1,7 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef, createElement } from 'react';
2
3
  import { makePrefixer } from '@salt-ds/core';
3
4
  import { clsx } from 'clsx';
4
- import { forwardRef } from 'react';
5
5
  import { CalendarDay } from './CalendarDay.js';
6
6
  import { generateVisibleDays } from './utils.js';
7
7
  import { useComponentCssInjection } from '@salt-ds/styles';
@@ -12,14 +12,7 @@ import css_248z from './CalendarMonth.css.js';
12
12
 
13
13
  const withBaseName = makePrefixer("saltCalendarMonth");
14
14
  const CalendarMonth = forwardRef(function CalendarMonth2(props, ref) {
15
- const {
16
- className,
17
- date,
18
- renderDayContents,
19
- onMouseLeave,
20
- TooltipProps,
21
- ...rest
22
- } = props;
15
+ const { className, date, onMouseLeave, CalendarDayProps, ...rest } = props;
23
16
  const { dateAdapter } = useLocalization();
24
17
  const targetWindow = useWindow();
25
18
  useComponentCssInjection({
@@ -28,10 +21,10 @@ const CalendarMonth = forwardRef(function CalendarMonth2(props, ref) {
28
21
  window: targetWindow
29
22
  });
30
23
  const {
31
- state: { locale },
24
+ state: { timezone = "default" },
32
25
  helpers: { setHoveredDate }
33
26
  } = useCalendarContext();
34
- const days = generateVisibleDays(dateAdapter, date, locale);
27
+ const days = generateVisibleDays(dateAdapter, date, timezone);
35
28
  const handleMouseLeave = (event) => {
36
29
  setHoveredDate(event, null);
37
30
  onMouseLeave == null ? void 0 : onMouseLeave(event);
@@ -43,18 +36,15 @@ const CalendarMonth = forwardRef(function CalendarMonth2(props, ref) {
43
36
  ref,
44
37
  onMouseLeave: handleMouseLeave,
45
38
  ...rest,
46
- children: /* @__PURE__ */ jsx("div", { "data-testid": "CalendarGrid", className: withBaseName("grid"), children: days.map((day) => {
47
- return /* @__PURE__ */ jsx(
48
- CalendarDay,
49
- {
50
- day: day.date,
51
- renderDayContents,
52
- month: date,
53
- TooltipProps
54
- },
55
- dateAdapter.format(day.date, "DD MMM YYYY", locale)
56
- );
57
- }) })
39
+ children: /* @__PURE__ */ jsx("div", { "data-testid": "CalendarGrid", className: withBaseName("grid"), children: days.map((day) => /* @__PURE__ */ createElement(
40
+ CalendarDay,
41
+ {
42
+ ...CalendarDayProps,
43
+ key: dateAdapter.format(day, "DD MMM YYYY"),
44
+ date: day,
45
+ month: date
46
+ }
47
+ )) })
58
48
  }
59
49
  );
60
50
  });
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarMonth.js","sources":["../src/calendar/internal/CalendarMonth.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithRef,\n type MouseEvent,\n type SyntheticEvent,\n forwardRef,\n} from \"react\";\nimport { CalendarDay, type CalendarDayProps } from \"./CalendarDay\";\nimport { generateVisibleDays } from \"./utils\";\n\nimport type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useLocalization } from \"../../localization-provider\";\nimport { useCalendarContext } from \"./CalendarContext\";\nimport calendarMonthCss from \"./CalendarMonth.css\";\n\nexport interface CalendarMonthProps<TDate>\n extends ComponentPropsWithRef<\"div\"> {\n /**\n * Month to render as selectable dates\n */\n date: TDate;\n /**\n * Function to render the contents of a day.\n */\n renderDayContents?: CalendarDayProps<TDate>[\"renderDayContents\"];\n /**\n * Props for the tooltip component.\n */\n TooltipProps?: CalendarDayProps<TDate>[\"TooltipProps\"];\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarMonth\");\n\nexport const CalendarMonth = forwardRef<\n HTMLDivElement,\n CalendarMonthProps<any>\n>(function CalendarMonth<TDate extends DateFrameworkType>(\n props: CalendarMonthProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const {\n className,\n date,\n renderDayContents,\n onMouseLeave,\n TooltipProps,\n ...rest\n } = props;\n const { dateAdapter } = useLocalization<TDate>();\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-month\",\n css: calendarMonthCss,\n window: targetWindow,\n });\n\n const {\n state: { locale },\n helpers: { setHoveredDate },\n } = useCalendarContext<TDate>();\n const days = generateVisibleDays<TDate>(dateAdapter, date, locale);\n const handleMouseLeave = (event: SyntheticEvent) => {\n setHoveredDate(event, null);\n onMouseLeave?.(event as MouseEvent<HTMLDivElement>);\n };\n\n return (\n <div\n className={clsx(withBaseName(), className)}\n ref={ref}\n onMouseLeave={handleMouseLeave}\n {...rest}\n >\n <div data-testid=\"CalendarGrid\" className={withBaseName(\"grid\")}>\n {days.map((day) => {\n return (\n <CalendarDay\n key={dateAdapter.format(day.date, \"DD MMM YYYY\", locale)}\n day={day.date}\n renderDayContents={renderDayContents}\n month={date}\n TooltipProps={TooltipProps}\n />\n );\n })}\n </div>\n </div>\n );\n});\n"],"names":["CalendarMonth","calendarMonthCss"],"mappings":";;;;;;;;;;;;AAkCA,MAAM,YAAA,GAAe,aAAa,mBAAmB,CAAA;AAE9C,MAAM,aAAgB,GAAA,UAAA,CAG3B,SAASA,cAAAA,CACT,OACA,GACA,EAAA;AACA,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,IAAA;AAAA,IACA,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,GAAG;AAAA,GACD,GAAA,KAAA;AACJ,EAAM,MAAA,EAAE,WAAY,EAAA,GAAI,eAAuB,EAAA;AAC/C,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,qBAAA;AAAA,IACR,GAAK,EAAAC,QAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,KAAA,EAAO,EAAE,MAAO,EAAA;AAAA,IAChB,OAAA,EAAS,EAAE,cAAe;AAAA,MACxB,kBAA0B,EAAA;AAC9B,EAAA,MAAM,IAAO,GAAA,mBAAA,CAA2B,WAAa,EAAA,IAAA,EAAM,MAAM,CAAA;AACjE,EAAM,MAAA,gBAAA,GAAmB,CAAC,KAA0B,KAAA;AAClD,IAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,IAAe,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,YAAA,CAAA,KAAA,CAAA;AAAA,GACjB;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,MACzC,GAAA;AAAA,MACA,YAAc,EAAA,gBAAA;AAAA,MACb,GAAG,IAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,aAAA,EAAY,cAAe,EAAA,SAAA,EAAW,YAAa,CAAA,MAAM,CAC3D,EAAA,QAAA,EAAA,IAAA,CAAK,GAAI,CAAA,CAAC,GAAQ,KAAA;AACjB,QACE,uBAAA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YAEC,KAAK,GAAI,CAAA,IAAA;AAAA,YACT,iBAAA;AAAA,YACA,KAAO,EAAA,IAAA;AAAA,YACP;AAAA,WAAA;AAAA,UAJK,WAAY,CAAA,MAAA,CAAO,GAAI,CAAA,IAAA,EAAM,eAAe,MAAM;AAAA,SAKzD;AAAA,OAEH,CACH,EAAA;AAAA;AAAA,GACF;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"CalendarMonth.js","sources":["../src/calendar/internal/CalendarMonth.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithRef,\n type MouseEvent,\n type SyntheticEvent,\n forwardRef,\n} from \"react\";\nimport { CalendarDay, type CalendarDayProps } from \"./CalendarDay\";\nimport { generateVisibleDays } from \"./utils\";\n\nimport type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useLocalization } from \"../../localization-provider\";\nimport { useCalendarContext } from \"./CalendarContext\";\nimport calendarMonthCss from \"./CalendarMonth.css\";\n\nexport interface CalendarMonthProps<TDate>\n extends ComponentPropsWithRef<\"div\"> {\n /**\n * Month to render as selectable dates\n */\n date: TDate;\n /**\n * Props for the CalendarDay component.\n */\n CalendarDayProps?: Partial<CalendarDayProps<TDate>>;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarMonth\");\n\nexport const CalendarMonth = forwardRef<\n HTMLDivElement,\n CalendarMonthProps<DateFrameworkType>\n>(function CalendarMonth<TDate extends DateFrameworkType>(\n props: CalendarMonthProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const { className, date, onMouseLeave, CalendarDayProps, ...rest } = props;\n const { dateAdapter } = useLocalization<TDate>();\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-month\",\n css: calendarMonthCss,\n window: targetWindow,\n });\n\n const {\n state: { timezone = \"default\" },\n helpers: { setHoveredDate },\n } = useCalendarContext<TDate>();\n const days = generateVisibleDays<TDate>(dateAdapter, date, timezone);\n const handleMouseLeave = (event: SyntheticEvent) => {\n setHoveredDate(event, null);\n onMouseLeave?.(event as MouseEvent<HTMLDivElement>);\n };\n\n return (\n <div\n className={clsx(withBaseName(), className)}\n ref={ref}\n onMouseLeave={handleMouseLeave}\n {...rest}\n >\n <div data-testid=\"CalendarGrid\" className={withBaseName(\"grid\")}>\n {days.map((day) => (\n <CalendarDay\n {...CalendarDayProps}\n key={dateAdapter.format(day, \"DD MMM YYYY\")}\n date={day}\n month={date}\n />\n ))}\n </div>\n </div>\n );\n});\n"],"names":["CalendarMonth","calendarMonthCss"],"mappings":";;;;;;;;;;;;AA8BA,MAAM,YAAA,GAAe,aAAa,mBAAmB,CAAA;AAE9C,MAAM,aAAgB,GAAA,UAAA,CAG3B,SAASA,cAAAA,CACT,OACA,GACA,EAAA;AACA,EAAA,MAAM,EAAE,SAAW,EAAA,IAAA,EAAM,cAAc,gBAAkB,EAAA,GAAG,MAAS,GAAA,KAAA;AACrE,EAAM,MAAA,EAAE,WAAY,EAAA,GAAI,eAAuB,EAAA;AAC/C,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,qBAAA;AAAA,IACR,GAAK,EAAAC,QAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,KAAA,EAAO,EAAE,QAAA,GAAW,SAAU,EAAA;AAAA,IAC9B,OAAA,EAAS,EAAE,cAAe;AAAA,MACxB,kBAA0B,EAAA;AAC9B,EAAA,MAAM,IAAO,GAAA,mBAAA,CAA2B,WAAa,EAAA,IAAA,EAAM,QAAQ,CAAA;AACnE,EAAM,MAAA,gBAAA,GAAmB,CAAC,KAA0B,KAAA;AAClD,IAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,IAAe,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAA,KAAA,CAAA;AAAA,GACjB;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,MACzC,GAAA;AAAA,MACA,YAAc,EAAA,gBAAA;AAAA,MACb,GAAG,IAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,aAAA,EAAY,cAAe,EAAA,SAAA,EAAW,YAAa,CAAA,MAAM,CAC3D,EAAA,QAAA,EAAA,IAAA,CAAK,GAAI,CAAA,CAAC,GACT,qBAAA,aAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACE,GAAG,gBAAA;AAAA,UACJ,GAAK,EAAA,WAAA,CAAY,MAAO,CAAA,GAAA,EAAK,aAAa,CAAA;AAAA,UAC1C,IAAM,EAAA,GAAA;AAAA,UACN,KAAO,EAAA;AAAA;AAAA,OAEV,CACH,EAAA;AAAA;AAAA,GACF;AAEJ,CAAC;;;;"}
@@ -6,14 +6,13 @@ function useFocusManagement({
6
6
  }) {
7
7
  const { dateAdapter } = useLocalization();
8
8
  const {
9
- state: { locale },
10
9
  helpers: { setFocusedDate }
11
10
  } = useCalendarContext();
12
11
  const handleClick = (event) => {
13
12
  setFocusedDate(event, date);
14
13
  };
15
14
  const handleKeyDown = (event) => {
16
- let newDate = date;
15
+ let newDate = void 0;
17
16
  switch (event.key) {
18
17
  case "ArrowUp":
19
18
  newDate = dateAdapter.subtract(date, { weeks: 1 });
@@ -28,10 +27,10 @@ function useFocusManagement({
28
27
  newDate = dateAdapter.add(date, { days: 1 });
29
28
  break;
30
29
  case "Home":
31
- newDate = dateAdapter.startOf(date, "week", locale);
30
+ newDate = dateAdapter.startOf(date, "week");
32
31
  break;
33
32
  case "End":
34
- newDate = dateAdapter.endOf(date, "week", locale);
33
+ newDate = dateAdapter.endOf(date, "week");
35
34
  break;
36
35
  case "PageUp":
37
36
  if (event.shiftKey) {
@@ -48,10 +47,10 @@ function useFocusManagement({
48
47
  }
49
48
  break;
50
49
  }
51
- if (dateAdapter.compare(newDate, date) !== 0) {
50
+ if (newDate && dateAdapter.compare(newDate, date) !== 0) {
52
51
  event.preventDefault();
52
+ setFocusedDate(event, newDate);
53
53
  }
54
- setFocusedDate(event, newDate);
55
54
  };
56
55
  const handleFocus = (event) => {
57
56
  setFocusedDate(event, date);
@@ -1 +1 @@
1
- {"version":3,"file":"useFocusManagement.js","sources":["../src/calendar/internal/useFocusManagement.ts"],"sourcesContent":["import type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport type {\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n} from \"react\";\nimport { useLocalization } from \"../../localization-provider\";\nimport { useCalendarContext } from \"./CalendarContext\";\n\nexport function useFocusManagement<TDate extends DateFrameworkType>({\n date,\n}: {\n date: TDate;\n}) {\n const { dateAdapter } = useLocalization<TDate>();\n const {\n state: { locale },\n helpers: { setFocusedDate },\n } = useCalendarContext<TDate>();\n const handleClick: MouseEventHandler<HTMLButtonElement> = (event) => {\n setFocusedDate(event, date);\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = (event) => {\n let newDate = date;\n switch (event.key) {\n case \"ArrowUp\":\n newDate = dateAdapter.subtract(date, { weeks: 1 });\n break;\n case \"ArrowDown\":\n newDate = dateAdapter.add(date, { weeks: 1 });\n break;\n case \"ArrowLeft\":\n newDate = dateAdapter.subtract(date, { days: 1 });\n break;\n case \"ArrowRight\":\n newDate = dateAdapter.add(date, { days: 1 });\n break;\n case \"Home\":\n newDate = dateAdapter.startOf(date, \"week\", locale);\n break;\n case \"End\":\n newDate = dateAdapter.endOf(date, \"week\", locale);\n break;\n case \"PageUp\":\n if (event.shiftKey) {\n newDate = dateAdapter.subtract(date, { years: 1 });\n } else {\n newDate = dateAdapter.subtract(date, { months: 1 });\n }\n break;\n case \"PageDown\":\n if (event.shiftKey) {\n newDate = dateAdapter.add(date, { years: 1 });\n } else {\n newDate = dateAdapter.add(date, { months: 1 });\n }\n break;\n default:\n }\n if (dateAdapter.compare(newDate, date) !== 0) {\n event.preventDefault();\n }\n setFocusedDate(event, newDate);\n };\n\n const handleFocus: FocusEventHandler<HTMLButtonElement> = (event) => {\n setFocusedDate(event, date);\n };\n\n return {\n handleClick,\n handleKeyDown,\n handleFocus,\n };\n}\n"],"names":[],"mappings":";;;AASO,SAAS,kBAAoD,CAAA;AAAA,EAClE;AACF,CAEG,EAAA;AACD,EAAM,MAAA,EAAE,WAAY,EAAA,GAAI,eAAuB,EAAA;AAC/C,EAAM,MAAA;AAAA,IACJ,KAAA,EAAO,EAAE,MAAO,EAAA;AAAA,IAChB,OAAA,EAAS,EAAE,cAAe;AAAA,MACxB,kBAA0B,EAAA;AAC9B,EAAM,MAAA,WAAA,GAAoD,CAAC,KAAU,KAAA;AACnE,IAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAAA,GAC5B;AAEA,EAAM,MAAA,aAAA,GAAyD,CAAC,KAAU,KAAA;AACxE,IAAA,IAAI,OAAU,GAAA,IAAA;AACd,IAAA,QAAQ,MAAM,GAAK;AAAA,MACjB,KAAK,SAAA;AACH,QAAA,OAAA,GAAU,YAAY,QAAS,CAAA,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AACjD,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,GAAU,YAAY,GAAI,CAAA,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AAC5C,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,GAAU,YAAY,QAAS,CAAA,IAAA,EAAM,EAAE,IAAA,EAAM,GAAG,CAAA;AAChD,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,OAAA,GAAU,YAAY,GAAI,CAAA,IAAA,EAAM,EAAE,IAAA,EAAM,GAAG,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,OAAA,GAAU,WAAY,CAAA,OAAA,CAAQ,IAAM,EAAA,MAAA,EAAQ,MAAM,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,OAAA,GAAU,WAAY,CAAA,KAAA,CAAM,IAAM,EAAA,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,MAAM,QAAU,EAAA;AAClB,UAAA,OAAA,GAAU,YAAY,QAAS,CAAA,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,SAC5C,MAAA;AACL,UAAA,OAAA,GAAU,YAAY,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA;AAEpD,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,IAAI,MAAM,QAAU,EAAA;AAClB,UAAA,OAAA,GAAU,YAAY,GAAI,CAAA,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,SACvC,MAAA;AACL,UAAA,OAAA,GAAU,YAAY,GAAI,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA;AAE/C,QAAA;AACF;AAEF,IAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,OAAS,EAAA,IAAI,MAAM,CAAG,EAAA;AAC5C,MAAA,KAAA,CAAM,cAAe,EAAA;AAAA;AAEvB,IAAA,cAAA,CAAe,OAAO,OAAO,CAAA;AAAA,GAC/B;AAEA,EAAM,MAAA,WAAA,GAAoD,CAAC,KAAU,KAAA;AACnE,IAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAAA,GAC5B;AAEA,EAAO,OAAA;AAAA,IACL,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useFocusManagement.js","sources":["../src/calendar/internal/useFocusManagement.ts"],"sourcesContent":["import type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport type {\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n} from \"react\";\nimport { useLocalization } from \"../../localization-provider\";\nimport { useCalendarContext } from \"./CalendarContext\";\n\nexport function useFocusManagement<TDate extends DateFrameworkType>({\n date,\n}: {\n date: TDate;\n}) {\n const { dateAdapter } = useLocalization<TDate>();\n const {\n helpers: { setFocusedDate },\n } = useCalendarContext<TDate>();\n const handleClick: MouseEventHandler<HTMLButtonElement> = (event) => {\n setFocusedDate(event, date);\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = (event) => {\n let newDate: TDate | undefined = undefined;\n switch (event.key) {\n case \"ArrowUp\":\n newDate = dateAdapter.subtract(date, { weeks: 1 });\n break;\n case \"ArrowDown\":\n newDate = dateAdapter.add(date, { weeks: 1 });\n break;\n case \"ArrowLeft\":\n newDate = dateAdapter.subtract(date, { days: 1 });\n break;\n case \"ArrowRight\":\n newDate = dateAdapter.add(date, { days: 1 });\n break;\n case \"Home\":\n newDate = dateAdapter.startOf(date, \"week\");\n break;\n case \"End\":\n newDate = dateAdapter.endOf(date, \"week\");\n break;\n case \"PageUp\":\n if (event.shiftKey) {\n newDate = dateAdapter.subtract(date, { years: 1 });\n } else {\n newDate = dateAdapter.subtract(date, { months: 1 });\n }\n break;\n case \"PageDown\":\n if (event.shiftKey) {\n newDate = dateAdapter.add(date, { years: 1 });\n } else {\n newDate = dateAdapter.add(date, { months: 1 });\n }\n break;\n default:\n }\n if (newDate && dateAdapter.compare(newDate, date) !== 0) {\n event.preventDefault();\n setFocusedDate(event, newDate);\n }\n };\n\n const handleFocus: FocusEventHandler<HTMLButtonElement> = (event) => {\n setFocusedDate(event, date);\n };\n\n return {\n handleClick,\n handleKeyDown,\n handleFocus,\n };\n}\n"],"names":[],"mappings":";;;AASO,SAAS,kBAAoD,CAAA;AAAA,EAClE;AACF,CAEG,EAAA;AACD,EAAM,MAAA,EAAE,WAAY,EAAA,GAAI,eAAuB,EAAA;AAC/C,EAAM,MAAA;AAAA,IACJ,OAAA,EAAS,EAAE,cAAe;AAAA,MACxB,kBAA0B,EAAA;AAC9B,EAAM,MAAA,WAAA,GAAoD,CAAC,KAAU,KAAA;AACnE,IAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAAA,GAC5B;AAEA,EAAM,MAAA,aAAA,GAAyD,CAAC,KAAU,KAAA;AACxE,IAAA,IAAI,OAA6B,GAAA,MAAA;AACjC,IAAA,QAAQ,MAAM,GAAK;AAAA,MACjB,KAAK,SAAA;AACH,QAAA,OAAA,GAAU,YAAY,QAAS,CAAA,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AACjD,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,GAAU,YAAY,GAAI,CAAA,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AAC5C,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,GAAU,YAAY,QAAS,CAAA,IAAA,EAAM,EAAE,IAAA,EAAM,GAAG,CAAA;AAChD,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,OAAA,GAAU,YAAY,GAAI,CAAA,IAAA,EAAM,EAAE,IAAA,EAAM,GAAG,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAU,OAAA,GAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,MAAM,CAAA;AAC1C,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAU,OAAA,GAAA,WAAA,CAAY,KAAM,CAAA,IAAA,EAAM,MAAM,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,MAAM,QAAU,EAAA;AAClB,UAAA,OAAA,GAAU,YAAY,QAAS,CAAA,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,SAC5C,MAAA;AACL,UAAA,OAAA,GAAU,YAAY,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA;AAEpD,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,IAAI,MAAM,QAAU,EAAA;AAClB,UAAA,OAAA,GAAU,YAAY,GAAI,CAAA,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,SACvC,MAAA;AACL,UAAA,OAAA,GAAU,YAAY,GAAI,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA;AAE/C,QAAA;AACF;AAEF,IAAA,IAAI,WAAW,WAAY,CAAA,OAAA,CAAQ,OAAS,EAAA,IAAI,MAAM,CAAG,EAAA;AACvD,MAAA,KAAA,CAAM,cAAe,EAAA;AACrB,MAAA,cAAA,CAAe,OAAO,OAAO,CAAA;AAAA;AAC/B,GACF;AAEA,EAAM,MAAA,WAAA,GAAoD,CAAC,KAAU,KAAA;AACnE,IAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAAA,GAC5B;AAEA,EAAO,OAAA;AAAA,IACL,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -1,7 +1,7 @@
1
- function daysOfWeek(dateAdapter, format, locale) {
1
+ function daysOfWeek(dateAdapter, format) {
2
2
  return Array.from(
3
3
  { length: 7 },
4
- (_, day) => dateAdapter.getDayOfWeekName(day, format, locale)
4
+ (_, day) => dateAdapter.getDayOfWeekName(day, format)
5
5
  );
6
6
  }
7
7
  function generateMonthsForYear(dateAdapter, currentYear) {
@@ -11,20 +11,16 @@ function generateMonthsForYear(dateAdapter, currentYear) {
11
11
  (_, month) => dateAdapter.add(startOfYear, { months: month })
12
12
  );
13
13
  }
14
- function generateVisibleDays(dateAdapter, currentMonth, locale) {
14
+ function generateVisibleDays(dateAdapter, currentMonth, timezone) {
15
15
  const totalDays = 6 * 7;
16
16
  const startDate = dateAdapter.startOf(
17
- dateAdapter.startOf(currentMonth, "month", locale),
18
- "week",
19
- locale
17
+ dateAdapter.startOf(currentMonth, "month"),
18
+ "week"
20
19
  );
21
20
  return [...Array(totalDays).keys()].map((dayDelta) => {
22
- const day = dateAdapter.add(startDate, { days: dayDelta });
23
- return {
24
- date: day,
25
- dateOfMonth: dateAdapter.getMonth(day),
26
- isCurrentMonth: dateAdapter.isSame(day, currentMonth, "month")
27
- };
21
+ let day = dateAdapter.add(startDate, { days: dayDelta });
22
+ day = dateAdapter.setTimezone(day, timezone);
23
+ return day;
28
24
  });
29
25
  }
30
26
  function monthDiff(dateAdapter, a, b) {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../src/calendar/internal/utils.ts"],"sourcesContent":["import type {\n DateFrameworkType,\n SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\n\nexport function daysOfWeek<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n format: \"long\" | \"short\" | \"narrow\",\n locale?: any,\n) {\n return Array.from({ length: 7 }, (_, day) =>\n dateAdapter.getDayOfWeekName(day, format, locale),\n );\n}\n\nexport function generateMonthsForYear<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n currentYear: TDate,\n) {\n const startOfYear = dateAdapter.startOf(currentYear, \"year\");\n return Array.from({ length: 12 }, (_, month) =>\n dateAdapter.add(startOfYear, { months: month }),\n );\n}\n\nexport function generateVisibleDays<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n currentMonth: TDate,\n locale?: any,\n) {\n const totalDays = 6 * 7;\n const startDate = dateAdapter.startOf(\n dateAdapter.startOf(currentMonth, \"month\", locale),\n \"week\",\n locale,\n );\n return [...Array(totalDays).keys()].map((dayDelta) => {\n const day = dateAdapter.add(startDate, { days: dayDelta });\n return {\n date: day,\n dateOfMonth: dateAdapter.getMonth(day),\n isCurrentMonth: dateAdapter.isSame(day, currentMonth, \"month\"),\n };\n });\n}\n\nexport function monthDiff<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n a: TDate,\n b: TDate,\n) {\n const aMonth = dateAdapter.getMonth(a);\n const aYear = dateAdapter.getYear(a);\n const bMonth = dateAdapter.getMonth(b);\n const bYear = dateAdapter.getYear(b);\n\n return bMonth - aMonth + 12 * (bYear - aYear);\n}\n\nexport function generateDatesForMonth<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n date: TDate,\n): TDate[] {\n const startDate = dateAdapter.startOf(date, \"month\");\n const endDate = dateAdapter.endOf(date, \"month\");\n const dates: TDate[] = [];\n for (\n let currentDate = startDate;\n dateAdapter.compare(currentDate, endDate) <= 0;\n currentDate = dateAdapter.add(currentDate, { days: 1 })\n ) {\n dates.push(currentDate);\n }\n return dates;\n}\n"],"names":[],"mappings":"AAKgB,SAAA,UAAA,CACd,WACA,EAAA,MAAA,EACA,MACA,EAAA;AACA,EAAA,OAAO,KAAM,CAAA,IAAA;AAAA,IAAK,EAAE,QAAQ,CAAE,EAAA;AAAA,IAAG,CAAC,CAAG,EAAA,GAAA,KACnC,YAAY,gBAAiB,CAAA,GAAA,EAAK,QAAQ,MAAM;AAAA,GAClD;AACF;AAEgB,SAAA,qBAAA,CACd,aACA,WACA,EAAA;AACA,EAAA,MAAM,WAAc,GAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,EAAa,MAAM,CAAA;AAC3D,EAAA,OAAO,KAAM,CAAA,IAAA;AAAA,IAAK,EAAE,QAAQ,EAAG,EAAA;AAAA,IAAG,CAAC,GAAG,KACpC,KAAA,WAAA,CAAY,IAAI,WAAa,EAAA,EAAE,MAAQ,EAAA,KAAA,EAAO;AAAA,GAChD;AACF;AAEgB,SAAA,mBAAA,CACd,WACA,EAAA,YAAA,EACA,MACA,EAAA;AACA,EAAA,MAAM,YAAY,CAAI,GAAA,CAAA;AACtB,EAAA,MAAM,YAAY,WAAY,CAAA,OAAA;AAAA,IAC5B,WAAY,CAAA,OAAA,CAAQ,YAAc,EAAA,OAAA,EAAS,MAAM,CAAA;AAAA,IACjD,MAAA;AAAA,IACA;AAAA,GACF;AACA,EAAO,OAAA,CAAC,GAAG,KAAA,CAAM,SAAS,CAAA,CAAE,MAAM,CAAA,CAAE,GAAI,CAAA,CAAC,QAAa,KAAA;AACpD,IAAA,MAAM,MAAM,WAAY,CAAA,GAAA,CAAI,WAAW,EAAE,IAAA,EAAM,UAAU,CAAA;AACzD,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,GAAA;AAAA,MACN,WAAA,EAAa,WAAY,CAAA,QAAA,CAAS,GAAG,CAAA;AAAA,MACrC,cAAgB,EAAA,WAAA,CAAY,MAAO,CAAA,GAAA,EAAK,cAAc,OAAO;AAAA,KAC/D;AAAA,GACD,CAAA;AACH;AAEgB,SAAA,SAAA,CACd,WACA,EAAA,CAAA,EACA,CACA,EAAA;AACA,EAAM,MAAA,MAAA,GAAS,WAAY,CAAA,QAAA,CAAS,CAAC,CAAA;AACrC,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,OAAA,CAAQ,CAAC,CAAA;AACnC,EAAM,MAAA,MAAA,GAAS,WAAY,CAAA,QAAA,CAAS,CAAC,CAAA;AACrC,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,OAAA,CAAQ,CAAC,CAAA;AAEnC,EAAO,OAAA,MAAA,GAAS,MAAS,GAAA,EAAA,IAAM,KAAQ,GAAA,KAAA,CAAA;AACzC;AAEgB,SAAA,qBAAA,CACd,aACA,IACS,EAAA;AACT,EAAA,MAAM,SAAY,GAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAA;AACnD,EAAA,MAAM,OAAU,GAAA,WAAA,CAAY,KAAM,CAAA,IAAA,EAAM,OAAO,CAAA;AAC/C,EAAA,MAAM,QAAiB,EAAC;AACxB,EAAA,KAAA,IACM,cAAc,SAClB,EAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,EAAa,OAAO,CAAK,IAAA,CAAA,EAC7C,WAAc,GAAA,WAAA,CAAY,IAAI,WAAa,EAAA,EAAE,IAAM,EAAA,CAAA,EAAG,CACtD,EAAA;AACA,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA;AAExB,EAAO,OAAA,KAAA;AACT;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../src/calendar/internal/utils.ts"],"sourcesContent":["import type {\n DateFrameworkType,\n SaltDateAdapter,\n Timezone,\n} from \"@salt-ds/date-adapters\";\n\nexport function daysOfWeek<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n format: \"long\" | \"short\" | \"narrow\",\n) {\n return Array.from({ length: 7 }, (_, day) =>\n dateAdapter.getDayOfWeekName(day, format),\n );\n}\n\nexport function generateMonthsForYear<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n currentYear: TDate,\n) {\n const startOfYear = dateAdapter.startOf(currentYear, \"year\");\n return Array.from({ length: 12 }, (_, month) =>\n dateAdapter.add(startOfYear, { months: month }),\n );\n}\n\nexport function generateVisibleDays<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n currentMonth: TDate,\n timezone: Timezone,\n) {\n const totalDays = 6 * 7;\n const startDate = dateAdapter.startOf(\n dateAdapter.startOf(currentMonth, \"month\"),\n \"week\",\n );\n return [...Array(totalDays).keys()].map((dayDelta) => {\n let day = dateAdapter.add(startDate, { days: dayDelta });\n day = dateAdapter.setTimezone(day, timezone);\n return day;\n });\n}\n\nexport function monthDiff<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n a: TDate,\n b: TDate,\n) {\n const aMonth = dateAdapter.getMonth(a);\n const aYear = dateAdapter.getYear(a);\n const bMonth = dateAdapter.getMonth(b);\n const bYear = dateAdapter.getYear(b);\n\n return bMonth - aMonth + 12 * (bYear - aYear);\n}\n\nexport function generateDatesForMonth<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n date: TDate,\n): TDate[] {\n const startDate = dateAdapter.startOf(date, \"month\");\n const endDate = dateAdapter.endOf(date, \"month\");\n const dates: TDate[] = [];\n for (\n let currentDate = startDate;\n dateAdapter.compare(currentDate, endDate) <= 0;\n currentDate = dateAdapter.add(currentDate, { days: 1 })\n ) {\n dates.push(currentDate);\n }\n return dates;\n}\n"],"names":[],"mappings":"AAMgB,SAAA,UAAA,CACd,aACA,MACA,EAAA;AACA,EAAA,OAAO,KAAM,CAAA,IAAA;AAAA,IAAK,EAAE,QAAQ,CAAE,EAAA;AAAA,IAAG,CAAC,CAAG,EAAA,GAAA,KACnC,WAAY,CAAA,gBAAA,CAAiB,KAAK,MAAM;AAAA,GAC1C;AACF;AAEgB,SAAA,qBAAA,CACd,aACA,WACA,EAAA;AACA,EAAA,MAAM,WAAc,GAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,EAAa,MAAM,CAAA;AAC3D,EAAA,OAAO,KAAM,CAAA,IAAA;AAAA,IAAK,EAAE,QAAQ,EAAG,EAAA;AAAA,IAAG,CAAC,GAAG,KACpC,KAAA,WAAA,CAAY,IAAI,WAAa,EAAA,EAAE,MAAQ,EAAA,KAAA,EAAO;AAAA,GAChD;AACF;AAEgB,SAAA,mBAAA,CACd,WACA,EAAA,YAAA,EACA,QACA,EAAA;AACA,EAAA,MAAM,YAAY,CAAI,GAAA,CAAA;AACtB,EAAA,MAAM,YAAY,WAAY,CAAA,OAAA;AAAA,IAC5B,WAAA,CAAY,OAAQ,CAAA,YAAA,EAAc,OAAO,CAAA;AAAA,IACzC;AAAA,GACF;AACA,EAAO,OAAA,CAAC,GAAG,KAAA,CAAM,SAAS,CAAA,CAAE,MAAM,CAAA,CAAE,GAAI,CAAA,CAAC,QAAa,KAAA;AACpD,IAAA,IAAI,MAAM,WAAY,CAAA,GAAA,CAAI,WAAW,EAAE,IAAA,EAAM,UAAU,CAAA;AACvD,IAAM,GAAA,GAAA,WAAA,CAAY,WAAY,CAAA,GAAA,EAAK,QAAQ,CAAA;AAC3C,IAAO,OAAA,GAAA;AAAA,GACR,CAAA;AACH;AAEgB,SAAA,SAAA,CACd,WACA,EAAA,CAAA,EACA,CACA,EAAA;AACA,EAAM,MAAA,MAAA,GAAS,WAAY,CAAA,QAAA,CAAS,CAAC,CAAA;AACrC,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,OAAA,CAAQ,CAAC,CAAA;AACnC,EAAM,MAAA,MAAA,GAAS,WAAY,CAAA,QAAA,CAAS,CAAC,CAAA;AACrC,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,OAAA,CAAQ,CAAC,CAAA;AAEnC,EAAO,OAAA,MAAA,GAAS,MAAS,GAAA,EAAA,IAAM,KAAQ,GAAA,KAAA,CAAA;AACzC;AAEgB,SAAA,qBAAA,CACd,aACA,IACS,EAAA;AACT,EAAA,MAAM,SAAY,GAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAA;AACnD,EAAA,MAAM,OAAU,GAAA,WAAA,CAAY,KAAM,CAAA,IAAA,EAAM,OAAO,CAAA;AAC/C,EAAA,MAAM,QAAiB,EAAC;AACxB,EAAA,KAAA,IACM,cAAc,SAClB,EAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,EAAa,OAAO,CAAK,IAAA,CAAA,EAC7C,WAAc,GAAA,WAAA,CAAY,IAAI,WAAa,EAAA,EAAE,IAAM,EAAA,CAAA,EAAG,CACtD,EAAA;AACA,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA;AAExB,EAAO,OAAA,KAAA;AACT;;;;"}
@@ -1,40 +1,50 @@
1
- import { useControlled } from '@salt-ds/core';
2
- import { useCallback, useState, useEffect, useMemo } from 'react';
1
+ import { useBreakpoint, resolveResponsiveValue, useControlled } from '@salt-ds/core';
2
+ import { useMemo, useCallback, useEffect } from 'react';
3
3
  import { useLocalization } from '../localization-provider/LocalizationProvider.js';
4
- import { generateDatesForMonth } from './internal/utils.js';
5
- import { useCalendarSelection, isDateRangeSelection } from './useCalendarSelection.js';
4
+ import { useCalendarSelection } from './useCalendarSelection.js';
6
5
 
7
6
  const defaultIsDayUnselectable = () => false;
8
7
  const defaultIsDayHighlighted = () => false;
9
8
  const defaultIsDayDisabled = () => false;
10
9
  function useCalendar(props) {
10
+ var _a;
11
11
  const {
12
12
  dateAdapter,
13
13
  defaultDates: { minDate: defaultMinDate, maxDate: defaultMaxDate }
14
14
  } = useLocalization();
15
15
  const {
16
- selectedDate,
16
+ timezone,
17
17
  defaultSelectedDate,
18
- visibleMonth: visibleMonthProp,
18
+ defaultVisibleMonth = dateAdapter.today(timezone),
19
19
  hideOutOfRangeDates,
20
- locale,
21
- defaultVisibleMonth = dateAdapter.today(locale),
22
- onSelectionChange,
23
- onVisibleMonthChange,
24
- isDayUnselectable = defaultIsDayUnselectable,
25
- isDayHighlighted = defaultIsDayHighlighted,
20
+ hoveredDate,
21
+ focusedDate: focusedDateProp,
22
+ focusedDateRef,
26
23
  isDayDisabled = defaultIsDayDisabled,
27
- minDate = defaultMinDate,
24
+ isDayHighlighted = defaultIsDayHighlighted,
25
+ isDayUnselectable = defaultIsDayUnselectable,
28
26
  maxDate = defaultMaxDate,
29
- selectionVariant,
27
+ minDate = defaultMinDate,
28
+ numberOfVisibleMonths = 1,
30
29
  onHoveredDateChange,
31
- hoveredDate
30
+ onSelectionChange,
31
+ onVisibleMonthChange,
32
+ onFocusedDateChange,
33
+ selectedDate,
34
+ selectionVariant,
35
+ visibleMonth: visibleMonthProp
32
36
  // startDateOffset,
33
37
  // endDateOffset,
34
38
  } = props;
39
+ const { matchedBreakpoints } = useBreakpoint();
40
+ const responsiveNumberOfVisibleMonths = resolveResponsiveValue(numberOfVisibleMonths, matchedBreakpoints) ?? 1;
35
41
  const [visibleMonth, setVisibleMonthState] = useControlled({
36
- controlled: visibleMonthProp ? dateAdapter.startOf(visibleMonthProp, "month", locale) : void 0,
37
- default: dateAdapter.startOf(defaultVisibleMonth, "month", locale),
42
+ controlled: visibleMonthProp ? dateAdapter.startOf(visibleMonthProp, "month") : void 0,
43
+ // biome-ignore lint/correctness/useExhaustiveDependencies: just on mount
44
+ default: useMemo(
45
+ () => dateAdapter.startOf(defaultVisibleMonth, "month"),
46
+ []
47
+ ),
38
48
  name: "Calendar",
39
49
  state: "visibleMonth"
40
50
  });
@@ -42,94 +52,75 @@ function useCalendar(props) {
42
52
  (date) => {
43
53
  return dateAdapter.compare(date, minDate) < 0 || dateAdapter.compare(date, maxDate) > 0;
44
54
  },
45
- [maxDate, minDate]
55
+ [dateAdapter, maxDate, minDate]
46
56
  );
47
57
  const isOutsideAllowedMonths = useCallback(
48
58
  (date) => {
49
- const startOfMonth = dateAdapter.startOf(date, "month", locale);
50
- const endOfMonth = dateAdapter.endOf(date, "month", locale);
59
+ const startOfMonth = dateAdapter.startOf(date, "month");
60
+ const endOfMonth = dateAdapter.endOf(date, "month");
51
61
  return dateAdapter.compare(endOfMonth, minDate) < 0 || dateAdapter.compare(startOfMonth, maxDate) > 0;
52
62
  },
53
- [minDate, maxDate]
63
+ [dateAdapter, minDate, maxDate]
54
64
  );
55
65
  const isOutsideAllowedYears = useCallback(
56
66
  (date) => {
57
- const startOfYear = dateAdapter.startOf(date, "year", locale);
58
- const endOfYear = dateAdapter.endOf(date, "year", locale);
67
+ const startOfYear = dateAdapter.startOf(date, "year");
68
+ const endOfYear = dateAdapter.endOf(date, "year");
59
69
  return dateAdapter.compare(endOfYear, minDate) < 0 || dateAdapter.compare(startOfYear, maxDate) > 0;
60
70
  },
61
- [minDate, maxDate]
71
+ [dateAdapter, minDate, maxDate]
62
72
  );
63
73
  const isDaySelectable = useCallback(
64
74
  (date) => !(date && (isDayUnselectable(date) || isDayDisabled(date) || isOutsideAllowedDates(date))),
65
75
  [isDayUnselectable, isDayDisabled, isOutsideAllowedDates]
66
76
  );
77
+ const isDayVisible = useCallback(
78
+ (date) => {
79
+ if (!date) {
80
+ return false;
81
+ }
82
+ const startInsideDays = dateAdapter.startOf(visibleMonth, "month");
83
+ if (dateAdapter.compare(date, startInsideDays) < 0) return false;
84
+ const endVisibleMonth = dateAdapter.add(visibleMonth, {
85
+ months: responsiveNumberOfVisibleMonths - 1
86
+ });
87
+ const endInsideDays = dateAdapter.endOf(endVisibleMonth, "month");
88
+ return !(dateAdapter.compare(date, endInsideDays) > 0);
89
+ },
90
+ [dateAdapter, responsiveNumberOfVisibleMonths, visibleMonth]
91
+ );
67
92
  const selectionManager = useCalendarSelection({
68
93
  defaultSelectedDate,
69
94
  selectedDate,
70
95
  onSelectionChange,
71
96
  startDateOffset: props.selectionVariant === "offset" ? props.startDateOffset : void 0,
72
97
  endDateOffset: props.selectionVariant === "offset" ? props.endDateOffset : void 0,
98
+ isOutsideAllowedDates,
73
99
  isDaySelectable,
100
+ isDayVisible,
101
+ focusedDate: focusedDateProp,
102
+ focusedDateRef,
103
+ onFocusedDateChange,
74
104
  selectionVariant,
75
105
  onHoveredDateChange,
76
- hoveredDate
106
+ hoveredDate,
107
+ timezone,
108
+ visibleMonth
77
109
  });
78
- const [calendarFocused, setCalendarFocused] = useState(false);
79
- const isInVisibleMonth = useCallback(
80
- (date) => date != null && dateAdapter.isSame(date, visibleMonth, "month"),
81
- [visibleMonth]
82
- );
83
- const getInitialFocusedDate = useCallback(() => {
84
- const selectedDate2 = selectionManager.state.selectedDate;
85
- if ((selectionVariant === "range" || selectionVariant === "offset") && isDateRangeSelection(selectedDate2)) {
86
- if (isInVisibleMonth(selectedDate2 == null ? void 0 : selectedDate2.startDate)) {
87
- return selectedDate2.startDate;
88
- }
89
- if (isInVisibleMonth(selectedDate2 == null ? void 0 : selectedDate2.endDate)) {
90
- return selectedDate2.endDate;
91
- }
92
- } else if (selectionVariant === "multiselect" && Array.isArray(selectedDate2)) {
93
- const selectionInMonth = selectedDate2.filter((day) => isInVisibleMonth(day)).sort((a, b) => dateAdapter.compare(a, b));
94
- if (selectionInMonth.length > 0) {
95
- return selectionInMonth[0];
96
- }
97
- } else if (selectionVariant === "single" && !isDateRangeSelection(selectedDate2) && !Array.isArray(selectedDate2) && isInVisibleMonth(selectedDate2)) {
98
- return selectedDate2;
99
- }
100
- if (isDaySelectable(dateAdapter.today(locale)) && isInVisibleMonth(dateAdapter.today(locale))) {
101
- return dateAdapter.today(locale);
102
- }
103
- const firstSelectableDate = generateDatesForMonth(
104
- dateAdapter,
105
- visibleMonth
106
- ).find((visibleDay) => isDaySelectable(visibleDay));
107
- if (firstSelectableDate) {
108
- return firstSelectableDate;
110
+ useEffect(() => {
111
+ var _a2;
112
+ const focusedDate = (_a2 = selectionManager == null ? void 0 : selectionManager.state) == null ? void 0 : _a2.focusedDate;
113
+ const shouldTransition = focusedDate && !focusedDateProp !== void 0 && !isDayVisible(focusedDate) && isDaySelectable(focusedDate) && !isOutsideAllowedDates(focusedDate);
114
+ if (shouldTransition) {
115
+ setVisibleMonth(null, dateAdapter.startOf(focusedDate, "month"));
109
116
  }
110
- return null;
111
117
  }, [
112
- isInVisibleMonth,
113
- selectionVariant,
114
- selectionManager.state.selectedDate,
115
- visibleMonth
118
+ dateAdapter,
119
+ focusedDateProp,
120
+ isOutsideAllowedDates,
121
+ isDaySelectable,
122
+ (_a = selectionManager == null ? void 0 : selectionManager.state) == null ? void 0 : _a.focusedDate
116
123
  ]);
117
- const [focusedDate, setFocusedDateState] = useState(
118
- getInitialFocusedDate
119
- );
120
- const isDayVisible = useCallback(
121
- (date) => {
122
- const startInsideDays = dateAdapter.startOf(
123
- visibleMonth,
124
- "month",
125
- locale
126
- );
127
- if (dateAdapter.compare(date, startInsideDays) < 0) return false;
128
- const endInsideDays = dateAdapter.endOf(visibleMonth, "month", locale);
129
- return !(dateAdapter.compare(date, endInsideDays) > 0);
130
- },
131
- [visibleMonth]
132
- );
133
124
  const setVisibleMonth = useCallback(
134
125
  (event, newVisibleMonth) => {
135
126
  setVisibleMonthState(newVisibleMonth);
@@ -137,49 +128,20 @@ function useCalendar(props) {
137
128
  },
138
129
  [onVisibleMonthChange]
139
130
  );
140
- const setFocusedDate = useCallback(
141
- (event, date) => {
142
- if (!focusedDate || dateAdapter.isSame(date, focusedDate, "day") || isOutsideAllowedDates(date))
143
- return;
144
- setFocusedDateState(date);
145
- const shouldTransition = !isDayVisible(date) && isDaySelectable(date) && !isOutsideAllowedDates(date);
146
- if (shouldTransition) {
147
- setVisibleMonth(event, dateAdapter.startOf(date, "month", locale));
148
- }
149
- },
150
- [
151
- focusedDate,
152
- isDaySelectable,
153
- isDayVisible,
154
- isOutsideAllowedDates,
155
- setVisibleMonth
156
- ]
157
- );
158
- useEffect(() => {
159
- if (visibleMonth && focusedDate && !isDayVisible(focusedDate)) {
160
- const focusableDate = getInitialFocusedDate();
161
- if (focusableDate) {
162
- setFocusedDateState(focusableDate);
163
- }
164
- }
165
- }, [isDayVisible, focusedDate, getInitialFocusedDate, visibleMonth]);
166
131
  return useMemo(
167
132
  () => ({
168
133
  state: {
169
134
  visibleMonth,
170
- focusedDate,
171
- locale,
135
+ timezone,
172
136
  minDate,
173
137
  maxDate,
138
+ numberOfVisibleMonths: responsiveNumberOfVisibleMonths,
174
139
  selectionVariant,
175
140
  hideOutOfRangeDates,
176
- calendarFocused,
177
141
  ...selectionManager.state
178
142
  },
179
143
  helpers: {
180
144
  setVisibleMonth,
181
- setFocusedDate,
182
- setCalendarFocused,
183
145
  isDayUnselectable,
184
146
  isDayHighlighted,
185
147
  isDayDisabled,
@@ -192,15 +154,12 @@ function useCalendar(props) {
192
154
  }),
193
155
  [
194
156
  visibleMonth,
195
- focusedDate,
196
- locale,
157
+ timezone,
197
158
  minDate,
198
159
  maxDate,
199
160
  selectionVariant,
200
161
  hideOutOfRangeDates,
201
- calendarFocused,
202
162
  setVisibleMonth,
203
- setFocusedDate,
204
163
  isDayUnselectable,
205
164
  isDayHighlighted,
206
165
  isDayDisabled,
@@ -208,6 +167,7 @@ function useCalendar(props) {
208
167
  isOutsideAllowedDates,
209
168
  isOutsideAllowedMonths,
210
169
  isOutsideAllowedYears,
170
+ responsiveNumberOfVisibleMonths,
211
171
  selectionManager
212
172
  ]
213
173
  );
@@ -1 +1 @@
1
- {"version":3,"file":"useCalendar.js","sources":["../src/calendar/useCalendar.ts"],"sourcesContent":["import { useControlled } from \"@salt-ds/core\";\nimport type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport {\n type SyntheticEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport { generateDatesForMonth } from \"./internal/utils\";\nimport {\n type UseCalendarSelectionMultiSelectProps,\n type UseCalendarSelectionOffsetProps,\n type UseCalendarSelectionProps,\n type UseCalendarSelectionRangeProps,\n type UseCalendarSelectionSingleProps,\n isDateRangeSelection,\n useCalendarSelection,\n} from \"./useCalendarSelection\";\n\n/**\n * Interface representing the base properties UseCalendar hook.\n */\ninterface UseCalendarBaseProps<TDate> {\n /**\n * The default visible month.\n */\n defaultVisibleMonth?: TDate;\n /**\n * Callback fired when the visible month changes.\n * @param event - The synthetic event.\n * @param visibleMonth - The new visible month.\n */\n onVisibleMonthChange?: (event: SyntheticEvent, visibleMonth: TDate) => void;\n /**\n * Function to determine if a day is unselectable.\n * @param date - The date to check.\n * @returns A string reason if the day is unselectable, otherwise `false` or `undefined`.\n */\n isDayUnselectable?: (date: TDate) => string | false | undefined;\n /**\n * Function to determine if a day is highlighted.\n * @param date - The date to check.\n * @returns A string reason if the day is highlighted, otherwise `false` or `undefined`.\n */\n isDayHighlighted?: (date: TDate) => string | false | undefined;\n /**\n * Function to determine if a day is disabled.\n * @param date - The date to check.\n * @returns A string reason if the day is disabled, otherwise `false` or `undefined`.\n */\n isDayDisabled?: (date: TDate) => string | false | undefined;\n /**\n * The currently visible month.\n */\n visibleMonth?: TDate;\n /**\n * If `true`, hides dates that are out of the selectable range.\n */\n hideOutOfRangeDates?: boolean;\n /**\n * Locale for date formatting\n */\n locale?: any;\n /**\n * The minimum selectable date.\n */\n minDate?: TDate;\n /**\n * The maximum selectable date.\n */\n maxDate?: TDate;\n}\n\n/**\n * UseCalendar hook props for a single date selection Calendar.\n */\nexport interface UseCalendarSingleProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionSingleProps<TDate>,\n UseCalendarBaseProps<TDate> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n}\n\n/**\n * UseCalendar hook props for a date range selection Calendar.\n */\nexport interface UseCalendarRangeProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionRangeProps<TDate>,\n UseCalendarBaseProps<TDate> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n}\n\n/**\n * UseCalendar hook props for a multi-select Calendar.\n */\nexport interface UseCalendarMultiSelectProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionMultiSelectProps<TDate>,\n UseCalendarBaseProps<TDate> {\n /**\n * The selection variant, set to \"multiselect\".\n */\n selectionVariant: \"multiselect\";\n}\n\n/**\n * UseCalendar hook props for an offset date selection Calendar.\n */\nexport interface UseCalendarOffsetProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionOffsetProps<TDate>,\n UseCalendarBaseProps<TDate> {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n}\n\n/**\n * UseCalendar hook props, wth the selection variant determining the return type of the date selection\n */\nexport type UseCalendarProps<TDate extends DateFrameworkType> =\n | UseCalendarSingleProps<TDate>\n | UseCalendarRangeProps<TDate>\n | UseCalendarMultiSelectProps<TDate>\n | UseCalendarOffsetProps<TDate>;\n\n/**\n * Default function to determine if a day is unselectable.\n * @returns `false` indicating the day is selectable.\n */\nconst defaultIsDayUnselectable = (): string | false => false;\n\n/**\n * Default function to determine if a day is highlighted.\n * @returns `false` indicating the day is not highlighted.\n */\nconst defaultIsDayHighlighted = (): string | false => false;\n\n/**\n * Default function to determine if a day is disabled.\n * @returns `false` indicating the day is not disabled.\n */\nconst defaultIsDayDisabled = (): false => false;\n\n/**\n * Represents the return type of the useCalendar hook.\n *\n * @template TDate - The type of the date object used in the calendar.\n */\nexport interface UseCalendarReturn<TDate extends DateFrameworkType> {\n /**\n * The state of the calendar.\n */\n state: {\n /**\n * The currently visible month in the calendar.\n */\n visibleMonth: TDate;\n\n /**\n * The currently focused date in the calendar, or null if no date is focused.\n */\n focusedDate: TDate | null;\n\n /**\n * The locale used for date formatting.\n */\n locale: any;\n\n /**\n * The minimum selectable date in the calendar.\n */\n minDate: TDate;\n\n /**\n * The maximum selectable date in the calendar.\n */\n maxDate: TDate;\n\n /**\n * The selection variant of the calendar, indicating the type of selection allowed.\n */\n selectionVariant: \"single\" | \"range\" | \"multiselect\" | \"offset\";\n\n /**\n * Whether to hide dates that are out of the selectable range.\n */\n hideOutOfRangeDates?: boolean;\n\n /**\n * Whether the calendar is currently focused.\n */\n calendarFocused: boolean;\n\n /**\n * Additional state properties from selectionManager.state.\n */\n [key: string]: any; // Use a more specific type if possible\n };\n\n /**\n * Helper functions for interacting with the calendar.\n */\n helpers: {\n /**\n * Sets the visible month in the calendar.\n *\n * @param event - The synthetic event triggering the change.\n * @param newVisibleMonth - The new visible month to set.\n */\n setVisibleMonth: (event: SyntheticEvent, newVisibleMonth: TDate) => void;\n\n /**\n * Sets the focused date in the calendar.\n *\n * @param event - The synthetic event triggering the change.\n * @param date - The new date to focus.\n */\n setFocusedDate: (event: SyntheticEvent, date: TDate) => void;\n\n /**\n * Sets whether the calendar is focused.\n *\n * @param focused - Whether the calendar should be focused.\n */\n setCalendarFocused: (focused: boolean) => void;\n\n /**\n * Determines if a day is unselectable.\n *\n * @param date - The date to check.\n * @returns A string reason if the day is unselectable, otherwise `false` or `undefined`.\n */\n isDayUnselectable: (date: TDate) => string | false | undefined;\n\n /**\n * Determines if a day is highlighted.\n *\n * @param date - The date to check.\n * @returns A string reason if the day is highlighted, otherwise `false` or `undefined`.\n */\n isDayHighlighted: (date: TDate) => string | false | undefined;\n\n /**\n * Determines if a day is disabled.\n *\n * @param date - The date to check.\n * @returns A string reason if the day is disabled, otherwise `false` or `undefined`.\n */\n isDayDisabled: (date: TDate) => string | false | undefined;\n\n /**\n * Determines if a day is visible in the calendar.\n *\n * @param date - The date to check.\n * @returns `true` if the day is visible, otherwise `false`.\n */\n isDayVisible: (date: TDate) => boolean;\n\n /**\n * Determines if a date is outside the allowed date range.\n *\n * @param date - The date to check.\n * @returns `true` if the date is outside the allowed range, otherwise `false`.\n */\n isOutsideAllowedDates: (date: TDate) => boolean;\n\n /**\n * Determines if a month is outside the allowed range.\n *\n * @param date - The date to check.\n * @returns `true` if the month is outside the allowed range, otherwise `false`.\n */\n isOutsideAllowedMonths: (date: TDate) => boolean;\n\n /**\n * Determines if a year is outside the allowed range.\n *\n * @param date - The date to check.\n * @returns `true` if the year is outside the allowed range, otherwise `false`.\n */\n isOutsideAllowedYears: (date: TDate) => boolean;\n\n /**\n * Sets the selected date in the calendar.\n *\n * @param event - The event triggering the change.\n * @param newSelectedDate - The new date to select.\n */\n setSelectedDate: (\n event:\n | React.KeyboardEvent<HTMLButtonElement>\n | React.MouseEvent<HTMLButtonElement, MouseEvent>,\n newSelectedDate: TDate,\n ) => void;\n\n /**\n * Determines if a date is selected.\n *\n * @param date - The date to check.\n * @returns `true` if the date is selected, otherwise `false`.\n */\n isSelected: (date: TDate) => boolean;\n\n /**\n * Sets the hovered date in the calendar.\n *\n * @param event - The event triggering the change.\n * @param newHoveredDate - The new date to hover.\n */\n setHoveredDate: (\n event: SyntheticEvent,\n newHoveredDate: TDate | null,\n ) => void;\n\n /**\n * Determines if a date is part of a selected span.\n *\n * @param date - The date to check.\n * @returns `true` if the date is part of a selected span, otherwise `false`.\n */\n isSelectedSpan: (date: TDate) => boolean;\n\n /**\n * Determines if a date is part of a hovered span.\n *\n * @param date - The date to check.\n * @returns `true` if the date is part of a hovered span, otherwise `false`.\n */\n isHoveredSpan: (date: TDate) => boolean;\n\n /**\n * Determines if a date is the start of a selected range.\n *\n * @param date - The date to check.\n * @returns `true` if the date is the start of a selected range, otherwise `false`.\n */\n isSelectedStart: (date: TDate) => boolean;\n\n /**\n * Determines if a date is the end of a selected range.\n *\n * @param date - The date to check.\n * @returns `true` if the date is the end of a selected range, otherwise `false`.\n */\n isSelectedEnd: (date: TDate) => boolean;\n\n /**\n * Determines if a date is hovered.\n *\n * @param date - The date to check.\n * @returns `true` if the date is hovered, otherwise `false`.\n */\n isHovered: (date: TDate) => boolean;\n\n /**\n * Determines if a date is part of a hovered offset.\n *\n * @param date - The date to check.\n * @returns `true` if the date is part of a hovered offset, otherwise `false`.\n */\n isHoveredOffset: (date: TDate) => boolean;\n\n /**\n * Determines if a day is selectable.\n *\n * @param date - The date to check.\n * @returns `true` if the day is selectable, otherwise `false`.\n */\n isDaySelectable: (date: TDate) => boolean;\n };\n}\n\nexport function useCalendar<TDate extends DateFrameworkType>(\n props: UseCalendarProps<TDate>,\n): UseCalendarReturn<TDate> {\n const {\n dateAdapter,\n defaultDates: { minDate: defaultMinDate, maxDate: defaultMaxDate },\n } = useLocalization<TDate>();\n const {\n selectedDate,\n defaultSelectedDate,\n visibleMonth: visibleMonthProp,\n hideOutOfRangeDates,\n locale,\n defaultVisibleMonth = dateAdapter.today(locale),\n onSelectionChange,\n onVisibleMonthChange,\n isDayUnselectable = defaultIsDayUnselectable,\n isDayHighlighted = defaultIsDayHighlighted,\n isDayDisabled = defaultIsDayDisabled,\n minDate = defaultMinDate,\n maxDate = defaultMaxDate,\n selectionVariant,\n onHoveredDateChange,\n hoveredDate,\n // startDateOffset,\n // endDateOffset,\n } = props;\n const [visibleMonth, setVisibleMonthState] = useControlled({\n controlled: visibleMonthProp\n ? dateAdapter.startOf(visibleMonthProp, \"month\", locale)\n : undefined,\n default: dateAdapter.startOf(defaultVisibleMonth, \"month\", locale),\n name: \"Calendar\",\n state: \"visibleMonth\",\n });\n\n const isOutsideAllowedDates = useCallback(\n (date: TDate) => {\n return (\n dateAdapter.compare(date, minDate) < 0 ||\n dateAdapter.compare(date, maxDate) > 0\n );\n },\n [maxDate, minDate],\n );\n\n const isOutsideAllowedMonths = useCallback(\n (date: TDate) => {\n const startOfMonth = dateAdapter.startOf(date, \"month\", locale);\n const endOfMonth = dateAdapter.endOf(date, \"month\", locale);\n return (\n dateAdapter.compare(endOfMonth, minDate) < 0 ||\n dateAdapter.compare(startOfMonth, maxDate) > 0\n );\n },\n [minDate, maxDate],\n );\n\n const isOutsideAllowedYears = useCallback(\n (date: TDate) => {\n const startOfYear = dateAdapter.startOf(date, \"year\", locale);\n const endOfYear = dateAdapter.endOf(date, \"year\", locale);\n return (\n dateAdapter.compare(endOfYear, minDate) < 0 ||\n dateAdapter.compare(startOfYear, maxDate) > 0\n );\n },\n [minDate, maxDate],\n );\n\n const isDaySelectable = useCallback(\n (date?: TDate) =>\n !(\n date &&\n (isDayUnselectable(date) ||\n isDayDisabled(date) ||\n isOutsideAllowedDates(date))\n ),\n [isDayUnselectable, isDayDisabled, isOutsideAllowedDates],\n );\n\n const selectionManager = useCalendarSelection<TDate>({\n defaultSelectedDate: defaultSelectedDate,\n selectedDate,\n onSelectionChange,\n startDateOffset:\n props.selectionVariant === \"offset\" ? props.startDateOffset : undefined,\n endDateOffset:\n props.selectionVariant === \"offset\" ? props.endDateOffset : undefined,\n isDaySelectable,\n selectionVariant,\n onHoveredDateChange,\n hoveredDate,\n } as UseCalendarSelectionProps<TDate>);\n\n const [calendarFocused, setCalendarFocused] = useState(false);\n\n const isInVisibleMonth = useCallback(\n (date: TDate | undefined | null): date is TDate =>\n date != null && dateAdapter.isSame(date, visibleMonth, \"month\"),\n [visibleMonth],\n );\n\n const getInitialFocusedDate = useCallback(() => {\n const selectedDate = selectionManager.state.selectedDate;\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection<TDate>(selectedDate)\n ) {\n if (isInVisibleMonth(selectedDate?.startDate)) {\n return selectedDate.startDate;\n }\n if (isInVisibleMonth(selectedDate?.endDate)) {\n return selectedDate.endDate;\n }\n } else if (\n selectionVariant === \"multiselect\" &&\n Array.isArray(selectedDate)\n ) {\n // return first selected day in visible month\n const selectionInMonth = selectedDate\n .filter((day) => isInVisibleMonth(day))\n .sort((a, b) => dateAdapter.compare(a, b));\n if (selectionInMonth.length > 0) {\n return selectionInMonth[0];\n }\n } else if (\n selectionVariant === \"single\" &&\n !isDateRangeSelection(selectedDate) &&\n !Array.isArray(selectedDate) &&\n isInVisibleMonth(selectedDate)\n ) {\n return selectedDate;\n }\n // Defaults\n if (\n isDaySelectable(dateAdapter.today(locale)) &&\n isInVisibleMonth(dateAdapter.today(locale))\n ) {\n return dateAdapter.today(locale);\n }\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n visibleMonth,\n ).find((visibleDay) => isDaySelectable(visibleDay));\n if (firstSelectableDate) {\n return firstSelectableDate;\n }\n return null;\n }, [\n isInVisibleMonth,\n selectionVariant,\n selectionManager.state.selectedDate,\n visibleMonth,\n ]);\n\n const [focusedDate, setFocusedDateState] = useState<TDate | null>(\n getInitialFocusedDate,\n );\n\n const isDayVisible = useCallback(\n (date: TDate) => {\n const startInsideDays = dateAdapter.startOf(\n visibleMonth,\n \"month\",\n locale,\n );\n\n if (dateAdapter.compare(date, startInsideDays) < 0) return false;\n\n const endInsideDays = dateAdapter.endOf(visibleMonth, \"month\", locale);\n\n return !(dateAdapter.compare(date, endInsideDays) > 0);\n },\n [visibleMonth],\n );\n\n const setVisibleMonth = useCallback(\n (event: SyntheticEvent, newVisibleMonth: TDate) => {\n setVisibleMonthState(newVisibleMonth);\n onVisibleMonthChange?.(event, newVisibleMonth);\n },\n [onVisibleMonthChange],\n );\n\n const setFocusedDate = useCallback(\n (event: SyntheticEvent, date: TDate) => {\n if (\n !focusedDate ||\n dateAdapter.isSame(date, focusedDate, \"day\") ||\n isOutsideAllowedDates(date)\n )\n return;\n\n setFocusedDateState(date);\n\n const shouldTransition =\n !isDayVisible(date) &&\n isDaySelectable(date) &&\n !isOutsideAllowedDates(date);\n if (shouldTransition) {\n setVisibleMonth(event, dateAdapter.startOf(date, \"month\", locale));\n }\n },\n [\n focusedDate,\n isDaySelectable,\n isDayVisible,\n isOutsideAllowedDates,\n setVisibleMonth,\n ],\n );\n\n useEffect(() => {\n if (visibleMonth && focusedDate && !isDayVisible(focusedDate)) {\n const focusableDate = getInitialFocusedDate();\n if (focusableDate) {\n setFocusedDateState(focusableDate);\n }\n }\n }, [isDayVisible, focusedDate, getInitialFocusedDate, visibleMonth]);\n\n return useMemo(\n () =>\n ({\n state: {\n visibleMonth,\n focusedDate,\n locale,\n minDate,\n maxDate,\n selectionVariant,\n hideOutOfRangeDates,\n calendarFocused,\n ...selectionManager.state,\n },\n helpers: {\n setVisibleMonth,\n setFocusedDate,\n setCalendarFocused,\n isDayUnselectable,\n isDayHighlighted,\n isDayDisabled,\n isDayVisible,\n isOutsideAllowedDates,\n isOutsideAllowedMonths,\n isOutsideAllowedYears,\n ...selectionManager.helpers,\n },\n }) as UseCalendarReturn<TDate>,\n [\n visibleMonth,\n focusedDate,\n locale,\n minDate,\n maxDate,\n selectionVariant,\n hideOutOfRangeDates,\n calendarFocused,\n setVisibleMonth,\n setFocusedDate,\n isDayUnselectable,\n isDayHighlighted,\n isDayDisabled,\n isDayVisible,\n isOutsideAllowedDates,\n isOutsideAllowedMonths,\n isOutsideAllowedYears,\n selectionManager,\n ],\n );\n}\n"],"names":["selectedDate"],"mappings":";;;;;;AAwIA,MAAM,2BAA2B,MAAsB,KAAA;AAMvD,MAAM,0BAA0B,MAAsB,KAAA;AAMtD,MAAM,uBAAuB,MAAa,KAAA;AAuOnC,SAAS,YACd,KAC0B,EAAA;AAC1B,EAAM,MAAA;AAAA,IACJ,WAAA;AAAA,IACA,YAAc,EAAA,EAAE,OAAS,EAAA,cAAA,EAAgB,SAAS,cAAe;AAAA,MAC/D,eAAuB,EAAA;AAC3B,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA,mBAAA;AAAA,IACA,YAAc,EAAA,gBAAA;AAAA,IACd,mBAAA;AAAA,IACA,MAAA;AAAA,IACA,mBAAA,GAAsB,WAAY,CAAA,KAAA,CAAM,MAAM,CAAA;AAAA,IAC9C,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA,iBAAoB,GAAA,wBAAA;AAAA,IACpB,gBAAmB,GAAA,uBAAA;AAAA,IACnB,aAAgB,GAAA,oBAAA;AAAA,IAChB,OAAU,GAAA,cAAA;AAAA,IACV,OAAU,GAAA,cAAA;AAAA,IACV,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA;AAAA;AAAA,GAGE,GAAA,KAAA;AACJ,EAAA,MAAM,CAAC,YAAA,EAAc,oBAAoB,CAAA,GAAI,aAAc,CAAA;AAAA,IACzD,YAAY,gBACR,GAAA,WAAA,CAAY,QAAQ,gBAAkB,EAAA,OAAA,EAAS,MAAM,CACrD,GAAA,KAAA,CAAA;AAAA,IACJ,OAAS,EAAA,WAAA,CAAY,OAAQ,CAAA,mBAAA,EAAqB,SAAS,MAAM,CAAA;AAAA,IACjE,IAAM,EAAA,UAAA;AAAA,IACN,KAAO,EAAA;AAAA,GACR,CAAA;AAED,EAAA,MAAM,qBAAwB,GAAA,WAAA;AAAA,IAC5B,CAAC,IAAgB,KAAA;AACf,MACE,OAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAA,GAAI,KACrC,WAAY,CAAA,OAAA,CAAQ,IAAM,EAAA,OAAO,CAAI,GAAA,CAAA;AAAA,KAEzC;AAAA,IACA,CAAC,SAAS,OAAO;AAAA,GACnB;AAEA,EAAA,MAAM,sBAAyB,GAAA,WAAA;AAAA,IAC7B,CAAC,IAAgB,KAAA;AACf,MAAA,MAAM,YAAe,GAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,SAAS,MAAM,CAAA;AAC9D,MAAA,MAAM,UAAa,GAAA,WAAA,CAAY,KAAM,CAAA,IAAA,EAAM,SAAS,MAAM,CAAA;AAC1D,MACE,OAAA,WAAA,CAAY,OAAQ,CAAA,UAAA,EAAY,OAAO,CAAA,GAAI,KAC3C,WAAY,CAAA,OAAA,CAAQ,YAAc,EAAA,OAAO,CAAI,GAAA,CAAA;AAAA,KAEjD;AAAA,IACA,CAAC,SAAS,OAAO;AAAA,GACnB;AAEA,EAAA,MAAM,qBAAwB,GAAA,WAAA;AAAA,IAC5B,CAAC,IAAgB,KAAA;AACf,MAAA,MAAM,WAAc,GAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,QAAQ,MAAM,CAAA;AAC5D,MAAA,MAAM,SAAY,GAAA,WAAA,CAAY,KAAM,CAAA,IAAA,EAAM,QAAQ,MAAM,CAAA;AACxD,MACE,OAAA,WAAA,CAAY,OAAQ,CAAA,SAAA,EAAW,OAAO,CAAA,GAAI,KAC1C,WAAY,CAAA,OAAA,CAAQ,WAAa,EAAA,OAAO,CAAI,GAAA,CAAA;AAAA,KAEhD;AAAA,IACA,CAAC,SAAS,OAAO;AAAA,GACnB;AAEA,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,IACC,KAAA,EACE,IACC,KAAA,iBAAA,CAAkB,IAAI,CAAA,IACrB,aAAc,CAAA,IAAI,CAClB,IAAA,qBAAA,CAAsB,IAAI,CAAA,CAAA,CAAA;AAAA,IAEhC,CAAC,iBAAmB,EAAA,aAAA,EAAe,qBAAqB;AAAA,GAC1D;AAEA,EAAA,MAAM,mBAAmB,oBAA4B,CAAA;AAAA,IACnD,mBAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA,eACE,EAAA,KAAA,CAAM,gBAAqB,KAAA,QAAA,GAAW,MAAM,eAAkB,GAAA,KAAA,CAAA;AAAA,IAChE,aACE,EAAA,KAAA,CAAM,gBAAqB,KAAA,QAAA,GAAW,MAAM,aAAgB,GAAA,KAAA,CAAA;AAAA,IAC9D,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACmC,CAAA;AAErC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5D,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,CAAC,SACC,IAAQ,IAAA,IAAA,IAAQ,YAAY,MAAO,CAAA,IAAA,EAAM,cAAc,OAAO,CAAA;AAAA,IAChE,CAAC,YAAY;AAAA,GACf;AAEA,EAAM,MAAA,qBAAA,GAAwB,YAAY,MAAM;AAC9C,IAAMA,MAAAA,aAAAA,GAAe,iBAAiB,KAAM,CAAA,YAAA;AAC5C,IAAA,IAAA,CACG,qBAAqB,OAAW,IAAA,gBAAA,KAAqB,QACtD,KAAA,oBAAA,CAA4BA,aAAY,CACxC,EAAA;AACA,MAAA,IAAI,gBAAiBA,CAAAA,aAAAA,IAAA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,aAAAA,CAAc,SAAS,CAAG,EAAA;AAC7C,QAAA,OAAOA,aAAa,CAAA,SAAA;AAAA;AAEtB,MAAA,IAAI,gBAAiBA,CAAAA,aAAAA,IAAA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,aAAAA,CAAc,OAAO,CAAG,EAAA;AAC3C,QAAA,OAAOA,aAAa,CAAA,OAAA;AAAA;AACtB,eAEA,gBAAqB,KAAA,aAAA,IACrB,KAAM,CAAA,OAAA,CAAQA,aAAY,CAC1B,EAAA;AAEA,MAAA,MAAM,mBAAmBA,aACtB,CAAA,MAAA,CAAO,CAAC,GAAA,KAAQ,iBAAiB,GAAG,CAAC,CACrC,CAAA,IAAA,CAAK,CAAC,CAAG,EAAA,CAAA,KAAM,YAAY,OAAQ,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAC3C,MAAI,IAAA,gBAAA,CAAiB,SAAS,CAAG,EAAA;AAC/B,QAAA,OAAO,iBAAiB,CAAC,CAAA;AAAA;AAC3B,KAEA,MAAA,IAAA,gBAAA,KAAqB,QACrB,IAAA,CAAC,qBAAqBA,aAAY,CAAA,IAClC,CAAC,KAAA,CAAM,OAAQA,CAAAA,aAAY,CAC3B,IAAA,gBAAA,CAAiBA,aAAY,CAC7B,EAAA;AACA,MAAOA,OAAAA,aAAAA;AAAA;AAGT,IACE,IAAA,eAAA,CAAgB,WAAY,CAAA,KAAA,CAAM,MAAM,CAAC,CACzC,IAAA,gBAAA,CAAiB,WAAY,CAAA,KAAA,CAAM,MAAM,CAAC,CAC1C,EAAA;AACA,MAAO,OAAA,WAAA,CAAY,MAAM,MAAM,CAAA;AAAA;AAEjC,IAAA,MAAM,mBAAsB,GAAA,qBAAA;AAAA,MAC1B,WAAA;AAAA,MACA;AAAA,MACA,IAAK,CAAA,CAAC,UAAe,KAAA,eAAA,CAAgB,UAAU,CAAC,CAAA;AAClD,IAAA,IAAI,mBAAqB,EAAA;AACvB,MAAO,OAAA,mBAAA;AAAA;AAET,IAAO,OAAA,IAAA;AAAA,GACN,EAAA;AAAA,IACD,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAiB,KAAM,CAAA,YAAA;AAAA,IACvB;AAAA,GACD,CAAA;AAED,EAAM,MAAA,CAAC,WAAa,EAAA,mBAAmB,CAAI,GAAA,QAAA;AAAA,IACzC;AAAA,GACF;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,IAAgB,KAAA;AACf,MAAA,MAAM,kBAAkB,WAAY,CAAA,OAAA;AAAA,QAClC,YAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,YAAY,OAAQ,CAAA,IAAA,EAAM,eAAe,CAAA,GAAI,GAAU,OAAA,KAAA;AAE3D,MAAA,MAAM,aAAgB,GAAA,WAAA,CAAY,KAAM,CAAA,YAAA,EAAc,SAAS,MAAM,CAAA;AAErE,MAAA,OAAO,EAAE,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,aAAa,CAAI,GAAA,CAAA,CAAA;AAAA,KACtD;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,OAAuB,eAA2B,KAAA;AACjD,MAAA,oBAAA,CAAqB,eAAe,CAAA;AACpC,MAAA,oBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,oBAAA,CAAuB,KAAO,EAAA,eAAA,CAAA;AAAA,KAChC;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,OAAuB,IAAgB,KAAA;AACtC,MACE,IAAA,CAAC,eACD,WAAY,CAAA,MAAA,CAAO,MAAM,WAAa,EAAA,KAAK,CAC3C,IAAA,qBAAA,CAAsB,IAAI,CAAA;AAE1B,QAAA;AAEF,MAAA,mBAAA,CAAoB,IAAI,CAAA;AAExB,MAAM,MAAA,gBAAA,GACJ,CAAC,YAAA,CAAa,IAAI,CAAA,IAClB,gBAAgB,IAAI,CAAA,IACpB,CAAC,qBAAA,CAAsB,IAAI,CAAA;AAC7B,MAAA,IAAI,gBAAkB,EAAA;AACpB,QAAA,eAAA,CAAgB,OAAO,WAAY,CAAA,OAAA,CAAQ,IAAM,EAAA,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA;AACnE,KACF;AAAA,IACA;AAAA,MACE,WAAA;AAAA,MACA,eAAA;AAAA,MACA,YAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAgB,IAAA,WAAA,IAAe,CAAC,YAAA,CAAa,WAAW,CAAG,EAAA;AAC7D,MAAA,MAAM,gBAAgB,qBAAsB,EAAA;AAC5C,MAAA,IAAI,aAAe,EAAA;AACjB,QAAA,mBAAA,CAAoB,aAAa,CAAA;AAAA;AACnC;AACF,KACC,CAAC,YAAA,EAAc,WAAa,EAAA,qBAAA,EAAuB,YAAY,CAAC,CAAA;AAEnE,EAAO,OAAA,OAAA;AAAA,IACL,OACG;AAAA,MACC,KAAO,EAAA;AAAA,QACL,YAAA;AAAA,QACA,WAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA,gBAAA;AAAA,QACA,mBAAA;AAAA,QACA,eAAA;AAAA,QACA,GAAG,gBAAiB,CAAA;AAAA,OACtB;AAAA,MACA,OAAS,EAAA;AAAA,QACP,eAAA;AAAA,QACA,cAAA;AAAA,QACA,kBAAA;AAAA,QACA,iBAAA;AAAA,QACA,gBAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,qBAAA;AAAA,QACA,sBAAA;AAAA,QACA,qBAAA;AAAA,QACA,GAAG,gBAAiB,CAAA;AAAA;AACtB,KACF,CAAA;AAAA,IACF;AAAA,MACE,YAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA,iBAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,qBAAA;AAAA,MACA,sBAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useCalendar.js","sources":["../src/calendar/useCalendar.ts"],"sourcesContent":["import {\n type ResponsiveProp,\n resolveResponsiveValue,\n useBreakpoint,\n useControlled,\n} from \"@salt-ds/core\";\nimport type { DateFrameworkType, Timezone } from \"@salt-ds/date-adapters\";\nimport { type SyntheticEvent, useCallback, useEffect, useMemo } from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport {\n type UseCalendarSelectionBaseProps,\n type UseCalendarSelectionMultiSelectProps,\n type UseCalendarSelectionOffsetProps,\n type UseCalendarSelectionProps,\n type UseCalendarSelectionRangeProps,\n type UseCalendarSelectionSingleProps,\n useCalendarSelection,\n} from \"./useCalendarSelection\";\n\n/**\n * Base properties for the UseCalendar hook.\n * @template TDate - The type of the date object.\n */\ninterface UseCalendarBaseProps<TDate>\n extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The default visible month.\n */\n defaultVisibleMonth?: TDate;\n /**\n * Callback fired when the visible month changes.\n * @param event - The synthetic event or null if triggered by code.\n * @param visibleMonth - The new visible month.\n */\n onVisibleMonthChange?: (\n event: SyntheticEvent | null,\n visibleMonth: TDate,\n ) => void;\n /**\n * Function to determine if a day is unselectable.\n * @param date - The date to check.\n * @returns A string reason if the day is unselectable, otherwise `false` or `undefined`.\n */\n isDayUnselectable?: (date: TDate) => string | false | undefined;\n /**\n * Function to determine if a day is highlighted.\n * @param date - The date to check.\n * @returns A string reason if the day is highlighted, otherwise `false` or `undefined`.\n */\n isDayHighlighted?: (date: TDate) => string | false | undefined;\n /**\n * Function to determine if a day is disabled.\n * @param date - The date to check.\n * @returns A string reason if the day is disabled, otherwise `false` or `undefined`.\n */\n isDayDisabled?: (date: TDate) => string | false | undefined;\n /**\n * If `true`, hides dates that are out of the selectable range.\n */\n hideOutOfRangeDates?: boolean;\n /**\n * The minimum selectable date.\n */\n minDate?: TDate;\n /**\n * The maximum selectable date.\n */\n maxDate?: TDate;\n /**\n * Number of visible months, maximum 12, defaults to 1.\n */\n numberOfVisibleMonths?: ResponsiveProp<\n 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12\n >;\n}\n\n/**\n * UseCalendar hook props for a single date selection Calendar.\n */\nexport interface UseCalendarSingleProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionSingleProps<TDate>,\n UseCalendarBaseProps<TDate> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n}\n\n/**\n * UseCalendar hook props for a date range selection Calendar.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarRangeProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionRangeProps<TDate>,\n UseCalendarBaseProps<TDate> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n}\n\n/**\n * UseCalendar hook props for a multi-select Calendar.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarMultiSelectProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionMultiSelectProps<TDate>,\n UseCalendarBaseProps<TDate> {\n /**\n * The selection variant, set to \"multiselect\".\n */\n selectionVariant: \"multiselect\";\n}\n\n/**\n * UseCalendar hook props for an offset date selection Calendar.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarOffsetProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionOffsetProps<TDate>,\n UseCalendarBaseProps<TDate> {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n}\n\n/**\n * UseCalendar hook props, wth the selection variant determining the return type of the date selection\n * @template TDate - The type of the date object.\n */\nexport type UseCalendarProps<TDate extends DateFrameworkType> =\n | UseCalendarSingleProps<TDate>\n | UseCalendarRangeProps<TDate>\n | UseCalendarMultiSelectProps<TDate>\n | UseCalendarOffsetProps<TDate>;\n\n/**\n * Default function to determine if a day is unselectable.\n * @returns `false` indicating the day is selectable.\n */\nconst defaultIsDayUnselectable = (): string | false => false;\n\n/**\n * Default function to determine if a day is highlighted.\n * @returns `false` indicating the day is not highlighted.\n */\nconst defaultIsDayHighlighted = (): string | false => false;\n\n/**\n * Default function to determine if a day is disabled.\n * @returns `false` indicating the day is not disabled.\n */\nconst defaultIsDayDisabled = (): false => false;\n\n/**\n * Represents the return type of the useCalendar hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarReturn<TDate extends DateFrameworkType> {\n /**\n * The state of the calendar.\n */\n state: {\n /**\n * The currently visible month in the calendar.\n */\n visibleMonth: TDate;\n\n /**\n * The currently focused date in the calendar, or null if no date is focused.\n */\n focusedDate: TDate | null;\n\n /**\n * Focusable dates based on current state\n */\n focusableDates: TDate[];\n\n /**\n * The minimum selectable date in the calendar.\n */\n minDate: TDate;\n\n /**\n * The maximum selectable date in the calendar.\n */\n maxDate: TDate;\n\n /**\n * The selection variant of the calendar, indicating the type of selection allowed.\n */\n selectionVariant: \"single\" | \"range\" | \"multiselect\" | \"offset\";\n\n /**\n * Whether to hide dates that are out of the selectable range.\n */\n hideOutOfRangeDates?: boolean;\n\n /**\n * Number of visible months\n */\n numberOfVisibleMonths: number;\n /**\n * Specifies the timezone behavior:\n * - If undefined, the timezone will be derived from the passed date, or from `defaultSelectedDate`/`selectedDate`.\n * - If set to \"default\", the default timezone of the date library will be used.\n * - If set to \"system\", the local system's timezone will be applied.\n * - If set to \"UTC\", the time will be returned in UTC.\n * - If set to a valid IANA timezone identifier, the time will be returned for that specific timezone.\n */\n timezone?: Timezone;\n /**\n * Additional state properties from selectionManager.state.\n */\n // biome-ignore lint/suspicious/noExplicitAny: user defined\n [key: string]: any; // Use a more specific type if possible\n };\n\n /**\n * Helper functions for interacting with the calendar.\n */\n helpers: {\n /**\n * Sets the visible month in the calendar.\n *\n * @param event - The synthetic event or null if triggered by code.\n * @param newVisibleMonth - The new visible month to set.\n */\n setVisibleMonth: (\n event: SyntheticEvent | null,\n newVisibleMonth: TDate,\n ) => void;\n\n /**\n * Sets the focused date in the calendar.\n *\n * @param event - The synthetic event or null if triggered by code.\n * @param date - The new date to focus.\n */\n setFocusedDate: (event: SyntheticEvent | null, date: TDate | null) => void;\n\n /**\n * Determines if a day is unselectable.\n *\n * @param date - The date to check.\n * @returns A string reason if the day is unselectable, otherwise `false` or `undefined`.\n */\n isDayUnselectable: (date: TDate) => string | false | undefined;\n\n /**\n * Determines if a day is highlighted.\n *\n * @param date - The date to check.\n * @returns A string reason if the day is highlighted, otherwise `false` or `undefined`.\n */\n isDayHighlighted: (date: TDate) => string | false | undefined;\n\n /**\n * Determines if a day is disabled.\n *\n * @param date - The date to check.\n * @returns A string reason if the day is disabled, otherwise `false` or `undefined`.\n */\n isDayDisabled: (date: TDate) => string | false | undefined;\n\n /**\n * Determines if a day is visible in the calendar.\n *\n * @param date - The date to check.\n * @returns `true` if the day is visible, otherwise `false`.\n */\n isDayVisible: (date: TDate) => boolean;\n\n /**\n * Determines if a date is outside the allowed date range.\n *\n * @param date - The date to check.\n * @returns `true` if the date is outside the allowed range, otherwise `false`.\n */\n isOutsideAllowedDates: (date: TDate) => boolean;\n\n /**\n * Determines if a month is outside the allowed range.\n *\n * @param date - The date to check.\n * @returns `true` if the month is outside the allowed range, otherwise `false`.\n */\n isOutsideAllowedMonths: (date: TDate) => boolean;\n\n /**\n * Determines if a year is outside the allowed range.\n *\n * @param date - The date to check.\n * @returns `true` if the year is outside the allowed range, otherwise `false`.\n */\n isOutsideAllowedYears: (date: TDate) => boolean;\n\n /**\n * Sets the selected date in the calendar.\n *\n * @param event - The event triggering the change.\n * @param newSelectedDate - The new date to select.\n */\n setSelectedDate: (\n event:\n | React.KeyboardEvent<HTMLButtonElement>\n | React.MouseEvent<HTMLButtonElement, MouseEvent>,\n newSelectedDate: TDate,\n ) => void;\n\n /**\n * Determines if a date is selected.\n *\n * @param date - The date to check.\n * @returns `true` if the date is selected, otherwise `false`.\n */\n isSelected: (date: TDate) => boolean;\n\n /**\n * Sets the hovered date in the calendar.\n *\n * @param event - The event triggering the change.\n * @param newHoveredDate - The new date to hover.\n */\n setHoveredDate: (\n event: SyntheticEvent,\n newHoveredDate: TDate | null,\n ) => void;\n\n /**\n * Determines if a date is part of a selected span.\n *\n * @param date - The date to check.\n * @returns `true` if the date is part of a selected span, otherwise `false`.\n */\n isSelectedSpan: (date: TDate) => boolean;\n\n /**\n * Determines if a date is part of a hovered span.\n *\n * @param date - The date to check.\n * @returns `true` if the date is part of a hovered span, otherwise `false`.\n */\n isHoveredSpan: (date: TDate) => boolean;\n\n /**\n * Determines if a date is the start of a selected range.\n *\n * @param date - The date to check.\n * @returns `true` if the date is the start of a selected range, otherwise `false`.\n */\n isSelectedStart: (date: TDate) => boolean;\n\n /**\n * Determines if a date is the end of a selected range.\n *\n * @param date - The date to check.\n * @returns `true` if the date is the end of a selected range, otherwise `false`.\n */\n isSelectedEnd: (date: TDate) => boolean;\n\n /**\n * Determines if a date is hovered.\n *\n * @param date - The date to check.\n * @returns `true` if the date is hovered, otherwise `false`.\n */\n isHovered: (date: TDate) => boolean;\n\n /**\n * Determines if a date is part of a hovered offset.\n *\n * @param date - The date to check.\n * @returns `true` if the date is part of a hovered offset, otherwise `false`.\n */\n isHoveredOffset: (date: TDate) => boolean;\n\n /**\n * Determines if a day is selectable.\n *\n * @param date - The date to check.\n * @returns `true` if the day is selectable, otherwise `false`.\n */\n isDaySelectable: (date: TDate) => boolean;\n };\n}\n\nexport function useCalendar<TDate extends DateFrameworkType>(\n props: UseCalendarProps<TDate>,\n): UseCalendarReturn<TDate> {\n const {\n dateAdapter,\n defaultDates: { minDate: defaultMinDate, maxDate: defaultMaxDate },\n } = useLocalization<TDate>();\n const {\n timezone,\n defaultSelectedDate,\n defaultVisibleMonth = dateAdapter.today(timezone),\n hideOutOfRangeDates,\n hoveredDate,\n focusedDate: focusedDateProp,\n focusedDateRef,\n isDayDisabled = defaultIsDayDisabled,\n isDayHighlighted = defaultIsDayHighlighted,\n isDayUnselectable = defaultIsDayUnselectable,\n maxDate = defaultMaxDate,\n minDate = defaultMinDate,\n numberOfVisibleMonths = 1,\n onHoveredDateChange,\n onSelectionChange,\n onVisibleMonthChange,\n onFocusedDateChange,\n selectedDate,\n selectionVariant,\n visibleMonth: visibleMonthProp,\n // startDateOffset,\n // endDateOffset,\n } = props;\n const { matchedBreakpoints } = useBreakpoint();\n\n const responsiveNumberOfVisibleMonths =\n resolveResponsiveValue(numberOfVisibleMonths, matchedBreakpoints) ?? 1;\n\n const [visibleMonth, setVisibleMonthState] = useControlled({\n controlled: visibleMonthProp\n ? dateAdapter.startOf(visibleMonthProp, \"month\")\n : undefined,\n // biome-ignore lint/correctness/useExhaustiveDependencies: just on mount\n default: useMemo(\n () => dateAdapter.startOf(defaultVisibleMonth, \"month\"),\n [],\n ),\n name: \"Calendar\",\n state: \"visibleMonth\",\n });\n\n const isOutsideAllowedDates = useCallback(\n (date: TDate) => {\n return (\n dateAdapter.compare(date, minDate) < 0 ||\n dateAdapter.compare(date, maxDate) > 0\n );\n },\n [dateAdapter, maxDate, minDate],\n );\n\n const isOutsideAllowedMonths = useCallback(\n (date: TDate) => {\n const startOfMonth = dateAdapter.startOf(date, \"month\");\n const endOfMonth = dateAdapter.endOf(date, \"month\");\n return (\n dateAdapter.compare(endOfMonth, minDate) < 0 ||\n dateAdapter.compare(startOfMonth, maxDate) > 0\n );\n },\n [dateAdapter, minDate, maxDate],\n );\n\n const isOutsideAllowedYears = useCallback(\n (date: TDate) => {\n const startOfYear = dateAdapter.startOf(date, \"year\");\n const endOfYear = dateAdapter.endOf(date, \"year\");\n return (\n dateAdapter.compare(endOfYear, minDate) < 0 ||\n dateAdapter.compare(startOfYear, maxDate) > 0\n );\n },\n [dateAdapter, minDate, maxDate],\n );\n\n const isDaySelectable = useCallback(\n (date?: TDate) =>\n !(\n date &&\n (isDayUnselectable(date) ||\n isDayDisabled(date) ||\n isOutsideAllowedDates(date))\n ),\n [isDayUnselectable, isDayDisabled, isOutsideAllowedDates],\n );\n\n const isDayVisible = useCallback(\n (date?: TDate | null) => {\n if (!date) {\n return false;\n }\n const startInsideDays = dateAdapter.startOf(visibleMonth, \"month\");\n\n if (dateAdapter.compare(date, startInsideDays) < 0) return false;\n\n const endVisibleMonth = dateAdapter.add(visibleMonth, {\n months: responsiveNumberOfVisibleMonths - 1,\n });\n const endInsideDays = dateAdapter.endOf(endVisibleMonth, \"month\");\n\n return !(dateAdapter.compare(date, endInsideDays) > 0);\n },\n [dateAdapter, responsiveNumberOfVisibleMonths, visibleMonth],\n );\n\n const selectionManager = useCalendarSelection<TDate>({\n defaultSelectedDate,\n selectedDate,\n onSelectionChange,\n startDateOffset:\n props.selectionVariant === \"offset\" ? props.startDateOffset : undefined,\n endDateOffset:\n props.selectionVariant === \"offset\" ? props.endDateOffset : undefined,\n isOutsideAllowedDates,\n isDaySelectable,\n isDayVisible,\n focusedDate: focusedDateProp,\n focusedDateRef,\n onFocusedDateChange,\n selectionVariant,\n onHoveredDateChange,\n hoveredDate,\n timezone,\n visibleMonth,\n } as UseCalendarSelectionProps<TDate>);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: isDayVisible ignored (due to dependency on visibleMonth)\n useEffect(() => {\n const focusedDate = selectionManager?.state?.focusedDate;\n const shouldTransition =\n focusedDate &&\n !focusedDateProp !== undefined &&\n !isDayVisible(focusedDate) &&\n isDaySelectable(focusedDate) &&\n !isOutsideAllowedDates(focusedDate);\n\n if (shouldTransition) {\n setVisibleMonth(null, dateAdapter.startOf(focusedDate, \"month\"));\n }\n }, [\n dateAdapter,\n focusedDateProp,\n isOutsideAllowedDates,\n isDaySelectable,\n selectionManager?.state?.focusedDate,\n ]);\n\n const setVisibleMonth = useCallback(\n (event: SyntheticEvent | null, newVisibleMonth: TDate) => {\n setVisibleMonthState(newVisibleMonth);\n onVisibleMonthChange?.(event, newVisibleMonth);\n },\n [onVisibleMonthChange],\n );\n\n return useMemo(\n () =>\n ({\n state: {\n visibleMonth,\n timezone,\n minDate,\n maxDate,\n numberOfVisibleMonths: responsiveNumberOfVisibleMonths,\n selectionVariant,\n hideOutOfRangeDates,\n ...selectionManager.state,\n },\n helpers: {\n setVisibleMonth,\n isDayUnselectable,\n isDayHighlighted,\n isDayDisabled,\n isDayVisible,\n isOutsideAllowedDates,\n isOutsideAllowedMonths,\n isOutsideAllowedYears,\n ...selectionManager.helpers,\n },\n }) as UseCalendarReturn<TDate>,\n [\n visibleMonth,\n timezone,\n minDate,\n maxDate,\n selectionVariant,\n hideOutOfRangeDates,\n setVisibleMonth,\n isDayUnselectable,\n isDayHighlighted,\n isDayDisabled,\n isDayVisible,\n isOutsideAllowedDates,\n isOutsideAllowedMonths,\n isOutsideAllowedYears,\n responsiveNumberOfVisibleMonths,\n selectionManager,\n ],\n );\n}\n"],"names":["_a"],"mappings":";;;;;AA6IA,MAAM,2BAA2B,MAAsB,KAAA;AAMvD,MAAM,0BAA0B,MAAsB,KAAA;AAMtD,MAAM,uBAAuB,MAAa,KAAA;AA2OnC,SAAS,YACd,KAC0B,EAAA;AAtY5B,EAAA,IAAA,EAAA;AAuYE,EAAM,MAAA;AAAA,IACJ,WAAA;AAAA,IACA,YAAc,EAAA,EAAE,OAAS,EAAA,cAAA,EAAgB,SAAS,cAAe;AAAA,MAC/D,eAAuB,EAAA;AAC3B,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,mBAAA;AAAA,IACA,mBAAA,GAAsB,WAAY,CAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,IAChD,mBAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAa,EAAA,eAAA;AAAA,IACb,cAAA;AAAA,IACA,aAAgB,GAAA,oBAAA;AAAA,IAChB,gBAAmB,GAAA,uBAAA;AAAA,IACnB,iBAAoB,GAAA,wBAAA;AAAA,IACpB,OAAU,GAAA,cAAA;AAAA,IACV,OAAU,GAAA,cAAA;AAAA,IACV,qBAAwB,GAAA,CAAA;AAAA,IACxB,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA,mBAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAc,EAAA;AAAA;AAAA;AAAA,GAGZ,GAAA,KAAA;AACJ,EAAM,MAAA,EAAE,kBAAmB,EAAA,GAAI,aAAc,EAAA;AAE7C,EAAA,MAAM,+BACJ,GAAA,sBAAA,CAAuB,qBAAuB,EAAA,kBAAkB,CAAK,IAAA,CAAA;AAEvE,EAAA,MAAM,CAAC,YAAA,EAAc,oBAAoB,CAAA,GAAI,aAAc,CAAA;AAAA,IACzD,YAAY,gBACR,GAAA,WAAA,CAAY,OAAQ,CAAA,gBAAA,EAAkB,OAAO,CAC7C,GAAA,MAAA;AAAA;AAAA,IAEJ,OAAS,EAAA,OAAA;AAAA,MACP,MAAM,WAAA,CAAY,OAAQ,CAAA,mBAAA,EAAqB,OAAO,CAAA;AAAA,MACtD;AAAC,KACH;AAAA,IACA,IAAM,EAAA,UAAA;AAAA,IACN,KAAO,EAAA;AAAA,GACR,CAAA;AAED,EAAA,MAAM,qBAAwB,GAAA,WAAA;AAAA,IAC5B,CAAC,IAAgB,KAAA;AACf,MACE,OAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAA,GAAI,KACrC,WAAY,CAAA,OAAA,CAAQ,IAAM,EAAA,OAAO,CAAI,GAAA,CAAA;AAAA,KAEzC;AAAA,IACA,CAAC,WAAa,EAAA,OAAA,EAAS,OAAO;AAAA,GAChC;AAEA,EAAA,MAAM,sBAAyB,GAAA,WAAA;AAAA,IAC7B,CAAC,IAAgB,KAAA;AACf,MAAA,MAAM,YAAe,GAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAA;AACtD,MAAA,MAAM,UAAa,GAAA,WAAA,CAAY,KAAM,CAAA,IAAA,EAAM,OAAO,CAAA;AAClD,MACE,OAAA,WAAA,CAAY,OAAQ,CAAA,UAAA,EAAY,OAAO,CAAA,GAAI,KAC3C,WAAY,CAAA,OAAA,CAAQ,YAAc,EAAA,OAAO,CAAI,GAAA,CAAA;AAAA,KAEjD;AAAA,IACA,CAAC,WAAa,EAAA,OAAA,EAAS,OAAO;AAAA,GAChC;AAEA,EAAA,MAAM,qBAAwB,GAAA,WAAA;AAAA,IAC5B,CAAC,IAAgB,KAAA;AACf,MAAA,MAAM,WAAc,GAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,MAAM,CAAA;AACpD,MAAA,MAAM,SAAY,GAAA,WAAA,CAAY,KAAM,CAAA,IAAA,EAAM,MAAM,CAAA;AAChD,MACE,OAAA,WAAA,CAAY,OAAQ,CAAA,SAAA,EAAW,OAAO,CAAA,GAAI,KAC1C,WAAY,CAAA,OAAA,CAAQ,WAAa,EAAA,OAAO,CAAI,GAAA,CAAA;AAAA,KAEhD;AAAA,IACA,CAAC,WAAa,EAAA,OAAA,EAAS,OAAO;AAAA,GAChC;AAEA,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,IACC,KAAA,EACE,IACC,KAAA,iBAAA,CAAkB,IAAI,CAAA,IACrB,aAAc,CAAA,IAAI,CAClB,IAAA,qBAAA,CAAsB,IAAI,CAAA,CAAA,CAAA;AAAA,IAEhC,CAAC,iBAAmB,EAAA,aAAA,EAAe,qBAAqB;AAAA,GAC1D;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,IAAwB,KAAA;AACvB,MAAA,IAAI,CAAC,IAAM,EAAA;AACT,QAAO,OAAA,KAAA;AAAA;AAET,MAAA,MAAM,eAAkB,GAAA,WAAA,CAAY,OAAQ,CAAA,YAAA,EAAc,OAAO,CAAA;AAEjE,MAAA,IAAI,YAAY,OAAQ,CAAA,IAAA,EAAM,eAAe,CAAA,GAAI,GAAU,OAAA,KAAA;AAE3D,MAAM,MAAA,eAAA,GAAkB,WAAY,CAAA,GAAA,CAAI,YAAc,EAAA;AAAA,QACpD,QAAQ,+BAAkC,GAAA;AAAA,OAC3C,CAAA;AACD,MAAA,MAAM,aAAgB,GAAA,WAAA,CAAY,KAAM,CAAA,eAAA,EAAiB,OAAO,CAAA;AAEhE,MAAA,OAAO,EAAE,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,aAAa,CAAI,GAAA,CAAA,CAAA;AAAA,KACtD;AAAA,IACA,CAAC,WAAa,EAAA,+BAAA,EAAiC,YAAY;AAAA,GAC7D;AAEA,EAAA,MAAM,mBAAmB,oBAA4B,CAAA;AAAA,IACnD,mBAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA,eACE,EAAA,KAAA,CAAM,gBAAqB,KAAA,QAAA,GAAW,MAAM,eAAkB,GAAA,MAAA;AAAA,IAChE,aACE,EAAA,KAAA,CAAM,gBAAqB,KAAA,QAAA,GAAW,MAAM,aAAgB,GAAA,MAAA;AAAA,IAC9D,qBAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAa,EAAA,eAAA;AAAA,IACb,cAAA;AAAA,IACA,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACmC,CAAA;AAGrC,EAAA,SAAA,CAAU,MAAM;AA3gBlB,IAAAA,IAAAA,GAAAA;AA4gBI,IAAA,MAAM,WAAcA,GAAAA,CAAAA,GAAAA,GAAA,gBAAkB,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAA,KAAA,KAAlB,gBAAAA,GAAyB,CAAA,WAAA;AAC7C,IAAA,MAAM,gBACJ,GAAA,WAAA,IACA,CAAC,eAAA,KAAoB,UACrB,CAAC,YAAA,CAAa,WAAW,CAAA,IACzB,eAAgB,CAAA,WAAW,CAC3B,IAAA,CAAC,sBAAsB,WAAW,CAAA;AAEpC,IAAA,IAAI,gBAAkB,EAAA;AACpB,MAAA,eAAA,CAAgB,IAAM,EAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA;AACjE,GACC,EAAA;AAAA,IACD,WAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA;AAAA,IACA,eAAA;AAAA,IACA,CAAA,EAAA,GAAA,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAkB,UAAlB,IAAyB,GAAA,MAAA,GAAA,EAAA,CAAA;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,OAA8B,eAA2B,KAAA;AACxD,MAAA,oBAAA,CAAqB,eAAe,CAAA;AACpC,MAAA,oBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,oBAAA,CAAuB,KAAO,EAAA,eAAA,CAAA;AAAA,KAChC;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAO,OAAA,OAAA;AAAA,IACL,OACG;AAAA,MACC,KAAO,EAAA;AAAA,QACL,YAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA,qBAAuB,EAAA,+BAAA;AAAA,QACvB,gBAAA;AAAA,QACA,mBAAA;AAAA,QACA,GAAG,gBAAiB,CAAA;AAAA,OACtB;AAAA,MACA,OAAS,EAAA;AAAA,QACP,eAAA;AAAA,QACA,iBAAA;AAAA,QACA,gBAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,qBAAA;AAAA,QACA,sBAAA;AAAA,QACA,qBAAA;AAAA,QACA,GAAG,gBAAiB,CAAA;AAAA;AACtB,KACF,CAAA;AAAA,IACF;AAAA,MACE,YAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,qBAAA;AAAA,MACA,sBAAA;AAAA,MACA,qBAAA;AAAA,MACA,+BAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;;;;"}