@salt-ds/lab 1.0.0-alpha.74 → 1.0.0-alpha.75

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 (347) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/css/salt-lab.css +7 -23
  3. package/dist-cjs/app-header/AppHeader.js +5 -1
  4. package/dist-cjs/app-header/AppHeader.js.map +1 -1
  5. package/dist-cjs/breadcrumbs/Breadcrumb.js.map +1 -1
  6. package/dist-cjs/breadcrumbs/Breadcrumbs.js +11 -2
  7. package/dist-cjs/breadcrumbs/Breadcrumbs.js.map +1 -1
  8. package/dist-cjs/breadcrumbs/internal/BreadcrumbsCollapsed.js +3 -6
  9. package/dist-cjs/breadcrumbs/internal/BreadcrumbsCollapsed.js.map +1 -1
  10. package/dist-cjs/button-bar/ButtonBar.js +1 -1
  11. package/dist-cjs/button-bar/ButtonBar.js.map +1 -1
  12. package/dist-cjs/button-bar/internal/DescendantContext.js.map +1 -1
  13. package/dist-cjs/calendar/useCalendarSelection.js +2 -2
  14. package/dist-cjs/calendar/useCalendarSelection.js.map +1 -1
  15. package/dist-cjs/cascading-menu/CascadingMenu.js +19 -13
  16. package/dist-cjs/cascading-menu/CascadingMenu.js.map +1 -1
  17. package/dist-cjs/cascading-menu/CascadingMenuItem.js +2 -4
  18. package/dist-cjs/cascading-menu/CascadingMenuItem.js.map +1 -1
  19. package/dist-cjs/cascading-menu/CascadingMenuList.js +1 -2
  20. package/dist-cjs/cascading-menu/CascadingMenuList.js.map +1 -1
  21. package/dist-cjs/cascading-menu/internal/useMenuTriggerHandlers.js +4 -1
  22. package/dist-cjs/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
  23. package/dist-cjs/cascading-menu/internal/useMouseHandlers.js +1 -1
  24. package/dist-cjs/cascading-menu/internal/useMouseHandlers.js.map +1 -1
  25. package/dist-cjs/cascading-menu/internal/useRefsManager.js +3 -1
  26. package/dist-cjs/cascading-menu/internal/useRefsManager.js.map +1 -1
  27. package/dist-cjs/collapsible/CollapsibleTrigger.js +1 -2
  28. package/dist-cjs/collapsible/CollapsibleTrigger.js.map +1 -1
  29. package/dist-cjs/color-chooser/AlphaInputField.js +1 -1
  30. package/dist-cjs/color-chooser/AlphaInputField.js.map +1 -1
  31. package/dist-cjs/color-chooser/ColorChooser.js.map +1 -1
  32. package/dist-cjs/color-chooser/DictTabs.js +1 -1
  33. package/dist-cjs/color-chooser/DictTabs.js.map +1 -1
  34. package/dist-cjs/color-chooser/RGBAInputField.js +2 -2
  35. package/dist-cjs/color-chooser/RGBAInputField.js.map +1 -1
  36. package/dist-cjs/combo-box/useCombobox.js.map +1 -1
  37. package/dist-cjs/combo-box-deprecated/ComboBoxDeprecated.js +1 -1
  38. package/dist-cjs/combo-box-deprecated/ComboBoxDeprecated.js.map +1 -1
  39. package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js +1 -2
  40. package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
  41. package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js +0 -4
  42. package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
  43. package/dist-cjs/combo-box-deprecated/internal/useComboBox.js +4 -1
  44. package/dist-cjs/combo-box-deprecated/internal/useComboBox.js.map +1 -1
  45. package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js +7 -2
  46. package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
  47. package/dist-cjs/common-hooks/useAutoSizer.js +0 -9
  48. package/dist-cjs/common-hooks/useAutoSizer.js.map +1 -1
  49. package/dist-cjs/common-hooks/useCollapsibleGroups.js +37 -49
  50. package/dist-cjs/common-hooks/useCollapsibleGroups.js.map +1 -1
  51. package/dist-cjs/common-hooks/useCollectionItems.js +6 -11
  52. package/dist-cjs/common-hooks/useCollectionItems.js.map +1 -1
  53. package/dist-cjs/common-hooks/useKeyboardNavigationPanel.js +7 -7
  54. package/dist-cjs/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
  55. package/dist-cjs/common-hooks/useSelection.js +1 -1
  56. package/dist-cjs/common-hooks/useSelection.js.map +1 -1
  57. package/dist-cjs/common-hooks/useTypeahead.js +2 -2
  58. package/dist-cjs/common-hooks/useTypeahead.js.map +1 -1
  59. package/dist-cjs/common-hooks/useViewportTracking.js +1 -1
  60. package/dist-cjs/common-hooks/useViewportTracking.js.map +1 -1
  61. package/dist-cjs/common-hooks/utils/collection-item-utils.js +1 -1
  62. package/dist-cjs/common-hooks/utils/collection-item-utils.js.map +1 -1
  63. package/dist-cjs/contact-details/ContactAction.js +1 -0
  64. package/dist-cjs/contact-details/ContactAction.js.map +1 -1
  65. package/dist-cjs/contact-details/ContactSecondaryInfo.js +1 -1
  66. package/dist-cjs/contact-details/ContactSecondaryInfo.js.map +1 -1
  67. package/dist-cjs/contact-details/internal/ContactDetailsContext.js +2 -2
  68. package/dist-cjs/contact-details/internal/ContactDetailsContext.js.map +1 -1
  69. package/dist-cjs/contact-details/internal/FavoriteToggleWithTooltip.js +10 -1
  70. package/dist-cjs/contact-details/internal/FavoriteToggleWithTooltip.js.map +1 -1
  71. package/dist-cjs/content-status/ContentStatus.js.map +1 -1
  72. package/dist-cjs/content-status/internal/StatusIndicator.js.map +1 -1
  73. package/dist-cjs/date-input/DateInput.css.js +1 -1
  74. package/dist-cjs/date-picker/useFocusOut.js +1 -1
  75. package/dist-cjs/date-picker/useFocusOut.js.map +1 -1
  76. package/dist-cjs/dropdown/DropdownButton.js.map +1 -1
  77. package/dist-cjs/dropdown/useDropdown.js.map +1 -1
  78. package/dist-cjs/input-legacy/InputLegacy.css.js +1 -1
  79. package/dist-cjs/list/List.js +1 -1
  80. package/dist-cjs/list/List.js.map +1 -1
  81. package/dist-cjs/list/ListItem.css.js +1 -1
  82. package/dist-cjs/list/ListItem.js +2 -1
  83. package/dist-cjs/list/ListItem.js.map +1 -1
  84. package/dist-cjs/list/keyset.js.map +1 -1
  85. package/dist-cjs/list/useList.js +1 -3
  86. package/dist-cjs/list/useList.js.map +1 -1
  87. package/dist-cjs/list/useListHeight.js +3 -3
  88. package/dist-cjs/list/useListHeight.js.map +1 -1
  89. package/dist-cjs/list-deprecated/List.js +4 -1
  90. package/dist-cjs/list-deprecated/List.js.map +1 -1
  91. package/dist-cjs/list-deprecated/ListBase.js +18 -17
  92. package/dist-cjs/list-deprecated/ListBase.js.map +1 -1
  93. package/dist-cjs/list-deprecated/ListItem.js.map +1 -1
  94. package/dist-cjs/list-deprecated/ListItemBase.js +1 -0
  95. package/dist-cjs/list-deprecated/ListItemBase.js.map +1 -1
  96. package/dist-cjs/list-deprecated/internal/helpers.js.map +1 -1
  97. package/dist-cjs/list-deprecated/internal/scrollIntoView.js +2 -2
  98. package/dist-cjs/list-deprecated/internal/scrollIntoView.js.map +1 -1
  99. package/dist-cjs/list-deprecated/internal/useListAutoSizer.js.map +1 -1
  100. package/dist-cjs/list-deprecated/itemToString.js.map +1 -1
  101. package/dist-cjs/list-deprecated/useList.js +3 -10
  102. package/dist-cjs/list-deprecated/useList.js.map +1 -1
  103. package/dist-cjs/list-deprecated/useListItem.js.map +1 -1
  104. package/dist-cjs/list-next/ListNext.js.map +1 -1
  105. package/dist-cjs/metric/MetricContent.js +1 -0
  106. package/dist-cjs/metric/MetricContent.js.map +1 -1
  107. package/dist-cjs/number-input/NumberInput.css.js +1 -1
  108. package/dist-cjs/number-input/internal/utils.js +1 -1
  109. package/dist-cjs/number-input/internal/utils.js.map +1 -1
  110. package/dist-cjs/query-input/QueryInput.js +10 -10
  111. package/dist-cjs/query-input/QueryInput.js.map +1 -1
  112. package/dist-cjs/query-input/internal/QueryInputBody.js +1 -1
  113. package/dist-cjs/query-input/internal/QueryInputBody.js.map +1 -1
  114. package/dist-cjs/query-input/internal/SearchList.js +1 -1
  115. package/dist-cjs/query-input/internal/SearchList.js.map +1 -1
  116. package/dist-cjs/query-input/internal/usePopperStatus.js +2 -2
  117. package/dist-cjs/query-input/internal/usePopperStatus.js.map +1 -1
  118. package/dist-cjs/query-input/useQueryInput.js +6 -6
  119. package/dist-cjs/query-input/useQueryInput.js.map +1 -1
  120. package/dist-cjs/responsive/OverflowReducer.js +0 -2
  121. package/dist-cjs/responsive/OverflowReducer.js.map +1 -1
  122. package/dist-cjs/responsive/overflowUtils.js +6 -3
  123. package/dist-cjs/responsive/overflowUtils.js.map +1 -1
  124. package/dist-cjs/responsive/useDynamicCollapse.js +6 -3
  125. package/dist-cjs/responsive/useDynamicCollapse.js.map +1 -1
  126. package/dist-cjs/responsive/useOverflow.js +2 -2
  127. package/dist-cjs/responsive/useOverflow.js.map +1 -1
  128. package/dist-cjs/responsive/useOverflowCollectionItems.js +1 -1
  129. package/dist-cjs/responsive/useOverflowCollectionItems.js.map +1 -1
  130. package/dist-cjs/responsive/useOverflowLayout.js +1 -1
  131. package/dist-cjs/responsive/useOverflowLayout.js.map +1 -1
  132. package/dist-cjs/responsive/useReclaimSpace.js +1 -1
  133. package/dist-cjs/responsive/useReclaimSpace.js.map +1 -1
  134. package/dist-cjs/responsive/useResizeObserver.js +7 -2
  135. package/dist-cjs/responsive/useResizeObserver.js.map +1 -1
  136. package/dist-cjs/search-input/SearchInput.js.map +1 -1
  137. package/dist-cjs/table/TH.js +1 -1
  138. package/dist-cjs/table/TH.js.map +1 -1
  139. package/dist-cjs/table/TR.js +1 -1
  140. package/dist-cjs/table/TR.js.map +1 -1
  141. package/dist-cjs/tabs/TabActivationIndicator.css.js +1 -1
  142. package/dist-cjs/tabs/Tabs.js +0 -8
  143. package/dist-cjs/tabs/Tabs.js.map +1 -1
  144. package/dist-cjs/tabs/drag-drop/useDragSpacers.js +6 -7
  145. package/dist-cjs/tabs/drag-drop/useDragSpacers.js.map +1 -1
  146. package/dist-cjs/tabs/useActivationIndicator.js.map +1 -1
  147. package/dist-cjs/tabs-next/TabNextTrigger.js +2 -1
  148. package/dist-cjs/tabs-next/TabNextTrigger.js.map +1 -1
  149. package/dist-cjs/tabs-next/hooks/useOverflow.js +3 -5
  150. package/dist-cjs/tabs-next/hooks/useOverflow.js.map +1 -1
  151. package/dist-cjs/tokenized-input/useTokenizedInput.js +5 -5
  152. package/dist-cjs/tokenized-input/useTokenizedInput.js.map +1 -1
  153. package/dist-cjs/tokenized-input-next/TokenizedInputNext.css.js +1 -1
  154. package/dist-cjs/tree/Tree.js.map +1 -1
  155. package/dist-cjs/vertical-navigation/VerticalNavigation.css.js +1 -1
  156. package/dist-cjs/vertical-navigation/VerticalNavigation.js +4 -4
  157. package/dist-cjs/vertical-navigation/VerticalNavigation.js.map +1 -1
  158. package/dist-cjs/vertical-navigation/VerticalNavigationItem.js +1 -1
  159. package/dist-cjs/vertical-navigation/VerticalNavigationItem.js.map +1 -1
  160. package/dist-es/app-header/AppHeader.js +5 -1
  161. package/dist-es/app-header/AppHeader.js.map +1 -1
  162. package/dist-es/breadcrumbs/Breadcrumb.js.map +1 -1
  163. package/dist-es/breadcrumbs/Breadcrumbs.js +11 -2
  164. package/dist-es/breadcrumbs/Breadcrumbs.js.map +1 -1
  165. package/dist-es/breadcrumbs/internal/BreadcrumbsCollapsed.js +3 -6
  166. package/dist-es/breadcrumbs/internal/BreadcrumbsCollapsed.js.map +1 -1
  167. package/dist-es/button-bar/ButtonBar.js +1 -1
  168. package/dist-es/button-bar/ButtonBar.js.map +1 -1
  169. package/dist-es/button-bar/internal/DescendantContext.js.map +1 -1
  170. package/dist-es/calendar/useCalendarSelection.js +2 -2
  171. package/dist-es/calendar/useCalendarSelection.js.map +1 -1
  172. package/dist-es/cascading-menu/CascadingMenu.js +19 -13
  173. package/dist-es/cascading-menu/CascadingMenu.js.map +1 -1
  174. package/dist-es/cascading-menu/CascadingMenuItem.js +2 -4
  175. package/dist-es/cascading-menu/CascadingMenuItem.js.map +1 -1
  176. package/dist-es/cascading-menu/CascadingMenuList.js +1 -2
  177. package/dist-es/cascading-menu/CascadingMenuList.js.map +1 -1
  178. package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js +4 -1
  179. package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
  180. package/dist-es/cascading-menu/internal/useMouseHandlers.js +1 -1
  181. package/dist-es/cascading-menu/internal/useMouseHandlers.js.map +1 -1
  182. package/dist-es/cascading-menu/internal/useRefsManager.js +3 -1
  183. package/dist-es/cascading-menu/internal/useRefsManager.js.map +1 -1
  184. package/dist-es/collapsible/CollapsibleTrigger.js +1 -2
  185. package/dist-es/collapsible/CollapsibleTrigger.js.map +1 -1
  186. package/dist-es/color-chooser/AlphaInputField.js +1 -1
  187. package/dist-es/color-chooser/AlphaInputField.js.map +1 -1
  188. package/dist-es/color-chooser/ColorChooser.js.map +1 -1
  189. package/dist-es/color-chooser/DictTabs.js +1 -1
  190. package/dist-es/color-chooser/DictTabs.js.map +1 -1
  191. package/dist-es/color-chooser/RGBAInputField.js +2 -2
  192. package/dist-es/color-chooser/RGBAInputField.js.map +1 -1
  193. package/dist-es/combo-box/useCombobox.js.map +1 -1
  194. package/dist-es/combo-box-deprecated/ComboBoxDeprecated.js +1 -1
  195. package/dist-es/combo-box-deprecated/ComboBoxDeprecated.js.map +1 -1
  196. package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js +1 -2
  197. package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
  198. package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js +1 -5
  199. package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
  200. package/dist-es/combo-box-deprecated/internal/useComboBox.js +4 -1
  201. package/dist-es/combo-box-deprecated/internal/useComboBox.js.map +1 -1
  202. package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js +7 -2
  203. package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
  204. package/dist-es/common-hooks/useAutoSizer.js +0 -9
  205. package/dist-es/common-hooks/useAutoSizer.js.map +1 -1
  206. package/dist-es/common-hooks/useCollapsibleGroups.js +38 -50
  207. package/dist-es/common-hooks/useCollapsibleGroups.js.map +1 -1
  208. package/dist-es/common-hooks/useCollectionItems.js +6 -11
  209. package/dist-es/common-hooks/useCollectionItems.js.map +1 -1
  210. package/dist-es/common-hooks/useKeyboardNavigationPanel.js +8 -8
  211. package/dist-es/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
  212. package/dist-es/common-hooks/useSelection.js +1 -1
  213. package/dist-es/common-hooks/useSelection.js.map +1 -1
  214. package/dist-es/common-hooks/useTypeahead.js +2 -2
  215. package/dist-es/common-hooks/useTypeahead.js.map +1 -1
  216. package/dist-es/common-hooks/useViewportTracking.js +1 -1
  217. package/dist-es/common-hooks/useViewportTracking.js.map +1 -1
  218. package/dist-es/common-hooks/utils/collection-item-utils.js +1 -1
  219. package/dist-es/common-hooks/utils/collection-item-utils.js.map +1 -1
  220. package/dist-es/contact-details/ContactAction.js +1 -0
  221. package/dist-es/contact-details/ContactAction.js.map +1 -1
  222. package/dist-es/contact-details/ContactSecondaryInfo.js +1 -1
  223. package/dist-es/contact-details/ContactSecondaryInfo.js.map +1 -1
  224. package/dist-es/contact-details/internal/ContactDetailsContext.js +2 -2
  225. package/dist-es/contact-details/internal/ContactDetailsContext.js.map +1 -1
  226. package/dist-es/contact-details/internal/FavoriteToggleWithTooltip.js +10 -1
  227. package/dist-es/contact-details/internal/FavoriteToggleWithTooltip.js.map +1 -1
  228. package/dist-es/content-status/ContentStatus.js.map +1 -1
  229. package/dist-es/content-status/internal/StatusIndicator.js.map +1 -1
  230. package/dist-es/date-input/DateInput.css.js +1 -1
  231. package/dist-es/date-picker/useFocusOut.js +1 -1
  232. package/dist-es/date-picker/useFocusOut.js.map +1 -1
  233. package/dist-es/dropdown/DropdownButton.js.map +1 -1
  234. package/dist-es/dropdown/useDropdown.js.map +1 -1
  235. package/dist-es/input-legacy/InputLegacy.css.js +1 -1
  236. package/dist-es/list/List.js +2 -2
  237. package/dist-es/list/List.js.map +1 -1
  238. package/dist-es/list/ListItem.css.js +1 -1
  239. package/dist-es/list/ListItem.js +2 -1
  240. package/dist-es/list/ListItem.js.map +1 -1
  241. package/dist-es/list/keyset.js.map +1 -1
  242. package/dist-es/list/useList.js +1 -3
  243. package/dist-es/list/useList.js.map +1 -1
  244. package/dist-es/list/useListHeight.js +3 -3
  245. package/dist-es/list/useListHeight.js.map +1 -1
  246. package/dist-es/list-deprecated/List.js +4 -1
  247. package/dist-es/list-deprecated/List.js.map +1 -1
  248. package/dist-es/list-deprecated/ListBase.js +19 -18
  249. package/dist-es/list-deprecated/ListBase.js.map +1 -1
  250. package/dist-es/list-deprecated/ListItem.js.map +1 -1
  251. package/dist-es/list-deprecated/ListItemBase.js +1 -0
  252. package/dist-es/list-deprecated/ListItemBase.js.map +1 -1
  253. package/dist-es/list-deprecated/internal/helpers.js.map +1 -1
  254. package/dist-es/list-deprecated/internal/scrollIntoView.js +2 -2
  255. package/dist-es/list-deprecated/internal/scrollIntoView.js.map +1 -1
  256. package/dist-es/list-deprecated/internal/useListAutoSizer.js.map +1 -1
  257. package/dist-es/list-deprecated/itemToString.js.map +1 -1
  258. package/dist-es/list-deprecated/useList.js +3 -10
  259. package/dist-es/list-deprecated/useList.js.map +1 -1
  260. package/dist-es/list-deprecated/useListItem.js.map +1 -1
  261. package/dist-es/list-next/ListNext.js.map +1 -1
  262. package/dist-es/metric/MetricContent.js +1 -0
  263. package/dist-es/metric/MetricContent.js.map +1 -1
  264. package/dist-es/number-input/NumberInput.css.js +1 -1
  265. package/dist-es/number-input/internal/utils.js +1 -1
  266. package/dist-es/number-input/internal/utils.js.map +1 -1
  267. package/dist-es/query-input/QueryInput.js +10 -10
  268. package/dist-es/query-input/QueryInput.js.map +1 -1
  269. package/dist-es/query-input/internal/QueryInputBody.js +1 -1
  270. package/dist-es/query-input/internal/QueryInputBody.js.map +1 -1
  271. package/dist-es/query-input/internal/SearchList.js +1 -1
  272. package/dist-es/query-input/internal/SearchList.js.map +1 -1
  273. package/dist-es/query-input/internal/usePopperStatus.js +2 -2
  274. package/dist-es/query-input/internal/usePopperStatus.js.map +1 -1
  275. package/dist-es/query-input/useQueryInput.js +6 -6
  276. package/dist-es/query-input/useQueryInput.js.map +1 -1
  277. package/dist-es/responsive/OverflowReducer.js +0 -2
  278. package/dist-es/responsive/OverflowReducer.js.map +1 -1
  279. package/dist-es/responsive/overflowUtils.js +6 -3
  280. package/dist-es/responsive/overflowUtils.js.map +1 -1
  281. package/dist-es/responsive/useDynamicCollapse.js +6 -3
  282. package/dist-es/responsive/useDynamicCollapse.js.map +1 -1
  283. package/dist-es/responsive/useOverflow.js +2 -2
  284. package/dist-es/responsive/useOverflow.js.map +1 -1
  285. package/dist-es/responsive/useOverflowCollectionItems.js +1 -1
  286. package/dist-es/responsive/useOverflowCollectionItems.js.map +1 -1
  287. package/dist-es/responsive/useOverflowLayout.js +1 -1
  288. package/dist-es/responsive/useOverflowLayout.js.map +1 -1
  289. package/dist-es/responsive/useReclaimSpace.js +1 -1
  290. package/dist-es/responsive/useReclaimSpace.js.map +1 -1
  291. package/dist-es/responsive/useResizeObserver.js +7 -2
  292. package/dist-es/responsive/useResizeObserver.js.map +1 -1
  293. package/dist-es/search-input/SearchInput.js.map +1 -1
  294. package/dist-es/table/TH.js +1 -1
  295. package/dist-es/table/TH.js.map +1 -1
  296. package/dist-es/table/TR.js +1 -1
  297. package/dist-es/table/TR.js.map +1 -1
  298. package/dist-es/tabs/TabActivationIndicator.css.js +1 -1
  299. package/dist-es/tabs/Tabs.js +1 -9
  300. package/dist-es/tabs/Tabs.js.map +1 -1
  301. package/dist-es/tabs/drag-drop/useDragSpacers.js +6 -7
  302. package/dist-es/tabs/drag-drop/useDragSpacers.js.map +1 -1
  303. package/dist-es/tabs/useActivationIndicator.js.map +1 -1
  304. package/dist-es/tabs-next/TabNextTrigger.js +2 -1
  305. package/dist-es/tabs-next/TabNextTrigger.js.map +1 -1
  306. package/dist-es/tabs-next/hooks/useOverflow.js +4 -6
  307. package/dist-es/tabs-next/hooks/useOverflow.js.map +1 -1
  308. package/dist-es/tokenized-input/useTokenizedInput.js +5 -5
  309. package/dist-es/tokenized-input/useTokenizedInput.js.map +1 -1
  310. package/dist-es/tokenized-input-next/TokenizedInputNext.css.js +1 -1
  311. package/dist-es/tree/Tree.js.map +1 -1
  312. package/dist-es/vertical-navigation/VerticalNavigation.css.js +1 -1
  313. package/dist-es/vertical-navigation/VerticalNavigation.js +4 -4
  314. package/dist-es/vertical-navigation/VerticalNavigation.js.map +1 -1
  315. package/dist-es/vertical-navigation/VerticalNavigationItem.js +1 -1
  316. package/dist-es/vertical-navigation/VerticalNavigationItem.js.map +1 -1
  317. package/dist-types/breadcrumbs/Breadcrumb.d.ts +2 -2
  318. package/dist-types/breadcrumbs/Breadcrumbs.d.ts +2 -2
  319. package/dist-types/cascading-menu/CascadingMenuList.d.ts +3 -1
  320. package/dist-types/cascading-menu/CascadingMenuProps.d.ts +1 -1
  321. package/dist-types/cascading-menu/internal/useMenuTriggerHandlers.d.ts +3 -2
  322. package/dist-types/collapsible/CollapsibleTrigger.d.ts +1 -1
  323. package/dist-types/combo-box-deprecated/internal/useComboBox.d.ts +5 -5
  324. package/dist-types/combo-box-deprecated/internal/useMultiSelectComboBox.d.ts +7 -7
  325. package/dist-types/common-hooks/useAutoSizer.d.ts +1 -1
  326. package/dist-types/common-hooks/useCollapsibleGroups.d.ts +2 -2
  327. package/dist-types/common-hooks/useCollectionItems.d.ts +1 -1
  328. package/dist-types/common-hooks/useSelection.d.ts +1 -1
  329. package/dist-types/content-status/ContentStatus.d.ts +1 -1
  330. package/dist-types/dropdown/DropdownButton.d.ts +1 -1
  331. package/dist-types/dropdown/dropdownTypes.d.ts +2 -2
  332. package/dist-types/dropdown/useDropdown.d.ts +1 -1
  333. package/dist-types/list/useListHeight.d.ts +1 -1
  334. package/dist-types/list-deprecated/ListBase.d.ts +4 -8
  335. package/dist-types/list-deprecated/ListProps.d.ts +7 -6
  336. package/dist-types/list-deprecated/internal/helpers.d.ts +3 -2
  337. package/dist-types/list-deprecated/internal/useListAutoSizer.d.ts +2 -7
  338. package/dist-types/list-deprecated/itemToString.d.ts +2 -2
  339. package/dist-types/list-deprecated/useList.d.ts +1 -1
  340. package/dist-types/metric/internal/helpers.d.ts +1 -1
  341. package/dist-types/query-input/internal/usePopperStatus.d.ts +3 -3
  342. package/dist-types/responsive/overflowTypes.d.ts +1 -1
  343. package/dist-types/responsive/overflowUtils.d.ts +1 -1
  344. package/dist-types/responsive/useReclaimSpace.d.ts +1 -1
  345. package/dist-types/search-input/SearchInput.d.ts +1 -1
  346. package/dist-types/vertical-navigation/VerticalNavigation.d.ts +2 -2
  347. package/package.json +3 -6
@@ -1 +1 @@
1
- {"version":3,"file":"useCalendarSelection.js","sources":["../src/calendar/useCalendarSelection.ts"],"sourcesContent":["import { makePrefixer, useControlled } from \"@salt-ds/core\";\nimport type {\n DateFrameworkType,\n SaltDateAdapter,\n Timezone,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport type {\n KeyboardEventHandler,\n MouseEventHandler,\n SyntheticEvent,\n} from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport { generateDatesForMonth } from \"./internal/utils\";\n\n/**\n * Type representing a single date selection.\n * @template TDate - The type of the date object.\n */\nexport type SingleDateSelection<TDate extends DateFrameworkType> = TDate;\n\n/**\n * Type representing a date range selection.\n * @template TDate - The type of the date object.\n */\nexport type DateRangeSelection<TDate extends DateFrameworkType> = {\n /**\n * The start date of the range.\n */\n startDate?: TDate | null;\n /**\n * The end date of the range.\n */\n endDate?: TDate | null;\n};\n\n/**\n * Checks if a value is a date range selection.\n * @template TDate - The type of the date object.\n * @param value - The value to check.\n * @returns `true` if the value is a date range selection, otherwise `false`.\n */\nexport function isDateRangeSelection<TDate extends DateFrameworkType>(\n // biome-ignore lint/suspicious/noExplicitAny: date framework dependent\n value: any,\n): value is DateRangeSelection<TDate> {\n return (\n value &&\n !Array.isArray(value) &&\n typeof value === \"object\" &&\n (\"startDate\" in value || \"endDate\" in value)\n );\n}\n\n/**\n * Base properties for calendar UseCalendarSelection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionBaseProps<\n TDate extends DateFrameworkType,\n> {\n /**\n * The currently focused date in the calendar, or null if no date is focused.\n */\n focusedDate?: TDate | null;\n /**\n * The currently hovered date.\n */\n hoveredDate?: TDate | null;\n /**\n * Determines if a date is outside the allowed date range.\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 * Function to determine if a day is selectable.\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 * Function to determine if a day is visible.\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 * Ref to attach to the focused element, enabling focus to be controlled.\n */\n focusedDateRef?: React.MutableRefObject<HTMLElement | null>;\n /**\n * Callback fired when the focused date changes.\n * @param event - The synthetic event, if user event triggered focus or null.\n * @param date - The new focused date.\n */\n onFocusedDateChange?: (\n event: SyntheticEvent | null,\n date: TDate | null,\n ) => void;\n /**\n * Callback fired when the hovered date changes.\n * @param event - The synthetic event.\n * @param hoveredDate - The new hovered date.\n */\n onHoveredDateChange?: (\n event: SyntheticEvent,\n hoveredDate: TDate | null,\n ) => void;\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 * The currently visible month.\n */\n visibleMonth?: TDate;\n /**\n * If `true`, the calendar will be multiselect.\n */\n multiselect?: boolean;\n}\n\n/**\n * Properties for the single date selection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionSingleProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n /**\n * The currently selected date.\n */\n selectedDate?: SingleDateSelection<TDate> | null;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: SingleDateSelection<TDate> | null;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: SingleDateSelection<TDate> | null,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: SingleDateSelection<TDate> | null,\n newDate: SingleDateSelection<TDate> | null,\n ) => SingleDateSelection<TDate> | null;\n}\n/**\n * Properties for the single date selection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectSingleProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<SingleDateSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<SingleDateSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<SingleDateSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n @param newDate\n */\n select?: (\n previousSelectedDate: Array<SingleDateSelection<TDate>>,\n newDate: TDate,\n ) => Array<SingleDateSelection<TDate>>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for single date range selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionRangeProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n /**\n * The currently selected date.\n */\n selectedDate?: DateRangeSelection<TDate>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: DateRangeSelection<TDate>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: DateRangeSelection<TDate>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: DateRangeSelection<TDate>,\n newDate: TDate,\n ) => DateRangeSelection<TDate>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for multiselect date range selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectRangeProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<DateRangeSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: Array<DateRangeSelection<TDate>>,\n newDate: TDate,\n ) => Array<DateRangeSelection<TDate>>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for single offset selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionOffsetProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n /**\n * The currently selected date.\n */\n selectedDate?: DateRangeSelection<TDate>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: DateRangeSelection<TDate>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: DateRangeSelection<TDate>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: DateRangeSelection<TDate>,\n newDate: TDate,\n ) => DateRangeSelection<TDate>;\n /**\n * Function to calculate the start date offset.\n * @param date - The date to offset.\n * @returns The offset start date.\n */\n startDateOffset?: (date: TDate) => TDate;\n /**\n * Function to calculate the end date offset.\n * @param date - The date to offset.\n * @returns The offset end date.\n */\n endDateOffset?: (date: TDate) => TDate;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for multiselect offset selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectOffsetProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<DateRangeSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDat\n * @param newDate\n */\n select?: (\n previousSelectedDate: Array<DateRangeSelection<TDate>>,\n newDate: TDate,\n ) => Array<DateRangeSelection<TDate>>;\n /**\n * Function to calculate the start date offset.\n * @param date - The date to offset.\n * @returns The offset start date.\n */\n startDateOffset?: (date: TDate) => TDate;\n /**\n * Function to calculate the end date offset.\n * @param date - The date to offset.\n * @returns The offset end date.\n */\n endDateOffset?: (date: TDate) => TDate;\n}\n\n/**\n * UseCalendarSelection 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 UseCalendarSelectionProps<TDate extends DateFrameworkType> =\n | UseCalendarSelectionSingleProps<TDate>\n | UseCalendarSelectionMultiselectSingleProps<TDate>\n | UseCalendarSelectionRangeProps<TDate>\n | UseCalendarSelectionMultiselectRangeProps<TDate>\n | UseCalendarSelectionOffsetProps<TDate>\n | UseCalendarSelectionMultiselectOffsetProps<TDate>;\n\nfunction isMultiselect<TDate>(\n props: UseCalendarSelectionProps<TDate>,\n): props is\n | UseCalendarSelectionMultiselectSingleProps<TDate>\n | UseCalendarSelectionMultiselectRangeProps<TDate>\n | UseCalendarSelectionMultiselectOffsetProps<TDate> {\n return props.multiselect === true;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nfunction selectDateRange<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n previousSelectedDate: DateRangeSelection<DateFrameworkType>,\n newDate: DateFrameworkType,\n) {\n if (previousSelectedDate?.startDate && previousSelectedDate?.endDate) {\n return {\n startDate: newDate,\n };\n }\n if (\n previousSelectedDate?.startDate &&\n dateAdapter.compare(newDate, previousSelectedDate?.startDate) >= 0\n ) {\n return {\n ...previousSelectedDate,\n endDate: newDate,\n };\n }\n return {\n startDate: newDate,\n };\n}\n\nfunction selectMultiselectDateRange<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n previousSelectedDate: DateRangeSelection<TDate>[],\n newDate: TDate,\n): DateRangeSelection<TDate>[] {\n const lastRange = previousSelectedDate.length\n ? previousSelectedDate[previousSelectedDate.length - 1]\n : undefined;\n const isIncompleteRange = !lastRange?.endDate;\n\n if (isIncompleteRange) {\n const isNewSelection = previousSelectedDate.length === 0;\n if (isNewSelection) {\n return [{ startDate: newDate }];\n }\n const completeDateRange = selectDateRange(\n dateAdapter,\n previousSelectedDate[previousSelectedDate.length - 1],\n newDate,\n );\n return [...previousSelectedDate.slice(0, -1), completeDateRange];\n }\n return [...previousSelectedDate, { startDate: newDate }];\n}\n\nexport function useCalendarSelection<TDate extends DateFrameworkType>(\n props: UseCalendarSelectionProps<TDate>,\n) {\n const {\n multiselect,\n focusedDate: focusedDateProp,\n hoveredDate: hoveredDateProp,\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n onSelectionChange,\n onHoveredDateChange,\n isDaySelectable = () => true,\n isDayVisible = () => true,\n isOutsideAllowedDates = () => true,\n focusedDateRef,\n onFocusedDateChange,\n select: selectProp,\n selectionVariant,\n timezone,\n visibleMonth,\n // startDateOffset,\n // endDateOffset,\n } = props;\n const { dateAdapter } = useLocalization<TDate>();\n const [selectedDate, setSelectedDateState] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"Calendar\",\n state: \"selectedDate\",\n });\n\n const startDateOffset =\n selectionVariant === \"offset\" ? props.startDateOffset : undefined;\n const endDateOffset =\n selectionVariant === \"offset\" ? props.endDateOffset : undefined;\n\n const getStartDateOffset = useCallback(\n (date: TDate) => {\n if (selectionVariant === \"offset\" && startDateOffset) {\n return startDateOffset(date);\n }\n return date;\n },\n [selectionVariant, startDateOffset],\n );\n\n const getEndDateOffset = useCallback(\n (date: TDate) => {\n if (selectionVariant === \"offset\" && endDateOffset) {\n return endDateOffset(date);\n }\n return date;\n },\n [selectionVariant, endDateOffset],\n );\n\n const setSelectedDate = useCallback(\n (event: SyntheticEvent<HTMLButtonElement>, newSelectedDate: TDate) => {\n if (!isDaySelectable || isDaySelectable(newSelectedDate)) {\n const handleSelectionChange = <\n U extends\n | (TDate | null)\n | TDate[]\n | (DateRangeSelection<TDate> | null)\n | DateRangeSelection<TDate>[],\n >(\n updatedSelection: U,\n changeHandler:\n | ((event: SyntheticEvent, updatedSelection: U) => void)\n | undefined,\n ) => {\n changeHandler?.(event, updatedSelection);\n setSelectedDateState(updatedSelection);\n };\n\n switch (selectionVariant) {\n case \"single\": {\n if (isMultiselect(props)) {\n const multipleSingleSelectedDate = selectedDate as Array<\n SingleDateSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectSingleProps<TDate>[\"select\"];\n const updatedSelection: Array<SingleDateSelection<TDate>> = select\n ? select(multipleSingleSelectedDate ?? [], newSelectedDate)\n : [...(multipleSingleSelectedDate ?? []), newSelectedDate];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectSingleProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const singleSelectedDate =\n selectedDate as SingleDateSelection<TDate> | null;\n const select =\n selectProp as UseCalendarSelectionSingleProps<TDate>[\"select\"];\n const updatedSelection: SingleDateSelection<TDate> | null = select\n ? select(singleSelectedDate, newSelectedDate)\n : newSelectedDate;\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionSingleProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"range\": {\n if (isMultiselect(props)) {\n const multipleRangeSelectedDate = selectedDate as Array<\n DateRangeSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectRangeProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate>[] = select\n ? select(multipleRangeSelectedDate ?? [], newSelectedDate)\n : selectMultiselectDateRange(\n dateAdapter,\n multipleRangeSelectedDate ?? [],\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectRangeProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const rangeSelectedDate =\n selectedDate as DateRangeSelection<TDate>;\n const select =\n selectProp as UseCalendarSelectionRangeProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate> = select\n ? select(rangeSelectedDate, newSelectedDate)\n : selectDateRange(\n dateAdapter,\n rangeSelectedDate,\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionRangeProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"offset\": {\n if (isMultiselect(props)) {\n const multipleOffsetSelectedDate = selectedDate as Array<\n DateRangeSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectOffsetProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate>[] = select\n ? select(multipleOffsetSelectedDate ?? [], newSelectedDate)\n : [\n ...(multipleOffsetSelectedDate ?? []),\n {\n startDate: getStartDateOffset(newSelectedDate),\n endDate: getEndDateOffset(newSelectedDate),\n },\n ];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectOffsetProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const offsetSelectedDate =\n selectedDate as DateRangeSelection<TDate>;\n const select =\n selectProp as UseCalendarSelectionOffsetProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate> = select\n ? select(offsetSelectedDate, newSelectedDate)\n : {\n startDate: getStartDateOffset(newSelectedDate),\n endDate: getEndDateOffset(newSelectedDate),\n };\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionOffsetProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n }\n }\n },\n [\n dateAdapter,\n getEndDateOffset,\n getStartDateOffset,\n isDaySelectable,\n selectProp,\n selectedDate,\n selectionVariant,\n onSelectionChange,\n props, // Ensure props is included in the dependency array\n ],\n );\n\n const isSelected = useCallback(\n (date: TDate) => {\n if (!selectedDate) {\n return false;\n }\n\n const isSingleDateSelected = (element: SingleDateSelection<TDate>) =>\n dateAdapter.isSame(element, date, \"day\");\n\n const isDateRangeSelected = (range: DateRangeSelection<TDate>) =>\n range.startDate &&\n range.endDate &&\n dateAdapter.compare(date, range.startDate) >= 0 &&\n dateAdapter.compare(date, range.endDate) <= 0;\n\n if (Array.isArray(selectedDate)) {\n return selectedDate.some((element) =>\n isDateRangeSelection(element)\n ? isDateRangeSelected(element)\n : isSingleDateSelected(element as SingleDateSelection<TDate>),\n );\n }\n\n switch (selectionVariant) {\n case \"single\":\n return isSingleDateSelected(\n selectedDate as SingleDateSelection<TDate>,\n );\n case \"range\":\n case \"offset\":\n return isDateRangeSelected(selectedDate as DateRangeSelection<TDate>);\n default:\n return false;\n }\n },\n [dateAdapter, selectedDate, selectionVariant],\n );\n\n const getDefaultFocusedDate = () => {\n if (\n selectedDate &&\n (selectionVariant === \"range\" || selectionVariant === \"offset\")\n ) {\n const getFocusableDate = (\n result: TDate[],\n selection: DateRangeSelection<TDate>,\n ) => {\n if (selection?.startDate && isDayVisible(selection.startDate)) {\n return [...result, selection.startDate];\n }\n if (selection?.endDate && isDayVisible(selection.endDate)) {\n return [...result, selection.endDate];\n }\n return result;\n };\n let focusableSelectedDates:\n | DateRangeSelection<TDate>\n | DateRangeSelection<TDate>[];\n if (!multiselect) {\n focusableSelectedDates = [selectedDate as DateRangeSelection<TDate>];\n } else {\n focusableSelectedDates = selectedDate as DateRangeSelection<TDate>[];\n }\n const selectionInMonth = focusableSelectedDates\n .reduce(getFocusableDate, [])\n .sort((a, b) => dateAdapter.compare(a, b));\n if (selectionInMonth.length > 0) {\n return selectionInMonth[0];\n }\n } else if (selectedDate && selectionVariant === \"single\") {\n const focusableSelectedDate = multiselect\n ? (selectedDate as SingleDateSelection<TDate>[])?.[0]\n : (selectedDate as SingleDateSelection<TDate>);\n if (focusableSelectedDate && isDayVisible(focusableSelectedDate)) {\n return focusableSelectedDate;\n }\n }\n\n // Defaults\n if (\n isDaySelectable?.(dateAdapter.today(timezone)) &&\n isDayVisible(dateAdapter.today(timezone))\n ) {\n return dateAdapter.today(timezone);\n }\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n visibleMonth,\n ).find((visibleDay) => visibleDay && isDaySelectable?.(visibleDay));\n if (firstSelectableDate) {\n return firstSelectableDate;\n }\n return null;\n };\n\n const [focusedDate, setFocusedDateState] = useControlled({\n controlled: focusedDateProp,\n default: useMemo(getDefaultFocusedDate, []),\n name: \"Calendar\",\n state: \"focusedDate\",\n });\n\n const setFocusedDate = useCallback(\n (event: SyntheticEvent | null, date: TDate | null) => {\n if (focusedDateRef && event?.target instanceof HTMLElement) {\n focusedDateRef.current = event.target;\n }\n if (\n date &&\n ((focusedDate && dateAdapter.isSame(date, focusedDate, \"day\")) ||\n isOutsideAllowedDates(date))\n ) {\n return;\n }\n setFocusedDateState(date);\n onFocusedDateChange?.(event, date);\n },\n [\n dateAdapter,\n focusedDate,\n focusedDateRef,\n isOutsideAllowedDates,\n onFocusedDateChange,\n ],\n );\n\n const [hoveredDate, setHoveredDateState] = useControlled({\n controlled: hoveredDateProp,\n default: undefined,\n name: \"Calendar\",\n state: \"hoveredDate\",\n });\n\n const setHoveredDate = useCallback(\n (event: SyntheticEvent, date: TDate | null) => {\n setHoveredDateState(date);\n onHoveredDateChange?.(event, date);\n },\n [onHoveredDateChange],\n );\n\n const isHovered = useCallback(\n (date: TDate) => {\n return !!hoveredDate && dateAdapter.isSame(date, hoveredDate, \"day\");\n },\n [dateAdapter, hoveredDate],\n );\n\n const getFocusableDates = useCallback(() => {\n const focusableDates: TDate[] = [];\n\n if (Array.isArray(selectedDate)) {\n // Handle array of selections\n selectedDate.forEach((selection) => {\n if (isDateRangeSelection(selection)) {\n if (selection.startDate && isDayVisible(selection.startDate)) {\n focusableDates.push(selection.startDate);\n } else if (selection.endDate && isDayVisible(selection.endDate)) {\n focusableDates.push(selection.endDate);\n }\n } else if (isDayVisible(selection as TDate)) {\n focusableDates.push(selection as TDate);\n }\n });\n } else if (selectedDate) {\n // Handle single selection\n if (isDateRangeSelection(selectedDate)) {\n if (selectedDate.startDate && isDayVisible(selectedDate.startDate)) {\n focusableDates.push(selectedDate.startDate);\n } else if (selectedDate.endDate && isDayVisible(selectedDate.endDate)) {\n focusableDates.push(selectedDate.endDate);\n }\n } else if (isDayVisible(selectedDate)) {\n focusableDates.push(selectedDate);\n }\n }\n\n if (\n focusedDate &&\n visibleMonth &&\n dateAdapter.isSame(focusedDate, visibleMonth, \"month\")\n ) {\n focusableDates.push(focusedDate);\n return focusableDates;\n }\n\n // Defaults\n if (\n focusableDates.length === 0 &&\n isDaySelectable(dateAdapter.today(timezone)) &&\n isDayVisible(dateAdapter.today(timezone))\n ) {\n focusableDates.push(dateAdapter.today(timezone));\n }\n if (focusableDates.length === 0 || !focusableDates.some(isDayVisible)) {\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n visibleMonth,\n ).find((visibleDay) => visibleDay && isDaySelectable(visibleDay));\n if (firstSelectableDate) {\n focusableDates.push(firstSelectableDate);\n }\n }\n\n return focusableDates;\n }, [\n dateAdapter,\n focusedDate,\n isDaySelectable,\n isDayVisible,\n selectedDate,\n timezone,\n visibleMonth,\n ]);\n\n const isSelectedSpan = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.startDate) &&\n !isOutsideAllowedDates(range.endDate)\n ) {\n return (\n dateAdapter.compare(date, range.startDate) > 0 &&\n dateAdapter.compare(date, range.endDate) < 0\n );\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isHoveredSpan = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n !dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.startDate) &&\n hoveredDate\n ) {\n const isForwardRange =\n dateAdapter.compare(hoveredDate, range.startDate) >= 0 &&\n ((dateAdapter.compare(date, range.startDate) >= 0 &&\n dateAdapter.compare(date, hoveredDate) <= 0) ||\n dateAdapter.isSame(date, hoveredDate, \"day\"));\n\n const isValidDayHovered =\n !isDaySelectable || isDaySelectable(hoveredDate);\n\n return isForwardRange && isValidDayHovered;\n }\n return false;\n });\n },\n [\n dateAdapter,\n isOutsideAllowedDates,\n selectionVariant,\n selectedDate,\n hoveredDate,\n isDaySelectable,\n ],\n );\n\n const isSelectedStart = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n !isOutsideAllowedDates(range.startDate)\n ) {\n return dateAdapter.isSame(range.startDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isSelectedEnd = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.endDate)\n ) {\n return dateAdapter.isSame(range.endDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isHoveredOffset = useCallback(\n (date: TDate) => {\n if (hoveredDate && selectionVariant === \"offset\") {\n const startDate = getStartDateOffset(hoveredDate);\n const endDate = getEndDateOffset(hoveredDate);\n\n return (\n dateAdapter.compare(date, startDate) >= 0 &&\n dateAdapter.compare(date, endDate) <= 0 &&\n (!isDaySelectable || isDaySelectable(date))\n );\n }\n\n return false;\n },\n [\n dateAdapter,\n getStartDateOffset,\n getEndDateOffset,\n hoveredDate,\n isDaySelectable,\n selectionVariant,\n ],\n );\n\n return useMemo(\n () => ({\n state: {\n focusedDate,\n focusedDateRef,\n hoveredDate,\n selectedDate,\n focusableDates: getFocusableDates(),\n },\n helpers: {\n isSelected,\n setSelectedDate,\n isHovered,\n setHoveredDate,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHoveredOffset,\n isDaySelectable,\n setFocusedDate,\n },\n }),\n [\n selectedDate,\n focusedDate,\n focusedDateRef,\n getFocusableDates,\n hoveredDate,\n isSelected,\n isHovered,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHoveredOffset,\n isDaySelectable,\n setFocusedDate,\n setHoveredDate,\n setSelectedDate,\n ],\n );\n}\n\nexport function useCalendarSelectionDay<TDate extends DateFrameworkType>({\n date,\n}: {\n date: TDate;\n}) {\n const {\n helpers: {\n setSelectedDate,\n isSelected,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHovered,\n isHoveredOffset,\n isDaySelectable,\n },\n } = useCalendarContext<TDate>();\n\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n setSelectedDate(event, date);\n },\n [date, setSelectedDate],\n );\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n switch (event.key) {\n case \"Space\":\n case \"Enter\":\n setSelectedDate(event, date);\n event.preventDefault();\n }\n },\n [date, setSelectedDate],\n );\n\n const selected = isSelected(date);\n const selectedSpan = isSelectedSpan(date);\n const hoveredSpan = isHoveredSpan(date);\n const selectedStart = isSelectedStart(date);\n const selectedEnd = isSelectedEnd(date);\n const hovered = isHovered(date);\n const hoveredOffset = isHoveredOffset(date);\n\n return {\n handleClick,\n handleKeyDown,\n status: {\n selected,\n selectedSpan,\n hoveredSpan,\n selectedStart,\n selectedEnd,\n hovered,\n hoveredOffset,\n },\n dayProps: {\n className: clsx({\n [withBaseName(\"selected\")]: selected,\n [withBaseName(\"selectedSpan\")]: selectedSpan,\n [withBaseName(\"hoveredSpan\")]: hoveredSpan,\n [withBaseName(\"selectedStart\")]: selectedStart,\n [withBaseName(\"selectedEnd\")]: selectedEnd,\n [withBaseName(\"hovered\")]: hovered,\n [withBaseName(\"hoveredOffset\")]: hoveredOffset,\n }),\n \"aria-pressed\":\n selected || selectedEnd || selectedStart || selectedSpan\n ? \"true\"\n : undefined,\n \"aria-disabled\":\n isDaySelectable && !isDaySelectable(date) ? \"true\" : undefined,\n },\n };\n}\n"],"names":["makePrefixer","useLocalization","useControlled","useCallback","generateDatesForMonth","useMemo","useCalendarContext","clsx"],"mappings":"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"}
1
+ {"version":3,"file":"useCalendarSelection.js","sources":["../src/calendar/useCalendarSelection.ts"],"sourcesContent":["import { makePrefixer, useControlled } from \"@salt-ds/core\";\nimport type {\n DateFrameworkType,\n SaltDateAdapter,\n Timezone,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport type {\n KeyboardEventHandler,\n MouseEventHandler,\n SyntheticEvent,\n} from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport { generateDatesForMonth } from \"./internal/utils\";\n\n/**\n * Type representing a single date selection.\n * @template TDate - The type of the date object.\n */\nexport type SingleDateSelection<TDate extends DateFrameworkType> = TDate;\n\n/**\n * Type representing a date range selection.\n * @template TDate - The type of the date object.\n */\nexport type DateRangeSelection<TDate extends DateFrameworkType> = {\n /**\n * The start date of the range.\n */\n startDate?: TDate | null;\n /**\n * The end date of the range.\n */\n endDate?: TDate | null;\n};\n\n/**\n * Checks if a value is a date range selection.\n * @template TDate - The type of the date object.\n * @param value - The value to check.\n * @returns `true` if the value is a date range selection, otherwise `false`.\n */\nexport function isDateRangeSelection<TDate extends DateFrameworkType>(\n // biome-ignore lint/suspicious/noExplicitAny: date framework dependent\n value: any,\n): value is DateRangeSelection<TDate> {\n return (\n value &&\n !Array.isArray(value) &&\n typeof value === \"object\" &&\n (\"startDate\" in value || \"endDate\" in value)\n );\n}\n\n/**\n * Base properties for calendar UseCalendarSelection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionBaseProps<\n TDate extends DateFrameworkType,\n> {\n /**\n * The currently focused date in the calendar, or null if no date is focused.\n */\n focusedDate?: TDate | null;\n /**\n * The currently hovered date.\n */\n hoveredDate?: TDate | null;\n /**\n * Determines if a date is outside the allowed date range.\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 * Function to determine if a day is selectable.\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 * Function to determine if a day is visible.\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 * Ref to attach to the focused element, enabling focus to be controlled.\n */\n focusedDateRef?: React.MutableRefObject<HTMLElement | null>;\n /**\n * Callback fired when the focused date changes.\n * @param event - The synthetic event, if user event triggered focus or null.\n * @param date - The new focused date.\n */\n onFocusedDateChange?: (\n event: SyntheticEvent | null,\n date: TDate | null,\n ) => void;\n /**\n * Callback fired when the hovered date changes.\n * @param event - The synthetic event.\n * @param hoveredDate - The new hovered date.\n */\n onHoveredDateChange?: (\n event: SyntheticEvent,\n hoveredDate: TDate | null,\n ) => void;\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 * The currently visible month.\n */\n visibleMonth?: TDate;\n /**\n * If `true`, the calendar will be multiselect.\n */\n multiselect?: boolean;\n}\n\n/**\n * Properties for the single date selection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionSingleProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n /**\n * The currently selected date.\n */\n selectedDate?: SingleDateSelection<TDate> | null;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: SingleDateSelection<TDate> | null;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: SingleDateSelection<TDate> | null,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: SingleDateSelection<TDate> | null,\n newDate: SingleDateSelection<TDate> | null,\n ) => SingleDateSelection<TDate> | null;\n}\n/**\n * Properties for the single date selection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectSingleProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<SingleDateSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<SingleDateSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<SingleDateSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n @param newDate\n */\n select?: (\n previousSelectedDate: Array<SingleDateSelection<TDate>>,\n newDate: TDate,\n ) => Array<SingleDateSelection<TDate>>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for single date range selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionRangeProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n /**\n * The currently selected date.\n */\n selectedDate?: DateRangeSelection<TDate>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: DateRangeSelection<TDate>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: DateRangeSelection<TDate>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: DateRangeSelection<TDate>,\n newDate: TDate,\n ) => DateRangeSelection<TDate>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for multiselect date range selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectRangeProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<DateRangeSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: Array<DateRangeSelection<TDate>>,\n newDate: TDate,\n ) => Array<DateRangeSelection<TDate>>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for single offset selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionOffsetProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n /**\n * The currently selected date.\n */\n selectedDate?: DateRangeSelection<TDate>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: DateRangeSelection<TDate>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: DateRangeSelection<TDate>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: DateRangeSelection<TDate>,\n newDate: TDate,\n ) => DateRangeSelection<TDate>;\n /**\n * Function to calculate the start date offset.\n * @param date - The date to offset.\n * @returns The offset start date.\n */\n startDateOffset?: (date: TDate) => TDate;\n /**\n * Function to calculate the end date offset.\n * @param date - The date to offset.\n * @returns The offset end date.\n */\n endDateOffset?: (date: TDate) => TDate;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for multiselect offset selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectOffsetProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<DateRangeSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDat\n * @param newDate\n */\n select?: (\n previousSelectedDate: Array<DateRangeSelection<TDate>>,\n newDate: TDate,\n ) => Array<DateRangeSelection<TDate>>;\n /**\n * Function to calculate the start date offset.\n * @param date - The date to offset.\n * @returns The offset start date.\n */\n startDateOffset?: (date: TDate) => TDate;\n /**\n * Function to calculate the end date offset.\n * @param date - The date to offset.\n * @returns The offset end date.\n */\n endDateOffset?: (date: TDate) => TDate;\n}\n\n/**\n * UseCalendarSelection 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 UseCalendarSelectionProps<TDate extends DateFrameworkType> =\n | UseCalendarSelectionSingleProps<TDate>\n | UseCalendarSelectionMultiselectSingleProps<TDate>\n | UseCalendarSelectionRangeProps<TDate>\n | UseCalendarSelectionMultiselectRangeProps<TDate>\n | UseCalendarSelectionOffsetProps<TDate>\n | UseCalendarSelectionMultiselectOffsetProps<TDate>;\n\nfunction isMultiselect<TDate>(\n props: UseCalendarSelectionProps<TDate>,\n): props is\n | UseCalendarSelectionMultiselectSingleProps<TDate>\n | UseCalendarSelectionMultiselectRangeProps<TDate>\n | UseCalendarSelectionMultiselectOffsetProps<TDate> {\n return props.multiselect === true;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nfunction selectDateRange<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n previousSelectedDate: DateRangeSelection<DateFrameworkType>,\n newDate: DateFrameworkType,\n) {\n if (previousSelectedDate?.startDate && previousSelectedDate?.endDate) {\n return {\n startDate: newDate,\n };\n }\n if (\n previousSelectedDate?.startDate &&\n dateAdapter.compare(newDate, previousSelectedDate?.startDate) >= 0\n ) {\n return {\n ...previousSelectedDate,\n endDate: newDate,\n };\n }\n return {\n startDate: newDate,\n };\n}\n\nfunction selectMultiselectDateRange<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n previousSelectedDate: DateRangeSelection<TDate>[],\n newDate: TDate,\n): DateRangeSelection<TDate>[] {\n const lastRange = previousSelectedDate.length\n ? previousSelectedDate[previousSelectedDate.length - 1]\n : undefined;\n const isIncompleteRange = !lastRange?.endDate;\n\n if (isIncompleteRange) {\n const isNewSelection = previousSelectedDate.length === 0;\n if (isNewSelection) {\n return [{ startDate: newDate }];\n }\n const completeDateRange = selectDateRange(\n dateAdapter,\n previousSelectedDate[previousSelectedDate.length - 1],\n newDate,\n );\n return [...previousSelectedDate.slice(0, -1), completeDateRange];\n }\n return [...previousSelectedDate, { startDate: newDate }];\n}\n\nexport function useCalendarSelection<TDate extends DateFrameworkType>(\n props: UseCalendarSelectionProps<TDate>,\n) {\n const {\n multiselect,\n focusedDate: focusedDateProp,\n hoveredDate: hoveredDateProp,\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n onSelectionChange,\n onHoveredDateChange,\n isDaySelectable = () => true,\n isDayVisible = () => true,\n isOutsideAllowedDates = () => true,\n focusedDateRef,\n onFocusedDateChange,\n select: selectProp,\n selectionVariant,\n timezone,\n visibleMonth,\n // startDateOffset,\n // endDateOffset,\n } = props;\n const { dateAdapter } = useLocalization<TDate>();\n const [selectedDate, setSelectedDateState] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"Calendar\",\n state: \"selectedDate\",\n });\n\n const startDateOffset =\n selectionVariant === \"offset\" ? props.startDateOffset : undefined;\n const endDateOffset =\n selectionVariant === \"offset\" ? props.endDateOffset : undefined;\n\n const getStartDateOffset = useCallback(\n (date: TDate) => {\n if (selectionVariant === \"offset\" && startDateOffset) {\n return startDateOffset(date);\n }\n return date;\n },\n [selectionVariant, startDateOffset],\n );\n\n const getEndDateOffset = useCallback(\n (date: TDate) => {\n if (selectionVariant === \"offset\" && endDateOffset) {\n return endDateOffset(date);\n }\n return date;\n },\n [selectionVariant, endDateOffset],\n );\n\n const setSelectedDate = useCallback(\n (event: SyntheticEvent<HTMLButtonElement>, newSelectedDate: TDate) => {\n if (!isDaySelectable || isDaySelectable(newSelectedDate)) {\n const handleSelectionChange = <\n U extends\n | (TDate | null)\n | TDate[]\n | (DateRangeSelection<TDate> | null)\n | DateRangeSelection<TDate>[],\n >(\n updatedSelection: U,\n changeHandler:\n | ((event: SyntheticEvent, updatedSelection: U) => void)\n | undefined,\n ) => {\n changeHandler?.(event, updatedSelection);\n setSelectedDateState(updatedSelection);\n };\n\n switch (selectionVariant) {\n case \"single\": {\n if (isMultiselect(props)) {\n const multipleSingleSelectedDate = selectedDate as Array<\n SingleDateSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectSingleProps<TDate>[\"select\"];\n const updatedSelection: Array<SingleDateSelection<TDate>> = select\n ? select(multipleSingleSelectedDate ?? [], newSelectedDate)\n : [...(multipleSingleSelectedDate ?? []), newSelectedDate];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectSingleProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const singleSelectedDate =\n selectedDate as SingleDateSelection<TDate> | null;\n const select =\n selectProp as UseCalendarSelectionSingleProps<TDate>[\"select\"];\n const updatedSelection: SingleDateSelection<TDate> | null = select\n ? select(singleSelectedDate, newSelectedDate)\n : newSelectedDate;\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionSingleProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"range\": {\n if (isMultiselect(props)) {\n const multipleRangeSelectedDate = selectedDate as Array<\n DateRangeSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectRangeProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate>[] = select\n ? select(multipleRangeSelectedDate ?? [], newSelectedDate)\n : selectMultiselectDateRange(\n dateAdapter,\n multipleRangeSelectedDate ?? [],\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectRangeProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const rangeSelectedDate =\n selectedDate as DateRangeSelection<TDate>;\n const select =\n selectProp as UseCalendarSelectionRangeProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate> = select\n ? select(rangeSelectedDate, newSelectedDate)\n : selectDateRange(\n dateAdapter,\n rangeSelectedDate,\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionRangeProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"offset\": {\n if (isMultiselect(props)) {\n const multipleOffsetSelectedDate = selectedDate as Array<\n DateRangeSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectOffsetProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate>[] = select\n ? select(multipleOffsetSelectedDate ?? [], newSelectedDate)\n : [\n ...(multipleOffsetSelectedDate ?? []),\n {\n startDate: getStartDateOffset(newSelectedDate),\n endDate: getEndDateOffset(newSelectedDate),\n },\n ];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectOffsetProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const offsetSelectedDate =\n selectedDate as DateRangeSelection<TDate>;\n const select =\n selectProp as UseCalendarSelectionOffsetProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate> = select\n ? select(offsetSelectedDate, newSelectedDate)\n : {\n startDate: getStartDateOffset(newSelectedDate),\n endDate: getEndDateOffset(newSelectedDate),\n };\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionOffsetProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n }\n }\n },\n [\n dateAdapter,\n getEndDateOffset,\n getStartDateOffset,\n isDaySelectable,\n selectProp,\n selectedDate,\n selectionVariant,\n onSelectionChange,\n props, // Ensure props is included in the dependency array\n ],\n );\n\n const isSelected = useCallback(\n (date: TDate) => {\n if (!selectedDate) {\n return false;\n }\n\n const isSingleDateSelected = (element: SingleDateSelection<TDate>) =>\n dateAdapter.isSame(element, date, \"day\");\n\n const isDateRangeSelected = (range: DateRangeSelection<TDate>) =>\n range.startDate &&\n range.endDate &&\n dateAdapter.compare(date, range.startDate) >= 0 &&\n dateAdapter.compare(date, range.endDate) <= 0;\n\n if (Array.isArray(selectedDate)) {\n return selectedDate.some((element) =>\n isDateRangeSelection(element)\n ? isDateRangeSelected(element)\n : isSingleDateSelected(element as SingleDateSelection<TDate>),\n );\n }\n\n switch (selectionVariant) {\n case \"single\":\n return isSingleDateSelected(\n selectedDate as SingleDateSelection<TDate>,\n );\n case \"range\":\n case \"offset\":\n return isDateRangeSelected(selectedDate as DateRangeSelection<TDate>);\n default:\n return false;\n }\n },\n [dateAdapter, selectedDate, selectionVariant],\n );\n\n const getDefaultFocusedDate = () => {\n if (\n selectedDate &&\n (selectionVariant === \"range\" || selectionVariant === \"offset\")\n ) {\n const getFocusableDate = (\n result: TDate[],\n selection: DateRangeSelection<TDate>,\n ) => {\n if (selection?.startDate && isDayVisible(selection.startDate)) {\n return [...result, selection.startDate];\n }\n if (selection?.endDate && isDayVisible(selection.endDate)) {\n return [...result, selection.endDate];\n }\n return result;\n };\n let focusableSelectedDates:\n | DateRangeSelection<TDate>\n | DateRangeSelection<TDate>[];\n if (!multiselect) {\n focusableSelectedDates = [selectedDate as DateRangeSelection<TDate>];\n } else {\n focusableSelectedDates = selectedDate as DateRangeSelection<TDate>[];\n }\n const selectionInMonth = focusableSelectedDates\n .reduce(getFocusableDate, [])\n .sort((a, b) => dateAdapter.compare(a, b));\n if (selectionInMonth.length > 0) {\n return selectionInMonth[0];\n }\n } else if (selectedDate && selectionVariant === \"single\") {\n const focusableSelectedDate = multiselect\n ? (selectedDate as SingleDateSelection<TDate>[])?.[0]\n : (selectedDate as SingleDateSelection<TDate>);\n if (focusableSelectedDate && isDayVisible(focusableSelectedDate)) {\n return focusableSelectedDate;\n }\n }\n\n // Defaults\n if (\n isDaySelectable?.(dateAdapter.today(timezone)) &&\n isDayVisible(dateAdapter.today(timezone))\n ) {\n return dateAdapter.today(timezone);\n }\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n visibleMonth,\n ).find((visibleDay) => visibleDay && isDaySelectable?.(visibleDay));\n if (firstSelectableDate) {\n return firstSelectableDate;\n }\n return null;\n };\n\n const [focusedDate, setFocusedDateState] = useControlled({\n controlled: focusedDateProp,\n default: useMemo(getDefaultFocusedDate, []),\n name: \"Calendar\",\n state: \"focusedDate\",\n });\n\n const setFocusedDate = useCallback(\n (event: SyntheticEvent | null, date: TDate | null) => {\n if (focusedDateRef && event?.target instanceof HTMLElement) {\n focusedDateRef.current = event.target;\n }\n if (\n date &&\n ((focusedDate && dateAdapter.isSame(date, focusedDate, \"day\")) ||\n isOutsideAllowedDates(date))\n ) {\n return;\n }\n setFocusedDateState(date);\n onFocusedDateChange?.(event, date);\n },\n [\n dateAdapter,\n focusedDate,\n focusedDateRef,\n isOutsideAllowedDates,\n onFocusedDateChange,\n ],\n );\n\n const [hoveredDate, setHoveredDateState] = useControlled({\n controlled: hoveredDateProp,\n default: undefined,\n name: \"Calendar\",\n state: \"hoveredDate\",\n });\n\n const setHoveredDate = useCallback(\n (event: SyntheticEvent, date: TDate | null) => {\n setHoveredDateState(date);\n onHoveredDateChange?.(event, date);\n },\n [onHoveredDateChange],\n );\n\n const isHovered = useCallback(\n (date: TDate) => {\n return !!hoveredDate && dateAdapter.isSame(date, hoveredDate, \"day\");\n },\n [dateAdapter, hoveredDate],\n );\n\n const getFocusableDates = useCallback(() => {\n const focusableDates: TDate[] = [];\n\n if (Array.isArray(selectedDate)) {\n // Handle array of selections\n for (const selection of selectedDate) {\n if (isDateRangeSelection(selection)) {\n if (selection.startDate && isDayVisible(selection.startDate)) {\n focusableDates.push(selection.startDate);\n } else if (selection.endDate && isDayVisible(selection.endDate)) {\n focusableDates.push(selection.endDate);\n }\n } else if (isDayVisible(selection as TDate)) {\n focusableDates.push(selection as TDate);\n }\n }\n } else if (selectedDate) {\n // Handle single selection\n if (isDateRangeSelection(selectedDate)) {\n if (selectedDate.startDate && isDayVisible(selectedDate.startDate)) {\n focusableDates.push(selectedDate.startDate);\n } else if (selectedDate.endDate && isDayVisible(selectedDate.endDate)) {\n focusableDates.push(selectedDate.endDate);\n }\n } else if (isDayVisible(selectedDate)) {\n focusableDates.push(selectedDate);\n }\n }\n\n if (\n focusedDate &&\n visibleMonth &&\n dateAdapter.isSame(focusedDate, visibleMonth, \"month\")\n ) {\n focusableDates.push(focusedDate);\n return focusableDates;\n }\n\n // Defaults\n if (\n focusableDates.length === 0 &&\n isDaySelectable(dateAdapter.today(timezone)) &&\n isDayVisible(dateAdapter.today(timezone))\n ) {\n focusableDates.push(dateAdapter.today(timezone));\n }\n if (focusableDates.length === 0 || !focusableDates.some(isDayVisible)) {\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n visibleMonth,\n ).find((visibleDay) => visibleDay && isDaySelectable(visibleDay));\n if (firstSelectableDate) {\n focusableDates.push(firstSelectableDate);\n }\n }\n\n return focusableDates;\n }, [\n dateAdapter,\n focusedDate,\n isDaySelectable,\n isDayVisible,\n selectedDate,\n timezone,\n visibleMonth,\n ]);\n\n const isSelectedSpan = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.startDate) &&\n !isOutsideAllowedDates(range.endDate)\n ) {\n return (\n dateAdapter.compare(date, range.startDate) > 0 &&\n dateAdapter.compare(date, range.endDate) < 0\n );\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isHoveredSpan = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n !dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.startDate) &&\n hoveredDate\n ) {\n const isForwardRange =\n dateAdapter.compare(hoveredDate, range.startDate) >= 0 &&\n ((dateAdapter.compare(date, range.startDate) >= 0 &&\n dateAdapter.compare(date, hoveredDate) <= 0) ||\n dateAdapter.isSame(date, hoveredDate, \"day\"));\n\n const isValidDayHovered =\n !isDaySelectable || isDaySelectable(hoveredDate);\n\n return isForwardRange && isValidDayHovered;\n }\n return false;\n });\n },\n [\n dateAdapter,\n isOutsideAllowedDates,\n selectionVariant,\n selectedDate,\n hoveredDate,\n isDaySelectable,\n ],\n );\n\n const isSelectedStart = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n !isOutsideAllowedDates(range.startDate)\n ) {\n return dateAdapter.isSame(range.startDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isSelectedEnd = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.endDate)\n ) {\n return dateAdapter.isSame(range.endDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isHoveredOffset = useCallback(\n (date: TDate) => {\n if (hoveredDate && selectionVariant === \"offset\") {\n const startDate = getStartDateOffset(hoveredDate);\n const endDate = getEndDateOffset(hoveredDate);\n\n return (\n dateAdapter.compare(date, startDate) >= 0 &&\n dateAdapter.compare(date, endDate) <= 0 &&\n (!isDaySelectable || isDaySelectable(date))\n );\n }\n\n return false;\n },\n [\n dateAdapter,\n getStartDateOffset,\n getEndDateOffset,\n hoveredDate,\n isDaySelectable,\n selectionVariant,\n ],\n );\n\n return useMemo(\n () => ({\n state: {\n focusedDate,\n focusedDateRef,\n hoveredDate,\n selectedDate,\n focusableDates: getFocusableDates(),\n },\n helpers: {\n isSelected,\n setSelectedDate,\n isHovered,\n setHoveredDate,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHoveredOffset,\n isDaySelectable,\n setFocusedDate,\n },\n }),\n [\n selectedDate,\n focusedDate,\n focusedDateRef,\n getFocusableDates,\n hoveredDate,\n isSelected,\n isHovered,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHoveredOffset,\n isDaySelectable,\n setFocusedDate,\n setHoveredDate,\n setSelectedDate,\n ],\n );\n}\n\nexport function useCalendarSelectionDay<TDate extends DateFrameworkType>({\n date,\n}: {\n date: TDate;\n}) {\n const {\n helpers: {\n setSelectedDate,\n isSelected,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHovered,\n isHoveredOffset,\n isDaySelectable,\n },\n } = useCalendarContext<TDate>();\n\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n setSelectedDate(event, date);\n },\n [date, setSelectedDate],\n );\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n switch (event.key) {\n case \"Space\":\n case \"Enter\":\n setSelectedDate(event, date);\n event.preventDefault();\n }\n },\n [date, setSelectedDate],\n );\n\n const selected = isSelected(date);\n const selectedSpan = isSelectedSpan(date);\n const hoveredSpan = isHoveredSpan(date);\n const selectedStart = isSelectedStart(date);\n const selectedEnd = isSelectedEnd(date);\n const hovered = isHovered(date);\n const hoveredOffset = isHoveredOffset(date);\n\n return {\n handleClick,\n handleKeyDown,\n status: {\n selected,\n selectedSpan,\n hoveredSpan,\n selectedStart,\n selectedEnd,\n hovered,\n hoveredOffset,\n },\n dayProps: {\n className: clsx({\n [withBaseName(\"selected\")]: selected,\n [withBaseName(\"selectedSpan\")]: selectedSpan,\n [withBaseName(\"hoveredSpan\")]: hoveredSpan,\n [withBaseName(\"selectedStart\")]: selectedStart,\n [withBaseName(\"selectedEnd\")]: selectedEnd,\n [withBaseName(\"hovered\")]: hovered,\n [withBaseName(\"hoveredOffset\")]: hoveredOffset,\n }),\n \"aria-pressed\":\n selected || selectedEnd || selectedStart || selectedSpan\n ? \"true\"\n : undefined,\n \"aria-disabled\":\n isDaySelectable && !isDaySelectable(date) ? \"true\" : undefined,\n },\n };\n}\n"],"names":["makePrefixer","useLocalization","useControlled","useCallback","generateDatesForMonth","useMemo","useCalendarContext","clsx"],"mappings":"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"}
@@ -83,11 +83,15 @@ const CascadingMenu = react.forwardRef(
83
83
  }
84
84
  });
85
85
  const openCloseMenu = react.useCallback(
86
- (open) => dispatch({
87
- type: open ? CascadingMenuAction.CascadingMenuAction.OPEN_MENU : CascadingMenuAction.CascadingMenuAction.CLOSE_CASCADING_MENU,
88
- cause: stateChangeTypes.stateChangeTypes.MOUSE_TOGGLE,
89
- targetId: rootMenuId
90
- }),
86
+ (open) => {
87
+ if (rootMenuId) {
88
+ dispatch({
89
+ type: open ? CascadingMenuAction.CascadingMenuAction.OPEN_MENU : CascadingMenuAction.CascadingMenuAction.CLOSE_CASCADING_MENU,
90
+ cause: stateChangeTypes.stateChangeTypes.MOUSE_TOGGLE,
91
+ targetId: rootMenuId
92
+ });
93
+ }
94
+ },
91
95
  [rootMenuId]
92
96
  );
93
97
  react.useEffect(() => {
@@ -102,18 +106,20 @@ const CascadingMenu = react.forwardRef(
102
106
  clickAwayNodes,
103
107
  containingDocument,
104
108
  () => {
105
- dispatch({
106
- type: CascadingMenuAction.CascadingMenuAction.CLOSE_CASCADING_MENU,
107
- cause: stateChangeTypes.stateChangeTypes.CLICKED_AWAY,
108
- targetId: rootMenuId
109
- });
109
+ if (rootMenuId) {
110
+ dispatch({
111
+ type: CascadingMenuAction.CascadingMenuAction.CLOSE_CASCADING_MENU,
112
+ cause: stateChangeTypes.stateChangeTypes.CLICKED_AWAY,
113
+ targetId: rootMenuId
114
+ });
115
+ }
110
116
  },
111
117
  () => {
112
118
  setIsNavigatingWithKeyboard(false);
113
119
  }
114
120
  );
115
121
  const handleResize = useEventCallback.useEventCallback(() => {
116
- if (rootMenuState) {
122
+ if (rootMenuState && rootMenuId) {
117
123
  dispatch({
118
124
  type: CascadingMenuAction.CascadingMenuAction.CLOSE_CASCADING_MENU,
119
125
  cause: stateChangeTypes.stateChangeTypes.ON_RESIZE,
@@ -131,7 +137,7 @@ const CascadingMenu = react.forwardRef(
131
137
  const onItemClickCallback = react.useCallback(
132
138
  (sourceItem, event) => {
133
139
  onItemClick == null ? void 0 : onItemClick(sourceItem, event);
134
- if (!isNavigatingWithKeyboard) {
140
+ if (!isNavigatingWithKeyboard && rootMenuId) {
135
141
  dispatch({
136
142
  type: CascadingMenuAction.CascadingMenuAction.CLOSE_CASCADING_MENU,
137
143
  cause: stateChangeTypes.stateChangeTypes.ITEM_CLICKED,
@@ -202,7 +208,7 @@ const CascadingMenu = react.forwardRef(
202
208
  Object.values(state).map((menuState) => {
203
209
  const data = menusDataById[menuState.id];
204
210
  const isRoot = data.level === 0;
205
- const parentElement = isRoot ? getMenuTriggerRef() : refsManager.get(data.parentId);
211
+ const parentElement = isRoot ? getMenuTriggerRef() : refsManager.get((data == null ? void 0 : data.parentId) ?? "");
206
212
  const isChildMenuOpen = !!state[data.level + 1];
207
213
  return /* @__PURE__ */ react.createElement(
208
214
  CascadingMenuList.CascadingMenuList,
@@ -1 +1 @@
1
- {"version":3,"file":"CascadingMenu.js","sources":["../src/cascading-menu/CascadingMenu.tsx"],"sourcesContent":["import {\n getRefFromChildren,\n ownerWindow,\n useControlled,\n useDensity,\n useForkRef,\n usePrevious,\n} from \"@salt-ds/core\";\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from \"react\";\nimport { useEventCallback } from \"../utils\";\nimport { CascadingMenuList } from \"./CascadingMenuList\";\nimport type { CascadingMenuProps, MenuDescriptor } from \"./CascadingMenuProps\";\nimport { CascadingMenuAction } from \"./internal/CascadingMenuAction\";\nimport { defaultGetScreenBounds } from \"./internal/menuPositioning\";\nimport { deriveFlatStateFromTree } from \"./internal/stateUtils\";\nimport { useClickAway } from \"./internal/useClickAway\";\nimport { useMenuTriggerHandlers } from \"./internal/useMenuTriggerHandlers\";\nimport { useRefsManager } from \"./internal/useRefsManager\";\nimport { useStateReducer } from \"./internal/useStateReducer\";\nimport { stateChangeTypes } from \"./stateChangeTypes\";\n\nconst defaultItemToString = (item: any) => item?.title || String(item);\n\nexport const CascadingMenu = forwardRef<HTMLDivElement, CascadingMenuProps>(\n function CascadingMenu(props, ref) {\n const {\n children,\n className,\n initialSource: initialSourceProp,\n itemToString = defaultItemToString,\n onClose,\n onItemClick,\n onOpen,\n maxWidth = 544,\n minWidth = 200,\n delay = 300,\n rowHeight,\n tooltipEnterDelay = 1500,\n tooltipLeaveDelay = 0,\n height,\n rootPlacement,\n // Add this to offset x, y on popper open\n rootPlacementOffset,\n menuTriggerRef: anchorRefProp,\n open: openProp,\n getScreenBounds = defaultGetScreenBounds,\n disableMouseOutInteractions,\n disableClickAway,\n containingDocument = globalThis.document,\n source: sourceProp,\n } = props;\n const density = useDensity();\n\n const refsManager = useRefsManager();\n const childrenRef = useRef<HTMLElement | null>(null);\n const getMenuTriggerRef = useCallback(\n (): HTMLElement | null => anchorRefProp || childrenRef.current,\n [anchorRefProp],\n );\n\n const [menuSource] = useControlled({\n controlled: sourceProp,\n default: initialSourceProp,\n name: \"CascadingMenu\",\n state: \"source\",\n });\n\n const [isNavigatingWithKeyboard, setIsNavigatingWithKeyboard] =\n useState(false);\n\n const menusDataById = useMemo(\n () => (menuSource ? deriveFlatStateFromTree(menuSource) : {}),\n [menuSource],\n );\n\n const rootMenuId = useMemo(\n () =>\n Object.keys(menusDataById).find((id) => menusDataById[id].level === 0),\n [menusDataById],\n );\n\n const stateReducer = useStateReducer(\n menusDataById,\n isNavigatingWithKeyboard,\n );\n const [state, dispatch] = useReducer(stateReducer, []);\n const rootMenuState = state[0];\n\n // Call open and close callbacks after rendering as we know for sure whether the cascading menu is open or closed\n const prevState = usePrevious(state, undefined, []);\n const prevRootMenuState = prevState?.[0];\n useEffect(() => {\n if (!!rootMenuState !== !!prevRootMenuState) {\n if (!rootMenuState) {\n onClose?.();\n } else if (rootMenuState) {\n onOpen?.();\n }\n }\n });\n\n // Controlled opening/closing of the menu\n const openCloseMenu = useCallback(\n (open: boolean) =>\n dispatch({\n type: open\n ? CascadingMenuAction.OPEN_MENU\n : CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.MOUSE_TOGGLE,\n targetId: rootMenuId!,\n }),\n [rootMenuId],\n );\n // do not re-render every time if prop does not change\n useEffect(() => {\n if (openProp !== undefined && openProp !== !!rootMenuState) {\n openCloseMenu(openProp);\n }\n });\n\n const clickAwayNodes = disableClickAway\n ? null\n : () =>\n [getMenuTriggerRef(), ...refsManager.values()].filter(\n (node) => node !== null,\n ) as HTMLElement[];\n useClickAway(\n clickAwayNodes,\n containingDocument,\n () => {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.CLICKED_AWAY,\n targetId: rootMenuId!,\n });\n },\n () => {\n setIsNavigatingWithKeyboard(false);\n },\n );\n\n const handleResize = useEventCallback(() => {\n if (rootMenuState) {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.ON_RESIZE,\n targetId: rootMenuId!,\n });\n }\n });\n\n useEffect(() => {\n const win = ownerWindow(getMenuTriggerRef());\n\n win.addEventListener(\"resize\", handleResize);\n return () => {\n win.removeEventListener(\"resize\", handleResize);\n };\n }, [getMenuTriggerRef, handleResize]);\n\n // close the menu on item click via mouse\n const onItemClickCallback = useCallback(\n (sourceItem: MenuDescriptor, event: KeyboardEvent | MouseEvent) => {\n onItemClick?.(sourceItem, event);\n\n if (!isNavigatingWithKeyboard) {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.ITEM_CLICKED,\n targetId: rootMenuId!,\n });\n }\n },\n [isNavigatingWithKeyboard, onItemClick, rootMenuId],\n );\n\n // Set up event handlers on menu trigger if passed\n const setMenuTriggerRef = useCallback((node: HTMLElement) => {\n childrenRef.current = node;\n }, []);\n const handleRef = useForkRef(\n getRefFromChildren(children),\n setMenuTriggerRef,\n );\n\n const [onMenuTriggerClick, onMenuTriggerKeydown] = useMenuTriggerHandlers({\n dispatch,\n children,\n setIsNavigatingWithKeyboard,\n openCloseMenu,\n rootMenuState,\n rootMenuId,\n menusDataById,\n });\n\n const cloneMenuChildren = (cloneChildren: ReactNode) => {\n if (isValidElement(cloneChildren)) {\n const childrenProps = {\n ...cloneChildren.props,\n };\n\n if (openProp === undefined) {\n childrenProps.onClick = onMenuTriggerClick;\n childrenProps.onKeyDown = onMenuTriggerKeydown;\n }\n\n return cloneElement(cloneChildren, {\n ref: handleRef,\n ...childrenProps,\n });\n }\n return null;\n };\n\n const clonedChildren = cloneMenuChildren(children);\n\n const commonMenuProps = {\n className,\n delay,\n itemToString,\n maxWidth,\n minWidth,\n onItemClick: onItemClickCallback,\n dispatch,\n isNavigatingWithKeyboard,\n setIsNavigatingWithKeyboard,\n menusDataById,\n tooltipEnterDelay,\n tooltipLeaveDelay,\n rootPlacement,\n rootPlacementOffset,\n getScreenBounds,\n disableMouseOutInteractions,\n };\n\n useEffect(() => {\n if (!openProp) {\n setIsNavigatingWithKeyboard(false);\n }\n }, [openProp, rootPlacementOffset]);\n\n return Object.keys(menusDataById).length > 0 ? (\n <>\n {clonedChildren || null}\n {Object.values(state).map((menuState) => {\n const data = menusDataById[menuState.id];\n\n const isRoot = data.level === 0;\n const parentElement = isRoot\n ? getMenuTriggerRef()\n : refsManager.get(data.parentId!);\n\n const isChildMenuOpen = !!state[data.level + 1];\n return (\n <CascadingMenuList\n {...commonMenuProps}\n data={data}\n height={height}\n highlightedItemIndex={menuState.highlightedItemIndex}\n isChildMenuOpen={isChildMenuOpen}\n isRoot={isRoot}\n key={`${density}${menuState.id}`}\n menuId={menuState.id}\n menuTriggerRef={getMenuTriggerRef()}\n parentElement={parentElement}\n ref={isRoot ? ref : null}\n refsManager={refsManager}\n rowHeight={rowHeight}\n />\n );\n })}\n </>\n ) : null;\n },\n);\n"],"names":["forwardRef","CascadingMenu","defaultGetScreenBounds","useDensity","useRefsManager","useRef","useCallback","useControlled","useState","useMemo","deriveFlatStateFromTree","useStateReducer","useReducer","usePrevious","useEffect","CascadingMenuAction","stateChangeTypes","useClickAway","useEventCallback","ownerWindow","useForkRef","getRefFromChildren","useMenuTriggerHandlers","isValidElement","cloneElement","jsxs","Fragment","createElement","CascadingMenuList"],"mappings":";;;;;;;;;;;;;;;;AAkCA,MAAM,sBAAsB,CAAC,IAAA,KAAA,CAAc,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,KAAA,KAAS,OAAO,IAAI,CAAA;AAE9D,MAAM,aAAgB,GAAAA,gBAAA;AAAA,EAC3B,SAASC,cAAc,CAAA,KAAA,EAAO,GAAK,EAAA;AACjC,IAAM,MAAA;AAAA,MACJ,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAe,EAAA,iBAAA;AAAA,MACf,YAAe,GAAA,mBAAA;AAAA,MACf,OAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAW,GAAA,GAAA;AAAA,MACX,QAAW,GAAA,GAAA;AAAA,MACX,KAAQ,GAAA,GAAA;AAAA,MACR,SAAA;AAAA,MACA,iBAAoB,GAAA,IAAA;AAAA,MACpB,iBAAoB,GAAA,CAAA;AAAA,MACpB,MAAA;AAAA,MACA,aAAA;AAAA;AAAA,MAEA,mBAAA;AAAA,MACA,cAAgB,EAAA,aAAA;AAAA,MAChB,IAAM,EAAA,QAAA;AAAA,MACN,eAAkB,GAAAC,sCAAA;AAAA,MAClB,2BAAA;AAAA,MACA,gBAAA;AAAA,MACA,qBAAqB,UAAW,CAAA,QAAA;AAAA,MAChC,MAAQ,EAAA;AAAA,KACN,GAAA,KAAA;AACJ,IAAA,MAAM,UAAUC,eAAW,EAAA;AAE3B,IAAA,MAAM,cAAcC,6BAAe,EAAA;AACnC,IAAM,MAAA,WAAA,GAAcC,aAA2B,IAAI,CAAA;AACnD,IAAA,MAAM,iBAAoB,GAAAC,iBAAA;AAAA,MACxB,MAA0B,iBAAiB,WAAY,CAAA,OAAA;AAAA,MACvD,CAAC,aAAa;AAAA,KAChB;AAEA,IAAM,MAAA,CAAC,UAAU,CAAA,GAAIC,kBAAc,CAAA;AAAA,MACjC,UAAY,EAAA,UAAA;AAAA,MACZ,OAAS,EAAA,iBAAA;AAAA,MACT,IAAM,EAAA,eAAA;AAAA,MACN,KAAO,EAAA;AAAA,KACR,CAAA;AAED,IAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAC1DC,eAAS,KAAK,CAAA;AAEhB,IAAA,MAAM,aAAgB,GAAAC,aAAA;AAAA,MACpB,MAAO,UAAA,GAAaC,kCAAwB,CAAA,UAAU,IAAI,EAAC;AAAA,MAC3D,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,MAAM,UAAa,GAAAD,aAAA;AAAA,MACjB,MACE,MAAA,CAAO,IAAK,CAAA,aAAa,CAAE,CAAA,IAAA,CAAK,CAAC,EAAA,KAAO,aAAc,CAAA,EAAE,CAAE,CAAA,KAAA,KAAU,CAAC,CAAA;AAAA,MACvE,CAAC,aAAa;AAAA,KAChB;AAEA,IAAA,MAAM,YAAe,GAAAE,+BAAA;AAAA,MACnB,aAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,IAAIC,gBAAW,CAAA,YAAA,EAAc,EAAE,CAAA;AACrD,IAAM,MAAA,aAAA,GAAgB,MAAM,CAAC,CAAA;AAG7B,IAAA,MAAM,SAAY,GAAAC,gBAAA,CAAY,KAAO,EAAA,MAAA,EAAW,EAAE,CAAA;AAClD,IAAA,MAAM,oBAAoB,SAAY,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAA,CAAA,CAAA;AACtC,IAAAC,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,CAAC,aAAkB,KAAA,CAAC,CAAC,iBAAmB,EAAA;AAC3C,QAAA,IAAI,CAAC,aAAe,EAAA;AAClB,UAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,EAAA;AAAA,mBACS,aAAe,EAAA;AACxB,UAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,EAAA;AAAA;AACF;AACF,KACD,CAAA;AAGD,IAAA,MAAM,aAAgB,GAAAR,iBAAA;AAAA,MACpB,CAAC,SACC,QAAS,CAAA;AAAA,QACP,IAAM,EAAA,IAAA,GACFS,uCAAoB,CAAA,SAAA,GACpBA,uCAAoB,CAAA,oBAAA;AAAA,QACxB,OAAOC,iCAAiB,CAAA,YAAA;AAAA,QACxB,QAAU,EAAA;AAAA,OACX,CAAA;AAAA,MACH,CAAC,UAAU;AAAA,KACb;AAEA,IAAAF,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,QAAa,KAAA,MAAA,IAAa,QAAa,KAAA,CAAC,CAAC,aAAe,EAAA;AAC1D,QAAA,aAAA,CAAc,QAAQ,CAAA;AAAA;AACxB,KACD,CAAA;AAED,IAAM,MAAA,cAAA,GAAiB,gBACnB,GAAA,IAAA,GACA,MACE,CAAC,iBAAkB,EAAA,EAAG,GAAG,WAAA,CAAY,MAAO,EAAC,CAAE,CAAA,MAAA;AAAA,MAC7C,CAAC,SAAS,IAAS,KAAA;AAAA,KACrB;AACN,IAAAG,yBAAA;AAAA,MACE,cAAA;AAAA,MACA,kBAAA;AAAA,MACA,MAAM;AACJ,QAAS,QAAA,CAAA;AAAA,UACP,MAAMF,uCAAoB,CAAA,oBAAA;AAAA,UAC1B,OAAOC,iCAAiB,CAAA,YAAA;AAAA,UACxB,QAAU,EAAA;AAAA,SACX,CAAA;AAAA,OACH;AAAA,MACA,MAAM;AACJ,QAAA,2BAAA,CAA4B,KAAK,CAAA;AAAA;AACnC,KACF;AAEA,IAAM,MAAA,YAAA,GAAeE,kCAAiB,MAAM;AAC1C,MAAA,IAAI,aAAe,EAAA;AACjB,QAAS,QAAA,CAAA;AAAA,UACP,MAAMH,uCAAoB,CAAA,oBAAA;AAAA,UAC1B,OAAOC,iCAAiB,CAAA,SAAA;AAAA,UACxB,QAAU,EAAA;AAAA,SACX,CAAA;AAAA;AACH,KACD,CAAA;AAED,IAAAF,eAAA,CAAU,MAAM;AACd,MAAM,MAAA,GAAA,GAAMK,gBAAY,CAAA,iBAAA,EAAmB,CAAA;AAE3C,MAAI,GAAA,CAAA,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAC3C,MAAA,OAAO,MAAM;AACX,QAAI,GAAA,CAAA,mBAAA,CAAoB,UAAU,YAAY,CAAA;AAAA,OAChD;AAAA,KACC,EAAA,CAAC,iBAAmB,EAAA,YAAY,CAAC,CAAA;AAGpC,IAAA,MAAM,mBAAsB,GAAAb,iBAAA;AAAA,MAC1B,CAAC,YAA4B,KAAsC,KAAA;AACjE,QAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAc,UAAY,EAAA,KAAA,CAAA;AAE1B,QAAA,IAAI,CAAC,wBAA0B,EAAA;AAC7B,UAAS,QAAA,CAAA;AAAA,YACP,MAAMS,uCAAoB,CAAA,oBAAA;AAAA,YAC1B,OAAOC,iCAAiB,CAAA,YAAA;AAAA,YACxB,QAAU,EAAA;AAAA,WACX,CAAA;AAAA;AACH,OACF;AAAA,MACA,CAAC,wBAA0B,EAAA,WAAA,EAAa,UAAU;AAAA,KACpD;AAGA,IAAM,MAAA,iBAAA,GAAoBV,iBAAY,CAAA,CAAC,IAAsB,KAAA;AAC3D,MAAA,WAAA,CAAY,OAAU,GAAA,IAAA;AAAA,KACxB,EAAG,EAAE,CAAA;AACL,IAAA,MAAM,SAAY,GAAAc,eAAA;AAAA,MAChBC,wBAAmB,QAAQ,CAAA;AAAA,MAC3B;AAAA,KACF;AAEA,IAAA,MAAM,CAAC,kBAAA,EAAoB,oBAAoB,CAAA,GAAIC,6CAAuB,CAAA;AAAA,MACxE,QAAA;AAAA,MACA,QAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAM,MAAA,iBAAA,GAAoB,CAAC,aAA6B,KAAA;AACtD,MAAI,IAAAC,oBAAA,CAAe,aAAa,CAAG,EAAA;AACjC,QAAA,MAAM,aAAgB,GAAA;AAAA,UACpB,GAAG,aAAc,CAAA;AAAA,SACnB;AAEA,QAAA,IAAI,aAAa,MAAW,EAAA;AAC1B,UAAA,aAAA,CAAc,OAAU,GAAA,kBAAA;AACxB,UAAA,aAAA,CAAc,SAAY,GAAA,oBAAA;AAAA;AAG5B,QAAA,OAAOC,mBAAa,aAAe,EAAA;AAAA,UACjC,GAAK,EAAA,SAAA;AAAA,UACL,GAAG;AAAA,SACJ,CAAA;AAAA;AAEH,MAAO,OAAA,IAAA;AAAA,KACT;AAEA,IAAM,MAAA,cAAA,GAAiB,kBAAkB,QAAQ,CAAA;AAEjD,IAAA,MAAM,eAAkB,GAAA;AAAA,MACtB,SAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAa,EAAA,mBAAA;AAAA,MACb,QAAA;AAAA,MACA,wBAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,aAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAAV,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,QAAU,EAAA;AACb,QAAA,2BAAA,CAA4B,KAAK,CAAA;AAAA;AACnC,KACC,EAAA,CAAC,QAAU,EAAA,mBAAmB,CAAC,CAAA;AAElC,IAAA,OAAO,OAAO,IAAK,CAAA,aAAa,CAAE,CAAA,MAAA,GAAS,oBAEtCW,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA;AAAA,MAAkB,cAAA,IAAA,IAAA;AAAA,MAClB,OAAO,MAAO,CAAA,KAAK,CAAE,CAAA,GAAA,CAAI,CAAC,SAAc,KAAA;AACvC,QAAM,MAAA,IAAA,GAAO,aAAc,CAAA,SAAA,CAAU,EAAE,CAAA;AAEvC,QAAM,MAAA,MAAA,GAAS,KAAK,KAAU,KAAA,CAAA;AAC9B,QAAA,MAAM,gBAAgB,MAClB,GAAA,iBAAA,KACA,WAAY,CAAA,GAAA,CAAI,KAAK,QAAS,CAAA;AAElC,QAAA,MAAM,kBAAkB,CAAC,CAAC,KAAM,CAAA,IAAA,CAAK,QAAQ,CAAC,CAAA;AAC9C,QACE,uBAAAC,mBAAA;AAAA,UAACC,mCAAA;AAAA,UAAA;AAAA,YACE,GAAG,eAAA;AAAA,YACJ,IAAA;AAAA,YACA,MAAA;AAAA,YACA,sBAAsB,SAAU,CAAA,oBAAA;AAAA,YAChC,eAAA;AAAA,YACA,MAAA;AAAA,YACA,GAAK,EAAA,CAAA,EAAG,OAAO,CAAA,EAAG,UAAU,EAAE,CAAA,CAAA;AAAA,YAC9B,QAAQ,SAAU,CAAA,EAAA;AAAA,YAClB,gBAAgB,iBAAkB,EAAA;AAAA,YAClC,aAAA;AAAA,YACA,GAAA,EAAK,SAAS,GAAM,GAAA,IAAA;AAAA,YACpB,WAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,OAEH;AAAA,KAAA,EACH,CACE,GAAA,IAAA;AAAA;AAER;;;;"}
1
+ {"version":3,"file":"CascadingMenu.js","sources":["../src/cascading-menu/CascadingMenu.tsx"],"sourcesContent":["import {\n getRefFromChildren,\n ownerWindow,\n useControlled,\n useDensity,\n useForkRef,\n usePrevious,\n} from \"@salt-ds/core\";\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from \"react\";\nimport { useEventCallback } from \"../utils\";\nimport { CascadingMenuList } from \"./CascadingMenuList\";\nimport type { CascadingMenuProps, MenuDescriptor } from \"./CascadingMenuProps\";\nimport { CascadingMenuAction } from \"./internal/CascadingMenuAction\";\nimport { defaultGetScreenBounds } from \"./internal/menuPositioning\";\nimport { deriveFlatStateFromTree } from \"./internal/stateUtils\";\nimport { useClickAway } from \"./internal/useClickAway\";\nimport { useMenuTriggerHandlers } from \"./internal/useMenuTriggerHandlers\";\nimport { useRefsManager } from \"./internal/useRefsManager\";\nimport { useStateReducer } from \"./internal/useStateReducer\";\nimport { stateChangeTypes } from \"./stateChangeTypes\";\n\nconst defaultItemToString = (item: any) => item?.title || String(item);\n\nexport const CascadingMenu = forwardRef<HTMLDivElement, CascadingMenuProps>(\n function CascadingMenu(props, ref) {\n const {\n children,\n className,\n initialSource: initialSourceProp,\n itemToString = defaultItemToString,\n onClose,\n onItemClick,\n onOpen,\n maxWidth = 544,\n minWidth = 200,\n delay = 300,\n rowHeight,\n tooltipEnterDelay = 1500,\n tooltipLeaveDelay = 0,\n height,\n rootPlacement,\n // Add this to offset x, y on popper open\n rootPlacementOffset,\n menuTriggerRef: anchorRefProp,\n open: openProp,\n getScreenBounds = defaultGetScreenBounds,\n disableMouseOutInteractions,\n disableClickAway,\n containingDocument = globalThis.document,\n source: sourceProp,\n } = props;\n const density = useDensity();\n\n const refsManager = useRefsManager();\n const childrenRef = useRef<HTMLElement | null>(null);\n const getMenuTriggerRef = useCallback(\n (): HTMLElement | null => anchorRefProp || childrenRef.current,\n [anchorRefProp],\n );\n\n const [menuSource] = useControlled({\n controlled: sourceProp,\n default: initialSourceProp,\n name: \"CascadingMenu\",\n state: \"source\",\n });\n\n const [isNavigatingWithKeyboard, setIsNavigatingWithKeyboard] =\n useState(false);\n\n const menusDataById = useMemo(\n () => (menuSource ? deriveFlatStateFromTree(menuSource) : {}),\n [menuSource],\n );\n\n const rootMenuId = useMemo(\n () =>\n Object.keys(menusDataById).find((id) => menusDataById[id].level === 0),\n [menusDataById],\n );\n\n const stateReducer = useStateReducer(\n menusDataById,\n isNavigatingWithKeyboard,\n );\n const [state, dispatch] = useReducer(stateReducer, []);\n const rootMenuState = state[0];\n\n // Call open and close callbacks after rendering as we know for sure whether the cascading menu is open or closed\n const prevState = usePrevious(state, undefined, []);\n const prevRootMenuState = prevState?.[0];\n useEffect(() => {\n if (!!rootMenuState !== !!prevRootMenuState) {\n if (!rootMenuState) {\n onClose?.();\n } else if (rootMenuState) {\n onOpen?.();\n }\n }\n });\n\n // Controlled opening/closing of the menu\n const openCloseMenu = useCallback(\n (open: boolean) => {\n if (rootMenuId) {\n dispatch({\n type: open\n ? CascadingMenuAction.OPEN_MENU\n : CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.MOUSE_TOGGLE,\n targetId: rootMenuId,\n });\n }\n },\n [rootMenuId],\n );\n // do not re-render every time if prop does not change\n useEffect(() => {\n if (openProp !== undefined && openProp !== !!rootMenuState) {\n openCloseMenu(openProp);\n }\n });\n\n const clickAwayNodes = disableClickAway\n ? null\n : () =>\n [getMenuTriggerRef(), ...refsManager.values()].filter(\n (node) => node !== null,\n ) as HTMLElement[];\n useClickAway(\n clickAwayNodes,\n containingDocument,\n () => {\n if (rootMenuId) {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.CLICKED_AWAY,\n targetId: rootMenuId,\n });\n }\n },\n () => {\n setIsNavigatingWithKeyboard(false);\n },\n );\n\n const handleResize = useEventCallback(() => {\n if (rootMenuState && rootMenuId) {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.ON_RESIZE,\n targetId: rootMenuId,\n });\n }\n });\n\n useEffect(() => {\n const win = ownerWindow(getMenuTriggerRef());\n\n win.addEventListener(\"resize\", handleResize);\n return () => {\n win.removeEventListener(\"resize\", handleResize);\n };\n }, [getMenuTriggerRef, handleResize]);\n\n // close the menu on item click via mouse\n const onItemClickCallback = useCallback(\n (sourceItem: MenuDescriptor, event: KeyboardEvent | MouseEvent) => {\n onItemClick?.(sourceItem, event);\n\n if (!isNavigatingWithKeyboard && rootMenuId) {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.ITEM_CLICKED,\n targetId: rootMenuId,\n });\n }\n },\n [isNavigatingWithKeyboard, onItemClick, rootMenuId],\n );\n\n // Set up event handlers on menu trigger if passed\n const setMenuTriggerRef = useCallback((node: HTMLElement) => {\n childrenRef.current = node;\n }, []);\n const handleRef = useForkRef(\n getRefFromChildren(children),\n setMenuTriggerRef,\n );\n\n const [onMenuTriggerClick, onMenuTriggerKeydown] = useMenuTriggerHandlers({\n dispatch,\n children,\n setIsNavigatingWithKeyboard,\n openCloseMenu,\n rootMenuState,\n rootMenuId,\n menusDataById,\n });\n\n const cloneMenuChildren = (cloneChildren: ReactNode) => {\n if (isValidElement(cloneChildren)) {\n const childrenProps = {\n ...cloneChildren.props,\n };\n\n if (openProp === undefined) {\n childrenProps.onClick = onMenuTriggerClick;\n childrenProps.onKeyDown = onMenuTriggerKeydown;\n }\n\n return cloneElement(cloneChildren, {\n ref: handleRef,\n ...childrenProps,\n });\n }\n return null;\n };\n\n const clonedChildren = cloneMenuChildren(children);\n\n const commonMenuProps = {\n className,\n delay,\n itemToString,\n maxWidth,\n minWidth,\n onItemClick: onItemClickCallback,\n dispatch,\n isNavigatingWithKeyboard,\n setIsNavigatingWithKeyboard,\n menusDataById,\n tooltipEnterDelay,\n tooltipLeaveDelay,\n rootPlacement,\n rootPlacementOffset,\n getScreenBounds,\n disableMouseOutInteractions,\n };\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: We want to run this if rootPlacementOffset changes.\n useEffect(() => {\n if (!openProp) {\n setIsNavigatingWithKeyboard(false);\n }\n }, [openProp, rootPlacementOffset]);\n\n return Object.keys(menusDataById).length > 0 ? (\n <>\n {clonedChildren || null}\n {Object.values(state).map((menuState) => {\n const data = menusDataById[menuState.id];\n\n const isRoot = data.level === 0;\n const parentElement = isRoot\n ? getMenuTriggerRef()\n : refsManager.get(data?.parentId ?? \"\");\n\n const isChildMenuOpen = !!state[data.level + 1];\n return (\n <CascadingMenuList\n {...commonMenuProps}\n data={data}\n height={height}\n highlightedItemIndex={menuState.highlightedItemIndex}\n isChildMenuOpen={isChildMenuOpen}\n isRoot={isRoot}\n key={`${density}${menuState.id}`}\n menuId={menuState.id}\n menuTriggerRef={getMenuTriggerRef()}\n parentElement={parentElement}\n ref={isRoot ? ref : null}\n refsManager={refsManager}\n rowHeight={rowHeight}\n />\n );\n })}\n </>\n ) : null;\n },\n);\n"],"names":["forwardRef","CascadingMenu","defaultGetScreenBounds","useDensity","useRefsManager","useRef","useCallback","useControlled","useState","useMemo","deriveFlatStateFromTree","useStateReducer","useReducer","usePrevious","useEffect","CascadingMenuAction","stateChangeTypes","useClickAway","useEventCallback","ownerWindow","useForkRef","getRefFromChildren","useMenuTriggerHandlers","isValidElement","cloneElement","jsxs","Fragment","createElement","CascadingMenuList"],"mappings":"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"}
@@ -61,10 +61,8 @@ const DefaultMenuItem = react.forwardRef(
61
61
  const menuText = itemToString(sourceItem);
62
62
  react.useEffect(() => {
63
63
  const element = menuTextRef.current;
64
- if (element) {
65
- if (element.offsetWidth < element.scrollWidth) {
66
- setHasTooltip(true);
67
- }
64
+ if (element && menuText != null) {
65
+ setHasTooltip(element.offsetWidth < element.scrollWidth);
68
66
  }
69
67
  }, [menuText]);
70
68
  const isDisabled = sourceItem.disabled;
@@ -1 +1 @@
1
- {"version":3,"file":"CascadingMenuItem.js","sources":["../src/cascading-menu/CascadingMenuItem.tsx"],"sourcesContent":["import { makePrefixer, Tooltip, useIcon } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ListItem, type ListItemProps } from \"../list-deprecated\";\nimport cascadingMenuItemCss from \"./CascadingMenuItem.css\";\nimport type { MenuDescriptor } from \"./CascadingMenuProps\";\n\nconst noop = () => undefined;\nconst withBaseName = makePrefixer(\"saltCascadingMenuItem\");\n\nconst getIcon = (sourceItem: MenuDescriptor, isDisabled = false) => {\n const CustomIcon = sourceItem.icon;\n if (CustomIcon) {\n return (\n <CustomIcon\n className={clsx(withBaseName(\"menuItemStartAdornment\"), {\n [withBaseName(\"menuItemDisabled\")]: isDisabled,\n })}\n />\n );\n }\n return null;\n};\n\nexport interface MenuItemProps extends ListItemProps<MenuDescriptor> {\n blurSelected: boolean;\n className?: string;\n hasEndAdornment: boolean;\n hasScrollbar: boolean;\n hasStartAdornment: boolean;\n hasSubMenu: boolean;\n isInteracted: boolean;\n isChildMenuOpen: boolean;\n isNavigatingWithKeyboard: boolean;\n itemToString: Required<ListItemProps<MenuDescriptor>>[\"itemToString\"];\n onItemClick?: (\n sourceItem: MenuDescriptor,\n event: MouseEvent | KeyboardEvent,\n ) => void;\n sourceItem: MenuDescriptor;\n tooltipEnterDelay: number;\n tooltipLeaveDelay: number;\n}\n\nexport const DefaultMenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n (props, ref) => {\n const {\n blurSelected,\n className,\n hasEndAdornment,\n hasScrollbar,\n hasStartAdornment,\n onItemClick,\n itemToString,\n isInteracted,\n isNavigatingWithKeyboard,\n isChildMenuOpen,\n hasSubMenu,\n sourceItem,\n tooltipEnterDelay,\n tooltipLeaveDelay,\n ...restProps\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-cascading-menu-item\",\n css: cascadingMenuItemCss,\n window: targetWindow,\n });\n const { ExpandGroupIcon } = useIcon();\n const menuTextRef = useRef<HTMLDivElement>(null);\n const [hasTooltip, setHasTooltip] = useState(false);\n const menuText = itemToString(sourceItem);\n\n useEffect(() => {\n const element = menuTextRef.current;\n if (element) {\n if (element.offsetWidth < element.scrollWidth) {\n setHasTooltip(true);\n }\n }\n }, [menuText]);\n\n const isDisabled = sourceItem.disabled;\n const divider = sourceItem.divider;\n\n const onClick = isDisabled || hasSubMenu ? noop : onItemClick;\n\n const handleOnClick = (event: MouseEvent) => {\n if (!isDisabled && !hasSubMenu) {\n onClick?.(sourceItem, event);\n }\n };\n const interactionClasses = isNavigatingWithKeyboard\n ? {\n [withBaseName(\"menuItemKeyboardActive\")]:\n !isDisabled && isInteracted && !blurSelected,\n [withBaseName(\"menuItemKeyboardDisabled\")]:\n isDisabled && isInteracted,\n }\n : {\n [withBaseName(\"menuItemHover\")]: !isDisabled && !blurSelected,\n };\n\n const icon = hasStartAdornment ? getIcon(sourceItem, isDisabled) : null;\n const tooltipTitle = sourceItem.tooltip || menuText;\n\n return (\n <Tooltip\n disableFocusListener\n disableHoverListener\n enterDelay={tooltipEnterDelay}\n leaveDelay={tooltipLeaveDelay}\n placement=\"top\"\n disabled={!tooltipTitle || !hasTooltip || isChildMenuOpen}\n content={tooltipTitle}\n >\n <ListItem\n ref={ref}\n aria-expanded={isChildMenuOpen || undefined}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"menuItemDivider\")]: divider,\n [withBaseName(\"menuItemBlurSelected\")]: blurSelected,\n [withBaseName(\"menuItemSelected\")]:\n !isDisabled && !hasSubMenu && isInteracted,\n ...interactionClasses,\n [withBaseName(\"menuItemWithScrollbar\")]: hasScrollbar,\n },\n className,\n )}\n disabled={isDisabled}\n role=\"menuitem\"\n onClick={handleOnClick}\n item={sourceItem}\n // TODO highlightProps - see original code?\n {...restProps}\n >\n {hasStartAdornment && (\n <div className={withBaseName(\"menuItemStartAdornmentContainer\")}>\n {icon}\n </div>\n )}\n <div\n className={clsx(withBaseName(\"menuItemText\"), {\n [withBaseName(\"menuItemDisabled\")]: isDisabled,\n })}\n ref={menuTextRef}\n >\n {menuText}\n </div>\n {hasEndAdornment && (\n <div\n className={clsx(withBaseName(\"menuItemEndAdornmentContainer\"), {\n [withBaseName(\"menuItemAdornmentHidden\")]: !hasSubMenu,\n })}\n >\n <ExpandGroupIcon\n className={clsx(withBaseName(\"menuItemEndAdornment\"), {\n [withBaseName(\"menuItemDisabled\")]: isDisabled,\n })}\n />\n </div>\n )}\n {divider && <div role=\"separator\" />}\n </ListItem>\n </Tooltip>\n );\n },\n);\n"],"names":["makePrefixer","jsx","clsx","forwardRef","useWindow","useComponentCssInjection","cascadingMenuItemCss","useIcon","useRef","useState","useEffect","Tooltip","jsxs","ListItem"],"mappings":"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"}
1
+ {"version":3,"file":"CascadingMenuItem.js","sources":["../src/cascading-menu/CascadingMenuItem.tsx"],"sourcesContent":["import { makePrefixer, Tooltip, useIcon } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ListItem, type ListItemProps } from \"../list-deprecated\";\nimport cascadingMenuItemCss from \"./CascadingMenuItem.css\";\nimport type { MenuDescriptor } from \"./CascadingMenuProps\";\n\nconst noop = () => undefined;\nconst withBaseName = makePrefixer(\"saltCascadingMenuItem\");\n\nconst getIcon = (sourceItem: MenuDescriptor, isDisabled = false) => {\n const CustomIcon = sourceItem.icon;\n if (CustomIcon) {\n return (\n <CustomIcon\n className={clsx(withBaseName(\"menuItemStartAdornment\"), {\n [withBaseName(\"menuItemDisabled\")]: isDisabled,\n })}\n />\n );\n }\n return null;\n};\n\nexport interface MenuItemProps extends ListItemProps<MenuDescriptor> {\n blurSelected: boolean;\n className?: string;\n hasEndAdornment: boolean;\n hasScrollbar: boolean;\n hasStartAdornment: boolean;\n hasSubMenu: boolean;\n isInteracted: boolean;\n isChildMenuOpen: boolean;\n isNavigatingWithKeyboard: boolean;\n itemToString: Required<ListItemProps<MenuDescriptor>>[\"itemToString\"];\n onItemClick?: (\n sourceItem: MenuDescriptor,\n event: MouseEvent | KeyboardEvent,\n ) => void;\n sourceItem: MenuDescriptor;\n tooltipEnterDelay: number;\n tooltipLeaveDelay: number;\n}\n\nexport const DefaultMenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n (props, ref) => {\n const {\n blurSelected,\n className,\n hasEndAdornment,\n hasScrollbar,\n hasStartAdornment,\n onItemClick,\n itemToString,\n isInteracted,\n isNavigatingWithKeyboard,\n isChildMenuOpen,\n hasSubMenu,\n sourceItem,\n tooltipEnterDelay,\n tooltipLeaveDelay,\n ...restProps\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-cascading-menu-item\",\n css: cascadingMenuItemCss,\n window: targetWindow,\n });\n const { ExpandGroupIcon } = useIcon();\n const menuTextRef = useRef<HTMLDivElement>(null);\n const [hasTooltip, setHasTooltip] = useState(false);\n const menuText = itemToString(sourceItem);\n\n useEffect(() => {\n const element = menuTextRef.current;\n if (element && menuText != null) {\n setHasTooltip(element.offsetWidth < element.scrollWidth);\n }\n }, [menuText]);\n\n const isDisabled = sourceItem.disabled;\n const divider = sourceItem.divider;\n\n const onClick = isDisabled || hasSubMenu ? noop : onItemClick;\n\n const handleOnClick = (event: MouseEvent) => {\n if (!isDisabled && !hasSubMenu) {\n onClick?.(sourceItem, event);\n }\n };\n const interactionClasses = isNavigatingWithKeyboard\n ? {\n [withBaseName(\"menuItemKeyboardActive\")]:\n !isDisabled && isInteracted && !blurSelected,\n [withBaseName(\"menuItemKeyboardDisabled\")]:\n isDisabled && isInteracted,\n }\n : {\n [withBaseName(\"menuItemHover\")]: !isDisabled && !blurSelected,\n };\n\n const icon = hasStartAdornment ? getIcon(sourceItem, isDisabled) : null;\n const tooltipTitle = sourceItem.tooltip || menuText;\n\n return (\n <Tooltip\n disableFocusListener\n disableHoverListener\n enterDelay={tooltipEnterDelay}\n leaveDelay={tooltipLeaveDelay}\n placement=\"top\"\n disabled={!tooltipTitle || !hasTooltip || isChildMenuOpen}\n content={tooltipTitle}\n >\n <ListItem\n ref={ref}\n aria-expanded={isChildMenuOpen || undefined}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"menuItemDivider\")]: divider,\n [withBaseName(\"menuItemBlurSelected\")]: blurSelected,\n [withBaseName(\"menuItemSelected\")]:\n !isDisabled && !hasSubMenu && isInteracted,\n ...interactionClasses,\n [withBaseName(\"menuItemWithScrollbar\")]: hasScrollbar,\n },\n className,\n )}\n disabled={isDisabled}\n role=\"menuitem\"\n onClick={handleOnClick}\n item={sourceItem}\n // TODO highlightProps - see original code?\n {...restProps}\n >\n {hasStartAdornment && (\n <div className={withBaseName(\"menuItemStartAdornmentContainer\")}>\n {icon}\n </div>\n )}\n <div\n className={clsx(withBaseName(\"menuItemText\"), {\n [withBaseName(\"menuItemDisabled\")]: isDisabled,\n })}\n ref={menuTextRef}\n >\n {menuText}\n </div>\n {hasEndAdornment && (\n <div\n className={clsx(withBaseName(\"menuItemEndAdornmentContainer\"), {\n [withBaseName(\"menuItemAdornmentHidden\")]: !hasSubMenu,\n })}\n >\n <ExpandGroupIcon\n className={clsx(withBaseName(\"menuItemEndAdornment\"), {\n [withBaseName(\"menuItemDisabled\")]: isDisabled,\n })}\n />\n </div>\n )}\n {/** biome-ignore lint/a11y/useAriaPropsForRole: Separator is not focusable, so it doesn't need aria-valuenow. */}\n {divider && <div role=\"separator\" />}\n </ListItem>\n </Tooltip>\n );\n },\n);\n"],"names":["makePrefixer","jsx","clsx","forwardRef","useWindow","useComponentCssInjection","cascadingMenuItemCss","useIcon","useRef","useState","useEffect","Tooltip","jsxs","ListItem"],"mappings":"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"}
@@ -63,8 +63,7 @@ const CascadingMenuList = react.forwardRef(function CascadingMenuList2(props, re
63
63
  },
64
64
  [refsManager, menuId]
65
65
  );
66
- const sizeStackable = 36;
67
- const defaultRowHeight = sizeStackable;
66
+ const defaultRowHeight = 36;
68
67
  const spacing = 8;
69
68
  const isMenuActiveState = react.useState(true);
70
69
  const [isMenuActive, setIsMenuActive] = isMenuActiveState;
@@ -1 +1 @@
1
- {"version":3,"file":"CascadingMenuList.js","sources":["../src/cascading-menu/CascadingMenuList.tsx"],"sourcesContent":["import {\n type UseFloatingUIProps,\n useFloatingUI,\n useForkRef,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { List, type ListProps } from \"../list-deprecated\";\nimport { Portal } from \"../portal\";\nimport { useWindow as usePortalWindow } from \"../window\";\nimport { DefaultMenuItem, type MenuItemProps } from \"./CascadingMenuItem\";\nimport cascadingMenuListCss from \"./CascadingMenuList.css\";\nimport { CascadingMenuAction } from \"./internal/CascadingMenuAction\";\nimport { getKeyDownHandlers } from \"./internal/keydownHandlers\";\nimport {\n getHeight,\n getMaxHeight,\n type screenBounds,\n} from \"./internal/menuPositioning\";\nimport { hasIcon, hasSubMenu, type menuState } from \"./internal/stateUtils\";\nimport { useMouseHandlers } from \"./internal/useMouseHandlers\";\nimport type { refsManager } from \"./internal/useRefsManager\";\nimport { stateChangeTypes } from \"./stateChangeTypes\";\n\nexport interface CascadingMenuListProps {\n className?: string;\n data: menuState;\n delay?: number;\n disableMouseOutInteractions?: boolean;\n // TODO any\n dispatch: (action: any) => void;\n getBoundingClientRect?: (element: HTMLElement) => DOMRect;\n getScreenBounds?: () => screenBounds;\n height?: number;\n highlightedItemIndex: number | null;\n isChildMenuOpen: boolean;\n itemToString: MenuItemProps[\"itemToString\"];\n isNavigatingWithKeyboard: boolean;\n isRoot: boolean;\n maxWidth?: ListProps[\"maxWidth\"];\n menuId: string;\n menuTriggerRef: HTMLElement | null;\n minWidth?: ListProps[\"minWidth\"];\n onItemClick?: MenuItemProps[\"onItemClick\"];\n parentElement?: HTMLElement | null;\n refsManager: refsManager;\n rootPlacement?: UseFloatingUIProps[\"placement\"];\n rootPlacementOffset?: string;\n rowHeight?: number;\n setIsNavigatingWithKeyboard: (value: boolean) => void;\n tooltipEnterDelay: number;\n tooltipLeaveDelay: number;\n}\n\nexport const CascadingMenuList = forwardRef<\n HTMLDivElement,\n CascadingMenuListProps\n>(function CascadingMenuList(props, ref) {\n const {\n className,\n maxWidth,\n minWidth,\n itemToString,\n onItemClick,\n refsManager,\n dispatch,\n rowHeight: rowHeightProp,\n isNavigatingWithKeyboard,\n data,\n tooltipEnterDelay,\n tooltipLeaveDelay,\n height: heightProp,\n isChildMenuOpen,\n isRoot,\n highlightedItemIndex,\n menuId,\n parentElement = null,\n getScreenBounds,\n disableMouseOutInteractions,\n rootPlacementOffset,\n rootPlacement = \"bottom-start\",\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-cascading-menu-list\",\n css: cascadingMenuListCss,\n window: targetWindow,\n });\n\n const baseClass = \"saltCascadingMenuList\";\n\n const [menuRef, setInternalMenuRef] = useState<HTMLElement | null>(null);\n const setMenuRef = useCallback(\n (node: HTMLElement) => {\n refsManager.set(menuId, node);\n },\n [refsManager, menuId],\n );\n\n // TODO removed useCharacteristic here\n const sizeStackable = 36;\n const defaultRowHeight = sizeStackable;\n\n // TODO removed useCharacteristic here\n const spacing = 8;\n\n const isMenuActiveState = useState(true);\n const [isMenuActive, setIsMenuActive] = isMenuActiveState;\n const listRef = useForkRef<HTMLElement>(ref, setInternalMenuRef);\n const handleRef = useForkRef(setMenuRef, listRef);\n\n useEffect(() => {\n if (menuRef?.focus) {\n // timeout prevents scrolling issue by waiting a split second\n // and menu should be correctly positioned by then and\n // focusing popper content offscreen will not scroll page\n // it would be better to maybe use popper onUpdate callback\n // or some kind of polling mechanism to confirm placement is\n // correct before focus call\n const id = setTimeout(() => {\n menuRef.focus();\n });\n return () => {\n clearTimeout(id);\n };\n }\n }, [menuRef, rootPlacementOffset]);\n\n const handleKeyDown = getKeyDownHandlers(props, setIsMenuActive);\n\n const onFocusHandler = useCallback(() => {\n setIsMenuActive(true);\n // When navigating via keyboard on open highlight first time in the list\n if (isNavigatingWithKeyboard) {\n if (!highlightedItemIndex) {\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.KEYBOARD_NAV_AUTO_FOCUS,\n targetId: menuId,\n highlightedItemIndex: 0,\n });\n }\n }\n }, [\n setIsMenuActive,\n isNavigatingWithKeyboard,\n highlightedItemIndex,\n dispatch,\n menuId,\n ]);\n\n const [handleMouseMove, handleMouseOut] = useMouseHandlers(\n props,\n isMenuActiveState,\n menuRef,\n );\n\n const hasEndAdornment = useMemo(\n () => data.menuItems.some(hasSubMenu),\n [data],\n );\n const hasStartAdornment = useMemo(() => data.menuItems.some(hasIcon), [data]);\n const rowHeight = rowHeightProp != null ? rowHeightProp : defaultRowHeight;\n const maxHeight = getMaxHeight(heightProp, spacing, getScreenBounds);\n const calculatedMenuHeight = rowHeight * data.menuItems.length;\n const menuHeight = getHeight(heightProp, calculatedMenuHeight, maxHeight);\n const hasScrollbar = menuHeight >= maxHeight;\n\n // menu container size is 2px larger than the list to include the border\n const menuContainerHeight = menuHeight + 2;\n const Window = usePortalWindow();\n const { reference, floating, x, y, strategy } = useFloatingUI({\n placement: isRoot ? rootPlacement : \"right-start\",\n });\n useIsomorphicLayoutEffect(() => {\n if (parentElement) {\n reference(\n isRoot\n ? parentElement\n : parentElement.querySelector(\n `#${\n parentElement.getAttribute(\"aria-activedescendant\") as string\n }`,\n ),\n );\n }\n }, [reference, isRoot, parentElement]);\n\n if (parentElement === null) {\n return null;\n }\n\n return (\n <Portal>\n <Window\n className={`${baseClass}-popper`}\n id={menuId}\n style={{\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n }}\n ref={floating}\n >\n <List\n className={clsx(baseClass, className)}\n height={menuContainerHeight}\n highlightedIndex={\n highlightedItemIndex === null ? -1 : highlightedItemIndex\n }\n id={menuId}\n itemHeight={rowHeight}\n itemToString={itemToString}\n key={menuId}\n listRef={handleRef}\n maxWidth={maxWidth}\n minWidth={minWidth}\n onFocus={onFocusHandler}\n onKeyDown={handleKeyDown}\n onMouseOut={disableMouseOutInteractions ? undefined : handleMouseOut}\n role=\"menu\"\n width=\"auto\"\n >\n {data.menuItems.map((menuItem, idx) => {\n const isInteracted = highlightedItemIndex === idx;\n return (\n <DefaultMenuItem\n blurSelected={!isMenuActive && isInteracted}\n hasEndAdornment={hasEndAdornment}\n hasScrollbar={hasScrollbar}\n hasStartAdornment={hasStartAdornment}\n hasSubMenu={hasSubMenu(menuItem)}\n isChildMenuOpen={isChildMenuOpen}\n isInteracted={isInteracted}\n isNavigatingWithKeyboard={isNavigatingWithKeyboard}\n itemToString={itemToString}\n key={menuItem.id}\n onItemClick={onItemClick}\n onMouseMove={() => handleMouseMove(idx)}\n sourceItem={menuItem}\n tooltipEnterDelay={tooltipEnterDelay}\n tooltipLeaveDelay={tooltipLeaveDelay}\n />\n );\n })}\n </List>\n </Window>\n </Portal>\n );\n});\n"],"names":["forwardRef","CascadingMenuList","useWindow","useComponentCssInjection","cascadingMenuListCss","useState","useCallback","useForkRef","useEffect","getKeyDownHandlers","CascadingMenuAction","stateChangeTypes","useMouseHandlers","useMemo","hasSubMenu","hasIcon","getMaxHeight","getHeight","usePortalWindow","useFloatingUI","useIsomorphicLayoutEffect","Portal","jsx","List","clsx","DefaultMenuItem"],"mappings":"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"}
1
+ {"version":3,"file":"CascadingMenuList.js","sources":["../src/cascading-menu/CascadingMenuList.tsx"],"sourcesContent":["import {\n type UseFloatingUIProps,\n useFloatingUI,\n useForkRef,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type Dispatch,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { List, type ListProps } from \"../list-deprecated\";\nimport { Portal } from \"../portal\";\nimport { useWindow as usePortalWindow } from \"../window\";\nimport { DefaultMenuItem, type MenuItemProps } from \"./CascadingMenuItem\";\nimport cascadingMenuListCss from \"./CascadingMenuList.css\";\nimport {\n CascadingMenuAction,\n type menuAction,\n} from \"./internal/CascadingMenuAction\";\nimport { getKeyDownHandlers } from \"./internal/keydownHandlers\";\nimport {\n getHeight,\n getMaxHeight,\n type screenBounds,\n} from \"./internal/menuPositioning\";\nimport { hasIcon, hasSubMenu, type menuState } from \"./internal/stateUtils\";\nimport { useMouseHandlers } from \"./internal/useMouseHandlers\";\nimport type { refsManager } from \"./internal/useRefsManager\";\nimport { stateChangeTypes } from \"./stateChangeTypes\";\n\nexport interface CascadingMenuListProps {\n className?: string;\n data: menuState;\n delay?: number;\n disableMouseOutInteractions?: boolean;\n // TODO any\n dispatch: Dispatch<menuAction>;\n getBoundingClientRect?: (element: HTMLElement) => DOMRect;\n getScreenBounds?: () => screenBounds;\n height?: number;\n highlightedItemIndex: number | null;\n isChildMenuOpen: boolean;\n itemToString: MenuItemProps[\"itemToString\"];\n isNavigatingWithKeyboard: boolean;\n isRoot: boolean;\n maxWidth?: ListProps[\"maxWidth\"];\n menuId: string;\n menuTriggerRef: HTMLElement | null;\n minWidth?: ListProps[\"minWidth\"];\n onItemClick?: MenuItemProps[\"onItemClick\"];\n parentElement?: HTMLElement | null;\n refsManager: refsManager;\n rootPlacement?: UseFloatingUIProps[\"placement\"];\n rootPlacementOffset?: string;\n rowHeight?: number;\n setIsNavigatingWithKeyboard: (value: boolean) => void;\n tooltipEnterDelay: number;\n tooltipLeaveDelay: number;\n}\n\nexport const CascadingMenuList = forwardRef<\n HTMLDivElement,\n CascadingMenuListProps\n>(function CascadingMenuList(props, ref) {\n const {\n className,\n maxWidth,\n minWidth,\n itemToString,\n onItemClick,\n refsManager,\n dispatch,\n rowHeight: rowHeightProp,\n isNavigatingWithKeyboard,\n data,\n tooltipEnterDelay,\n tooltipLeaveDelay,\n height: heightProp,\n isChildMenuOpen,\n isRoot,\n highlightedItemIndex,\n menuId,\n parentElement = null,\n getScreenBounds,\n disableMouseOutInteractions,\n rootPlacementOffset,\n rootPlacement = \"bottom-start\",\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-cascading-menu-list\",\n css: cascadingMenuListCss,\n window: targetWindow,\n });\n\n const baseClass = \"saltCascadingMenuList\";\n\n const [menuRef, setInternalMenuRef] = useState<HTMLElement | null>(null);\n const setMenuRef = useCallback(\n (node: HTMLDivElement) => {\n refsManager.set(menuId, node);\n },\n [refsManager, menuId],\n );\n\n // TODO removed useCharacteristic here\n const defaultRowHeight = 36;\n\n // TODO removed useCharacteristic here\n const spacing = 8;\n\n const isMenuActiveState = useState(true);\n const [isMenuActive, setIsMenuActive] = isMenuActiveState;\n const listRef = useForkRef<HTMLDivElement>(ref, setInternalMenuRef);\n const handleRef = useForkRef<HTMLDivElement>(setMenuRef, listRef);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: We want to run this if rootPlacementOffset changes.\n useEffect(() => {\n if (menuRef?.focus) {\n // timeout prevents scrolling issue by waiting a split second\n // and menu should be correctly positioned by then and\n // focusing popper content offscreen will not scroll page\n // it would be better to maybe use popper onUpdate callback\n // or some kind of polling mechanism to confirm placement is\n // correct before focus call\n const id = setTimeout(() => {\n menuRef.focus();\n });\n return () => {\n clearTimeout(id);\n };\n }\n }, [menuRef, rootPlacementOffset]);\n\n const handleKeyDown = getKeyDownHandlers(props, setIsMenuActive);\n\n const onFocusHandler = useCallback(() => {\n setIsMenuActive(true);\n // When navigating via keyboard on open highlight first time in the list\n if (isNavigatingWithKeyboard) {\n if (!highlightedItemIndex) {\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.KEYBOARD_NAV_AUTO_FOCUS,\n targetId: menuId,\n highlightedItemIndex: 0,\n });\n }\n }\n }, [\n setIsMenuActive,\n isNavigatingWithKeyboard,\n highlightedItemIndex,\n dispatch,\n menuId,\n ]);\n\n const [handleMouseMove, handleMouseOut] = useMouseHandlers(\n props,\n isMenuActiveState,\n menuRef,\n );\n\n const hasEndAdornment = useMemo(\n () => data.menuItems.some(hasSubMenu),\n [data],\n );\n const hasStartAdornment = useMemo(() => data.menuItems.some(hasIcon), [data]);\n const rowHeight = rowHeightProp != null ? rowHeightProp : defaultRowHeight;\n const maxHeight = getMaxHeight(heightProp, spacing, getScreenBounds);\n const calculatedMenuHeight = rowHeight * data.menuItems.length;\n const menuHeight = getHeight(heightProp, calculatedMenuHeight, maxHeight);\n const hasScrollbar = menuHeight >= maxHeight;\n\n // menu container size is 2px larger than the list to include the border\n const menuContainerHeight = menuHeight + 2;\n const Window = usePortalWindow();\n const { reference, floating, x, y, strategy } = useFloatingUI({\n placement: isRoot ? rootPlacement : \"right-start\",\n });\n useIsomorphicLayoutEffect(() => {\n if (parentElement) {\n reference(\n isRoot\n ? parentElement\n : parentElement.querySelector(\n `#${\n parentElement.getAttribute(\"aria-activedescendant\") as string\n }`,\n ),\n );\n }\n }, [reference, isRoot, parentElement]);\n\n if (parentElement === null) {\n return null;\n }\n\n return (\n <Portal>\n <Window\n className={`${baseClass}-popper`}\n id={menuId}\n style={{\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n }}\n ref={floating}\n >\n <List\n className={clsx(baseClass, className)}\n height={menuContainerHeight}\n highlightedIndex={\n highlightedItemIndex === null ? -1 : highlightedItemIndex\n }\n id={menuId}\n itemHeight={rowHeight}\n itemToString={itemToString}\n key={menuId}\n listRef={handleRef}\n maxWidth={maxWidth}\n minWidth={minWidth}\n onFocus={onFocusHandler}\n onKeyDown={handleKeyDown}\n onMouseOut={disableMouseOutInteractions ? undefined : handleMouseOut}\n role=\"menu\"\n width=\"auto\"\n >\n {data.menuItems.map((menuItem, idx) => {\n const isInteracted = highlightedItemIndex === idx;\n return (\n <DefaultMenuItem\n blurSelected={!isMenuActive && isInteracted}\n hasEndAdornment={hasEndAdornment}\n hasScrollbar={hasScrollbar}\n hasStartAdornment={hasStartAdornment}\n hasSubMenu={hasSubMenu(menuItem)}\n isChildMenuOpen={isChildMenuOpen}\n isInteracted={isInteracted}\n isNavigatingWithKeyboard={isNavigatingWithKeyboard}\n itemToString={itemToString}\n key={menuItem.id}\n onItemClick={onItemClick}\n onMouseMove={() => handleMouseMove(idx)}\n sourceItem={menuItem}\n tooltipEnterDelay={tooltipEnterDelay}\n tooltipLeaveDelay={tooltipLeaveDelay}\n />\n );\n })}\n </List>\n </Window>\n </Portal>\n );\n});\n"],"names":["forwardRef","CascadingMenuList","useWindow","useComponentCssInjection","cascadingMenuListCss","useState","useCallback","useForkRef","useEffect","getKeyDownHandlers","CascadingMenuAction","stateChangeTypes","useMouseHandlers","useMemo","hasSubMenu","hasIcon","getMaxHeight","getHeight","usePortalWindow","useFloatingUI","useIsomorphicLayoutEffect","Portal","jsx","List","clsx","DefaultMenuItem"],"mappings":"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"}
@@ -38,6 +38,9 @@ function useMenuTriggerHandlers({
38
38
  event.stopPropagation();
39
39
  event.preventDefault();
40
40
  setIsNavigatingWithKeyboard(true);
41
+ if (!rootMenuId) {
42
+ break;
43
+ }
41
44
  dispatch({
42
45
  type: rootMenuState ? CascadingMenuAction.CascadingMenuAction.CLOSE_MENU : CascadingMenuAction.CascadingMenuAction.OPEN_MENU,
43
46
  cause: stateChangeTypes.stateChangeTypes.KEYBOARD_TOGGLE,
@@ -48,7 +51,7 @@ function useMenuTriggerHandlers({
48
51
  event.stopPropagation();
49
52
  event.preventDefault();
50
53
  setIsNavigatingWithKeyboard(true);
51
- if (rootMenuState) {
54
+ if (rootMenuState || !rootMenuId) {
52
55
  break;
53
56
  }
54
57
  dispatch({
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuTriggerHandlers.js","sources":["../src/cascading-menu/internal/useMenuTriggerHandlers.ts"],"sourcesContent":["import {\n type HTMLAttributes,\n isValidElement,\n type KeyboardEvent,\n type MouseEvent,\n} from \"react\";\nimport { useEventCallback } from \"../../utils\";\nimport type { CascadingMenuProps } from \"../CascadingMenuProps\";\nimport { stateChangeTypes } from \"../stateChangeTypes\";\nimport { CascadingMenuAction } from \"./CascadingMenuAction\";\nimport type { menuState } from \"./stateUtils\";\nimport type { stateItem } from \"./useStateReducer\";\n\ninterface useMenuTriggerHandlersProps {\n dispatch: (action: any) => void;\n children: CascadingMenuProps[\"children\"];\n setIsNavigatingWithKeyboard: (value: boolean) => void;\n openCloseMenu: (open: boolean) => void;\n rootMenuState: stateItem;\n rootMenuId: string | undefined;\n menusDataById: Record<string, menuState>;\n}\n\nexport function useMenuTriggerHandlers({\n dispatch,\n children,\n setIsNavigatingWithKeyboard,\n openCloseMenu,\n rootMenuState,\n rootMenuId,\n menusDataById = {},\n}: useMenuTriggerHandlersProps) {\n const handleOnClick = useEventCallback((event: MouseEvent<HTMLElement>) => {\n const { type } = event;\n\n setIsNavigatingWithKeyboard(false);\n if (type === \"click\") {\n if (isValidElement(children)) {\n const childrenProps = children.props as HTMLAttributes<HTMLElement>;\n childrenProps.onClick?.(event);\n }\n openCloseMenu(!rootMenuState);\n }\n });\n\n const handleOnKeydown = useEventCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const { key } = event;\n\n switch (key) {\n case \"Spacebar\":\n case \" \":\n case \"Enter\":\n event.stopPropagation();\n event.preventDefault();\n setIsNavigatingWithKeyboard(true);\n dispatch({\n type: rootMenuState\n ? CascadingMenuAction.CLOSE_MENU\n : CascadingMenuAction.OPEN_MENU,\n cause: stateChangeTypes.KEYBOARD_TOGGLE,\n targetId: rootMenuId,\n });\n break;\n case \"ArrowDown\":\n event.stopPropagation();\n event.preventDefault();\n setIsNavigatingWithKeyboard(true);\n if (rootMenuState) {\n break;\n }\n dispatch({\n type: CascadingMenuAction.OPEN_MENU,\n cause: stateChangeTypes.KEYBOARD_TOGGLE,\n targetId: rootMenuId,\n });\n break;\n case \"ArrowUp\":\n event.stopPropagation();\n event.preventDefault();\n setIsNavigatingWithKeyboard(true);\n if (rootMenuState || !rootMenuId) {\n break;\n }\n dispatch({\n type: CascadingMenuAction.OPEN_MENU,\n cause: stateChangeTypes.KEYBOARD_TOGGLE,\n targetId: rootMenuId,\n });\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.ITEM_KEYDOWN_ARROW_UP,\n targetId: rootMenuId,\n highlightedItemIndex:\n menusDataById[rootMenuId].menuItems.length - 1,\n });\n break;\n default:\n break;\n }\n\n if (isValidElement(children)) {\n const childrenProps = children.props as HTMLAttributes<HTMLElement>;\n childrenProps.onKeyDown?.(event);\n }\n },\n );\n\n return [handleOnClick, handleOnKeydown] as const;\n}\n"],"names":["useEventCallback","isValidElement","CascadingMenuAction","stateChangeTypes"],"mappings":"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"}
1
+ {"version":3,"file":"useMenuTriggerHandlers.js","sources":["../src/cascading-menu/internal/useMenuTriggerHandlers.ts"],"sourcesContent":["import {\n type Dispatch,\n type HTMLAttributes,\n isValidElement,\n type KeyboardEvent,\n type MouseEvent,\n} from \"react\";\nimport { useEventCallback } from \"../../utils\";\nimport type { CascadingMenuProps } from \"../CascadingMenuProps\";\nimport { stateChangeTypes } from \"../stateChangeTypes\";\nimport { CascadingMenuAction, type menuAction } from \"./CascadingMenuAction\";\nimport type { menuState } from \"./stateUtils\";\nimport type { stateItem } from \"./useStateReducer\";\n\ninterface useMenuTriggerHandlersProps {\n dispatch: Dispatch<menuAction>;\n children: CascadingMenuProps[\"children\"];\n setIsNavigatingWithKeyboard: (value: boolean) => void;\n openCloseMenu: (open: boolean) => void;\n rootMenuState: stateItem;\n rootMenuId: string | undefined;\n menusDataById: Record<string, menuState>;\n}\n\nexport function useMenuTriggerHandlers({\n dispatch,\n children,\n setIsNavigatingWithKeyboard,\n openCloseMenu,\n rootMenuState,\n rootMenuId,\n menusDataById = {},\n}: useMenuTriggerHandlersProps) {\n const handleOnClick = useEventCallback((event: MouseEvent<HTMLElement>) => {\n const { type } = event;\n\n setIsNavigatingWithKeyboard(false);\n if (type === \"click\") {\n if (isValidElement(children)) {\n const childrenProps = children.props as HTMLAttributes<HTMLElement>;\n childrenProps.onClick?.(event);\n }\n openCloseMenu(!rootMenuState);\n }\n });\n\n const handleOnKeydown = useEventCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const { key } = event;\n\n switch (key) {\n case \"Spacebar\":\n case \" \":\n case \"Enter\":\n event.stopPropagation();\n event.preventDefault();\n setIsNavigatingWithKeyboard(true);\n if (!rootMenuId) {\n break;\n }\n dispatch({\n type: rootMenuState\n ? CascadingMenuAction.CLOSE_MENU\n : CascadingMenuAction.OPEN_MENU,\n cause: stateChangeTypes.KEYBOARD_TOGGLE,\n targetId: rootMenuId,\n });\n break;\n case \"ArrowDown\":\n event.stopPropagation();\n event.preventDefault();\n setIsNavigatingWithKeyboard(true);\n if (rootMenuState || !rootMenuId) {\n break;\n }\n dispatch({\n type: CascadingMenuAction.OPEN_MENU,\n cause: stateChangeTypes.KEYBOARD_TOGGLE,\n targetId: rootMenuId,\n });\n break;\n case \"ArrowUp\":\n event.stopPropagation();\n event.preventDefault();\n setIsNavigatingWithKeyboard(true);\n if (rootMenuState || !rootMenuId) {\n break;\n }\n dispatch({\n type: CascadingMenuAction.OPEN_MENU,\n cause: stateChangeTypes.KEYBOARD_TOGGLE,\n targetId: rootMenuId,\n });\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.ITEM_KEYDOWN_ARROW_UP,\n targetId: rootMenuId,\n highlightedItemIndex:\n menusDataById[rootMenuId].menuItems.length - 1,\n });\n break;\n default:\n break;\n }\n\n if (isValidElement(children)) {\n const childrenProps = children.props as HTMLAttributes<HTMLElement>;\n childrenProps.onKeyDown?.(event);\n }\n },\n );\n\n return [handleOnClick, handleOnKeydown] as const;\n}\n"],"names":["useEventCallback","isValidElement","CascadingMenuAction","stateChangeTypes"],"mappings":"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"}