carbon-react 114.13.1 → 114.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/esm/__internal__/input-icon-toggle/input-icon-toggle.component.js +2 -1
  2. package/esm/components/link/link.component.d.ts +2 -0
  3. package/esm/components/link/link.component.js +7 -1
  4. package/esm/components/menu/__internal__/keyboard-navigation/index.d.ts +4 -2
  5. package/esm/components/menu/__internal__/keyboard-navigation/index.js +16 -15
  6. package/esm/components/menu/__internal__/locators.d.ts +6 -0
  7. package/esm/components/menu/__internal__/locators.js +6 -0
  8. package/esm/components/menu/__internal__/submenu/submenu.component.js +109 -108
  9. package/esm/components/menu/menu-full-screen/menu-full-screen.component.js +1 -2
  10. package/esm/components/menu/menu-item/index.js +0 -1
  11. package/esm/components/menu/menu-item/menu-item.component.js +77 -51
  12. package/esm/components/menu/menu-item/menu-item.d.ts +7 -3
  13. package/esm/components/menu/menu.component.js +33 -37
  14. package/esm/components/menu/menu.context.d.ts +2 -2
  15. package/esm/components/menu/menu.context.js +2 -2
  16. package/esm/components/menu/scrollable-block/scrollable-block.component.js +6 -24
  17. package/lib/__internal__/input-icon-toggle/input-icon-toggle.component.js +2 -1
  18. package/lib/components/link/link.component.d.ts +2 -0
  19. package/lib/components/link/link.component.js +7 -1
  20. package/lib/components/menu/__internal__/keyboard-navigation/index.d.ts +4 -2
  21. package/lib/components/menu/__internal__/keyboard-navigation/index.js +16 -15
  22. package/lib/components/menu/__internal__/locators.d.ts +6 -0
  23. package/lib/components/menu/__internal__/locators.js +18 -0
  24. package/lib/components/menu/__internal__/submenu/submenu.component.js +111 -113
  25. package/lib/components/menu/menu-full-screen/menu-full-screen.component.js +1 -2
  26. package/lib/components/menu/menu-item/menu-item.component.js +76 -52
  27. package/lib/components/menu/menu-item/menu-item.d.ts +7 -3
  28. package/lib/components/menu/menu.component.js +33 -37
  29. package/lib/components/menu/menu.context.d.ts +2 -2
  30. package/lib/components/menu/menu.context.js +2 -2
  31. package/lib/components/menu/scrollable-block/scrollable-block.component.js +6 -25
  32. package/package.json +1 -1
@@ -19,11 +19,11 @@ var _propTypes2 = _interopRequireDefault(require("@styled-system/prop-types"));
19
19
 
20
20
  var _menu = require("./menu.style");
21
21
 
22
- var _keyboardNavigation = require("./__internal__/keyboard-navigation");
22
+ var _menu2 = _interopRequireDefault(require("./menu.context"));
23
23
 
24
- var _events = _interopRequireDefault(require("../../__internal__/utils/helpers/events"));
24
+ var _keyboardNavigation = require("./__internal__/keyboard-navigation");
25
25
 
26
- var _menu2 = _interopRequireDefault(require("./menu.context"));
26
+ var _locators = require("./__internal__/locators");
27
27
 
28
28
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
29
 
@@ -38,52 +38,48 @@ const Menu = ({
38
38
  children,
39
39
  ...rest
40
40
  }) => {
41
- const [focusedItemIndex, setFocusedItemIndex] = (0, _react.useState)(undefined);
42
- const [openSubmenuIndex, setOpenSubmenuIndex] = (0, _react.useState)(null);
41
+ const [openSubmenuId, setOpenSubmenuId] = (0, _react.useState)(null);
43
42
  const ref = (0, _react.useRef)();
44
- const handleKeyDown = (0, _react.useCallback)(event => {
45
- const newIndex = (0, _keyboardNavigation.menuKeyboardNavigation)(event, _react.default.Children.toArray(children));
46
- setFocusedItemIndex(newIndex);
47
- }, [children]);
48
- const onClickOutside = (0, _react.useCallback)(event => {
49
- // Reset the state of the menu when clicking elsewhere
50
- if (!_events.default.composedPath(event).includes(ref.current)) {
51
- setFocusedItemIndex(undefined);
52
- document.removeEventListener("click", onClickOutside);
53
- }
43
+ const [focusId, setFocusId] = (0, _react.useState)(undefined);
44
+ const [itemIds, setItemIds] = (0, _react.useState)([]);
45
+ const registerItem = (0, _react.useCallback)(id => {
46
+ setItemIds(prevState => {
47
+ return [...prevState, id];
48
+ });
49
+ }, []);
50
+ const unregisterItem = (0, _react.useCallback)(id => {
51
+ setItemIds(prevState => {
52
+ return prevState.filter(itemId => itemId !== id);
53
+ });
54
54
  }, []);
55
- (0, _react.useEffect)(() => {
56
- document.addEventListener("click", onClickOutside);
57
- return function cleanup() {
58
- document.removeEventListener("click", onClickOutside);
59
- };
60
- });
55
+
56
+ const handleKeyDown = event => {
57
+ /* istanbul ignore else */
58
+ if (ref.current) {
59
+ const focusableItems = Array.from(ref.current.querySelectorAll(_locators.MENU_ITEM_CHILDREN_LOCATOR));
60
+ const newIndex = (0, _keyboardNavigation.menuKeyboardNavigation)(event, focusableItems);
61
+ setFocusId(itemIds[newIndex]);
62
+ }
63
+ };
64
+
61
65
  return /*#__PURE__*/_react.default.createElement(_menu.StyledMenuWrapper, _extends({
62
66
  "data-component": "menu",
63
67
  menuType: menuType
64
68
  }, rest, {
65
69
  ref: ref,
66
- role: "list"
70
+ role: "list",
71
+ onKeyDown: handleKeyDown
67
72
  }), /*#__PURE__*/_react.default.createElement(_menu2.default.Provider, {
68
73
  value: {
69
74
  menuType,
70
- handleKeyDown,
71
75
  inMenu: true,
72
- openSubmenuIndex,
73
- setOpenSubmenuIndex
76
+ openSubmenuId,
77
+ setOpenSubmenuId,
78
+ focusId,
79
+ registerItem,
80
+ unregisterItem
74
81
  }
75
- }, _react.default.Children.map(children, (child, index) => {
76
- const isFocused = focusedItemIndex === index;
77
-
78
- if ( /*#__PURE__*/_react.default.isValidElement(child) && child.type.displayName === "MenuItem" && child.props.submenu) {
79
- return /*#__PURE__*/_react.default.cloneElement(child, {
80
- isFocused,
81
- indexInMenu: index
82
- });
83
- }
84
-
85
- return child;
86
- })));
82
+ }, children));
87
83
  };
88
84
 
89
85
  Menu.propTypes = {
@@ -1,8 +1,8 @@
1
1
  declare var _default: React.Context<{
2
2
  menuType: string;
3
3
  inMenu: boolean;
4
- openSubmenuIndex: null;
5
- setOpenSubmenuIndex: () => void;
4
+ openSubmenuId: null;
5
+ setOpenSubmenuId: () => void;
6
6
  }>;
7
7
  export default _default;
8
8
  import React from "react";
@@ -12,8 +12,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
12
12
  var _default = /*#__PURE__*/_react.default.createContext({
13
13
  menuType: "light",
14
14
  inMenu: false,
15
- openSubmenuIndex: null,
16
- setOpenSubmenuIndex:
15
+ openSubmenuId: null,
16
+ setOpenSubmenuId:
17
17
  /* istanbul ignore next */
18
18
  () => {}
19
19
  });
@@ -13,8 +13,6 @@ var _menu = _interopRequireDefault(require("../menu.context"));
13
13
 
14
14
  var _menuItem = _interopRequireDefault(require("../menu-item"));
15
15
 
16
- var _submenu = _interopRequireDefault(require("../__internal__/submenu/submenu.context"));
17
-
18
16
  var _scrollableBlock = _interopRequireDefault(require("./scrollable-block.style"));
19
17
 
20
18
  var _box = _interopRequireDefault(require("../../box"));
@@ -35,13 +33,9 @@ const ScrollableBlock = ({
35
33
  parentVariant,
36
34
  ...rest
37
35
  }) => {
38
- const menuContext = (0, _react.useContext)(_menu.default);
39
- const submenuContext = (0, _react.useContext)(_submenu.default);
40
36
  const {
41
- blockIndex,
42
- focusIndex,
43
- handleKeyDown
44
- } = submenuContext;
37
+ menuType
38
+ } = (0, _react.useContext)(_menu.default);
45
39
  const scrollVariants = {
46
40
  light: "light",
47
41
  dark: "dark",
@@ -50,35 +44,22 @@ const ScrollableBlock = ({
50
44
  };
51
45
  return /*#__PURE__*/_react.default.createElement(_scrollableBlock.default, _extends({
52
46
  "data-component": "submenu-scrollable-block",
53
- menuType: menuContext.menuType,
47
+ menuType: menuType,
54
48
  variant: variant
55
49
  }, rest), parent && /*#__PURE__*/_react.default.createElement(_menuItem.default, {
50
+ "data-component": "scrollable-block-parent",
56
51
  overrideColor: true,
57
52
  variant: parentVariant,
58
53
  as: "div",
59
54
  href: "#"
60
55
  }, parent), /*#__PURE__*/_react.default.createElement(_box.default, {
61
56
  overflowY: "scroll",
62
- scrollVariant: scrollVariants[menuContext.menuType],
57
+ scrollVariant: scrollVariants[menuType],
63
58
  height: height,
64
59
  p: 0,
65
60
  as: "ul",
66
61
  role: "list"
67
- }, _react.default.Children.map(children, (child, index) => {
68
- let isFocused = false;
69
- const blockItemFocused = focusIndex >= blockIndex;
70
-
71
- if (blockItemFocused) {
72
- isFocused = focusIndex - blockIndex === index;
73
- }
74
-
75
- return /*#__PURE__*/_react.default.createElement(_submenu.default.Provider, {
76
- value: {
77
- isFocused,
78
- handleKeyDown
79
- }
80
- }, child);
81
- })));
62
+ }, children));
82
63
  };
83
64
 
84
65
  ScrollableBlock.propTypes = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "carbon-react",
3
- "version": "114.13.1",
3
+ "version": "114.13.2",
4
4
  "description": "A library of reusable React components for easily building user interfaces.",
5
5
  "files": [
6
6
  "lib",