@salt-ds/lab 1.0.0-alpha.13 → 1.0.0-alpha.15

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 (416) hide show
  1. package/dist-cjs/app-header/AppHeader.js +0 -1
  2. package/dist-cjs/app-header/AppHeader.js.map +1 -1
  3. package/dist-cjs/badge/Badge.css.js +1 -1
  4. package/dist-cjs/badge/Badge.js +7 -23
  5. package/dist-cjs/badge/Badge.js.map +1 -1
  6. package/dist-cjs/calendar/internal/CalendarNavigation.js +0 -1
  7. package/dist-cjs/calendar/internal/CalendarNavigation.js.map +1 -1
  8. package/dist-cjs/calendar/useSelection.js +0 -1
  9. package/dist-cjs/calendar/useSelection.js.map +1 -1
  10. package/dist-cjs/carousel/Carousel.js +0 -1
  11. package/dist-cjs/carousel/Carousel.js.map +1 -1
  12. package/dist-cjs/cascading-menu/CascadingMenu.js +0 -1
  13. package/dist-cjs/cascading-menu/CascadingMenu.js.map +1 -1
  14. package/dist-cjs/cascading-menu/CascadingMenuItem.js +0 -1
  15. package/dist-cjs/cascading-menu/CascadingMenuItem.js.map +1 -1
  16. package/dist-cjs/cascading-menu/CascadingMenuList.js +0 -1
  17. package/dist-cjs/cascading-menu/CascadingMenuList.js.map +1 -1
  18. package/dist-cjs/cascading-menu/internal/useClickAway.js +0 -1
  19. package/dist-cjs/cascading-menu/internal/useClickAway.js.map +1 -1
  20. package/dist-cjs/cascading-menu/internal/useMenuTriggerHandlers.js +0 -1
  21. package/dist-cjs/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
  22. package/dist-cjs/combo-box/ComboBox.js +0 -1
  23. package/dist-cjs/combo-box/ComboBox.js.map +1 -1
  24. package/dist-cjs/combo-box/useCombobox.js +0 -1
  25. package/dist-cjs/combo-box/useCombobox.js.map +1 -1
  26. package/dist-cjs/combo-box-deprecated/filterHelpers.js +0 -1
  27. package/dist-cjs/combo-box-deprecated/filterHelpers.js.map +1 -1
  28. package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js +0 -1
  29. package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
  30. package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js +0 -1
  31. package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
  32. package/dist-cjs/combo-box-deprecated/internal/useComboBox.js +0 -1
  33. package/dist-cjs/combo-box-deprecated/internal/useComboBox.js.map +1 -1
  34. package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js +0 -1
  35. package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
  36. package/dist-cjs/common-hooks/useViewportTracking.js +0 -1
  37. package/dist-cjs/common-hooks/useViewportTracking.js.map +1 -1
  38. package/dist-cjs/common-hooks/utils/filter-utils.js +0 -1
  39. package/dist-cjs/common-hooks/utils/filter-utils.js.map +1 -1
  40. package/dist-cjs/contact-details/MailLinkComponent.js +0 -1
  41. package/dist-cjs/contact-details/MailLinkComponent.js.map +1 -1
  42. package/dist-cjs/content-status/ContentStatus.js +0 -2
  43. package/dist-cjs/content-status/ContentStatus.js.map +1 -1
  44. package/dist-cjs/content-status/internal/StatusIndicator.js +0 -3
  45. package/dist-cjs/content-status/internal/StatusIndicator.js.map +1 -1
  46. package/dist-cjs/deck-layout/DeckLayout.js +0 -1
  47. package/dist-cjs/deck-layout/DeckLayout.js.map +1 -1
  48. package/dist-cjs/drawer/Drawer.css.js +6 -0
  49. package/dist-cjs/drawer/Drawer.css.js.map +1 -0
  50. package/dist-cjs/drawer/Drawer.js +77 -0
  51. package/dist-cjs/drawer/Drawer.js.map +1 -0
  52. package/dist-cjs/drawer/useDrawer.js +31 -0
  53. package/dist-cjs/drawer/useDrawer.js.map +1 -0
  54. package/dist-cjs/dropdown/Dropdown.js +0 -1
  55. package/dist-cjs/dropdown/Dropdown.js.map +1 -1
  56. package/dist-cjs/dropdown/DropdownBase.js +0 -1
  57. package/dist-cjs/dropdown/DropdownBase.js.map +1 -1
  58. package/dist-cjs/dropdown/useDropdown.js +0 -1
  59. package/dist-cjs/dropdown/useDropdown.js.map +1 -1
  60. package/dist-cjs/dropdown/useDropdownBase.js +0 -1
  61. package/dist-cjs/dropdown/useDropdownBase.js.map +1 -1
  62. package/dist-cjs/form-field-legacy/FormFieldLegacy.css.js +1 -1
  63. package/dist-cjs/index.js +15 -13
  64. package/dist-cjs/index.js.map +1 -1
  65. package/dist-cjs/layer-layout/LayerLayout.js +0 -1
  66. package/dist-cjs/layer-layout/LayerLayout.js.map +1 -1
  67. package/dist-cjs/list/Highlighter.js +0 -1
  68. package/dist-cjs/list/Highlighter.js.map +1 -1
  69. package/dist-cjs/list/List.js +0 -1
  70. package/dist-cjs/list/List.js.map +1 -1
  71. package/dist-cjs/list/VirtualizedList.js +0 -1
  72. package/dist-cjs/list/VirtualizedList.js.map +1 -1
  73. package/dist-cjs/list/useList.js +0 -1
  74. package/dist-cjs/list/useList.js.map +1 -1
  75. package/dist-cjs/list/useListHeight.js +0 -1
  76. package/dist-cjs/list/useListHeight.js.map +1 -1
  77. package/dist-cjs/list-deprecated/ListItemBase.js +0 -1
  78. package/dist-cjs/list-deprecated/ListItemBase.js.map +1 -1
  79. package/dist-cjs/list-deprecated/internal/Highlighter.js +0 -1
  80. package/dist-cjs/list-deprecated/internal/Highlighter.js.map +1 -1
  81. package/dist-cjs/list-deprecated/useTypeSelect.js +0 -1
  82. package/dist-cjs/list-deprecated/useTypeSelect.js.map +1 -1
  83. package/dist-cjs/list-next/ListItemNext.css.js +1 -1
  84. package/dist-cjs/list-next/ListItemNext.js +17 -6
  85. package/dist-cjs/list-next/ListItemNext.js.map +1 -1
  86. package/dist-cjs/list-next/ListNext.js +21 -10
  87. package/dist-cjs/list-next/ListNext.js.map +1 -1
  88. package/dist-cjs/list-next/ListNextContext.js.map +1 -1
  89. package/dist-cjs/list-next/useList.js +96 -37
  90. package/dist-cjs/list-next/useList.js.map +1 -1
  91. package/dist-cjs/nav-item/ExpansionButton.js +1 -1
  92. package/dist-cjs/nav-item/ExpansionButton.js.map +1 -1
  93. package/dist-cjs/nav-item/NavItem.css.js +1 -1
  94. package/dist-cjs/nav-item/NavItem.js +11 -1
  95. package/dist-cjs/nav-item/NavItem.js.map +1 -1
  96. package/dist-cjs/parent-child-layout/ParentChildLayout.js +0 -1
  97. package/dist-cjs/parent-child-layout/ParentChildLayout.js.map +1 -1
  98. package/dist-cjs/pill-next/PillNext.css.js +6 -0
  99. package/dist-cjs/pill-next/PillNext.css.js.map +1 -0
  100. package/dist-cjs/pill-next/PillNext.js +58 -0
  101. package/dist-cjs/pill-next/PillNext.js.map +1 -0
  102. package/dist-cjs/progress/CircularProgress/CircularProgress.css.js +1 -1
  103. package/dist-cjs/progress/CircularProgress/CircularProgress.js +48 -94
  104. package/dist-cjs/progress/CircularProgress/CircularProgress.js.map +1 -1
  105. package/dist-cjs/progress/LinearProgress/LinearProgress.css.js +1 -1
  106. package/dist-cjs/progress/LinearProgress/LinearProgress.js +18 -66
  107. package/dist-cjs/progress/LinearProgress/LinearProgress.js.map +1 -1
  108. package/dist-cjs/query-input/internal/CategoryList.js +0 -1
  109. package/dist-cjs/query-input/internal/CategoryList.js.map +1 -1
  110. package/dist-cjs/query-input/internal/CategoryListItem.js +0 -1
  111. package/dist-cjs/query-input/internal/CategoryListItem.js.map +1 -1
  112. package/dist-cjs/query-input/internal/QueryInputBody.js +0 -1
  113. package/dist-cjs/query-input/internal/QueryInputBody.js.map +1 -1
  114. package/dist-cjs/query-input/internal/SearchList.js +0 -1
  115. package/dist-cjs/query-input/internal/SearchList.js.map +1 -1
  116. package/dist-cjs/query-input/internal/ValueList.js +0 -1
  117. package/dist-cjs/query-input/internal/ValueList.js.map +1 -1
  118. package/dist-cjs/query-input/useQueryInput.js +0 -1
  119. package/dist-cjs/query-input/useQueryInput.js.map +1 -1
  120. package/dist-cjs/responsive/useOverflow.js +0 -1
  121. package/dist-cjs/responsive/useOverflow.js.map +1 -1
  122. package/dist-cjs/stepped-tracker/StepLabel/StepLabel.css.js +6 -0
  123. package/dist-cjs/stepped-tracker/StepLabel/StepLabel.css.js.map +1 -0
  124. package/dist-cjs/stepped-tracker/StepLabel/StepLabel.js +34 -0
  125. package/dist-cjs/stepped-tracker/StepLabel/StepLabel.js.map +1 -0
  126. package/dist-cjs/stepped-tracker/SteppedTracker.css.js +6 -0
  127. package/dist-cjs/stepped-tracker/SteppedTracker.css.js.map +1 -0
  128. package/dist-cjs/stepped-tracker/SteppedTracker.js +59 -0
  129. package/dist-cjs/stepped-tracker/SteppedTracker.js.map +1 -0
  130. package/dist-cjs/stepped-tracker/SteppedTrackerContext.js +51 -0
  131. package/dist-cjs/stepped-tracker/SteppedTrackerContext.js.map +1 -0
  132. package/dist-cjs/stepped-tracker/TrackerConnector/TrackerConnector.css.js +6 -0
  133. package/dist-cjs/stepped-tracker/TrackerConnector/TrackerConnector.css.js.map +1 -0
  134. package/dist-cjs/stepped-tracker/TrackerConnector/TrackerConnector.js +26 -0
  135. package/dist-cjs/stepped-tracker/TrackerConnector/TrackerConnector.js.map +1 -0
  136. package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.css.js +6 -0
  137. package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.css.js.map +1 -0
  138. package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.js +99 -0
  139. package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.js.map +1 -0
  140. package/dist-cjs/switch/Switch.css.js +1 -1
  141. package/dist-cjs/switch/Switch.js +67 -72
  142. package/dist-cjs/switch/Switch.js.map +1 -1
  143. package/dist-cjs/tabs/Tabstrip.js +0 -1
  144. package/dist-cjs/tabs/Tabstrip.js.map +1 -1
  145. package/dist-cjs/tabs/useActivationIndicator.js +0 -1
  146. package/dist-cjs/tabs/useActivationIndicator.js.map +1 -1
  147. package/dist-cjs/tabs/useKeyboardNavigation.js +0 -1
  148. package/dist-cjs/tabs/useKeyboardNavigation.js.map +1 -1
  149. package/dist-cjs/tabs-next/OverflowMenu.js +0 -1
  150. package/dist-cjs/tabs-next/OverflowMenu.js.map +1 -1
  151. package/dist-cjs/toast-group/ToastGroup.css.js +6 -0
  152. package/dist-cjs/toast-group/ToastGroup.css.js.map +1 -0
  153. package/dist-cjs/toast-group/ToastGroup.js +32 -0
  154. package/dist-cjs/toast-group/ToastGroup.js.map +1 -0
  155. package/dist-cjs/tokenized-input/useTokenizedInput.js +0 -1
  156. package/dist-cjs/tokenized-input/useTokenizedInput.js.map +1 -1
  157. package/dist-cjs/toolbar/Toolbar.js +0 -1
  158. package/dist-cjs/toolbar/Toolbar.js.map +1 -1
  159. package/dist-cjs/toolbar/internal/renderToolbarItems.js +0 -1
  160. package/dist-cjs/toolbar/internal/renderToolbarItems.js.map +1 -1
  161. package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js +0 -1
  162. package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  163. package/dist-cjs/tree/Tree.js +0 -1
  164. package/dist-cjs/tree/Tree.js.map +1 -1
  165. package/dist-cjs/tree/useTree.js +0 -1
  166. package/dist-cjs/tree/useTree.js.map +1 -1
  167. package/dist-es/app-header/AppHeader.js +0 -1
  168. package/dist-es/app-header/AppHeader.js.map +1 -1
  169. package/dist-es/badge/Badge.css.js +1 -1
  170. package/dist-es/badge/Badge.js +9 -25
  171. package/dist-es/badge/Badge.js.map +1 -1
  172. package/dist-es/calendar/internal/CalendarNavigation.js +0 -1
  173. package/dist-es/calendar/internal/CalendarNavigation.js.map +1 -1
  174. package/dist-es/calendar/useSelection.js +0 -1
  175. package/dist-es/calendar/useSelection.js.map +1 -1
  176. package/dist-es/carousel/Carousel.js +0 -1
  177. package/dist-es/carousel/Carousel.js.map +1 -1
  178. package/dist-es/cascading-menu/CascadingMenu.js +0 -1
  179. package/dist-es/cascading-menu/CascadingMenu.js.map +1 -1
  180. package/dist-es/cascading-menu/CascadingMenuItem.js +0 -1
  181. package/dist-es/cascading-menu/CascadingMenuItem.js.map +1 -1
  182. package/dist-es/cascading-menu/CascadingMenuList.js +0 -1
  183. package/dist-es/cascading-menu/CascadingMenuList.js.map +1 -1
  184. package/dist-es/cascading-menu/internal/useClickAway.js +0 -1
  185. package/dist-es/cascading-menu/internal/useClickAway.js.map +1 -1
  186. package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js +0 -1
  187. package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
  188. package/dist-es/combo-box/ComboBox.js +0 -1
  189. package/dist-es/combo-box/ComboBox.js.map +1 -1
  190. package/dist-es/combo-box/useCombobox.js +0 -1
  191. package/dist-es/combo-box/useCombobox.js.map +1 -1
  192. package/dist-es/combo-box-deprecated/filterHelpers.js +0 -1
  193. package/dist-es/combo-box-deprecated/filterHelpers.js.map +1 -1
  194. package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js +0 -1
  195. package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
  196. package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js +0 -1
  197. package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
  198. package/dist-es/combo-box-deprecated/internal/useComboBox.js +0 -1
  199. package/dist-es/combo-box-deprecated/internal/useComboBox.js.map +1 -1
  200. package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js +0 -1
  201. package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
  202. package/dist-es/common-hooks/useViewportTracking.js +0 -1
  203. package/dist-es/common-hooks/useViewportTracking.js.map +1 -1
  204. package/dist-es/common-hooks/utils/filter-utils.js +0 -1
  205. package/dist-es/common-hooks/utils/filter-utils.js.map +1 -1
  206. package/dist-es/contact-details/MailLinkComponent.js +0 -1
  207. package/dist-es/contact-details/MailLinkComponent.js.map +1 -1
  208. package/dist-es/content-status/ContentStatus.js +0 -2
  209. package/dist-es/content-status/ContentStatus.js.map +1 -1
  210. package/dist-es/content-status/internal/StatusIndicator.js +0 -3
  211. package/dist-es/content-status/internal/StatusIndicator.js.map +1 -1
  212. package/dist-es/deck-layout/DeckLayout.js +0 -1
  213. package/dist-es/deck-layout/DeckLayout.js.map +1 -1
  214. package/dist-es/drawer/Drawer.css.js +4 -0
  215. package/dist-es/drawer/Drawer.css.js.map +1 -0
  216. package/dist-es/drawer/Drawer.js +72 -0
  217. package/dist-es/drawer/Drawer.js.map +1 -0
  218. package/dist-es/drawer/useDrawer.js +27 -0
  219. package/dist-es/drawer/useDrawer.js.map +1 -0
  220. package/dist-es/dropdown/Dropdown.js +0 -1
  221. package/dist-es/dropdown/Dropdown.js.map +1 -1
  222. package/dist-es/dropdown/DropdownBase.js +0 -1
  223. package/dist-es/dropdown/DropdownBase.js.map +1 -1
  224. package/dist-es/dropdown/useDropdown.js +0 -1
  225. package/dist-es/dropdown/useDropdown.js.map +1 -1
  226. package/dist-es/dropdown/useDropdownBase.js +0 -1
  227. package/dist-es/dropdown/useDropdownBase.js.map +1 -1
  228. package/dist-es/form-field-legacy/FormFieldLegacy.css.js +1 -1
  229. package/dist-es/index.js +8 -6
  230. package/dist-es/index.js.map +1 -1
  231. package/dist-es/layer-layout/LayerLayout.js +0 -1
  232. package/dist-es/layer-layout/LayerLayout.js.map +1 -1
  233. package/dist-es/list/Highlighter.js +0 -1
  234. package/dist-es/list/Highlighter.js.map +1 -1
  235. package/dist-es/list/List.js +0 -1
  236. package/dist-es/list/List.js.map +1 -1
  237. package/dist-es/list/VirtualizedList.js +0 -1
  238. package/dist-es/list/VirtualizedList.js.map +1 -1
  239. package/dist-es/list/useList.js +0 -1
  240. package/dist-es/list/useList.js.map +1 -1
  241. package/dist-es/list/useListHeight.js +0 -1
  242. package/dist-es/list/useListHeight.js.map +1 -1
  243. package/dist-es/list-deprecated/ListItemBase.js +0 -1
  244. package/dist-es/list-deprecated/ListItemBase.js.map +1 -1
  245. package/dist-es/list-deprecated/internal/Highlighter.js +0 -1
  246. package/dist-es/list-deprecated/internal/Highlighter.js.map +1 -1
  247. package/dist-es/list-deprecated/useTypeSelect.js +0 -1
  248. package/dist-es/list-deprecated/useTypeSelect.js.map +1 -1
  249. package/dist-es/list-next/ListItemNext.css.js +1 -1
  250. package/dist-es/list-next/ListItemNext.js +17 -6
  251. package/dist-es/list-next/ListItemNext.js.map +1 -1
  252. package/dist-es/list-next/ListNext.js +21 -10
  253. package/dist-es/list-next/ListNext.js.map +1 -1
  254. package/dist-es/list-next/ListNextContext.js.map +1 -1
  255. package/dist-es/list-next/useList.js +98 -39
  256. package/dist-es/list-next/useList.js.map +1 -1
  257. package/dist-es/nav-item/ExpansionButton.js +2 -2
  258. package/dist-es/nav-item/ExpansionButton.js.map +1 -1
  259. package/dist-es/nav-item/NavItem.css.js +1 -1
  260. package/dist-es/nav-item/NavItem.js +11 -1
  261. package/dist-es/nav-item/NavItem.js.map +1 -1
  262. package/dist-es/parent-child-layout/ParentChildLayout.js +0 -1
  263. package/dist-es/parent-child-layout/ParentChildLayout.js.map +1 -1
  264. package/dist-es/pill-next/PillNext.css.js +4 -0
  265. package/dist-es/pill-next/PillNext.css.js.map +1 -0
  266. package/dist-es/pill-next/PillNext.js +50 -0
  267. package/dist-es/pill-next/PillNext.js.map +1 -0
  268. package/dist-es/progress/CircularProgress/CircularProgress.css.js +1 -1
  269. package/dist-es/progress/CircularProgress/CircularProgress.js +50 -95
  270. package/dist-es/progress/CircularProgress/CircularProgress.js.map +1 -1
  271. package/dist-es/progress/LinearProgress/LinearProgress.css.js +1 -1
  272. package/dist-es/progress/LinearProgress/LinearProgress.js +18 -66
  273. package/dist-es/progress/LinearProgress/LinearProgress.js.map +1 -1
  274. package/dist-es/query-input/internal/CategoryList.js +0 -1
  275. package/dist-es/query-input/internal/CategoryList.js.map +1 -1
  276. package/dist-es/query-input/internal/CategoryListItem.js +0 -1
  277. package/dist-es/query-input/internal/CategoryListItem.js.map +1 -1
  278. package/dist-es/query-input/internal/QueryInputBody.js +0 -1
  279. package/dist-es/query-input/internal/QueryInputBody.js.map +1 -1
  280. package/dist-es/query-input/internal/SearchList.js +0 -1
  281. package/dist-es/query-input/internal/SearchList.js.map +1 -1
  282. package/dist-es/query-input/internal/ValueList.js +0 -1
  283. package/dist-es/query-input/internal/ValueList.js.map +1 -1
  284. package/dist-es/query-input/useQueryInput.js +0 -1
  285. package/dist-es/query-input/useQueryInput.js.map +1 -1
  286. package/dist-es/responsive/useOverflow.js +0 -1
  287. package/dist-es/responsive/useOverflow.js.map +1 -1
  288. package/dist-es/stepped-tracker/StepLabel/StepLabel.css.js +4 -0
  289. package/dist-es/stepped-tracker/StepLabel/StepLabel.css.js.map +1 -0
  290. package/dist-es/stepped-tracker/StepLabel/StepLabel.js +30 -0
  291. package/dist-es/stepped-tracker/StepLabel/StepLabel.js.map +1 -0
  292. package/dist-es/stepped-tracker/SteppedTracker.css.js +4 -0
  293. package/dist-es/stepped-tracker/SteppedTracker.css.js.map +1 -0
  294. package/dist-es/stepped-tracker/SteppedTracker.js +55 -0
  295. package/dist-es/stepped-tracker/SteppedTracker.js.map +1 -0
  296. package/dist-es/stepped-tracker/SteppedTrackerContext.js +44 -0
  297. package/dist-es/stepped-tracker/SteppedTrackerContext.js.map +1 -0
  298. package/dist-es/stepped-tracker/TrackerConnector/TrackerConnector.css.js +4 -0
  299. package/dist-es/stepped-tracker/TrackerConnector/TrackerConnector.css.js.map +1 -0
  300. package/dist-es/stepped-tracker/TrackerConnector/TrackerConnector.js +22 -0
  301. package/dist-es/stepped-tracker/TrackerConnector/TrackerConnector.js.map +1 -0
  302. package/dist-es/stepped-tracker/TrackerStep/TrackerStep.css.js +4 -0
  303. package/dist-es/stepped-tracker/TrackerStep/TrackerStep.css.js.map +1 -0
  304. package/dist-es/stepped-tracker/TrackerStep/TrackerStep.js +95 -0
  305. package/dist-es/stepped-tracker/TrackerStep/TrackerStep.js.map +1 -0
  306. package/dist-es/switch/Switch.css.js +1 -1
  307. package/dist-es/switch/Switch.js +70 -75
  308. package/dist-es/switch/Switch.js.map +1 -1
  309. package/dist-es/tabs/Tabstrip.js +0 -1
  310. package/dist-es/tabs/Tabstrip.js.map +1 -1
  311. package/dist-es/tabs/useActivationIndicator.js +0 -1
  312. package/dist-es/tabs/useActivationIndicator.js.map +1 -1
  313. package/dist-es/tabs/useKeyboardNavigation.js +0 -1
  314. package/dist-es/tabs/useKeyboardNavigation.js.map +1 -1
  315. package/dist-es/tabs-next/OverflowMenu.js +0 -1
  316. package/dist-es/tabs-next/OverflowMenu.js.map +1 -1
  317. package/dist-es/toast-group/ToastGroup.css.js +4 -0
  318. package/dist-es/toast-group/ToastGroup.css.js.map +1 -0
  319. package/dist-es/toast-group/ToastGroup.js +28 -0
  320. package/dist-es/toast-group/ToastGroup.js.map +1 -0
  321. package/dist-es/tokenized-input/useTokenizedInput.js +0 -1
  322. package/dist-es/tokenized-input/useTokenizedInput.js.map +1 -1
  323. package/dist-es/toolbar/Toolbar.js +0 -1
  324. package/dist-es/toolbar/Toolbar.js.map +1 -1
  325. package/dist-es/toolbar/internal/renderToolbarItems.js +0 -1
  326. package/dist-es/toolbar/internal/renderToolbarItems.js.map +1 -1
  327. package/dist-es/toolbar/overflow-panel/OverflowPanel.js +0 -1
  328. package/dist-es/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
  329. package/dist-es/tree/Tree.js +0 -1
  330. package/dist-es/tree/Tree.js.map +1 -1
  331. package/dist-es/tree/useTree.js +0 -1
  332. package/dist-es/tree/useTree.js.map +1 -1
  333. package/dist-types/badge/Badge.d.ts +5 -16
  334. package/dist-types/content-status/internal/StatusIndicator.d.ts +2 -2
  335. package/dist-types/dialog/internal/DialogContext.d.ts +1 -1
  336. package/dist-types/drawer/Drawer.d.ts +22 -0
  337. package/dist-types/drawer/index.d.ts +2 -0
  338. package/dist-types/drawer/useDrawer.d.ts +27 -0
  339. package/dist-types/index.d.ts +4 -3
  340. package/dist-types/list-next/ListItemNext.d.ts +6 -1
  341. package/dist-types/list-next/ListNext.d.ts +7 -2
  342. package/dist-types/list-next/ListNextContext.d.ts +4 -2
  343. package/dist-types/list-next/useList.d.ts +15 -7
  344. package/dist-types/nav-item/NavItem.d.ts +29 -1
  345. package/dist-types/pill-next/PillNext.d.ts +7 -0
  346. package/dist-types/pill-next/index.d.ts +1 -0
  347. package/dist-types/progress/CircularProgress/CircularProgress.d.ts +6 -43
  348. package/dist-types/progress/LinearProgress/LinearProgress.d.ts +6 -35
  349. package/dist-types/stepped-tracker/StepLabel/StepLabel.d.ts +3 -0
  350. package/dist-types/stepped-tracker/StepLabel/index.d.ts +1 -0
  351. package/dist-types/stepped-tracker/SteppedTracker.d.ts +12 -0
  352. package/dist-types/stepped-tracker/SteppedTrackerContext.d.ts +18 -0
  353. package/dist-types/stepped-tracker/TrackerConnector/TrackerConnector.d.ts +10 -0
  354. package/dist-types/stepped-tracker/TrackerConnector/index.d.ts +1 -0
  355. package/dist-types/stepped-tracker/TrackerStep/TrackerStep.d.ts +10 -0
  356. package/dist-types/stepped-tracker/TrackerStep/index.d.ts +2 -0
  357. package/dist-types/stepped-tracker/index.d.ts +3 -0
  358. package/dist-types/switch/Switch.d.ts +43 -6
  359. package/dist-types/toast-group/ToastGroup.d.ts +5 -0
  360. package/dist-types/toast-group/index.d.ts +1 -0
  361. package/dist-types/utils/index.d.ts +0 -1
  362. package/package.json +8 -8
  363. package/dist-cjs/control-label/ControlLabel.css.js +0 -6
  364. package/dist-cjs/control-label/ControlLabel.css.js.map +0 -1
  365. package/dist-cjs/control-label/ControlLabel.js +0 -48
  366. package/dist-cjs/control-label/ControlLabel.js.map +0 -1
  367. package/dist-cjs/multiline-input/MultilineInput.css.js +0 -6
  368. package/dist-cjs/multiline-input/MultilineInput.css.js.map +0 -1
  369. package/dist-cjs/multiline-input/MultilineInput.js +0 -150
  370. package/dist-cjs/multiline-input/MultilineInput.js.map +0 -1
  371. package/dist-cjs/progress/CircularProgress/CircularProgressParts.js +0 -72
  372. package/dist-cjs/progress/CircularProgress/CircularProgressParts.js.map +0 -1
  373. package/dist-cjs/switch/assets/CheckedIcon.js +0 -34
  374. package/dist-cjs/switch/assets/CheckedIcon.js.map +0 -1
  375. package/dist-cjs/toast/Toast.css.js +0 -6
  376. package/dist-cjs/toast/Toast.css.js.map +0 -1
  377. package/dist-cjs/toast/Toast.js +0 -38
  378. package/dist-cjs/toast/Toast.js.map +0 -1
  379. package/dist-cjs/toast/ToastContent.css.js +0 -6
  380. package/dist-cjs/toast/ToastContent.css.js.map +0 -1
  381. package/dist-cjs/toast/ToastContent.js +0 -30
  382. package/dist-cjs/toast/ToastContent.js.map +0 -1
  383. package/dist-cjs/utils/useFloatingUI.js +0 -38
  384. package/dist-cjs/utils/useFloatingUI.js.map +0 -1
  385. package/dist-es/control-label/ControlLabel.css.js +0 -4
  386. package/dist-es/control-label/ControlLabel.css.js.map +0 -1
  387. package/dist-es/control-label/ControlLabel.js +0 -43
  388. package/dist-es/control-label/ControlLabel.js.map +0 -1
  389. package/dist-es/multiline-input/MultilineInput.css.js +0 -4
  390. package/dist-es/multiline-input/MultilineInput.css.js.map +0 -1
  391. package/dist-es/multiline-input/MultilineInput.js +0 -146
  392. package/dist-es/multiline-input/MultilineInput.js.map +0 -1
  393. package/dist-es/progress/CircularProgress/CircularProgressParts.js +0 -64
  394. package/dist-es/progress/CircularProgress/CircularProgressParts.js.map +0 -1
  395. package/dist-es/switch/assets/CheckedIcon.js +0 -30
  396. package/dist-es/switch/assets/CheckedIcon.js.map +0 -1
  397. package/dist-es/toast/Toast.css.js +0 -4
  398. package/dist-es/toast/Toast.css.js.map +0 -1
  399. package/dist-es/toast/Toast.js +0 -34
  400. package/dist-es/toast/Toast.js.map +0 -1
  401. package/dist-es/toast/ToastContent.css.js +0 -4
  402. package/dist-es/toast/ToastContent.css.js.map +0 -1
  403. package/dist-es/toast/ToastContent.js +0 -26
  404. package/dist-es/toast/ToastContent.js.map +0 -1
  405. package/dist-es/utils/useFloatingUI.js +0 -33
  406. package/dist-es/utils/useFloatingUI.js.map +0 -1
  407. package/dist-types/control-label/ControlLabel.d.ts +0 -8
  408. package/dist-types/control-label/index.d.ts +0 -1
  409. package/dist-types/multiline-input/MultilineInput.d.ts +0 -40
  410. package/dist-types/multiline-input/index.d.ts +0 -1
  411. package/dist-types/progress/CircularProgress/CircularProgressParts.d.ts +0 -13
  412. package/dist-types/switch/assets/CheckedIcon.d.ts +0 -4
  413. package/dist-types/toast/Toast.d.ts +0 -9
  414. package/dist-types/toast/ToastContent.d.ts +0 -2
  415. package/dist-types/toast/index.d.ts +0 -2
  416. package/dist-types/utils/useFloatingUI.d.ts +0 -34
@@ -1,4 +1,4 @@
1
- var css_248z = "/* Default variables applied to the root element */\n.saltListItemNext {\n --listNext-item-text-color: var(--salt-text-primary-foreground);\n --listNext-item-background: none;\n}\n\n.saltListItemNext {\n color: var(--listNext-item-text-color);\n background: var(--listNext-item-background);\n height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n padding-inline: var(--salt-spacing-100);\n display: flex;\n gap: var(--salt-size-unit);\n position: relative;\n align-items: center;\n white-space: nowrap;\n}\n\n/* Class applied to list item on focus using keyboard navigation only */\n.saltListItemNext-focused {\n outline: var(--salt-focused-outline);\n outline-offset: calc(var(--salt-focused-outlineWidth) * -1);\n}\n\n/* Active list item on hover using mouse */\n.saltListItemNext:hover:not([aria-disabled=\"true\"]),\n/* Active list item on focus using keyboard navigation */\n.saltListItemNext-focused {\n --listNext-item-background: var(--salt-selectable-background-hover);\n cursor: var(--salt-selectable-cursor-hover);\n}\n\n.saltListItemNext[aria-selected=\"true\"] {\n border-block: var(--salt-size-border) var(--salt-container-borderStyle) var(--salt-selectable-borderColor-selected);\n --listNext-item-background: var(--salt-selectable-background-selected);\n --saltIcon-color: var(--salt-selectable-foreground-selected);\n}\n\n/* Style applied to disabled items */\n.saltListItemNext[aria-disabled=\"true\"] {\n --listNext-item-text-color: var(--salt-text-primary-foreground-disabled);\n cursor: var(--salt-selectable-cursor-disabled);\n}\n.saltListItemNext[aria-disabled=\"true\"] .saltText {\n color: var(--listNext-item-text-color);\n}\n\n/* disabled list item when selected */\n.saltListItemNext[aria-disabled=\"true\"][aria-selected=\"true\"] {\n border-block: var(--salt-size-border) var(--salt-container-borderStyle) var(--salt-selectable-borderColor-selectedDisabled);\n --listNext-item-background: var(--salt-selectable-background-selectedDisabled);\n}\n";
1
+ var css_248z = "/* Default variables applied to the root element */\n.saltListItemNext {\n --listNext-item-text-color: var(--salt-text-primary-foreground);\n --listNext-item-background: none;\n}\n\n.saltListItemNext {\n color: var(--listNext-item-text-color);\n background: var(--listNext-item-background);\n height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n padding-inline: var(--salt-spacing-100);\n display: flex;\n gap: var(--salt-size-unit);\n position: relative;\n align-items: center;\n white-space: nowrap;\n margin-block: var(--salt-size-border);\n border: var(--salt-focused-outlineWidth) var(--salt-focused-outlineStyle) transparent;\n}\n\n/* Class applied to list item on focus using keyboard navigation only */\n.saltListItemNext-focused {\n border: var(--salt-focused-outline);\n}\n\n/* Active list item on focus using keyboard navigation */\n.saltListItemNext-highlighted:not([aria-disabled=\"true\"]) {\n --listNext-item-background: var(--salt-selectable-background-hover);\n cursor: var(--salt-selectable-cursor-hover);\n}\n\n.saltListItemNext[aria-selected=\"true\"] {\n outline: var(--salt-size-border) var(--salt-container-borderStyle) var(--salt-selectable-borderColor-selected);\n --listNext-item-background: var(--salt-selectable-background-selected);\n --saltIcon-color: var(--salt-selectable-foreground-selected);\n}\n\n/* Style applied to disabled items */\n.saltListItemNext[aria-disabled=\"true\"] {\n --listNext-item-text-color: var(--salt-text-primary-foreground-disabled);\n cursor: var(--salt-selectable-cursor-disabled);\n}\n.saltListItemNext[aria-disabled=\"true\"] .saltText {\n color: var(--listNext-item-text-color);\n}\n\n/* disabled list item when selected */\n.saltListItemNext[aria-disabled=\"true\"][aria-selected=\"true\"] {\n outline: var(--salt-size-border) var(--salt-container-borderStyle) var(--salt-selectable-borderColor-selectedDisabled);\n --listNext-item-background: var(--salt-selectable-background-selectedDisabled);\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=ListItemNext.css.js.map
@@ -13,7 +13,6 @@ const ListItemNext = forwardRef(
13
13
  children,
14
14
  className,
15
15
  disabled: disabledProp,
16
- selected: selectedProp,
17
16
  id: idProp,
18
17
  value,
19
18
  onClick,
@@ -34,15 +33,25 @@ const ListItemNext = forwardRef(
34
33
  disabled: contextDisabled,
35
34
  select,
36
35
  isSelected,
37
- isFocused
36
+ isFocused,
37
+ highlight,
38
+ isHighlighted
38
39
  } = listContext;
39
40
  const itemId = `${contextId || "listNext"}--${id}`;
40
41
  const disabled = disabledProp || contextDisabled;
41
- const selected = selectedProp || isSelected(value);
42
- const focused = isFocused(itemId);
42
+ const selected = isSelected(value);
43
+ const focused = isFocused(value);
44
+ const highlighted = isHighlighted(value);
43
45
  const handleClick = (event) => {
44
- select(event);
45
- onClick == null ? void 0 : onClick(event);
46
+ if (!disabled) {
47
+ select(event);
48
+ onClick == null ? void 0 : onClick(event);
49
+ }
50
+ };
51
+ const handleMouseMove = (event) => {
52
+ if (!highlighted) {
53
+ highlight(event);
54
+ }
46
55
  };
47
56
  return /* @__PURE__ */ jsx("li", {
48
57
  ref,
@@ -50,6 +59,7 @@ const ListItemNext = forwardRef(
50
59
  withBaseName(),
51
60
  {
52
61
  [withBaseName("disabled")]: disabled,
62
+ [withBaseName("highlighted")]: highlighted,
53
63
  [withBaseName("focused")]: focused
54
64
  },
55
65
  className
@@ -60,6 +70,7 @@ const ListItemNext = forwardRef(
60
70
  id: itemId,
61
71
  "data-value": value,
62
72
  onClick: handleClick,
73
+ onMouseMove: handleMouseMove,
63
74
  ...props,
64
75
  children
65
76
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ListItemNext.js","sources":["../src/list-next/ListItemNext.tsx"],"sourcesContent":["import { forwardRef, HTMLAttributes, MouseEvent } from \"react\";\nimport { clsx } from \"clsx\";\nimport { makePrefixer, useId, useIdMemo } from \"@salt-ds/core\";\n\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport listItemNextCss from \"./ListItemNext.css\";\nimport { useListItem } from \"./ListNextContext\";\n\nconst withBaseName = makePrefixer(\"saltListItemNext\");\n\nexport interface ListItemNextProps extends HTMLAttributes<HTMLLIElement> {\n /**\n * If true, the particular list item in list will be disabled.\n */\n disabled?: boolean;\n selected?: boolean;\n id?: string;\n value: string;\n}\n\nexport const ListItemNext = forwardRef<HTMLLIElement, ListItemNextProps>(\n function ListItemNext(\n {\n children,\n className,\n disabled: disabledProp,\n selected: selectedProp,\n id: idProp,\n value,\n onClick,\n ...props\n },\n ref\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-list-item-next\",\n css: listItemNextCss,\n window: targetWindow,\n });\n const id = useIdMemo(idProp);\n\n const listContext = useListItem();\n if (!listContext) return null;\n\n const {\n id: contextId,\n disabled: contextDisabled,\n select,\n isSelected,\n isFocused,\n } = listContext;\n\n const itemId = `${contextId || \"listNext\"}--${id}`;\n const disabled = disabledProp || contextDisabled;\n const selected = selectedProp || isSelected(value);\n const focused = isFocused(itemId);\n\n const handleClick = (event: MouseEvent<HTMLLIElement>) => {\n select(event);\n onClick?.(event);\n };\n\n return (\n <li\n ref={ref}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"focused\")]: focused,\n },\n className\n )}\n role=\"option\"\n aria-disabled={disabled || undefined}\n aria-selected={selected || undefined}\n id={itemId}\n data-value={value}\n onClick={handleClick}\n {...props}\n >\n {children}\n </li>\n );\n }\n);\n"],"names":["ListItemNext","listItemNextCss"],"mappings":";;;;;;;;;AASA,MAAM,YAAA,GAAe,aAAa,kBAAkB,CAAA,CAAA;AAY7C,MAAM,YAAe,GAAA,UAAA;AAAA,EAC1B,SAASA,aACP,CAAA;AAAA,IACE,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,QAAU,EAAA,YAAA;AAAA,IACV,EAAI,EAAA,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,OAAA;AAAA,IACG,GAAA,KAAA;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,qBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAM,MAAA,EAAA,GAAK,UAAU,MAAM,CAAA,CAAA;AAE3B,IAAA,MAAM,cAAc,WAAY,EAAA,CAAA;AAChC,IAAA,IAAI,CAAC,WAAA;AAAa,MAAO,OAAA,IAAA,CAAA;AAEzB,IAAM,MAAA;AAAA,MACJ,EAAI,EAAA,SAAA;AAAA,MACJ,QAAU,EAAA,eAAA;AAAA,MACV,MAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,KACE,GAAA,WAAA,CAAA;AAEJ,IAAM,MAAA,MAAA,GAAS,CAAG,EAAA,SAAA,IAAa,UAAe,CAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA;AAC9C,IAAA,MAAM,WAAW,YAAgB,IAAA,eAAA,CAAA;AACjC,IAAM,MAAA,QAAA,GAAW,YAAgB,IAAA,UAAA,CAAW,KAAK,CAAA,CAAA;AACjD,IAAM,MAAA,OAAA,GAAU,UAAU,MAAM,CAAA,CAAA;AAEhC,IAAM,MAAA,WAAA,GAAc,CAAC,KAAqC,KAAA;AACxD,MAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AACZ,MAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KACZ,CAAA;AAEA,IAAA,uBACG,GAAA,CAAA,IAAA,EAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAW,EAAA,IAAA;AAAA,QACT,YAAa,EAAA;AAAA,QACb;AAAA,UACE,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,UAC5B,CAAC,YAAa,CAAA,SAAS,CAAI,GAAA,OAAA;AAAA,SAC7B;AAAA,QACA,SAAA;AAAA,OACF;AAAA,MACA,IAAK,EAAA,QAAA;AAAA,MACL,iBAAe,QAAY,IAAA,KAAA,CAAA;AAAA,MAC3B,iBAAe,QAAY,IAAA,KAAA,CAAA;AAAA,MAC3B,EAAI,EAAA,MAAA;AAAA,MACJ,YAAY,EAAA,KAAA;AAAA,MACZ,OAAS,EAAA,WAAA;AAAA,MACR,GAAG,KAAA;AAAA,MAEH,QAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"ListItemNext.js","sources":["../src/list-next/ListItemNext.tsx"],"sourcesContent":["import { forwardRef, HTMLAttributes, MouseEvent } from \"react\";\nimport { clsx } from \"clsx\";\nimport { makePrefixer, useIdMemo } from \"@salt-ds/core\";\n\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport listItemNextCss from \"./ListItemNext.css\";\nimport { useListItem } from \"./ListNextContext\";\n\nconst withBaseName = makePrefixer(\"saltListItemNext\");\n\nexport interface ListItemNextProps extends HTMLAttributes<HTMLLIElement> {\n /**\n * If true, the particular list item in list will be disabled.\n */\n disabled?: boolean;\n /**\n * List item id.\n */\n id?: string;\n /**\n * List item value.\n */\n value: string;\n}\n\nexport const ListItemNext = forwardRef<HTMLLIElement, ListItemNextProps>(\n function ListItemNext(\n {\n children,\n className,\n disabled: disabledProp,\n id: idProp,\n value,\n onClick,\n ...props\n },\n ref\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-list-item-next\",\n css: listItemNextCss,\n window: targetWindow,\n });\n const id = useIdMemo(idProp);\n\n const listContext = useListItem();\n if (!listContext) return null;\n\n const {\n id: contextId,\n disabled: contextDisabled,\n select,\n isSelected,\n isFocused,\n highlight,\n isHighlighted,\n } = listContext;\n\n const itemId = `${contextId || \"listNext\"}--${id}`;\n const disabled = disabledProp || contextDisabled;\n const selected = isSelected(value);\n const focused = isFocused(value);\n const highlighted = isHighlighted(value);\n\n const handleClick = (event: MouseEvent<HTMLLIElement>) => {\n if (!disabled) {\n select(event);\n onClick?.(event);\n }\n };\n\n const handleMouseMove = (event: MouseEvent<HTMLLIElement>) => {\n if (!highlighted) {\n highlight(event);\n }\n };\n\n return (\n <li\n ref={ref}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"highlighted\")]: highlighted,\n [withBaseName(\"focused\")]: focused,\n },\n className\n )}\n role=\"option\"\n aria-disabled={disabled || undefined}\n aria-selected={selected || undefined}\n id={itemId}\n data-value={value}\n onClick={handleClick}\n onMouseMove={handleMouseMove}\n {...props}\n >\n {children}\n </li>\n );\n }\n);\n"],"names":["ListItemNext","listItemNextCss"],"mappings":";;;;;;;;;AASA,MAAM,YAAA,GAAe,aAAa,kBAAkB,CAAA,CAAA;AAiB7C,MAAM,YAAe,GAAA,UAAA;AAAA,EAC1B,SAASA,aACP,CAAA;AAAA,IACE,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,EAAI,EAAA,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,OAAA;AAAA,IACG,GAAA,KAAA;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,qBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAM,MAAA,EAAA,GAAK,UAAU,MAAM,CAAA,CAAA;AAE3B,IAAA,MAAM,cAAc,WAAY,EAAA,CAAA;AAChC,IAAA,IAAI,CAAC,WAAA;AAAa,MAAO,OAAA,IAAA,CAAA;AAEzB,IAAM,MAAA;AAAA,MACJ,EAAI,EAAA,SAAA;AAAA,MACJ,QAAU,EAAA,eAAA;AAAA,MACV,MAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,KACE,GAAA,WAAA,CAAA;AAEJ,IAAM,MAAA,MAAA,GAAS,CAAG,EAAA,SAAA,IAAa,UAAe,CAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA;AAC9C,IAAA,MAAM,WAAW,YAAgB,IAAA,eAAA,CAAA;AACjC,IAAM,MAAA,QAAA,GAAW,WAAW,KAAK,CAAA,CAAA;AACjC,IAAM,MAAA,OAAA,GAAU,UAAU,KAAK,CAAA,CAAA;AAC/B,IAAM,MAAA,WAAA,GAAc,cAAc,KAAK,CAAA,CAAA;AAEvC,IAAM,MAAA,WAAA,GAAc,CAAC,KAAqC,KAAA;AACxD,MAAA,IAAI,CAAC,QAAU,EAAA;AACb,QAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AACZ,QAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,OACZ;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,eAAA,GAAkB,CAAC,KAAqC,KAAA;AAC5D,MAAA,IAAI,CAAC,WAAa,EAAA;AAChB,QAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAAA,OACjB;AAAA,KACF,CAAA;AAEA,IAAA,uBACG,GAAA,CAAA,IAAA,EAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAW,EAAA,IAAA;AAAA,QACT,YAAa,EAAA;AAAA,QACb;AAAA,UACE,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,UAC5B,CAAC,YAAa,CAAA,aAAa,CAAI,GAAA,WAAA;AAAA,UAC/B,CAAC,YAAa,CAAA,SAAS,CAAI,GAAA,OAAA;AAAA,SAC7B;AAAA,QACA,SAAA;AAAA,OACF;AAAA,MACA,IAAK,EAAA,QAAA;AAAA,MACL,iBAAe,QAAY,IAAA,KAAA,CAAA;AAAA,MAC3B,iBAAe,QAAY,IAAA,KAAA,CAAA;AAAA,MAC3B,EAAI,EAAA,MAAA;AAAA,MACJ,YAAY,EAAA,KAAA;AAAA,MACZ,OAAS,EAAA,WAAA;AAAA,MACT,WAAa,EAAA,eAAA;AAAA,MACZ,GAAG,KAAA;AAAA,MAEH,QAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -14,14 +14,17 @@ const ListNext = forwardRef(
14
14
  children,
15
15
  className,
16
16
  disabled,
17
+ disableFocus,
17
18
  id,
18
19
  onSelect,
19
20
  onFocus,
20
21
  onBlur,
21
22
  onKeyDown,
22
- onMouseDown,
23
+ onMouseOver,
24
+ highlightedItem,
23
25
  selected,
24
26
  defaultSelected,
27
+ onChange,
25
28
  ...rest
26
29
  }, ref) {
27
30
  const targetWindow = useWindow();
@@ -37,21 +40,29 @@ const ListNext = forwardRef(
37
40
  focusHandler,
38
41
  keyDownHandler,
39
42
  blurHandler,
40
- mouseDownHandler,
43
+ mouseOverHandler,
41
44
  activeDescendant,
42
- contextValue
45
+ contextValue,
46
+ focusVisibleRef
43
47
  } = useList({
44
48
  disabled,
49
+ highlightedItem,
45
50
  selected,
46
51
  defaultSelected,
52
+ onChange,
47
53
  id: listId,
48
54
  ref: listRef
49
55
  });
56
+ const setListRef = useForkRef(focusVisibleRef, handleRef);
50
57
  const handleFocus = (event) => {
51
- focusHandler();
58
+ focusHandler(event);
52
59
  onFocus == null ? void 0 : onFocus(event);
53
60
  };
54
61
  const handleKeyDown = (event) => {
62
+ if (disableFocus) {
63
+ event.preventDefault();
64
+ return;
65
+ }
55
66
  keyDownHandler(event);
56
67
  onKeyDown == null ? void 0 : onKeyDown(event);
57
68
  };
@@ -59,24 +70,24 @@ const ListNext = forwardRef(
59
70
  blurHandler();
60
71
  onBlur == null ? void 0 : onBlur(event);
61
72
  };
62
- const handleMouseDown = (event) => {
63
- mouseDownHandler();
64
- onMouseDown == null ? void 0 : onMouseDown(event);
73
+ const handleMouseOver = (event) => {
74
+ mouseOverHandler();
75
+ onMouseOver == null ? void 0 : onMouseOver(event);
65
76
  };
66
77
  return /* @__PURE__ */ jsx(ListNextContext.Provider, {
67
78
  value: contextValue,
68
79
  children: /* @__PURE__ */ jsx("ul", {
69
- ref: handleRef,
80
+ ref: setListRef,
70
81
  id: listId,
71
82
  className: clsx(withBaseName(), className),
72
83
  role: "listbox",
73
- tabIndex: disabled ? -1 : 0,
84
+ tabIndex: disabled || disableFocus ? -1 : 0,
74
85
  "aria-activedescendant": disabled ? void 0 : activeDescendant,
75
86
  "aria-disabled": disabled,
76
87
  onFocus: handleFocus,
77
88
  onKeyDown: handleKeyDown,
78
89
  onBlur: handleBlur,
79
- onMouseDown: handleMouseDown,
90
+ onMouseOver: handleMouseOver,
80
91
  ...rest,
81
92
  children
82
93
  })
@@ -1 +1 @@
1
- {"version":3,"file":"ListNext.js","sources":["../src/list-next/ListNext.tsx"],"sourcesContent":["import { makePrefixer, useForkRef, useId } from \"@salt-ds/core\";\nimport {\n FocusEvent,\n forwardRef,\n HTMLAttributes,\n KeyboardEvent,\n MouseEvent,\n useRef,\n} from \"react\";\nimport { clsx } from \"clsx\";\nimport { useList } from \"./useList\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport listNextCss from \"./ListNext.css\";\nimport { ListNextContext } from \"./ListNextContext\";\n\nconst withBaseName = makePrefixer(\"saltListNext\");\n\nexport interface ListNextProps extends HTMLAttributes<HTMLUListElement> {\n /**\n * If true, all items in list will be disabled.\n */\n disabled?: boolean;\n /* Value for the uncontrolled version. */\n selected?: string;\n /* Initial value for the uncontrolled version. */\n defaultSelected?: string;\n}\n\nexport const ListNext = forwardRef<HTMLUListElement, ListNextProps>(\n function ListNext(\n {\n children,\n className,\n disabled,\n id,\n onSelect,\n onFocus,\n onBlur,\n onKeyDown,\n onMouseDown,\n selected,\n defaultSelected,\n ...rest\n },\n ref\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-list-next\",\n css: listNextCss,\n window: targetWindow,\n });\n\n const listId = useId(id);\n const listRef = useRef<HTMLUListElement>(null);\n const handleRef = useForkRef(listRef, ref);\n\n const {\n focusHandler,\n keyDownHandler,\n blurHandler,\n mouseDownHandler,\n activeDescendant,\n contextValue,\n } = useList({\n disabled,\n selected,\n defaultSelected,\n id: listId,\n ref: listRef,\n });\n\n const handleFocus = (event: FocusEvent<HTMLUListElement>) => {\n focusHandler();\n onFocus?.(event);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n keyDownHandler(event);\n onKeyDown?.(event);\n };\n\n const handleBlur = (event: FocusEvent<HTMLUListElement>) => {\n blurHandler();\n onBlur?.(event);\n };\n\n const handleMouseDown = (event: MouseEvent<HTMLUListElement>) => {\n mouseDownHandler();\n onMouseDown?.(event);\n };\n\n return (\n <ListNextContext.Provider value={contextValue}>\n <ul\n ref={handleRef}\n id={listId}\n className={clsx(withBaseName(), className)}\n role=\"listbox\"\n tabIndex={disabled ? -1 : 0}\n aria-activedescendant={disabled ? undefined : activeDescendant}\n aria-disabled={disabled}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onMouseDown={handleMouseDown}\n {...rest}\n >\n {children}\n </ul>\n </ListNextContext.Provider>\n );\n }\n);\n"],"names":["ListNext","listNextCss"],"mappings":"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"}
1
+ {"version":3,"file":"ListNext.js","sources":["../src/list-next/ListNext.tsx"],"sourcesContent":["import { makePrefixer, useForkRef, useId } from \"@salt-ds/core\";\nimport {\n ComponentPropsWithoutRef,\n FocusEvent,\n forwardRef,\n KeyboardEvent,\n MouseEvent,\n SyntheticEvent,\n useRef,\n} from \"react\";\nimport { clsx } from \"clsx\";\nimport { useList } from \"./useList\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport listNextCss from \"./ListNext.css\";\nimport { ListNextContext } from \"./ListNextContext\";\n\nconst withBaseName = makePrefixer(\"saltListNext\");\n\nexport interface ListNextProps\n extends Omit<ComponentPropsWithoutRef<\"ul\">, \"onChange\"> {\n /**\n * If true, all items in list will be disabled.\n */\n disabled?: boolean;\n /* If `true`, the component will not receive focus. */\n disableFocus?: boolean;\n /* Value for the controlled version. */\n highlightedItem?: string;\n /* Value for the controlled version. */\n selected?: string;\n /* Callback for change event. */\n onChange?: (event: SyntheticEvent, data: { value: string }) => void;\n /* Initial selection. */\n defaultSelected?: string;\n}\n\nexport const ListNext = forwardRef<HTMLUListElement, ListNextProps>(\n function ListNext(\n {\n children,\n className,\n disabled,\n disableFocus,\n id,\n onSelect,\n onFocus,\n onBlur,\n onKeyDown,\n onMouseOver,\n highlightedItem,\n selected,\n defaultSelected,\n onChange,\n ...rest\n },\n ref\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-list-next\",\n css: listNextCss,\n window: targetWindow,\n });\n\n const listId = useId(id);\n const listRef = useRef<HTMLUListElement>(null);\n const handleRef = useForkRef(listRef, ref);\n const {\n focusHandler,\n keyDownHandler,\n blurHandler,\n mouseOverHandler,\n activeDescendant,\n contextValue,\n focusVisibleRef,\n } = useList({\n disabled,\n highlightedItem,\n selected,\n defaultSelected,\n onChange,\n id: listId,\n ref: listRef,\n });\n\n const setListRef = useForkRef(focusVisibleRef, handleRef);\n\n const handleFocus = (event: FocusEvent<HTMLUListElement>) => {\n focusHandler(event);\n onFocus?.(event);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n if (disableFocus) {\n event.preventDefault();\n return;\n }\n keyDownHandler(event);\n onKeyDown?.(event);\n };\n\n const handleBlur = (event: FocusEvent<HTMLUListElement>) => {\n blurHandler();\n onBlur?.(event);\n };\n\n const handleMouseOver = (event: MouseEvent<HTMLUListElement>) => {\n mouseOverHandler();\n onMouseOver?.(event);\n };\n\n return (\n <ListNextContext.Provider value={contextValue}>\n <ul\n // TODO: fix type from useIsFocusVisible\n // @ts-ignore\n ref={setListRef}\n id={listId}\n className={clsx(withBaseName(), className)}\n role=\"listbox\"\n tabIndex={disabled || disableFocus ? -1 : 0}\n aria-activedescendant={disabled ? undefined : activeDescendant}\n aria-disabled={disabled}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onMouseOver={handleMouseOver}\n {...rest}\n >\n {children}\n </ul>\n </ListNextContext.Provider>\n );\n }\n);\n"],"names":["ListNext","listNextCss"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ListNextContext.js","sources":["../src/list-next/ListNextContext.tsx"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { SyntheticEvent, useContext } from \"react\";\n\nexport interface ListNextContextValue {\n disabled?: boolean;\n id?: string;\n select: (event: SyntheticEvent<HTMLLIElement>) => void;\n isSelected: (id: string) => boolean;\n isFocused: (id: string) => boolean;\n}\n\nexport const ListNextContext = createContext<ListNextContextValue | undefined>(\n \"ListNextContext\",\n undefined\n);\n\nexport function useListItem() {\n return useContext(ListNextContext);\n}\n"],"names":[],"mappings":";;;AAWO,MAAM,eAAkB,GAAA,aAAA;AAAA,EAC7B,iBAAA;AAAA,EACA,KAAA,CAAA;AACF,EAAA;AAEO,SAAS,WAAc,GAAA;AAC5B,EAAA,OAAO,WAAW,eAAe,CAAA,CAAA;AACnC;;;;"}
1
+ {"version":3,"file":"ListNextContext.js","sources":["../src/list-next/ListNextContext.tsx"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { SyntheticEvent, useContext } from \"react\";\n\nexport interface ListNextContextValue {\n disabled?: boolean;\n id?: string;\n select: (event: SyntheticEvent<HTMLLIElement>) => void;\n isSelected: (value: string) => boolean;\n isFocused: (value: string) => boolean;\n highlight: (event: SyntheticEvent<HTMLLIElement>) => void;\n isHighlighted: (value: string) => boolean;\n}\n\nexport const ListNextContext = createContext<ListNextContextValue | undefined>(\n \"ListNextContext\",\n undefined\n);\n\nexport function useListItem() {\n return useContext(ListNextContext);\n}\n"],"names":[],"mappings":";;;AAaO,MAAM,eAAkB,GAAA,aAAA;AAAA,EAC7B,iBAAA;AAAA,EACA,KAAA,CAAA;AACF,EAAA;AAEO,SAAS,WAAc,GAAA;AAC5B,EAAA,OAAO,WAAW,eAAe,CAAA,CAAA;AACnC;;;;"}
@@ -1,30 +1,43 @@
1
- import { useState, useCallback, useMemo } from 'react';
2
- import { useControlled } from '@salt-ds/core';
1
+ import { useCallback, useState, useEffect, useMemo } from 'react';
2
+ import { useControlled, useIsFocusVisible } from '@salt-ds/core';
3
3
 
4
4
  const useList = ({
5
5
  disabled = false,
6
+ highlightedItem: highLightedItemProp,
6
7
  selected: selectedProp,
7
8
  defaultSelected,
8
9
  onChange,
9
10
  id,
10
11
  ref
11
12
  }) => {
13
+ const getOptions = useCallback(() => {
14
+ var _a, _b;
15
+ return Array.from(
16
+ (_b = (_a = ref.current) == null ? void 0 : _a.querySelectorAll('[role="option"]:not([aria-disabled])')) != null ? _b : []
17
+ );
18
+ }, [ref]);
19
+ const [focusVisible, setFocusVisible] = useState(false);
12
20
  const [activeDescendant, setActiveDescendant] = useState(
13
21
  void 0
14
22
  );
15
- const [showFocusRing, setShowFocusRing] = useState(false);
23
+ const [highlightedItem, setHighlightedItem] = useControlled({
24
+ controlled: highLightedItemProp,
25
+ default: highLightedItemProp,
26
+ name: "ListNext",
27
+ state: "highlighted"
28
+ });
16
29
  const [selectedItem, setSelectedItem] = useControlled({
17
30
  controlled: selectedProp,
18
31
  default: defaultSelected,
19
32
  name: "ListNext",
20
33
  state: "selected"
21
34
  });
22
- const getOptions = useCallback(() => {
23
- var _a, _b;
24
- return Array.from(
25
- (_b = (_a = ref.current) == null ? void 0 : _a.querySelectorAll('[role="option"]:not([aria-disabled])')) != null ? _b : []
26
- );
27
- }, [ref]);
35
+ const {
36
+ isFocusVisibleRef,
37
+ onFocus: handleFocusVisible,
38
+ onBlur: handleBlurVisible,
39
+ ref: focusVisibleRef
40
+ } = useIsFocusVisible();
28
41
  const updateScroll = useCallback(
29
42
  (currentTarget) => {
30
43
  const list = ref.current;
@@ -41,39 +54,47 @@ const useList = ({
41
54
  },
42
55
  [ref]
43
56
  );
44
- const updateActiveDescendant = useCallback(
57
+ const updateHighlighted = useCallback(
45
58
  (element) => {
59
+ setHighlightedItem(element.dataset.value);
46
60
  setActiveDescendant(element.id);
47
61
  updateScroll(element);
48
62
  },
49
- [setActiveDescendant, updateScroll]
63
+ [setHighlightedItem, updateScroll]
50
64
  );
51
65
  const selectItem = useCallback(
52
66
  (element) => {
53
67
  const newValue = element == null ? void 0 : element.dataset.value;
54
68
  if (newValue) {
55
69
  setSelectedItem(newValue);
56
- updateActiveDescendant(element);
70
+ updateHighlighted(element);
57
71
  }
58
72
  },
59
- [setSelectedItem, updateActiveDescendant]
73
+ [setSelectedItem, updateHighlighted]
60
74
  );
61
- const focusAndMoveActive = (element) => {
62
- setShowFocusRing(true);
63
- updateActiveDescendant(element);
64
- };
75
+ useEffect(() => {
76
+ var _a;
77
+ const activeOptions = getOptions();
78
+ const highlightedIndex = activeOptions.findIndex(
79
+ (i) => i.dataset.value === highlightedItem
80
+ );
81
+ if (highlightedIndex) {
82
+ setActiveDescendant((_a = activeOptions[highlightedIndex]) == null ? void 0 : _a.id);
83
+ highlightedItem && updateScroll(activeOptions[highlightedIndex]);
84
+ }
85
+ }, [highlightedItem, getOptions, updateScroll]);
65
86
  const focusFirstItem = () => {
66
87
  const activeOptions = getOptions();
67
88
  const firstItem = activeOptions[0];
68
89
  if (firstItem) {
69
- focusAndMoveActive(firstItem);
90
+ updateHighlighted(firstItem);
70
91
  }
71
92
  };
72
93
  const focusLastItem = () => {
73
94
  const activeOptions = getOptions();
74
95
  const lastItem = activeOptions[activeOptions.length - 1];
75
96
  if (lastItem) {
76
- focusAndMoveActive(lastItem);
97
+ updateHighlighted(lastItem);
77
98
  updateScroll(lastItem);
78
99
  }
79
100
  };
@@ -92,9 +113,6 @@ const useList = ({
92
113
  const select = useCallback(
93
114
  (event) => {
94
115
  const newValue = event.currentTarget.dataset.value;
95
- if (event.type === "click") {
96
- setShowFocusRing(false);
97
- }
98
116
  const activeOptions = getOptions();
99
117
  const isActiveOption = activeOptions.findIndex((i) => i.id === event.currentTarget.id) !== -1;
100
118
  if (newValue && selectedItem !== newValue && isActiveOption) {
@@ -105,44 +123,71 @@ const useList = ({
105
123
  [selectItem, selectedItem, onChange, getOptions]
106
124
  );
107
125
  const isSelected = useCallback(
108
- (id2) => selectedItem === id2,
126
+ (value) => selectedItem === value,
109
127
  [selectedItem]
110
128
  );
129
+ const highlight = useCallback(
130
+ (event) => {
131
+ setHighlightedItem(event.currentTarget.dataset.value);
132
+ },
133
+ [setHighlightedItem]
134
+ );
135
+ const isHighlighted = useCallback(
136
+ (value) => highlightedItem === value,
137
+ [highlightedItem]
138
+ );
111
139
  const isFocused = useCallback(
112
- (id2) => activeDescendant === id2 && showFocusRing,
113
- [activeDescendant, showFocusRing]
140
+ (value) => isHighlighted(value) && focusVisible,
141
+ [focusVisible, isHighlighted]
114
142
  );
115
143
  const getActiveItem = () => {
116
144
  const activeOptions = getOptions();
117
145
  const activeIndex = activeOptions.findIndex(
118
146
  (i) => i.id === activeDescendant
119
147
  );
120
- return activeOptions[activeIndex !== -1 ? activeIndex : 0];
148
+ return activeOptions[activeIndex];
121
149
  };
122
150
  const blurHandler = () => {
123
- setShowFocusRing(false);
151
+ handleBlurVisible();
152
+ if (!isFocusVisibleRef.current) {
153
+ setFocusVisible(false);
154
+ }
124
155
  };
125
- const mouseDownHandler = () => {
126
- setShowFocusRing(false);
156
+ const mouseOverHandler = () => {
157
+ if (focusVisible) {
158
+ setFocusVisible(false);
159
+ }
127
160
  };
128
- const focusHandler = () => {
161
+ const focusHandler = (event) => {
162
+ handleFocusVisible(event);
163
+ if (isFocusVisibleRef.current) {
164
+ setFocusVisible(true);
165
+ }
129
166
  const activeElement = getActiveItem();
130
- focusAndMoveActive(activeElement);
167
+ if (activeElement) {
168
+ updateHighlighted(activeElement);
169
+ } else {
170
+ focusFirstItem();
171
+ }
131
172
  };
132
173
  const keyDownHandler = (event) => {
133
174
  const { key } = event;
134
175
  const currentItem = getActiveItem();
135
176
  let nextItem = currentItem;
136
- if (!currentItem) {
137
- return;
177
+ if (isFocusVisibleRef.current || !focusVisible) {
178
+ setFocusVisible(true);
138
179
  }
139
180
  switch (key) {
140
181
  case "ArrowUp":
141
182
  case "ArrowDown":
183
+ if (!currentItem) {
184
+ focusFirstItem();
185
+ break;
186
+ }
142
187
  nextItem = key === "ArrowUp" ? findPreviousOption(currentItem, 1) : findNextOption(currentItem, 1);
143
188
  if (nextItem && nextItem !== currentItem) {
144
189
  event.preventDefault();
145
- focusAndMoveActive(nextItem);
190
+ updateHighlighted(nextItem);
146
191
  }
147
192
  break;
148
193
  case "Home":
@@ -156,7 +201,14 @@ const useList = ({
156
201
  case " ":
157
202
  case "Enter":
158
203
  event.preventDefault();
159
- nextItem && selectItem(nextItem);
204
+ if (nextItem) {
205
+ selectItem(nextItem);
206
+ onChange == null ? void 0 : onChange(event, { value: nextItem.dataset.value || "" });
207
+ }
208
+ break;
209
+ case "PageDown":
210
+ case "PageUp":
211
+ event.preventDefault();
160
212
  break;
161
213
  }
162
214
  };
@@ -166,17 +218,24 @@ const useList = ({
166
218
  id,
167
219
  select,
168
220
  isSelected,
169
- isFocused
221
+ isFocused,
222
+ highlight,
223
+ isHighlighted
170
224
  }),
171
- [disabled, id, select, isSelected, isFocused]
225
+ [disabled, id, select, isSelected, isFocused, highlight, isHighlighted]
172
226
  );
173
227
  return {
174
228
  focusHandler,
175
229
  keyDownHandler,
176
230
  blurHandler,
177
- mouseDownHandler,
231
+ mouseOverHandler,
178
232
  activeDescendant,
179
- contextValue
233
+ selectedItem,
234
+ highlightedItem,
235
+ setSelectedItem,
236
+ setHighlightedItem,
237
+ contextValue,
238
+ focusVisibleRef
180
239
  };
181
240
  };
182
241
 
@@ -1 +1 @@
1
- {"version":3,"file":"useList.js","sources":["../src/list-next/useList.ts"],"sourcesContent":["import {\n KeyboardEvent,\n RefObject,\n SyntheticEvent,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { useControlled } from \"@salt-ds/core\";\n\ninterface UseListProps {\n /**\n * If true, all items in list will be disabled.\n */\n disabled?: boolean;\n /* Value for the uncontrolled version. */\n selected?: string;\n /* Initial value for the uncontrolled version. */\n defaultSelected?: string;\n /* Callback for the controlled version. */\n onChange?: (e: SyntheticEvent, data: { value: string }) => void;\n id?: string;\n ref: RefObject<HTMLUListElement>;\n}\n\nexport const useList = ({\n disabled = false,\n selected: selectedProp,\n defaultSelected,\n onChange,\n id,\n ref,\n}: UseListProps) => {\n const [activeDescendant, setActiveDescendant] = useState<string | undefined>(\n undefined\n );\n\n const [showFocusRing, setShowFocusRing] = useState<boolean>(false);\n const [selectedItem, setSelectedItem] = useControlled({\n controlled: selectedProp,\n default: defaultSelected,\n name: \"ListNext\",\n state: \"selected\",\n });\n\n const getOptions: () => HTMLElement[] = useCallback(() => {\n return Array.from(\n ref.current?.querySelectorAll('[role=\"option\"]:not([aria-disabled])') ??\n []\n );\n }, [ref]);\n\n const updateScroll = useCallback(\n (currentTarget: Element) => {\n const list = ref.current;\n if (!list || !currentTarget) return;\n const { offsetTop, offsetHeight } = currentTarget as HTMLLIElement;\n const listHeight = list?.clientHeight;\n const listScrollTop = list?.scrollTop;\n if (offsetTop < listScrollTop) {\n list.scrollTop = offsetTop;\n } else if (offsetTop + offsetHeight > listScrollTop + listHeight) {\n list.scrollTop = offsetTop + offsetHeight - listHeight;\n }\n },\n [ref]\n );\n\n const updateActiveDescendant = useCallback(\n (element: HTMLElement) => {\n setActiveDescendant(element.id);\n updateScroll(element);\n },\n [setActiveDescendant, updateScroll]\n );\n const selectItem = useCallback(\n (element: HTMLElement) => {\n const newValue = element?.dataset.value;\n if (newValue) {\n setSelectedItem(newValue);\n updateActiveDescendant(element);\n }\n },\n [setSelectedItem, updateActiveDescendant]\n );\n\n const focusAndMoveActive = (element: HTMLElement) => {\n setShowFocusRing(true);\n updateActiveDescendant(element);\n };\n\n const focusFirstItem = () => {\n // Find first active item\n const activeOptions = getOptions();\n const firstItem = activeOptions[0];\n if (firstItem) {\n focusAndMoveActive(firstItem);\n }\n };\n const focusLastItem = () => {\n // Find last active item\n const activeOptions = getOptions();\n const lastItem = activeOptions[activeOptions.length - 1];\n if (lastItem) {\n focusAndMoveActive(lastItem);\n updateScroll(lastItem);\n }\n };\n\n const findNextOption = (\n currentOption: HTMLElement | null,\n moves: number\n ): HTMLElement => {\n const activeOptions = getOptions();\n // Returns next item, if no current option it will return 0\n const nextOptionIndex = currentOption\n ? activeOptions.indexOf(currentOption) + moves\n : 0;\n return (\n activeOptions[nextOptionIndex] || activeOptions[activeOptions.length - 1]\n );\n };\n\n const findPreviousOption = (\n currentOption: HTMLElement,\n moves: number\n ): HTMLElement => {\n // Return the previous option if it exists; otherwise, returns first option\n const activeOptions = getOptions();\n const currentOptionIndex = activeOptions.findIndex(\n (i) => i.id === currentOption.id\n );\n return activeOptions[currentOptionIndex - moves] || activeOptions[0];\n };\n\n // CONTEXT CALLBACKS\n const select = useCallback(\n (event: SyntheticEvent<HTMLLIElement>) => {\n const newValue = event.currentTarget.dataset.value;\n if (event.type === \"click\") {\n setShowFocusRing(false);\n }\n const activeOptions = getOptions();\n const isActiveOption =\n activeOptions.findIndex((i) => i.id === event.currentTarget.id) !== -1;\n if (newValue && selectedItem !== newValue && isActiveOption) {\n selectItem(event.currentTarget);\n onChange?.(event, { value: newValue });\n }\n },\n [selectItem, selectedItem, onChange, getOptions]\n );\n\n const isSelected = useCallback(\n (id: string) => selectedItem === id,\n [selectedItem]\n );\n\n const isFocused = useCallback(\n (id: string | undefined) => activeDescendant === id && showFocusRing,\n [activeDescendant, showFocusRing]\n );\n\n const getActiveItem = () => {\n const activeOptions = getOptions();\n const activeIndex = activeOptions.findIndex(\n (i) => i.id === activeDescendant\n );\n return activeOptions[activeIndex !== -1 ? activeIndex : 0];\n };\n\n // HANDLERS\n const blurHandler = () => {\n setShowFocusRing(false);\n };\n\n const mouseDownHandler = () => {\n // When list gets focused, we can't guarantee that focus happens after click event.\n // If first focus (where !activeDescendant) happens from a click, list shouldn't render focus ring in the first element.\n setShowFocusRing(false);\n };\n\n // takes care of focus when using keyboard navigation\n const focusHandler = () => {\n const activeElement = getActiveItem();\n focusAndMoveActive(activeElement);\n };\n\n // takes care of keydown when using keyboard navigation\n const keyDownHandler = (event: KeyboardEvent<HTMLUListElement>) => {\n const { key } = event;\n const currentItem = getActiveItem();\n let nextItem = currentItem;\n if (!currentItem) {\n return;\n }\n switch (key) {\n case \"ArrowUp\":\n case \"ArrowDown\":\n nextItem =\n key === \"ArrowUp\"\n ? findPreviousOption(currentItem, 1)\n : findNextOption(currentItem, 1);\n\n if (nextItem && nextItem !== currentItem) {\n event.preventDefault();\n focusAndMoveActive(nextItem);\n }\n break;\n case \"Home\":\n event.preventDefault();\n focusFirstItem();\n break;\n case \"End\":\n event.preventDefault();\n focusLastItem();\n break;\n case \" \":\n case \"Enter\":\n event.preventDefault();\n nextItem && selectItem(nextItem);\n break;\n default:\n break;\n }\n };\n\n // CONTEXT\n const contextValue = useMemo(\n () => ({\n disabled,\n id,\n select,\n isSelected,\n isFocused,\n }),\n [disabled, id, select, isSelected, isFocused]\n );\n\n return {\n focusHandler,\n keyDownHandler,\n blurHandler,\n mouseDownHandler,\n activeDescendant,\n contextValue,\n };\n};\n"],"names":["id"],"mappings":"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"}
1
+ {"version":3,"file":"useList.js","sources":["../src/list-next/useList.ts"],"sourcesContent":["import {\n FocusEvent,\n KeyboardEvent,\n RefObject,\n SyntheticEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useControlled, useIsFocusVisible } from \"@salt-ds/core\";\n\ninterface UseListProps {\n /**\n * If true, all items in list will be disabled.\n */\n disabled?: boolean;\n /* Highlighted index for when the list is controlled. */\n highlightedItem?: string;\n /* Selected value for when the list is controlled. */\n selected?: string;\n /* Initial selected value for when the list is controlled. */\n defaultSelected?: string;\n /* Callback for when the list is controlled. */\n onChange?: (e: SyntheticEvent, data: { value: string }) => void;\n /* List id. */\n id?: string;\n /* List ref. */\n ref: RefObject<HTMLUListElement>;\n}\n\nexport const useList = ({\n disabled = false,\n highlightedItem: highLightedItemProp,\n selected: selectedProp,\n defaultSelected,\n onChange,\n id,\n ref,\n}: UseListProps) => {\n const getOptions: () => HTMLElement[] = useCallback(() => {\n return Array.from(\n ref.current?.querySelectorAll('[role=\"option\"]:not([aria-disabled])') ??\n []\n );\n }, [ref]);\n\n const [focusVisible, setFocusVisible] = useState(false);\n const [activeDescendant, setActiveDescendant] = useState<string | undefined>(\n undefined\n );\n\n const [highlightedItem, setHighlightedItem] = useControlled({\n controlled: highLightedItemProp,\n default: highLightedItemProp,\n name: \"ListNext\",\n state: \"highlighted\",\n });\n\n const [selectedItem, setSelectedItem] = useControlled({\n controlled: selectedProp,\n default: defaultSelected,\n name: \"ListNext\",\n state: \"selected\",\n });\n\n const {\n isFocusVisibleRef,\n onFocus: handleFocusVisible,\n onBlur: handleBlurVisible,\n ref: focusVisibleRef,\n } = useIsFocusVisible();\n\n const updateScroll = useCallback(\n (currentTarget: Element) => {\n const list = ref.current;\n if (!list || !currentTarget) return;\n const { offsetTop, offsetHeight } = currentTarget as HTMLLIElement;\n const listHeight = list?.clientHeight;\n const listScrollTop = list?.scrollTop;\n if (offsetTop < listScrollTop) {\n list.scrollTop = offsetTop;\n } else if (offsetTop + offsetHeight > listScrollTop + listHeight) {\n list.scrollTop = offsetTop + offsetHeight - listHeight;\n }\n },\n [ref]\n );\n\n const updateHighlighted = useCallback(\n (element: HTMLElement) => {\n setHighlightedItem(element.dataset.value);\n setActiveDescendant(element.id);\n updateScroll(element);\n },\n [setHighlightedItem, updateScroll]\n );\n\n const selectItem = useCallback(\n (element: HTMLElement) => {\n const newValue = element?.dataset.value;\n if (newValue) {\n setSelectedItem(newValue);\n updateHighlighted(element);\n }\n },\n [setSelectedItem, updateHighlighted]\n );\n\n // Effect to move the cursor when items change controlled.\n // this could be following active descendant if there is no better way of doing it when controlled\n useEffect(() => {\n const activeOptions = getOptions();\n const highlightedIndex = activeOptions.findIndex(\n (i) => i.dataset.value === highlightedItem\n );\n if (highlightedIndex) {\n setActiveDescendant(activeOptions[highlightedIndex]?.id);\n highlightedItem && updateScroll(activeOptions[highlightedIndex]);\n }\n }, [highlightedItem, getOptions, updateScroll]);\n\n const focusFirstItem = () => {\n // Find first active item\n const activeOptions = getOptions();\n const firstItem = activeOptions[0];\n if (firstItem) {\n updateHighlighted(firstItem);\n }\n };\n const focusLastItem = () => {\n // Find last active item\n const activeOptions = getOptions();\n const lastItem = activeOptions[activeOptions.length - 1];\n if (lastItem) {\n updateHighlighted(lastItem);\n updateScroll(lastItem);\n }\n };\n\n const findNextOption = (\n currentOption: HTMLElement | null,\n moves: number\n ): HTMLElement => {\n const activeOptions = getOptions();\n // Returns next item, if no current option it will return 0\n const nextOptionIndex = currentOption\n ? activeOptions.indexOf(currentOption) + moves\n : 0;\n return (\n activeOptions[nextOptionIndex] || activeOptions[activeOptions.length - 1]\n );\n };\n\n const findPreviousOption = (\n currentOption: HTMLElement,\n moves: number\n ): HTMLElement => {\n // Return the previous option if it exists; otherwise, returns first option\n const activeOptions = getOptions();\n const currentOptionIndex = activeOptions.findIndex(\n (i) => i.id === currentOption.id\n );\n return activeOptions[currentOptionIndex - moves] || activeOptions[0];\n };\n\n // CONTEXT CALLBACKS\n const select = useCallback(\n (event: SyntheticEvent<HTMLLIElement>) => {\n const newValue = event.currentTarget.dataset.value;\n const activeOptions = getOptions();\n const isActiveOption =\n activeOptions.findIndex((i) => i.id === event.currentTarget.id) !== -1;\n if (newValue && selectedItem !== newValue && isActiveOption) {\n selectItem(event.currentTarget);\n onChange?.(event, { value: newValue });\n }\n },\n [selectItem, selectedItem, onChange, getOptions]\n );\n\n const isSelected = useCallback(\n (value: string) => selectedItem === value,\n [selectedItem]\n );\n\n const highlight = useCallback(\n (event: SyntheticEvent<HTMLLIElement>) => {\n setHighlightedItem(event.currentTarget.dataset.value);\n },\n [setHighlightedItem]\n );\n\n const isHighlighted = useCallback(\n (value: string) => highlightedItem === value,\n [highlightedItem]\n );\n\n const isFocused = useCallback(\n (value: string) => isHighlighted(value) && focusVisible,\n [focusVisible, isHighlighted]\n );\n\n const getActiveItem = () => {\n const activeOptions = getOptions();\n const activeIndex = activeOptions.findIndex(\n (i) => i.id === activeDescendant\n );\n return activeOptions[activeIndex];\n };\n\n // HANDLERS\n const blurHandler = () => {\n handleBlurVisible();\n if (!isFocusVisibleRef.current) {\n setFocusVisible(false);\n }\n };\n\n const mouseOverHandler = () => {\n if (focusVisible) {\n setFocusVisible(false);\n }\n };\n\n // takes care of focus when using keyboard navigation\n const focusHandler = (event: FocusEvent<HTMLUListElement>) => {\n handleFocusVisible(event);\n if (isFocusVisibleRef.current) {\n setFocusVisible(true);\n }\n const activeElement = getActiveItem();\n if (activeElement) {\n updateHighlighted(activeElement);\n } else {\n focusFirstItem();\n }\n };\n\n // takes care of keydown when using keyboard navigation\n const keyDownHandler = (event: KeyboardEvent<HTMLElement>) => {\n const { key } = event;\n const currentItem = getActiveItem();\n let nextItem = currentItem;\n if (isFocusVisibleRef.current || !focusVisible) {\n setFocusVisible(true);\n }\n switch (key) {\n case \"ArrowUp\":\n case \"ArrowDown\":\n if (!currentItem) {\n focusFirstItem();\n break;\n }\n nextItem =\n key === \"ArrowUp\"\n ? findPreviousOption(currentItem, 1)\n : findNextOption(currentItem, 1);\n\n if (nextItem && nextItem !== currentItem) {\n event.preventDefault();\n updateHighlighted(nextItem);\n }\n break;\n case \"Home\":\n event.preventDefault();\n focusFirstItem();\n break;\n case \"End\":\n event.preventDefault();\n focusLastItem();\n break;\n case \" \":\n case \"Enter\":\n event.preventDefault();\n if (nextItem) {\n selectItem(nextItem);\n onChange?.(event, { value: nextItem.dataset.value || \"\" });\n }\n break;\n case \"PageDown\":\n case \"PageUp\":\n event.preventDefault();\n break;\n default:\n break;\n }\n };\n\n // CONTEXT\n const contextValue = useMemo(\n () => ({\n disabled,\n id,\n select,\n isSelected,\n isFocused,\n highlight,\n isHighlighted,\n }),\n [disabled, id, select, isSelected, isFocused, highlight, isHighlighted]\n );\n\n return {\n focusHandler,\n keyDownHandler,\n blurHandler,\n mouseOverHandler,\n activeDescendant,\n selectedItem,\n highlightedItem,\n setSelectedItem,\n setHighlightedItem,\n contextValue,\n focusVisibleRef,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { ChevronDownIcon, ChevronRightIcon, ChevronUpIcon } from '@salt-ds/icons';
2
+ import { ChevronDownIcon, ChevronRightIcon } from '@salt-ds/icons';
3
3
  import { Button } from '@salt-ds/core';
4
4
 
5
5
  const iconExpansionMap = {
@@ -9,7 +9,7 @@ const iconExpansionMap = {
9
9
  },
10
10
  horizontal: {
11
11
  expanded: ChevronDownIcon,
12
- collapsed: ChevronUpIcon
12
+ collapsed: ChevronDownIcon
13
13
  }
14
14
  };
15
15
  function ExpansionButton({
@@ -1 +1 @@
1
- {"version":3,"file":"ExpansionButton.js","sources":["../src/nav-item/ExpansionButton.tsx"],"sourcesContent":["import {\n ChevronDownIcon,\n ChevronRightIcon,\n ChevronUpIcon,\n} from \"@salt-ds/icons\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { NavItemProps } from \"./NavItem\";\n\nconst iconExpansionMap = {\n vertical: {\n expanded: ChevronDownIcon,\n collapsed: ChevronRightIcon,\n },\n horizontal: {\n expanded: ChevronDownIcon,\n collapsed: ChevronUpIcon,\n },\n};\n\nexport function ExpansionButton({\n expanded = false,\n orientation = \"horizontal\",\n ...rest\n}: Pick<NavItemProps, \"expanded\" | \"orientation\"> &\n ComponentPropsWithoutRef<\"button\">) {\n const Icon =\n iconExpansionMap[orientation][expanded ? \"expanded\" : \"collapsed\"];\n return (\n <Button aria-label=\"expand\" variant=\"secondary\" {...rest}>\n <Icon aria-hidden=\"true\" />\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;AASA,MAAM,gBAAmB,GAAA;AAAA,EACvB,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,eAAA;AAAA,IACV,SAAW,EAAA,gBAAA;AAAA,GACb;AAAA,EACA,UAAY,EAAA;AAAA,IACV,QAAU,EAAA,eAAA;AAAA,IACV,SAAW,EAAA,aAAA;AAAA,GACb;AACF,CAAA,CAAA;AAEO,SAAS,eAAgB,CAAA;AAAA,EAC9B,QAAW,GAAA,KAAA;AAAA,EACX,WAAc,GAAA,YAAA;AAAA,EACX,GAAA,IAAA;AACL,CACsC,EAAA;AACpC,EAAA,MAAM,IACJ,GAAA,gBAAA,CAAiB,WAAa,CAAA,CAAA,QAAA,GAAW,UAAa,GAAA,WAAA,CAAA,CAAA;AACxD,EAAA,uBACG,GAAA,CAAA,MAAA,EAAA;AAAA,IAAO,YAAW,EAAA,QAAA;AAAA,IAAS,OAAQ,EAAA,WAAA;AAAA,IAAa,GAAG,IAAA;AAAA,IAClD,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA;AAAA,MAAK,aAAY,EAAA,MAAA;AAAA,KAAO,CAAA;AAAA,GAC3B,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ExpansionButton.js","sources":["../src/nav-item/ExpansionButton.tsx"],"sourcesContent":["import { ChevronDownIcon, ChevronRightIcon } from \"@salt-ds/icons\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { NavItemProps } from \"./NavItem\";\n\nconst iconExpansionMap = {\n vertical: {\n expanded: ChevronDownIcon,\n collapsed: ChevronRightIcon,\n },\n horizontal: {\n expanded: ChevronDownIcon,\n collapsed: ChevronDownIcon,\n },\n};\n\nexport function ExpansionButton({\n expanded = false,\n orientation = \"horizontal\",\n ...rest\n}: Pick<NavItemProps, \"expanded\" | \"orientation\"> &\n ComponentPropsWithoutRef<\"button\">) {\n const Icon =\n iconExpansionMap[orientation][expanded ? \"expanded\" : \"collapsed\"];\n return (\n <Button aria-label=\"expand\" variant=\"secondary\" {...rest}>\n <Icon aria-hidden=\"true\" />\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;AAKA,MAAM,gBAAmB,GAAA;AAAA,EACvB,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,eAAA;AAAA,IACV,SAAW,EAAA,gBAAA;AAAA,GACb;AAAA,EACA,UAAY,EAAA;AAAA,IACV,QAAU,EAAA,eAAA;AAAA,IACV,SAAW,EAAA,eAAA;AAAA,GACb;AACF,CAAA,CAAA;AAEO,SAAS,eAAgB,CAAA;AAAA,EAC9B,QAAW,GAAA,KAAA;AAAA,EACX,WAAc,GAAA,YAAA;AAAA,EACX,GAAA,IAAA;AACL,CACsC,EAAA;AACpC,EAAA,MAAM,IACJ,GAAA,gBAAA,CAAiB,WAAa,CAAA,CAAA,QAAA,GAAW,UAAa,GAAA,WAAA,CAAA,CAAA;AACxD,EAAA,uBACG,GAAA,CAAA,MAAA,EAAA;AAAA,IAAO,YAAW,EAAA,QAAA;AAAA,IAAS,OAAQ,EAAA,WAAA;AAAA,IAAa,GAAG,IAAA;AAAA,IAClD,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA;AAAA,MAAK,aAAY,EAAA,MAAA;AAAA,KAAO,CAAA;AAAA,GAC3B,CAAA,CAAA;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = ".saltNavItem {\n display: flex;\n justify-content: space-between;\n align-items: center;\n position: relative;\n background: var(--salt-navigable-primary-background);\n gap: var(--salt-spacing-75);\n}\n\n.saltNavItem-horizontal {\n min-height: calc(var(--salt-size-stackable) + var(--salt-size-accent) + var(--salt-spacing-100));\n padding: var(--salt-spacing-100);\n}\n\n.saltNavItem-vertical {\n min-height: var(--salt-size-stackable);\n}\n\n.saltNavItem-label,\n.saltNavItem-label:hover {\n color: var(--salt-text-primary-foreground);\n line-height: var(--salt-text-lineHeight);\n font-family: var(--salt-text-fontFamily);\n padding-left: calc(var(--saltNavItem-level, 0) * var(--salt-spacing-150));\n text-decoration: none;\n}\n\n.saltNavItem-vertical .saltNavItem-expandButton {\n justify-self: end;\n margin: calc((var(--salt-size-stackable) - var(--salt-size-base)) / 2);\n}\n\n.saltNavItem-horizontal {\n padding-top: calc(var(--salt-spacing-100) + var(--salt-size-accent));\n}\n\n.saltNavItem-vertical {\n padding-left: calc(var(--salt-spacing-200) + var(--salt-size-accent));\n}\n\n.saltNavItem:hover,\n.saltNavItem:focus {\n background: var(--salt-navigable-primary-background-hover);\n}\n\n.saltNavItem:focus-visible {\n outline: var(--salt-focused-outline);\n}\n\n.saltNavItem-active {\n background: var(--salt-navigable-primary-background-active);\n}\n\n.saltNavItem::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n}\n\n.saltNavItem-horizontal::after {\n width: 100%;\n height: var(--salt-size-accent);\n}\n\n.saltNavItem-vertical::after {\n width: var(--salt-size-accent);\n height: 100%;\n}\n\n.saltNavItem-horizontal:hover::after,\n.saltNavItem-horizontal:focus::after {\n background: var(--salt-navigable-indicator-hover);\n}\n\n.saltNavItem.saltNavItem-active::after,\n.saltNavItem.saltNavItem-active:hover::after,\n.saltNavItem.saltNavItem-active:focus::after {\n background: var(--saltNavItem-indicator-color, var(--salt-navigable-indicator-active));\n}\n";
1
+ var css_248z = "/* Vars applied to root NavItem component */\n.saltNavItem {\n --navItem-color: var(--salt-text-secondary-foreground);\n --navItem-fill: var(--salt-text-secondary-foreground);\n --navItem-bar-inset: var(--salt-spacing-25);\n --navItem-bar-size: calc(var(--salt-size-bar) / 2);\n --navItem-indicator-background: var(--salt-navigable-indicator-active);\n}\n\n/* Vars applied to NavItem component when active or selected */\n.saltNavItem-active,\n.saltNavItem-blurSelected {\n --navItem-color: var(--salt-text-primary-foreground);\n --navItem-fill: var(--salt-text-primary-foreground);\n}\n\n/* Styles applied to root NavItem component */\n.saltNavItem {\n display: flex;\n align-items: center;\n position: relative;\n gap: var(--salt-spacing-100);\n font-weight: var(--salt-text-fontWeight-strong);\n /* Hover off animation */\n transition: all var(--salt-duration-instant) ease-in-out;\n}\n\n/* Styles applied to NavItem icon */\n.saltNavItem .saltNavItem-icon {\n fill: var(--navItem-fill);\n}\n\n/* Styles applied when orientation = \"horizontal\" */\n.saltNavItem-horizontal {\n min-height: calc(var(--salt-size-base) + var(--salt-spacing-100) + var(--salt-spacing-100));\n padding: calc(var(--salt-spacing-100) + var(--navItem-bar-inset)) 0 var(--salt-spacing-100) 0;\n margin: 0 var(--salt-spacing-100);\n}\n\n/* Styles applied when orientation = \"vertical\" */\n.saltNavItem-vertical {\n min-height: calc(var(--salt-size-base));\n padding-left: calc(var(--salt-spacing-100) + var(--navItem-bar-inset));\n margin: var(--salt-spacing-50) 0;\n}\n\n/* Styles applied to NavItem label */\n.saltNavItem .saltNavItem-label {\n --link-color-visited: var(--navItem-color);\n --link-color-hover: var(--navItem-color);\n\n text-decoration: none;\n color: var(--navItem-color);\n line-height: var(--salt-text-lineHeight);\n font-family: var(--salt-text-fontFamily);\n padding-left: calc(var(--saltNavItem-level, 0) * var(--salt-spacing-100));\n flex: 1;\n}\n\n/* Styles applied when level is not 0 */\n.saltNavItem-nested {\n padding-left: calc(var(--salt-spacing-250) + (var(--saltNavItem-level, 0) * var(--salt-spacing-100)));\n}\n\n/* Styles applied to expand button icon */\n.saltNavItem .saltNavItem-expandButton {\n --saltIcon-color: var(--navItem-fill);\n --saltButton-background-hover: none;\n --saltButton-background-active: none;\n}\n\n/* Styles applied to NavItem when focus is visible */\n.saltNavItem:focus-visible {\n outline: var(--salt-focused-outline);\n}\n\n/* Styles applied to activation line */\n.saltNavItem::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n}\n\n/* Styles applied to activation line when orientation = \"horizontal\" */\n.saltNavItem-horizontal::after {\n width: 100%;\n height: var(--navItem-bar-size);\n top: var(--navItem-bar-inset);\n}\n\n/* Styles applied to activation line when orientation = \"vertical\" */\n.saltNavItem-vertical::after {\n width: var(--navItem-bar-size);\n height: 100%;\n left: var(--navItem-bar-inset);\n}\n\n/* Styles applied to activation line on hover and on focus */\n.saltNavItem:hover::after,\n.saltNavItem:focus::after {\n background: var(--salt-navigable-indicator-hover);\n /* Hover on animation */\n transition: all var(--salt-duration-perceptible) ease-in-out;\n}\n\n/* Styles applied to activation line when item has active children */\n.saltNavItem.saltNavItem-blurSelected::after,\n.saltNavItem.saltNavItem-blurSelected:hover::after,\n.saltNavItem.saltNavItem-blurSelected:focus::after {\n --navItem-indicator-background: none;\n}\n\n/* Styles applied to activation line when item is active */\n.saltNavItem.saltNavItem-active::after,\n.saltNavItem.saltNavItem-active:hover::after,\n.saltNavItem.saltNavItem-active:focus::after {\n background: var(--navItem-indicator-background);\n /* Hover on animation */\n transition: all var(--salt-duration-perceptible) ease-in-out;\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=NavItem.css.js.map
@@ -12,6 +12,7 @@ const NavItem = forwardRef(
12
12
  function NavItem2(props, ref) {
13
13
  const {
14
14
  active,
15
+ blurSelected,
15
16
  children,
16
17
  className,
17
18
  expanded = false,
@@ -20,6 +21,8 @@ const NavItem = forwardRef(
20
21
  level = 0,
21
22
  onExpand,
22
23
  href,
24
+ IconComponent,
25
+ BadgeComponent,
23
26
  style: styleProp,
24
27
  ...rest
25
28
  } = props;
@@ -41,7 +44,9 @@ const NavItem = forwardRef(
41
44
  className: clsx(
42
45
  withBaseName(),
43
46
  {
44
- [withBaseName("active")]: active
47
+ [withBaseName("active")]: active,
48
+ [withBaseName("blurSelected")]: blurSelected,
49
+ [withBaseName("nested")]: level !== 0
45
50
  },
46
51
  withBaseName(orientation),
47
52
  className
@@ -50,6 +55,10 @@ const NavItem = forwardRef(
50
55
  style,
51
56
  ...rest,
52
57
  children: [
58
+ IconComponent && /* @__PURE__ */ jsx(IconComponent, {
59
+ "aria-hidden": true,
60
+ className: withBaseName("icon")
61
+ }),
53
62
  /* @__PURE__ */ jsx(Link, {
54
63
  className: withBaseName("label"),
55
64
  "aria-current": active ? "page" : void 0,
@@ -58,6 +67,7 @@ const NavItem = forwardRef(
58
67
  children
59
68
  })
60
69
  }),
70
+ BadgeComponent,
61
71
  parent && /* @__PURE__ */ jsx(ExpansionButton, {
62
72
  "aria-expanded": expanded,
63
73
  className: withBaseName("expandButton"),