@salt-ds/lab 1.0.0-alpha.95 → 1.0.0-alpha.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +63 -0
- package/css/salt-lab.css +70 -249
- package/dist-cjs/common-hooks/useSelection.js +6 -3
- package/dist-cjs/common-hooks/useSelection.js.map +1 -1
- package/dist-cjs/index.js +12 -14
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/list/useList.js +7 -1
- package/dist-cjs/list/useList.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenu.js +8 -14
- package/dist-cjs/mega-menu/MegaMenu.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuActions.css.js +6 -0
- package/dist-cjs/mega-menu/MegaMenuActions.css.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuActions.js +33 -0
- package/dist-cjs/mega-menu/MegaMenuActions.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuAside.css.js +6 -0
- package/dist-cjs/mega-menu/MegaMenuAside.css.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuAside.js +33 -0
- package/dist-cjs/mega-menu/MegaMenuAside.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuContent.css.js +6 -0
- package/dist-cjs/mega-menu/MegaMenuContent.css.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuContent.js +25 -0
- package/dist-cjs/mega-menu/MegaMenuContent.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuContext.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuGroup.css.js +1 -1
- package/dist-cjs/mega-menu/MegaMenuGroup.js +10 -25
- package/dist-cjs/mega-menu/MegaMenuGroup.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuGroupContext.js +17 -0
- package/dist-cjs/mega-menu/MegaMenuGroupContext.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js +6 -0
- package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuGroupHeading.js +39 -0
- package/dist-cjs/mega-menu/MegaMenuGroupHeading.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuGroups.css.js +1 -1
- package/dist-cjs/mega-menu/MegaMenuGroups.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuList.css.js +6 -0
- package/dist-cjs/mega-menu/MegaMenuList.css.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuList.js +43 -0
- package/dist-cjs/mega-menu/MegaMenuList.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuListItem.css.js +6 -0
- package/dist-cjs/mega-menu/MegaMenuListItem.css.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuListItem.js +45 -0
- package/dist-cjs/mega-menu/MegaMenuListItem.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuPanel.css.js +1 -1
- package/dist-cjs/mega-menu/MegaMenuPanel.js +27 -47
- package/dist-cjs/mega-menu/MegaMenuPanel.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuTrigger.js +16 -18
- package/dist-cjs/mega-menu/MegaMenuTrigger.js.map +1 -1
- package/dist-cjs/mega-menu/useMegaMenuNavigation.js +282 -0
- package/dist-cjs/mega-menu/useMegaMenuNavigation.js.map +1 -0
- package/dist-cjs/mega-menu/usePageMargin.js +22 -0
- package/dist-cjs/mega-menu/usePageMargin.js.map +1 -0
- package/dist-es/common-hooks/useSelection.js +6 -3
- package/dist-es/common-hooks/useSelection.js.map +1 -1
- package/dist-es/index.js +6 -7
- package/dist-es/index.js.map +1 -1
- package/dist-es/list/useList.js +7 -1
- package/dist-es/list/useList.js.map +1 -1
- package/dist-es/mega-menu/MegaMenu.js +9 -15
- package/dist-es/mega-menu/MegaMenu.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuActions.css.js +4 -0
- package/dist-es/mega-menu/MegaMenuActions.css.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuActions.js +31 -0
- package/dist-es/mega-menu/MegaMenuActions.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuAside.css.js +4 -0
- package/dist-es/mega-menu/MegaMenuAside.css.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuAside.js +31 -0
- package/dist-es/mega-menu/MegaMenuAside.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuContent.css.js +4 -0
- package/dist-es/mega-menu/MegaMenuContent.css.js.map +1 -0
- package/dist-es/mega-menu/{MegaMenuHeader.js → MegaMenuContent.js} +8 -8
- package/dist-es/mega-menu/MegaMenuContent.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuContext.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuGroup.css.js +1 -1
- package/dist-es/mega-menu/MegaMenuGroup.js +13 -28
- package/dist-es/mega-menu/MegaMenuGroup.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuGroupContext.js +14 -0
- package/dist-es/mega-menu/MegaMenuGroupContext.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuGroupHeading.css.js +4 -0
- package/dist-es/mega-menu/MegaMenuGroupHeading.css.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuGroupHeading.js +37 -0
- package/dist-es/mega-menu/MegaMenuGroupHeading.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuGroups.css.js +1 -1
- package/dist-es/mega-menu/MegaMenuGroups.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuList.css.js +4 -0
- package/dist-es/mega-menu/MegaMenuList.css.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuList.js +41 -0
- package/dist-es/mega-menu/MegaMenuList.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuListItem.css.js +4 -0
- package/dist-es/mega-menu/MegaMenuListItem.css.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuListItem.js +43 -0
- package/dist-es/mega-menu/MegaMenuListItem.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuPanel.css.js +1 -1
- package/dist-es/mega-menu/MegaMenuPanel.js +30 -50
- package/dist-es/mega-menu/MegaMenuPanel.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuTrigger.js +14 -16
- package/dist-es/mega-menu/MegaMenuTrigger.js.map +1 -1
- package/dist-es/mega-menu/useMegaMenuNavigation.js +278 -0
- package/dist-es/mega-menu/useMegaMenuNavigation.js.map +1 -0
- package/dist-es/mega-menu/usePageMargin.js +20 -0
- package/dist-es/mega-menu/usePageMargin.js.map +1 -0
- package/dist-types/index.d.ts +0 -1
- package/dist-types/mega-menu/MegaMenu.d.ts +11 -2
- package/dist-types/mega-menu/MegaMenuActions.d.ts +10 -0
- package/dist-types/mega-menu/MegaMenuAside.d.ts +9 -0
- package/dist-types/mega-menu/MegaMenuContent.d.ts +9 -0
- package/dist-types/mega-menu/MegaMenuContext.d.ts +6 -7
- package/dist-types/mega-menu/MegaMenuGroup.d.ts +4 -3
- package/dist-types/mega-menu/MegaMenuGroupContext.d.ts +12 -0
- package/dist-types/mega-menu/MegaMenuGroupHeading.d.ts +13 -0
- package/dist-types/mega-menu/MegaMenuGroups.d.ts +3 -3
- package/dist-types/mega-menu/MegaMenuList.d.ts +16 -0
- package/dist-types/mega-menu/MegaMenuListItem.d.ts +25 -0
- package/dist-types/mega-menu/MegaMenuPanel.d.ts +2 -2
- package/dist-types/mega-menu/MegaMenuTrigger.d.ts +1 -0
- package/dist-types/mega-menu/index.d.ts +6 -4
- package/dist-types/mega-menu/useMegaMenuNavigation.d.ts +16 -0
- package/dist-types/mega-menu/usePageMargin.d.ts +6 -0
- package/package.json +2 -2
- package/dist-cjs/mega-menu/MegaMenuHeader.css.js +0 -6
- package/dist-cjs/mega-menu/MegaMenuHeader.css.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuHeader.js +0 -25
- package/dist-cjs/mega-menu/MegaMenuHeader.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuItem.css.js +0 -6
- package/dist-cjs/mega-menu/MegaMenuItem.css.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuItem.js +0 -53
- package/dist-cjs/mega-menu/MegaMenuItem.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuSupportingActions.css.js +0 -6
- package/dist-cjs/mega-menu/MegaMenuSupportingActions.css.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuSupportingActions.js +0 -31
- package/dist-cjs/mega-menu/MegaMenuSupportingActions.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuSupportingContent.css.js +0 -6
- package/dist-cjs/mega-menu/MegaMenuSupportingContent.css.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuSupportingContent.js +0 -31
- package/dist-cjs/mega-menu/MegaMenuSupportingContent.js.map +0 -1
- package/dist-cjs/mega-menu/useMegaMenuKeyboard.js +0 -209
- package/dist-cjs/mega-menu/useMegaMenuKeyboard.js.map +0 -1
- package/dist-cjs/toolbar-next/ToolbarContentNext.css.js +0 -6
- package/dist-cjs/toolbar-next/ToolbarContentNext.css.js.map +0 -1
- package/dist-cjs/toolbar-next/ToolbarContentNext.js +0 -32
- package/dist-cjs/toolbar-next/ToolbarContentNext.js.map +0 -1
- package/dist-cjs/toolbar-next/ToolbarNext.css.js +0 -6
- package/dist-cjs/toolbar-next/ToolbarNext.css.js.map +0 -1
- package/dist-cjs/toolbar-next/ToolbarNext.js +0 -394
- package/dist-cjs/toolbar-next/ToolbarNext.js.map +0 -1
- package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js +0 -6
- package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js.map +0 -1
- package/dist-cjs/toolbar-next/ToolbarNextOverflow.js +0 -706
- package/dist-cjs/toolbar-next/ToolbarNextOverflow.js.map +0 -1
- package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +0 -165
- package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +0 -1
- package/dist-cjs/toolbar-next/TooltrayNext.css.js +0 -6
- package/dist-cjs/toolbar-next/TooltrayNext.css.js.map +0 -1
- package/dist-cjs/toolbar-next/TooltrayNext.js +0 -55
- package/dist-cjs/toolbar-next/TooltrayNext.js.map +0 -1
- package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js +0 -409
- package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js.map +0 -1
- package/dist-cjs/toolbar-next/toolbarNextUtils.js +0 -215
- package/dist-cjs/toolbar-next/toolbarNextUtils.js.map +0 -1
- package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js +0 -312
- package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js.map +0 -1
- package/dist-cjs/toolbar-next/useToolbarNextOverflow.js +0 -743
- package/dist-cjs/toolbar-next/useToolbarNextOverflow.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuHeader.css.js +0 -4
- package/dist-es/mega-menu/MegaMenuHeader.css.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuHeader.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuItem.css.js +0 -4
- package/dist-es/mega-menu/MegaMenuItem.css.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuItem.js +0 -51
- package/dist-es/mega-menu/MegaMenuItem.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuSupportingActions.css.js +0 -4
- package/dist-es/mega-menu/MegaMenuSupportingActions.css.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuSupportingActions.js +0 -29
- package/dist-es/mega-menu/MegaMenuSupportingActions.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuSupportingContent.css.js +0 -4
- package/dist-es/mega-menu/MegaMenuSupportingContent.css.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuSupportingContent.js +0 -29
- package/dist-es/mega-menu/MegaMenuSupportingContent.js.map +0 -1
- package/dist-es/mega-menu/useMegaMenuKeyboard.js +0 -205
- package/dist-es/mega-menu/useMegaMenuKeyboard.js.map +0 -1
- package/dist-es/toolbar-next/ToolbarContentNext.css.js +0 -4
- package/dist-es/toolbar-next/ToolbarContentNext.css.js.map +0 -1
- package/dist-es/toolbar-next/ToolbarContentNext.js +0 -30
- package/dist-es/toolbar-next/ToolbarContentNext.js.map +0 -1
- package/dist-es/toolbar-next/ToolbarNext.css.js +0 -4
- package/dist-es/toolbar-next/ToolbarNext.css.js.map +0 -1
- package/dist-es/toolbar-next/ToolbarNext.js +0 -392
- package/dist-es/toolbar-next/ToolbarNext.js.map +0 -1
- package/dist-es/toolbar-next/ToolbarNextOverflow.css.js +0 -4
- package/dist-es/toolbar-next/ToolbarNextOverflow.css.js.map +0 -1
- package/dist-es/toolbar-next/ToolbarNextOverflow.js +0 -701
- package/dist-es/toolbar-next/ToolbarNextOverflow.js.map +0 -1
- package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +0 -159
- package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +0 -1
- package/dist-es/toolbar-next/TooltrayNext.css.js +0 -4
- package/dist-es/toolbar-next/TooltrayNext.css.js.map +0 -1
- package/dist-es/toolbar-next/TooltrayNext.js +0 -53
- package/dist-es/toolbar-next/TooltrayNext.js.map +0 -1
- package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js +0 -390
- package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js.map +0 -1
- package/dist-es/toolbar-next/toolbarNextUtils.js +0 -211
- package/dist-es/toolbar-next/toolbarNextUtils.js.map +0 -1
- package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js +0 -310
- package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js.map +0 -1
- package/dist-es/toolbar-next/useToolbarNextOverflow.js +0 -741
- package/dist-es/toolbar-next/useToolbarNextOverflow.js.map +0 -1
- package/dist-types/mega-menu/MegaMenuHeader.d.ts +0 -8
- package/dist-types/mega-menu/MegaMenuItem.d.ts +0 -13
- package/dist-types/mega-menu/MegaMenuSupportingActions.d.ts +0 -8
- package/dist-types/mega-menu/MegaMenuSupportingContent.d.ts +0 -8
- package/dist-types/mega-menu/useMegaMenuKeyboard.d.ts +0 -30
- package/dist-types/toolbar-next/ToolbarContentNext.d.ts +0 -11
- package/dist-types/toolbar-next/ToolbarNext.d.ts +0 -12
- package/dist-types/toolbar-next/ToolbarNextOverflow.d.ts +0 -34
- package/dist-types/toolbar-next/ToolbarNextOverflowFloatingBoundary.d.ts +0 -16
- package/dist-types/toolbar-next/TooltrayNext.d.ts +0 -37
- package/dist-types/toolbar-next/index.d.ts +0 -3
- package/dist-types/toolbar-next/toolbarNextKeyboardUtils.d.ts +0 -39
- package/dist-types/toolbar-next/toolbarNextUtils.d.ts +0 -42
- package/dist-types/toolbar-next/useToolbarNextKeyboardNavigation.d.ts +0 -42
- package/dist-types/toolbar-next/useToolbarNextOverflow.d.ts +0 -37
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { makePrefixer
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { makePrefixer } from '@salt-ds/core';
|
|
3
3
|
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
4
4
|
import { useWindow } from '@salt-ds/window';
|
|
5
5
|
import { clsx } from 'clsx';
|
|
6
|
-
import { forwardRef,
|
|
6
|
+
import { forwardRef, useState, useMemo } from 'react';
|
|
7
7
|
import css_248z from './MegaMenuGroup.css.js';
|
|
8
|
-
import {
|
|
8
|
+
import { MegaMenuGroupContext } from './MegaMenuGroupContext.js';
|
|
9
9
|
|
|
10
10
|
const withBaseName = makePrefixer("saltMegaMenuGroup");
|
|
11
11
|
const MegaMenuGroup = forwardRef(
|
|
@@ -16,36 +16,21 @@ const MegaMenuGroup = forwardRef(
|
|
|
16
16
|
css: css_248z,
|
|
17
17
|
window: targetWindow
|
|
18
18
|
});
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
} else {
|
|
26
|
-
items.push(child);
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
return /* @__PURE__ */ jsxs(
|
|
19
|
+
const [headingId, setHeadingId] = useState(void 0);
|
|
20
|
+
const contextValue = useMemo(
|
|
21
|
+
() => ({ headingId, setHeadingId }),
|
|
22
|
+
[headingId]
|
|
23
|
+
);
|
|
24
|
+
return /* @__PURE__ */ jsx(MegaMenuGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
|
|
30
25
|
"div",
|
|
31
26
|
{
|
|
32
|
-
className: clsx(withBaseName(), className),
|
|
33
27
|
"data-mega-menu-column": "",
|
|
28
|
+
className: clsx(withBaseName(), className),
|
|
34
29
|
ref,
|
|
35
30
|
...rest,
|
|
36
|
-
children
|
|
37
|
-
header,
|
|
38
|
-
/* @__PURE__ */ jsx(
|
|
39
|
-
"ol",
|
|
40
|
-
{
|
|
41
|
-
className: withBaseName("list"),
|
|
42
|
-
"aria-labelledby": header ? headerId : void 0,
|
|
43
|
-
children: items
|
|
44
|
-
}
|
|
45
|
-
)
|
|
46
|
-
]
|
|
31
|
+
children
|
|
47
32
|
}
|
|
48
|
-
);
|
|
33
|
+
) });
|
|
49
34
|
}
|
|
50
35
|
);
|
|
51
36
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MegaMenuGroup.js","sources":["../src/mega-menu/MegaMenuGroup.tsx"],"sourcesContent":["import { makePrefixer
|
|
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
|
|
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
|
|
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 @@
|
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
29
|
+
focusFirstItemOnOpenRef,
|
|
28
30
|
setPanelId
|
|
29
31
|
} = useMegaMenu();
|
|
30
32
|
const id = useId(idProp);
|
|
31
|
-
|
|
32
|
-
setPanelId(id);
|
|
33
|
-
return () => setPanelId(void 0);
|
|
33
|
+
useIsomorphicLayoutEffect(() => {
|
|
34
|
+
if (id) setPanelId(id);
|
|
34
35
|
}, [id, setPanelId]);
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
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:
|
|
69
|
+
initialFocus: -1,
|
|
83
70
|
returnFocus: true,
|
|
84
71
|
closeOnFocusOut: false,
|
|
85
72
|
guards: false
|
|
86
73
|
},
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
|
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":"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"}
|
|
@@ -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 './
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
...
|
|
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 \"./
|
|
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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"}
|