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

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 (153) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/css/salt-lab.css +70 -49
  3. package/dist-cjs/index.js +12 -8
  4. package/dist-cjs/index.js.map +1 -1
  5. package/dist-cjs/mega-menu/MegaMenu.js +8 -14
  6. package/dist-cjs/mega-menu/MegaMenu.js.map +1 -1
  7. package/dist-cjs/mega-menu/MegaMenuActions.css.js +6 -0
  8. package/dist-cjs/mega-menu/MegaMenuActions.css.js.map +1 -0
  9. package/dist-cjs/mega-menu/MegaMenuActions.js +33 -0
  10. package/dist-cjs/mega-menu/MegaMenuActions.js.map +1 -0
  11. package/dist-cjs/mega-menu/MegaMenuAside.css.js +6 -0
  12. package/dist-cjs/mega-menu/MegaMenuAside.css.js.map +1 -0
  13. package/dist-cjs/mega-menu/MegaMenuAside.js +33 -0
  14. package/dist-cjs/mega-menu/MegaMenuAside.js.map +1 -0
  15. package/dist-cjs/mega-menu/MegaMenuContent.css.js +6 -0
  16. package/dist-cjs/mega-menu/MegaMenuContent.css.js.map +1 -0
  17. package/dist-cjs/mega-menu/MegaMenuContent.js +25 -0
  18. package/dist-cjs/mega-menu/MegaMenuContent.js.map +1 -0
  19. package/dist-cjs/mega-menu/MegaMenuContext.js.map +1 -1
  20. package/dist-cjs/mega-menu/MegaMenuGroup.css.js +1 -1
  21. package/dist-cjs/mega-menu/MegaMenuGroup.js +10 -25
  22. package/dist-cjs/mega-menu/MegaMenuGroup.js.map +1 -1
  23. package/dist-cjs/mega-menu/MegaMenuGroupContext.js +17 -0
  24. package/dist-cjs/mega-menu/MegaMenuGroupContext.js.map +1 -0
  25. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js +6 -0
  26. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js.map +1 -0
  27. package/dist-cjs/mega-menu/MegaMenuGroupHeading.js +39 -0
  28. package/dist-cjs/mega-menu/MegaMenuGroupHeading.js.map +1 -0
  29. package/dist-cjs/mega-menu/MegaMenuGroups.css.js +1 -1
  30. package/dist-cjs/mega-menu/MegaMenuGroups.js.map +1 -1
  31. package/dist-cjs/mega-menu/MegaMenuList.css.js +6 -0
  32. package/dist-cjs/mega-menu/MegaMenuList.css.js.map +1 -0
  33. package/dist-cjs/mega-menu/MegaMenuList.js +43 -0
  34. package/dist-cjs/mega-menu/MegaMenuList.js.map +1 -0
  35. package/dist-cjs/mega-menu/MegaMenuListItem.css.js +6 -0
  36. package/dist-cjs/mega-menu/MegaMenuListItem.css.js.map +1 -0
  37. package/dist-cjs/mega-menu/MegaMenuListItem.js +45 -0
  38. package/dist-cjs/mega-menu/MegaMenuListItem.js.map +1 -0
  39. package/dist-cjs/mega-menu/MegaMenuPanel.css.js +1 -1
  40. package/dist-cjs/mega-menu/MegaMenuPanel.js +27 -47
  41. package/dist-cjs/mega-menu/MegaMenuPanel.js.map +1 -1
  42. package/dist-cjs/mega-menu/MegaMenuTrigger.js +16 -18
  43. package/dist-cjs/mega-menu/MegaMenuTrigger.js.map +1 -1
  44. package/dist-cjs/mega-menu/useMegaMenuNavigation.js +282 -0
  45. package/dist-cjs/mega-menu/useMegaMenuNavigation.js.map +1 -0
  46. package/dist-cjs/mega-menu/usePageMargin.js +22 -0
  47. package/dist-cjs/mega-menu/usePageMargin.js.map +1 -0
  48. package/dist-cjs/toolbar-next/useToolbarNextOverflow.js +9 -7
  49. package/dist-cjs/toolbar-next/useToolbarNextOverflow.js.map +1 -1
  50. package/dist-es/index.js +6 -4
  51. package/dist-es/index.js.map +1 -1
  52. package/dist-es/mega-menu/MegaMenu.js +9 -15
  53. package/dist-es/mega-menu/MegaMenu.js.map +1 -1
  54. package/dist-es/mega-menu/MegaMenuActions.css.js +4 -0
  55. package/dist-es/mega-menu/MegaMenuActions.css.js.map +1 -0
  56. package/dist-es/mega-menu/MegaMenuActions.js +31 -0
  57. package/dist-es/mega-menu/MegaMenuActions.js.map +1 -0
  58. package/dist-es/mega-menu/MegaMenuAside.css.js +4 -0
  59. package/dist-es/mega-menu/MegaMenuAside.css.js.map +1 -0
  60. package/dist-es/mega-menu/MegaMenuAside.js +31 -0
  61. package/dist-es/mega-menu/MegaMenuAside.js.map +1 -0
  62. package/dist-es/mega-menu/MegaMenuContent.css.js +4 -0
  63. package/dist-es/mega-menu/MegaMenuContent.css.js.map +1 -0
  64. package/dist-es/mega-menu/{MegaMenuHeader.js → MegaMenuContent.js} +8 -8
  65. package/dist-es/mega-menu/MegaMenuContent.js.map +1 -0
  66. package/dist-es/mega-menu/MegaMenuContext.js.map +1 -1
  67. package/dist-es/mega-menu/MegaMenuGroup.css.js +1 -1
  68. package/dist-es/mega-menu/MegaMenuGroup.js +13 -28
  69. package/dist-es/mega-menu/MegaMenuGroup.js.map +1 -1
  70. package/dist-es/mega-menu/MegaMenuGroupContext.js +14 -0
  71. package/dist-es/mega-menu/MegaMenuGroupContext.js.map +1 -0
  72. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js +4 -0
  73. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js.map +1 -0
  74. package/dist-es/mega-menu/MegaMenuGroupHeading.js +37 -0
  75. package/dist-es/mega-menu/MegaMenuGroupHeading.js.map +1 -0
  76. package/dist-es/mega-menu/MegaMenuGroups.css.js +1 -1
  77. package/dist-es/mega-menu/MegaMenuGroups.js.map +1 -1
  78. package/dist-es/mega-menu/MegaMenuList.css.js +4 -0
  79. package/dist-es/mega-menu/MegaMenuList.css.js.map +1 -0
  80. package/dist-es/mega-menu/MegaMenuList.js +41 -0
  81. package/dist-es/mega-menu/MegaMenuList.js.map +1 -0
  82. package/dist-es/mega-menu/MegaMenuListItem.css.js +4 -0
  83. package/dist-es/mega-menu/MegaMenuListItem.css.js.map +1 -0
  84. package/dist-es/mega-menu/MegaMenuListItem.js +43 -0
  85. package/dist-es/mega-menu/MegaMenuListItem.js.map +1 -0
  86. package/dist-es/mega-menu/MegaMenuPanel.css.js +1 -1
  87. package/dist-es/mega-menu/MegaMenuPanel.js +30 -50
  88. package/dist-es/mega-menu/MegaMenuPanel.js.map +1 -1
  89. package/dist-es/mega-menu/MegaMenuTrigger.js +14 -16
  90. package/dist-es/mega-menu/MegaMenuTrigger.js.map +1 -1
  91. package/dist-es/mega-menu/useMegaMenuNavigation.js +278 -0
  92. package/dist-es/mega-menu/useMegaMenuNavigation.js.map +1 -0
  93. package/dist-es/mega-menu/usePageMargin.js +20 -0
  94. package/dist-es/mega-menu/usePageMargin.js.map +1 -0
  95. package/dist-es/toolbar-next/useToolbarNextOverflow.js +9 -7
  96. package/dist-es/toolbar-next/useToolbarNextOverflow.js.map +1 -1
  97. package/dist-types/mega-menu/MegaMenu.d.ts +11 -2
  98. package/dist-types/mega-menu/MegaMenuActions.d.ts +10 -0
  99. package/dist-types/mega-menu/MegaMenuAside.d.ts +9 -0
  100. package/dist-types/mega-menu/MegaMenuContent.d.ts +9 -0
  101. package/dist-types/mega-menu/MegaMenuContext.d.ts +6 -7
  102. package/dist-types/mega-menu/MegaMenuGroup.d.ts +4 -3
  103. package/dist-types/mega-menu/MegaMenuGroupContext.d.ts +12 -0
  104. package/dist-types/mega-menu/MegaMenuGroupHeading.d.ts +13 -0
  105. package/dist-types/mega-menu/MegaMenuGroups.d.ts +3 -3
  106. package/dist-types/mega-menu/MegaMenuList.d.ts +16 -0
  107. package/dist-types/mega-menu/MegaMenuListItem.d.ts +25 -0
  108. package/dist-types/mega-menu/MegaMenuPanel.d.ts +2 -2
  109. package/dist-types/mega-menu/MegaMenuTrigger.d.ts +1 -0
  110. package/dist-types/mega-menu/index.d.ts +6 -4
  111. package/dist-types/mega-menu/useMegaMenuNavigation.d.ts +16 -0
  112. package/dist-types/mega-menu/usePageMargin.d.ts +6 -0
  113. package/package.json +2 -2
  114. package/dist-cjs/mega-menu/MegaMenuHeader.css.js +0 -6
  115. package/dist-cjs/mega-menu/MegaMenuHeader.css.js.map +0 -1
  116. package/dist-cjs/mega-menu/MegaMenuHeader.js +0 -25
  117. package/dist-cjs/mega-menu/MegaMenuHeader.js.map +0 -1
  118. package/dist-cjs/mega-menu/MegaMenuItem.css.js +0 -6
  119. package/dist-cjs/mega-menu/MegaMenuItem.css.js.map +0 -1
  120. package/dist-cjs/mega-menu/MegaMenuItem.js +0 -53
  121. package/dist-cjs/mega-menu/MegaMenuItem.js.map +0 -1
  122. package/dist-cjs/mega-menu/MegaMenuSupportingActions.css.js +0 -6
  123. package/dist-cjs/mega-menu/MegaMenuSupportingActions.css.js.map +0 -1
  124. package/dist-cjs/mega-menu/MegaMenuSupportingActions.js +0 -31
  125. package/dist-cjs/mega-menu/MegaMenuSupportingActions.js.map +0 -1
  126. package/dist-cjs/mega-menu/MegaMenuSupportingContent.css.js +0 -6
  127. package/dist-cjs/mega-menu/MegaMenuSupportingContent.css.js.map +0 -1
  128. package/dist-cjs/mega-menu/MegaMenuSupportingContent.js +0 -31
  129. package/dist-cjs/mega-menu/MegaMenuSupportingContent.js.map +0 -1
  130. package/dist-cjs/mega-menu/useMegaMenuKeyboard.js +0 -209
  131. package/dist-cjs/mega-menu/useMegaMenuKeyboard.js.map +0 -1
  132. package/dist-es/mega-menu/MegaMenuHeader.css.js +0 -4
  133. package/dist-es/mega-menu/MegaMenuHeader.css.js.map +0 -1
  134. package/dist-es/mega-menu/MegaMenuHeader.js.map +0 -1
  135. package/dist-es/mega-menu/MegaMenuItem.css.js +0 -4
  136. package/dist-es/mega-menu/MegaMenuItem.css.js.map +0 -1
  137. package/dist-es/mega-menu/MegaMenuItem.js +0 -51
  138. package/dist-es/mega-menu/MegaMenuItem.js.map +0 -1
  139. package/dist-es/mega-menu/MegaMenuSupportingActions.css.js +0 -4
  140. package/dist-es/mega-menu/MegaMenuSupportingActions.css.js.map +0 -1
  141. package/dist-es/mega-menu/MegaMenuSupportingActions.js +0 -29
  142. package/dist-es/mega-menu/MegaMenuSupportingActions.js.map +0 -1
  143. package/dist-es/mega-menu/MegaMenuSupportingContent.css.js +0 -4
  144. package/dist-es/mega-menu/MegaMenuSupportingContent.css.js.map +0 -1
  145. package/dist-es/mega-menu/MegaMenuSupportingContent.js +0 -29
  146. package/dist-es/mega-menu/MegaMenuSupportingContent.js.map +0 -1
  147. package/dist-es/mega-menu/useMegaMenuKeyboard.js +0 -205
  148. package/dist-es/mega-menu/useMegaMenuKeyboard.js.map +0 -1
  149. package/dist-types/mega-menu/MegaMenuHeader.d.ts +0 -8
  150. package/dist-types/mega-menu/MegaMenuItem.d.ts +0 -13
  151. package/dist-types/mega-menu/MegaMenuSupportingActions.d.ts +0 -8
  152. package/dist-types/mega-menu/MegaMenuSupportingContent.d.ts +0 -8
  153. package/dist-types/mega-menu/useMegaMenuKeyboard.d.ts +0 -30
@@ -1 +1 @@
1
- {"version":3,"file":"MegaMenuGroup.js","sources":["../src/mega-menu/MegaMenuGroup.tsx"],"sourcesContent":["import { makePrefixer, useId } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n cloneElement,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type ReactNode,\n} from \"react\";\nimport megaMenuGroupCss from \"./MegaMenuGroup.css\";\nimport { MegaMenuHeader } from \"./MegaMenuHeader\";\n\nconst withBaseName = makePrefixer(\"saltMegaMenuGroup\");\n\nexport interface MegaMenuGroupProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The content of the mega menu group, typically MegaMenuHeader and MegaMenuItem components.\n */\n children?: ReactNode;\n}\n\nexport const MegaMenuGroup = forwardRef<HTMLDivElement, MegaMenuGroupProps>(\n function MegaMenuGroup({ children, className, ...rest }, ref) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-mega-menu-group\",\n css: megaMenuGroupCss,\n window: targetWindow,\n });\n\n const headerId = useId();\n let header: ReactNode = null;\n const items: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === MegaMenuHeader && !header) {\n header = cloneElement(child, { id: headerId });\n } else {\n items.push(child);\n }\n });\n\n return (\n <div\n className={clsx(withBaseName(), className)}\n data-mega-menu-column=\"\"\n ref={ref}\n {...rest}\n >\n {header}\n <ol\n className={withBaseName(\"list\")}\n aria-labelledby={header ? headerId : undefined}\n >\n {items}\n </ol>\n </div>\n );\n },\n);\n"],"names":["MegaMenuGroup","megaMenuGroupCss"],"mappings":";;;;;;;;;AAeA,MAAM,YAAA,GAAe,aAAa,mBAAmB,CAAA;AAS9C,MAAM,aAAA,GAAgB,UAAA;AAAA,EAC3B,SAASA,eAAc,EAAE,QAAA,EAAU,WAAW,GAAG,IAAA,IAAQ,GAAA,EAAK;AAC5D,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,WAAW,KAAA,EAAM;AACvB,IAAA,IAAI,MAAA,GAAoB,IAAA;AACxB,IAAA,MAAM,QAAqB,EAAC;AAE5B,IAAA,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,CAAC,KAAA,KAAU;AACpC,MAAA,IAAI,eAAe,KAAK,CAAA,IAAK,MAAM,IAAA,KAAS,cAAA,IAAkB,CAAC,MAAA,EAAQ;AACrE,QAAA,MAAA,GAAS,YAAA,CAAa,KAAA,EAAO,EAAE,EAAA,EAAI,UAAU,CAAA;AAAA,MAC/C,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,uBAAA,EAAsB,EAAA;AAAA,QACtB,GAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,MAAA;AAAA,0BACD,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,cAC9B,iBAAA,EAAiB,SAAS,QAAA,GAAW,MAAA;AAAA,cAEpC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;;;;"}
1
+ {"version":3,"file":"MegaMenuGroup.js","sources":["../src/mega-menu/MegaMenuGroup.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n useMemo,\n useState,\n} from \"react\";\nimport megaMenuGroupCss from \"./MegaMenuGroup.css\";\nimport { MegaMenuGroupContext } from \"./MegaMenuGroupContext\";\n\nconst withBaseName = makePrefixer(\"saltMegaMenuGroup\");\n\nexport interface MegaMenuGroupProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * The content of the mega menu group: a `MegaMenuGroupHeading` and a\n * `MegaMenuList` of `MegaMenuListItem`s.\n */\n children?: ReactNode;\n}\n\nexport const MegaMenuGroup = forwardRef<HTMLDivElement, MegaMenuGroupProps>(\n function MegaMenuGroup({ children, className, ...rest }, ref) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-mega-menu-group\",\n css: megaMenuGroupCss,\n window: targetWindow,\n });\n\n // The heading registers its id so the list can label itself; `undefined`\n // with no heading. The group is also a navigation column.\n const [headingId, setHeadingId] = useState<string | undefined>(undefined);\n const contextValue = useMemo(\n () => ({ headingId, setHeadingId }),\n [headingId],\n );\n\n return (\n <MegaMenuGroupContext.Provider value={contextValue}>\n <div\n data-mega-menu-column=\"\"\n className={clsx(withBaseName(), className)}\n ref={ref}\n {...rest}\n >\n {children}\n </div>\n </MegaMenuGroupContext.Provider>\n );\n },\n);\n"],"names":["MegaMenuGroup","megaMenuGroupCss"],"mappings":";;;;;;;;;AAcA,MAAM,YAAA,GAAe,aAAa,mBAAmB,CAAA;AAU9C,MAAM,aAAA,GAAgB,UAAA;AAAA,EAC3B,SAASA,eAAc,EAAE,QAAA,EAAU,WAAW,GAAG,IAAA,IAAQ,GAAA,EAAK;AAC5D,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAID,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA6B,MAAS,CAAA;AACxE,IAAA,MAAM,YAAA,GAAe,OAAA;AAAA,MACnB,OAAO,EAAE,SAAA,EAAW,YAAA,EAAa,CAAA;AAAA,MACjC,CAAC,SAAS;AAAA,KACZ;AAEA,IAAA,uBACE,GAAA,CAAC,oBAAA,CAAqB,QAAA,EAArB,EAA8B,OAAO,YAAA,EACpC,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,uBAAA,EAAsB,EAAA;AAAA,QACtB,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,GAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,14 @@
1
+ import { createContext } from '@salt-ds/core';
2
+ import { useContext } from 'react';
3
+
4
+ const MegaMenuGroupContext = createContext(
5
+ "MegaMenuGroupContext",
6
+ { headingId: void 0, setHeadingId: () => {
7
+ } }
8
+ );
9
+ function useMegaMenuGroup() {
10
+ return useContext(MegaMenuGroupContext);
11
+ }
12
+
13
+ export { MegaMenuGroupContext, useMegaMenuGroup };
14
+ //# sourceMappingURL=MegaMenuGroupContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuGroupContext.js","sources":["../src/mega-menu/MegaMenuGroupContext.ts"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { useContext } from \"react\";\n\nexport interface MegaMenuGroupContextValue {\n /**\n * The rendered heading's id, used to label the item list via `aria-labelledby`.\n * `undefined` when the group has no `MegaMenuGroupHeading`.\n */\n headingId: string | undefined;\n /** Register (or clear, with `undefined`) the heading's id. */\n setHeadingId: (id: string | undefined) => void;\n}\n\nexport const MegaMenuGroupContext = createContext<MegaMenuGroupContextValue>(\n \"MegaMenuGroupContext\",\n { headingId: undefined, setHeadingId: () => {} },\n);\n\n/** Access the nearest `MegaMenuGroup` context. */\nexport function useMegaMenuGroup(): MegaMenuGroupContextValue {\n return useContext(MegaMenuGroupContext);\n}\n"],"names":[],"mappings":";;;AAaO,MAAM,oBAAA,GAAuB,aAAA;AAAA,EAClC,sBAAA;AAAA,EACA,EAAE,SAAA,EAAW,MAAA,EAAW,YAAA,EAAc,MAAM;AAAA,EAAC,CAAA;AAC/C;AAGO,SAAS,gBAAA,GAA8C;AAC5D,EAAA,OAAO,WAAW,oBAAoB,CAAA;AACxC;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltMegaMenuGroupHeading {\n display: flex;\n align-items: center;\n margin: 0 0 var(--salt-spacing-50);\n padding: var(--salt-spacing-50) var(--salt-spacing-100);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-separable-tertiary-borderColor);\n min-height: var(--salt-size-base);\n font-family: var(--salt-text-label-fontFamily);\n font-size: var(--salt-text-label-fontSize);\n font-weight: var(--salt-text-fontWeight-strong);\n line-height: var(--salt-text-label-lineHeight);\n color: var(--salt-content-secondary-foreground);\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=MegaMenuGroupHeading.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuGroupHeading.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,37 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer, useId, useIsomorphicLayoutEffect } from '@salt-ds/core';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import { clsx } from 'clsx';
6
+ import { forwardRef } from 'react';
7
+ import { useMegaMenuGroup } from './MegaMenuGroupContext.js';
8
+ import css_248z from './MegaMenuGroupHeading.css.js';
9
+
10
+ const withBaseName = makePrefixer("saltMegaMenuGroupHeading");
11
+ const MegaMenuGroupHeading = forwardRef(function MegaMenuGroupHeading2({ children, className, id: idProp, as: Heading = "h3", ...rest }, ref) {
12
+ const targetWindow = useWindow();
13
+ useComponentCssInjection({
14
+ testId: "salt-mega-menu-group-heading",
15
+ css: css_248z,
16
+ window: targetWindow
17
+ });
18
+ const id = useId(idProp);
19
+ const { setHeadingId } = useMegaMenuGroup();
20
+ useIsomorphicLayoutEffect(() => {
21
+ setHeadingId(id);
22
+ return () => setHeadingId(void 0);
23
+ }, [id, setHeadingId]);
24
+ return /* @__PURE__ */ jsx(
25
+ Heading,
26
+ {
27
+ className: clsx(withBaseName(), className),
28
+ ref,
29
+ ...rest,
30
+ id,
31
+ children
32
+ }
33
+ );
34
+ });
35
+
36
+ export { MegaMenuGroupHeading };
37
+ //# sourceMappingURL=MegaMenuGroupHeading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuGroupHeading.js","sources":["../src/mega-menu/MegaMenuGroupHeading.tsx"],"sourcesContent":["import { makePrefixer, useId, useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport { useMegaMenuGroup } from \"./MegaMenuGroupContext\";\nimport megaMenuGroupHeadingCss from \"./MegaMenuGroupHeading.css\";\n\nconst withBaseName = makePrefixer(\"saltMegaMenuGroupHeading\");\n\nexport interface MegaMenuGroupHeadingProps\n extends ComponentPropsWithoutRef<\"h2\"> {\n /**\n * The content of the mega menu group heading.\n */\n children?: ReactNode;\n /**\n * The heading element to render.\n * @default \"h3\"\n */\n as?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n}\n\nexport const MegaMenuGroupHeading = forwardRef<\n HTMLHeadingElement,\n MegaMenuGroupHeadingProps\n>(function MegaMenuGroupHeading(\n { children, className, id: idProp, as: Heading = \"h3\", ...rest },\n ref,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-mega-menu-group-heading\",\n css: megaMenuGroupHeadingCss,\n window: targetWindow,\n });\n\n const id = useId(idProp);\n const { setHeadingId } = useMegaMenuGroup();\n useIsomorphicLayoutEffect(() => {\n setHeadingId(id);\n return () => setHeadingId(undefined);\n }, [id, setHeadingId]);\n\n return (\n <Heading\n className={clsx(withBaseName(), className)}\n ref={ref}\n {...rest}\n id={id}\n >\n {children}\n </Heading>\n );\n});\n"],"names":["MegaMenuGroupHeading","megaMenuGroupHeadingCss"],"mappings":";;;;;;;;;AAYA,MAAM,YAAA,GAAe,aAAa,0BAA0B,CAAA;AAerD,MAAM,oBAAA,GAAuB,UAAA,CAGlC,SAASA,qBAAAA,CACT,EAAE,QAAA,EAAU,SAAA,EAAW,EAAA,EAAI,MAAA,EAAQ,IAAI,OAAA,GAAU,IAAA,EAAM,GAAG,IAAA,IAC1D,GAAA,EACA;AACA,EAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,EAAA,wBAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,8BAAA;AAAA,IACR,GAAA,EAAKC,QAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAA,GAAK,MAAM,MAAM,CAAA;AACvB,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,gBAAA,EAAiB;AAC1C,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,OAAO,MAAM,aAAa,MAAS,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,EAAA,EAAI,YAAY,CAAC,CAAA;AAErB,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,MACzC,GAAA;AAAA,MACC,GAAG,IAAA;AAAA,MACJ,EAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ,CAAC;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = ".saltMegaMenuGroups {\n display: grid;\n grid-template-columns: repeat(auto-fit, var(--saltMegaMenuGroups-columnWidth, 12rem));\n gap: var(--salt-spacing-300);\n padding: var(--salt-spacing-300);\n max-inline-size: var(--saltMegaMenuPanel-availableWidth, calc(100vw - var(--salt-spacing-600)));\n}\n";
1
+ var css_248z = ".saltMegaMenuGroups {\n align-self: start;\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(0, var(--saltMegaMenuGroups-columnWidth, 12rem)));\n gap: var(--salt-spacing-300);\n min-width: 0;\n max-inline-size: var(--saltMegaMenuPanel-availableWidth);\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=MegaMenuGroups.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MegaMenuGroups.js","sources":["../src/mega-menu/MegaMenuGroups.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\nimport megaMenuGroupsCss from \"./MegaMenuGroups.css\";\n\nconst withBaseName = makePrefixer(\"saltMegaMenuGroups\");\n\nexport interface MegaMenuGroupsProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The content of the mega menu section.\n */\n children?: ReactNode;\n}\n\nexport const MegaMenuGroups = forwardRef<HTMLDivElement, MegaMenuGroupsProps>(\n function MegaMenuGroups({ children, className, ...rest }, ref) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-mega-menu-groups\",\n css: megaMenuGroupsCss,\n window: targetWindow,\n });\n\n return (\n <div className={clsx(withBaseName(), className)} ref={ref} {...rest}>\n {children}\n </div>\n );\n },\n);\n"],"names":["MegaMenuGroups","megaMenuGroupsCss"],"mappings":";;;;;;;;AAOA,MAAM,YAAA,GAAe,aAAa,oBAAoB,CAAA;AAS/C,MAAM,cAAA,GAAiB,UAAA;AAAA,EAC5B,SAASA,gBAAe,EAAE,QAAA,EAAU,WAAW,GAAG,IAAA,IAAQ,GAAA,EAAK;AAC7D,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,uBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA,EAAG,GAAA,EAAW,GAAG,IAAA,EAC5D,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;;;;"}
1
+ {"version":3,"file":"MegaMenuGroups.js","sources":["../src/mega-menu/MegaMenuGroups.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport megaMenuGroupsCss from \"./MegaMenuGroups.css\";\n\nconst withBaseName = makePrefixer(\"saltMegaMenuGroups\");\n\nexport interface MegaMenuGroupsProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * The `MegaMenuGroup` columns of the mega menu.\n */\n children?: ReactNode;\n}\n\nexport const MegaMenuGroups = forwardRef<HTMLDivElement, MegaMenuGroupsProps>(\n function MegaMenuGroups({ children, className, ...rest }, ref) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-mega-menu-groups\",\n css: megaMenuGroupsCss,\n window: targetWindow,\n });\n\n return (\n <div className={clsx(withBaseName(), className)} ref={ref} {...rest}>\n {children}\n </div>\n );\n },\n);\n"],"names":["MegaMenuGroups","megaMenuGroupsCss"],"mappings":";;;;;;;;AAWA,MAAM,YAAA,GAAe,aAAa,oBAAoB,CAAA;AAS/C,MAAM,cAAA,GAAiB,UAAA;AAAA,EAC5B,SAASA,gBAAe,EAAE,QAAA,EAAU,WAAW,GAAG,IAAA,IAAQ,GAAA,EAAK;AAC7D,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,uBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA,EAAG,GAAA,EAAW,GAAG,IAAA,EAC5D,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltMegaMenuList {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n gap: var(--salt-spacing-fixed-100);\n flex-direction: column;\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=MegaMenuList.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuList.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,41 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer } from '@salt-ds/core';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import { clsx } from 'clsx';
6
+ import { forwardRef } from 'react';
7
+ import { useMegaMenuGroup } from './MegaMenuGroupContext.js';
8
+ import css_248z from './MegaMenuList.css.js';
9
+
10
+ const withBaseName = makePrefixer("saltMegaMenuList");
11
+ const MegaMenuList = forwardRef(
12
+ function MegaMenuList2({
13
+ as,
14
+ children,
15
+ className,
16
+ "aria-labelledby": ariaLabelledBy,
17
+ ...rest
18
+ }, ref) {
19
+ const targetWindow = useWindow();
20
+ useComponentCssInjection({
21
+ testId: "salt-mega-menu-list",
22
+ css: css_248z,
23
+ window: targetWindow
24
+ });
25
+ const { headingId } = useMegaMenuGroup();
26
+ const Component = as || "ul";
27
+ return /* @__PURE__ */ jsx(
28
+ Component,
29
+ {
30
+ ref,
31
+ className: clsx(withBaseName(), className),
32
+ "aria-labelledby": clsx(headingId, ariaLabelledBy) || void 0,
33
+ ...rest,
34
+ children
35
+ }
36
+ );
37
+ }
38
+ );
39
+
40
+ export { MegaMenuList };
41
+ //# sourceMappingURL=MegaMenuList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuList.js","sources":["../src/mega-menu/MegaMenuList.tsx"],"sourcesContent":["import {\n makePrefixer,\n type PolymorphicComponentPropWithRef,\n type PolymorphicRef,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ElementType,\n type ForwardedRef,\n type FunctionComponent,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport { useMegaMenuGroup } from \"./MegaMenuGroupContext\";\nimport megaMenuListCss from \"./MegaMenuList.css\";\n\nconst withBaseName = makePrefixer(\"saltMegaMenuList\");\n\nexport type MegaMenuListProps<T extends ElementType = \"ul\"> =\n PolymorphicComponentPropWithRef<\n T,\n {\n /**\n * The items of the group, typically `MegaMenuListItem` components. Each\n * `MegaMenuListItem` renders its own `<li>`.\n */\n children?: ReactNode;\n }\n >;\n\ntype MegaMenuListComponent = <T extends ElementType = \"ul\">(\n props: MegaMenuListProps<T>,\n) => ReturnType<FunctionComponent>;\n\n/**\n * The list of a group's `MegaMenuListItem`s. Renders a `<ul>` by default; pass\n * `as=\"ol\"` for an ordered list.\n */\nexport const MegaMenuList: MegaMenuListComponent = forwardRef(\n function MegaMenuList<T extends ElementType = \"ul\">(\n {\n as,\n children,\n className,\n \"aria-labelledby\": ariaLabelledBy,\n ...rest\n }: MegaMenuListProps<T>,\n ref?: ForwardedRef<unknown>,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-mega-menu-list\",\n css: megaMenuListCss,\n window: targetWindow,\n });\n\n const { headingId } = useMegaMenuGroup();\n\n const Component = as || \"ul\";\n\n return (\n <Component\n ref={ref as PolymorphicRef<T>}\n className={clsx(withBaseName(), className)}\n aria-labelledby={clsx(headingId, ariaLabelledBy) || undefined}\n {...rest}\n >\n {children}\n </Component>\n );\n },\n);\n"],"names":["MegaMenuList","megaMenuListCss"],"mappings":";;;;;;;;;AAkBA,MAAM,YAAA,GAAe,aAAa,kBAAkB,CAAA;AAsB7C,MAAM,YAAA,GAAsC,UAAA;AAAA,EACjD,SAASA,aAAAA,CACP;AAAA,IACE,EAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA,EAAmB,cAAA;AAAA,IACnB,GAAG;AAAA,KAEL,GAAA,EACA;AACA,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,qBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,gBAAA,EAAiB;AAEvC,IAAA,MAAM,YAAY,EAAA,IAAM,IAAA;AAExB,IAAA,uBACE,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,iBAAA,EAAiB,IAAA,CAAK,SAAA,EAAW,cAAc,CAAA,IAAK,MAAA;AAAA,QACnD,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltMegaMenuListItem {\n list-style: none;\n display: flex;\n flex-direction: column;\n}\n\n.saltMegaMenuListItem-wrapper {\n display: flex;\n padding: var(--salt-spacing-50) var(--salt-spacing-100);\n align-items: flex-start;\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background);\n cursor: var(--salt-cursor-hover);\n min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n box-sizing: border-box;\n gap: var(--salt-spacing-100);\n position: relative;\n border-radius: var(--salt-palette-corner-weak, 0);\n text-decoration: none;\n border: none;\n font: inherit;\n text-align: start;\n}\n\n.saltMegaMenuListItem-wrapper > .saltIcon {\n display: flex;\n height: var(--salt-size-base);\n align-items: center;\n}\n\n.saltMegaMenuListItem-content {\n flex: 1 0;\n margin: var(--salt-spacing-75) 0;\n font-family: var(--salt-text-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n}\n\n.saltMegaMenuListItem-wrapper:focus-visible {\n outline: var(--salt-focused-outline);\n outline-offset: calc(var(--salt-size-fixed-100) * -2);\n}\n\n.saltMegaMenuListItem-wrapper:hover:not(:focus-visible) {\n outline: none;\n background: var(--salt-overlayable-background-hover);\n}\n\n.saltMegaMenuListItem-wrapper:active {\n background: var(--salt-navigable-accent-background-active);\n}\n\n.saltMegaMenuListItem-wrapper:active::before {\n content: \"\";\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n border-radius: inherit;\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-navigable-accent-borderColor-active);\n pointer-events: none;\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=MegaMenuListItem.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuListItem.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,43 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer, renderProps } from '@salt-ds/core';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import { clsx } from 'clsx';
6
+ import { forwardRef, Children } from 'react';
7
+ import css_248z from './MegaMenuListItem.css.js';
8
+ import { useMegaMenu } from './useMegaMenu.js';
9
+
10
+ const withBaseName = makePrefixer("saltMegaMenuListItem");
11
+ function MegaMenuListItemAction(props) {
12
+ return renderProps("a", props);
13
+ }
14
+ const MegaMenuListItem = forwardRef(function MegaMenuListItem2({ children, className, onClick, render, href, current, ...rest }, ref) {
15
+ const targetWindow = useWindow();
16
+ const megaMenu = useMegaMenu();
17
+ useComponentCssInjection({
18
+ testId: "salt-mega-menu-list-item",
19
+ css: css_248z,
20
+ window: targetWindow
21
+ });
22
+ const handleClick = (event) => {
23
+ onClick == null ? void 0 : onClick(event);
24
+ megaMenu.setOpen(false);
25
+ };
26
+ return /* @__PURE__ */ jsx("li", { ref, className: clsx(withBaseName(), className), ...rest, children: /* @__PURE__ */ jsx(
27
+ MegaMenuListItemAction,
28
+ {
29
+ className: withBaseName("wrapper"),
30
+ href,
31
+ onClick: handleClick,
32
+ "aria-current": current ? "page" : void 0,
33
+ render,
34
+ children: Children.map(
35
+ children,
36
+ (child) => typeof child === "string" || typeof child === "number" ? /* @__PURE__ */ jsx("span", { className: withBaseName("content"), children: child }) : child
37
+ )
38
+ }
39
+ ) });
40
+ });
41
+
42
+ export { MegaMenuListItem };
43
+ //# sourceMappingURL=MegaMenuListItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuListItem.js","sources":["../src/mega-menu/MegaMenuListItem.tsx"],"sourcesContent":["import { makePrefixer, type RenderPropsType, renderProps } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n type ComponentPropsWithoutRef,\n forwardRef,\n type MouseEventHandler,\n type ReactNode,\n} from \"react\";\nimport megaMenuListItemCss from \"./MegaMenuListItem.css\";\nimport { useMegaMenu } from \"./useMegaMenu\";\n\nconst withBaseName = makePrefixer(\"saltMegaMenuListItem\");\n\n// biome-ignore lint/suspicious/noExplicitAny: We don't know the exact type here\nfunction MegaMenuListItemAction(props: ComponentPropsWithoutRef<any>) {\n return renderProps(\"a\", props);\n}\n\nexport interface MegaMenuListItemProps\n extends Omit<ComponentPropsWithoutRef<\"li\">, \"onClick\"> {\n /**\n * The content of the mega menu item.\n */\n children?: ReactNode;\n /**\n * Whether the item is the current page. Sets `aria-current=\"page\"`\n */\n current?: boolean;\n /**\n * Href passed to the link action element.\n */\n href?: string;\n /**\n * Called when the item's action is activated, before the menu closes.\n */\n onClick?: MouseEventHandler<HTMLAnchorElement>;\n /**\n * Render prop to enable customization of the underlying action element (e.g. a router `Link`).\n */\n render?: RenderPropsType[\"render\"];\n}\n\nexport const MegaMenuListItem = forwardRef<\n HTMLLIElement,\n MegaMenuListItemProps\n>(function MegaMenuListItem(\n { children, className, onClick, render, href, current, ...rest },\n ref,\n) {\n const targetWindow = useWindow();\n const megaMenu = useMegaMenu();\n\n useComponentCssInjection({\n testId: \"salt-mega-menu-list-item\",\n css: megaMenuListItemCss,\n window: targetWindow,\n });\n\n const handleClick: MouseEventHandler<HTMLAnchorElement> = (event) => {\n onClick?.(event);\n megaMenu.setOpen(false);\n };\n\n return (\n <li ref={ref} className={clsx(withBaseName(), className)} {...rest}>\n <MegaMenuListItemAction\n className={withBaseName(\"wrapper\")}\n href={href}\n onClick={handleClick}\n aria-current={current ? \"page\" : undefined}\n render={render}\n >\n {Children.map(children, (child) =>\n typeof child === \"string\" || typeof child === \"number\" ? (\n <span className={withBaseName(\"content\")}>{child}</span>\n ) : (\n child\n ),\n )}\n </MegaMenuListItemAction>\n </li>\n );\n});\n"],"names":["MegaMenuListItem","megaMenuListItemCss"],"mappings":";;;;;;;;;AAcA,MAAM,YAAA,GAAe,aAAa,sBAAsB,CAAA;AAGxD,SAAS,uBAAuB,KAAA,EAAsC;AACpE,EAAA,OAAO,WAAA,CAAY,KAAK,KAAK,CAAA;AAC/B;AA0BO,MAAM,gBAAA,GAAmB,UAAA,CAG9B,SAASA,iBAAAA,CACT,EAAE,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,GAAG,IAAA,IAC1D,GAAA,EACA;AACA,EAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,wBAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,0BAAA;AAAA,IACR,GAAA,EAAKC,QAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,WAAA,GAAoD,CAAC,KAAA,KAAU;AACnE,IAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AACV,IAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAG,GAAA,EAAU,SAAA,EAAW,IAAA,CAAK,cAAa,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC5D,QAAA,kBAAA,GAAA;AAAA,IAAC,sBAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,MACjC,IAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,cAAA,EAAc,UAAU,MAAA,GAAS,MAAA;AAAA,MACjC,MAAA;AAAA,MAEC,QAAA,EAAA,QAAA,CAAS,GAAA;AAAA,QAAI,QAAA;AAAA,QAAU,CAAC,KAAA,KACvB,OAAO,KAAA,KAAU,YAAY,OAAO,KAAA,KAAU,QAAA,mBAC5C,GAAA,CAAC,UAAK,SAAA,EAAW,YAAA,CAAa,SAAS,CAAA,EAAI,iBAAM,CAAA,GAEjD;AAAA;AAEJ;AAAA,GACF,EACF,CAAA;AAEJ,CAAC;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = ".saltMegaMenuPanel {\n display: flex;\n flex-wrap: wrap;\n inline-size: var(--saltMegaMenuPanel-inlineSize, fit-content);\n max-inline-size: var(--saltMegaMenuPanel-maxInlineSize, var(--saltMegaMenuPanel-availableWidth, calc(100vw - var(--salt-spacing-600))));\n max-height: 90%;\n overflow-x: hidden;\n overflow-y: auto;\n box-sizing: border-box;\n border-radius: var(--salt-palette-corner);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-container-primary-borderColor);\n background: var(--salt-container-primary-background);\n box-shadow: var(--salt-overlayable-shadow-popout);\n}\n";
1
+ var css_248z = ".saltMegaMenuPanel {\n /* Single horizontal row: optional side content, the center navigation area,\n optional side content. Position is derived from source order alone, so\n authors need no wrapper scaffolding. */\n --saltMegaMenuPanel-availableWidth: calc(100vw - var(--salt-spacing-600));\n display: flex;\n align-items: stretch;\n inline-size: var(--saltMegaMenuPanel-inlineSize, fit-content);\n max-inline-size: var(--saltMegaMenuPanel-maxInlineSize, var(--saltMegaMenuPanel-availableWidth));\n max-block-size: 90vh;\n overflow-x: hidden;\n overflow-y: auto;\n box-sizing: border-box;\n border-radius: var(--salt-palette-corner, 0);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-container-primary-borderColor);\n background: var(--salt-container-primary-background);\n box-shadow: var(--salt-overlayable-shadow-modal);\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=MegaMenuPanel.css.js.map
@@ -1,12 +1,14 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { offset, flip, shift, limitShift, size } from '@floating-ui/react';
3
- import { makePrefixer, useFloatingComponent, useId, useFloatingUI } from '@salt-ds/core';
2
+ import { offset, flip, shift, limitShift } from '@floating-ui/react';
3
+ import { makePrefixer, useFloatingComponent, useId, useIsomorphicLayoutEffect, useFloatingUI, useForkRef } from '@salt-ds/core';
4
4
  import { useComponentCssInjection } from '@salt-ds/styles';
5
5
  import { useWindow } from '@salt-ds/window';
6
6
  import { clsx } from 'clsx';
7
- import { forwardRef, useEffect, useState } from 'react';
7
+ import { forwardRef, useEffect } from 'react';
8
8
  import css_248z from './MegaMenuPanel.css.js';
9
9
  import { useMegaMenu } from './useMegaMenu.js';
10
+ import { focusFirstItem } from './useMegaMenuNavigation.js';
11
+ import { usePageMargin } from './usePageMargin.js';
10
12
 
11
13
  const withBaseName = makePrefixer("saltMegaMenuPanel");
12
14
  const MegaMenuPanel = forwardRef(
@@ -24,51 +26,36 @@ const MegaMenuPanel = forwardRef(
24
26
  placement,
25
27
  getFloatingProps,
26
28
  setFloating,
27
- focusFirstItemOnOpen,
29
+ focusFirstItemOnOpenRef,
28
30
  setPanelId
29
31
  } = useMegaMenu();
30
32
  const id = useId(idProp);
31
- useEffect(() => {
32
- setPanelId(id);
33
- return () => setPanelId(void 0);
33
+ useIsomorphicLayoutEffect(() => {
34
+ if (id) setPanelId(id);
34
35
  }, [id, setPanelId]);
35
- const [pageMargin, setPageMargin] = useState(0);
36
- useEffect(() => {
37
- if (!targetWindow) return;
38
- const referenceEl = floatingRootContext.elements.domReference;
39
- const host = referenceEl ?? targetWindow.document.body;
40
- const doc = targetWindow.document;
41
- const measure = () => {
42
- const probe = doc.createElement("div");
43
- probe.style.cssText = "position:absolute;visibility:hidden;pointer-events:none;width:var(--saltMegaMenuPanel-pageMargin, var(--salt-layout-page-margin));";
44
- host.appendChild(probe);
45
- const width = probe.getBoundingClientRect().width;
46
- probe.remove();
47
- setPageMargin((prev) => prev === width ? prev : width);
48
- };
49
- measure();
50
- targetWindow.addEventListener("resize", measure);
51
- return () => targetWindow.removeEventListener("resize", measure);
52
- }, [targetWindow, floatingRootContext]);
36
+ const { domReference } = floatingRootContext.elements;
37
+ const referenceEl = domReference instanceof HTMLElement ? domReference : null;
38
+ const pageMargin = usePageMargin(referenceEl);
53
39
  const floatingUIResult = useFloatingUI({
54
40
  rootContext: floatingRootContext,
41
+ open: isOpen,
55
42
  placement,
56
43
  middleware: [
57
44
  offset(1),
58
45
  flip({ padding: pageMargin }),
59
- shift({ padding: pageMargin, limiter: limitShift() }),
60
- size({
61
- padding: pageMargin,
62
- apply({ availableWidth, elements }) {
63
- elements.floating.style.setProperty(
64
- "--saltMegaMenuPanel-availableWidth",
65
- `${availableWidth}px`
66
- );
67
- }
68
- })
46
+ shift({ padding: pageMargin, limiter: limitShift() })
69
47
  ]
70
48
  });
71
- const floatingProps = getFloatingProps();
49
+ const floatingEl = floatingRootContext.elements.floating;
50
+ const { isPositioned } = floatingUIResult;
51
+ useEffect(() => {
52
+ if (focusFirstItemOnOpenRef.current && isPositioned && floatingEl) {
53
+ focusFirstItem(floatingEl);
54
+ focusFirstItemOnOpenRef.current = false;
55
+ }
56
+ }, [focusFirstItemOnOpenRef, isPositioned, floatingEl]);
57
+ const floatingProps = getFloatingProps(rest);
58
+ const handleRef = useForkRef(setFloating, ref);
72
59
  return /* @__PURE__ */ jsx(
73
60
  FloatingComponent,
74
61
  {
@@ -79,24 +66,17 @@ const MegaMenuPanel = forwardRef(
79
66
  focusManagerProps: {
80
67
  context: floatingUIResult.context,
81
68
  modal: false,
82
- initialFocus: focusFirstItemOnOpen ? 0 : -1,
69
+ initialFocus: -1,
83
70
  returnFocus: true,
84
71
  closeOnFocusOut: false,
85
72
  guards: false
86
73
  },
87
- ref: setFloating,
88
- children: /* @__PURE__ */ jsx(
89
- "div",
90
- {
91
- className: clsx(withBaseName(), className),
92
- id,
93
- role: "region",
94
- ref,
95
- ...floatingProps,
96
- ...rest,
97
- children
98
- }
99
- )
74
+ className: clsx(withBaseName(), className),
75
+ id,
76
+ role: "region",
77
+ ...floatingProps,
78
+ ref: handleRef,
79
+ children
100
80
  }
101
81
  );
102
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MegaMenuPanel.js","sources":["../src/mega-menu/MegaMenuPanel.tsx"],"sourcesContent":["import { flip, limitShift, offset, shift, size } from \"@floating-ui/react\";\nimport {\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useId,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n useEffect,\n useState,\n} from \"react\";\nimport megaMenuPanelCss from \"./MegaMenuPanel.css\";\nimport { useMegaMenu } from \"./useMegaMenu\";\n\nconst withBaseName = makePrefixer(\"saltMegaMenuPanel\");\n\nexport interface MegaMenuPanelProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The content of the mega menu panel.\n */\n children?: ReactNode;\n}\n\nexport const MegaMenuPanel = forwardRef<HTMLDivElement, MegaMenuPanelProps>(\n function MegaMenuPanel({ children, className, id: idProp, ...rest }, ref) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-mega-menu-panel\",\n css: megaMenuPanelCss,\n window: targetWindow,\n });\n\n const { Component: FloatingComponent } = useFloatingComponent();\n const {\n openState: isOpen,\n floatingRootContext,\n placement,\n getFloatingProps,\n setFloating,\n focusFirstItemOnOpen,\n setPanelId,\n } = useMegaMenu();\n\n const id = useId(idProp);\n\n // Register the panel id in context so the trigger can reference it via aria-controls.\n useEffect(() => {\n setPanelId(id);\n return () => setPanelId(undefined);\n }, [id, setPanelId]);\n\n // Resolve the panel's page-margin to a pixel value to override the margin as required.\n const [pageMargin, setPageMargin] = useState(0);\n useEffect(() => {\n if (!targetWindow) return;\n const referenceEl = floatingRootContext.elements.domReference as\n | HTMLElement\n | null\n | undefined;\n const host = referenceEl ?? targetWindow.document.body;\n const doc = targetWindow.document;\n const measure = () => {\n const probe = doc.createElement(\"div\");\n probe.style.cssText =\n \"position:absolute;visibility:hidden;pointer-events:none;width:var(--saltMegaMenuPanel-pageMargin, var(--salt-layout-page-margin));\";\n host.appendChild(probe);\n const width = probe.getBoundingClientRect().width;\n probe.remove();\n setPageMargin((prev) => (prev === width ? prev : width));\n };\n measure();\n targetWindow.addEventListener(\"resize\", measure);\n return () => targetWindow.removeEventListener(\"resize\", measure);\n }, [targetWindow, floatingRootContext]);\n\n const floatingUIResult = useFloatingUI({\n rootContext: floatingRootContext,\n placement,\n middleware: [\n offset(1),\n flip({ padding: pageMargin }),\n shift({ padding: pageMargin, limiter: limitShift() }),\n size({\n padding: pageMargin,\n apply({ availableWidth, elements }) {\n elements.floating.style.setProperty(\n \"--saltMegaMenuPanel-availableWidth\",\n `${availableWidth}px`,\n );\n },\n }),\n ],\n });\n\n const floatingProps = getFloatingProps();\n\n return (\n <FloatingComponent\n open={isOpen}\n position={floatingUIResult.strategy}\n top={floatingUIResult.y ?? 0}\n left={floatingUIResult.x ?? 0}\n focusManagerProps={{\n context: floatingUIResult.context,\n modal: false,\n initialFocus: focusFirstItemOnOpen ? 0 : -1,\n returnFocus: true,\n closeOnFocusOut: false,\n guards: false,\n }}\n ref={setFloating}\n >\n <div\n className={clsx(withBaseName(), className)}\n id={id}\n role=\"region\"\n ref={ref}\n {...floatingProps}\n {...rest}\n >\n {children}\n </div>\n </FloatingComponent>\n );\n },\n);\n"],"names":["MegaMenuPanel","megaMenuPanelCss"],"mappings":"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"}
1
+ {"version":3,"file":"MegaMenuPanel.js","sources":["../src/mega-menu/MegaMenuPanel.tsx"],"sourcesContent":["import { flip, limitShift, offset, shift } from \"@floating-ui/react\";\nimport {\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useId,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n useEffect,\n} from \"react\";\nimport megaMenuPanelCss from \"./MegaMenuPanel.css\";\nimport { useMegaMenu } from \"./useMegaMenu\";\nimport { focusFirstItem } from \"./useMegaMenuNavigation\";\nimport { usePageMargin } from \"./usePageMargin\";\n\nconst withBaseName = makePrefixer(\"saltMegaMenuPanel\");\n\nexport interface MegaMenuPanelProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * The content of the mega menu panel.\n */\n children?: ReactNode;\n}\n\nexport const MegaMenuPanel = forwardRef<HTMLDivElement, MegaMenuPanelProps>(\n function MegaMenuPanel({ children, className, id: idProp, ...rest }, ref) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-mega-menu-panel\",\n css: megaMenuPanelCss,\n window: targetWindow,\n });\n\n const { Component: FloatingComponent } = useFloatingComponent();\n const {\n openState: isOpen,\n floatingRootContext,\n placement,\n getFloatingProps,\n setFloating,\n focusFirstItemOnOpenRef,\n setPanelId,\n } = useMegaMenu();\n\n const id = useId(idProp);\n\n // Register the panel's id so the trigger's aria-controls stays in sync.\n useIsomorphicLayoutEffect(() => {\n if (id) setPanelId(id);\n }, [id, setPanelId]);\n\n const { domReference } = floatingRootContext.elements;\n const referenceEl =\n domReference instanceof HTMLElement ? domReference : null;\n const pageMargin = usePageMargin(referenceEl);\n\n const floatingUIResult = useFloatingUI({\n rootContext: floatingRootContext,\n open: isOpen,\n placement,\n middleware: [\n offset(1),\n flip({ padding: pageMargin }),\n shift({ padding: pageMargin, limiter: limitShift() }),\n ],\n });\n\n // Focus the first item on ArrowDown open, after floating-ui has positioned the panel\n const floatingEl = floatingRootContext.elements.floating;\n const { isPositioned } = floatingUIResult;\n useEffect(() => {\n if (focusFirstItemOnOpenRef.current && isPositioned && floatingEl) {\n focusFirstItem(floatingEl);\n focusFirstItemOnOpenRef.current = false;\n }\n }, [focusFirstItemOnOpenRef, isPositioned, floatingEl]);\n\n const floatingProps = getFloatingProps(rest);\n const handleRef = useForkRef<HTMLDivElement>(setFloating, ref);\n\n return (\n <FloatingComponent\n open={isOpen}\n position={floatingUIResult.strategy}\n top={floatingUIResult.y ?? 0}\n left={floatingUIResult.x ?? 0}\n focusManagerProps={{\n context: floatingUIResult.context,\n modal: false,\n initialFocus: -1,\n returnFocus: true,\n closeOnFocusOut: false,\n guards: false,\n }}\n className={clsx(withBaseName(), className)}\n id={id}\n role=\"region\"\n {...floatingProps}\n ref={handleRef}\n >\n {children}\n </FloatingComponent>\n );\n },\n);\n"],"names":["MegaMenuPanel","megaMenuPanelCss"],"mappings":";;;;;;;;;;;;AAuBA,MAAM,YAAA,GAAe,aAAa,mBAAmB,CAAA;AAS9C,MAAM,aAAA,GAAgB,UAAA;AAAA,EAC3B,SAASA,cAAAA,CAAc,EAAE,QAAA,EAAU,SAAA,EAAW,IAAI,MAAA,EAAQ,GAAG,IAAA,EAAK,EAAG,GAAA,EAAK;AACxE,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,EAAE,SAAA,EAAW,iBAAA,EAAkB,GAAI,oBAAA,EAAqB;AAC9D,IAAA,MAAM;AAAA,MACJ,SAAA,EAAW,MAAA;AAAA,MACX,mBAAA;AAAA,MACA,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,WAAA;AAAA,MACA,uBAAA;AAAA,MACA;AAAA,QACE,WAAA,EAAY;AAEhB,IAAA,MAAM,EAAA,GAAK,MAAM,MAAM,CAAA;AAGvB,IAAA,yBAAA,CAA0B,MAAM;AAC9B,MAAA,IAAI,EAAA,aAAe,EAAE,CAAA;AAAA,IACvB,CAAA,EAAG,CAAC,EAAA,EAAI,UAAU,CAAC,CAAA;AAEnB,IAAA,MAAM,EAAE,YAAA,EAAa,GAAI,mBAAA,CAAoB,QAAA;AAC7C,IAAA,MAAM,WAAA,GACJ,YAAA,YAAwB,WAAA,GAAc,YAAA,GAAe,IAAA;AACvD,IAAA,MAAM,UAAA,GAAa,cAAc,WAAW,CAAA;AAE5C,IAAA,MAAM,mBAAmB,aAAA,CAAc;AAAA,MACrC,WAAA,EAAa,mBAAA;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,SAAA;AAAA,MACA,UAAA,EAAY;AAAA,QACV,OAAO,CAAC,CAAA;AAAA,QACR,IAAA,CAAK,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,QAC5B,MAAM,EAAE,OAAA,EAAS,YAAY,OAAA,EAAS,UAAA,IAAc;AAAA;AACtD,KACD,CAAA;AAGD,IAAA,MAAM,UAAA,GAAa,oBAAoB,QAAA,CAAS,QAAA;AAChD,IAAA,MAAM,EAAE,cAAa,GAAI,gBAAA;AACzB,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,uBAAA,CAAwB,OAAA,IAAW,YAAA,IAAgB,UAAA,EAAY;AACjE,QAAA,cAAA,CAAe,UAAU,CAAA;AACzB,QAAA,uBAAA,CAAwB,OAAA,GAAU,KAAA;AAAA,MACpC;AAAA,IACF,CAAA,EAAG,CAAC,uBAAA,EAAyB,YAAA,EAAc,UAAU,CAAC,CAAA;AAEtD,IAAA,MAAM,aAAA,GAAgB,iBAAiB,IAAI,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAY,UAAA,CAA2B,WAAA,EAAa,GAAG,CAAA;AAE7D,IAAA,uBACE,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,MAAA;AAAA,QACN,UAAU,gBAAA,CAAiB,QAAA;AAAA,QAC3B,GAAA,EAAK,iBAAiB,CAAA,IAAK,CAAA;AAAA,QAC3B,IAAA,EAAM,iBAAiB,CAAA,IAAK,CAAA;AAAA,QAC5B,iBAAA,EAAmB;AAAA,UACjB,SAAS,gBAAA,CAAiB,OAAA;AAAA,UAC1B,KAAA,EAAO,KAAA;AAAA,UACP,YAAA,EAAc,EAAA;AAAA,UACd,WAAA,EAAa,IAAA;AAAA,UACb,eAAA,EAAiB,KAAA;AAAA,UACjB,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,EAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACJ,GAAG,aAAA;AAAA,QACJ,GAAA,EAAK,SAAA;AAAA,QAEJ;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
@@ -2,7 +2,7 @@ import { jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { useForkRef, getRefFromChildren, mergeProps, NavigationItem } from '@salt-ds/core';
3
3
  import { forwardRef, useCallback, isValidElement, cloneElement } from 'react';
4
4
  import { useMegaMenu } from './useMegaMenu.js';
5
- import { focusFirstItem, FOCUSABLE_SELECTOR } from './useMegaMenuKeyboard.js';
5
+ import { focusFirstItem, FOCUSABLE_SELECTOR } from './useMegaMenuNavigation.js';
6
6
 
7
7
  function getAdjacentTrigger(currentTarget, direction) {
8
8
  const li = currentTarget.closest("li");
@@ -13,14 +13,14 @@ function getAdjacentTrigger(currentTarget, direction) {
13
13
  }
14
14
  const MegaMenuTrigger = forwardRef(
15
15
  function MegaMenuTrigger2(props, ref) {
16
- const { children, ...rest } = props;
16
+ const { children } = props;
17
17
  const megaMenu = useMegaMenu();
18
18
  const {
19
19
  getReferenceProps,
20
20
  setReference,
21
21
  setOpen,
22
22
  openState,
23
- setFocusFirstItemOnOpen,
23
+ focusFirstItemOnOpenRef,
24
24
  floatingRootContext,
25
25
  panelId
26
26
  } = megaMenu;
@@ -33,7 +33,7 @@ const MegaMenuTrigger = forwardRef(
33
33
  const adjacent = getAdjacentTrigger(event.currentTarget, direction);
34
34
  if (adjacent) {
35
35
  if (openState) setOpen(false);
36
- setFocusFirstItemOnOpen(false);
36
+ focusFirstItemOnOpenRef.current = false;
37
37
  adjacent.focus();
38
38
  }
39
39
  return;
@@ -44,19 +44,19 @@ const MegaMenuTrigger = forwardRef(
44
44
  if (floating) focusFirstItem(floating);
45
45
  return;
46
46
  }
47
+ if (openState && key === "Tab" && shiftKey) {
48
+ focusFirstItemOnOpenRef.current = false;
49
+ setOpen(false);
50
+ return;
51
+ }
47
52
  if (!openState && key === "ArrowDown") {
48
53
  event.preventDefault();
49
- setFocusFirstItemOnOpen(true);
54
+ focusFirstItemOnOpenRef.current = true;
50
55
  setOpen(true);
51
56
  return;
52
57
  }
53
58
  },
54
- [
55
- openState,
56
- setOpen,
57
- setFocusFirstItemOnOpen,
58
- floatingRootContext.elements.floating
59
- ]
59
+ [openState, setOpen, floatingRootContext.elements.floating]
60
60
  );
61
61
  const handleFloatingRef = useForkRef(
62
62
  getRefFromChildren(children),
@@ -72,12 +72,10 @@ const MegaMenuTrigger = forwardRef(
72
72
  return cloneElement(children, {
73
73
  ...mergeProps(
74
74
  getReferenceProps({
75
- // For NavigationItem, sync via the `expanded` prop (which maps to aria-expanded internally).
76
- // For all other elements, set aria-expanded directly.
75
+ // NavigationItem maps `expanded` to aria-expanded; others get it directly.
77
76
  ...shouldSyncExpanded ? { expanded: openState } : { "aria-expanded": openState },
78
- ...panelId && openState ? { "aria-controls": panelId } : null,
79
- onKeyDown: handleKeyDown,
80
- ...rest
77
+ ...openState ? { "aria-controls": panelId } : null,
78
+ onKeyDown: handleKeyDown
81
79
  }),
82
80
  children.props
83
81
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"MegaMenuTrigger.js","sources":["../src/mega-menu/MegaMenuTrigger.tsx"],"sourcesContent":["import {\n getRefFromChildren,\n mergeProps,\n NavigationItem,\n useForkRef,\n} from \"@salt-ds/core\";\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n useCallback,\n} from \"react\";\nimport { useMegaMenu } from \"./useMegaMenu\";\nimport { FOCUSABLE_SELECTOR, focusFirstItem } from \"./useMegaMenuKeyboard\";\n\nexport interface MegaMenuTriggerProps {\n /**\n * The trigger element for the mega menu, typically a `NavigationItem` or `Button`.\n */\n children?: ReactNode;\n}\n\nfunction getAdjacentTrigger(\n currentTarget: HTMLElement,\n direction: \"next\" | \"previous\",\n): HTMLElement | null {\n const li = currentTarget.closest(\"li\");\n if (!li) return null;\n const sibling =\n direction === \"next\" ? li.nextElementSibling : li.previousElementSibling;\n if (!(sibling instanceof HTMLElement)) return null;\n return sibling.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n}\n\nexport const MegaMenuTrigger = forwardRef<HTMLElement, MegaMenuTriggerProps>(\n function MegaMenuTrigger(props, ref) {\n const { children, ...rest } = props;\n const megaMenu = useMegaMenu();\n\n const {\n getReferenceProps,\n setReference,\n setOpen,\n openState,\n setFocusFirstItemOnOpen,\n floatingRootContext,\n panelId,\n } = megaMenu;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const { key, shiftKey } = event;\n\n // ArrowLeft/Right: move to adjacent trigger in nav bar\n if (key === \"ArrowRight\" || key === \"ArrowLeft\") {\n event.preventDefault();\n const direction = key === \"ArrowRight\" ? \"next\" : \"previous\";\n const adjacent = getAdjacentTrigger(event.currentTarget, direction);\n if (adjacent) {\n if (openState) setOpen(false);\n setFocusFirstItemOnOpen(false);\n adjacent.focus();\n }\n return;\n }\n\n // When menu is open: ArrowDown or Tab moves focus into the menu\n if (\n openState &&\n (key === \"ArrowDown\" || (key === \"Tab\" && !shiftKey))\n ) {\n event.preventDefault();\n const floating = floatingRootContext.elements\n .floating as HTMLElement | null;\n if (floating) focusFirstItem(floating);\n return;\n }\n\n // When menu is closed: ArrowDown opens and focuses first item\n if (!openState && key === \"ArrowDown\") {\n event.preventDefault();\n setFocusFirstItemOnOpen(true);\n setOpen(true);\n return;\n }\n },\n [\n openState,\n setOpen,\n setFocusFirstItemOnOpen,\n floatingRootContext.elements.floating,\n ],\n );\n\n const handleFloatingRef = useForkRef(\n getRefFromChildren(children),\n setReference,\n );\n const handleRef = useForkRef(handleFloatingRef, ref);\n\n if (!children || !isValidElement<{ ref?: Ref<unknown> }>(children)) {\n return <>{children}</>;\n }\n\n const childProps = children.props as Record<string, unknown>;\n const isNavigationItemChild = children.type === NavigationItem;\n const shouldSyncExpanded =\n isNavigationItemChild || childProps.expanded !== undefined;\n\n return cloneElement(children, {\n ...mergeProps(\n getReferenceProps({\n // For NavigationItem, sync via the `expanded` prop (which maps to aria-expanded internally).\n // For all other elements, set aria-expanded directly.\n ...(shouldSyncExpanded\n ? { expanded: openState }\n : { \"aria-expanded\": openState }),\n ...(panelId && openState ? { \"aria-controls\": panelId } : null),\n onKeyDown: handleKeyDown,\n ...rest,\n }),\n children.props,\n ),\n ref: handleRef,\n });\n },\n);\n"],"names":["MegaMenuTrigger"],"mappings":";;;;;;AAyBA,SAAS,kBAAA,CACP,eACA,SAAA,EACoB;AACpB,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAA;AACrC,EAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,EAAA,MAAM,OAAA,GACJ,SAAA,KAAc,MAAA,GAAS,EAAA,CAAG,qBAAqB,EAAA,CAAG,sBAAA;AACpD,EAAA,IAAI,EAAE,OAAA,YAAmB,WAAA,CAAA,EAAc,OAAO,IAAA;AAC9C,EAAA,OAAO,OAAA,CAAQ,cAA2B,kBAAkB,CAAA;AAC9D;AAEO,MAAM,eAAA,GAAkB,UAAA;AAAA,EAC7B,SAASA,gBAAAA,CAAgB,KAAA,EAAO,GAAA,EAAK;AACnC,IAAA,MAAM,EAAE,QAAA,EAAU,GAAG,IAAA,EAAK,GAAI,KAAA;AAC9B,IAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,IAAA,MAAM;AAAA,MACJ,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,uBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF,GAAI,QAAA;AAEJ,IAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,MACpB,CAAC,KAAA,KAAsC;AACrC,QAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAS,GAAI,KAAA;AAG1B,QAAA,IAAI,GAAA,KAAQ,YAAA,IAAgB,GAAA,KAAQ,WAAA,EAAa;AAC/C,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAM,SAAA,GAAY,GAAA,KAAQ,YAAA,GAAe,MAAA,GAAS,UAAA;AAClD,UAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,KAAA,CAAM,aAAA,EAAe,SAAS,CAAA;AAClE,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAI,SAAA,UAAmB,KAAK,CAAA;AAC5B,YAAA,uBAAA,CAAwB,KAAK,CAAA;AAC7B,YAAA,QAAA,CAAS,KAAA,EAAM;AAAA,UACjB;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IACE,cACC,GAAA,KAAQ,WAAA,IAAgB,GAAA,KAAQ,KAAA,IAAS,CAAC,QAAA,CAAA,EAC3C;AACA,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAM,QAAA,GAAW,oBAAoB,QAAA,CAClC,QAAA;AACH,UAAA,IAAI,QAAA,iBAAyB,QAAQ,CAAA;AACrC,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,SAAA,IAAa,GAAA,KAAQ,WAAA,EAAa;AACrC,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,UAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,UAAA;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA;AAAA,QACE,SAAA;AAAA,QACA,OAAA;AAAA,QACA,uBAAA;AAAA,QACA,oBAAoB,QAAA,CAAS;AAAA;AAC/B,KACF;AAEA,IAAA,MAAM,iBAAA,GAAoB,UAAA;AAAA,MACxB,mBAAmB,QAAQ,CAAA;AAAA,MAC3B;AAAA,KACF;AACA,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,iBAAA,EAAmB,GAAG,CAAA;AAEnD,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,cAAA,CAAuC,QAAQ,CAAA,EAAG;AAClE,MAAA,uCAAU,QAAA,EAAS,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,aAAa,QAAA,CAAS,KAAA;AAC5B,IAAA,MAAM,qBAAA,GAAwB,SAAS,IAAA,KAAS,cAAA;AAChD,IAAA,MAAM,kBAAA,GACJ,qBAAA,IAAyB,UAAA,CAAW,QAAA,KAAa,MAAA;AAEnD,IAAA,OAAO,aAAa,QAAA,EAAU;AAAA,MAC5B,GAAG,UAAA;AAAA,QACD,iBAAA,CAAkB;AAAA;AAAA;AAAA,UAGhB,GAAI,qBACA,EAAE,QAAA,EAAU,WAAU,GACtB,EAAE,iBAAiB,SAAA,EAAU;AAAA,UACjC,GAAI,OAAA,IAAW,SAAA,GAAY,EAAE,eAAA,EAAiB,SAAQ,GAAI,IAAA;AAAA,UAC1D,SAAA,EAAW,aAAA;AAAA,UACX,GAAG;AAAA,SACJ,CAAA;AAAA,QACD,QAAA,CAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACH;AACF;;;;"}
1
+ {"version":3,"file":"MegaMenuTrigger.js","sources":["../src/mega-menu/MegaMenuTrigger.tsx"],"sourcesContent":["import {\n getRefFromChildren,\n mergeProps,\n NavigationItem,\n useForkRef,\n} from \"@salt-ds/core\";\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n useCallback,\n} from \"react\";\nimport { useMegaMenu } from \"./useMegaMenu\";\nimport { FOCUSABLE_SELECTOR, focusFirstItem } from \"./useMegaMenuNavigation\";\n\nexport interface MegaMenuTriggerProps {\n /**\n * The trigger element for the mega menu, typically a `NavigationItem` or `Button`.\n * Wrap each mega menu in its own `<li>` — arrow-key navigation between triggers depends on it.\n */\n children?: ReactNode;\n}\n\nfunction getAdjacentTrigger(\n currentTarget: HTMLElement,\n direction: \"next\" | \"previous\",\n): HTMLElement | null {\n const li = currentTarget.closest(\"li\");\n if (!li) return null;\n const sibling =\n direction === \"next\" ? li.nextElementSibling : li.previousElementSibling;\n if (!(sibling instanceof HTMLElement)) return null;\n return sibling.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n}\n\nexport const MegaMenuTrigger = forwardRef<HTMLElement, MegaMenuTriggerProps>(\n function MegaMenuTrigger(props, ref) {\n const { children } = props;\n const megaMenu = useMegaMenu();\n\n const {\n getReferenceProps,\n setReference,\n setOpen,\n openState,\n focusFirstItemOnOpenRef,\n floatingRootContext,\n panelId,\n } = megaMenu;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const { key, shiftKey } = event;\n\n // ArrowLeft/Right: move to adjacent trigger in nav bar\n if (key === \"ArrowRight\" || key === \"ArrowLeft\") {\n event.preventDefault();\n const direction = key === \"ArrowRight\" ? \"next\" : \"previous\";\n const adjacent = getAdjacentTrigger(event.currentTarget, direction);\n if (adjacent) {\n if (openState) setOpen(false);\n focusFirstItemOnOpenRef.current = false;\n adjacent.focus();\n }\n return;\n }\n\n // When menu is open: ArrowDown or Tab moves focus into the menu\n if (\n openState &&\n (key === \"ArrowDown\" || (key === \"Tab\" && !shiftKey))\n ) {\n event.preventDefault();\n const floating = floatingRootContext.elements\n .floating as HTMLElement | null;\n if (floating) focusFirstItem(floating);\n return;\n }\n\n // When menu is open: Shift+Tab mirrors arrow left\n if (openState && key === \"Tab\" && shiftKey) {\n focusFirstItemOnOpenRef.current = false;\n setOpen(false);\n return;\n }\n\n // When menu is closed: ArrowDown opens and focuses first item\n if (!openState && key === \"ArrowDown\") {\n event.preventDefault();\n focusFirstItemOnOpenRef.current = true;\n setOpen(true);\n return;\n }\n },\n [openState, setOpen, floatingRootContext.elements.floating],\n );\n\n const handleFloatingRef = useForkRef(\n getRefFromChildren(children),\n setReference,\n );\n const handleRef = useForkRef(handleFloatingRef, ref);\n\n if (!children || !isValidElement<{ ref?: Ref<unknown> }>(children)) {\n return <>{children}</>;\n }\n\n const childProps = children.props as Record<string, unknown>;\n const isNavigationItemChild = children.type === NavigationItem;\n const shouldSyncExpanded =\n isNavigationItemChild || childProps.expanded !== undefined;\n\n return cloneElement(children, {\n ...mergeProps(\n getReferenceProps({\n // NavigationItem maps `expanded` to aria-expanded; others get it directly.\n ...(shouldSyncExpanded\n ? { expanded: openState }\n : { \"aria-expanded\": openState }),\n ...(openState ? { \"aria-controls\": panelId } : null),\n onKeyDown: handleKeyDown,\n }),\n children.props,\n ),\n ref: handleRef,\n });\n },\n);\n"],"names":["MegaMenuTrigger"],"mappings":"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"}