carbon-react 117.5.0 → 117.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/esm/__internal__/input/input.component.d.ts +3 -3
  2. package/esm/components/advanced-color-picker/advanced-color-picker.component.js +8 -0
  3. package/esm/components/button-toggle/button-toggle.component.js +7 -0
  4. package/esm/components/checkbox/checkbox.component.js +6 -0
  5. package/esm/components/decimal/decimal.component.js +7 -0
  6. package/esm/components/grouped-character/grouped-character.component.js +6 -0
  7. package/esm/components/menu/__internal__/locators.d.ts +6 -6
  8. package/esm/components/menu/__internal__/spec-helper/index.d.ts +3 -0
  9. package/esm/components/menu/__internal__/submenu/index.d.ts +2 -0
  10. package/esm/components/menu/__internal__/submenu/index.js +1 -0
  11. package/esm/components/menu/__internal__/submenu/submenu.component.d.ts +42 -0
  12. package/esm/components/menu/__internal__/submenu/submenu.component.js +162 -85
  13. package/esm/components/menu/__internal__/submenu/submenu.context.d.ts +10 -0
  14. package/esm/components/menu/__internal__/submenu/submenu.style.d.ts +16 -0
  15. package/esm/components/menu/__internal__/submenu/submenu.style.js +4 -4
  16. package/esm/components/menu/index.d.ts +12 -6
  17. package/esm/components/menu/index.js +5 -5
  18. package/esm/components/menu/menu-divider/index.d.ts +2 -2
  19. package/esm/components/menu/menu-divider/index.js +1 -0
  20. package/esm/components/menu/menu-divider/menu-divider.component.d.ts +7 -0
  21. package/esm/components/menu/menu-divider/menu-divider.component.js +14 -7
  22. package/esm/components/menu/menu-divider/menu-divider.style.d.ts +6 -0
  23. package/esm/components/menu/menu-full-screen/index.d.ts +2 -2
  24. package/esm/components/menu/menu-full-screen/menu-full-screen.component.d.ts +14 -0
  25. package/esm/components/menu/menu-full-screen/menu-full-screen.component.js +20 -30
  26. package/esm/components/menu/menu-full-screen/menu-full-screen.style.d.ts +8 -0
  27. package/esm/components/menu/menu-full-screen/menu-full-screen.style.js +29 -27
  28. package/esm/components/menu/menu-item/index.d.ts +2 -2
  29. package/esm/components/menu/menu-item/menu-item.component.d.ts +67 -0
  30. package/esm/components/menu/menu-item/menu-item.component.js +2084 -121
  31. package/esm/components/menu/menu-item/menu-item.style.d.ts +21 -0
  32. package/esm/components/menu/menu-item/menu-item.style.js +188 -146
  33. package/esm/components/menu/menu-segment-title/index.d.ts +2 -2
  34. package/esm/components/menu/menu-segment-title/index.js +1 -0
  35. package/esm/components/menu/menu-segment-title/menu-segment-title.component.d.ts +10 -0
  36. package/esm/components/menu/menu-segment-title/menu-segment-title.component.js +13 -9
  37. package/esm/components/menu/menu-segment-title/menu-segment-title.style.d.ts +8 -0
  38. package/esm/components/menu/menu.component.d.ts +11 -9
  39. package/esm/components/menu/menu.component.js +1887 -18
  40. package/esm/components/menu/menu.config.d.ts +58 -94
  41. package/esm/components/menu/menu.context.d.ts +12 -6
  42. package/esm/components/menu/menu.style.d.ts +12 -2
  43. package/esm/components/menu/menu.style.js +11 -11
  44. package/esm/components/menu/scrollable-block/index.d.ts +2 -1
  45. package/esm/components/menu/scrollable-block/scrollable-block.component.d.ts +19 -0
  46. package/esm/components/menu/scrollable-block/scrollable-block.component.js +13 -20
  47. package/esm/components/menu/scrollable-block/scrollable-block.style.d.ts +8 -0
  48. package/esm/components/number/number.component.js +6 -0
  49. package/esm/components/numeral-date/numeral-date.component.js +8 -0
  50. package/esm/components/radio-button/radio-button-group.component.js +8 -0
  51. package/esm/components/radio-button/radio-button.style.js +1 -1
  52. package/esm/components/search/search.component.js +6 -0
  53. package/esm/components/select/filterable-select/filterable-select.component.js +9 -1
  54. package/esm/components/select/multi-select/multi-select.component.js +9 -1
  55. package/esm/components/select/simple-select/simple-select.component.js +9 -1
  56. package/esm/components/simple-color-picker/simple-color-picker.component.js +8 -0
  57. package/esm/components/switch/switch.component.js +6 -0
  58. package/esm/components/textarea/textarea.component.js +6 -0
  59. package/esm/components/textbox/textbox.component.js +6 -0
  60. package/lib/__internal__/input/input.component.d.ts +3 -3
  61. package/lib/components/advanced-color-picker/advanced-color-picker.component.js +11 -0
  62. package/lib/components/button-toggle/button-toggle.component.js +10 -0
  63. package/lib/components/checkbox/checkbox.component.js +7 -0
  64. package/lib/components/decimal/decimal.component.js +8 -0
  65. package/lib/components/grouped-character/grouped-character.component.js +7 -0
  66. package/lib/components/menu/__internal__/locators.d.ts +6 -6
  67. package/lib/components/menu/__internal__/spec-helper/index.d.ts +3 -0
  68. package/lib/components/menu/__internal__/submenu/index.d.ts +2 -0
  69. package/lib/components/menu/__internal__/submenu/index.js +15 -0
  70. package/lib/components/menu/__internal__/submenu/package.json +6 -0
  71. package/lib/components/menu/__internal__/submenu/submenu.component.d.ts +42 -0
  72. package/lib/components/menu/__internal__/submenu/submenu.component.js +162 -86
  73. package/lib/components/menu/__internal__/submenu/submenu.context.d.ts +10 -0
  74. package/lib/components/menu/__internal__/submenu/submenu.style.d.ts +16 -0
  75. package/lib/components/menu/__internal__/submenu/submenu.style.js +4 -4
  76. package/lib/components/menu/index.d.ts +12 -6
  77. package/lib/components/menu/index.js +5 -5
  78. package/lib/components/menu/menu-divider/index.d.ts +2 -2
  79. package/lib/components/menu/menu-divider/index.js +15 -0
  80. package/lib/components/menu/menu-divider/menu-divider.component.d.ts +7 -0
  81. package/lib/components/menu/menu-divider/menu-divider.component.js +15 -7
  82. package/lib/components/menu/menu-divider/menu-divider.style.d.ts +6 -0
  83. package/lib/components/menu/menu-divider/package.json +6 -0
  84. package/lib/components/menu/menu-full-screen/index.d.ts +2 -2
  85. package/lib/components/menu/menu-full-screen/menu-full-screen.component.d.ts +14 -0
  86. package/lib/components/menu/menu-full-screen/menu-full-screen.component.js +22 -31
  87. package/lib/components/menu/menu-full-screen/menu-full-screen.style.d.ts +8 -0
  88. package/lib/components/menu/menu-full-screen/menu-full-screen.style.js +30 -28
  89. package/lib/components/menu/menu-item/index.d.ts +2 -2
  90. package/lib/components/menu/menu-item/menu-item.component.d.ts +67 -0
  91. package/lib/components/menu/menu-item/menu-item.component.js +2085 -122
  92. package/lib/components/menu/menu-item/menu-item.style.d.ts +21 -0
  93. package/lib/components/menu/menu-item/menu-item.style.js +191 -146
  94. package/lib/components/menu/menu-segment-title/index.d.ts +2 -2
  95. package/lib/components/menu/menu-segment-title/index.js +15 -0
  96. package/lib/components/menu/menu-segment-title/menu-segment-title.component.d.ts +10 -0
  97. package/lib/components/menu/menu-segment-title/menu-segment-title.component.js +14 -9
  98. package/lib/components/menu/menu-segment-title/menu-segment-title.style.d.ts +8 -0
  99. package/lib/components/menu/menu-segment-title/package.json +6 -0
  100. package/lib/components/menu/menu.component.d.ts +11 -9
  101. package/lib/components/menu/menu.component.js +1889 -20
  102. package/lib/components/menu/menu.config.d.ts +58 -94
  103. package/lib/components/menu/menu.context.d.ts +12 -6
  104. package/lib/components/menu/menu.style.d.ts +12 -2
  105. package/lib/components/menu/menu.style.js +12 -12
  106. package/lib/components/menu/scrollable-block/index.d.ts +2 -1
  107. package/lib/components/menu/scrollable-block/scrollable-block.component.d.ts +19 -0
  108. package/lib/components/menu/scrollable-block/scrollable-block.component.js +15 -21
  109. package/lib/components/menu/scrollable-block/scrollable-block.style.d.ts +8 -0
  110. package/lib/components/number/number.component.js +7 -0
  111. package/lib/components/numeral-date/numeral-date.component.js +10 -0
  112. package/lib/components/radio-button/radio-button-group.component.js +11 -0
  113. package/lib/components/radio-button/radio-button.style.js +1 -1
  114. package/lib/components/search/search.component.js +7 -0
  115. package/lib/components/select/filterable-select/filterable-select.component.js +10 -1
  116. package/lib/components/select/multi-select/multi-select.component.js +10 -1
  117. package/lib/components/select/simple-select/simple-select.component.js +10 -1
  118. package/lib/components/simple-color-picker/simple-color-picker.component.js +11 -0
  119. package/lib/components/switch/switch.component.js +7 -0
  120. package/lib/components/textarea/textarea.component.js +7 -0
  121. package/lib/components/textbox/textbox.component.js +7 -0
  122. package/package.json +2 -2
  123. package/esm/components/menu/menu-divider/menu-divider.d.ts +0 -11
  124. package/esm/components/menu/menu-full-screen/menu-full-screen.d.ts +0 -16
  125. package/esm/components/menu/menu-item/menu-item.d.ts +0 -60
  126. package/esm/components/menu/menu-segment-title/menu-segment-title.d.ts +0 -12
  127. package/esm/components/menu/menu.d.ts +0 -28
  128. package/esm/components/menu/scrollable-block/scrollable-block.d.ts +0 -20
  129. package/lib/components/menu/menu-divider/menu-divider.d.ts +0 -11
  130. package/lib/components/menu/menu-full-screen/menu-full-screen.d.ts +0 -16
  131. package/lib/components/menu/menu-item/menu-item.d.ts +0 -60
  132. package/lib/components/menu/menu-segment-title/menu-segment-title.d.ts +0 -12
  133. package/lib/components/menu/menu.d.ts +0 -28
  134. package/lib/components/menu/scrollable-block/scrollable-block.d.ts +0 -20
@@ -21,12 +21,16 @@ var _buttonToggleInput = _interopRequireDefault(require("./button-toggle-input.c
21
21
 
22
22
  var _inputBehaviour = require("../../__internal__/input-behaviour");
23
23
 
24
+ var _logger = _interopRequireDefault(require("../../__internal__/utils/logger"));
25
+
24
26
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
27
 
26
28
  function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
27
29
 
28
30
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
31
 
32
+ let deprecateUncontrolledWarnTriggered = false;
33
+
30
34
  const ButtonToggle = ({
31
35
  "aria-label": ariaLabel,
32
36
  "aria-labelledby": ariaLabelledBy,
@@ -70,6 +74,12 @@ const ButtonToggle = ({
70
74
  (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
71
75
  }
72
76
 
77
+ if (!deprecateUncontrolledWarnTriggered && !onChange) {
78
+ deprecateUncontrolledWarnTriggered = true;
79
+
80
+ _logger.default.deprecate("Uncontrolled behaviour in `Button Toggle` is deprecated and support will soon be removed. Please make sure all your inputs are controlled.");
81
+ }
82
+
73
83
  return /*#__PURE__*/_react.default.createElement(_buttonToggle.StyledButtonToggle, {
74
84
  "data-component": dataComponent || "button-toggle",
75
85
  "data-element": dataElement,
@@ -34,6 +34,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
34
34
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
35
35
 
36
36
  let deprecateInputRefWarnTriggered = false;
37
+ let deprecateUncontrolledWarnTriggered = false;
37
38
 
38
39
  const Checkbox = /*#__PURE__*/_react.default.forwardRef(({
39
40
  "aria-labelledby": ariaLabelledBy,
@@ -86,6 +87,12 @@ const Checkbox = /*#__PURE__*/_react.default.forwardRef(({
86
87
  _logger.default.deprecate("The `inputRef` prop in `Checkbox` component is deprecated and will soon be removed. Please use `ref` instead.");
87
88
  }
88
89
 
90
+ if (!deprecateUncontrolledWarnTriggered && !onChange) {
91
+ deprecateUncontrolledWarnTriggered = true;
92
+
93
+ _logger.default.deprecate("Uncontrolled behaviour in `Checkbox` is deprecated and support will soon be removed. Please make sure all your inputs are controlled.");
94
+ }
95
+
89
96
  const inputProps = {
90
97
  ariaLabelledBy,
91
98
  onClick,
@@ -28,6 +28,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
28
28
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
29
29
 
30
30
  let deprecateInputRefWarnTriggered = false;
31
+ let deprecateUncontrolledWarnTriggered = false;
31
32
 
32
33
  const Decimal = /*#__PURE__*/_react.default.forwardRef(({
33
34
  align = "right",
@@ -214,6 +215,13 @@ const Decimal = /*#__PURE__*/_react.default.forwardRef(({
214
215
  }
215
216
  }
216
217
  }, [emptyValue, formatValue, getSafeValueProp, isControlled, prevValue, stateValue, toStandardDecimal, value]);
218
+
219
+ if (!deprecateUncontrolledWarnTriggered && !isControlled) {
220
+ deprecateUncontrolledWarnTriggered = true;
221
+
222
+ _logger.default.deprecate("Uncontrolled behaviour in `Decimal` is deprecated and support will soon be removed. Please make sure all your inputs are controlled.");
223
+ }
224
+
217
225
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_textbox.default, _extends({
218
226
  onKeyPress: onKeyPress,
219
227
  align: align,
@@ -41,6 +41,7 @@ const buildCustomTarget = ({
41
41
  };
42
42
 
43
43
  let deprecateInputRefWarnTriggered = false;
44
+ let deprecateUncontrolledWarnTriggered = false;
44
45
 
45
46
  const GroupedCharacter = /*#__PURE__*/_react.default.forwardRef(({
46
47
  defaultValue,
@@ -64,6 +65,12 @@ const GroupedCharacter = /*#__PURE__*/_react.default.forwardRef(({
64
65
  _logger.default.deprecate("The `inputRef` prop in `GroupedCharacter` component is deprecated and will soon be removed. Please use `ref` instead.");
65
66
  }
66
67
 
68
+ if (!deprecateUncontrolledWarnTriggered && !isControlled) {
69
+ deprecateUncontrolledWarnTriggered = true;
70
+
71
+ _logger.default.deprecate("Uncontrolled behaviour in `Grouped Character` is deprecated and support will soon be removed. Please make sure all your inputs are controlled.");
72
+ }
73
+
67
74
  const formatValue = val => (0, _groupedCharacter.generateGroups)(groups, val).join(separator);
68
75
 
69
76
  const sanitizeValue = val => val.split(separator).join("").substring(0, maxRawLength);
@@ -1,6 +1,6 @@
1
- export const MENU_ITEM: "menu-item";
2
- export const SCROLLABLE_BLOCK: "submenu-scrollable-block";
3
- export const SCROLLABLE_BLOCK_PARENT: "scrollable-block-parent";
4
- export const ALL_CHILDREN_SELECTOR: string;
5
- export const BLOCK_INDEX_SELECTOR: string;
6
- export const MENU_ITEM_CHILDREN_LOCATOR: string;
1
+ export declare const MENU_ITEM = "menu-item";
2
+ export declare const SCROLLABLE_BLOCK = "submenu-scrollable-block";
3
+ export declare const SCROLLABLE_BLOCK_PARENT = "scrollable-block-parent";
4
+ export declare const ALL_CHILDREN_SELECTOR: string;
5
+ export declare const BLOCK_INDEX_SELECTOR: string;
6
+ export declare const MENU_ITEM_CHILDREN_LOCATOR: string;
@@ -0,0 +1,3 @@
1
+ import { ReactWrapper } from "enzyme";
2
+ declare const openSubmenu: (wrapper: ReactWrapper, index?: number) => void;
3
+ export default openSubmenu;
@@ -0,0 +1,2 @@
1
+ export { default } from "./submenu.component";
2
+ export type { SubmenuProps } from "./submenu.component";
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "default", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _submenu.default;
10
+ }
11
+ });
12
+
13
+ var _submenu = _interopRequireDefault(require("./submenu.component"));
14
+
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "../../../../../esm/components/menu/__internal__/submenu/index.js",
4
+ "main": "./index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -0,0 +1,42 @@
1
+ import React from "react";
2
+ import { MaxWidthProps } from "styled-system";
3
+ import { VariantType } from "../../menu-item";
4
+ export interface SubmenuProps {
5
+ /** Children elements */
6
+ children: React.ReactNode;
7
+ /** Custom className */
8
+ className?: string;
9
+ /**
10
+ * * <a href="https://brand.sage.com/d/NdbrveWvNheA/foundations#/icons/icons" target="_blank">List of supported icons</a>
11
+ *
12
+ * Adds an icon to the menu item.
13
+ * */
14
+ icon?: string;
15
+ /** Defines which direction the submenu will hang eg. left/right */
16
+ submenuDirection?: string;
17
+ /** A title for the menu item that has a submenu. */
18
+ title?: string;
19
+ /** onKeyDown handler */
20
+ onKeyDown?: (event: React.KeyboardEvent<HTMLAnchorElement> | React.KeyboardEvent<HTMLButtonElement>) => void;
21
+ /** set the colour variant for a menuType */
22
+ variant?: VariantType;
23
+ /** Flag to display the dropdown arrow when an item has a submenu */
24
+ showDropdownArrow?: boolean;
25
+ /** When set the submenu opens by click instead of hover */
26
+ clickToOpen?: boolean;
27
+ /** The href to use for the menu item. */
28
+ href?: string;
29
+ /** Maximum width. Any valid CSS string */
30
+ maxWidth?: MaxWidthProps["maxWidth"];
31
+ /** Used to set a submenu parent to passive styling in MenuFullscreen */
32
+ asPassiveItem?: boolean;
33
+ /** Callback triggered when submenu opens. Only valid with submenu prop */
34
+ onSubmenuOpen?: () => void;
35
+ /** Callback triggered when submenu closes. Only valid with submenu prop */
36
+ onSubmenuClose?: () => void;
37
+ /** Callback triggered when the top-level menu item is clicked */
38
+ onClick?: (event: React.MouseEvent<HTMLAnchorElement> | React.MouseEvent<HTMLButtonElement>) => void;
39
+ ariaLabel?: string;
40
+ }
41
+ declare const Submenu: React.ForwardRefExoticComponent<SubmenuProps & React.RefAttributes<HTMLAnchorElement & HTMLButtonElement & HTMLDivElement>>;
42
+ export default Submenu;
@@ -13,8 +13,6 @@ var _menuItem = _interopRequireDefault(require("../../menu-item/menu-item.style"
13
13
 
14
14
  var _submenu = require("./submenu.style");
15
15
 
16
- var _link = _interopRequireDefault(require("../../../link"));
17
-
18
16
  var _events = _interopRequireDefault(require("../../../../__internal__/utils/helpers/events"));
19
17
 
20
18
  var _menu = _interopRequireDefault(require("../../menu.context"));
@@ -61,7 +59,8 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
61
59
  const {
62
60
  inFullscreenView,
63
61
  openSubmenuId,
64
- setOpenSubmenuId
62
+ setOpenSubmenuId,
63
+ menuType
65
64
  } = menuContext;
66
65
  const [submenuOpen, setSubmenuOpen] = (0, _react.useState)(false);
67
66
  const [submenuFocusId, setSubmenuFocusId] = (0, _react.useState)(null);
@@ -69,37 +68,35 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
69
68
  const [characterString, setCharacterString] = (0, _react.useState)("");
70
69
  const shiftTabPressed = (0, _react.useRef)(false);
71
70
  const focusFirstMenuItemOnOpen = (0, _react.useRef)(false);
72
- const registerItem = (0, _react.useCallback)(id => {
73
- setSubmenuItemIds(prevState => {
74
- return [...prevState, id];
75
- });
76
- }, []);
77
- const unregisterItem = (0, _react.useCallback)(id => {
78
- setSubmenuItemIds(prevState => {
79
- return prevState.filter(itemId => itemId !== id);
80
- });
81
- }, []);
82
71
  const numberOfChildren = submenuItemIds.length;
83
72
  const blockIndex = (0, _react.useMemo)(() => {
84
- if (submenuOpen && numberOfChildren) {
85
- var _submenuRef$current, _submenuRef$current2;
73
+ var _submenuRef$current;
74
+
75
+ const items = (_submenuRef$current = submenuRef.current) === null || _submenuRef$current === void 0 ? void 0 : _submenuRef$current.querySelectorAll(_locators.BLOCK_INDEX_SELECTOR);
76
+
77
+ if (items && submenuOpen && numberOfChildren) {
78
+ var _submenuRef$current2;
86
79
 
87
- const childrenArray = Array.from((_submenuRef$current = submenuRef.current) === null || _submenuRef$current === void 0 ? void 0 : _submenuRef$current.querySelectorAll(_locators.BLOCK_INDEX_SELECTOR));
80
+ const childrenArray = Array.from(items);
88
81
  const scrollableBlock = (_submenuRef$current2 = submenuRef.current) === null || _submenuRef$current2 === void 0 ? void 0 : _submenuRef$current2.querySelector(`[data-component='${_locators.SCROLLABLE_BLOCK}']`);
89
- const index = childrenArray.indexOf(scrollableBlock);
82
+ const index = scrollableBlock ? childrenArray.indexOf(scrollableBlock) : -1;
90
83
  return scrollableBlock !== null && scrollableBlock !== void 0 && scrollableBlock.querySelector(`[data-component='${_locators.SCROLLABLE_BLOCK_PARENT}']`) ? index + 1 : index;
91
84
  }
92
85
 
93
86
  return -1;
94
87
  }, [submenuOpen, numberOfChildren]);
95
- const characterTimer = (0, _react.useRef)();
88
+ const characterTimer = (0, _react.useRef)(null);
96
89
  const startCharacterTimeout = (0, _react.useCallback)(() => {
97
90
  characterTimer.current = setTimeout(() => {
98
91
  setCharacterString("");
99
92
  }, 1500);
100
93
  }, []);
101
94
  const restartCharacterTimeout = (0, _react.useCallback)(() => {
102
- clearTimeout(characterTimer.current);
95
+ /* istanbul ignore else */
96
+ if (characterTimer.current) {
97
+ clearTimeout(characterTimer.current);
98
+ }
99
+
103
100
  startCharacterTimeout();
104
101
  }, [startCharacterTimeout]);
105
102
  const openSubmenu = (0, _react.useCallback)(() => {
@@ -190,7 +187,7 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
190
187
  }
191
188
 
192
189
  if (_events.default.isEscKey(event)) {
193
- onKeyDown(event);
190
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
194
191
  closeSubmenu();
195
192
  return;
196
193
  }
@@ -238,6 +235,19 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
238
235
  }
239
236
  }
240
237
  }, [submenuItemIds, submenuOpen, href, numberOfChildren, submenuFocusId, findCurrentIndex, openSubmenu, closeSubmenu, onKeyDown, characterString, restartCharacterTimeout, startCharacterTimeout]);
238
+ (0, _react.useEffect)(() => {
239
+ /* istanbul ignore else */
240
+ if (submenuRef.current && children) {
241
+ var _submenuRef$current3;
242
+
243
+ const items = (_submenuRef$current3 = submenuRef.current) === null || _submenuRef$current3 === void 0 ? void 0 : _submenuRef$current3.querySelectorAll(_locators.ALL_CHILDREN_SELECTOR);
244
+ /* istanbul ignore else */
245
+
246
+ if (items) {
247
+ setSubmenuItemIds(Array.from(items).map(item => item.getAttribute("id")));
248
+ }
249
+ }
250
+ }, [children, submenuOpen]);
241
251
  (0, _react.useEffect)(() => {
242
252
  if (focusFirstMenuItemOnOpen.current && submenuOpen && !submenuFocusId && submenuItemIds.length) {
243
253
  focusFirstMenuItemOnOpen.current = false;
@@ -250,6 +260,8 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
250
260
  closeSubmenu();
251
261
  };
252
262
 
263
+ const handleClickInside = (0, _useClickAwayListener.default)(handleClickAway);
264
+
253
265
  const handleClick = event => {
254
266
  openSubmenu();
255
267
 
@@ -259,10 +271,12 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
259
271
  };
260
272
 
261
273
  (0, _react.useEffect)(() => {
262
- if (characterString !== "") {
263
- var _submenuRef$current3;
274
+ var _submenuRef$current4;
275
+
276
+ const items = (_submenuRef$current4 = submenuRef.current) === null || _submenuRef$current4 === void 0 ? void 0 : _submenuRef$current4.querySelectorAll(_locators.ALL_CHILDREN_SELECTOR);
264
277
 
265
- const submenuChildren = Array.from((_submenuRef$current3 = submenuRef.current) === null || _submenuRef$current3 === void 0 ? void 0 : _submenuRef$current3.querySelectorAll(_locators.ALL_CHILDREN_SELECTOR));
278
+ if (items && characterString !== "") {
279
+ const submenuChildren = Array.from(items);
266
280
  const nextItem = (0, _keyboardNavigation.characterNavigation)(characterString, submenuChildren);
267
281
 
268
282
  if (nextItem) {
@@ -270,37 +284,33 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
270
284
  }
271
285
  }
272
286
  }, [characterString, submenuItemIds]);
273
- const handleClickInside = (0, _useClickAwayListener.default)(handleClickAway);
274
287
 
275
288
  if (inFullscreenView) {
276
289
  return /*#__PURE__*/_react.default.createElement(_submenu.StyledSubmenuWrapper, {
277
290
  "data-component": "submenu-wrapper",
278
291
  inFullscreenView: inFullscreenView,
279
- menuType: menuContext.menuType,
280
292
  asPassiveItem: asPassiveItem,
293
+ menuType: menuContext.menuType,
281
294
  onClick: handleClickInside
282
295
  }, /*#__PURE__*/_react.default.createElement(_menuItem.default, _extends({}, rest, {
283
- onClick: onClick,
296
+ onClick: asPassiveItem ? undefined : onClick,
284
297
  className: className,
285
- menuType: menuContext.menuType,
298
+ menuType: menuType,
286
299
  ref: ref,
287
- as: asPassiveItem ? "div" : _link.default,
288
300
  href: href,
289
- icon: icon,
290
301
  variant: variant,
291
- inFullscreenView: inFullscreenView
302
+ inFullscreenView: inFullscreenView,
303
+ asDiv: asPassiveItem
292
304
  }), title), /*#__PURE__*/_react.default.createElement(_submenu.StyledSubmenu, {
293
305
  "data-component": "submenu",
294
306
  variant: variant,
295
- menuType: menuContext.menuType,
307
+ menuType: menuType,
296
308
  inFullscreenView: inFullscreenView,
297
309
  ref: submenuRef
298
310
  }, /*#__PURE__*/_react.default.createElement(_submenu2.default.Provider, {
299
311
  value: {
300
312
  handleKeyDown,
301
313
  blockIndex,
302
- registerItem,
303
- unregisterItem,
304
314
  updateFocusId: setSubmenuFocusId
305
315
  }
306
316
  }, children)));
@@ -315,13 +325,12 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
315
325
  ref: submenuRef
316
326
  }, /*#__PURE__*/_react.default.createElement(_menuItem.default, _extends({}, rest, {
317
327
  className: className,
318
- menuType: menuContext.menuType,
328
+ menuType: menuType,
319
329
  ref: ref,
320
330
  icon: icon,
321
331
  tabIndex: -1,
322
332
  variant: variant,
323
333
  isOpen: submenuOpen,
324
- as: _link.default,
325
334
  hasSubmenu: true,
326
335
  showDropdownArrow: showDropdownArrow,
327
336
  onKeyDown: handleKeyDown,
@@ -334,15 +343,13 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
334
343
  "data-component": "submenu",
335
344
  submenuDirection: submenuDirection,
336
345
  variant: variant,
337
- menuType: menuContext.menuType,
346
+ menuType: menuType,
338
347
  role: blockIndex === 0 ? "presentation" : "list"
339
348
  }, /*#__PURE__*/_react.default.createElement(_submenu2.default.Provider, {
340
349
  value: {
341
350
  submenuFocusId,
342
351
  handleKeyDown,
343
352
  blockIndex,
344
- registerItem,
345
- unregisterItem,
346
353
  updateFocusId: setSubmenuFocusId,
347
354
  shiftTabPressed: shiftTabPressed.current
348
355
  }
@@ -350,54 +357,123 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
350
357
  });
351
358
 
352
359
  Submenu.propTypes = {
353
- /** Children elements */
354
- children: _propTypes.default.node.isRequired,
355
-
356
- /** Custom className */
357
- className: _propTypes.default.string,
358
-
359
- /**
360
- * * <a href="https://brand.sage.com/d/NdbrveWvNheA/foundations#/icons/icons" target="_blank">List of supported icons</a>
361
- *
362
- * Adds an icon to the menu item.
363
- * */
364
- icon: _propTypes.default.string,
365
-
366
- /** Defines which direction the submenu will hang eg. left/right */
367
- submenuDirection: _propTypes.default.string,
368
-
369
- /** A title for the menu item that has a submenu. */
370
- title: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.object]),
371
-
372
- /** onKeyDown handler */
373
- onKeyDown: _propTypes.default.func,
374
-
375
- /** set the colour variant for a menuType */
376
- variant: _propTypes.default.oneOf(["default", "alternate"]),
377
-
378
- /** Flag to display the dropdown arrow when an item has a submenu */
379
- showDropdownArrow: _propTypes.default.bool,
380
-
381
- /** When set the submenu opens by click instead of hover */
382
- clickToOpen: _propTypes.default.bool,
383
-
384
- /** The href to use for the menu item. */
385
- href: _propTypes.default.string,
386
-
387
- /** Maximum width. Any valid CSS string */
388
- maxWidth: _propTypes.default.string,
389
-
390
- /** Used to set a submenu parent to passive styling in MenuFullscreen */
391
- asPassiveItem: _propTypes.default.bool,
392
-
393
- /** Callback triggered when submenu opens. Only valid with submenu prop */
394
- onSubmenuOpen: _propTypes.default.func,
395
-
396
- /** Callback triggered when submenu closes. Only valid with submenu prop */
397
- onSubmenuClose: _propTypes.default.func,
398
-
399
- /** Callback triggered when the top-level menu item is clicked */
400
- onClick: _propTypes.default.func
360
+ "ariaLabel": _propTypes.default.string,
361
+ "asPassiveItem": _propTypes.default.bool,
362
+ "children": _propTypes.default.node,
363
+ "className": _propTypes.default.string,
364
+ "clickToOpen": _propTypes.default.bool,
365
+ "href": _propTypes.default.string,
366
+ "icon": _propTypes.default.string,
367
+ "maxWidth": _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.oneOf([null]), _propTypes.default.number, _propTypes.default.shape({
368
+ "__@iterator": _propTypes.default.func.isRequired,
369
+ "anchor": _propTypes.default.func.isRequired,
370
+ "at": _propTypes.default.func.isRequired,
371
+ "big": _propTypes.default.func.isRequired,
372
+ "blink": _propTypes.default.func.isRequired,
373
+ "bold": _propTypes.default.func.isRequired,
374
+ "charAt": _propTypes.default.func.isRequired,
375
+ "charCodeAt": _propTypes.default.func.isRequired,
376
+ "codePointAt": _propTypes.default.func.isRequired,
377
+ "concat": _propTypes.default.func.isRequired,
378
+ "endsWith": _propTypes.default.func.isRequired,
379
+ "fixed": _propTypes.default.func.isRequired,
380
+ "fontcolor": _propTypes.default.func.isRequired,
381
+ "fontsize": _propTypes.default.func.isRequired,
382
+ "includes": _propTypes.default.func.isRequired,
383
+ "indexOf": _propTypes.default.func.isRequired,
384
+ "italics": _propTypes.default.func.isRequired,
385
+ "lastIndexOf": _propTypes.default.func.isRequired,
386
+ "length": _propTypes.default.number.isRequired,
387
+ "link": _propTypes.default.func.isRequired,
388
+ "localeCompare": _propTypes.default.func.isRequired,
389
+ "match": _propTypes.default.func.isRequired,
390
+ "matchAll": _propTypes.default.func.isRequired,
391
+ "normalize": _propTypes.default.func.isRequired,
392
+ "padEnd": _propTypes.default.func.isRequired,
393
+ "padStart": _propTypes.default.func.isRequired,
394
+ "repeat": _propTypes.default.func.isRequired,
395
+ "replace": _propTypes.default.func.isRequired,
396
+ "search": _propTypes.default.func.isRequired,
397
+ "slice": _propTypes.default.func.isRequired,
398
+ "small": _propTypes.default.func.isRequired,
399
+ "split": _propTypes.default.func.isRequired,
400
+ "startsWith": _propTypes.default.func.isRequired,
401
+ "strike": _propTypes.default.func.isRequired,
402
+ "sub": _propTypes.default.func.isRequired,
403
+ "substr": _propTypes.default.func.isRequired,
404
+ "substring": _propTypes.default.func.isRequired,
405
+ "sup": _propTypes.default.func.isRequired,
406
+ "toLocaleLowerCase": _propTypes.default.func.isRequired,
407
+ "toLocaleUpperCase": _propTypes.default.func.isRequired,
408
+ "toLowerCase": _propTypes.default.func.isRequired,
409
+ "toString": _propTypes.default.func.isRequired,
410
+ "toUpperCase": _propTypes.default.func.isRequired,
411
+ "trim": _propTypes.default.func.isRequired,
412
+ "trimEnd": _propTypes.default.func.isRequired,
413
+ "trimLeft": _propTypes.default.func.isRequired,
414
+ "trimRight": _propTypes.default.func.isRequired,
415
+ "trimStart": _propTypes.default.func.isRequired,
416
+ "valueOf": _propTypes.default.func.isRequired
417
+ }), _propTypes.default.string])), _propTypes.default.number, _propTypes.default.object, _propTypes.default.shape({
418
+ "__@iterator": _propTypes.default.func.isRequired,
419
+ "anchor": _propTypes.default.func.isRequired,
420
+ "at": _propTypes.default.func.isRequired,
421
+ "big": _propTypes.default.func.isRequired,
422
+ "blink": _propTypes.default.func.isRequired,
423
+ "bold": _propTypes.default.func.isRequired,
424
+ "charAt": _propTypes.default.func.isRequired,
425
+ "charCodeAt": _propTypes.default.func.isRequired,
426
+ "codePointAt": _propTypes.default.func.isRequired,
427
+ "concat": _propTypes.default.func.isRequired,
428
+ "endsWith": _propTypes.default.func.isRequired,
429
+ "fixed": _propTypes.default.func.isRequired,
430
+ "fontcolor": _propTypes.default.func.isRequired,
431
+ "fontsize": _propTypes.default.func.isRequired,
432
+ "includes": _propTypes.default.func.isRequired,
433
+ "indexOf": _propTypes.default.func.isRequired,
434
+ "italics": _propTypes.default.func.isRequired,
435
+ "lastIndexOf": _propTypes.default.func.isRequired,
436
+ "length": _propTypes.default.number.isRequired,
437
+ "link": _propTypes.default.func.isRequired,
438
+ "localeCompare": _propTypes.default.func.isRequired,
439
+ "match": _propTypes.default.func.isRequired,
440
+ "matchAll": _propTypes.default.func.isRequired,
441
+ "normalize": _propTypes.default.func.isRequired,
442
+ "padEnd": _propTypes.default.func.isRequired,
443
+ "padStart": _propTypes.default.func.isRequired,
444
+ "repeat": _propTypes.default.func.isRequired,
445
+ "replace": _propTypes.default.func.isRequired,
446
+ "search": _propTypes.default.func.isRequired,
447
+ "slice": _propTypes.default.func.isRequired,
448
+ "small": _propTypes.default.func.isRequired,
449
+ "split": _propTypes.default.func.isRequired,
450
+ "startsWith": _propTypes.default.func.isRequired,
451
+ "strike": _propTypes.default.func.isRequired,
452
+ "sub": _propTypes.default.func.isRequired,
453
+ "substr": _propTypes.default.func.isRequired,
454
+ "substring": _propTypes.default.func.isRequired,
455
+ "sup": _propTypes.default.func.isRequired,
456
+ "toLocaleLowerCase": _propTypes.default.func.isRequired,
457
+ "toLocaleUpperCase": _propTypes.default.func.isRequired,
458
+ "toLowerCase": _propTypes.default.func.isRequired,
459
+ "toString": _propTypes.default.func.isRequired,
460
+ "toUpperCase": _propTypes.default.func.isRequired,
461
+ "trim": _propTypes.default.func.isRequired,
462
+ "trimEnd": _propTypes.default.func.isRequired,
463
+ "trimLeft": _propTypes.default.func.isRequired,
464
+ "trimRight": _propTypes.default.func.isRequired,
465
+ "trimStart": _propTypes.default.func.isRequired,
466
+ "valueOf": _propTypes.default.func.isRequired
467
+ }), _propTypes.default.string]),
468
+ "onClick": _propTypes.default.func,
469
+ "onKeyDown": _propTypes.default.func,
470
+ "onSubmenuClose": _propTypes.default.func,
471
+ "onSubmenuOpen": _propTypes.default.func,
472
+ "showDropdownArrow": _propTypes.default.bool,
473
+ "submenuDirection": _propTypes.default.string,
474
+ "title": _propTypes.default.string,
475
+ "variant": _propTypes.default.oneOf(["alternate", "default"])
401
476
  };
477
+ Submenu.displayName = "submenu";
402
478
  var _default = Submenu;
403
479
  exports.default = _default;
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ export interface SubmenuContextProps {
3
+ submenuFocusId?: string | null;
4
+ updateFocusId?: (id: string) => void;
5
+ handleKeyDown?: (event: React.KeyboardEvent<HTMLAnchorElement>) => void;
6
+ shiftTabPressed?: boolean;
7
+ blockIndex?: number;
8
+ }
9
+ declare const SubmenuContext: React.Context<SubmenuContextProps>;
10
+ export default SubmenuContext;
@@ -0,0 +1,16 @@
1
+ import { SubmenuProps } from "./submenu.component";
2
+ import { MenuType } from "../../menu.context";
3
+ interface SharedStyleProps {
4
+ inFullscreenView?: boolean;
5
+ menuType?: MenuType;
6
+ }
7
+ interface StyledSubmenuWrapperProps extends SharedStyleProps {
8
+ isSubmenuOpen?: boolean;
9
+ asPassiveItem?: boolean;
10
+ }
11
+ interface StyledSubmenuProps extends SharedStyleProps, Pick<SubmenuProps, "variant"> {
12
+ submenuDirection?: string;
13
+ }
14
+ declare const StyledSubmenuWrapper: import("styled-components").StyledComponent<"div", any, StyledSubmenuWrapperProps, never>;
15
+ declare const StyledSubmenu: import("styled-components").StyledComponent<"ul", any, StyledSubmenuProps, never>;
16
+ export { StyledSubmenu, StyledSubmenuWrapper };
@@ -46,7 +46,7 @@ const StyledSubmenuWrapper = _styledComponents.default.div`
46
46
  }) => inFullscreenView && (0, _styledComponents.css)`
47
47
  width: 100%;
48
48
 
49
- ${asPassiveItem && (0, _styledComponents.css)`
49
+ ${asPassiveItem && menuType && (0, _styledComponents.css)`
50
50
  ${_menuItem.default} {
51
51
  outline: none;
52
52
  color: ${_menu2.default[menuType].title};
@@ -62,7 +62,7 @@ const StyledSubmenu = _styledComponents.default.ul`
62
62
  variant,
63
63
  inFullscreenView
64
64
  }) => (0, _styledComponents.css)`
65
- ${!inFullscreenView && (0, _styledComponents.css)`
65
+ ${!inFullscreenView && menuType && (0, _styledComponents.css)`
66
66
  box-shadow: var(--boxShadow100);
67
67
  position: absolute;
68
68
  background-color: ${variant === "default" ? _menu2.default[menuType].submenuItemBackground : _menu2.default[menuType].background};
@@ -98,7 +98,7 @@ const StyledSubmenu = _styledComponents.default.ul`
98
98
  white-space: nowrap;
99
99
  cursor: pointer;
100
100
 
101
- ${!inFullscreenView && (0, _styledComponents.css)`
101
+ ${!inFullscreenView && menuType && (0, _styledComponents.css)`
102
102
  background-color: ${_menu2.default[menuType].submenuItemBackground};
103
103
 
104
104
  a:focus,
@@ -108,7 +108,7 @@ const StyledSubmenu = _styledComponents.default.ul`
108
108
 
109
109
  a:hover,
110
110
  button:hover {
111
- background-color: ${_menu2.default[menuType].submenuItemBackgroundHover};
111
+ background-color: transparent;
112
112
  color: var(--colorsComponentsMenuYang100);
113
113
 
114
114
  [data-component="icon"] {
@@ -1,6 +1,12 @@
1
- export { default as Menu } from "./menu";
2
- export { default as MenuItem } from "./menu-item/menu-item";
3
- export { default as ScrollableBlock } from "./scrollable-block/scrollable-block";
4
- export { default as MenuDivider } from "./menu-divider/menu-divider";
5
- export { default as MenuSegmentTitle } from "./menu-segment-title/menu-segment-title";
6
- export { default as MenuFullscreen } from "./menu-full-screen/menu-full-screen";
1
+ export { default as Menu } from "./menu.component";
2
+ export type { MenuProps } from "./menu.component";
3
+ export { default as MenuItem } from "./menu-item";
4
+ export type { MenuWithIcon, MenuWithChildren } from "./menu-item";
5
+ export { default as MenuDivider } from "./menu-divider";
6
+ export type { MenuDividerProps } from "./menu-divider";
7
+ export { default as MenuSegmentTitle } from "./menu-segment-title";
8
+ export type { MenuTitleProps } from "./menu-segment-title";
9
+ export { default as MenuFullscreen } from "./menu-full-screen";
10
+ export type { MenuFullscreenProps } from "./menu-full-screen";
11
+ export { default as ScrollableBlock } from "./scrollable-block";
12
+ export type { ScrollableBlockProps } from "./scrollable-block";