@salt-ds/core 1.65.1 → 1.66.0

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 (125) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/css/salt-core.css +143 -1
  3. package/dist-cjs/index.js +22 -0
  4. package/dist-cjs/index.js.map +1 -1
  5. package/dist-cjs/mega-menu/MegaMenu.js +81 -0
  6. package/dist-cjs/mega-menu/MegaMenu.js.map +1 -0
  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 +37 -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 +37 -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 +29 -0
  18. package/dist-cjs/mega-menu/MegaMenuContent.js.map +1 -0
  19. package/dist-cjs/mega-menu/MegaMenuContext.js +18 -0
  20. package/dist-cjs/mega-menu/MegaMenuContext.js.map +1 -0
  21. package/dist-cjs/mega-menu/MegaMenuGroup.css.js +6 -0
  22. package/dist-cjs/mega-menu/MegaMenuGroup.css.js.map +1 -0
  23. package/dist-cjs/mega-menu/MegaMenuGroup.js +44 -0
  24. package/dist-cjs/mega-menu/MegaMenuGroup.js.map +1 -0
  25. package/dist-cjs/mega-menu/MegaMenuGroupContext.js +23 -0
  26. package/dist-cjs/mega-menu/MegaMenuGroupContext.js.map +1 -0
  27. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js +6 -0
  28. package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js.map +1 -0
  29. package/dist-cjs/mega-menu/MegaMenuGroupHeading.js +44 -0
  30. package/dist-cjs/mega-menu/MegaMenuGroupHeading.js.map +1 -0
  31. package/dist-cjs/mega-menu/MegaMenuGroups.css.js +6 -0
  32. package/dist-cjs/mega-menu/MegaMenuGroups.css.js.map +1 -0
  33. package/dist-cjs/mega-menu/MegaMenuGroups.js +29 -0
  34. package/dist-cjs/mega-menu/MegaMenuGroups.js.map +1 -0
  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 +47 -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 +50 -0
  42. package/dist-cjs/mega-menu/MegaMenuListItem.js.map +1 -0
  43. package/dist-cjs/mega-menu/MegaMenuPanel.css.js +6 -0
  44. package/dist-cjs/mega-menu/MegaMenuPanel.css.js.map +1 -0
  45. package/dist-cjs/mega-menu/MegaMenuPanel.js +94 -0
  46. package/dist-cjs/mega-menu/MegaMenuPanel.js.map +1 -0
  47. package/dist-cjs/mega-menu/MegaMenuTrigger.js +97 -0
  48. package/dist-cjs/mega-menu/MegaMenuTrigger.js.map +1 -0
  49. package/dist-cjs/mega-menu/useMegaMenu.js +15 -0
  50. package/dist-cjs/mega-menu/useMegaMenu.js.map +1 -0
  51. package/dist-cjs/mega-menu/useMegaMenuNavigation.js +282 -0
  52. package/dist-cjs/mega-menu/useMegaMenuNavigation.js.map +1 -0
  53. package/dist-cjs/mega-menu/usePageMargin.js +28 -0
  54. package/dist-cjs/mega-menu/usePageMargin.js.map +1 -0
  55. package/dist-es/index.js +11 -0
  56. package/dist-es/index.js.map +1 -1
  57. package/dist-es/mega-menu/MegaMenu.js +79 -0
  58. package/dist-es/mega-menu/MegaMenu.js.map +1 -0
  59. package/dist-es/mega-menu/MegaMenuActions.css.js +4 -0
  60. package/dist-es/mega-menu/MegaMenuActions.css.js.map +1 -0
  61. package/dist-es/mega-menu/MegaMenuActions.js +35 -0
  62. package/dist-es/mega-menu/MegaMenuActions.js.map +1 -0
  63. package/dist-es/mega-menu/MegaMenuAside.css.js +4 -0
  64. package/dist-es/mega-menu/MegaMenuAside.css.js.map +1 -0
  65. package/dist-es/mega-menu/MegaMenuAside.js +35 -0
  66. package/dist-es/mega-menu/MegaMenuAside.js.map +1 -0
  67. package/dist-es/mega-menu/MegaMenuContent.css.js +4 -0
  68. package/dist-es/mega-menu/MegaMenuContent.css.js.map +1 -0
  69. package/dist-es/mega-menu/MegaMenuContent.js +27 -0
  70. package/dist-es/mega-menu/MegaMenuContent.js.map +1 -0
  71. package/dist-es/mega-menu/MegaMenuContext.js +16 -0
  72. package/dist-es/mega-menu/MegaMenuContext.js.map +1 -0
  73. package/dist-es/mega-menu/MegaMenuGroup.css.js +4 -0
  74. package/dist-es/mega-menu/MegaMenuGroup.css.js.map +1 -0
  75. package/dist-es/mega-menu/MegaMenuGroup.js +42 -0
  76. package/dist-es/mega-menu/MegaMenuGroup.js.map +1 -0
  77. package/dist-es/mega-menu/MegaMenuGroupContext.js +20 -0
  78. package/dist-es/mega-menu/MegaMenuGroupContext.js.map +1 -0
  79. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js +4 -0
  80. package/dist-es/mega-menu/MegaMenuGroupHeading.css.js.map +1 -0
  81. package/dist-es/mega-menu/MegaMenuGroupHeading.js +42 -0
  82. package/dist-es/mega-menu/MegaMenuGroupHeading.js.map +1 -0
  83. package/dist-es/mega-menu/MegaMenuGroups.css.js +4 -0
  84. package/dist-es/mega-menu/MegaMenuGroups.css.js.map +1 -0
  85. package/dist-es/mega-menu/MegaMenuGroups.js +27 -0
  86. package/dist-es/mega-menu/MegaMenuGroups.js.map +1 -0
  87. package/dist-es/mega-menu/MegaMenuList.css.js +4 -0
  88. package/dist-es/mega-menu/MegaMenuList.css.js.map +1 -0
  89. package/dist-es/mega-menu/MegaMenuList.js +45 -0
  90. package/dist-es/mega-menu/MegaMenuList.js.map +1 -0
  91. package/dist-es/mega-menu/MegaMenuListItem.css.js +4 -0
  92. package/dist-es/mega-menu/MegaMenuListItem.css.js.map +1 -0
  93. package/dist-es/mega-menu/MegaMenuListItem.js +48 -0
  94. package/dist-es/mega-menu/MegaMenuListItem.js.map +1 -0
  95. package/dist-es/mega-menu/MegaMenuPanel.css.js +4 -0
  96. package/dist-es/mega-menu/MegaMenuPanel.css.js.map +1 -0
  97. package/dist-es/mega-menu/MegaMenuPanel.js +92 -0
  98. package/dist-es/mega-menu/MegaMenuPanel.js.map +1 -0
  99. package/dist-es/mega-menu/MegaMenuTrigger.js +95 -0
  100. package/dist-es/mega-menu/MegaMenuTrigger.js.map +1 -0
  101. package/dist-es/mega-menu/useMegaMenu.js +13 -0
  102. package/dist-es/mega-menu/useMegaMenu.js.map +1 -0
  103. package/dist-es/mega-menu/useMegaMenuNavigation.js +278 -0
  104. package/dist-es/mega-menu/useMegaMenuNavigation.js.map +1 -0
  105. package/dist-es/mega-menu/usePageMargin.js +26 -0
  106. package/dist-es/mega-menu/usePageMargin.js.map +1 -0
  107. package/dist-types/index.d.ts +1 -0
  108. package/dist-types/mega-menu/MegaMenu.d.ts +36 -0
  109. package/dist-types/mega-menu/MegaMenuActions.d.ts +10 -0
  110. package/dist-types/mega-menu/MegaMenuAside.d.ts +9 -0
  111. package/dist-types/mega-menu/MegaMenuContent.d.ts +9 -0
  112. package/dist-types/mega-menu/MegaMenuContext.d.ts +28 -0
  113. package/dist-types/mega-menu/MegaMenuGroup.d.ts +9 -0
  114. package/dist-types/mega-menu/MegaMenuGroupContext.d.ts +12 -0
  115. package/dist-types/mega-menu/MegaMenuGroupHeading.d.ts +13 -0
  116. package/dist-types/mega-menu/MegaMenuGroups.d.ts +8 -0
  117. package/dist-types/mega-menu/MegaMenuList.d.ts +16 -0
  118. package/dist-types/mega-menu/MegaMenuListItem.d.ts +25 -0
  119. package/dist-types/mega-menu/MegaMenuPanel.d.ts +8 -0
  120. package/dist-types/mega-menu/MegaMenuTrigger.d.ts +9 -0
  121. package/dist-types/mega-menu/index.d.ts +11 -0
  122. package/dist-types/mega-menu/useMegaMenu.d.ts +6 -0
  123. package/dist-types/mega-menu/useMegaMenuNavigation.d.ts +16 -0
  124. package/dist-types/mega-menu/usePageMargin.d.ts +6 -0
  125. package/package.json +1 -1
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var styles = require('@salt-ds/styles');
5
+ var window = require('@salt-ds/window');
6
+ var clsx = require('clsx');
7
+ var React = require('react');
8
+ var makePrefixer = require('../utils/makePrefixer.js');
9
+ var useIsomorphicLayoutEffect = require('../utils/useIsomorphicLayoutEffect.js');
10
+ require('../utils/useFloatingUI/useFloatingUI.js');
11
+ var useId = require('../utils/useId.js');
12
+ require('../salt-provider/SaltProvider.js');
13
+ require('../viewport/ViewportProvider.js');
14
+ var MegaMenuGroupContext = require('./MegaMenuGroupContext.js');
15
+ var MegaMenuGroupHeading$1 = require('./MegaMenuGroupHeading.css.js');
16
+
17
+ const withBaseName = makePrefixer.makePrefixer("saltMegaMenuGroupHeading");
18
+ const MegaMenuGroupHeading = React.forwardRef(function MegaMenuGroupHeading2({ children, className, id: idProp, as: Heading = "h3", ...rest }, ref) {
19
+ const targetWindow = window.useWindow();
20
+ styles.useComponentCssInjection({
21
+ testId: "salt-mega-menu-group-heading",
22
+ css: MegaMenuGroupHeading$1,
23
+ window: targetWindow
24
+ });
25
+ const id = useId.useId(idProp);
26
+ const { setHeadingId } = MegaMenuGroupContext.useMegaMenuGroup();
27
+ useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
28
+ setHeadingId(id);
29
+ return () => setHeadingId(void 0);
30
+ }, [id, setHeadingId]);
31
+ return /* @__PURE__ */ jsxRuntime.jsx(
32
+ Heading,
33
+ {
34
+ className: clsx.clsx(withBaseName(), className),
35
+ ref,
36
+ ...rest,
37
+ id,
38
+ children
39
+ }
40
+ );
41
+ });
42
+
43
+ exports.MegaMenuGroupHeading = MegaMenuGroupHeading;
44
+ //# sourceMappingURL=MegaMenuGroupHeading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuGroupHeading.js","sources":["../src/mega-menu/MegaMenuGroupHeading.tsx"],"sourcesContent":["import { 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 { makePrefixer, useId, useIsomorphicLayoutEffect } from \"../utils\";\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":["makePrefixer","forwardRef","MegaMenuGroupHeading","useWindow","useComponentCssInjection","megaMenuGroupHeadingCss","useId","useMegaMenuGroup","useIsomorphicLayoutEffect","jsx","clsx"],"mappings":";;;;;;;;;;;;;;;;AAYA,MAAM,YAAA,GAAeA,0BAAa,0BAA0B,CAAA;AAerD,MAAM,oBAAA,GAAuBC,gBAAA,CAGlC,SAASC,qBAAAA,CACT,EAAE,QAAA,EAAU,SAAA,EAAW,EAAA,EAAI,MAAA,EAAQ,IAAI,OAAA,GAAU,IAAA,EAAM,GAAG,IAAA,IAC1D,GAAA,EACA;AACA,EAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,EAAAC,+BAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,8BAAA;AAAA,IACR,GAAA,EAAKC,sBAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAA,GAAKC,YAAM,MAAM,CAAA;AACvB,EAAA,MAAM,EAAE,YAAA,EAAa,GAAIC,qCAAA,EAAiB;AAC1C,EAAAC,mDAAA,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,uBACEC,cAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,MACzC,GAAA;AAAA,MACC,GAAG,IAAA;AAAA,MACJ,EAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ,CAAC;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ 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";
4
+
5
+ module.exports = css_248z;
6
+ //# sourceMappingURL=MegaMenuGroups.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuGroups.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var styles = require('@salt-ds/styles');
5
+ var window = require('@salt-ds/window');
6
+ var clsx = require('clsx');
7
+ var React = require('react');
8
+ var makePrefixer = require('../utils/makePrefixer.js');
9
+ require('../utils/useFloatingUI/useFloatingUI.js');
10
+ require('../utils/useId.js');
11
+ require('../salt-provider/SaltProvider.js');
12
+ require('../viewport/ViewportProvider.js');
13
+ var MegaMenuGroups$1 = require('./MegaMenuGroups.css.js');
14
+
15
+ const withBaseName = makePrefixer.makePrefixer("saltMegaMenuGroups");
16
+ const MegaMenuGroups = React.forwardRef(
17
+ function MegaMenuGroups2({ children, className, ...rest }, ref) {
18
+ const targetWindow = window.useWindow();
19
+ styles.useComponentCssInjection({
20
+ testId: "salt-mega-menu-groups",
21
+ css: MegaMenuGroups$1,
22
+ window: targetWindow
23
+ });
24
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: clsx.clsx(withBaseName(), className), ref, ...rest, children });
25
+ }
26
+ );
27
+
28
+ exports.MegaMenuGroups = MegaMenuGroups;
29
+ //# sourceMappingURL=MegaMenuGroups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuGroups.js","sources":["../src/mega-menu/MegaMenuGroups.tsx"],"sourcesContent":["import { 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 { makePrefixer } from \"../utils\";\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":["makePrefixer","forwardRef","MegaMenuGroups","useWindow","useComponentCssInjection","megaMenuGroupsCss","jsx","clsx"],"mappings":";;;;;;;;;;;;;;AAWA,MAAM,YAAA,GAAeA,0BAAa,oBAAoB,CAAA;AAS/C,MAAM,cAAA,GAAiBC,gBAAA;AAAA,EAC5B,SAASC,gBAAe,EAAE,QAAA,EAAU,WAAW,GAAG,IAAA,IAAQ,GAAA,EAAK;AAC7D,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,uBAAA;AAAA,MACR,GAAA,EAAKC,gBAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACEC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA,EAAG,GAAA,EAAW,GAAG,IAAA,EAC5D,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ 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";
4
+
5
+ module.exports = css_248z;
6
+ //# sourceMappingURL=MegaMenuList.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuList.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var styles = require('@salt-ds/styles');
5
+ var window = require('@salt-ds/window');
6
+ var clsx = require('clsx');
7
+ var React = require('react');
8
+ var makePrefixer = require('../utils/makePrefixer.js');
9
+ require('../utils/useFloatingUI/useFloatingUI.js');
10
+ require('../utils/useId.js');
11
+ require('../salt-provider/SaltProvider.js');
12
+ require('../viewport/ViewportProvider.js');
13
+ var MegaMenuGroupContext = require('./MegaMenuGroupContext.js');
14
+ var MegaMenuList$1 = require('./MegaMenuList.css.js');
15
+
16
+ const withBaseName = makePrefixer.makePrefixer("saltMegaMenuList");
17
+ const MegaMenuList = React.forwardRef(
18
+ function MegaMenuList2({
19
+ as,
20
+ children,
21
+ className,
22
+ "aria-labelledby": ariaLabelledBy,
23
+ ...rest
24
+ }, ref) {
25
+ const targetWindow = window.useWindow();
26
+ styles.useComponentCssInjection({
27
+ testId: "salt-mega-menu-list",
28
+ css: MegaMenuList$1,
29
+ window: targetWindow
30
+ });
31
+ const { headingId } = MegaMenuGroupContext.useMegaMenuGroup();
32
+ const Component = as || "ul";
33
+ return /* @__PURE__ */ jsxRuntime.jsx(
34
+ Component,
35
+ {
36
+ ref,
37
+ className: clsx.clsx(withBaseName(), className),
38
+ "aria-labelledby": clsx.clsx(headingId, ariaLabelledBy) || void 0,
39
+ ...rest,
40
+ children
41
+ }
42
+ );
43
+ }
44
+ );
45
+
46
+ exports.MegaMenuList = MegaMenuList;
47
+ //# sourceMappingURL=MegaMenuList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuList.js","sources":["../src/mega-menu/MegaMenuList.tsx"],"sourcesContent":["import { 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 {\n makePrefixer,\n type PolymorphicComponentPropWithRef,\n type PolymorphicRef,\n} from \"../utils\";\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":["makePrefixer","forwardRef","MegaMenuList","useWindow","useComponentCssInjection","megaMenuListCss","useMegaMenuGroup","jsx","clsx"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,YAAA,GAAeA,0BAAa,kBAAkB,CAAA;AAsB7C,MAAM,YAAA,GAAsCC,gBAAA;AAAA,EACjD,SAASC,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,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,qBAAA;AAAA,MACR,GAAA,EAAKC,cAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,EAAE,SAAA,EAAU,GAAIC,qCAAA,EAAiB;AAEvC,IAAA,MAAM,YAAY,EAAA,IAAM,IAAA;AAExB,IAAA,uBACEC,cAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,iBAAA,EAAiBA,SAAA,CAAK,SAAA,EAAW,cAAc,CAAA,IAAK,MAAA;AAAA,QACnD,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ 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";
4
+
5
+ module.exports = css_248z;
6
+ //# sourceMappingURL=MegaMenuListItem.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuListItem.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var styles = require('@salt-ds/styles');
5
+ var window = require('@salt-ds/window');
6
+ var clsx = require('clsx');
7
+ var React = require('react');
8
+ var makePrefixer = require('../utils/makePrefixer.js');
9
+ var renderProps = require('../utils/renderProps.js');
10
+ require('../utils/useFloatingUI/useFloatingUI.js');
11
+ require('../utils/useId.js');
12
+ require('../salt-provider/SaltProvider.js');
13
+ require('../viewport/ViewportProvider.js');
14
+ var MegaMenuListItem$1 = require('./MegaMenuListItem.css.js');
15
+ var useMegaMenu = require('./useMegaMenu.js');
16
+
17
+ const withBaseName = makePrefixer.makePrefixer("saltMegaMenuListItem");
18
+ function MegaMenuListItemAction(props) {
19
+ return renderProps.renderProps("a", props);
20
+ }
21
+ const MegaMenuListItem = React.forwardRef(function MegaMenuListItem2({ children, className, onClick, render, href, current, ...rest }, ref) {
22
+ const targetWindow = window.useWindow();
23
+ const megaMenu = useMegaMenu.useMegaMenu();
24
+ styles.useComponentCssInjection({
25
+ testId: "salt-mega-menu-list-item",
26
+ css: MegaMenuListItem$1,
27
+ window: targetWindow
28
+ });
29
+ const handleClick = (event) => {
30
+ onClick == null ? void 0 : onClick(event);
31
+ megaMenu.setOpen(false);
32
+ };
33
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { ref, className: clsx.clsx(withBaseName(), className), ...rest, children: /* @__PURE__ */ jsxRuntime.jsx(
34
+ MegaMenuListItemAction,
35
+ {
36
+ className: withBaseName("wrapper"),
37
+ href,
38
+ onClick: handleClick,
39
+ "aria-current": current ? "page" : void 0,
40
+ render,
41
+ children: React.Children.map(
42
+ children,
43
+ (child) => typeof child === "string" || typeof child === "number" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: withBaseName("content"), children: child }) : child
44
+ )
45
+ }
46
+ ) });
47
+ });
48
+
49
+ exports.MegaMenuListItem = MegaMenuListItem;
50
+ //# sourceMappingURL=MegaMenuListItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuListItem.js","sources":["../src/mega-menu/MegaMenuListItem.tsx"],"sourcesContent":["import { 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 { makePrefixer, type RenderPropsType, renderProps } from \"../utils\";\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":["makePrefixer","renderProps","forwardRef","MegaMenuListItem","useWindow","useMegaMenu","useComponentCssInjection","megaMenuListItemCss","jsx","clsx","Children"],"mappings":";;;;;;;;;;;;;;;;AAcA,MAAM,YAAA,GAAeA,0BAAa,sBAAsB,CAAA;AAGxD,SAAS,uBAAuB,KAAA,EAAsC;AACpE,EAAA,OAAOC,uBAAA,CAAY,KAAK,KAAK,CAAA;AAC/B;AA0BO,MAAM,gBAAA,GAAmBC,gBAAA,CAG9B,SAASC,iBAAAA,CACT,EAAE,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,GAAG,IAAA,IAC1D,GAAA,EACA;AACA,EAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,EAAA,MAAM,WAAWC,uBAAA,EAAY;AAE7B,EAAAC,+BAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,0BAAA;AAAA,IACR,GAAA,EAAKC,kBAAA;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,uBACEC,cAAA,CAAC,IAAA,EAAA,EAAG,GAAA,EAAU,SAAA,EAAWC,SAAA,CAAK,cAAa,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC5D,QAAA,kBAAAD,cAAA;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,EAAAE,cAAA,CAAS,GAAA;AAAA,QAAI,QAAA;AAAA,QAAU,CAAC,KAAA,KACvB,OAAO,KAAA,KAAU,YAAY,OAAO,KAAA,KAAU,QAAA,mBAC5CF,cAAA,CAAC,UAAK,SAAA,EAAW,YAAA,CAAa,SAAS,CAAA,EAAI,iBAAM,CAAA,GAEjD;AAAA;AAEJ;AAAA,GACF,EACF,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ 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";
4
+
5
+ module.exports = css_248z;
6
+ //# sourceMappingURL=MegaMenuPanel.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuPanel.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('@floating-ui/react');
5
+ var styles = require('@salt-ds/styles');
6
+ var window = require('@salt-ds/window');
7
+ var clsx = require('clsx');
8
+ var React = require('react');
9
+ var makePrefixer = require('../utils/makePrefixer.js');
10
+ var useIsomorphicLayoutEffect = require('../utils/useIsomorphicLayoutEffect.js');
11
+ var useFloatingUI = require('../utils/useFloatingUI/useFloatingUI.js');
12
+ var useForkRef = require('../utils/useForkRef.js');
13
+ var useId = require('../utils/useId.js');
14
+ require('../salt-provider/SaltProvider.js');
15
+ require('../viewport/ViewportProvider.js');
16
+ var MegaMenuPanel$1 = require('./MegaMenuPanel.css.js');
17
+ var useMegaMenu = require('./useMegaMenu.js');
18
+ var useMegaMenuNavigation = require('./useMegaMenuNavigation.js');
19
+ var usePageMargin = require('./usePageMargin.js');
20
+
21
+ const withBaseName = makePrefixer.makePrefixer("saltMegaMenuPanel");
22
+ const MegaMenuPanel = React.forwardRef(
23
+ function MegaMenuPanel2({ children, className, id: idProp, ...rest }, ref) {
24
+ const targetWindow = window.useWindow();
25
+ styles.useComponentCssInjection({
26
+ testId: "salt-mega-menu-panel",
27
+ css: MegaMenuPanel$1,
28
+ window: targetWindow
29
+ });
30
+ const { Component: FloatingComponent } = useFloatingUI.useFloatingComponent();
31
+ const {
32
+ openState: isOpen,
33
+ floatingRootContext,
34
+ placement,
35
+ getFloatingProps,
36
+ setFloating,
37
+ focusFirstItemOnOpenRef,
38
+ setPanelId
39
+ } = useMegaMenu.useMegaMenu();
40
+ const id = useId.useId(idProp);
41
+ useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
42
+ if (id) setPanelId(id);
43
+ }, [id, setPanelId]);
44
+ const { domReference } = floatingRootContext.elements;
45
+ const referenceEl = domReference instanceof HTMLElement ? domReference : null;
46
+ const pageMargin = usePageMargin.usePageMargin(referenceEl);
47
+ const floatingUIResult = useFloatingUI.useFloatingUI({
48
+ rootContext: floatingRootContext,
49
+ open: isOpen,
50
+ placement,
51
+ middleware: [
52
+ react.offset(1),
53
+ react.flip({ padding: pageMargin }),
54
+ react.shift({ padding: pageMargin, limiter: react.limitShift() })
55
+ ]
56
+ });
57
+ const floatingEl = floatingRootContext.elements.floating;
58
+ const { isPositioned } = floatingUIResult;
59
+ React.useEffect(() => {
60
+ if (focusFirstItemOnOpenRef.current && isPositioned && floatingEl) {
61
+ useMegaMenuNavigation.focusFirstItem(floatingEl);
62
+ focusFirstItemOnOpenRef.current = false;
63
+ }
64
+ }, [focusFirstItemOnOpenRef, isPositioned, floatingEl]);
65
+ const floatingProps = getFloatingProps(rest);
66
+ const handleRef = useForkRef.useForkRef(setFloating, ref);
67
+ return /* @__PURE__ */ jsxRuntime.jsx(
68
+ FloatingComponent,
69
+ {
70
+ open: isOpen,
71
+ position: floatingUIResult.strategy,
72
+ top: floatingUIResult.y ?? 0,
73
+ left: floatingUIResult.x ?? 0,
74
+ focusManagerProps: {
75
+ context: floatingUIResult.context,
76
+ modal: false,
77
+ initialFocus: -1,
78
+ returnFocus: true,
79
+ closeOnFocusOut: false,
80
+ guards: false
81
+ },
82
+ className: clsx.clsx(withBaseName(), className),
83
+ id,
84
+ role: "region",
85
+ ...floatingProps,
86
+ ref: handleRef,
87
+ children
88
+ }
89
+ );
90
+ }
91
+ );
92
+
93
+ exports.MegaMenuPanel = MegaMenuPanel;
94
+ //# sourceMappingURL=MegaMenuPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuPanel.js","sources":["../src/mega-menu/MegaMenuPanel.tsx"],"sourcesContent":["import { flip, limitShift, offset, shift } from \"@floating-ui/react\";\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 {\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useId,\n useIsomorphicLayoutEffect,\n} from \"../utils\";\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":["makePrefixer","forwardRef","MegaMenuPanel","useWindow","useComponentCssInjection","megaMenuPanelCss","useFloatingComponent","useMegaMenu","useId","useIsomorphicLayoutEffect","usePageMargin","useFloatingUI","offset","flip","shift","limitShift","useEffect","focusFirstItem","useForkRef","jsx","clsx"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,MAAM,YAAA,GAAeA,0BAAa,mBAAmB,CAAA;AAS9C,MAAM,aAAA,GAAgBC,gBAAA;AAAA,EAC3B,SAASC,cAAAA,CAAc,EAAE,QAAA,EAAU,SAAA,EAAW,IAAI,MAAA,EAAQ,GAAG,IAAA,EAAK,EAAG,GAAA,EAAK;AACxE,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,sBAAA;AAAA,MACR,GAAA,EAAKC,eAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,EAAE,SAAA,EAAW,iBAAA,EAAkB,GAAIC,kCAAA,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,QACEC,uBAAA,EAAY;AAEhB,IAAA,MAAM,EAAA,GAAKC,YAAM,MAAM,CAAA;AAGvB,IAAAC,mDAAA,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,GAAaC,4BAAc,WAAW,CAAA;AAE5C,IAAA,MAAM,mBAAmBC,2BAAA,CAAc;AAAA,MACrC,WAAA,EAAa,mBAAA;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,SAAA;AAAA,MACA,UAAA,EAAY;AAAA,QACVC,aAAO,CAAC,CAAA;AAAA,QACRC,UAAA,CAAK,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,QAC5BC,YAAM,EAAE,OAAA,EAAS,YAAY,OAAA,EAASC,gBAAA,IAAc;AAAA;AACtD,KACD,CAAA;AAGD,IAAA,MAAM,UAAA,GAAa,oBAAoB,QAAA,CAAS,QAAA;AAChD,IAAA,MAAM,EAAE,cAAa,GAAI,gBAAA;AACzB,IAAAC,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,uBAAA,CAAwB,OAAA,IAAW,YAAA,IAAgB,UAAA,EAAY;AACjE,QAAAC,oCAAA,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,GAAYC,qBAAA,CAA2B,WAAA,EAAa,GAAG,CAAA;AAE7D,IAAA,uBACEC,cAAA;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,EAAWC,SAAA,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;;;;"}
@@ -0,0 +1,97 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var NavigationItem = require('../navigation-item/NavigationItem.js');
6
+ var getRefFromChildren = require('../utils/getRefFromChildren.js');
7
+ var mergeProps = require('../utils/mergeProps.js');
8
+ require('../utils/useFloatingUI/useFloatingUI.js');
9
+ var useForkRef = require('../utils/useForkRef.js');
10
+ require('../utils/useId.js');
11
+ require('../salt-provider/SaltProvider.js');
12
+ require('../viewport/ViewportProvider.js');
13
+ var useMegaMenu = require('./useMegaMenu.js');
14
+ var useMegaMenuNavigation = require('./useMegaMenuNavigation.js');
15
+
16
+ function getAdjacentTrigger(currentTarget, direction) {
17
+ const li = currentTarget.closest("li");
18
+ if (!li) return null;
19
+ const sibling = direction === "next" ? li.nextElementSibling : li.previousElementSibling;
20
+ if (!(sibling instanceof HTMLElement)) return null;
21
+ return sibling.querySelector(useMegaMenuNavigation.FOCUSABLE_SELECTOR);
22
+ }
23
+ const MegaMenuTrigger = React.forwardRef(
24
+ function MegaMenuTrigger2(props, ref) {
25
+ const { children } = props;
26
+ const megaMenu = useMegaMenu.useMegaMenu();
27
+ const {
28
+ getReferenceProps,
29
+ setReference,
30
+ setOpen,
31
+ openState,
32
+ focusFirstItemOnOpenRef,
33
+ floatingRootContext,
34
+ panelId
35
+ } = megaMenu;
36
+ const handleKeyDown = React.useCallback(
37
+ (event) => {
38
+ const { key, shiftKey } = event;
39
+ if (key === "ArrowRight" || key === "ArrowLeft") {
40
+ event.preventDefault();
41
+ const direction = key === "ArrowRight" ? "next" : "previous";
42
+ const adjacent = getAdjacentTrigger(event.currentTarget, direction);
43
+ if (adjacent) {
44
+ if (openState) setOpen(false);
45
+ focusFirstItemOnOpenRef.current = false;
46
+ adjacent.focus();
47
+ }
48
+ return;
49
+ }
50
+ if (openState && (key === "ArrowDown" || key === "Tab" && !shiftKey)) {
51
+ event.preventDefault();
52
+ const floating = floatingRootContext.elements.floating;
53
+ if (floating) useMegaMenuNavigation.focusFirstItem(floating);
54
+ return;
55
+ }
56
+ if (openState && key === "Tab" && shiftKey) {
57
+ focusFirstItemOnOpenRef.current = false;
58
+ setOpen(false);
59
+ return;
60
+ }
61
+ if (!openState && key === "ArrowDown") {
62
+ event.preventDefault();
63
+ focusFirstItemOnOpenRef.current = true;
64
+ setOpen(true);
65
+ return;
66
+ }
67
+ },
68
+ [openState, setOpen, floatingRootContext.elements.floating]
69
+ );
70
+ const handleFloatingRef = useForkRef.useForkRef(
71
+ getRefFromChildren.getRefFromChildren(children),
72
+ setReference
73
+ );
74
+ const handleRef = useForkRef.useForkRef(handleFloatingRef, ref);
75
+ if (!children || !React.isValidElement(children)) {
76
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
77
+ }
78
+ const childProps = children.props;
79
+ const isNavigationItemChild = children.type === NavigationItem.NavigationItem;
80
+ const shouldSyncExpanded = isNavigationItemChild || childProps.expanded !== void 0;
81
+ return React.cloneElement(children, {
82
+ ...mergeProps.mergeProps(
83
+ getReferenceProps({
84
+ // NavigationItem maps `expanded` to aria-expanded; others get it directly.
85
+ ...shouldSyncExpanded ? { expanded: openState } : { "aria-expanded": openState },
86
+ ...openState ? { "aria-controls": panelId } : null,
87
+ onKeyDown: handleKeyDown
88
+ }),
89
+ children.props
90
+ ),
91
+ ref: handleRef
92
+ });
93
+ }
94
+ );
95
+
96
+ exports.MegaMenuTrigger = MegaMenuTrigger;
97
+ //# sourceMappingURL=MegaMenuTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegaMenuTrigger.js","sources":["../src/mega-menu/MegaMenuTrigger.tsx"],"sourcesContent":["import {\n cloneElement,\n forwardRef,\n isValidElement,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n useCallback,\n} from \"react\";\nimport { NavigationItem } from \"../navigation-item\";\nimport { getRefFromChildren, mergeProps, useForkRef } from \"../utils\";\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":["FOCUSABLE_SELECTOR","forwardRef","MegaMenuTrigger","useMegaMenu","useCallback","useForkRef","getRefFromChildren","isValidElement","NavigationItem","cloneElement","mergeProps"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var MegaMenuContext = require('./MegaMenuContext.js');
5
+
6
+ function useMegaMenu() {
7
+ const context = React.useContext(MegaMenuContext.MegaMenuContext);
8
+ if (context === void 0) {
9
+ throw new Error("useMegaMenu must be used within a MegaMenu");
10
+ }
11
+ return context;
12
+ }
13
+
14
+ exports.useMegaMenu = useMegaMenu;
15
+ //# sourceMappingURL=useMegaMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMegaMenu.js","sources":["../src/mega-menu/useMegaMenu.ts"],"sourcesContent":["import { useContext } from \"react\";\nimport { MegaMenuContext, type MegaMenuContextValue } from \"./MegaMenuContext\";\n/**\n * Access the nearest MegaMenu context.\n * Must be used within a `MegaMenu` provider.\n */\nexport function useMegaMenu(): MegaMenuContextValue {\n const context = useContext(MegaMenuContext);\n if (context === undefined) {\n throw new Error(\"useMegaMenu must be used within a MegaMenu\");\n }\n return context;\n}\n"],"names":["useContext","MegaMenuContext"],"mappings":";;;;;AAMO,SAAS,WAAA,GAAoC;AAClD,EAAA,MAAM,OAAA,GAAUA,iBAAWC,+BAAe,CAAA;AAC1C,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,OAAA;AACT;;;;"}