@salt-ds/lab 1.0.0-alpha.73 → 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 (454) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/css/salt-lab.css +332 -18
  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/Collapsible.js +47 -0
  28. package/dist-cjs/collapsible/Collapsible.js.map +1 -0
  29. package/dist-cjs/collapsible/CollapsibleContext.js +23 -0
  30. package/dist-cjs/collapsible/CollapsibleContext.js.map +1 -0
  31. package/dist-cjs/collapsible/CollapsiblePanel.css.js +6 -0
  32. package/dist-cjs/collapsible/CollapsiblePanel.css.js.map +1 -0
  33. package/dist-cjs/collapsible/CollapsiblePanel.js +42 -0
  34. package/dist-cjs/collapsible/CollapsiblePanel.js.map +1 -0
  35. package/dist-cjs/collapsible/CollapsibleTrigger.js +35 -0
  36. package/dist-cjs/collapsible/CollapsibleTrigger.js.map +1 -0
  37. package/dist-cjs/color-chooser/AlphaInputField.js +1 -1
  38. package/dist-cjs/color-chooser/AlphaInputField.js.map +1 -1
  39. package/dist-cjs/color-chooser/ColorChooser.js.map +1 -1
  40. package/dist-cjs/color-chooser/DictTabs.js +1 -1
  41. package/dist-cjs/color-chooser/DictTabs.js.map +1 -1
  42. package/dist-cjs/color-chooser/RGBAInputField.js +2 -2
  43. package/dist-cjs/color-chooser/RGBAInputField.js.map +1 -1
  44. package/dist-cjs/combo-box/useCombobox.js.map +1 -1
  45. package/dist-cjs/combo-box-deprecated/ComboBoxDeprecated.js +1 -1
  46. package/dist-cjs/combo-box-deprecated/ComboBoxDeprecated.js.map +1 -1
  47. package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js +1 -2
  48. package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
  49. package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js +0 -4
  50. package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
  51. package/dist-cjs/combo-box-deprecated/internal/useComboBox.js +4 -1
  52. package/dist-cjs/combo-box-deprecated/internal/useComboBox.js.map +1 -1
  53. package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js +7 -2
  54. package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
  55. package/dist-cjs/common-hooks/useAutoSizer.js +0 -9
  56. package/dist-cjs/common-hooks/useAutoSizer.js.map +1 -1
  57. package/dist-cjs/common-hooks/useCollapsibleGroups.js +37 -49
  58. package/dist-cjs/common-hooks/useCollapsibleGroups.js.map +1 -1
  59. package/dist-cjs/common-hooks/useCollectionItems.js +6 -11
  60. package/dist-cjs/common-hooks/useCollectionItems.js.map +1 -1
  61. package/dist-cjs/common-hooks/useKeyboardNavigationPanel.js +7 -7
  62. package/dist-cjs/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
  63. package/dist-cjs/common-hooks/useSelection.js +1 -1
  64. package/dist-cjs/common-hooks/useSelection.js.map +1 -1
  65. package/dist-cjs/common-hooks/useTypeahead.js +2 -2
  66. package/dist-cjs/common-hooks/useTypeahead.js.map +1 -1
  67. package/dist-cjs/common-hooks/useViewportTracking.js +1 -1
  68. package/dist-cjs/common-hooks/useViewportTracking.js.map +1 -1
  69. package/dist-cjs/common-hooks/utils/collection-item-utils.js +1 -1
  70. package/dist-cjs/common-hooks/utils/collection-item-utils.js.map +1 -1
  71. package/dist-cjs/contact-details/ContactAction.js +1 -0
  72. package/dist-cjs/contact-details/ContactAction.js.map +1 -1
  73. package/dist-cjs/contact-details/ContactSecondaryInfo.js +1 -1
  74. package/dist-cjs/contact-details/ContactSecondaryInfo.js.map +1 -1
  75. package/dist-cjs/contact-details/internal/ContactDetailsContext.js +2 -2
  76. package/dist-cjs/contact-details/internal/ContactDetailsContext.js.map +1 -1
  77. package/dist-cjs/contact-details/internal/FavoriteToggleWithTooltip.js +10 -1
  78. package/dist-cjs/contact-details/internal/FavoriteToggleWithTooltip.js.map +1 -1
  79. package/dist-cjs/content-status/ContentStatus.js.map +1 -1
  80. package/dist-cjs/content-status/internal/StatusIndicator.js.map +1 -1
  81. package/dist-cjs/date-input/DateInput.css.js +1 -1
  82. package/dist-cjs/date-picker/useFocusOut.js +1 -1
  83. package/dist-cjs/date-picker/useFocusOut.js.map +1 -1
  84. package/dist-cjs/dropdown/DropdownButton.js.map +1 -1
  85. package/dist-cjs/dropdown/useDropdown.js.map +1 -1
  86. package/dist-cjs/index.js +36 -0
  87. package/dist-cjs/index.js.map +1 -1
  88. package/dist-cjs/input-legacy/InputLegacy.css.js +1 -1
  89. package/dist-cjs/list/List.js +1 -1
  90. package/dist-cjs/list/List.js.map +1 -1
  91. package/dist-cjs/list/ListItem.css.js +1 -1
  92. package/dist-cjs/list/ListItem.js +2 -1
  93. package/dist-cjs/list/ListItem.js.map +1 -1
  94. package/dist-cjs/list/keyset.js.map +1 -1
  95. package/dist-cjs/list/useList.js +1 -3
  96. package/dist-cjs/list/useList.js.map +1 -1
  97. package/dist-cjs/list/useListHeight.js +3 -3
  98. package/dist-cjs/list/useListHeight.js.map +1 -1
  99. package/dist-cjs/list-deprecated/List.js +4 -1
  100. package/dist-cjs/list-deprecated/List.js.map +1 -1
  101. package/dist-cjs/list-deprecated/ListBase.js +18 -17
  102. package/dist-cjs/list-deprecated/ListBase.js.map +1 -1
  103. package/dist-cjs/list-deprecated/ListItem.js.map +1 -1
  104. package/dist-cjs/list-deprecated/ListItemBase.js +1 -0
  105. package/dist-cjs/list-deprecated/ListItemBase.js.map +1 -1
  106. package/dist-cjs/list-deprecated/internal/helpers.js.map +1 -1
  107. package/dist-cjs/list-deprecated/internal/scrollIntoView.js +2 -2
  108. package/dist-cjs/list-deprecated/internal/scrollIntoView.js.map +1 -1
  109. package/dist-cjs/list-deprecated/internal/useListAutoSizer.js.map +1 -1
  110. package/dist-cjs/list-deprecated/itemToString.js.map +1 -1
  111. package/dist-cjs/list-deprecated/useList.js +3 -10
  112. package/dist-cjs/list-deprecated/useList.js.map +1 -1
  113. package/dist-cjs/list-deprecated/useListItem.js.map +1 -1
  114. package/dist-cjs/list-next/ListNext.js.map +1 -1
  115. package/dist-cjs/metric/MetricContent.js +1 -0
  116. package/dist-cjs/metric/MetricContent.js.map +1 -1
  117. package/dist-cjs/number-input/NumberInput.css.js +1 -1
  118. package/dist-cjs/number-input/internal/utils.js +1 -1
  119. package/dist-cjs/number-input/internal/utils.js.map +1 -1
  120. package/dist-cjs/query-input/QueryInput.js +10 -10
  121. package/dist-cjs/query-input/QueryInput.js.map +1 -1
  122. package/dist-cjs/query-input/internal/QueryInputBody.js +1 -1
  123. package/dist-cjs/query-input/internal/QueryInputBody.js.map +1 -1
  124. package/dist-cjs/query-input/internal/SearchList.js +1 -1
  125. package/dist-cjs/query-input/internal/SearchList.js.map +1 -1
  126. package/dist-cjs/query-input/internal/usePopperStatus.js +2 -2
  127. package/dist-cjs/query-input/internal/usePopperStatus.js.map +1 -1
  128. package/dist-cjs/query-input/useQueryInput.js +6 -6
  129. package/dist-cjs/query-input/useQueryInput.js.map +1 -1
  130. package/dist-cjs/responsive/OverflowReducer.js +0 -2
  131. package/dist-cjs/responsive/OverflowReducer.js.map +1 -1
  132. package/dist-cjs/responsive/overflowUtils.js +6 -3
  133. package/dist-cjs/responsive/overflowUtils.js.map +1 -1
  134. package/dist-cjs/responsive/useDynamicCollapse.js +6 -3
  135. package/dist-cjs/responsive/useDynamicCollapse.js.map +1 -1
  136. package/dist-cjs/responsive/useOverflow.js +2 -2
  137. package/dist-cjs/responsive/useOverflow.js.map +1 -1
  138. package/dist-cjs/responsive/useOverflowCollectionItems.js +1 -1
  139. package/dist-cjs/responsive/useOverflowCollectionItems.js.map +1 -1
  140. package/dist-cjs/responsive/useOverflowLayout.js +1 -1
  141. package/dist-cjs/responsive/useOverflowLayout.js.map +1 -1
  142. package/dist-cjs/responsive/useReclaimSpace.js +1 -1
  143. package/dist-cjs/responsive/useReclaimSpace.js.map +1 -1
  144. package/dist-cjs/responsive/useResizeObserver.js +7 -2
  145. package/dist-cjs/responsive/useResizeObserver.js.map +1 -1
  146. package/dist-cjs/search-input/SearchInput.js.map +1 -1
  147. package/dist-cjs/table/TBody.js +32 -0
  148. package/dist-cjs/table/TBody.js.map +1 -0
  149. package/dist-cjs/table/TD.js +30 -0
  150. package/dist-cjs/table/TD.js.map +1 -0
  151. package/dist-cjs/table/TFoot.js +45 -0
  152. package/dist-cjs/table/TFoot.js.map +1 -0
  153. package/dist-cjs/table/TH.js +30 -0
  154. package/dist-cjs/table/TH.js.map +1 -0
  155. package/dist-cjs/table/THead.js +45 -0
  156. package/dist-cjs/table/THead.js.map +1 -0
  157. package/dist-cjs/table/TR.js +30 -0
  158. package/dist-cjs/table/TR.js.map +1 -0
  159. package/dist-cjs/table/Table.css.js +6 -0
  160. package/dist-cjs/table/Table.css.js.map +1 -0
  161. package/dist-cjs/table/Table.js +47 -0
  162. package/dist-cjs/table/Table.js.map +1 -0
  163. package/dist-cjs/tabs/TabActivationIndicator.css.js +1 -1
  164. package/dist-cjs/tabs/Tabs.js +0 -8
  165. package/dist-cjs/tabs/Tabs.js.map +1 -1
  166. package/dist-cjs/tabs/drag-drop/useDragSpacers.js +6 -7
  167. package/dist-cjs/tabs/drag-drop/useDragSpacers.js.map +1 -1
  168. package/dist-cjs/tabs/useActivationIndicator.js.map +1 -1
  169. package/dist-cjs/tabs-next/TabNextTrigger.js +2 -1
  170. package/dist-cjs/tabs-next/TabNextTrigger.js.map +1 -1
  171. package/dist-cjs/tabs-next/hooks/useOverflow.js +3 -5
  172. package/dist-cjs/tabs-next/hooks/useOverflow.js.map +1 -1
  173. package/dist-cjs/tokenized-input/useTokenizedInput.js +5 -5
  174. package/dist-cjs/tokenized-input/useTokenizedInput.js.map +1 -1
  175. package/dist-cjs/tokenized-input-next/TokenizedInputNext.css.js +1 -1
  176. package/dist-cjs/tree/Tree.js.map +1 -1
  177. package/dist-cjs/vertical-navigation/SubMenuContext.js +34 -0
  178. package/dist-cjs/vertical-navigation/SubMenuContext.js.map +1 -0
  179. package/dist-cjs/vertical-navigation/VerticalNavigation.css.js +6 -0
  180. package/dist-cjs/vertical-navigation/VerticalNavigation.css.js.map +1 -0
  181. package/dist-cjs/vertical-navigation/VerticalNavigation.js +34 -0
  182. package/dist-cjs/vertical-navigation/VerticalNavigation.js.map +1 -0
  183. package/dist-cjs/vertical-navigation/VerticalNavigationItem.js +48 -0
  184. package/dist-cjs/vertical-navigation/VerticalNavigationItem.js.map +1 -0
  185. package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.css.js +6 -0
  186. package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.css.js.map +1 -0
  187. package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.js +83 -0
  188. package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.js.map +1 -0
  189. package/dist-cjs/vertical-navigation/VerticalNavigationItemExpansionIcon.js +29 -0
  190. package/dist-cjs/vertical-navigation/VerticalNavigationItemExpansionIcon.js.map +1 -0
  191. package/dist-cjs/vertical-navigation/VerticalNavigationItemLabel.css.js +6 -0
  192. package/dist-cjs/vertical-navigation/VerticalNavigationItemLabel.css.js.map +1 -0
  193. package/dist-cjs/vertical-navigation/VerticalNavigationItemLabel.js +24 -0
  194. package/dist-cjs/vertical-navigation/VerticalNavigationItemLabel.js.map +1 -0
  195. package/dist-cjs/vertical-navigation/VerticalNavigationItemTrigger.css.js +6 -0
  196. package/dist-cjs/vertical-navigation/VerticalNavigationItemTrigger.css.js.map +1 -0
  197. package/dist-cjs/vertical-navigation/VerticalNavigationItemTrigger.js +69 -0
  198. package/dist-cjs/vertical-navigation/VerticalNavigationItemTrigger.js.map +1 -0
  199. package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.css.js +6 -0
  200. package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.css.js.map +1 -0
  201. package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.js +35 -0
  202. package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.js.map +1 -0
  203. package/dist-es/app-header/AppHeader.js +5 -1
  204. package/dist-es/app-header/AppHeader.js.map +1 -1
  205. package/dist-es/breadcrumbs/Breadcrumb.js.map +1 -1
  206. package/dist-es/breadcrumbs/Breadcrumbs.js +11 -2
  207. package/dist-es/breadcrumbs/Breadcrumbs.js.map +1 -1
  208. package/dist-es/breadcrumbs/internal/BreadcrumbsCollapsed.js +3 -6
  209. package/dist-es/breadcrumbs/internal/BreadcrumbsCollapsed.js.map +1 -1
  210. package/dist-es/button-bar/ButtonBar.js +1 -1
  211. package/dist-es/button-bar/ButtonBar.js.map +1 -1
  212. package/dist-es/button-bar/internal/DescendantContext.js.map +1 -1
  213. package/dist-es/calendar/useCalendarSelection.js +2 -2
  214. package/dist-es/calendar/useCalendarSelection.js.map +1 -1
  215. package/dist-es/cascading-menu/CascadingMenu.js +19 -13
  216. package/dist-es/cascading-menu/CascadingMenu.js.map +1 -1
  217. package/dist-es/cascading-menu/CascadingMenuItem.js +2 -4
  218. package/dist-es/cascading-menu/CascadingMenuItem.js.map +1 -1
  219. package/dist-es/cascading-menu/CascadingMenuList.js +1 -2
  220. package/dist-es/cascading-menu/CascadingMenuList.js.map +1 -1
  221. package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js +4 -1
  222. package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
  223. package/dist-es/cascading-menu/internal/useMouseHandlers.js +1 -1
  224. package/dist-es/cascading-menu/internal/useMouseHandlers.js.map +1 -1
  225. package/dist-es/cascading-menu/internal/useRefsManager.js +3 -1
  226. package/dist-es/cascading-menu/internal/useRefsManager.js.map +1 -1
  227. package/dist-es/collapsible/Collapsible.js +45 -0
  228. package/dist-es/collapsible/Collapsible.js.map +1 -0
  229. package/dist-es/collapsible/CollapsibleContext.js +20 -0
  230. package/dist-es/collapsible/CollapsibleContext.js.map +1 -0
  231. package/dist-es/collapsible/CollapsiblePanel.css.js +4 -0
  232. package/dist-es/collapsible/CollapsiblePanel.css.js.map +1 -0
  233. package/dist-es/collapsible/CollapsiblePanel.js +40 -0
  234. package/dist-es/collapsible/CollapsiblePanel.js.map +1 -0
  235. package/dist-es/collapsible/CollapsibleTrigger.js +33 -0
  236. package/dist-es/collapsible/CollapsibleTrigger.js.map +1 -0
  237. package/dist-es/color-chooser/AlphaInputField.js +1 -1
  238. package/dist-es/color-chooser/AlphaInputField.js.map +1 -1
  239. package/dist-es/color-chooser/ColorChooser.js.map +1 -1
  240. package/dist-es/color-chooser/DictTabs.js +1 -1
  241. package/dist-es/color-chooser/DictTabs.js.map +1 -1
  242. package/dist-es/color-chooser/RGBAInputField.js +2 -2
  243. package/dist-es/color-chooser/RGBAInputField.js.map +1 -1
  244. package/dist-es/combo-box/useCombobox.js.map +1 -1
  245. package/dist-es/combo-box-deprecated/ComboBoxDeprecated.js +1 -1
  246. package/dist-es/combo-box-deprecated/ComboBoxDeprecated.js.map +1 -1
  247. package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js +1 -2
  248. package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
  249. package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js +1 -5
  250. package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
  251. package/dist-es/combo-box-deprecated/internal/useComboBox.js +4 -1
  252. package/dist-es/combo-box-deprecated/internal/useComboBox.js.map +1 -1
  253. package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js +7 -2
  254. package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
  255. package/dist-es/common-hooks/useAutoSizer.js +0 -9
  256. package/dist-es/common-hooks/useAutoSizer.js.map +1 -1
  257. package/dist-es/common-hooks/useCollapsibleGroups.js +38 -50
  258. package/dist-es/common-hooks/useCollapsibleGroups.js.map +1 -1
  259. package/dist-es/common-hooks/useCollectionItems.js +6 -11
  260. package/dist-es/common-hooks/useCollectionItems.js.map +1 -1
  261. package/dist-es/common-hooks/useKeyboardNavigationPanel.js +8 -8
  262. package/dist-es/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
  263. package/dist-es/common-hooks/useSelection.js +1 -1
  264. package/dist-es/common-hooks/useSelection.js.map +1 -1
  265. package/dist-es/common-hooks/useTypeahead.js +2 -2
  266. package/dist-es/common-hooks/useTypeahead.js.map +1 -1
  267. package/dist-es/common-hooks/useViewportTracking.js +1 -1
  268. package/dist-es/common-hooks/useViewportTracking.js.map +1 -1
  269. package/dist-es/common-hooks/utils/collection-item-utils.js +1 -1
  270. package/dist-es/common-hooks/utils/collection-item-utils.js.map +1 -1
  271. package/dist-es/contact-details/ContactAction.js +1 -0
  272. package/dist-es/contact-details/ContactAction.js.map +1 -1
  273. package/dist-es/contact-details/ContactSecondaryInfo.js +1 -1
  274. package/dist-es/contact-details/ContactSecondaryInfo.js.map +1 -1
  275. package/dist-es/contact-details/internal/ContactDetailsContext.js +2 -2
  276. package/dist-es/contact-details/internal/ContactDetailsContext.js.map +1 -1
  277. package/dist-es/contact-details/internal/FavoriteToggleWithTooltip.js +10 -1
  278. package/dist-es/contact-details/internal/FavoriteToggleWithTooltip.js.map +1 -1
  279. package/dist-es/content-status/ContentStatus.js.map +1 -1
  280. package/dist-es/content-status/internal/StatusIndicator.js.map +1 -1
  281. package/dist-es/date-input/DateInput.css.js +1 -1
  282. package/dist-es/date-picker/useFocusOut.js +1 -1
  283. package/dist-es/date-picker/useFocusOut.js.map +1 -1
  284. package/dist-es/dropdown/DropdownButton.js.map +1 -1
  285. package/dist-es/dropdown/useDropdown.js.map +1 -1
  286. package/dist-es/index.js +17 -0
  287. package/dist-es/index.js.map +1 -1
  288. package/dist-es/input-legacy/InputLegacy.css.js +1 -1
  289. package/dist-es/list/List.js +2 -2
  290. package/dist-es/list/List.js.map +1 -1
  291. package/dist-es/list/ListItem.css.js +1 -1
  292. package/dist-es/list/ListItem.js +2 -1
  293. package/dist-es/list/ListItem.js.map +1 -1
  294. package/dist-es/list/keyset.js.map +1 -1
  295. package/dist-es/list/useList.js +1 -3
  296. package/dist-es/list/useList.js.map +1 -1
  297. package/dist-es/list/useListHeight.js +3 -3
  298. package/dist-es/list/useListHeight.js.map +1 -1
  299. package/dist-es/list-deprecated/List.js +4 -1
  300. package/dist-es/list-deprecated/List.js.map +1 -1
  301. package/dist-es/list-deprecated/ListBase.js +19 -18
  302. package/dist-es/list-deprecated/ListBase.js.map +1 -1
  303. package/dist-es/list-deprecated/ListItem.js.map +1 -1
  304. package/dist-es/list-deprecated/ListItemBase.js +1 -0
  305. package/dist-es/list-deprecated/ListItemBase.js.map +1 -1
  306. package/dist-es/list-deprecated/internal/helpers.js.map +1 -1
  307. package/dist-es/list-deprecated/internal/scrollIntoView.js +2 -2
  308. package/dist-es/list-deprecated/internal/scrollIntoView.js.map +1 -1
  309. package/dist-es/list-deprecated/internal/useListAutoSizer.js.map +1 -1
  310. package/dist-es/list-deprecated/itemToString.js.map +1 -1
  311. package/dist-es/list-deprecated/useList.js +3 -10
  312. package/dist-es/list-deprecated/useList.js.map +1 -1
  313. package/dist-es/list-deprecated/useListItem.js.map +1 -1
  314. package/dist-es/list-next/ListNext.js.map +1 -1
  315. package/dist-es/metric/MetricContent.js +1 -0
  316. package/dist-es/metric/MetricContent.js.map +1 -1
  317. package/dist-es/number-input/NumberInput.css.js +1 -1
  318. package/dist-es/number-input/internal/utils.js +1 -1
  319. package/dist-es/number-input/internal/utils.js.map +1 -1
  320. package/dist-es/query-input/QueryInput.js +10 -10
  321. package/dist-es/query-input/QueryInput.js.map +1 -1
  322. package/dist-es/query-input/internal/QueryInputBody.js +1 -1
  323. package/dist-es/query-input/internal/QueryInputBody.js.map +1 -1
  324. package/dist-es/query-input/internal/SearchList.js +1 -1
  325. package/dist-es/query-input/internal/SearchList.js.map +1 -1
  326. package/dist-es/query-input/internal/usePopperStatus.js +2 -2
  327. package/dist-es/query-input/internal/usePopperStatus.js.map +1 -1
  328. package/dist-es/query-input/useQueryInput.js +6 -6
  329. package/dist-es/query-input/useQueryInput.js.map +1 -1
  330. package/dist-es/responsive/OverflowReducer.js +0 -2
  331. package/dist-es/responsive/OverflowReducer.js.map +1 -1
  332. package/dist-es/responsive/overflowUtils.js +6 -3
  333. package/dist-es/responsive/overflowUtils.js.map +1 -1
  334. package/dist-es/responsive/useDynamicCollapse.js +6 -3
  335. package/dist-es/responsive/useDynamicCollapse.js.map +1 -1
  336. package/dist-es/responsive/useOverflow.js +2 -2
  337. package/dist-es/responsive/useOverflow.js.map +1 -1
  338. package/dist-es/responsive/useOverflowCollectionItems.js +1 -1
  339. package/dist-es/responsive/useOverflowCollectionItems.js.map +1 -1
  340. package/dist-es/responsive/useOverflowLayout.js +1 -1
  341. package/dist-es/responsive/useOverflowLayout.js.map +1 -1
  342. package/dist-es/responsive/useReclaimSpace.js +1 -1
  343. package/dist-es/responsive/useReclaimSpace.js.map +1 -1
  344. package/dist-es/responsive/useResizeObserver.js +7 -2
  345. package/dist-es/responsive/useResizeObserver.js.map +1 -1
  346. package/dist-es/search-input/SearchInput.js.map +1 -1
  347. package/dist-es/table/TBody.js +30 -0
  348. package/dist-es/table/TBody.js.map +1 -0
  349. package/dist-es/table/TD.js +28 -0
  350. package/dist-es/table/TD.js.map +1 -0
  351. package/dist-es/table/TFoot.js +43 -0
  352. package/dist-es/table/TFoot.js.map +1 -0
  353. package/dist-es/table/TH.js +28 -0
  354. package/dist-es/table/TH.js.map +1 -0
  355. package/dist-es/table/THead.js +43 -0
  356. package/dist-es/table/THead.js.map +1 -0
  357. package/dist-es/table/TR.js +28 -0
  358. package/dist-es/table/TR.js.map +1 -0
  359. package/dist-es/table/Table.css.js +4 -0
  360. package/dist-es/table/Table.css.js.map +1 -0
  361. package/dist-es/table/Table.js +44 -0
  362. package/dist-es/table/Table.js.map +1 -0
  363. package/dist-es/tabs/TabActivationIndicator.css.js +1 -1
  364. package/dist-es/tabs/Tabs.js +1 -9
  365. package/dist-es/tabs/Tabs.js.map +1 -1
  366. package/dist-es/tabs/drag-drop/useDragSpacers.js +6 -7
  367. package/dist-es/tabs/drag-drop/useDragSpacers.js.map +1 -1
  368. package/dist-es/tabs/useActivationIndicator.js.map +1 -1
  369. package/dist-es/tabs-next/TabNextTrigger.js +2 -1
  370. package/dist-es/tabs-next/TabNextTrigger.js.map +1 -1
  371. package/dist-es/tabs-next/hooks/useOverflow.js +4 -6
  372. package/dist-es/tabs-next/hooks/useOverflow.js.map +1 -1
  373. package/dist-es/tokenized-input/useTokenizedInput.js +5 -5
  374. package/dist-es/tokenized-input/useTokenizedInput.js.map +1 -1
  375. package/dist-es/tokenized-input-next/TokenizedInputNext.css.js +1 -1
  376. package/dist-es/tree/Tree.js.map +1 -1
  377. package/dist-es/vertical-navigation/SubMenuContext.js +30 -0
  378. package/dist-es/vertical-navigation/SubMenuContext.js.map +1 -0
  379. package/dist-es/vertical-navigation/VerticalNavigation.css.js +4 -0
  380. package/dist-es/vertical-navigation/VerticalNavigation.css.js.map +1 -0
  381. package/dist-es/vertical-navigation/VerticalNavigation.js +32 -0
  382. package/dist-es/vertical-navigation/VerticalNavigation.js.map +1 -0
  383. package/dist-es/vertical-navigation/VerticalNavigationItem.js +45 -0
  384. package/dist-es/vertical-navigation/VerticalNavigationItem.js.map +1 -0
  385. package/dist-es/vertical-navigation/VerticalNavigationItemContent.css.js +4 -0
  386. package/dist-es/vertical-navigation/VerticalNavigationItemContent.css.js.map +1 -0
  387. package/dist-es/vertical-navigation/VerticalNavigationItemContent.js +81 -0
  388. package/dist-es/vertical-navigation/VerticalNavigationItemContent.js.map +1 -0
  389. package/dist-es/vertical-navigation/VerticalNavigationItemExpansionIcon.js +27 -0
  390. package/dist-es/vertical-navigation/VerticalNavigationItemExpansionIcon.js.map +1 -0
  391. package/dist-es/vertical-navigation/VerticalNavigationItemLabel.css.js +4 -0
  392. package/dist-es/vertical-navigation/VerticalNavigationItemLabel.css.js.map +1 -0
  393. package/dist-es/vertical-navigation/VerticalNavigationItemLabel.js +22 -0
  394. package/dist-es/vertical-navigation/VerticalNavigationItemLabel.js.map +1 -0
  395. package/dist-es/vertical-navigation/VerticalNavigationItemTrigger.css.js +4 -0
  396. package/dist-es/vertical-navigation/VerticalNavigationItemTrigger.css.js.map +1 -0
  397. package/dist-es/vertical-navigation/VerticalNavigationItemTrigger.js +67 -0
  398. package/dist-es/vertical-navigation/VerticalNavigationItemTrigger.js.map +1 -0
  399. package/dist-es/vertical-navigation/VerticalNavigationSubMenu.css.js +4 -0
  400. package/dist-es/vertical-navigation/VerticalNavigationSubMenu.css.js.map +1 -0
  401. package/dist-es/vertical-navigation/VerticalNavigationSubMenu.js +33 -0
  402. package/dist-es/vertical-navigation/VerticalNavigationSubMenu.js.map +1 -0
  403. package/dist-types/breadcrumbs/Breadcrumb.d.ts +2 -2
  404. package/dist-types/breadcrumbs/Breadcrumbs.d.ts +2 -2
  405. package/dist-types/cascading-menu/CascadingMenuList.d.ts +3 -1
  406. package/dist-types/cascading-menu/CascadingMenuProps.d.ts +1 -1
  407. package/dist-types/cascading-menu/internal/useMenuTriggerHandlers.d.ts +3 -2
  408. package/dist-types/collapsible/Collapsible.d.ts +16 -0
  409. package/dist-types/collapsible/CollapsibleContext.d.ts +9 -0
  410. package/dist-types/collapsible/CollapsiblePanel.d.ts +4 -0
  411. package/dist-types/collapsible/CollapsibleTrigger.d.ts +5 -0
  412. package/dist-types/collapsible/index.d.ts +3 -0
  413. package/dist-types/combo-box-deprecated/internal/useComboBox.d.ts +5 -5
  414. package/dist-types/combo-box-deprecated/internal/useMultiSelectComboBox.d.ts +7 -7
  415. package/dist-types/common-hooks/useAutoSizer.d.ts +1 -1
  416. package/dist-types/common-hooks/useCollapsibleGroups.d.ts +2 -2
  417. package/dist-types/common-hooks/useCollectionItems.d.ts +1 -1
  418. package/dist-types/common-hooks/useSelection.d.ts +1 -1
  419. package/dist-types/content-status/ContentStatus.d.ts +1 -1
  420. package/dist-types/dropdown/DropdownButton.d.ts +1 -1
  421. package/dist-types/dropdown/dropdownTypes.d.ts +2 -2
  422. package/dist-types/dropdown/useDropdown.d.ts +1 -1
  423. package/dist-types/index.d.ts +3 -0
  424. package/dist-types/list/useListHeight.d.ts +1 -1
  425. package/dist-types/list-deprecated/ListBase.d.ts +4 -8
  426. package/dist-types/list-deprecated/ListProps.d.ts +7 -6
  427. package/dist-types/list-deprecated/internal/helpers.d.ts +3 -2
  428. package/dist-types/list-deprecated/internal/useListAutoSizer.d.ts +2 -7
  429. package/dist-types/list-deprecated/itemToString.d.ts +2 -2
  430. package/dist-types/list-deprecated/useList.d.ts +1 -1
  431. package/dist-types/metric/internal/helpers.d.ts +1 -1
  432. package/dist-types/query-input/internal/usePopperStatus.d.ts +3 -3
  433. package/dist-types/responsive/overflowTypes.d.ts +1 -1
  434. package/dist-types/responsive/overflowUtils.d.ts +1 -1
  435. package/dist-types/responsive/useReclaimSpace.d.ts +1 -1
  436. package/dist-types/search-input/SearchInput.d.ts +1 -1
  437. package/dist-types/table/TBody.d.ts +4 -0
  438. package/dist-types/table/TD.d.ts +4 -0
  439. package/dist-types/table/TFoot.d.ts +20 -0
  440. package/dist-types/table/TH.d.ts +4 -0
  441. package/dist-types/table/THead.d.ts +20 -0
  442. package/dist-types/table/TR.d.ts +4 -0
  443. package/dist-types/table/Table.d.ts +20 -0
  444. package/dist-types/table/index.d.ts +7 -0
  445. package/dist-types/vertical-navigation/SubMenuContext.d.ts +14 -0
  446. package/dist-types/vertical-navigation/VerticalNavigation.d.ts +5 -0
  447. package/dist-types/vertical-navigation/VerticalNavigationItem.d.ts +12 -0
  448. package/dist-types/vertical-navigation/VerticalNavigationItemContent.d.ts +4 -0
  449. package/dist-types/vertical-navigation/VerticalNavigationItemExpansionIcon.d.ts +2 -0
  450. package/dist-types/vertical-navigation/VerticalNavigationItemLabel.d.ts +4 -0
  451. package/dist-types/vertical-navigation/VerticalNavigationItemTrigger.d.ts +6 -0
  452. package/dist-types/vertical-navigation/VerticalNavigationSubMenu.d.ts +4 -0
  453. package/dist-types/vertical-navigation/index.d.ts +7 -0
  454. package/package.json +3 -6
@@ -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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"}
@@ -84,7 +84,7 @@ function useMouseHandlers(props, isMenuActiveState, menuRef) {
84
84
  type: CascadingMenuAction.CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,
85
85
  cause: stateChangeTypes.stateChangeTypes.ITEM_MOUSE_MOVE_TO_PARENT,
86
86
  targetId: menuId,
87
- highlightedItemIndex: null
87
+ highlightedItemIndex: -1
88
88
  });
89
89
  }
90
90
  const didMouseMoveOutOfMenu = !(mouseMovedToParentMenu || mouseMovedToSameMenu || isOrContainsNode(subMenuElement, relatedTarget));
@@ -1 +1 @@
1
- {"version":3,"file":"useMouseHandlers.js","sources":["../src/cascading-menu/internal/useMouseHandlers.ts"],"sourcesContent":["import {\n type Dispatch,\n type MouseEvent,\n type SetStateAction,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\n\nimport type { CascadingMenuListProps } from \"../CascadingMenuList\";\nimport { stateChangeTypes } from \"../stateChangeTypes\";\nimport { CascadingMenuAction } from \"./CascadingMenuAction\";\n\nfunction isOrContainsNode(parent: HTMLElement | null, child: HTMLElement) {\n return parent === child || !!parent?.contains?.(child);\n}\n\nexport function useMouseHandlers(\n props: CascadingMenuListProps,\n isMenuActiveState: [boolean, Dispatch<SetStateAction<boolean>>],\n menuRef: HTMLElement | null,\n) {\n const [isMenuActive, setIsMenuActive] = isMenuActiveState;\n const {\n delay,\n refsManager,\n dispatch,\n isNavigatingWithKeyboard,\n setIsNavigatingWithKeyboard,\n data,\n highlightedItemIndex,\n menuId,\n parentElement,\n } = props;\n const scheduledHighlightedIndexChange = useRef<number | null>(null);\n const mouseEnterTimer = useRef<number>();\n const mouseOutTimer = useRef<number>();\n\n useEffect(\n () =>\n function cleanUpTimeouts() {\n clearTimeout(mouseEnterTimer.current);\n clearTimeout(mouseOutTimer.current);\n },\n [],\n );\n\n const handleMouseMove = useCallback(\n (highlightedIndex: number) => {\n if (isNavigatingWithKeyboard) {\n setIsNavigatingWithKeyboard(false);\n }\n\n if (!isMenuActive) {\n setIsMenuActive(true);\n }\n if (scheduledHighlightedIndexChange.current !== highlightedIndex) {\n scheduledHighlightedIndexChange.current = highlightedIndex;\n clearTimeout(mouseEnterTimer.current);\n clearTimeout(mouseOutTimer.current);\n mouseEnterTimer.current = window.setTimeout(() => {\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.ITEM_MOUSE_ENTER,\n targetId: menuId,\n highlightedItemIndex: highlightedIndex,\n });\n }, delay);\n }\n },\n [\n isNavigatingWithKeyboard,\n isMenuActive,\n setIsNavigatingWithKeyboard,\n setIsMenuActive,\n delay,\n dispatch,\n menuId,\n ],\n );\n const handleMouseOut = useCallback(\n (event: MouseEvent<HTMLElement>) => {\n if (isNavigatingWithKeyboard) {\n setIsNavigatingWithKeyboard(false);\n }\n clearTimeout(mouseOutTimer.current);\n // If mouse leaves from parent menu into other element other than submenu -> close submenu\n const { relatedTarget } = event;\n const subMenuElement =\n typeof highlightedItemIndex === \"number\"\n ? (refsManager.get(data.childMenus[highlightedItemIndex]) ?? null)\n : null;\n\n const mouseMovedToSameMenu = isOrContainsNode(\n menuRef,\n relatedTarget as HTMLElement,\n );\n const mouseMovedToParentMenu = isOrContainsNode(\n parentElement ?? null,\n relatedTarget as HTMLElement,\n );\n\n if (mouseMovedToParentMenu) {\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.ITEM_MOUSE_MOVE_TO_PARENT,\n targetId: menuId,\n highlightedItemIndex: null,\n });\n }\n const didMouseMoveOutOfMenu = !(\n mouseMovedToParentMenu ||\n mouseMovedToSameMenu ||\n isOrContainsNode(subMenuElement, relatedTarget as HTMLElement)\n );\n\n if (didMouseMoveOutOfMenu) {\n scheduledHighlightedIndexChange.current = null;\n if (!isMenuActive) {\n setIsMenuActive(true);\n clearInterval(mouseEnterTimer.current);\n mouseOutTimer.current = window.setTimeout(() => {\n dispatch({\n type: CascadingMenuAction.RESET_MENU,\n cause: stateChangeTypes.MOUSE_OUT_OF_MENUS,\n targetId: menuId,\n });\n }, delay);\n }\n } else if (!mouseMovedToSameMenu) {\n setIsMenuActive(false);\n }\n },\n [\n isNavigatingWithKeyboard,\n refsManager,\n data.childMenus,\n highlightedItemIndex,\n menuRef,\n parentElement,\n setIsNavigatingWithKeyboard,\n dispatch,\n menuId,\n isMenuActive,\n delay,\n setIsMenuActive,\n ],\n );\n return [handleMouseMove, handleMouseOut] as const;\n}\n"],"names":["useRef","useEffect","useCallback","CascadingMenuAction","stateChangeTypes"],"mappings":"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"}
1
+ {"version":3,"file":"useMouseHandlers.js","sources":["../src/cascading-menu/internal/useMouseHandlers.ts"],"sourcesContent":["import {\n type Dispatch,\n type MouseEvent,\n type SetStateAction,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\n\nimport type { CascadingMenuListProps } from \"../CascadingMenuList\";\nimport { stateChangeTypes } from \"../stateChangeTypes\";\nimport { CascadingMenuAction } from \"./CascadingMenuAction\";\n\nfunction isOrContainsNode(parent: HTMLElement | null, child: HTMLElement) {\n return parent === child || !!parent?.contains?.(child);\n}\n\nexport function useMouseHandlers(\n props: CascadingMenuListProps,\n isMenuActiveState: [boolean, Dispatch<SetStateAction<boolean>>],\n menuRef: HTMLElement | null,\n) {\n const [isMenuActive, setIsMenuActive] = isMenuActiveState;\n const {\n delay,\n refsManager,\n dispatch,\n isNavigatingWithKeyboard,\n setIsNavigatingWithKeyboard,\n data,\n highlightedItemIndex,\n menuId,\n parentElement,\n } = props;\n const scheduledHighlightedIndexChange = useRef<number | null>(null);\n const mouseEnterTimer = useRef<number>();\n const mouseOutTimer = useRef<number>();\n\n useEffect(\n () =>\n function cleanUpTimeouts() {\n clearTimeout(mouseEnterTimer.current);\n clearTimeout(mouseOutTimer.current);\n },\n [],\n );\n\n const handleMouseMove = useCallback(\n (highlightedIndex: number) => {\n if (isNavigatingWithKeyboard) {\n setIsNavigatingWithKeyboard(false);\n }\n\n if (!isMenuActive) {\n setIsMenuActive(true);\n }\n if (scheduledHighlightedIndexChange.current !== highlightedIndex) {\n scheduledHighlightedIndexChange.current = highlightedIndex;\n clearTimeout(mouseEnterTimer.current);\n clearTimeout(mouseOutTimer.current);\n mouseEnterTimer.current = window.setTimeout(() => {\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.ITEM_MOUSE_ENTER,\n targetId: menuId,\n highlightedItemIndex: highlightedIndex,\n });\n }, delay);\n }\n },\n [\n isNavigatingWithKeyboard,\n isMenuActive,\n setIsNavigatingWithKeyboard,\n setIsMenuActive,\n delay,\n dispatch,\n menuId,\n ],\n );\n const handleMouseOut = useCallback(\n (event: MouseEvent<HTMLElement>) => {\n if (isNavigatingWithKeyboard) {\n setIsNavigatingWithKeyboard(false);\n }\n clearTimeout(mouseOutTimer.current);\n // If mouse leaves from parent menu into other element other than submenu -> close submenu\n const { relatedTarget } = event;\n const subMenuElement =\n typeof highlightedItemIndex === \"number\"\n ? (refsManager.get(data.childMenus[highlightedItemIndex]) ?? null)\n : null;\n\n const mouseMovedToSameMenu = isOrContainsNode(\n menuRef,\n relatedTarget as HTMLElement,\n );\n const mouseMovedToParentMenu = isOrContainsNode(\n parentElement ?? null,\n relatedTarget as HTMLElement,\n );\n\n if (mouseMovedToParentMenu) {\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.ITEM_MOUSE_MOVE_TO_PARENT,\n targetId: menuId,\n highlightedItemIndex: -1,\n });\n }\n const didMouseMoveOutOfMenu = !(\n mouseMovedToParentMenu ||\n mouseMovedToSameMenu ||\n isOrContainsNode(subMenuElement, relatedTarget as HTMLElement)\n );\n\n if (didMouseMoveOutOfMenu) {\n scheduledHighlightedIndexChange.current = null;\n if (!isMenuActive) {\n setIsMenuActive(true);\n clearInterval(mouseEnterTimer.current);\n mouseOutTimer.current = window.setTimeout(() => {\n dispatch({\n type: CascadingMenuAction.RESET_MENU,\n cause: stateChangeTypes.MOUSE_OUT_OF_MENUS,\n targetId: menuId,\n });\n }, delay);\n }\n } else if (!mouseMovedToSameMenu) {\n setIsMenuActive(false);\n }\n },\n [\n isNavigatingWithKeyboard,\n refsManager,\n data.childMenus,\n highlightedItemIndex,\n menuRef,\n parentElement,\n setIsNavigatingWithKeyboard,\n dispatch,\n menuId,\n isMenuActive,\n delay,\n setIsMenuActive,\n ],\n );\n return [handleMouseMove, handleMouseOut] as const;\n}\n"],"names":["useRef","useEffect","useCallback","CascadingMenuAction","stateChangeTypes"],"mappings":"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"}
@@ -12,7 +12,9 @@ function useRefsManager() {
12
12
  }, []);
13
13
  const values = react.useCallback(() => {
14
14
  const vals = [];
15
- refs.current.forEach((value) => vals.push(value));
15
+ for (const value of refs.current.values()) {
16
+ vals.push(value);
17
+ }
16
18
  return vals;
17
19
  }, []);
18
20
  return react.useMemo(() => ({ get, set, values }), [get, set, values]);
@@ -1 +1 @@
1
- {"version":3,"file":"useRefsManager.js","sources":["../src/cascading-menu/internal/useRefsManager.ts"],"sourcesContent":["import { useCallback, useMemo, useReducer, useRef } from \"react\";\n\nexport type refsManager = {\n get: (key: string) => HTMLElement | undefined;\n set: (key: string, ref: HTMLElement) => void;\n values: () => HTMLElement[];\n};\n\nexport function useRefsManager(): refsManager {\n const refs = useRef(new Map<string, HTMLElement>());\n const [, forceUpdate] = useReducer((x) => !x, false);\n\n const get = useCallback((key: string) => refs.current.get(key), []);\n\n const set = useCallback((key: string, value: HTMLElement) => {\n refs.current.set(key, value);\n forceUpdate();\n }, []);\n\n const values = useCallback(() => {\n const vals: HTMLElement[] = [];\n refs.current.forEach((value) => vals.push(value));\n return vals;\n }, []);\n\n return useMemo(() => ({ get, set, values }), [get, set, values]);\n}\n"],"names":["useRef","useReducer","useCallback","useMemo"],"mappings":";;;;AAQO,SAAS,cAA8B,GAAA;AAC5C,EAAA,MAAM,IAAO,GAAAA,YAAA,iBAAW,IAAA,GAAA,EAA0B,CAAA;AAClD,EAAM,MAAA,GAAG,WAAW,CAAA,GAAIC,iBAAW,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,KAAK,CAAA;AAEnD,EAAM,MAAA,GAAA,GAAMC,iBAAY,CAAA,CAAC,GAAgB,KAAA,IAAA,CAAK,QAAQ,GAAI,CAAA,GAAG,CAAG,EAAA,EAAE,CAAA;AAElE,EAAA,MAAM,GAAM,GAAAA,iBAAA,CAAY,CAAC,GAAA,EAAa,KAAuB,KAAA;AAC3D,IAAK,IAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,EAAK,KAAK,CAAA;AAC3B,IAAY,WAAA,EAAA;AAAA,GACd,EAAG,EAAE,CAAA;AAEL,EAAM,MAAA,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,MAAM,OAAsB,EAAC;AAC7B,IAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,CAAC,UAAU,IAAK,CAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAChD,IAAO,OAAA,IAAA;AAAA,GACT,EAAG,EAAE,CAAA;AAEL,EAAO,OAAAC,aAAA,CAAQ,OAAO,EAAE,GAAK,EAAA,GAAA,EAAK,MAAO,EAAA,CAAA,EAAI,CAAC,GAAA,EAAK,GAAK,EAAA,MAAM,CAAC,CAAA;AACjE;;;;"}
1
+ {"version":3,"file":"useRefsManager.js","sources":["../src/cascading-menu/internal/useRefsManager.ts"],"sourcesContent":["import { useCallback, useMemo, useReducer, useRef } from \"react\";\n\nexport type refsManager = {\n get: (key: string) => HTMLElement | undefined;\n set: (key: string, ref: HTMLElement) => void;\n values: () => HTMLElement[];\n};\n\nexport function useRefsManager(): refsManager {\n const refs = useRef(new Map<string, HTMLElement>());\n const [, forceUpdate] = useReducer((x) => !x, false);\n\n const get = useCallback((key: string) => refs.current.get(key), []);\n\n const set = useCallback((key: string, value: HTMLElement) => {\n refs.current.set(key, value);\n forceUpdate();\n }, []);\n\n const values = useCallback(() => {\n const vals: HTMLElement[] = [];\n for (const value of refs.current.values()) {\n vals.push(value);\n }\n return vals;\n }, []);\n\n return useMemo(() => ({ get, set, values }), [get, set, values]);\n}\n"],"names":["useRef","useReducer","useCallback","useMemo"],"mappings":";;;;AAQO,SAAS,cAA8B,GAAA;AAC5C,EAAA,MAAM,IAAO,GAAAA,YAAA,iBAAW,IAAA,GAAA,EAA0B,CAAA;AAClD,EAAM,MAAA,GAAG,WAAW,CAAA,GAAIC,iBAAW,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,KAAK,CAAA;AAEnD,EAAM,MAAA,GAAA,GAAMC,iBAAY,CAAA,CAAC,GAAgB,KAAA,IAAA,CAAK,QAAQ,GAAI,CAAA,GAAG,CAAG,EAAA,EAAE,CAAA;AAElE,EAAA,MAAM,GAAM,GAAAA,iBAAA,CAAY,CAAC,GAAA,EAAa,KAAuB,KAAA;AAC3D,IAAK,IAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,EAAK,KAAK,CAAA;AAC3B,IAAY,WAAA,EAAA;AAAA,GACd,EAAG,EAAE,CAAA;AAEL,EAAM,MAAA,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,MAAM,OAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,KAAS,IAAA,IAAA,CAAK,OAAQ,CAAA,MAAA,EAAU,EAAA;AACzC,MAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA;AAEjB,IAAO,OAAA,IAAA;AAAA,GACT,EAAG,EAAE,CAAA;AAEL,EAAO,OAAAC,aAAA,CAAQ,OAAO,EAAE,GAAK,EAAA,GAAA,EAAK,MAAO,EAAA,CAAA,EAAI,CAAC,GAAA,EAAK,GAAK,EAAA,MAAM,CAAC,CAAA;AACjE;;;;"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@salt-ds/core');
5
+ var clsx = require('clsx');
6
+ var react = require('react');
7
+ var CollapsibleContext = require('./CollapsibleContext.js');
8
+
9
+ const withBaseName = core.makePrefixer("saltCollapsible");
10
+ const Collapsible = react.forwardRef(
11
+ function Collapsible2(props, ref) {
12
+ const {
13
+ className,
14
+ open: openProp,
15
+ defaultOpen,
16
+ onOpenChange,
17
+ ...rest
18
+ } = props;
19
+ const [open, setOpenState] = core.useControlled({
20
+ default: Boolean(defaultOpen),
21
+ controlled: openProp,
22
+ name: "Collapsible",
23
+ state: "open"
24
+ });
25
+ const [panelId, setPanelId] = react.useState(void 0);
26
+ const setOpen = react.useCallback(
27
+ (event, newOpen) => {
28
+ setOpenState(newOpen);
29
+ onOpenChange == null ? void 0 : onOpenChange(event, newOpen);
30
+ },
31
+ [onOpenChange]
32
+ );
33
+ const contextValue = react.useMemo(
34
+ () => ({
35
+ open,
36
+ setOpen,
37
+ panelId,
38
+ setPanelId
39
+ }),
40
+ [open, setOpen, panelId]
41
+ );
42
+ return /* @__PURE__ */ jsxRuntime.jsx(CollapsibleContext.CollapsibleContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: clsx.clsx(withBaseName(), className), ref, ...rest }) });
43
+ }
44
+ );
45
+
46
+ exports.Collapsible = Collapsible;
47
+ //# sourceMappingURL=Collapsible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Collapsible.js","sources":["../src/collapsible/Collapsible.tsx"],"sourcesContent":["import { makePrefixer, useControlled } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type SyntheticEvent,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { CollapsibleContext } from \"./CollapsibleContext\";\n\nexport interface CollapsibleProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onToggle\"> {\n /**\n * Whether the accordion is open.\n */\n open?: boolean;\n /**\n * Whether the accordion is open by default.\n */\n defaultOpen?: boolean;\n /**\n * Callback fired when the accordion is opened or closed.\n */\n onOpenChange?: (\n event: SyntheticEvent<HTMLButtonElement>,\n open: boolean,\n ) => void;\n}\n\nconst withBaseName = makePrefixer(\"saltCollapsible\");\n\nexport const Collapsible = forwardRef<HTMLDivElement, CollapsibleProps>(\n function Collapsible(props, ref) {\n const {\n className,\n open: openProp,\n defaultOpen,\n onOpenChange,\n ...rest\n } = props;\n\n const [open, setOpenState] = useControlled({\n default: Boolean(defaultOpen),\n controlled: openProp,\n name: \"Collapsible\",\n state: \"open\",\n });\n\n const [panelId, setPanelId] = useState<string | undefined>(undefined);\n\n const setOpen = useCallback(\n (event: SyntheticEvent<HTMLButtonElement>, newOpen: boolean) => {\n setOpenState(newOpen);\n onOpenChange?.(event, newOpen);\n },\n [onOpenChange],\n );\n\n const contextValue = useMemo(\n () => ({\n open,\n setOpen,\n panelId,\n setPanelId,\n }),\n [open, setOpen, panelId],\n );\n\n return (\n <CollapsibleContext.Provider value={contextValue}>\n <div className={clsx(withBaseName(), className)} ref={ref} {...rest} />\n </CollapsibleContext.Provider>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","Collapsible","useControlled","useState","useCallback","useMemo","CollapsibleContext","jsx","clsx"],"mappings":";;;;;;;;AA+BA,MAAM,YAAA,GAAeA,kBAAa,iBAAiB,CAAA;AAE5C,MAAM,WAAc,GAAAC,gBAAA;AAAA,EACzB,SAASC,YAAY,CAAA,KAAA,EAAO,GAAK,EAAA;AAC/B,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,IAAM,EAAA,QAAA;AAAA,MACN,WAAA;AAAA,MACA,YAAA;AAAA,MACA,GAAG;AAAA,KACD,GAAA,KAAA;AAEJ,IAAA,MAAM,CAAC,IAAA,EAAM,YAAY,CAAA,GAAIC,kBAAc,CAAA;AAAA,MACzC,OAAA,EAAS,QAAQ,WAAW,CAAA;AAAA,MAC5B,UAAY,EAAA,QAAA;AAAA,MACZ,IAAM,EAAA,aAAA;AAAA,MACN,KAAO,EAAA;AAAA,KACR,CAAA;AAED,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAA6B,MAAS,CAAA;AAEpE,IAAA,MAAM,OAAU,GAAAC,iBAAA;AAAA,MACd,CAAC,OAA0C,OAAqB,KAAA;AAC9D,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAe,KAAO,EAAA,OAAA,CAAA;AAAA,OACxB;AAAA,MACA,CAAC,YAAY;AAAA,KACf;AAEA,IAAA,MAAM,YAAe,GAAAC,aAAA;AAAA,MACnB,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF,CAAA;AAAA,MACA,CAAC,IAAM,EAAA,OAAA,EAAS,OAAO;AAAA,KACzB;AAEA,IAAA,sCACGC,qCAAmB,CAAA,QAAA,EAAnB,EAA4B,KAAA,EAAO,cAClC,QAAC,kBAAAC,cAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAAC,SAAA,CAAK,cAAgB,EAAA,SAAS,GAAG,GAAW,EAAA,GAAG,MAAM,CACvE,EAAA,CAAA;AAAA;AAGN;;;;"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ var core = require('@salt-ds/core');
4
+ var react = require('react');
5
+
6
+ const CollapsibleContext = core.createContext(
7
+ "CollapsibleContext",
8
+ {
9
+ open: false,
10
+ setOpen: () => {
11
+ },
12
+ panelId: void 0,
13
+ setPanelId: () => {
14
+ }
15
+ }
16
+ );
17
+ function useCollapsibleContext() {
18
+ return react.useContext(CollapsibleContext);
19
+ }
20
+
21
+ exports.CollapsibleContext = CollapsibleContext;
22
+ exports.useCollapsibleContext = useCollapsibleContext;
23
+ //# sourceMappingURL=CollapsibleContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollapsibleContext.js","sources":["../src/collapsible/CollapsibleContext.ts"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { type SyntheticEvent, useContext } from \"react\";\n\nexport type CollapsibleContextValue = {\n open: boolean;\n setOpen: (event: SyntheticEvent<HTMLButtonElement>, open: boolean) => void;\n panelId?: string;\n setPanelId?: (panelId: string) => void;\n};\n\nexport const CollapsibleContext = createContext<CollapsibleContextValue>(\n \"CollapsibleContext\",\n {\n open: false,\n setOpen: () => {},\n panelId: undefined,\n setPanelId: () => {},\n },\n);\n\nexport function useCollapsibleContext() {\n return useContext(CollapsibleContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAUO,MAAM,kBAAqB,GAAAA,kBAAA;AAAA,EAChC,oBAAA;AAAA,EACA;AAAA,IACE,IAAM,EAAA,KAAA;AAAA,IACN,SAAS,MAAM;AAAA,KAAC;AAAA,IAChB,OAAS,EAAA,MAAA;AAAA,IACT,YAAY,MAAM;AAAA;AAAC;AAEvB;AAEO,SAAS,qBAAwB,GAAA;AACtC,EAAA,OAAOC,iBAAW,kBAAkB,CAAA;AACtC;;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var css_248z = ".saltCollapsiblePanel {\n display: grid;\n transition:\n grid-template-rows var(--salt-duration-perceptible) ease-in-out,\n opacity var(--salt-duration-perceptible) ease-in-out,\n visibility var(--salt-duration-perceptible) ease-in-out;\n}\n\n.saltCollapsiblePanel[aria-hidden=\"true\"] {\n grid-template-rows: 0fr;\n opacity: 0;\n visibility: hidden;\n}\n\n.saltCollapsiblePanel {\n grid-template-rows: 1fr;\n opacity: 1;\n visibility: visible;\n}\n\n.saltCollapsiblePanel-inner {\n overflow: hidden;\n}\n";
4
+
5
+ module.exports = css_248z;
6
+ //# sourceMappingURL=CollapsiblePanel.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollapsiblePanel.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@salt-ds/core');
5
+ var styles = require('@salt-ds/styles');
6
+ var window = require('@salt-ds/window');
7
+ var clsx = require('clsx');
8
+ var react = require('react');
9
+ var CollapsibleContext = require('./CollapsibleContext.js');
10
+ var CollapsiblePanel$1 = require('./CollapsiblePanel.css.js');
11
+
12
+ const withBaseName = core.makePrefixer("saltCollapsiblePanel");
13
+ const CollapsiblePanel = (props) => {
14
+ const { children, className, id: idProp, ...rest } = props;
15
+ const targetWindow = window.useWindow();
16
+ styles.useComponentCssInjection({
17
+ testId: "salt-collapsible-panel",
18
+ css: CollapsiblePanel$1,
19
+ window: targetWindow
20
+ });
21
+ const id = core.useId(idProp);
22
+ const { open, setPanelId } = CollapsibleContext.useCollapsibleContext();
23
+ react.useEffect(() => {
24
+ if (id) {
25
+ setPanelId == null ? void 0 : setPanelId(id);
26
+ }
27
+ }, [id, setPanelId]);
28
+ return /* @__PURE__ */ jsxRuntime.jsx(
29
+ "div",
30
+ {
31
+ className: clsx.clsx(withBaseName(), className),
32
+ id,
33
+ "aria-hidden": !open ? "true" : void 0,
34
+ hidden: !open,
35
+ ...rest,
36
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: withBaseName("inner"), children })
37
+ }
38
+ );
39
+ };
40
+
41
+ exports.CollapsiblePanel = CollapsiblePanel;
42
+ //# sourceMappingURL=CollapsiblePanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollapsiblePanel.js","sources":["../src/collapsible/CollapsiblePanel.tsx"],"sourcesContent":["import { makePrefixer, useId } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, useEffect } from \"react\";\n\nimport { useCollapsibleContext } from \"./CollapsibleContext\";\nimport collapsiblePanelCss from \"./CollapsiblePanel.css\";\n\nexport interface CollapsiblePanelProps\n extends ComponentPropsWithoutRef<\"div\"> {}\n\nconst withBaseName = makePrefixer(\"saltCollapsiblePanel\");\n\nexport const CollapsiblePanel = (props: CollapsiblePanelProps) => {\n const { children, className, id: idProp, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-collapsible-panel\",\n css: collapsiblePanelCss,\n window: targetWindow,\n });\n\n const id = useId(idProp);\n const { open, setPanelId } = useCollapsibleContext();\n\n useEffect(() => {\n if (id) {\n setPanelId?.(id);\n }\n }, [id, setPanelId]);\n\n return (\n <div\n className={clsx(withBaseName(), className)}\n id={id}\n aria-hidden={!open ? \"true\" : undefined}\n hidden={!open}\n {...rest}\n >\n <div className={withBaseName(\"inner\")}>{children}</div>\n </div>\n );\n};\n"],"names":["makePrefixer","useWindow","useComponentCssInjection","collapsiblePanelCss","useId","useCollapsibleContext","useEffect","jsx","clsx"],"mappings":";;;;;;;;;;;AAYA,MAAM,YAAA,GAAeA,kBAAa,sBAAsB,CAAA;AAE3C,MAAA,gBAAA,GAAmB,CAAC,KAAiC,KAAA;AAChE,EAAA,MAAM,EAAE,QAAU,EAAA,SAAA,EAAW,IAAI,MAAQ,EAAA,GAAG,MAAS,GAAA,KAAA;AAErD,EAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,wBAAA;AAAA,IACR,GAAK,EAAAC,kBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,EAAA,GAAKC,WAAM,MAAM,CAAA;AACvB,EAAA,MAAM,EAAE,IAAA,EAAM,UAAW,EAAA,GAAIC,wCAAsB,EAAA;AAEnD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,EAAI,EAAA;AACN,MAAa,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAA,EAAA,CAAA;AAAA;AACf,GACC,EAAA,CAAC,EAAI,EAAA,UAAU,CAAC,CAAA;AAEnB,EACE,uBAAAC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAAC,SAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,MACzC,EAAA;AAAA,MACA,aAAA,EAAa,CAAC,IAAA,GAAO,MAAS,GAAA,MAAA;AAAA,MAC9B,QAAQ,CAAC,IAAA;AAAA,MACR,GAAG,IAAA;AAAA,MAEJ,yCAAC,KAAI,EAAA,EAAA,SAAA,EAAW,YAAa,CAAA,OAAO,GAAI,QAAS,EAAA;AAAA;AAAA,GACnD;AAEJ;;;;"}
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@salt-ds/core');
5
+ var clsx = require('clsx');
6
+ var react = require('react');
7
+ var CollapsibleContext = require('./CollapsibleContext.js');
8
+
9
+ const withBaseName = core.makePrefixer("saltCollapsibleTrigger");
10
+ const CollapsibleTrigger = react.forwardRef(function CollapsibleTrigger2(props, ref) {
11
+ const { children, className, onClick } = props;
12
+ const { open, setOpen, panelId } = CollapsibleContext.useCollapsibleContext();
13
+ const handleClick = (event) => {
14
+ setOpen(event, !open);
15
+ onClick == null ? void 0 : onClick(event);
16
+ };
17
+ if (!children || !react.isValidElement(children)) {
18
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
19
+ }
20
+ return react.cloneElement(children, {
21
+ ...core.mergeProps(
22
+ {
23
+ className: clsx.clsx(withBaseName(), className),
24
+ "aria-expanded": open,
25
+ "aria-controls": panelId,
26
+ onClick: handleClick
27
+ },
28
+ children.props
29
+ ),
30
+ ref
31
+ });
32
+ });
33
+
34
+ exports.CollapsibleTrigger = CollapsibleTrigger;
35
+ //# sourceMappingURL=CollapsibleTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollapsibleTrigger.js","sources":["../src/collapsible/CollapsibleTrigger.tsx"],"sourcesContent":["import { makePrefixer, mergeProps } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n cloneElement,\n forwardRef,\n isValidElement,\n type MouseEvent,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { useCollapsibleContext } from \"./CollapsibleContext\";\n\nexport interface CollapsibleTriggerProps\n extends Pick<ComponentPropsWithoutRef<\"button\">, \"className\" | \"onClick\"> {\n children: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltCollapsibleTrigger\");\n\nexport const CollapsibleTrigger = forwardRef<\n HTMLButtonElement,\n CollapsibleTriggerProps\n>(function CollapsibleTrigger(props, ref) {\n const { children, className, onClick } = props;\n\n const { open, setOpen, panelId } = useCollapsibleContext();\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n setOpen(event, !open);\n onClick?.(event);\n };\n\n if (!children || !isValidElement<{ ref?: Ref<unknown> }>(children)) {\n // Should we log or throw error?\n return <>{children}</>;\n }\n\n return cloneElement(children, {\n ...mergeProps(\n {\n className: clsx(withBaseName(), className),\n \"aria-expanded\": open,\n \"aria-controls\": panelId,\n onClick: handleClick,\n },\n children.props,\n ),\n ref,\n });\n});\n"],"names":["makePrefixer","forwardRef","CollapsibleTrigger","useCollapsibleContext","isValidElement","cloneElement","mergeProps","clsx"],"mappings":";;;;;;;;AAkBA,MAAM,YAAA,GAAeA,kBAAa,wBAAwB,CAAA;AAEnD,MAAM,kBAAqB,GAAAC,gBAAA,CAGhC,SAASC,mBAAAA,CAAmB,OAAO,GAAK,EAAA;AACxC,EAAA,MAAM,EAAE,QAAA,EAAU,SAAW,EAAA,OAAA,EAAY,GAAA,KAAA;AAEzC,EAAA,MAAM,EAAE,IAAA,EAAM,OAAS,EAAA,OAAA,KAAYC,wCAAsB,EAAA;AAEzD,EAAM,MAAA,WAAA,GAAc,CAAC,KAAyC,KAAA;AAC5D,IAAQ,OAAA,CAAA,KAAA,EAAO,CAAC,IAAI,CAAA;AACpB,IAAU,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,KAAA,CAAA;AAAA,GACZ;AAEA,EAAA,IAAI,CAAC,QAAA,IAAY,CAACC,oBAAA,CAAuC,QAAQ,CAAG,EAAA;AAElE,IAAA,6DAAU,QAAS,EAAA,CAAA;AAAA;AAGrB,EAAA,OAAOC,mBAAa,QAAU,EAAA;AAAA,IAC5B,GAAGC,eAAA;AAAA,MACD;AAAA,QACE,SAAW,EAAAC,SAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,QACzC,eAAiB,EAAA,IAAA;AAAA,QACjB,eAAiB,EAAA,OAAA;AAAA,QACjB,OAAS,EAAA;AAAA,OACX;AAAA,MACA,QAAS,CAAA;AAAA,KACX;AAAA,IACA;AAAA,GACD,CAAA;AACH,CAAC;;;;"}
@@ -60,7 +60,7 @@ const AlphaInput = ({
60
60
  InputLegacy.InputLegacy,
61
61
  {
62
62
  inputProps: {
63
- // @ts-ignore
63
+ // @ts-expect-error
64
64
  "data-testid": "a-input"
65
65
  },
66
66
  className: clsx.clsx({
@@ -1 +1 @@
1
- {"version":3,"file":"AlphaInputField.js","sources":["../src/color-chooser/AlphaInputField.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type FocusEvent,\n type KeyboardEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { InputLegacy as Input } from \"../input-legacy\";\n\nimport rgbaInputCss from \"./RGBAInput.css\";\n\nconst withBaseName = makePrefixer(\"saltColorChooser\");\n\ninterface AlphaInputProps {\n alphaValue: number;\n showAsOpacity?: boolean;\n onSubmit: (alpha: number, e?: ChangeEvent) => void;\n}\n\nexport const AlphaInput = ({\n alphaValue,\n onSubmit,\n showAsOpacity = false,\n}: AlphaInputProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-rgba-input\",\n css: rgbaInputCss,\n window: targetWindow,\n });\n\n const [alphaInputValue, setAlphaInputValue] = useState<string>(\n !Number.isNaN(alphaValue) ? alphaValue.toString() : \"\",\n );\n\n useEffect(() => {\n setAlphaInputValue(!Number.isNaN(alphaValue) ? alphaValue.toString() : \"\");\n }, [alphaValue]);\n\n const handleAlphaInputChange = (\n event: ChangeEvent<HTMLInputElement>,\n newValue: string,\n ): void => {\n const value = newValue.replace(\"%\", \"\");\n let alpha: string = value;\n\n if (value.trim() === \"\" || Number.isNaN(value)) {\n alpha = \"\";\n }\n\n if (showAsOpacity && Number.parseFloat(value)) {\n alpha = (Number.parseFloat(value) / 100).toString();\n }\n\n if (value.charAt(1) === \".\" || value.charAt(0) === \".\") {\n alpha = value;\n }\n\n setAlphaInputValue(alpha);\n };\n\n const handleKeyDownAlpha = (e: KeyboardEvent<HTMLInputElement>): void => {\n if (e.key === \"Enter\") {\n const alpha =\n alphaInputValue.trim().replace(\"%\", \"\") !== \"\"\n ? Number.parseFloat(alphaInputValue)\n : 0;\n const validatedAlpha = Math.max(0, Math.min(alpha, 1));\n setAlphaInputValue(validatedAlpha.toString());\n onSubmit(validatedAlpha);\n }\n };\n\n const handleOnBlurAlpha = (e: FocusEvent<HTMLInputElement>): void => {\n // Guard against parseFloat('') becoming NaN\n const alpha =\n alphaInputValue.trim() !== \"\" ? Number.parseFloat(alphaInputValue) : 0;\n\n const validatedAlpha = Math.max(0, Math.min(alpha, 1));\n setAlphaInputValue(validatedAlpha.toString());\n onSubmit(validatedAlpha, e);\n };\n\n return (\n <Input\n inputProps={{\n // @ts-ignore\n \"data-testid\": \"a-input\",\n }}\n className={clsx({\n [withBaseName(\"rgbaInput\")]: !showAsOpacity,\n [withBaseName(\"opacityInput\")]: showAsOpacity,\n })}\n value={\n showAsOpacity\n ? alphaInputValue\n ? `${(Number.parseFloat(alphaInputValue) * 100).toString()}%`\n : \"%\"\n : alphaInputValue\n }\n onChange={handleAlphaInputChange}\n onBlur={handleOnBlurAlpha}\n onKeyDown={handleKeyDownAlpha}\n />\n );\n};\n"],"names":["makePrefixer","useWindow","useComponentCssInjection","rgbaInputCss","useState","useEffect","jsx","Input","clsx"],"mappings":";;;;;;;;;;;;AAeA,MAAM,YAAA,GAAeA,kBAAa,kBAAkB,CAAA;AAQ7C,MAAM,aAAa,CAAC;AAAA,EACzB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAgB,GAAA;AAClB,CAAoC,KAAA;AAClC,EAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,iBAAA;AAAA,IACR,GAAK,EAAAC,SAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAAC,cAAA;AAAA,IAC5C,CAAC,MAAO,CAAA,KAAA,CAAM,UAAU,CAAI,GAAA,UAAA,CAAW,UAAa,GAAA;AAAA,GACtD;AAEA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAmB,kBAAA,CAAA,CAAC,OAAO,KAAM,CAAA,UAAU,IAAI,UAAW,CAAA,QAAA,KAAa,EAAE,CAAA;AAAA,GAC3E,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAM,MAAA,sBAAA,GAAyB,CAC7B,KAAA,EACA,QACS,KAAA;AACT,IAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,EAAK,EAAE,CAAA;AACtC,IAAA,IAAI,KAAgB,GAAA,KAAA;AAEpB,IAAA,IAAI,MAAM,IAAK,EAAA,KAAM,MAAM,MAAO,CAAA,KAAA,CAAM,KAAK,CAAG,EAAA;AAC9C,MAAQ,KAAA,GAAA,EAAA;AAAA;AAGV,IAAA,IAAI,aAAiB,IAAA,MAAA,CAAO,UAAW,CAAA,KAAK,CAAG,EAAA;AAC7C,MAAA,KAAA,GAAA,CAAS,MAAO,CAAA,UAAA,CAAW,KAAK,CAAA,GAAI,KAAK,QAAS,EAAA;AAAA;AAGpD,IAAI,IAAA,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,OAAO,KAAM,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,GAAK,EAAA;AACtD,MAAQ,KAAA,GAAA,KAAA;AAAA;AAGV,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,GAC1B;AAEA,EAAM,MAAA,kBAAA,GAAqB,CAAC,CAA6C,KAAA;AACvE,IAAI,IAAA,CAAA,CAAE,QAAQ,OAAS,EAAA;AACrB,MAAA,MAAM,KACJ,GAAA,eAAA,CAAgB,IAAK,EAAA,CAAE,OAAQ,CAAA,GAAA,EAAK,EAAE,CAAA,KAAM,EACxC,GAAA,MAAA,CAAO,UAAW,CAAA,eAAe,CACjC,GAAA,CAAA;AACN,MAAM,MAAA,cAAA,GAAiB,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,KAAA,EAAO,CAAC,CAAC,CAAA;AACrD,MAAmB,kBAAA,CAAA,cAAA,CAAe,UAAU,CAAA;AAC5C,MAAA,QAAA,CAAS,cAAc,CAAA;AAAA;AACzB,GACF;AAEA,EAAM,MAAA,iBAAA,GAAoB,CAAC,CAA0C,KAAA;AAEnE,IAAM,MAAA,KAAA,GACJ,gBAAgB,IAAK,EAAA,KAAM,KAAK,MAAO,CAAA,UAAA,CAAW,eAAe,CAAI,GAAA,CAAA;AAEvE,IAAM,MAAA,cAAA,GAAiB,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,KAAA,EAAO,CAAC,CAAC,CAAA;AACrD,IAAmB,kBAAA,CAAA,cAAA,CAAe,UAAU,CAAA;AAC5C,IAAA,QAAA,CAAS,gBAAgB,CAAC,CAAA;AAAA,GAC5B;AAEA,EACE,uBAAAC,cAAA;AAAA,IAACC,uBAAA;AAAA,IAAA;AAAA,MACC,UAAY,EAAA;AAAA;AAAA,QAEV,aAAe,EAAA;AAAA,OACjB;AAAA,MACA,WAAWC,SAAK,CAAA;AAAA,QACd,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG,CAAC,aAAA;AAAA,QAC9B,CAAC,YAAA,CAAa,cAAc,CAAC,GAAG;AAAA,OACjC,CAAA;AAAA,MACD,KACE,EAAA,aAAA,GACI,eACE,GAAA,CAAA,EAAA,CAAI,MAAO,CAAA,UAAA,CAAW,eAAe,CAAA,GAAI,GAAK,EAAA,QAAA,EAAU,CAAA,CAAA,CAAA,GACxD,GACF,GAAA,eAAA;AAAA,MAEN,QAAU,EAAA,sBAAA;AAAA,MACV,MAAQ,EAAA,iBAAA;AAAA,MACR,SAAW,EAAA;AAAA;AAAA,GACb;AAEJ;;;;"}
1
+ {"version":3,"file":"AlphaInputField.js","sources":["../src/color-chooser/AlphaInputField.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type FocusEvent,\n type KeyboardEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { InputLegacy as Input } from \"../input-legacy\";\n\nimport rgbaInputCss from \"./RGBAInput.css\";\n\nconst withBaseName = makePrefixer(\"saltColorChooser\");\n\ninterface AlphaInputProps {\n alphaValue: number;\n showAsOpacity?: boolean;\n onSubmit: (alpha: number, e?: ChangeEvent) => void;\n}\n\nexport const AlphaInput = ({\n alphaValue,\n onSubmit,\n showAsOpacity = false,\n}: AlphaInputProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-rgba-input\",\n css: rgbaInputCss,\n window: targetWindow,\n });\n\n const [alphaInputValue, setAlphaInputValue] = useState<string>(\n !Number.isNaN(alphaValue) ? alphaValue.toString() : \"\",\n );\n\n useEffect(() => {\n setAlphaInputValue(!Number.isNaN(alphaValue) ? alphaValue.toString() : \"\");\n }, [alphaValue]);\n\n const handleAlphaInputChange = (\n event: ChangeEvent<HTMLInputElement>,\n newValue: string,\n ): void => {\n const value = newValue.replace(\"%\", \"\");\n let alpha: string = value;\n\n if (value.trim() === \"\" || Number.isNaN(value)) {\n alpha = \"\";\n }\n\n if (showAsOpacity && Number.parseFloat(value)) {\n alpha = (Number.parseFloat(value) / 100).toString();\n }\n\n if (value.charAt(1) === \".\" || value.charAt(0) === \".\") {\n alpha = value;\n }\n\n setAlphaInputValue(alpha);\n };\n\n const handleKeyDownAlpha = (e: KeyboardEvent<HTMLInputElement>): void => {\n if (e.key === \"Enter\") {\n const alpha =\n alphaInputValue.trim().replace(\"%\", \"\") !== \"\"\n ? Number.parseFloat(alphaInputValue)\n : 0;\n const validatedAlpha = Math.max(0, Math.min(alpha, 1));\n setAlphaInputValue(validatedAlpha.toString());\n onSubmit(validatedAlpha);\n }\n };\n\n const handleOnBlurAlpha = (e: FocusEvent<HTMLInputElement>): void => {\n // Guard against parseFloat('') becoming NaN\n const alpha =\n alphaInputValue.trim() !== \"\" ? Number.parseFloat(alphaInputValue) : 0;\n\n const validatedAlpha = Math.max(0, Math.min(alpha, 1));\n setAlphaInputValue(validatedAlpha.toString());\n onSubmit(validatedAlpha, e);\n };\n\n return (\n <Input\n inputProps={{\n // @ts-expect-error\n \"data-testid\": \"a-input\",\n }}\n className={clsx({\n [withBaseName(\"rgbaInput\")]: !showAsOpacity,\n [withBaseName(\"opacityInput\")]: showAsOpacity,\n })}\n value={\n showAsOpacity\n ? alphaInputValue\n ? `${(Number.parseFloat(alphaInputValue) * 100).toString()}%`\n : \"%\"\n : alphaInputValue\n }\n onChange={handleAlphaInputChange}\n onBlur={handleOnBlurAlpha}\n onKeyDown={handleKeyDownAlpha}\n />\n );\n};\n"],"names":["makePrefixer","useWindow","useComponentCssInjection","rgbaInputCss","useState","useEffect","jsx","Input","clsx"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ColorChooser.js","sources":["../src/color-chooser/ColorChooser.tsx"],"sourcesContent":["import {\n Button,\n type ButtonProps,\n makePrefixer,\n Overlay,\n OverlayPanel,\n OverlayPanelCloseButton,\n OverlayPanelContent,\n OverlayTrigger,\n} from \"@salt-ds/core\";\nimport { RefreshIcon } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ChangeEvent, useState } from \"react\";\nimport type { Color } from \"./Color\";\nimport colorChooserCss from \"./ColorChooser.css\";\nimport {\n convertColorMapValueToHex,\n getColorNameByHexValue,\n getHexValue,\n hexValueWithoutAlpha,\n} from \"./ColorHelpers\";\nimport { isTransparent } from \"./color-utils\";\nimport { saltColorMap } from \"./colorMap\";\nimport { createTabsMapping } from \"./createTabsMapping\";\nimport { type ColorChooserTabs, DictTabs } from \"./DictTabs\";\nimport { getColorPalettes } from \"./GetColorPalettes\";\n\nconst withBaseName = makePrefixer(\"saltColorChooser\");\n\nfunction getActiveTab(\n hexValue: string | undefined,\n tabs: ColorChooserTabs,\n saltColorOverrides: Record<string, string> | undefined,\n): number {\n if (tabs.Swatches && tabs[\"Color Picker\"]) {\n const hexNoAlpha: string | undefined = hexValueWithoutAlpha(hexValue);\n const colors = saltColorOverrides ?? saltColorMap;\n // if hexNoAlpha is a Salt color or null/undefined then set the active tab as Swatches\n if (\n hexNoAlpha &&\n !Object.keys(colors).find(\n (key: string) =>\n convertColorMapValueToHex(colors[key])?.toLowerCase() ===\n hexNoAlpha?.toLowerCase(),\n )\n ) {\n return 1;\n }\n }\n return 0;\n}\n\nexport interface ColorChooserProps {\n color: Color | undefined;\n defaultAlpha?: number;\n disableAlphaChooser?: boolean;\n displayHexOnly?: boolean;\n hideLabel?: boolean;\n onClear: () => void; // called when user clicks \"default\" button\n onSelect: (\n color: Color | undefined,\n finalSelection: boolean,\n event?: ChangeEvent,\n ) => void;\n placeholder?: string;\n buttonProps?: Partial<ButtonProps>;\n saltColorOverrides?: Record<string, string>;\n showSwatches?: boolean;\n showColorPicker?: boolean;\n readOnly?: boolean;\n}\n\nexport const ColorChooser = ({\n onClear,\n onSelect,\n color,\n showSwatches = true,\n showColorPicker = true,\n defaultAlpha = 1,\n disableAlphaChooser = false,\n hideLabel = false,\n placeholder,\n buttonProps,\n saltColorOverrides,\n readOnly = false,\n displayHexOnly = false,\n}: ColorChooserProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-color-chooser\",\n css: colorChooserCss,\n window: targetWindow,\n });\n\n const [open, setOpen] = useState(false);\n\n const allColors: string[][] = saltColorOverrides\n ? getColorPalettes(saltColorOverrides)\n : getColorPalettes();\n const displayColorName = displayHexOnly\n ? getHexValue(color?.hex, disableAlphaChooser)\n : getColorNameByHexValue(\n color?.hex,\n disableAlphaChooser,\n saltColorOverrides,\n );\n\n const handleOpenChange = (open: boolean) => setOpen(open);\n\n const alphaForTabs = isTransparent(color?.hex)\n ? defaultAlpha\n : (color?.rgba?.a ?? defaultAlpha);\n\n const tabsMapping = createTabsMapping({\n swatches: showSwatches,\n colorPicker: showColorPicker,\n disableAlphaChooser,\n allColors,\n color,\n alpha: alphaForTabs,\n handleColorChange: onSelect,\n displayColorName,\n placeholder,\n onDialogClosed: () => {\n setOpen(false);\n },\n });\n\n const [activeTab, setActiveTab] = useState<number>(\n getActiveTab(color?.hex, tabsMapping, saltColorOverrides),\n );\n const onDefaultSelected = (): void => {\n if (activeTab === 0 && showSwatches) {\n onClear();\n handleOpenChange(false);\n } else {\n onClear();\n }\n };\n\n const onTabClick = (index: number): void => {\n setActiveTab(index);\n };\n\n const overlayContent = (\n <div\n className={clsx(withBaseName(\"overlayContent\"))}\n data-testid=\"overlay-content\"\n >\n <Button\n data-testid=\"default-button\"\n variant=\"secondary\"\n className={clsx(withBaseName(\"defaultButton\"))}\n onClick={onDefaultSelected}\n >\n <RefreshIcon className={clsx(withBaseName(\"refreshIcon\"))} />\n Default\n </Button>\n <DictTabs\n tabs={tabsMapping}\n hexValue={color?.hex}\n onTabClick={onTabClick}\n activeTab={activeTab}\n />\n </div>\n );\n\n return (\n <Overlay placement=\"bottom\" data-testid=\"color-chooser-overlay\">\n <OverlayTrigger>\n <Button\n className={clsx(withBaseName(\"overlayButton\"), {\n [withBaseName(\"overlayButtonHiddenLabel\")]: hideLabel,\n })}\n // @ts-ignore\n data-testid=\"color-chooser-overlay-button\"\n disabled={readOnly}\n {...buttonProps}\n >\n {color && (\n <div\n className={clsx(withBaseName(\"overlayButtonSwatch\"), {\n [withBaseName(\"overlayButtonSwatchWithBorder\")]:\n color?.hex.startsWith(\"#ffffff\"),\n [withBaseName(\"overlayButtonSwatchTransparent\")]: isTransparent(\n color?.hex,\n ),\n })}\n style={{\n backgroundColor: color?.hex,\n }}\n />\n )}\n {!hideLabel && (\n <div className={withBaseName(\"overlayButtonText\")}>\n {displayColorName ?? placeholder ?? \"No color selected\"}\n </div>\n )}\n </Button>\n </OverlayTrigger>\n <OverlayPanel>\n <OverlayPanelCloseButton />\n <OverlayPanelContent>{overlayContent}</OverlayPanelContent>\n </OverlayPanel>\n </Overlay>\n );\n};\n"],"names":["makePrefixer","hexValueWithoutAlpha","saltColorMap","convertColorMapValueToHex","useWindow","useComponentCssInjection","colorChooserCss","useState","getColorPalettes","getHexValue","getColorNameByHexValue","open","isTransparent","createTabsMapping","jsxs","clsx","Button","jsx","RefreshIcon","DictTabs","Overlay","OverlayTrigger","OverlayPanel","OverlayPanelCloseButton","OverlayPanelContent"],"mappings":"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"}
1
+ {"version":3,"file":"ColorChooser.js","sources":["../src/color-chooser/ColorChooser.tsx"],"sourcesContent":["import {\n Button,\n type ButtonProps,\n makePrefixer,\n Overlay,\n OverlayPanel,\n OverlayPanelCloseButton,\n OverlayPanelContent,\n OverlayTrigger,\n} from \"@salt-ds/core\";\nimport { RefreshIcon } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ChangeEvent, useState } from \"react\";\nimport type { Color } from \"./Color\";\nimport colorChooserCss from \"./ColorChooser.css\";\nimport {\n convertColorMapValueToHex,\n getColorNameByHexValue,\n getHexValue,\n hexValueWithoutAlpha,\n} from \"./ColorHelpers\";\nimport { isTransparent } from \"./color-utils\";\nimport { saltColorMap } from \"./colorMap\";\nimport { createTabsMapping } from \"./createTabsMapping\";\nimport { type ColorChooserTabs, DictTabs } from \"./DictTabs\";\nimport { getColorPalettes } from \"./GetColorPalettes\";\n\nconst withBaseName = makePrefixer(\"saltColorChooser\");\n\nfunction getActiveTab(\n hexValue: string | undefined,\n tabs: ColorChooserTabs,\n saltColorOverrides: Record<string, string> | undefined,\n): number {\n if (tabs.Swatches && tabs[\"Color Picker\"]) {\n const hexNoAlpha: string | undefined = hexValueWithoutAlpha(hexValue);\n const colors = saltColorOverrides ?? saltColorMap;\n // if hexNoAlpha is a Salt color or null/undefined then set the active tab as Swatches\n if (\n hexNoAlpha &&\n !Object.keys(colors).find(\n (key: string) =>\n convertColorMapValueToHex(colors[key])?.toLowerCase() ===\n hexNoAlpha?.toLowerCase(),\n )\n ) {\n return 1;\n }\n }\n return 0;\n}\n\nexport interface ColorChooserProps {\n color: Color | undefined;\n defaultAlpha?: number;\n disableAlphaChooser?: boolean;\n displayHexOnly?: boolean;\n hideLabel?: boolean;\n onClear: () => void; // called when user clicks \"default\" button\n onSelect: (\n color: Color | undefined,\n finalSelection: boolean,\n event?: ChangeEvent,\n ) => void;\n placeholder?: string;\n buttonProps?: Partial<ButtonProps>;\n saltColorOverrides?: Record<string, string>;\n showSwatches?: boolean;\n showColorPicker?: boolean;\n readOnly?: boolean;\n}\n\nexport const ColorChooser = ({\n onClear,\n onSelect,\n color,\n showSwatches = true,\n showColorPicker = true,\n defaultAlpha = 1,\n disableAlphaChooser = false,\n hideLabel = false,\n placeholder,\n buttonProps,\n saltColorOverrides,\n readOnly = false,\n displayHexOnly = false,\n}: ColorChooserProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-color-chooser\",\n css: colorChooserCss,\n window: targetWindow,\n });\n\n const [open, setOpen] = useState(false);\n\n const allColors: string[][] = saltColorOverrides\n ? getColorPalettes(saltColorOverrides)\n : getColorPalettes();\n const displayColorName = displayHexOnly\n ? getHexValue(color?.hex, disableAlphaChooser)\n : getColorNameByHexValue(\n color?.hex,\n disableAlphaChooser,\n saltColorOverrides,\n );\n\n const handleOpenChange = (open: boolean) => setOpen(open);\n\n const alphaForTabs = isTransparent(color?.hex)\n ? defaultAlpha\n : (color?.rgba?.a ?? defaultAlpha);\n\n const tabsMapping = createTabsMapping({\n swatches: showSwatches,\n colorPicker: showColorPicker,\n disableAlphaChooser,\n allColors,\n color,\n alpha: alphaForTabs,\n handleColorChange: onSelect,\n displayColorName,\n placeholder,\n onDialogClosed: () => {\n setOpen(false);\n },\n });\n\n const [activeTab, setActiveTab] = useState<number>(\n getActiveTab(color?.hex, tabsMapping, saltColorOverrides),\n );\n const onDefaultSelected = (): void => {\n if (activeTab === 0 && showSwatches) {\n onClear();\n handleOpenChange(false);\n } else {\n onClear();\n }\n };\n\n const onTabClick = (index: number): void => {\n setActiveTab(index);\n };\n\n const overlayContent = (\n <div\n className={clsx(withBaseName(\"overlayContent\"))}\n data-testid=\"overlay-content\"\n >\n <Button\n data-testid=\"default-button\"\n variant=\"secondary\"\n className={clsx(withBaseName(\"defaultButton\"))}\n onClick={onDefaultSelected}\n >\n <RefreshIcon className={clsx(withBaseName(\"refreshIcon\"))} />\n Default\n </Button>\n <DictTabs\n tabs={tabsMapping}\n hexValue={color?.hex}\n onTabClick={onTabClick}\n activeTab={activeTab}\n />\n </div>\n );\n\n return (\n <Overlay placement=\"bottom\" data-testid=\"color-chooser-overlay\">\n <OverlayTrigger>\n <Button\n className={clsx(withBaseName(\"overlayButton\"), {\n [withBaseName(\"overlayButtonHiddenLabel\")]: hideLabel,\n })}\n data-testid=\"color-chooser-overlay-button\"\n disabled={readOnly}\n {...buttonProps}\n >\n {color && (\n <div\n className={clsx(withBaseName(\"overlayButtonSwatch\"), {\n [withBaseName(\"overlayButtonSwatchWithBorder\")]:\n color?.hex.startsWith(\"#ffffff\"),\n [withBaseName(\"overlayButtonSwatchTransparent\")]: isTransparent(\n color?.hex,\n ),\n })}\n style={{\n backgroundColor: color?.hex,\n }}\n />\n )}\n {!hideLabel && (\n <div className={withBaseName(\"overlayButtonText\")}>\n {displayColorName ?? placeholder ?? \"No color selected\"}\n </div>\n )}\n </Button>\n </OverlayTrigger>\n <OverlayPanel>\n <OverlayPanelCloseButton />\n <OverlayPanelContent>{overlayContent}</OverlayPanelContent>\n </OverlayPanel>\n </Overlay>\n );\n};\n"],"names":["makePrefixer","hexValueWithoutAlpha","saltColorMap","convertColorMapValueToHex","useWindow","useComponentCssInjection","colorChooserCss","useState","getColorPalettes","getHexValue","getColorNameByHexValue","open","isTransparent","createTabsMapping","jsxs","clsx","Button","jsx","RefreshIcon","DictTabs","Overlay","OverlayTrigger","OverlayPanel","OverlayPanelCloseButton","OverlayPanelContent"],"mappings":"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"}
@@ -40,7 +40,7 @@ const DictTabs = ({
40
40
  "aria-hidden": activeTab !== idx,
41
41
  hidden: activeTab !== idx,
42
42
  children: (tab == null ? void 0 : tab.props) ? (
43
- // @ts-ignore
43
+ // @ts-expect-error
44
44
  /* @__PURE__ */ jsxRuntime.jsx(TabComponent, { ...tab == null ? void 0 : tab.props })
45
45
  ) : null
46
46
  },
@@ -1 +1 @@
1
- {"version":3,"file":"DictTabs.js","sources":["../src/color-chooser/DictTabs.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { Tab, Tabstrip, type TabstripProps } from \"../tabs\";\nimport type { ColorPicker, ColorPickerProps } from \"./ColorPicker\";\nimport type { Swatches, SwatchesTabProps } from \"./Swatches\";\n\nconst withBaseName = makePrefixer(\"saltColorChooserDictTabs\");\n\nexport type ColorChooserTabs = {\n Swatches?: {\n Component: typeof Swatches;\n props: SwatchesTabProps;\n };\n \"Color Picker\"?: {\n Component: typeof ColorPicker;\n props: ColorPickerProps;\n };\n};\n\nexport interface DictTabsProps\n extends Omit<TabstripProps, \"tabs\" | \"renderContent\" | \"classes\"> {\n hexValue: string | undefined;\n tabs: ColorChooserTabs;\n onTabClick: (index: number) => void;\n activeTab: number;\n}\n\nexport const DictTabs = ({\n tabs,\n hexValue,\n onTabClick,\n activeTab,\n ...props\n}: DictTabsProps): JSX.Element => {\n return (\n <div>\n <Tabstrip\n {...props}\n data-testid=\"color-chooser-tabstrip\"\n className={clsx(withBaseName(\"wrapper\"))}\n activeTabIndex={activeTab}\n onActiveChange={(tabIndex: number) => onTabClick(tabIndex)}\n >\n {[...Object.keys(tabs)].map((label, i) => (\n <Tab className={clsx(withBaseName(\"text\"))} label={label} key={i} />\n ))}\n </Tabstrip>\n {[...Object.values(tabs)].map((tab, idx) => {\n if (!tab) {\n return null;\n }\n const TabComponent: typeof Swatches | typeof ColorPicker =\n tab?.Component;\n\n return (\n <div\n aria-hidden={activeTab !== idx}\n hidden={activeTab !== idx}\n key={idx}\n >\n {tab?.props ? (\n // @ts-ignore\n <TabComponent {...tab?.props} />\n ) : null}\n </div>\n );\n })}\n </div>\n );\n};\n"],"names":["makePrefixer","jsx","Tabstrip","clsx","Tab"],"mappings":";;;;;;;;;;;AAMA,MAAM,YAAA,GAAeA,kBAAa,0BAA0B,CAAA;AAqBrD,MAAM,WAAW,CAAC;AAAA,EACvB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAkC,KAAA;AAChC,EAAA,uCACG,KACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,iBAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,aAAY,EAAA,wBAAA;AAAA,QACZ,SAAW,EAAAC,SAAA,CAAK,YAAa,CAAA,SAAS,CAAC,CAAA;AAAA,QACvC,cAAgB,EAAA,SAAA;AAAA,QAChB,cAAgB,EAAA,CAAC,QAAqB,KAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,QAExD,QAAA,EAAA,CAAC,GAAG,MAAO,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,KAAA,EAAO,sBACjCF,cAAA,CAAAG,OAAA,EAAA,EAAI,WAAWD,SAAK,CAAA,YAAA,CAAa,MAAM,CAAC,CAAA,EAAG,KAAmB,EAAA,EAAA,CAAG,CACnE;AAAA;AAAA,KACH;AAAA,IACC,CAAC,GAAG,MAAA,CAAO,MAAO,CAAA,IAAI,CAAC,CAAE,CAAA,GAAA,CAAI,CAAC,GAAA,EAAK,GAAQ,KAAA;AAC1C,MAAA,IAAI,CAAC,GAAK,EAAA;AACR,QAAO,OAAA,IAAA;AAAA;AAET,MAAA,MAAM,eACJ,GAAK,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAA,SAAA;AAEP,MACE,uBAAAF,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,eAAa,SAAc,KAAA,GAAA;AAAA,UAC3B,QAAQ,SAAc,KAAA,GAAA;AAAA,UAGrB,QAAK,EAAA,CAAA,GAAA,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAA,KAAA;AAAA;AAAA,4BAEHA,cAAA,CAAA,YAAA,EAAA,EAAc,GAAG,GAAA,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAK,KAAO,EAAA;AAAA,cAC5B;AAAA,SAAA;AAAA,QALC;AAAA,OAMP;AAAA,KAEH;AAAA,GACH,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"DictTabs.js","sources":["../src/color-chooser/DictTabs.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { Tab, Tabstrip, type TabstripProps } from \"../tabs\";\nimport type { ColorPicker, ColorPickerProps } from \"./ColorPicker\";\nimport type { Swatches, SwatchesTabProps } from \"./Swatches\";\n\nconst withBaseName = makePrefixer(\"saltColorChooserDictTabs\");\n\nexport type ColorChooserTabs = {\n Swatches?: {\n Component: typeof Swatches;\n props: SwatchesTabProps;\n };\n \"Color Picker\"?: {\n Component: typeof ColorPicker;\n props: ColorPickerProps;\n };\n};\n\nexport interface DictTabsProps\n extends Omit<TabstripProps, \"tabs\" | \"renderContent\" | \"classes\"> {\n hexValue: string | undefined;\n tabs: ColorChooserTabs;\n onTabClick: (index: number) => void;\n activeTab: number;\n}\n\nexport const DictTabs = ({\n tabs,\n hexValue,\n onTabClick,\n activeTab,\n ...props\n}: DictTabsProps): JSX.Element => {\n return (\n <div>\n <Tabstrip\n {...props}\n data-testid=\"color-chooser-tabstrip\"\n className={clsx(withBaseName(\"wrapper\"))}\n activeTabIndex={activeTab}\n onActiveChange={(tabIndex: number) => onTabClick(tabIndex)}\n >\n {[...Object.keys(tabs)].map((label, i) => (\n <Tab className={clsx(withBaseName(\"text\"))} label={label} key={i} />\n ))}\n </Tabstrip>\n {[...Object.values(tabs)].map((tab, idx) => {\n if (!tab) {\n return null;\n }\n const TabComponent: typeof Swatches | typeof ColorPicker =\n tab?.Component;\n\n return (\n <div\n aria-hidden={activeTab !== idx}\n hidden={activeTab !== idx}\n key={idx}\n >\n {tab?.props ? (\n // @ts-expect-error\n <TabComponent {...tab?.props} />\n ) : null}\n </div>\n );\n })}\n </div>\n );\n};\n"],"names":["makePrefixer","jsx","Tabstrip","clsx","Tab"],"mappings":";;;;;;;;;;;AAMA,MAAM,YAAA,GAAeA,kBAAa,0BAA0B,CAAA;AAqBrD,MAAM,WAAW,CAAC;AAAA,EACvB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAkC,KAAA;AAChC,EAAA,uCACG,KACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,iBAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,aAAY,EAAA,wBAAA;AAAA,QACZ,SAAW,EAAAC,SAAA,CAAK,YAAa,CAAA,SAAS,CAAC,CAAA;AAAA,QACvC,cAAgB,EAAA,SAAA;AAAA,QAChB,cAAgB,EAAA,CAAC,QAAqB,KAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,QAExD,QAAA,EAAA,CAAC,GAAG,MAAO,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,KAAA,EAAO,sBACjCF,cAAA,CAAAG,OAAA,EAAA,EAAI,WAAWD,SAAK,CAAA,YAAA,CAAa,MAAM,CAAC,CAAA,EAAG,KAAmB,EAAA,EAAA,CAAG,CACnE;AAAA;AAAA,KACH;AAAA,IACC,CAAC,GAAG,MAAA,CAAO,MAAO,CAAA,IAAI,CAAC,CAAE,CAAA,GAAA,CAAI,CAAC,GAAA,EAAK,GAAQ,KAAA;AAC1C,MAAA,IAAI,CAAC,GAAK,EAAA;AACR,QAAO,OAAA,IAAA;AAAA;AAET,MAAA,MAAM,eACJ,GAAK,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAA,SAAA;AAEP,MACE,uBAAAF,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,eAAa,SAAc,KAAA,GAAA;AAAA,UAC3B,QAAQ,SAAc,KAAA,GAAA;AAAA,UAGrB,QAAK,EAAA,CAAA,GAAA,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAA,KAAA;AAAA;AAAA,4BAEHA,cAAA,CAAA,YAAA,EAAA,EAAc,GAAG,GAAA,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAK,KAAO,EAAA;AAAA,cAC5B;AAAA,SAAA;AAAA,QALC;AAAA,OAMP;AAAA,KAEH;AAAA,GACH,EAAA,CAAA;AAEJ;;;;"}
@@ -29,7 +29,7 @@ const RGBInput = ({
29
29
  }, [rgbaValue, value]);
30
30
  const handleRGBInputChange = (e, value2) => {
31
31
  let rgb;
32
- rgb = Number.parseInt(value2);
32
+ rgb = Number.parseInt(value2, 10);
33
33
  if (value2.trim() === "" || Number.isNaN(rgb)) {
34
34
  rgb = "";
35
35
  }
@@ -61,7 +61,7 @@ const RGBInput = ({
61
61
  InputLegacy.InputLegacy,
62
62
  {
63
63
  inputProps: {
64
- // @ts-ignore
64
+ // @ts-expect-error
65
65
  "data-testid": `${value}-input`
66
66
  },
67
67
  className: withBaseName("rgbaInput"),
@@ -1 +1 @@
1
- {"version":3,"file":"RGBAInputField.js","sources":["../src/color-chooser/RGBAInputField.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n type ChangeEvent,\n type FocusEvent,\n type KeyboardEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { InputLegacy as Input } from \"../input-legacy\";\nimport type { RGBAValue } from \"./Color\";\nimport rgbaInputCss from \"./RGBAInput.css\";\n\nconst withBaseName = makePrefixer(\"saltColorChooser\");\ninterface RGBInputProps {\n rgbaValue: RGBAValue;\n value: \"r\" | \"g\" | \"b\";\n onSubmit: (rgb: RGBAValue, e?: ChangeEvent) => void;\n}\n\nexport const RGBInput = ({\n rgbaValue,\n value,\n onSubmit,\n}: RGBInputProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-rgba-input\",\n css: rgbaInputCss,\n window: targetWindow,\n });\n\n const [rgbaInputValue, setRgbaInputValue] = useState<number | string>(\n rgbaValue ? rgbaValue[value] : \"\",\n );\n\n useEffect(() => {\n setRgbaInputValue(rgbaValue ? rgbaValue[value] : \"\");\n }, [rgbaValue, value]);\n\n const handleRGBInputChange = (\n e: ChangeEvent<HTMLInputElement>,\n value: string,\n ): void => {\n let rgb: string | number;\n\n rgb = Number.parseInt(value);\n\n if (value.trim() === \"\" || Number.isNaN(rgb)) {\n rgb = \"\";\n }\n\n setRgbaInputValue(rgb);\n };\n\n const handleKeyDownRGB = (e: KeyboardEvent<HTMLInputElement>): void => {\n if (e.key === \"Enter\") {\n const newRgb = { ...rgbaValue, [value]: e.currentTarget.value };\n const validatedRgb = {\n r: Math.max(0, Math.min(newRgb.r, 255)),\n g: Math.max(0, Math.min(newRgb.g, 255)),\n b: Math.max(0, Math.min(newRgb.b, 255)),\n a: newRgb.a,\n };\n\n onSubmit(validatedRgb);\n }\n };\n\n const handleOnBlurRGB = (e: FocusEvent<HTMLInputElement>): void => {\n const newRgb = { ...rgbaValue, [value]: e.target.value };\n const validatedRgb = {\n r: Math.max(0, Math.min(newRgb.r, 255)),\n g: Math.max(0, Math.min(newRgb.g, 255)),\n b: Math.max(0, Math.min(newRgb.b, 255)),\n a: newRgb.a,\n };\n\n onSubmit(validatedRgb, e);\n };\n\n return (\n <Input\n inputProps={{\n // @ts-ignore\n \"data-testid\": `${value}-input`,\n }}\n className={withBaseName(\"rgbaInput\")}\n value={rgbaInputValue.toString()}\n onChange={handleRGBInputChange}\n onBlur={handleOnBlurRGB}\n onKeyDown={handleKeyDownRGB}\n />\n );\n};\n"],"names":["makePrefixer","useWindow","useComponentCssInjection","rgbaInputCss","useState","useEffect","value","jsx","Input"],"mappings":"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"}
1
+ {"version":3,"file":"RGBAInputField.js","sources":["../src/color-chooser/RGBAInputField.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n type ChangeEvent,\n type FocusEvent,\n type KeyboardEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { InputLegacy as Input } from \"../input-legacy\";\nimport type { RGBAValue } from \"./Color\";\nimport rgbaInputCss from \"./RGBAInput.css\";\n\nconst withBaseName = makePrefixer(\"saltColorChooser\");\ninterface RGBInputProps {\n rgbaValue: RGBAValue;\n value: \"r\" | \"g\" | \"b\";\n onSubmit: (rgb: RGBAValue, e?: ChangeEvent) => void;\n}\n\nexport const RGBInput = ({\n rgbaValue,\n value,\n onSubmit,\n}: RGBInputProps): JSX.Element => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-rgba-input\",\n css: rgbaInputCss,\n window: targetWindow,\n });\n\n const [rgbaInputValue, setRgbaInputValue] = useState<number | string>(\n rgbaValue ? rgbaValue[value] : \"\",\n );\n\n useEffect(() => {\n setRgbaInputValue(rgbaValue ? rgbaValue[value] : \"\");\n }, [rgbaValue, value]);\n\n const handleRGBInputChange = (\n e: ChangeEvent<HTMLInputElement>,\n value: string,\n ): void => {\n let rgb: string | number;\n\n rgb = Number.parseInt(value, 10);\n\n if (value.trim() === \"\" || Number.isNaN(rgb)) {\n rgb = \"\";\n }\n\n setRgbaInputValue(rgb);\n };\n\n const handleKeyDownRGB = (e: KeyboardEvent<HTMLInputElement>): void => {\n if (e.key === \"Enter\") {\n const newRgb = { ...rgbaValue, [value]: e.currentTarget.value };\n const validatedRgb = {\n r: Math.max(0, Math.min(newRgb.r, 255)),\n g: Math.max(0, Math.min(newRgb.g, 255)),\n b: Math.max(0, Math.min(newRgb.b, 255)),\n a: newRgb.a,\n };\n\n onSubmit(validatedRgb);\n }\n };\n\n const handleOnBlurRGB = (e: FocusEvent<HTMLInputElement>): void => {\n const newRgb = { ...rgbaValue, [value]: e.target.value };\n const validatedRgb = {\n r: Math.max(0, Math.min(newRgb.r, 255)),\n g: Math.max(0, Math.min(newRgb.g, 255)),\n b: Math.max(0, Math.min(newRgb.b, 255)),\n a: newRgb.a,\n };\n\n onSubmit(validatedRgb, e);\n };\n\n return (\n <Input\n inputProps={{\n // @ts-expect-error\n \"data-testid\": `${value}-input`,\n }}\n className={withBaseName(\"rgbaInput\")}\n value={rgbaInputValue.toString()}\n onChange={handleRGBInputChange}\n onBlur={handleOnBlurRGB}\n onKeyDown={handleKeyDownRGB}\n />\n );\n};\n"],"names":["makePrefixer","useWindow","useComponentCssInjection","rgbaInputCss","useState","useEffect","value","jsx","Input"],"mappings":"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"}