@salt-ds/lab 1.0.0-alpha.95 → 1.0.0-alpha.97

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 (220) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/css/salt-lab.css +70 -249
  3. package/dist-cjs/common-hooks/useSelection.js +6 -3
  4. package/dist-cjs/common-hooks/useSelection.js.map +1 -1
  5. package/dist-cjs/index.js +12 -14
  6. package/dist-cjs/index.js.map +1 -1
  7. package/dist-cjs/list/useList.js +7 -1
  8. package/dist-cjs/list/useList.js.map +1 -1
  9. package/dist-cjs/mega-menu/MegaMenu.js +8 -14
  10. package/dist-cjs/mega-menu/MegaMenu.js.map +1 -1
  11. package/dist-cjs/mega-menu/MegaMenuActions.css.js +6 -0
  12. package/dist-cjs/mega-menu/MegaMenuActions.css.js.map +1 -0
  13. package/dist-cjs/mega-menu/MegaMenuActions.js +33 -0
  14. package/dist-cjs/mega-menu/MegaMenuActions.js.map +1 -0
  15. package/dist-cjs/mega-menu/MegaMenuAside.css.js +6 -0
  16. package/dist-cjs/mega-menu/MegaMenuAside.css.js.map +1 -0
  17. package/dist-cjs/mega-menu/MegaMenuAside.js +33 -0
  18. package/dist-cjs/mega-menu/MegaMenuAside.js.map +1 -0
  19. package/dist-cjs/mega-menu/MegaMenuContent.css.js +6 -0
  20. package/dist-cjs/mega-menu/MegaMenuContent.css.js.map +1 -0
  21. package/dist-cjs/mega-menu/MegaMenuContent.js +25 -0
  22. package/dist-cjs/mega-menu/MegaMenuContent.js.map +1 -0
  23. package/dist-cjs/mega-menu/MegaMenuContext.js.map +1 -1
  24. package/dist-cjs/mega-menu/MegaMenuGroup.css.js +1 -1
  25. package/dist-cjs/mega-menu/MegaMenuGroup.js +10 -25
  26. package/dist-cjs/mega-menu/MegaMenuGroup.js.map +1 -1
  27. package/dist-cjs/mega-menu/MegaMenuGroupContext.js +17 -0
  28. package/dist-cjs/mega-menu/MegaMenuGroupContext.js.map +1 -0
  29. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js +6 -0
  30. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js.map +1 -0
  31. package/dist-cjs/mega-menu/MegaMenuGroupHeading.js +39 -0
  32. package/dist-cjs/mega-menu/MegaMenuGroupHeading.js.map +1 -0
  33. package/dist-cjs/mega-menu/MegaMenuGroups.css.js +1 -1
  34. package/dist-cjs/mega-menu/MegaMenuGroups.js.map +1 -1
  35. package/dist-cjs/mega-menu/MegaMenuList.css.js +6 -0
  36. package/dist-cjs/mega-menu/MegaMenuList.css.js.map +1 -0
  37. package/dist-cjs/mega-menu/MegaMenuList.js +43 -0
  38. package/dist-cjs/mega-menu/MegaMenuList.js.map +1 -0
  39. package/dist-cjs/mega-menu/MegaMenuListItem.css.js +6 -0
  40. package/dist-cjs/mega-menu/MegaMenuListItem.css.js.map +1 -0
  41. package/dist-cjs/mega-menu/MegaMenuListItem.js +45 -0
  42. package/dist-cjs/mega-menu/MegaMenuListItem.js.map +1 -0
  43. package/dist-cjs/mega-menu/MegaMenuPanel.css.js +1 -1
  44. package/dist-cjs/mega-menu/MegaMenuPanel.js +27 -47
  45. package/dist-cjs/mega-menu/MegaMenuPanel.js.map +1 -1
  46. package/dist-cjs/mega-menu/MegaMenuTrigger.js +16 -18
  47. package/dist-cjs/mega-menu/MegaMenuTrigger.js.map +1 -1
  48. package/dist-cjs/mega-menu/useMegaMenuNavigation.js +282 -0
  49. package/dist-cjs/mega-menu/useMegaMenuNavigation.js.map +1 -0
  50. package/dist-cjs/mega-menu/usePageMargin.js +22 -0
  51. package/dist-cjs/mega-menu/usePageMargin.js.map +1 -0
  52. package/dist-es/common-hooks/useSelection.js +6 -3
  53. package/dist-es/common-hooks/useSelection.js.map +1 -1
  54. package/dist-es/index.js +6 -7
  55. package/dist-es/index.js.map +1 -1
  56. package/dist-es/list/useList.js +7 -1
  57. package/dist-es/list/useList.js.map +1 -1
  58. package/dist-es/mega-menu/MegaMenu.js +9 -15
  59. package/dist-es/mega-menu/MegaMenu.js.map +1 -1
  60. package/dist-es/mega-menu/MegaMenuActions.css.js +4 -0
  61. package/dist-es/mega-menu/MegaMenuActions.css.js.map +1 -0
  62. package/dist-es/mega-menu/MegaMenuActions.js +31 -0
  63. package/dist-es/mega-menu/MegaMenuActions.js.map +1 -0
  64. package/dist-es/mega-menu/MegaMenuAside.css.js +4 -0
  65. package/dist-es/mega-menu/MegaMenuAside.css.js.map +1 -0
  66. package/dist-es/mega-menu/MegaMenuAside.js +31 -0
  67. package/dist-es/mega-menu/MegaMenuAside.js.map +1 -0
  68. package/dist-es/mega-menu/MegaMenuContent.css.js +4 -0
  69. package/dist-es/mega-menu/MegaMenuContent.css.js.map +1 -0
  70. package/dist-es/mega-menu/{MegaMenuHeader.js → MegaMenuContent.js} +8 -8
  71. package/dist-es/mega-menu/MegaMenuContent.js.map +1 -0
  72. package/dist-es/mega-menu/MegaMenuContext.js.map +1 -1
  73. package/dist-es/mega-menu/MegaMenuGroup.css.js +1 -1
  74. package/dist-es/mega-menu/MegaMenuGroup.js +13 -28
  75. package/dist-es/mega-menu/MegaMenuGroup.js.map +1 -1
  76. package/dist-es/mega-menu/MegaMenuGroupContext.js +14 -0
  77. package/dist-es/mega-menu/MegaMenuGroupContext.js.map +1 -0
  78. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js +4 -0
  79. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js.map +1 -0
  80. package/dist-es/mega-menu/MegaMenuGroupHeading.js +37 -0
  81. package/dist-es/mega-menu/MegaMenuGroupHeading.js.map +1 -0
  82. package/dist-es/mega-menu/MegaMenuGroups.css.js +1 -1
  83. package/dist-es/mega-menu/MegaMenuGroups.js.map +1 -1
  84. package/dist-es/mega-menu/MegaMenuList.css.js +4 -0
  85. package/dist-es/mega-menu/MegaMenuList.css.js.map +1 -0
  86. package/dist-es/mega-menu/MegaMenuList.js +41 -0
  87. package/dist-es/mega-menu/MegaMenuList.js.map +1 -0
  88. package/dist-es/mega-menu/MegaMenuListItem.css.js +4 -0
  89. package/dist-es/mega-menu/MegaMenuListItem.css.js.map +1 -0
  90. package/dist-es/mega-menu/MegaMenuListItem.js +43 -0
  91. package/dist-es/mega-menu/MegaMenuListItem.js.map +1 -0
  92. package/dist-es/mega-menu/MegaMenuPanel.css.js +1 -1
  93. package/dist-es/mega-menu/MegaMenuPanel.js +30 -50
  94. package/dist-es/mega-menu/MegaMenuPanel.js.map +1 -1
  95. package/dist-es/mega-menu/MegaMenuTrigger.js +14 -16
  96. package/dist-es/mega-menu/MegaMenuTrigger.js.map +1 -1
  97. package/dist-es/mega-menu/useMegaMenuNavigation.js +278 -0
  98. package/dist-es/mega-menu/useMegaMenuNavigation.js.map +1 -0
  99. package/dist-es/mega-menu/usePageMargin.js +20 -0
  100. package/dist-es/mega-menu/usePageMargin.js.map +1 -0
  101. package/dist-types/index.d.ts +0 -1
  102. package/dist-types/mega-menu/MegaMenu.d.ts +11 -2
  103. package/dist-types/mega-menu/MegaMenuActions.d.ts +10 -0
  104. package/dist-types/mega-menu/MegaMenuAside.d.ts +9 -0
  105. package/dist-types/mega-menu/MegaMenuContent.d.ts +9 -0
  106. package/dist-types/mega-menu/MegaMenuContext.d.ts +6 -7
  107. package/dist-types/mega-menu/MegaMenuGroup.d.ts +4 -3
  108. package/dist-types/mega-menu/MegaMenuGroupContext.d.ts +12 -0
  109. package/dist-types/mega-menu/MegaMenuGroupHeading.d.ts +13 -0
  110. package/dist-types/mega-menu/MegaMenuGroups.d.ts +3 -3
  111. package/dist-types/mega-menu/MegaMenuList.d.ts +16 -0
  112. package/dist-types/mega-menu/MegaMenuListItem.d.ts +25 -0
  113. package/dist-types/mega-menu/MegaMenuPanel.d.ts +2 -2
  114. package/dist-types/mega-menu/MegaMenuTrigger.d.ts +1 -0
  115. package/dist-types/mega-menu/index.d.ts +6 -4
  116. package/dist-types/mega-menu/useMegaMenuNavigation.d.ts +16 -0
  117. package/dist-types/mega-menu/usePageMargin.d.ts +6 -0
  118. package/package.json +2 -2
  119. package/dist-cjs/mega-menu/MegaMenuHeader.css.js +0 -6
  120. package/dist-cjs/mega-menu/MegaMenuHeader.css.js.map +0 -1
  121. package/dist-cjs/mega-menu/MegaMenuHeader.js +0 -25
  122. package/dist-cjs/mega-menu/MegaMenuHeader.js.map +0 -1
  123. package/dist-cjs/mega-menu/MegaMenuItem.css.js +0 -6
  124. package/dist-cjs/mega-menu/MegaMenuItem.css.js.map +0 -1
  125. package/dist-cjs/mega-menu/MegaMenuItem.js +0 -53
  126. package/dist-cjs/mega-menu/MegaMenuItem.js.map +0 -1
  127. package/dist-cjs/mega-menu/MegaMenuSupportingActions.css.js +0 -6
  128. package/dist-cjs/mega-menu/MegaMenuSupportingActions.css.js.map +0 -1
  129. package/dist-cjs/mega-menu/MegaMenuSupportingActions.js +0 -31
  130. package/dist-cjs/mega-menu/MegaMenuSupportingActions.js.map +0 -1
  131. package/dist-cjs/mega-menu/MegaMenuSupportingContent.css.js +0 -6
  132. package/dist-cjs/mega-menu/MegaMenuSupportingContent.css.js.map +0 -1
  133. package/dist-cjs/mega-menu/MegaMenuSupportingContent.js +0 -31
  134. package/dist-cjs/mega-menu/MegaMenuSupportingContent.js.map +0 -1
  135. package/dist-cjs/mega-menu/useMegaMenuKeyboard.js +0 -209
  136. package/dist-cjs/mega-menu/useMegaMenuKeyboard.js.map +0 -1
  137. package/dist-cjs/toolbar-next/ToolbarContentNext.css.js +0 -6
  138. package/dist-cjs/toolbar-next/ToolbarContentNext.css.js.map +0 -1
  139. package/dist-cjs/toolbar-next/ToolbarContentNext.js +0 -32
  140. package/dist-cjs/toolbar-next/ToolbarContentNext.js.map +0 -1
  141. package/dist-cjs/toolbar-next/ToolbarNext.css.js +0 -6
  142. package/dist-cjs/toolbar-next/ToolbarNext.css.js.map +0 -1
  143. package/dist-cjs/toolbar-next/ToolbarNext.js +0 -394
  144. package/dist-cjs/toolbar-next/ToolbarNext.js.map +0 -1
  145. package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js +0 -6
  146. package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js.map +0 -1
  147. package/dist-cjs/toolbar-next/ToolbarNextOverflow.js +0 -706
  148. package/dist-cjs/toolbar-next/ToolbarNextOverflow.js.map +0 -1
  149. package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +0 -165
  150. package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +0 -1
  151. package/dist-cjs/toolbar-next/TooltrayNext.css.js +0 -6
  152. package/dist-cjs/toolbar-next/TooltrayNext.css.js.map +0 -1
  153. package/dist-cjs/toolbar-next/TooltrayNext.js +0 -55
  154. package/dist-cjs/toolbar-next/TooltrayNext.js.map +0 -1
  155. package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js +0 -409
  156. package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js.map +0 -1
  157. package/dist-cjs/toolbar-next/toolbarNextUtils.js +0 -215
  158. package/dist-cjs/toolbar-next/toolbarNextUtils.js.map +0 -1
  159. package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js +0 -312
  160. package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js.map +0 -1
  161. package/dist-cjs/toolbar-next/useToolbarNextOverflow.js +0 -743
  162. package/dist-cjs/toolbar-next/useToolbarNextOverflow.js.map +0 -1
  163. package/dist-es/mega-menu/MegaMenuHeader.css.js +0 -4
  164. package/dist-es/mega-menu/MegaMenuHeader.css.js.map +0 -1
  165. package/dist-es/mega-menu/MegaMenuHeader.js.map +0 -1
  166. package/dist-es/mega-menu/MegaMenuItem.css.js +0 -4
  167. package/dist-es/mega-menu/MegaMenuItem.css.js.map +0 -1
  168. package/dist-es/mega-menu/MegaMenuItem.js +0 -51
  169. package/dist-es/mega-menu/MegaMenuItem.js.map +0 -1
  170. package/dist-es/mega-menu/MegaMenuSupportingActions.css.js +0 -4
  171. package/dist-es/mega-menu/MegaMenuSupportingActions.css.js.map +0 -1
  172. package/dist-es/mega-menu/MegaMenuSupportingActions.js +0 -29
  173. package/dist-es/mega-menu/MegaMenuSupportingActions.js.map +0 -1
  174. package/dist-es/mega-menu/MegaMenuSupportingContent.css.js +0 -4
  175. package/dist-es/mega-menu/MegaMenuSupportingContent.css.js.map +0 -1
  176. package/dist-es/mega-menu/MegaMenuSupportingContent.js +0 -29
  177. package/dist-es/mega-menu/MegaMenuSupportingContent.js.map +0 -1
  178. package/dist-es/mega-menu/useMegaMenuKeyboard.js +0 -205
  179. package/dist-es/mega-menu/useMegaMenuKeyboard.js.map +0 -1
  180. package/dist-es/toolbar-next/ToolbarContentNext.css.js +0 -4
  181. package/dist-es/toolbar-next/ToolbarContentNext.css.js.map +0 -1
  182. package/dist-es/toolbar-next/ToolbarContentNext.js +0 -30
  183. package/dist-es/toolbar-next/ToolbarContentNext.js.map +0 -1
  184. package/dist-es/toolbar-next/ToolbarNext.css.js +0 -4
  185. package/dist-es/toolbar-next/ToolbarNext.css.js.map +0 -1
  186. package/dist-es/toolbar-next/ToolbarNext.js +0 -392
  187. package/dist-es/toolbar-next/ToolbarNext.js.map +0 -1
  188. package/dist-es/toolbar-next/ToolbarNextOverflow.css.js +0 -4
  189. package/dist-es/toolbar-next/ToolbarNextOverflow.css.js.map +0 -1
  190. package/dist-es/toolbar-next/ToolbarNextOverflow.js +0 -701
  191. package/dist-es/toolbar-next/ToolbarNextOverflow.js.map +0 -1
  192. package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +0 -159
  193. package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +0 -1
  194. package/dist-es/toolbar-next/TooltrayNext.css.js +0 -4
  195. package/dist-es/toolbar-next/TooltrayNext.css.js.map +0 -1
  196. package/dist-es/toolbar-next/TooltrayNext.js +0 -53
  197. package/dist-es/toolbar-next/TooltrayNext.js.map +0 -1
  198. package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js +0 -390
  199. package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js.map +0 -1
  200. package/dist-es/toolbar-next/toolbarNextUtils.js +0 -211
  201. package/dist-es/toolbar-next/toolbarNextUtils.js.map +0 -1
  202. package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js +0 -310
  203. package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js.map +0 -1
  204. package/dist-es/toolbar-next/useToolbarNextOverflow.js +0 -741
  205. package/dist-es/toolbar-next/useToolbarNextOverflow.js.map +0 -1
  206. package/dist-types/mega-menu/MegaMenuHeader.d.ts +0 -8
  207. package/dist-types/mega-menu/MegaMenuItem.d.ts +0 -13
  208. package/dist-types/mega-menu/MegaMenuSupportingActions.d.ts +0 -8
  209. package/dist-types/mega-menu/MegaMenuSupportingContent.d.ts +0 -8
  210. package/dist-types/mega-menu/useMegaMenuKeyboard.d.ts +0 -30
  211. package/dist-types/toolbar-next/ToolbarContentNext.d.ts +0 -11
  212. package/dist-types/toolbar-next/ToolbarNext.d.ts +0 -12
  213. package/dist-types/toolbar-next/ToolbarNextOverflow.d.ts +0 -34
  214. package/dist-types/toolbar-next/ToolbarNextOverflowFloatingBoundary.d.ts +0 -16
  215. package/dist-types/toolbar-next/TooltrayNext.d.ts +0 -37
  216. package/dist-types/toolbar-next/index.d.ts +0 -3
  217. package/dist-types/toolbar-next/toolbarNextKeyboardUtils.d.ts +0 -39
  218. package/dist-types/toolbar-next/toolbarNextUtils.d.ts +0 -42
  219. package/dist-types/toolbar-next/useToolbarNextKeyboardNavigation.d.ts +0 -42
  220. package/dist-types/toolbar-next/useToolbarNextOverflow.d.ts +0 -37
package/CHANGELOG.md CHANGED
@@ -1,5 +1,68 @@
1
1
  # @salt-ds/lab
2
2
 
3
+ ## 1.0.0-alpha.97
4
+
5
+ ### Minor Changes
6
+
7
+ - 2516755: Removed `ToolbarNext`, `ToolbarContentNext`, and `TooltrayNext` from lab and promoted to core. As part of the promotion the components were renamed e.g., `ToolbarNext` is now `Toolbar`.
8
+
9
+ The legacy `Toolbar` and `Tooltray` exports in lab are unchanged.
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies [906c94e]
14
+ - Updated dependencies [2516755]
15
+ - Updated dependencies [027f8c4]
16
+ - Updated dependencies [027f8c4]
17
+ - @salt-ds/core@1.65.0
18
+
19
+ ## 1.0.0-alpha.96
20
+
21
+ ### Minor Changes
22
+
23
+ - 248982a: Reworked `MegaMenu` for more semantic, accessible markup and more predictable
24
+ keyboard navigation.
25
+
26
+ - **Renamed `MegaMenuHeader` to `MegaMenuGroupHeading`.** It now renders a real heading (`<h3>` by default; set the level with `as`, e.g. `as="h2"`) instead of a `<div>`, so each group appears in the document outline for assistive technology.
27
+ - **Renamed `MegaMenuItem` to `MegaMenuListItem`.** It renders an `<a>` by default — pass a `render` element such as `react-router`'s `Link` — and accepts a `current` prop that sets `aria-current="page"` for the active page.
28
+ - **Added `MegaMenuList`.** Wrap a group's items in it so they are announced as a list; `MegaMenuListItem` can no longer be placed directly inside `MegaMenuGroup`.
29
+ - **Renamed `MegaMenuSupportingContent` to `MegaMenuAside`.** It now renders an `<aside>` landmark, making the supporting region discoverable to screen-reader users.
30
+ - **Renamed `MegaMenuSupportingActions` to `MegaMenuActions`.**
31
+ - **Added `MegaMenuContent`.** It is the center navigation region holding the groups and an optional `MegaMenuActions` band; `MegaMenuAside` sits beside it, positioned by source order.
32
+ - **Narrowed `MegaMenu`'s `placement` prop** to `"bottom" | "bottom-start" | "bottom-end"` (the new `MegaMenuPlacement` type).
33
+ - **Menu columns now adapt to the available width** instead of overflowing, keeping panels usable on narrower viewports.
34
+ - **Keyboard navigation is more predictable** between the columns, the actions row, and the trigger;
35
+
36
+ ```diff
37
+ <MegaMenuPanel aria-label="Solutions menu">
38
+ + <MegaMenuContent>
39
+ <MegaMenuGroups>
40
+ <MegaMenuGroup>
41
+ - <MegaMenuHeader>Financial services</MegaMenuHeader>
42
+ - <MegaMenuItem render={<Link to="/digital-banking" />}>Digital banking</MegaMenuItem>
43
+ + <MegaMenuGroupHeading>Financial services</MegaMenuGroupHeading>
44
+ + <MegaMenuList>
45
+ + <MegaMenuListItem render={<Link to="/digital-banking" />}>Digital banking</MegaMenuListItem>
46
+ + </MegaMenuList>
47
+ </MegaMenuGroup>
48
+ </MegaMenuGroups>
49
+ - <MegaMenuSupportingActions>
50
+ + <MegaMenuActions>
51
+ <Link href="#demo">Book a demo</Link>
52
+ - </MegaMenuSupportingActions>
53
+ + </MegaMenuActions>
54
+ + </MegaMenuContent>
55
+ - <MegaMenuSupportingContent>...</MegaMenuSupportingContent>
56
+ + <MegaMenuAside>...</MegaMenuAside>
57
+ </MegaMenuPanel>
58
+ ```
59
+
60
+ ### Patch Changes
61
+
62
+ - bab3b6c: Fixed `ToolbarNext` overflow calculations to preserve fractional browser measurements and avoid false overflow caused by subpixel rounding.
63
+ - Updated dependencies [1a48c1a]
64
+ - @salt-ds/core@1.64.1
65
+
3
66
  ## 1.0.0-alpha.95
4
67
 
5
68
  ### Minor Changes
package/css/salt-lab.css CHANGED
@@ -1893,51 +1893,81 @@
1893
1893
  border-right: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-separable-primary-borderColor);
1894
1894
  }
1895
1895
 
1896
- /* src/mega-menu/MegaMenuGroup.css */
1897
- .saltMegaMenuGroup {
1896
+ /* src/mega-menu/MegaMenuActions.css */
1897
+ .saltMegaMenuActions {
1898
1898
  display: flex;
1899
- flex-direction: column;
1899
+ flex-wrap: wrap;
1900
+ margin-block-start: auto;
1900
1901
  }
1901
- .saltMegaMenuGroup-list {
1902
- list-style: none;
1903
- margin: 0;
1904
- padding: 0;
1902
+
1903
+ /* src/mega-menu/MegaMenuAside.css */
1904
+ .saltMegaMenuAside {
1905
+ flex: 0 0 auto;
1905
1906
  display: flex;
1906
- gap: var(--salt-spacing-fixed-100);
1907
1907
  flex-direction: column;
1908
+ padding: var(--salt-spacing-300);
1908
1909
  }
1909
1910
 
1910
- /* src/mega-menu/MegaMenuGroups.css */
1911
- .saltMegaMenuGroups {
1912
- display: grid;
1913
- grid-template-columns: repeat(auto-fit, var(--saltMegaMenuGroups-columnWidth, 12rem));
1911
+ /* src/mega-menu/MegaMenuContent.css */
1912
+ .saltMegaMenuContent {
1913
+ display: flex;
1914
+ flex-direction: column;
1914
1915
  gap: var(--salt-spacing-300);
1915
1916
  padding: var(--salt-spacing-300);
1916
- max-inline-size: var(--saltMegaMenuPanel-availableWidth, calc(100vw - var(--salt-spacing-600)));
1917
+ min-width: 0;
1918
+ flex: 0 1 auto;
1919
+ max-inline-size: var(--saltMegaMenuPanel-availableWidth);
1920
+ box-sizing: border-box;
1917
1921
  }
1918
1922
 
1919
- /* src/mega-menu/MegaMenuHeader.css */
1920
- .saltMegaMenuHeader-content {
1923
+ /* src/mega-menu/MegaMenuGroup.css */
1924
+ .saltMegaMenuGroup {
1925
+ display: flex;
1926
+ flex-direction: column;
1927
+ }
1928
+
1929
+ /* src/mega-menu/MegaMenuGroupHeading.css */
1930
+ .saltMegaMenuGroupHeading {
1921
1931
  display: flex;
1922
1932
  align-items: center;
1933
+ margin: 0 0 var(--salt-spacing-50);
1923
1934
  padding: var(--salt-spacing-50) var(--salt-spacing-100);
1935
+ border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-separable-tertiary-borderColor);
1936
+ min-height: var(--salt-size-base);
1924
1937
  font-family: var(--salt-text-label-fontFamily);
1925
1938
  font-size: var(--salt-text-label-fontSize);
1926
1939
  font-weight: var(--salt-text-fontWeight-strong);
1927
1940
  line-height: var(--salt-text-label-lineHeight);
1928
- min-height: var(--salt-size-base);
1929
1941
  color: var(--salt-content-secondary-foreground);
1930
1942
  }
1931
- .saltMegaMenuHeader {
1932
- margin-bottom: var(--salt-spacing-50);
1933
- border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-separable-tertiary-borderColor);
1943
+
1944
+ /* src/mega-menu/MegaMenuGroups.css */
1945
+ .saltMegaMenuGroups {
1946
+ align-self: start;
1947
+ display: grid;
1948
+ grid-template-columns: repeat(auto-fit, minmax(0, var(--saltMegaMenuGroups-columnWidth, 12rem)));
1949
+ gap: var(--salt-spacing-300);
1950
+ min-width: 0;
1951
+ max-inline-size: var(--saltMegaMenuPanel-availableWidth);
1934
1952
  }
1935
1953
 
1936
- /* src/mega-menu/MegaMenuItem.css */
1937
- .saltMegaMenuItem {
1954
+ /* src/mega-menu/MegaMenuList.css */
1955
+ .saltMegaMenuList {
1938
1956
  list-style: none;
1957
+ margin: 0;
1958
+ padding: 0;
1959
+ display: flex;
1960
+ gap: var(--salt-spacing-fixed-100);
1961
+ flex-direction: column;
1939
1962
  }
1940
- .saltMegaMenuItem > a {
1963
+
1964
+ /* src/mega-menu/MegaMenuListItem.css */
1965
+ .saltMegaMenuListItem {
1966
+ list-style: none;
1967
+ display: flex;
1968
+ flex-direction: column;
1969
+ }
1970
+ .saltMegaMenuListItem-wrapper {
1941
1971
  display: flex;
1942
1972
  padding: var(--salt-spacing-50) var(--salt-spacing-100);
1943
1973
  align-items: flex-start;
@@ -1948,15 +1978,18 @@
1948
1978
  box-sizing: border-box;
1949
1979
  gap: var(--salt-spacing-100);
1950
1980
  position: relative;
1951
- border-radius: var(--salt-palette-corner-weak);
1981
+ border-radius: var(--salt-palette-corner-weak, 0);
1952
1982
  text-decoration: none;
1983
+ border: none;
1984
+ font: inherit;
1985
+ text-align: start;
1953
1986
  }
1954
- .saltMegaMenuItem > a > .saltIcon {
1987
+ .saltMegaMenuListItem-wrapper > .saltIcon {
1955
1988
  display: flex;
1956
1989
  height: var(--salt-size-base);
1957
1990
  align-items: center;
1958
1991
  }
1959
- .saltMegaMenuItem-content {
1992
+ .saltMegaMenuListItem-content {
1960
1993
  flex: 1 0;
1961
1994
  margin: var(--salt-spacing-75) 0;
1962
1995
  font-family: var(--salt-text-fontFamily);
@@ -1964,18 +1997,18 @@
1964
1997
  font-weight: var(--salt-text-fontWeight);
1965
1998
  line-height: var(--salt-text-lineHeight);
1966
1999
  }
1967
- .saltMegaMenuItem > a:focus-visible {
2000
+ .saltMegaMenuListItem-wrapper:focus-visible {
1968
2001
  outline: var(--salt-focused-outline);
1969
2002
  outline-offset: calc(var(--salt-size-fixed-100) * -2);
1970
2003
  }
1971
- .saltMegaMenuItem > a:hover {
2004
+ .saltMegaMenuListItem-wrapper:hover:not(:focus-visible) {
1972
2005
  outline: none;
1973
- background: var(--salt-navigable-background-hover);
2006
+ background: var(--salt-overlayable-background-hover);
1974
2007
  }
1975
- .saltMegaMenuItem > a:active {
2008
+ .saltMegaMenuListItem-wrapper:active {
1976
2009
  background: var(--salt-navigable-accent-background-active);
1977
2010
  }
1978
- .saltMegaMenuItem > a:active::before {
2011
+ .saltMegaMenuListItem-wrapper:active::before {
1979
2012
  content: "";
1980
2013
  position: absolute;
1981
2014
  inset: 0;
@@ -1987,31 +2020,19 @@
1987
2020
 
1988
2021
  /* src/mega-menu/MegaMenuPanel.css */
1989
2022
  .saltMegaMenuPanel {
2023
+ --saltMegaMenuPanel-availableWidth: calc(100vw - var(--salt-spacing-600));
1990
2024
  display: flex;
1991
- flex-wrap: wrap;
2025
+ align-items: stretch;
1992
2026
  inline-size: var(--saltMegaMenuPanel-inlineSize, fit-content);
1993
- max-inline-size: var(--saltMegaMenuPanel-maxInlineSize, var(--saltMegaMenuPanel-availableWidth, calc(100vw - var(--salt-spacing-600))));
1994
- max-height: 90%;
2027
+ max-inline-size: var(--saltMegaMenuPanel-maxInlineSize, var(--saltMegaMenuPanel-availableWidth));
2028
+ max-block-size: 90vh;
1995
2029
  overflow-x: hidden;
1996
2030
  overflow-y: auto;
1997
2031
  box-sizing: border-box;
1998
- border-radius: var(--salt-palette-corner);
2032
+ border-radius: var(--salt-palette-corner, 0);
1999
2033
  border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-container-primary-borderColor);
2000
2034
  background: var(--salt-container-primary-background);
2001
- box-shadow: var(--salt-overlayable-shadow-popout);
2002
- }
2003
-
2004
- /* src/mega-menu/MegaMenuSupportingActions.css */
2005
- .saltMegaMenuSupportingActions {
2006
- display: flex;
2007
- flex-wrap: wrap;
2008
- width: fit-content;
2009
- padding-bottom: var(--salt-spacing-300);
2010
- }
2011
-
2012
- /* src/mega-menu/MegaMenuSupportingContent.css */
2013
- .saltMegaMenuSupportingContent {
2014
- padding: var(--salt-spacing-300);
2035
+ box-shadow: var(--salt-overlayable-shadow-modal);
2015
2036
  }
2016
2037
 
2017
2038
  /* src/menu-button/MenuButton.css */
@@ -3127,206 +3148,6 @@
3127
3148
  flex-basis: 0;
3128
3149
  }
3129
3150
 
3130
- /* src/toolbar-next/ToolbarContentNext.css */
3131
- .saltToolbarContentNext {
3132
- display: flex;
3133
- align-items: center;
3134
- gap: var(--salt-spacing-100);
3135
- min-width: 0;
3136
- flex-shrink: 0;
3137
- }
3138
- .saltToolbarContentNext[data-position=start] {
3139
- justify-content: flex-start;
3140
- }
3141
- .saltToolbarContentNext[data-position=center] {
3142
- justify-content: center;
3143
- }
3144
- .saltToolbarContentNext[data-position=end] {
3145
- justify-content: flex-end;
3146
- }
3147
- .saltToolbarContentNext[data-implicit] > .saltTooltrayNext[data-align=center],
3148
- .saltToolbarContentNext[data-implicit] > .saltTooltrayNext[data-align=end] {
3149
- margin-inline-start: 0;
3150
- margin-inline-end: 0;
3151
- }
3152
-
3153
- /* src/toolbar-next/ToolbarNext.css */
3154
- .saltToolbarNext {
3155
- box-sizing: border-box;
3156
- inline-size: 100%;
3157
- min-width: 0;
3158
- position: relative;
3159
- }
3160
- .saltToolbarNext-layout {
3161
- align-items: center;
3162
- --saltToolbarNext-band-gap: var(--salt-spacing-100);
3163
- }
3164
- .saltToolbarNext-layout:not([data-centered]) {
3165
- display: flex;
3166
- column-gap: var(--saltToolbarNext-band-gap);
3167
- }
3168
- .saltToolbarNext-layout[data-centered] {
3169
- display: grid;
3170
- grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
3171
- }
3172
- .saltToolbarNext-band {
3173
- display: flex;
3174
- align-items: center;
3175
- gap: var(--saltToolbarNext-band-gap);
3176
- min-width: 0;
3177
- }
3178
- .saltToolbarNext-layout:not([data-centered]) > .saltToolbarNext-band[data-band-position=end] {
3179
- justify-content: flex-end;
3180
- margin-inline-start: auto;
3181
- }
3182
- .saltToolbarNext-layout[data-centered] > .saltToolbarNext-band[data-band-position=start] {
3183
- grid-column: 1;
3184
- }
3185
- .saltToolbarNext-layout[data-centered] > .saltToolbarNext-band[data-band-position=center] {
3186
- grid-column: 2;
3187
- justify-content: center;
3188
- }
3189
- .saltToolbarNext-layout[data-centered] > .saltToolbarNext-band[data-band-position=end] {
3190
- grid-column: 3;
3191
- justify-content: flex-end;
3192
- }
3193
- .saltToolbarNext-fallback {
3194
- display: flex;
3195
- align-items: center;
3196
- gap: var(--salt-spacing-100);
3197
- }
3198
- .saltToolbarNext-layout > * {
3199
- min-width: 0;
3200
- }
3201
- .saltToolbarNext-primary {
3202
- --toolbarNext-background: var(--salt-container-primary-background);
3203
- --toolbarNext-borderColor: var(--salt-container-primary-borderColor);
3204
- }
3205
- .saltToolbarNext-secondary {
3206
- --toolbarNext-background: var(--salt-container-secondary-background);
3207
- --toolbarNext-borderColor: var(--salt-container-secondary-borderColor);
3208
- }
3209
- .saltToolbarNext-tertiary {
3210
- --toolbarNext-background: var(--salt-container-tertiary-background);
3211
- --toolbarNext-borderColor: var(--salt-container-tertiary-borderColor);
3212
- }
3213
- .saltToolbarNext-bordered {
3214
- background: var(--saltToolbarNext-background, var(--toolbarNext-background));
3215
- border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--saltToolbarNext-borderColor, var(--toolbarNext-borderColor));
3216
- border-radius: var(--salt-palette-corner, 0);
3217
- padding: var(--salt-spacing-100);
3218
- }
3219
- .saltToolbarNext-transparent {
3220
- background: transparent;
3221
- border: none;
3222
- padding: 0;
3223
- }
3224
- .saltToolbarNext-measurements {
3225
- display: flex;
3226
- gap: var(--salt-spacing-100);
3227
- position: absolute;
3228
- visibility: hidden;
3229
- pointer-events: none;
3230
- inset: 0 auto auto 0;
3231
- block-size: 0;
3232
- overflow: hidden;
3233
- }
3234
- .saltToolbarNext-measureTrigger {
3235
- white-space: nowrap;
3236
- }
3237
-
3238
- /* src/toolbar-next/ToolbarNextOverflow.css */
3239
- .saltToolbarNextOverflow-content {
3240
- position: relative;
3241
- }
3242
- .saltToolbarNextOverflow-slot,
3243
- .saltToolbarNextOverflow-panelItem {
3244
- align-items: center;
3245
- display: flex;
3246
- flex-shrink: 0;
3247
- gap: var(--salt-spacing-100);
3248
- min-width: 0;
3249
- }
3250
- .saltToolbarNextOverflow-slot[data-align=end] {
3251
- margin-inline-start: auto;
3252
- }
3253
- .saltToolbarNextOverflow-slot[data-align=center] {
3254
- margin-inline-start: auto;
3255
- margin-inline-end: auto;
3256
- }
3257
- .saltToolbarNextOverflow-item {
3258
- align-items: center;
3259
- display: flex;
3260
- flex-shrink: 0;
3261
- min-width: 0;
3262
- }
3263
- .saltToolbarNextOverflow-menu {
3264
- display: flex;
3265
- flex-shrink: 0;
3266
- }
3267
- .saltToolbarNextOverflow-itemHost,
3268
- .saltToolbarNextOverflow-contentHost {
3269
- display: contents;
3270
- }
3271
- .saltToolbarNextOverflow-trigger {
3272
- white-space: nowrap;
3273
- }
3274
- .saltToolbarNextOverflow-panel {
3275
- background: var(--salt-container-primary-background);
3276
- border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);
3277
- border-radius: var(--salt-palette-corner, 0);
3278
- box-shadow: var(--salt-overlayable-shadow-popout);
3279
- box-sizing: border-box;
3280
- max-width: min(32rem, calc(100vw - var(--salt-spacing-300)));
3281
- overflow: auto;
3282
- position: absolute;
3283
- z-index: var(--salt-zIndex-flyover);
3284
- }
3285
- .saltToolbarNextOverflow-floatingDescendant.saltToolbarNextOverflow-floatingDescendant {
3286
- z-index: calc(var(--salt-zIndex-flyover) + var(--salt-zIndex-default));
3287
- }
3288
- .saltToolbarNextOverflow-panelContent {
3289
- align-items: center;
3290
- display: flex;
3291
- flex-wrap: wrap;
3292
- gap: var(--salt-spacing-100);
3293
- max-width: inherit;
3294
- min-width: max-content;
3295
- padding: var(--salt-spacing-100);
3296
- }
3297
- .saltToolbarNextOverflow-panel .saltTooltrayNext[data-align=center],
3298
- .saltToolbarNextOverflow-panel .saltTooltrayNext[data-align=end] {
3299
- margin-inline-start: 0;
3300
- margin-inline-end: 0;
3301
- }
3302
- .saltToolbarNextOverflow-panel .saltTooltrayNext > * {
3303
- inline-size: auto;
3304
- }
3305
- .saltToolbarNextOverflow-content > .saltToolbarNextOverflow-slot .saltTooltrayNext[data-align=center],
3306
- .saltToolbarNextOverflow-content > .saltToolbarNextOverflow-slot .saltTooltrayNext[data-align=end] {
3307
- margin-inline-start: 0;
3308
- margin-inline-end: 0;
3309
- }
3310
-
3311
- /* src/toolbar-next/TooltrayNext.css */
3312
- .saltTooltrayNext {
3313
- display: flex;
3314
- align-items: center;
3315
- flex: 0 0 auto;
3316
- gap: var(--salt-spacing-100);
3317
- min-width: 0;
3318
- }
3319
- .saltTooltrayNext > * {
3320
- flex-shrink: 0;
3321
- }
3322
- .saltTooltrayNext[data-align=end] {
3323
- margin-inline-start: auto;
3324
- }
3325
- .saltTooltrayNext[data-align=center] {
3326
- margin-inline-start: auto;
3327
- margin-inline-end: auto;
3328
- }
3329
-
3330
3151
  /* src/window/ElectronWindow.css */
3331
3152
  .saltWindow {
3332
3153
  --saltDialog-boxShadow: none;
@@ -3437,4 +3258,4 @@
3437
3258
  margin: calc(var(--salt-size-unit) / 2) 0;
3438
3259
  }
3439
3260
 
3440
- /* src/0af170c9-7e3f-4fb8-8504-21af9780540e.css */
3261
+ /* src/8f16bdce-6a2c-43c5-bef1-c547bffcc9de.css */
@@ -2,6 +2,7 @@
2
2
 
3
3
  var core = require('@salt-ds/core');
4
4
  var react = require('react');
5
+ var listDomUtils = require('./list-dom-utils.js');
5
6
 
6
7
  const defaultSelectionKeys = ["Enter", " "];
7
8
  const isSelectable = (item) => item && item.disabled !== true && item.selectable !== false;
@@ -157,19 +158,21 @@ const useSelection = ({
157
158
  );
158
159
  const handleClick = react.useCallback(
159
160
  (evt) => {
160
- const item = indexPositions[highlightedIdx];
161
+ const targetIdx = listDomUtils.closestListItemIndex(evt.target);
162
+ const idx = targetIdx >= 0 ? targetIdx : highlightedIdx;
163
+ const item = indexPositions[idx];
161
164
  if (!disableSelection && isSelectable(item)) {
162
165
  evt.preventDefault();
163
166
  evt.stopPropagation();
164
167
  selectItemAtIndex(
165
168
  evt,
166
- highlightedIdx,
169
+ idx,
167
170
  item,
168
171
  evt.shiftKey,
169
172
  evt.ctrlKey || evt.metaKey
170
173
  );
171
174
  if (isExtendedSelect) {
172
- lastActive.current = highlightedIdx;
175
+ lastActive.current = idx;
173
176
  }
174
177
  }
175
178
  },
@@ -1 +1 @@
1
- {"version":3,"file":"useSelection.js","sources":["../src/common-hooks/useSelection.ts"],"sourcesContent":["import { useControlled } from \"@salt-ds/core\";\nimport {\n type KeyboardEvent,\n type MouseEvent,\n type SyntheticEvent,\n useCallback,\n useRef,\n} from \"react\";\nimport type { CollectionItem } from \"./collectionTypes\";\nimport type {\n SelectionHookProps,\n SelectionHookResult,\n SelectionStrategy,\n SingleSelectionStrategy,\n} from \"./selectionTypes\";\n\nexport const CHECKBOX = \"checkbox\";\n\nexport const GROUP_SELECTION_NONE = \"none\";\nexport const GROUP_SELECTION_SINGLE = \"single\";\nexport const GROUP_SELECTION_CASCADE = \"cascade\";\n\nexport type GroupSelectionMode = \"none\" | \"single\" | \"cascade\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nconst isSelectable = (item?: CollectionItem<unknown>) =>\n item && item.disabled !== true && item.selectable !== false;\n\nconst byItemIndex = (\n i1: CollectionItem<unknown>,\n i2: CollectionItem<unknown>,\n) => (i1.index ?? 0) - (i2.index ?? 0);\n\nexport const groupSelectionEnabled = (\n groupSelection: GroupSelectionMode,\n): boolean => groupSelection && groupSelection !== GROUP_SELECTION_NONE;\n\nexport const useSelection = <\n Item,\n Selection extends SelectionStrategy = \"default\",\n>({\n defaultSelected,\n disableSelection = false,\n // groupSelection = GROUP_SELECTION_NONE,\n highlightedIdx,\n indexPositions,\n label: _label = \"\",\n onSelect,\n onSelectionChange,\n selected: selectedProp,\n selectionStrategy,\n selectionKeys = defaultSelectionKeys,\n tabToSelect,\n}: SelectionHookProps<Item, Selection>): SelectionHookResult<\n Item,\n Selection\n> => {\n type collectionItem = CollectionItem<Item>;\n\n const isDeselectable = selectionStrategy === \"deselectable\";\n const isMultipleSelect = selectionStrategy === \"multiple\";\n const isExtendedSelect = selectionStrategy === \"extended\";\n\n const lastActive = useRef(-1);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => selectionKeys.includes(evt.key),\n [selectionKeys],\n );\n\n const emptyValue = useCallback(<\n Item,\n >(): Selection extends SingleSelectionStrategy\n ? null\n : CollectionItem<Item>[] => {\n type returnType = Selection extends SingleSelectionStrategy\n ? null\n : CollectionItem<Item>[];\n return isMultipleSelect || isExtendedSelect\n ? ([] as unknown as returnType)\n : (null as returnType);\n }, [isMultipleSelect, isExtendedSelect]);\n\n const [selected, setSelected] = useControlled<\n Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[]\n >({\n controlled: selectedProp,\n default: defaultSelected ?? emptyValue(),\n name: \"UseSelection\",\n state: \"selected\",\n });\n\n const isItemSelected = useCallback(\n (item: collectionItem) => {\n return Array.isArray(selected)\n ? selected.includes(item)\n : selected === item;\n },\n [selected],\n );\n\n const selectDefault = useCallback((item: collectionItem) => item, []);\n const selectDeselectable = useCallback(\n (item: collectionItem) => (isItemSelected(item) ? null : item),\n [isItemSelected],\n );\n const selectMultiple = useCallback(\n (item: collectionItem) => {\n const nextItems = isItemSelected(item)\n ? (selected as collectionItem[]).filter((i) => i !== item)\n : (selected as collectionItem[]).concat(item);\n nextItems.sort(byItemIndex);\n return nextItems;\n },\n [isItemSelected, selected],\n );\n const selectRange = useCallback(\n (idx: number, preserveExistingSelection?: boolean) => {\n const currentSelection = preserveExistingSelection\n ? (selected as collectionItem[])\n : ([] as collectionItem[]);\n\n const [lastSelectedItem] = (selected as collectionItem[]).slice(-1);\n const lastSelectedItemIndex = lastSelectedItem\n ? indexPositions.indexOf(lastSelectedItem)\n : 0;\n\n const startRegion = Math.min(idx, lastSelectedItemIndex);\n const endRegion = Math.max(idx, lastSelectedItemIndex);\n const rangeSelection = indexPositions.slice(startRegion, endRegion + 1);\n // concat the current selection with a new selection and remove duplicates for overlaps\n const nextItems = [...new Set([...currentSelection, ...rangeSelection])];\n nextItems.sort(byItemIndex);\n return nextItems;\n },\n [indexPositions, selected],\n );\n\n const selectItemAtIndex = useCallback(\n (\n evt: SyntheticEvent,\n idx: number,\n item: collectionItem,\n rangeSelect: boolean,\n preserveExistingSelection?: boolean,\n ) => {\n type returnType = Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n let newSelected: returnType;\n if (isMultipleSelect) {\n newSelected = selectMultiple(item) as returnType;\n } else if (isExtendedSelect) {\n if (preserveExistingSelection && !rangeSelect) {\n newSelected = selectMultiple(item) as returnType;\n } else if (rangeSelect) {\n newSelected = selectRange(\n idx,\n preserveExistingSelection,\n ) as returnType;\n } else {\n newSelected = [item] as returnType;\n }\n } else if (isDeselectable) {\n newSelected = selectDeselectable(item) as returnType;\n } else {\n newSelected = selectDefault(item) as returnType;\n }\n\n if (newSelected !== selected) {\n setSelected(newSelected);\n }\n\n // We fire onSelect irrespective of whether selection changes\n onSelect?.(evt, item);\n\n if (newSelected !== selected) {\n if (onSelectionChange) {\n onSelectionChange(evt, newSelected);\n }\n }\n },\n [\n isMultipleSelect,\n isExtendedSelect,\n isDeselectable,\n selected,\n onSelect,\n selectMultiple,\n selectRange,\n selectDeselectable,\n selectDefault,\n onSelectionChange,\n ],\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n const item = indexPositions[highlightedIdx];\n if (isSelectable(item)) {\n if (isSelectionEvent(evt) || (tabToSelect && evt.key === \"Tab\")) {\n // We do not inhibit Tab behaviour, if we are selecting on Tab then we apply\n // selection as a side effect of the Tab, not as a replacement for Tabbing.\n if (evt.key !== \"Tab\") {\n evt.preventDefault();\n }\n selectItemAtIndex(\n evt,\n highlightedIdx,\n item,\n false,\n evt.ctrlKey || evt.metaKey,\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIdx;\n }\n }\n }\n },\n [\n indexPositions,\n highlightedIdx,\n isSelectionEvent,\n tabToSelect,\n selectItemAtIndex,\n isExtendedSelect,\n ],\n );\n\n const handleKeyboardNavigation = useCallback(\n (evt: KeyboardEvent, currentIndex: number) => {\n if (isExtendedSelect && evt.shiftKey) {\n const item = indexPositions[currentIndex];\n if (isSelectable(item)) {\n selectItemAtIndex(evt, currentIndex, item, true);\n }\n }\n },\n [isExtendedSelect, indexPositions, selectItemAtIndex],\n );\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n const item = indexPositions[highlightedIdx];\n if (!disableSelection && isSelectable(item)) {\n // if (!isCollapsibleItem(item)) {\n evt.preventDefault();\n evt.stopPropagation();\n selectItemAtIndex(\n evt,\n highlightedIdx,\n item,\n evt.shiftKey,\n evt.ctrlKey || evt.metaKey,\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIdx;\n }\n // }\n }\n },\n [\n disableSelection,\n isExtendedSelect,\n highlightedIdx,\n indexPositions,\n selectItemAtIndex,\n ],\n );\n\n const listHandlers = {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyboardNavigation: handleKeyboardNavigation,\n };\n\n return {\n listHandlers,\n selected,\n setSelected,\n };\n};\n"],"names":["useRef","useCallback","useControlled"],"mappings":"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"}
1
+ {"version":3,"file":"useSelection.js","sources":["../src/common-hooks/useSelection.ts"],"sourcesContent":["import { useControlled } from \"@salt-ds/core\";\nimport {\n type KeyboardEvent,\n type MouseEvent,\n type SyntheticEvent,\n useCallback,\n useRef,\n} from \"react\";\nimport type { CollectionItem } from \"./collectionTypes\";\nimport { closestListItemIndex } from \"./list-dom-utils\";\nimport type {\n SelectionHookProps,\n SelectionHookResult,\n SelectionStrategy,\n SingleSelectionStrategy,\n} from \"./selectionTypes\";\n\nexport const CHECKBOX = \"checkbox\";\n\nexport const GROUP_SELECTION_NONE = \"none\";\nexport const GROUP_SELECTION_SINGLE = \"single\";\nexport const GROUP_SELECTION_CASCADE = \"cascade\";\n\nexport type GroupSelectionMode = \"none\" | \"single\" | \"cascade\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nconst isSelectable = (item?: CollectionItem<unknown>) =>\n item && item.disabled !== true && item.selectable !== false;\n\nconst byItemIndex = (\n i1: CollectionItem<unknown>,\n i2: CollectionItem<unknown>,\n) => (i1.index ?? 0) - (i2.index ?? 0);\n\nexport const groupSelectionEnabled = (\n groupSelection: GroupSelectionMode,\n): boolean => groupSelection && groupSelection !== GROUP_SELECTION_NONE;\n\nexport const useSelection = <\n Item,\n Selection extends SelectionStrategy = \"default\",\n>({\n defaultSelected,\n disableSelection = false,\n // groupSelection = GROUP_SELECTION_NONE,\n highlightedIdx,\n indexPositions,\n label: _label = \"\",\n onSelect,\n onSelectionChange,\n selected: selectedProp,\n selectionStrategy,\n selectionKeys = defaultSelectionKeys,\n tabToSelect,\n}: SelectionHookProps<Item, Selection>): SelectionHookResult<\n Item,\n Selection\n> => {\n type collectionItem = CollectionItem<Item>;\n\n const isDeselectable = selectionStrategy === \"deselectable\";\n const isMultipleSelect = selectionStrategy === \"multiple\";\n const isExtendedSelect = selectionStrategy === \"extended\";\n\n const lastActive = useRef(-1);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => selectionKeys.includes(evt.key),\n [selectionKeys],\n );\n\n const emptyValue = useCallback(<\n Item,\n >(): Selection extends SingleSelectionStrategy\n ? null\n : CollectionItem<Item>[] => {\n type returnType = Selection extends SingleSelectionStrategy\n ? null\n : CollectionItem<Item>[];\n return isMultipleSelect || isExtendedSelect\n ? ([] as unknown as returnType)\n : (null as returnType);\n }, [isMultipleSelect, isExtendedSelect]);\n\n const [selected, setSelected] = useControlled<\n Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[]\n >({\n controlled: selectedProp,\n default: defaultSelected ?? emptyValue(),\n name: \"UseSelection\",\n state: \"selected\",\n });\n\n const isItemSelected = useCallback(\n (item: collectionItem) => {\n return Array.isArray(selected)\n ? selected.includes(item)\n : selected === item;\n },\n [selected],\n );\n\n const selectDefault = useCallback((item: collectionItem) => item, []);\n const selectDeselectable = useCallback(\n (item: collectionItem) => (isItemSelected(item) ? null : item),\n [isItemSelected],\n );\n const selectMultiple = useCallback(\n (item: collectionItem) => {\n const nextItems = isItemSelected(item)\n ? (selected as collectionItem[]).filter((i) => i !== item)\n : (selected as collectionItem[]).concat(item);\n nextItems.sort(byItemIndex);\n return nextItems;\n },\n [isItemSelected, selected],\n );\n const selectRange = useCallback(\n (idx: number, preserveExistingSelection?: boolean) => {\n const currentSelection = preserveExistingSelection\n ? (selected as collectionItem[])\n : ([] as collectionItem[]);\n\n const [lastSelectedItem] = (selected as collectionItem[]).slice(-1);\n const lastSelectedItemIndex = lastSelectedItem\n ? indexPositions.indexOf(lastSelectedItem)\n : 0;\n\n const startRegion = Math.min(idx, lastSelectedItemIndex);\n const endRegion = Math.max(idx, lastSelectedItemIndex);\n const rangeSelection = indexPositions.slice(startRegion, endRegion + 1);\n // concat the current selection with a new selection and remove duplicates for overlaps\n const nextItems = [...new Set([...currentSelection, ...rangeSelection])];\n nextItems.sort(byItemIndex);\n return nextItems;\n },\n [indexPositions, selected],\n );\n\n const selectItemAtIndex = useCallback(\n (\n evt: SyntheticEvent,\n idx: number,\n item: collectionItem,\n rangeSelect: boolean,\n preserveExistingSelection?: boolean,\n ) => {\n type returnType = Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n let newSelected: returnType;\n if (isMultipleSelect) {\n newSelected = selectMultiple(item) as returnType;\n } else if (isExtendedSelect) {\n if (preserveExistingSelection && !rangeSelect) {\n newSelected = selectMultiple(item) as returnType;\n } else if (rangeSelect) {\n newSelected = selectRange(\n idx,\n preserveExistingSelection,\n ) as returnType;\n } else {\n newSelected = [item] as returnType;\n }\n } else if (isDeselectable) {\n newSelected = selectDeselectable(item) as returnType;\n } else {\n newSelected = selectDefault(item) as returnType;\n }\n\n if (newSelected !== selected) {\n setSelected(newSelected);\n }\n\n // We fire onSelect irrespective of whether selection changes\n onSelect?.(evt, item);\n\n if (newSelected !== selected) {\n if (onSelectionChange) {\n onSelectionChange(evt, newSelected);\n }\n }\n },\n [\n isMultipleSelect,\n isExtendedSelect,\n isDeselectable,\n selected,\n onSelect,\n selectMultiple,\n selectRange,\n selectDeselectable,\n selectDefault,\n onSelectionChange,\n ],\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n const item = indexPositions[highlightedIdx];\n if (isSelectable(item)) {\n if (isSelectionEvent(evt) || (tabToSelect && evt.key === \"Tab\")) {\n // We do not inhibit Tab behaviour, if we are selecting on Tab then we apply\n // selection as a side effect of the Tab, not as a replacement for Tabbing.\n if (evt.key !== \"Tab\") {\n evt.preventDefault();\n }\n selectItemAtIndex(\n evt,\n highlightedIdx,\n item,\n false,\n evt.ctrlKey || evt.metaKey,\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIdx;\n }\n }\n }\n },\n [\n indexPositions,\n highlightedIdx,\n isSelectionEvent,\n tabToSelect,\n selectItemAtIndex,\n isExtendedSelect,\n ],\n );\n\n const handleKeyboardNavigation = useCallback(\n (evt: KeyboardEvent, currentIndex: number) => {\n if (isExtendedSelect && evt.shiftKey) {\n const item = indexPositions[currentIndex];\n if (isSelectable(item)) {\n selectItemAtIndex(evt, currentIndex, item, true);\n }\n }\n },\n [isExtendedSelect, indexPositions, selectItemAtIndex],\n );\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n // Resolve the clicked item from the event target rather than relying on\n // `highlightedIdx`. The highlighted index is updated asynchronously from\n // a `mousemove` handler on the list; in fast/synthetic interactions\n // (notably Cypress `realClick`) the click can fire before React has\n // re-rendered with the updated highlight, which previously caused the\n // click to be silently ignored (root cause of flaky selection tests).\n const targetIdx = closestListItemIndex(evt.target as HTMLElement);\n const idx = targetIdx >= 0 ? targetIdx : highlightedIdx;\n const item = indexPositions[idx];\n if (!disableSelection && isSelectable(item)) {\n // if (!isCollapsibleItem(item)) {\n evt.preventDefault();\n evt.stopPropagation();\n selectItemAtIndex(\n evt,\n idx,\n item,\n evt.shiftKey,\n evt.ctrlKey || evt.metaKey,\n );\n if (isExtendedSelect) {\n lastActive.current = idx;\n }\n // }\n }\n },\n [\n disableSelection,\n isExtendedSelect,\n highlightedIdx,\n indexPositions,\n selectItemAtIndex,\n ],\n );\n\n const listHandlers = {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyboardNavigation: handleKeyboardNavigation,\n };\n\n return {\n listHandlers,\n selected,\n setSelected,\n };\n};\n"],"names":["useRef","useCallback","useControlled","closestListItemIndex"],"mappings":"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"}
package/dist-cjs/index.js CHANGED
@@ -79,13 +79,15 @@ var Logo = require('./logo/Logo.js');
79
79
  var LogoImage = require('./logo/LogoImage.js');
80
80
  var LogoSeparator = require('./logo/LogoSeparator.js');
81
81
  var MegaMenu = require('./mega-menu/MegaMenu.js');
82
+ var MegaMenuActions = require('./mega-menu/MegaMenuActions.js');
83
+ var MegaMenuAside = require('./mega-menu/MegaMenuAside.js');
84
+ var MegaMenuContent = require('./mega-menu/MegaMenuContent.js');
82
85
  var MegaMenuGroup = require('./mega-menu/MegaMenuGroup.js');
86
+ var MegaMenuGroupHeading = require('./mega-menu/MegaMenuGroupHeading.js');
83
87
  var MegaMenuGroups = require('./mega-menu/MegaMenuGroups.js');
84
- var MegaMenuHeader = require('./mega-menu/MegaMenuHeader.js');
85
- var MegaMenuItem = require('./mega-menu/MegaMenuItem.js');
88
+ var MegaMenuList = require('./mega-menu/MegaMenuList.js');
89
+ var MegaMenuListItem = require('./mega-menu/MegaMenuListItem.js');
86
90
  var MegaMenuPanel = require('./mega-menu/MegaMenuPanel.js');
87
- var MegaMenuSupportingActions = require('./mega-menu/MegaMenuSupportingActions.js');
88
- var MegaMenuSupportingContent = require('./mega-menu/MegaMenuSupportingContent.js');
89
91
  var MegaMenuTrigger = require('./mega-menu/MegaMenuTrigger.js');
90
92
  var MenuButton = require('./menu-button/MenuButton.js');
91
93
  var Metric = require('./metric/Metric.js');
@@ -126,9 +128,6 @@ var Toolbar = require('./toolbar/Toolbar.js');
126
128
  var ToolbarButton = require('./toolbar/ToolbarButton.js');
127
129
  var Tooltray = require('./toolbar/Tooltray.js');
128
130
  var ToolbarField = require('./toolbar/toolbar-field/ToolbarField.js');
129
- var ToolbarContentNext = require('./toolbar-next/ToolbarContentNext.js');
130
- var ToolbarNext = require('./toolbar-next/ToolbarNext.js');
131
- var TooltrayNext = require('./toolbar-next/TooltrayNext.js');
132
131
  var ElectronWindow = require('./window/ElectronWindow.js');
133
132
  var WindowContext = require('./window/WindowContext.js');
134
133
 
@@ -216,13 +215,15 @@ exports.Logo = Logo.Logo;
216
215
  exports.LogoImage = LogoImage.LogoImage;
217
216
  exports.LogoSeparator = LogoSeparator.LogoSeparator;
218
217
  exports.MegaMenu = MegaMenu.MegaMenu;
218
+ exports.MegaMenuActions = MegaMenuActions.MegaMenuActions;
219
+ exports.MegaMenuAside = MegaMenuAside.MegaMenuAside;
220
+ exports.MegaMenuContent = MegaMenuContent.MegaMenuContent;
219
221
  exports.MegaMenuGroup = MegaMenuGroup.MegaMenuGroup;
222
+ exports.MegaMenuGroupHeading = MegaMenuGroupHeading.MegaMenuGroupHeading;
220
223
  exports.MegaMenuGroups = MegaMenuGroups.MegaMenuGroups;
221
- exports.MegaMenuHeader = MegaMenuHeader.MegaMenuHeader;
222
- exports.MegaMenuItem = MegaMenuItem.MegaMenuItem;
224
+ exports.MegaMenuList = MegaMenuList.MegaMenuList;
225
+ exports.MegaMenuListItem = MegaMenuListItem.MegaMenuListItem;
223
226
  exports.MegaMenuPanel = MegaMenuPanel.MegaMenuPanel;
224
- exports.MegaMenuSupportingActions = MegaMenuSupportingActions.MegaMenuSupportingActions;
225
- exports.MegaMenuSupportingContent = MegaMenuSupportingContent.MegaMenuSupportingContent;
226
227
  exports.MegaMenuTrigger = MegaMenuTrigger.MegaMenuTrigger;
227
228
  exports.MenuButton = MenuButton.MenuButton;
228
229
  exports.Metric = Metric.Metric;
@@ -288,9 +289,6 @@ exports.Toolbar = Toolbar.Toolbar;
288
289
  exports.ToolbarButton = ToolbarButton.ToolbarButton;
289
290
  exports.Tooltray = Tooltray.Tooltray;
290
291
  exports.ToolbarField = ToolbarField.ToolbarField;
291
- exports.ToolbarContentNext = ToolbarContentNext.ToolbarContentNext;
292
- exports.ToolbarNext = ToolbarNext.ToolbarNext;
293
- exports.TooltrayNext = TooltrayNext.TooltrayNext;
294
292
  exports.ElectronWindow = ElectronWindow.ElectronWindow;
295
293
  exports.Window = WindowContext.Window;
296
294
  exports.WindowContext = WindowContext.WindowContext;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -180,7 +180,13 @@ const useList = ({
180
180
  onMouseLeave: navigationControlProps.onMouseLeave
181
181
  };
182
182
  const listHandlers = listHandlersProp || {
183
- onClick: selectionHook.listHandlers.onClick,
183
+ // Don't expose a click handler when the list is disabled. Previously,
184
+ // selection on disabled lists was prevented only as a side-effect of
185
+ // `handleMouseMove` gating on `disabled` (which kept `highlightedIdx` at
186
+ // -1, so `useSelection.handleClick` no-op'd). Now that `handleClick`
187
+ // resolves the clicked item directly from the event target, we must
188
+ // explicitly suppress the handler here.
189
+ onClick: disabled ? void 0 : selectionHook.listHandlers.onClick,
184
190
  // MouseEnter would be much better for this. There is a bug in Cypress
185
191
  // wheby it emits spurious MouseEnter (and MouseOver) events around
186
192
  // keypress events, which break many tests.