carbon-react 153.6.0 → 153.7.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.
- package/esm/__internal__/utils/createStrictContext.d.ts +31 -0
- package/esm/__internal__/utils/createStrictContext.js +36 -0
- package/esm/__internal__/utils/logger/index.d.ts +7 -0
- package/esm/__internal__/utils/logger/index.js +11 -9
- package/esm/components/menu/__internal__/menu.context.d.ts +3 -12
- package/esm/components/menu/__internal__/menu.context.js +3 -5
- package/esm/components/menu/__internal__/strict-menu.context.d.ts +14 -0
- package/esm/components/menu/__internal__/strict-menu.context.js +11 -0
- package/esm/components/menu/__internal__/submenu/submenu.component.js +3 -4
- package/esm/components/menu/__internal__/submenu/submenu.style.d.ts +1 -1
- package/esm/components/menu/index.d.ts +1 -1
- package/esm/components/menu/menu-divider/menu-divider.component.js +6 -4
- package/esm/components/menu/menu-divider/menu-divider.style.d.ts +1 -1
- package/esm/components/menu/menu-full-screen/menu-full-screen.component.js +4 -5
- package/esm/components/menu/menu-full-screen/menu-full-screen.style.d.ts +1 -1
- package/esm/components/menu/menu-item/menu-item.component.js +4 -4
- package/esm/components/menu/menu-item/menu-item.style.d.ts +1 -1
- package/esm/components/menu/menu-segment-title/menu-segment-title.component.js +10 -7
- package/esm/components/menu/menu-segment-title/menu-segment-title.style.d.ts +1 -1
- package/esm/components/menu/menu.component.d.ts +1 -9
- package/esm/components/menu/menu.component.js +9 -5
- package/esm/components/menu/menu.style.d.ts +1 -1
- package/esm/components/menu/menu.types.d.ts +10 -0
- package/esm/components/menu/menu.types.js +1 -0
- package/esm/components/menu/scrollable-block/scrollable-block.component.js +3 -3
- package/esm/components/menu/scrollable-block/scrollable-block.style.d.ts +1 -1
- package/esm/components/vertical-divider/vertical-divider.component.js +1 -1
- package/lib/__internal__/utils/createStrictContext.d.ts +31 -0
- package/lib/__internal__/utils/createStrictContext.js +43 -0
- package/lib/__internal__/utils/logger/index.d.ts +7 -0
- package/lib/__internal__/utils/logger/index.js +11 -9
- package/lib/components/menu/__internal__/menu.context.d.ts +3 -12
- package/lib/components/menu/__internal__/menu.context.js +3 -6
- package/lib/components/menu/__internal__/strict-menu.context.d.ts +14 -0
- package/lib/components/menu/__internal__/strict-menu.context.js +19 -0
- package/lib/components/menu/__internal__/submenu/submenu.component.js +3 -4
- package/lib/components/menu/__internal__/submenu/submenu.style.d.ts +1 -1
- package/lib/components/menu/index.d.ts +1 -1
- package/lib/components/menu/menu-divider/menu-divider.component.js +8 -8
- package/lib/components/menu/menu-divider/menu-divider.style.d.ts +1 -1
- package/lib/components/menu/menu-full-screen/menu-full-screen.component.js +3 -4
- package/lib/components/menu/menu-full-screen/menu-full-screen.style.d.ts +1 -1
- package/lib/components/menu/menu-item/menu-item.component.js +7 -7
- package/lib/components/menu/menu-item/menu-item.style.d.ts +1 -1
- package/lib/components/menu/menu-segment-title/menu-segment-title.component.js +12 -9
- package/lib/components/menu/menu-segment-title/menu-segment-title.style.d.ts +1 -1
- package/lib/components/menu/menu.component.d.ts +1 -9
- package/lib/components/menu/menu.component.js +9 -5
- package/lib/components/menu/menu.style.d.ts +1 -1
- package/lib/components/menu/menu.types.d.ts +10 -0
- package/lib/components/menu/menu.types.js +5 -0
- package/lib/components/menu/scrollable-block/scrollable-block.component.js +3 -5
- package/lib/components/menu/scrollable-block/scrollable-block.style.d.ts +1 -1
- package/lib/components/vertical-divider/vertical-divider.component.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
type CreateStrictContextArgs<ContextType> = {
|
|
3
|
+
/** The display name of the context. */
|
|
4
|
+
name?: string;
|
|
5
|
+
/** Error message to log if context is accessed outside its provider. */
|
|
6
|
+
errorMessage: string;
|
|
7
|
+
/** Default value to return if context is accessed outside its provider. */
|
|
8
|
+
defaultValue: ContextType;
|
|
9
|
+
};
|
|
10
|
+
type CreateStrictContextReturn<ContextType> = readonly [
|
|
11
|
+
React.Provider<ContextType | null>,
|
|
12
|
+
() => ContextType
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Creates a React context with a provider and a hook for accessing the context.
|
|
16
|
+
* Logs an error and returns a default value if the hook is used outside of the provider.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
*
|
|
20
|
+
* ```tsx
|
|
21
|
+
* const [ListProvider, useList] = createStrictContext<{ size: number }>({
|
|
22
|
+
* name: "ListContext",
|
|
23
|
+
* errorMessage: "ListContext is undefined. Make sure to wrap your component with <ListProvider />",
|
|
24
|
+
* defaultValue: {
|
|
25
|
+
* size: 0,
|
|
26
|
+
* },
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
declare function createStrictContext<ContextType>({ name, errorMessage, defaultValue, }: CreateStrictContextArgs<ContextType>): CreateStrictContextReturn<ContextType>;
|
|
31
|
+
export default createStrictContext;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Logger from "./logger";
|
|
3
|
+
/**
|
|
4
|
+
* Creates a React context with a provider and a hook for accessing the context.
|
|
5
|
+
* Logs an error and returns a default value if the hook is used outside of the provider.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
*
|
|
9
|
+
* ```tsx
|
|
10
|
+
* const [ListProvider, useList] = createStrictContext<{ size: number }>({
|
|
11
|
+
* name: "ListContext",
|
|
12
|
+
* errorMessage: "ListContext is undefined. Make sure to wrap your component with <ListProvider />",
|
|
13
|
+
* defaultValue: {
|
|
14
|
+
* size: 0,
|
|
15
|
+
* },
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
function createStrictContext({
|
|
20
|
+
name,
|
|
21
|
+
errorMessage,
|
|
22
|
+
defaultValue
|
|
23
|
+
}) {
|
|
24
|
+
const Context = /*#__PURE__*/React.createContext(null);
|
|
25
|
+
Context.displayName = name;
|
|
26
|
+
function useContext() {
|
|
27
|
+
const context = React.useContext(Context);
|
|
28
|
+
if (!context) {
|
|
29
|
+
Logger.error(`${errorMessage}\nThis logged warning will become a thrown error in a future major release.`);
|
|
30
|
+
return defaultValue;
|
|
31
|
+
}
|
|
32
|
+
return context;
|
|
33
|
+
}
|
|
34
|
+
return [Context.Provider, useContext];
|
|
35
|
+
}
|
|
36
|
+
export default createStrictContext;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for dispatching messages to the browser console.
|
|
3
|
+
* By default, logging is disabled in production mode.
|
|
4
|
+
*/
|
|
1
5
|
declare const Logger: {
|
|
2
6
|
setEnabledState: (newState: boolean) => void;
|
|
7
|
+
/** Logs warning-level message to browser console with [Deprecation] prefix */
|
|
3
8
|
deprecate: (message: string) => void;
|
|
9
|
+
/** Logs error-level message to browser console. Includes stack trace. */
|
|
10
|
+
error: (message: string) => void;
|
|
4
11
|
};
|
|
5
12
|
export default Logger;
|
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
|
+
|
|
2
3
|
// Globally enable the logger
|
|
3
4
|
let enabled = process.env.NODE_ENV !== "production";
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Logger function will only output when enabled. By default this
|
|
9
|
-
* enabled state is set when your NODE_ENV !== 'production'
|
|
10
|
-
*
|
|
11
|
-
* Methods
|
|
12
|
-
* deprecate - console.warn which prepends the message with [Deprecation]
|
|
13
|
-
*
|
|
6
|
+
/**
|
|
7
|
+
* Utility for dispatching messages to the browser console.
|
|
8
|
+
* By default, logging is disabled in production mode.
|
|
14
9
|
*/
|
|
15
10
|
const Logger = {
|
|
16
11
|
setEnabledState: newState => {
|
|
17
12
|
enabled = newState;
|
|
18
13
|
},
|
|
14
|
+
/** Logs warning-level message to browser console with [Deprecation] prefix */
|
|
19
15
|
deprecate: message => {
|
|
20
16
|
if (enabled) {
|
|
21
17
|
console.warn(`[Deprecation] ${message}`);
|
|
22
18
|
}
|
|
19
|
+
},
|
|
20
|
+
/** Logs error-level message to browser console. Includes stack trace. */
|
|
21
|
+
error: message => {
|
|
22
|
+
if (enabled) {
|
|
23
|
+
console.error(message);
|
|
24
|
+
}
|
|
23
25
|
}
|
|
24
26
|
};
|
|
25
27
|
export default Logger;
|
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export interface MenuContextProps {
|
|
4
|
-
menuType: MenuType;
|
|
5
|
-
openSubmenuId: string | null;
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
interface MenuContextType {
|
|
6
3
|
inMenu?: boolean;
|
|
7
|
-
inFullscreenView?: boolean;
|
|
8
|
-
setOpenSubmenuId: (id: string | null) => void;
|
|
9
|
-
registerItem?: (id: string) => void;
|
|
10
|
-
unregisterItem?: (id: string) => void;
|
|
11
|
-
focusId?: string;
|
|
12
|
-
updateFocusId?: (id: string) => void;
|
|
13
4
|
}
|
|
14
|
-
declare const _default:
|
|
5
|
+
declare const _default: import("react").Context<MenuContextType>;
|
|
15
6
|
export default _default;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
export default /*#__PURE__*/
|
|
3
|
-
|
|
4
|
-
openSubmenuId: null,
|
|
5
|
-
setOpenSubmenuId: /* istanbul ignore next */() => {}
|
|
1
|
+
import { createContext } from "react";
|
|
2
|
+
export default /*#__PURE__*/createContext({
|
|
3
|
+
inMenu: false
|
|
6
4
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { MenuType } from "../menu.types";
|
|
3
|
+
export interface StrictMenuContextType {
|
|
4
|
+
menuType: MenuType;
|
|
5
|
+
openSubmenuId: string | null;
|
|
6
|
+
inFullscreenView?: boolean;
|
|
7
|
+
setOpenSubmenuId: (id: string | null) => void;
|
|
8
|
+
registerItem?: (id: string) => void;
|
|
9
|
+
unregisterItem?: (id: string) => void;
|
|
10
|
+
focusId?: string;
|
|
11
|
+
updateFocusId?: (id: string) => void;
|
|
12
|
+
}
|
|
13
|
+
declare const StrictMenuProvider: import("react").Provider<StrictMenuContextType | null>, useStrictMenuContext: () => StrictMenuContextType;
|
|
14
|
+
export { StrictMenuProvider, useStrictMenuContext };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import createStrictContext from "../../../__internal__/utils/createStrictContext";
|
|
2
|
+
const [StrictMenuProvider, useStrictMenuContext] = createStrictContext({
|
|
3
|
+
name: "MenuContext",
|
|
4
|
+
errorMessage: "Carbon Menu: Context not found. Have you wrapped your Carbon subcomponents properly? See stack trace for more details.",
|
|
5
|
+
defaultValue: {
|
|
6
|
+
menuType: "light",
|
|
7
|
+
openSubmenuId: null,
|
|
8
|
+
setOpenSubmenuId: /* istanbul ignore next */() => {}
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
export { StrictMenuProvider, useStrictMenuContext };
|
|
@@ -3,7 +3,7 @@ import React, { useCallback, useEffect, useContext, useMemo, useRef, useState }
|
|
|
3
3
|
import StyledMenuItemWrapper from "../../menu-item/menu-item.style";
|
|
4
4
|
import { StyledSubmenu, StyledSubmenuWrapper } from "./submenu.style";
|
|
5
5
|
import Events from "../../../../__internal__/utils/helpers/events";
|
|
6
|
-
import
|
|
6
|
+
import { useStrictMenuContext } from "../strict-menu.context";
|
|
7
7
|
import { characterNavigation } from "../keyboard-navigation";
|
|
8
8
|
import SubmenuContext from "./submenu.context";
|
|
9
9
|
import guid from "../../../../__internal__/utils/helpers/guid";
|
|
@@ -33,13 +33,12 @@ const Submenu = /*#__PURE__*/React.forwardRef(({
|
|
|
33
33
|
}, ref) => {
|
|
34
34
|
const [submenuRef, setSubmenuRef] = useState(null);
|
|
35
35
|
const submenuId = useRef(guid());
|
|
36
|
-
const menuContext = useContext(MenuContext);
|
|
37
36
|
const {
|
|
38
37
|
inFullscreenView,
|
|
39
38
|
openSubmenuId,
|
|
40
39
|
setOpenSubmenuId,
|
|
41
40
|
menuType
|
|
42
|
-
} =
|
|
41
|
+
} = useStrictMenuContext();
|
|
43
42
|
const [submenuOpen, setSubmenuOpen] = useState(false);
|
|
44
43
|
const [submenuFocusId, setSubmenuFocusId] = useState(null);
|
|
45
44
|
const [submenuItemIds, setSubmenuItemIds] = useState([]);
|
|
@@ -265,7 +264,7 @@ const Submenu = /*#__PURE__*/React.forwardRef(({
|
|
|
265
264
|
"data-component": "submenu-wrapper",
|
|
266
265
|
inFullscreenView: inFullscreenView,
|
|
267
266
|
asPassiveItem: asPassiveItem,
|
|
268
|
-
menuType:
|
|
267
|
+
menuType: menuType
|
|
269
268
|
}, /*#__PURE__*/React.createElement(StyledMenuItemWrapper, _extends({}, rest, {
|
|
270
269
|
onClick: asPassiveItem ? undefined : onClick,
|
|
271
270
|
className: className,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { default as Menu } from "./menu.component";
|
|
2
|
-
export type { MenuProps } from "./menu.
|
|
2
|
+
export type { MenuProps } from "./menu.types";
|
|
3
3
|
export { default as MenuItem } from "./menu-item";
|
|
4
4
|
export type { MenuWithIcon, MenuWithChildren } from "./menu-item";
|
|
5
5
|
export { default as MenuDivider } from "./menu-divider";
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
-
import React
|
|
2
|
+
import React from "react";
|
|
3
3
|
import StyledDivider from "./menu-divider.style";
|
|
4
|
-
import
|
|
4
|
+
import { useStrictMenuContext } from "../__internal__/strict-menu.context";
|
|
5
5
|
import { StyledMenuItem } from "../menu.style";
|
|
6
6
|
import tagComponent from "../../../__internal__/utils/helpers/tags";
|
|
7
7
|
const MenuDivider = /*#__PURE__*/React.forwardRef(({
|
|
8
8
|
size = "default",
|
|
9
9
|
...rest
|
|
10
10
|
}, ref) => {
|
|
11
|
-
const
|
|
11
|
+
const {
|
|
12
|
+
menuType
|
|
13
|
+
} = useStrictMenuContext();
|
|
12
14
|
return /*#__PURE__*/React.createElement(StyledMenuItem, {
|
|
13
15
|
inSubmenu: true
|
|
14
16
|
}, /*#__PURE__*/React.createElement(StyledDivider, _extends({
|
|
15
17
|
size: size
|
|
16
18
|
}, tagComponent("menu-divider", rest), {
|
|
17
|
-
menuType:
|
|
19
|
+
menuType: menuType,
|
|
18
20
|
ref: ref
|
|
19
21
|
})));
|
|
20
22
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MenuDividerProps } from "./menu-divider.component";
|
|
2
|
-
import { MenuType } from "../
|
|
2
|
+
import type { MenuType } from "../menu.types";
|
|
3
3
|
declare const StyledDivider: import("styled-components").StyledComponent<"div", any, MenuDividerProps & {
|
|
4
4
|
menuType: MenuType;
|
|
5
5
|
}, never>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import React, { useCallback,
|
|
1
|
+
import React, { useCallback, useRef } from "react";
|
|
2
2
|
import { CSSTransition } from "react-transition-group";
|
|
3
3
|
import { StyledMenuFullscreen, StyledMenuModal, StyledMenuFullscreenHeader } from "./menu-full-screen.style";
|
|
4
4
|
import { StyledMenuWrapper } from "../menu.style";
|
|
5
|
-
import
|
|
5
|
+
import { useStrictMenuContext, StrictMenuProvider } from "../__internal__/strict-menu.context";
|
|
6
6
|
import Events from "../../../__internal__/utils/helpers/events";
|
|
7
7
|
import Box from "../../box";
|
|
8
8
|
import IconButton from "../../icon-button";
|
|
@@ -30,7 +30,7 @@ export const MenuFullscreen = ({
|
|
|
30
30
|
const isTopModal = useModalAria(modalRef);
|
|
31
31
|
const {
|
|
32
32
|
menuType
|
|
33
|
-
} =
|
|
33
|
+
} = useStrictMenuContext();
|
|
34
34
|
const isDarkVariant = ["dark", "black"].includes(menuType);
|
|
35
35
|
const transitionDuration = 200;
|
|
36
36
|
const locale = useLocale();
|
|
@@ -101,11 +101,10 @@ export const MenuFullscreen = ({
|
|
|
101
101
|
flexDirection: "column",
|
|
102
102
|
role: "list",
|
|
103
103
|
inFullscreenView: true
|
|
104
|
-
}, /*#__PURE__*/React.createElement(
|
|
104
|
+
}, /*#__PURE__*/React.createElement(StrictMenuProvider, {
|
|
105
105
|
value: {
|
|
106
106
|
inFullscreenView: true,
|
|
107
107
|
menuType,
|
|
108
|
-
inMenu: true,
|
|
109
108
|
openSubmenuId: null,
|
|
110
109
|
setOpenSubmenuId: /* istanbul ignore next */() => {}
|
|
111
110
|
}
|
|
@@ -5,7 +5,7 @@ import { defaultFocusableSelectors as focusableSelectors } from "../../../__inte
|
|
|
5
5
|
import { filterStyledSystemPaddingProps } from "../../../style/utils";
|
|
6
6
|
import StyledMenuItemWrapper from "./menu-item.style";
|
|
7
7
|
import Events from "../../../__internal__/utils/helpers/events";
|
|
8
|
-
import
|
|
8
|
+
import { useStrictMenuContext } from "../__internal__/strict-menu.context";
|
|
9
9
|
import Submenu from "../__internal__/submenu/submenu.component";
|
|
10
10
|
import SubmenuContext from "../__internal__/submenu/submenu.context";
|
|
11
11
|
import MenuSegmentContext from "../menu-segment-title/menu-segment-title.context";
|
|
@@ -52,7 +52,7 @@ export const MenuItem = ({
|
|
|
52
52
|
focusId,
|
|
53
53
|
updateFocusId,
|
|
54
54
|
menuType
|
|
55
|
-
} =
|
|
55
|
+
} = useStrictMenuContext();
|
|
56
56
|
const submenuContext = useContext(SubmenuContext);
|
|
57
57
|
const isInSubmenu = Object.keys(submenuContext).length > 0;
|
|
58
58
|
const {
|
|
@@ -70,7 +70,7 @@ export const MenuItem = ({
|
|
|
70
70
|
if (firstFocusable !== firstFocusableChild) {
|
|
71
71
|
setFirstFocusableChild(firstFocusable);
|
|
72
72
|
}
|
|
73
|
-
}, [ref]);
|
|
73
|
+
}, [firstFocusableChild, ref]);
|
|
74
74
|
useEffect(() => {
|
|
75
75
|
const id = menuItemId.current;
|
|
76
76
|
|
|
@@ -93,7 +93,7 @@ export const MenuItem = ({
|
|
|
93
93
|
}
|
|
94
94
|
ref?.focus();
|
|
95
95
|
}
|
|
96
|
-
}, [firstFocusableChild, focusFromMenu, focusFromSubmenu]);
|
|
96
|
+
}, [firstFocusableChild, focusFromMenu, focusFromSubmenu, ref]);
|
|
97
97
|
const handleFocus = event => {
|
|
98
98
|
if (isInSubmenu) {
|
|
99
99
|
event.stopPropagation();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { PaddingProps } from "styled-system";
|
|
3
|
-
import { MenuType } from "../__internal__/menu.context";
|
|
4
3
|
import { MenuWithChildren } from "./menu-item.component";
|
|
4
|
+
import type { MenuType } from "../menu.types";
|
|
5
5
|
interface StyledMenuItemWrapperProps extends Pick<MenuWithChildren, "href" | "showDropdownArrow" | "overrideColor" | "clickToOpen" | "maxWidth">, PaddingProps {
|
|
6
6
|
menuType: MenuType;
|
|
7
7
|
selected?: boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
2
|
import React, { useContext, useMemo } from "react";
|
|
3
3
|
import { StyledTitle, StyledSegmentChildren } from "./menu-segment-title.style";
|
|
4
|
-
import
|
|
4
|
+
import { useStrictMenuContext } from "../__internal__/strict-menu.context";
|
|
5
5
|
import { StyledMenuItem } from "../menu.style";
|
|
6
6
|
import tagComponent from "../../../__internal__/utils/helpers/tags";
|
|
7
7
|
import SubmenuContext from "../__internal__/submenu/submenu.context";
|
|
@@ -14,26 +14,29 @@ const MenuSegmentTitle = /*#__PURE__*/React.forwardRef(({
|
|
|
14
14
|
as = "h2",
|
|
15
15
|
...rest
|
|
16
16
|
}, ref) => {
|
|
17
|
-
const
|
|
17
|
+
const {
|
|
18
|
+
menuType,
|
|
19
|
+
inFullscreenView
|
|
20
|
+
} = useStrictMenuContext();
|
|
18
21
|
const {
|
|
19
22
|
submenuHasMaxWidth
|
|
20
23
|
} = useContext(SubmenuContext);
|
|
21
|
-
const isChildOfFullscreenMenu =
|
|
24
|
+
const isChildOfFullscreenMenu = !!inFullscreenView;
|
|
22
25
|
const overriddenVariant = useMemo(() => {
|
|
23
|
-
return isChildOfFullscreenMenu && variant === "alternate" && ["white", "black"].includes(
|
|
24
|
-
}, [isChildOfFullscreenMenu,
|
|
26
|
+
return isChildOfFullscreenMenu && variant === "alternate" && ["white", "black"].includes(menuType) ? "default" : variant;
|
|
27
|
+
}, [isChildOfFullscreenMenu, menuType, variant]);
|
|
25
28
|
return /*#__PURE__*/React.createElement(StyledMenuItem, {
|
|
26
29
|
inSubmenu: true
|
|
27
30
|
}, /*#__PURE__*/React.createElement(StyledTitle, _extends({
|
|
28
31
|
as: AS_VALUES.includes(as) ? as : /* istanbul ignore next */"h2"
|
|
29
32
|
}, tagComponent("menu-segment-title", rest), {
|
|
30
|
-
menuType:
|
|
33
|
+
menuType: menuType,
|
|
31
34
|
ref: ref,
|
|
32
35
|
variant: overriddenVariant,
|
|
33
36
|
shouldWrap: submenuHasMaxWidth
|
|
34
37
|
}), text), children && /*#__PURE__*/React.createElement(StyledSegmentChildren, {
|
|
35
38
|
"data-role": "menu-segment-children",
|
|
36
|
-
menuType:
|
|
39
|
+
menuType: menuType,
|
|
37
40
|
variant: overriddenVariant
|
|
38
41
|
}, /*#__PURE__*/React.createElement(MenuSegmentContext.Provider, {
|
|
39
42
|
value: {
|
|
@@ -1,12 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
import { TagProps } from "../../__internal__/utils/helpers/tags";
|
|
4
|
-
import { MenuType } from "./__internal__/menu.context";
|
|
5
|
-
export interface MenuProps extends TagProps, Pick<LayoutProps, "width" | "minWidth" | "maxWidth" | "overflow" | "overflowX" | "verticalAlign">, FlexboxProps {
|
|
6
|
-
/** Children elements */
|
|
7
|
-
children: React.ReactNode;
|
|
8
|
-
/** Defines the color scheme of the component */
|
|
9
|
-
menuType?: MenuType;
|
|
10
|
-
}
|
|
2
|
+
import type { MenuProps } from "./menu.types";
|
|
11
3
|
export declare const Menu: ({ menuType, children, ...rest }: MenuProps) => React.JSX.Element;
|
|
12
4
|
export default Menu;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
2
|
import React, { useCallback, useState, useRef } from "react";
|
|
3
|
-
import { StyledMenuWrapper } from "./menu.style";
|
|
4
3
|
import tagComponent from "../../__internal__/utils/helpers/tags";
|
|
5
|
-
import
|
|
4
|
+
import { StyledMenuWrapper } from "./menu.style";
|
|
5
|
+
import { StrictMenuProvider } from "./__internal__/strict-menu.context";
|
|
6
|
+
import MenuContext from "../menu/__internal__/menu.context";
|
|
6
7
|
import { menuKeyboardNavigation } from "./__internal__/keyboard-navigation";
|
|
7
8
|
import { MENU_ITEM_CHILDREN_LOCATOR } from "./__internal__/locators";
|
|
8
9
|
export const Menu = ({
|
|
@@ -46,10 +47,9 @@ export const Menu = ({
|
|
|
46
47
|
ref: ref,
|
|
47
48
|
role: "list",
|
|
48
49
|
onKeyDown: handleKeyDown
|
|
49
|
-
}), /*#__PURE__*/React.createElement(
|
|
50
|
+
}), /*#__PURE__*/React.createElement(StrictMenuProvider, {
|
|
50
51
|
value: {
|
|
51
52
|
menuType,
|
|
52
|
-
inMenu: true,
|
|
53
53
|
openSubmenuId,
|
|
54
54
|
setOpenSubmenuId,
|
|
55
55
|
focusId,
|
|
@@ -57,6 +57,10 @@ export const Menu = ({
|
|
|
57
57
|
registerItem,
|
|
58
58
|
unregisterItem
|
|
59
59
|
}
|
|
60
|
-
},
|
|
60
|
+
}, /*#__PURE__*/React.createElement(MenuContext.Provider, {
|
|
61
|
+
value: {
|
|
62
|
+
inMenu: true
|
|
63
|
+
}
|
|
64
|
+
}, children)));
|
|
61
65
|
};
|
|
62
66
|
export default Menu;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FlexboxProps, LayoutProps, PaddingProps } from "styled-system";
|
|
2
|
-
import { MenuProps } from "./menu.
|
|
2
|
+
import type { MenuProps } from "./menu.types";
|
|
3
3
|
interface StyledMenuProps extends Pick<MenuProps, "menuType">, FlexboxProps, LayoutProps {
|
|
4
4
|
inFullscreenView?: boolean;
|
|
5
5
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { FlexboxProps, LayoutProps } from "styled-system";
|
|
3
|
+
import { TagProps } from "../../__internal__/utils/helpers/tags";
|
|
4
|
+
export type MenuType = "light" | "dark" | "white" | "black";
|
|
5
|
+
export interface MenuProps extends TagProps, Pick<LayoutProps, "width" | "minWidth" | "maxWidth" | "overflow" | "overflowX" | "verticalAlign">, FlexboxProps {
|
|
6
|
+
/** Children elements */
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** Defines the color scheme of the component */
|
|
9
|
+
menuType?: MenuType;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
-
import React
|
|
3
|
-
import
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { useStrictMenuContext } from "../__internal__/strict-menu.context";
|
|
4
4
|
import MenuItem from "../menu-item";
|
|
5
5
|
import StyledScrollableBlock from "./scrollable-block.style";
|
|
6
6
|
import Box from "../../box";
|
|
@@ -15,7 +15,7 @@ export const ScrollableBlock = ({
|
|
|
15
15
|
}) => {
|
|
16
16
|
const {
|
|
17
17
|
menuType
|
|
18
|
-
} =
|
|
18
|
+
} = useStrictMenuContext();
|
|
19
19
|
const scrollVariants = {
|
|
20
20
|
light: "light",
|
|
21
21
|
dark: "dark",
|
|
@@ -21,7 +21,7 @@ export const VerticalDivider = ({
|
|
|
21
21
|
displayInline: displayInline
|
|
22
22
|
}, props, {
|
|
23
23
|
as: inMenu ? "li" : "div",
|
|
24
|
-
"aria-hidden": inMenu
|
|
24
|
+
"aria-hidden": inMenu || ariaHidden
|
|
25
25
|
}, tagComponent("vertical-divider", props)), /*#__PURE__*/React.createElement(StyledDivider, {
|
|
26
26
|
"data-role": "divider",
|
|
27
27
|
tint: tint
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
type CreateStrictContextArgs<ContextType> = {
|
|
3
|
+
/** The display name of the context. */
|
|
4
|
+
name?: string;
|
|
5
|
+
/** Error message to log if context is accessed outside its provider. */
|
|
6
|
+
errorMessage: string;
|
|
7
|
+
/** Default value to return if context is accessed outside its provider. */
|
|
8
|
+
defaultValue: ContextType;
|
|
9
|
+
};
|
|
10
|
+
type CreateStrictContextReturn<ContextType> = readonly [
|
|
11
|
+
React.Provider<ContextType | null>,
|
|
12
|
+
() => ContextType
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Creates a React context with a provider and a hook for accessing the context.
|
|
16
|
+
* Logs an error and returns a default value if the hook is used outside of the provider.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
*
|
|
20
|
+
* ```tsx
|
|
21
|
+
* const [ListProvider, useList] = createStrictContext<{ size: number }>({
|
|
22
|
+
* name: "ListContext",
|
|
23
|
+
* errorMessage: "ListContext is undefined. Make sure to wrap your component with <ListProvider />",
|
|
24
|
+
* defaultValue: {
|
|
25
|
+
* size: 0,
|
|
26
|
+
* },
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
declare function createStrictContext<ContextType>({ name, errorMessage, defaultValue, }: CreateStrictContextArgs<ContextType>): CreateStrictContextReturn<ContextType>;
|
|
31
|
+
export default createStrictContext;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _logger = _interopRequireDefault(require("./logger"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
/**
|
|
11
|
+
* Creates a React context with a provider and a hook for accessing the context.
|
|
12
|
+
* Logs an error and returns a default value if the hook is used outside of the provider.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
*
|
|
16
|
+
* ```tsx
|
|
17
|
+
* const [ListProvider, useList] = createStrictContext<{ size: number }>({
|
|
18
|
+
* name: "ListContext",
|
|
19
|
+
* errorMessage: "ListContext is undefined. Make sure to wrap your component with <ListProvider />",
|
|
20
|
+
* defaultValue: {
|
|
21
|
+
* size: 0,
|
|
22
|
+
* },
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
function createStrictContext({
|
|
27
|
+
name,
|
|
28
|
+
errorMessage,
|
|
29
|
+
defaultValue
|
|
30
|
+
}) {
|
|
31
|
+
const Context = /*#__PURE__*/_react.default.createContext(null);
|
|
32
|
+
Context.displayName = name;
|
|
33
|
+
function useContext() {
|
|
34
|
+
const context = _react.default.useContext(Context);
|
|
35
|
+
if (!context) {
|
|
36
|
+
_logger.default.error(`${errorMessage}\nThis logged warning will become a thrown error in a future major release.`);
|
|
37
|
+
return defaultValue;
|
|
38
|
+
}
|
|
39
|
+
return context;
|
|
40
|
+
}
|
|
41
|
+
return [Context.Provider, useContext];
|
|
42
|
+
}
|
|
43
|
+
var _default = exports.default = createStrictContext;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for dispatching messages to the browser console.
|
|
3
|
+
* By default, logging is disabled in production mode.
|
|
4
|
+
*/
|
|
1
5
|
declare const Logger: {
|
|
2
6
|
setEnabledState: (newState: boolean) => void;
|
|
7
|
+
/** Logs warning-level message to browser console with [Deprecation] prefix */
|
|
3
8
|
deprecate: (message: string) => void;
|
|
9
|
+
/** Logs error-level message to browser console. Includes stack trace. */
|
|
10
|
+
error: (message: string) => void;
|
|
4
11
|
};
|
|
5
12
|
export default Logger;
|
|
@@ -5,27 +5,29 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
/* eslint-disable no-console */
|
|
8
|
+
|
|
8
9
|
// Globally enable the logger
|
|
9
10
|
let enabled = process.env.NODE_ENV !== "production";
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* Logger function will only output when enabled. By default this
|
|
15
|
-
* enabled state is set when your NODE_ENV !== 'production'
|
|
16
|
-
*
|
|
17
|
-
* Methods
|
|
18
|
-
* deprecate - console.warn which prepends the message with [Deprecation]
|
|
19
|
-
*
|
|
12
|
+
/**
|
|
13
|
+
* Utility for dispatching messages to the browser console.
|
|
14
|
+
* By default, logging is disabled in production mode.
|
|
20
15
|
*/
|
|
21
16
|
const Logger = {
|
|
22
17
|
setEnabledState: newState => {
|
|
23
18
|
enabled = newState;
|
|
24
19
|
},
|
|
20
|
+
/** Logs warning-level message to browser console with [Deprecation] prefix */
|
|
25
21
|
deprecate: message => {
|
|
26
22
|
if (enabled) {
|
|
27
23
|
console.warn(`[Deprecation] ${message}`);
|
|
28
24
|
}
|
|
25
|
+
},
|
|
26
|
+
/** Logs error-level message to browser console. Includes stack trace. */
|
|
27
|
+
error: message => {
|
|
28
|
+
if (enabled) {
|
|
29
|
+
console.error(message);
|
|
30
|
+
}
|
|
29
31
|
}
|
|
30
32
|
};
|
|
31
33
|
var _default = exports.default = Logger;
|
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export interface MenuContextProps {
|
|
4
|
-
menuType: MenuType;
|
|
5
|
-
openSubmenuId: string | null;
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
interface MenuContextType {
|
|
6
3
|
inMenu?: boolean;
|
|
7
|
-
inFullscreenView?: boolean;
|
|
8
|
-
setOpenSubmenuId: (id: string | null) => void;
|
|
9
|
-
registerItem?: (id: string) => void;
|
|
10
|
-
unregisterItem?: (id: string) => void;
|
|
11
|
-
focusId?: string;
|
|
12
|
-
updateFocusId?: (id: string) => void;
|
|
13
4
|
}
|
|
14
|
-
declare const _default:
|
|
5
|
+
declare const _default: import("react").Context<MenuContextType>;
|
|
15
6
|
export default _default;
|
|
@@ -4,10 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
var _react =
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
menuType: "light",
|
|
11
|
-
openSubmenuId: null,
|
|
12
|
-
setOpenSubmenuId: /* istanbul ignore next */() => {}
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _default = exports.default = /*#__PURE__*/(0, _react.createContext)({
|
|
9
|
+
inMenu: false
|
|
13
10
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { MenuType } from "../menu.types";
|
|
3
|
+
export interface StrictMenuContextType {
|
|
4
|
+
menuType: MenuType;
|
|
5
|
+
openSubmenuId: string | null;
|
|
6
|
+
inFullscreenView?: boolean;
|
|
7
|
+
setOpenSubmenuId: (id: string | null) => void;
|
|
8
|
+
registerItem?: (id: string) => void;
|
|
9
|
+
unregisterItem?: (id: string) => void;
|
|
10
|
+
focusId?: string;
|
|
11
|
+
updateFocusId?: (id: string) => void;
|
|
12
|
+
}
|
|
13
|
+
declare const StrictMenuProvider: import("react").Provider<StrictMenuContextType | null>, useStrictMenuContext: () => StrictMenuContextType;
|
|
14
|
+
export { StrictMenuProvider, useStrictMenuContext };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useStrictMenuContext = exports.StrictMenuProvider = void 0;
|
|
7
|
+
var _createStrictContext = _interopRequireDefault(require("../../../__internal__/utils/createStrictContext"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
const [StrictMenuProvider, useStrictMenuContext] = (0, _createStrictContext.default)({
|
|
10
|
+
name: "MenuContext",
|
|
11
|
+
errorMessage: "Carbon Menu: Context not found. Have you wrapped your Carbon subcomponents properly? See stack trace for more details.",
|
|
12
|
+
defaultValue: {
|
|
13
|
+
menuType: "light",
|
|
14
|
+
openSubmenuId: null,
|
|
15
|
+
setOpenSubmenuId: /* istanbul ignore next */() => {}
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
exports.useStrictMenuContext = useStrictMenuContext;
|
|
19
|
+
exports.StrictMenuProvider = StrictMenuProvider;
|
|
@@ -8,7 +8,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
8
8
|
var _menuItem = _interopRequireDefault(require("../../menu-item/menu-item.style"));
|
|
9
9
|
var _submenu = require("./submenu.style");
|
|
10
10
|
var _events = _interopRequireDefault(require("../../../../__internal__/utils/helpers/events"));
|
|
11
|
-
var
|
|
11
|
+
var _strictMenu = require("../strict-menu.context");
|
|
12
12
|
var _keyboardNavigation = require("../keyboard-navigation");
|
|
13
13
|
var _submenu2 = _interopRequireDefault(require("./submenu.context"));
|
|
14
14
|
var _guid = _interopRequireDefault(require("../../../../__internal__/utils/helpers/guid"));
|
|
@@ -42,13 +42,12 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
42
42
|
}, ref) => {
|
|
43
43
|
const [submenuRef, setSubmenuRef] = (0, _react.useState)(null);
|
|
44
44
|
const submenuId = (0, _react.useRef)((0, _guid.default)());
|
|
45
|
-
const menuContext = (0, _react.useContext)(_menu.default);
|
|
46
45
|
const {
|
|
47
46
|
inFullscreenView,
|
|
48
47
|
openSubmenuId,
|
|
49
48
|
setOpenSubmenuId,
|
|
50
49
|
menuType
|
|
51
|
-
} =
|
|
50
|
+
} = (0, _strictMenu.useStrictMenuContext)();
|
|
52
51
|
const [submenuOpen, setSubmenuOpen] = (0, _react.useState)(false);
|
|
53
52
|
const [submenuFocusId, setSubmenuFocusId] = (0, _react.useState)(null);
|
|
54
53
|
const [submenuItemIds, setSubmenuItemIds] = (0, _react.useState)([]);
|
|
@@ -274,7 +273,7 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
274
273
|
"data-component": "submenu-wrapper",
|
|
275
274
|
inFullscreenView: inFullscreenView,
|
|
276
275
|
asPassiveItem: asPassiveItem,
|
|
277
|
-
menuType:
|
|
276
|
+
menuType: menuType
|
|
278
277
|
}, /*#__PURE__*/_react.default.createElement(_menuItem.default, _extends({}, rest, {
|
|
279
278
|
onClick: asPassiveItem ? undefined : onClick,
|
|
280
279
|
className: className,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { default as Menu } from "./menu.component";
|
|
2
|
-
export type { MenuProps } from "./menu.
|
|
2
|
+
export type { MenuProps } from "./menu.types";
|
|
3
3
|
export { default as MenuItem } from "./menu-item";
|
|
4
4
|
export type { MenuWithIcon, MenuWithChildren } from "./menu-item";
|
|
5
5
|
export { default as MenuDivider } from "./menu-divider";
|
|
@@ -4,26 +4,26 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
var _react =
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
8
|
var _menuDivider = _interopRequireDefault(require("./menu-divider.style"));
|
|
9
|
-
var
|
|
10
|
-
var
|
|
9
|
+
var _strictMenu = require("../__internal__/strict-menu.context");
|
|
10
|
+
var _menu = require("../menu.style");
|
|
11
11
|
var _tags = _interopRequireDefault(require("../../../__internal__/utils/helpers/tags"));
|
|
12
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
13
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
16
14
|
const MenuDivider = /*#__PURE__*/_react.default.forwardRef(({
|
|
17
15
|
size = "default",
|
|
18
16
|
...rest
|
|
19
17
|
}, ref) => {
|
|
20
|
-
const
|
|
21
|
-
|
|
18
|
+
const {
|
|
19
|
+
menuType
|
|
20
|
+
} = (0, _strictMenu.useStrictMenuContext)();
|
|
21
|
+
return /*#__PURE__*/_react.default.createElement(_menu.StyledMenuItem, {
|
|
22
22
|
inSubmenu: true
|
|
23
23
|
}, /*#__PURE__*/_react.default.createElement(_menuDivider.default, _extends({
|
|
24
24
|
size: size
|
|
25
25
|
}, (0, _tags.default)("menu-divider", rest), {
|
|
26
|
-
menuType:
|
|
26
|
+
menuType: menuType,
|
|
27
27
|
ref: ref
|
|
28
28
|
})));
|
|
29
29
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MenuDividerProps } from "./menu-divider.component";
|
|
2
|
-
import { MenuType } from "../
|
|
2
|
+
import type { MenuType } from "../menu.types";
|
|
3
3
|
declare const StyledDivider: import("styled-components").StyledComponent<"div", any, MenuDividerProps & {
|
|
4
4
|
menuType: MenuType;
|
|
5
5
|
}, never>;
|
|
@@ -8,7 +8,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
8
8
|
var _reactTransitionGroup = require("react-transition-group");
|
|
9
9
|
var _menuFullScreen = require("./menu-full-screen.style");
|
|
10
10
|
var _menu = require("../menu.style");
|
|
11
|
-
var
|
|
11
|
+
var _strictMenu = require("../__internal__/strict-menu.context");
|
|
12
12
|
var _events = _interopRequireDefault(require("../../../__internal__/utils/helpers/events"));
|
|
13
13
|
var _box = _interopRequireDefault(require("../../box"));
|
|
14
14
|
var _iconButton = _interopRequireDefault(require("../../icon-button"));
|
|
@@ -39,7 +39,7 @@ const MenuFullscreen = ({
|
|
|
39
39
|
const isTopModal = (0, _useModalAria.default)(modalRef);
|
|
40
40
|
const {
|
|
41
41
|
menuType
|
|
42
|
-
} = (0,
|
|
42
|
+
} = (0, _strictMenu.useStrictMenuContext)();
|
|
43
43
|
const isDarkVariant = ["dark", "black"].includes(menuType);
|
|
44
44
|
const transitionDuration = 200;
|
|
45
45
|
const locale = (0, _useLocale.default)();
|
|
@@ -110,11 +110,10 @@ const MenuFullscreen = ({
|
|
|
110
110
|
flexDirection: "column",
|
|
111
111
|
role: "list",
|
|
112
112
|
inFullscreenView: true
|
|
113
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
113
|
+
}, /*#__PURE__*/_react.default.createElement(_strictMenu.StrictMenuProvider, {
|
|
114
114
|
value: {
|
|
115
115
|
inFullscreenView: true,
|
|
116
116
|
menuType,
|
|
117
|
-
inMenu: true,
|
|
118
117
|
openSubmenuId: null,
|
|
119
118
|
setOpenSubmenuId: /* istanbul ignore next */() => {}
|
|
120
119
|
}
|
|
@@ -10,11 +10,11 @@ var _focusTrapUtils = require("../../../__internal__/focus-trap/focus-trap-utils
|
|
|
10
10
|
var _utils = require("../../../style/utils");
|
|
11
11
|
var _menuItem = _interopRequireDefault(require("./menu-item.style"));
|
|
12
12
|
var _events = _interopRequireDefault(require("../../../__internal__/utils/helpers/events"));
|
|
13
|
-
var
|
|
13
|
+
var _strictMenu = require("../__internal__/strict-menu.context");
|
|
14
14
|
var _submenu = _interopRequireDefault(require("../__internal__/submenu/submenu.component"));
|
|
15
15
|
var _submenu2 = _interopRequireDefault(require("../__internal__/submenu/submenu.context"));
|
|
16
16
|
var _menuSegmentTitle = _interopRequireDefault(require("../menu-segment-title/menu-segment-title.context"));
|
|
17
|
-
var
|
|
17
|
+
var _menu = require("../menu.style");
|
|
18
18
|
var _guid = _interopRequireDefault(require("../../../__internal__/utils/helpers/guid"));
|
|
19
19
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
20
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
@@ -61,7 +61,7 @@ const MenuItem = ({
|
|
|
61
61
|
focusId,
|
|
62
62
|
updateFocusId,
|
|
63
63
|
menuType
|
|
64
|
-
} = (0,
|
|
64
|
+
} = (0, _strictMenu.useStrictMenuContext)();
|
|
65
65
|
const submenuContext = (0, _react.useContext)(_submenu2.default);
|
|
66
66
|
const isInSubmenu = Object.keys(submenuContext).length > 0;
|
|
67
67
|
const {
|
|
@@ -79,7 +79,7 @@ const MenuItem = ({
|
|
|
79
79
|
if (firstFocusable !== firstFocusableChild) {
|
|
80
80
|
setFirstFocusableChild(firstFocusable);
|
|
81
81
|
}
|
|
82
|
-
}, [ref]);
|
|
82
|
+
}, [firstFocusableChild, ref]);
|
|
83
83
|
(0, _react.useEffect)(() => {
|
|
84
84
|
const id = menuItemId.current;
|
|
85
85
|
|
|
@@ -102,7 +102,7 @@ const MenuItem = ({
|
|
|
102
102
|
}
|
|
103
103
|
ref?.focus();
|
|
104
104
|
}
|
|
105
|
-
}, [firstFocusableChild, focusFromMenu, focusFromSubmenu]);
|
|
105
|
+
}, [firstFocusableChild, focusFromMenu, focusFromSubmenu, ref]);
|
|
106
106
|
const handleFocus = event => {
|
|
107
107
|
if (isInSubmenu) {
|
|
108
108
|
event.stopPropagation();
|
|
@@ -138,7 +138,7 @@ const MenuItem = ({
|
|
|
138
138
|
const itemMaxWidth = !inFullscreenView ? maxWidth : undefined;
|
|
139
139
|
const asPassiveItem = !(onClick || href || firstFocusableChild);
|
|
140
140
|
if (submenu) {
|
|
141
|
-
return /*#__PURE__*/_react.default.createElement(
|
|
141
|
+
return /*#__PURE__*/_react.default.createElement(_menu.StyledMenuItem, _extends({
|
|
142
142
|
"data-component": "menu-item",
|
|
143
143
|
"data-element": dataElement,
|
|
144
144
|
"data-role": dataRole,
|
|
@@ -169,7 +169,7 @@ const MenuItem = ({
|
|
|
169
169
|
}
|
|
170
170
|
const paddingProps = (0, _utils.filterStyledSystemPaddingProps)(rest);
|
|
171
171
|
const hasInput = !!ref?.querySelector("[data-element='input']");
|
|
172
|
-
return /*#__PURE__*/_react.default.createElement(
|
|
172
|
+
return /*#__PURE__*/_react.default.createElement(_menu.StyledMenuItem, _extends({
|
|
173
173
|
"data-component": "menu-item",
|
|
174
174
|
"data-element": dataElement,
|
|
175
175
|
"data-role": dataRole,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { PaddingProps } from "styled-system";
|
|
3
|
-
import { MenuType } from "../__internal__/menu.context";
|
|
4
3
|
import { MenuWithChildren } from "./menu-item.component";
|
|
4
|
+
import type { MenuType } from "../menu.types";
|
|
5
5
|
interface StyledMenuItemWrapperProps extends Pick<MenuWithChildren, "href" | "showDropdownArrow" | "overrideColor" | "clickToOpen" | "maxWidth">, PaddingProps {
|
|
6
6
|
menuType: MenuType;
|
|
7
7
|
selected?: boolean;
|
|
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _menuSegmentTitle = require("./menu-segment-title.style");
|
|
9
|
-
var
|
|
10
|
-
var
|
|
9
|
+
var _strictMenu = require("../__internal__/strict-menu.context");
|
|
10
|
+
var _menu = require("../menu.style");
|
|
11
11
|
var _tags = _interopRequireDefault(require("../../../__internal__/utils/helpers/tags"));
|
|
12
12
|
var _submenu = _interopRequireDefault(require("../__internal__/submenu/submenu.context"));
|
|
13
13
|
var _menuSegmentTitle2 = _interopRequireDefault(require("./menu-segment-title.context"));
|
|
@@ -23,26 +23,29 @@ const MenuSegmentTitle = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
23
23
|
as = "h2",
|
|
24
24
|
...rest
|
|
25
25
|
}, ref) => {
|
|
26
|
-
const
|
|
26
|
+
const {
|
|
27
|
+
menuType,
|
|
28
|
+
inFullscreenView
|
|
29
|
+
} = (0, _strictMenu.useStrictMenuContext)();
|
|
27
30
|
const {
|
|
28
31
|
submenuHasMaxWidth
|
|
29
32
|
} = (0, _react.useContext)(_submenu.default);
|
|
30
|
-
const isChildOfFullscreenMenu =
|
|
33
|
+
const isChildOfFullscreenMenu = !!inFullscreenView;
|
|
31
34
|
const overriddenVariant = (0, _react.useMemo)(() => {
|
|
32
|
-
return isChildOfFullscreenMenu && variant === "alternate" && ["white", "black"].includes(
|
|
33
|
-
}, [isChildOfFullscreenMenu,
|
|
34
|
-
return /*#__PURE__*/_react.default.createElement(
|
|
35
|
+
return isChildOfFullscreenMenu && variant === "alternate" && ["white", "black"].includes(menuType) ? "default" : variant;
|
|
36
|
+
}, [isChildOfFullscreenMenu, menuType, variant]);
|
|
37
|
+
return /*#__PURE__*/_react.default.createElement(_menu.StyledMenuItem, {
|
|
35
38
|
inSubmenu: true
|
|
36
39
|
}, /*#__PURE__*/_react.default.createElement(_menuSegmentTitle.StyledTitle, _extends({
|
|
37
40
|
as: AS_VALUES.includes(as) ? as : /* istanbul ignore next */"h2"
|
|
38
41
|
}, (0, _tags.default)("menu-segment-title", rest), {
|
|
39
|
-
menuType:
|
|
42
|
+
menuType: menuType,
|
|
40
43
|
ref: ref,
|
|
41
44
|
variant: overriddenVariant,
|
|
42
45
|
shouldWrap: submenuHasMaxWidth
|
|
43
46
|
}), text), children && /*#__PURE__*/_react.default.createElement(_menuSegmentTitle.StyledSegmentChildren, {
|
|
44
47
|
"data-role": "menu-segment-children",
|
|
45
|
-
menuType:
|
|
48
|
+
menuType: menuType,
|
|
46
49
|
variant: overriddenVariant
|
|
47
50
|
}, /*#__PURE__*/_react.default.createElement(_menuSegmentTitle2.default.Provider, {
|
|
48
51
|
value: {
|
|
@@ -1,12 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
import { TagProps } from "../../__internal__/utils/helpers/tags";
|
|
4
|
-
import { MenuType } from "./__internal__/menu.context";
|
|
5
|
-
export interface MenuProps extends TagProps, Pick<LayoutProps, "width" | "minWidth" | "maxWidth" | "overflow" | "overflowX" | "verticalAlign">, FlexboxProps {
|
|
6
|
-
/** Children elements */
|
|
7
|
-
children: React.ReactNode;
|
|
8
|
-
/** Defines the color scheme of the component */
|
|
9
|
-
menuType?: MenuType;
|
|
10
|
-
}
|
|
2
|
+
import type { MenuProps } from "./menu.types";
|
|
11
3
|
export declare const Menu: ({ menuType, children, ...rest }: MenuProps) => React.JSX.Element;
|
|
12
4
|
export default Menu;
|
|
@@ -5,9 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.Menu = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
-
var _menu = require("./menu.style");
|
|
9
8
|
var _tags = _interopRequireDefault(require("../../__internal__/utils/helpers/tags"));
|
|
10
|
-
var
|
|
9
|
+
var _menu = require("./menu.style");
|
|
10
|
+
var _strictMenu = require("./__internal__/strict-menu.context");
|
|
11
|
+
var _menu2 = _interopRequireDefault(require("../menu/__internal__/menu.context"));
|
|
11
12
|
var _keyboardNavigation = require("./__internal__/keyboard-navigation");
|
|
12
13
|
var _locators = require("./__internal__/locators");
|
|
13
14
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -55,10 +56,9 @@ const Menu = ({
|
|
|
55
56
|
ref: ref,
|
|
56
57
|
role: "list",
|
|
57
58
|
onKeyDown: handleKeyDown
|
|
58
|
-
}), /*#__PURE__*/_react.default.createElement(
|
|
59
|
+
}), /*#__PURE__*/_react.default.createElement(_strictMenu.StrictMenuProvider, {
|
|
59
60
|
value: {
|
|
60
61
|
menuType,
|
|
61
|
-
inMenu: true,
|
|
62
62
|
openSubmenuId,
|
|
63
63
|
setOpenSubmenuId,
|
|
64
64
|
focusId,
|
|
@@ -66,7 +66,11 @@ const Menu = ({
|
|
|
66
66
|
registerItem,
|
|
67
67
|
unregisterItem
|
|
68
68
|
}
|
|
69
|
-
},
|
|
69
|
+
}, /*#__PURE__*/_react.default.createElement(_menu2.default.Provider, {
|
|
70
|
+
value: {
|
|
71
|
+
inMenu: true
|
|
72
|
+
}
|
|
73
|
+
}, children)));
|
|
70
74
|
};
|
|
71
75
|
exports.Menu = Menu;
|
|
72
76
|
var _default = exports.default = Menu;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FlexboxProps, LayoutProps, PaddingProps } from "styled-system";
|
|
2
|
-
import { MenuProps } from "./menu.
|
|
2
|
+
import type { MenuProps } from "./menu.types";
|
|
3
3
|
interface StyledMenuProps extends Pick<MenuProps, "menuType">, FlexboxProps, LayoutProps {
|
|
4
4
|
inFullscreenView?: boolean;
|
|
5
5
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { FlexboxProps, LayoutProps } from "styled-system";
|
|
3
|
+
import { TagProps } from "../../__internal__/utils/helpers/tags";
|
|
4
|
+
export type MenuType = "light" | "dark" | "white" | "black";
|
|
5
|
+
export interface MenuProps extends TagProps, Pick<LayoutProps, "width" | "minWidth" | "maxWidth" | "overflow" | "overflowX" | "verticalAlign">, FlexboxProps {
|
|
6
|
+
/** Children elements */
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** Defines the color scheme of the component */
|
|
9
|
+
menuType?: MenuType;
|
|
10
|
+
}
|
|
@@ -4,15 +4,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.ScrollableBlock = void 0;
|
|
7
|
-
var _react =
|
|
8
|
-
var
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _strictMenu = require("../__internal__/strict-menu.context");
|
|
9
9
|
var _menuItem = _interopRequireDefault(require("../menu-item"));
|
|
10
10
|
var _scrollableBlock = _interopRequireDefault(require("./scrollable-block.style"));
|
|
11
11
|
var _box = _interopRequireDefault(require("../../box"));
|
|
12
12
|
var _tags = _interopRequireDefault(require("../../../__internal__/utils/helpers/tags"));
|
|
13
13
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
15
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
14
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
17
15
|
const ScrollableBlock = ({
|
|
18
16
|
children,
|
|
@@ -24,7 +22,7 @@ const ScrollableBlock = ({
|
|
|
24
22
|
}) => {
|
|
25
23
|
const {
|
|
26
24
|
menuType
|
|
27
|
-
} = (0,
|
|
25
|
+
} = (0, _strictMenu.useStrictMenuContext)();
|
|
28
26
|
const scrollVariants = {
|
|
29
27
|
light: "light",
|
|
30
28
|
dark: "dark",
|
|
@@ -30,7 +30,7 @@ const VerticalDivider = ({
|
|
|
30
30
|
displayInline: displayInline
|
|
31
31
|
}, props, {
|
|
32
32
|
as: inMenu ? "li" : "div",
|
|
33
|
-
"aria-hidden": inMenu
|
|
33
|
+
"aria-hidden": inMenu || ariaHidden
|
|
34
34
|
}, (0, _tags.default)("vertical-divider", props)), /*#__PURE__*/_react.default.createElement(_verticalDivider.StyledDivider, {
|
|
35
35
|
"data-role": "divider",
|
|
36
36
|
tint: tint
|