carbon-react 144.1.0 → 144.2.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/components/box/box.component.d.ts +1 -1
- package/esm/components/box/box.component.js +6 -0
- package/esm/components/menu/menu-full-screen/menu-full-screen.component.js +2 -1
- package/esm/components/modal/modal.component.js +2 -1
- package/esm/hooks/__internal__/useModalManager/useModalManager.d.ts +2 -1
- package/esm/hooks/__internal__/useModalManager/useModalManager.js +14 -1
- package/lib/components/box/box.component.d.ts +1 -1
- package/lib/components/box/box.component.js +6 -0
- package/lib/components/menu/menu-full-screen/menu-full-screen.component.js +2 -1
- package/lib/components/modal/modal.component.js +2 -1
- package/lib/hooks/__internal__/useModalManager/useModalManager.d.ts +2 -1
- package/lib/hooks/__internal__/useModalManager/useModalManager.js +14 -1
- package/package.json +1 -1
- package/esm/__internal__/utils/helpers/tags/tags-specs/index.d.ts +0 -1
- package/esm/__internal__/utils/helpers/tags/tags-specs/index.js +0 -1
- package/esm/__internal__/utils/helpers/tags/tags-specs/tags-specs.d.ts +0 -3
- package/esm/__internal__/utils/helpers/tags/tags-specs/tags-specs.js +0 -6
- package/lib/__internal__/utils/helpers/tags/tags-specs/index.d.ts +0 -1
- package/lib/__internal__/utils/helpers/tags/tags-specs/index.js +0 -13
- package/lib/__internal__/utils/helpers/tags/tags-specs/package.json +0 -6
- package/lib/__internal__/utils/helpers/tags/tags-specs/tags-specs.d.ts +0 -3
- package/lib/__internal__/utils/helpers/tags/tags-specs/tags-specs.js +0 -12
|
@@ -23,7 +23,7 @@ export interface BoxProps extends FlexboxProps, Omit<GridProps, "gridGap" | "gri
|
|
|
23
23
|
scrollVariant?: ScrollVariant;
|
|
24
24
|
/** Set the box-sizing attribute of the Box component */
|
|
25
25
|
boxSizing?: BoxSizing;
|
|
26
|
-
/** Allows a tabindex to be specified */
|
|
26
|
+
/** (Deprecated) Allows a tabindex to be specified */
|
|
27
27
|
tabIndex?: number;
|
|
28
28
|
/** Gap, an integer multiplier of the base spacing constant (8px) or any valid CSS string." */
|
|
29
29
|
gap?: Gap;
|
|
@@ -4,6 +4,8 @@ import PropTypes from "prop-types";
|
|
|
4
4
|
import { filterStyledSystemMarginProps, filterStyledSystemPaddingProps, filterStyledSystemLayoutProps, filterStyledSystemFlexboxProps, filterStyledSystemGridProps } from "../../style/utils";
|
|
5
5
|
import StyledBox from "./box.style";
|
|
6
6
|
import tagComponent from "../../__internal__/utils/helpers/tags";
|
|
7
|
+
import Logger from "../../__internal__/utils/logger";
|
|
8
|
+
let deprecatedTabIndex = false;
|
|
7
9
|
const Box = /*#__PURE__*/React.forwardRef(({
|
|
8
10
|
"data-component": dataComponent,
|
|
9
11
|
as,
|
|
@@ -27,6 +29,10 @@ const Box = /*#__PURE__*/React.forwardRef(({
|
|
|
27
29
|
"aria-hidden": ariaHidden,
|
|
28
30
|
...rest
|
|
29
31
|
}, ref) => {
|
|
32
|
+
if (!deprecatedTabIndex && tabIndex !== undefined) {
|
|
33
|
+
deprecatedTabIndex = true;
|
|
34
|
+
Logger.deprecate("The `tabIndex` prop for `Box` component has been deprecated and will soon be removed.");
|
|
35
|
+
}
|
|
30
36
|
return /*#__PURE__*/React.createElement(StyledBox, _extends({
|
|
31
37
|
as: as,
|
|
32
38
|
id: id,
|
|
@@ -54,7 +54,8 @@ export const MenuFullscreen = ({
|
|
|
54
54
|
open: isOpen,
|
|
55
55
|
closeModal,
|
|
56
56
|
modalRef: menuRef,
|
|
57
|
-
topModalOverride
|
|
57
|
+
topModalOverride,
|
|
58
|
+
focusCallToActionElement: document.activeElement
|
|
58
59
|
});
|
|
59
60
|
return /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement(Portal, null, /*#__PURE__*/React.createElement(CSSTransition, {
|
|
60
61
|
nodeRef: menuRef,
|
|
@@ -6,6 +6,7 @@ declare type UseModalManagerArgs = {
|
|
|
6
6
|
setTriggerRefocusFlag?: (flag: boolean) => void;
|
|
7
7
|
triggerRefocusOnClose?: boolean;
|
|
8
8
|
topModalOverride?: boolean;
|
|
9
|
+
focusCallToActionElement?: HTMLElement;
|
|
9
10
|
};
|
|
10
|
-
declare const useModalManager: ({ open, closeModal, modalRef, setTriggerRefocusFlag, triggerRefocusOnClose, topModalOverride, }: UseModalManagerArgs) => void;
|
|
11
|
+
declare const useModalManager: ({ open, closeModal, modalRef, setTriggerRefocusFlag, triggerRefocusOnClose, topModalOverride, focusCallToActionElement, }: UseModalManagerArgs) => void;
|
|
11
12
|
export default useModalManager;
|
|
@@ -6,10 +6,12 @@ const useModalManager = ({
|
|
|
6
6
|
modalRef,
|
|
7
7
|
setTriggerRefocusFlag,
|
|
8
8
|
triggerRefocusOnClose = true,
|
|
9
|
-
topModalOverride = false
|
|
9
|
+
topModalOverride = false,
|
|
10
|
+
focusCallToActionElement
|
|
10
11
|
}) => {
|
|
11
12
|
const listenerAdded = useRef(false);
|
|
12
13
|
const modalRegistered = useRef(false);
|
|
14
|
+
const lastFocusedElement = useRef(null);
|
|
13
15
|
const handleClose = useCallback(ev => {
|
|
14
16
|
const isTopmost = ModalManager.isTopmost(modalRef.current);
|
|
15
17
|
if (isTopmost) {
|
|
@@ -41,6 +43,11 @@ const useModalManager = ({
|
|
|
41
43
|
removeListener();
|
|
42
44
|
};
|
|
43
45
|
}, [removeListener]);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (!lastFocusedElement.current && focusCallToActionElement && open) {
|
|
48
|
+
lastFocusedElement.current = focusCallToActionElement;
|
|
49
|
+
}
|
|
50
|
+
}, [open, focusCallToActionElement]);
|
|
44
51
|
const registerModal = useCallback(ref => {
|
|
45
52
|
/* istanbul ignore else */
|
|
46
53
|
if (!modalRegistered.current) {
|
|
@@ -51,6 +58,12 @@ const useModalManager = ({
|
|
|
51
58
|
const unregisterModal = useCallback(ref => {
|
|
52
59
|
if (modalRegistered.current) {
|
|
53
60
|
ModalManager.removeModal(ref, triggerRefocusOnClose);
|
|
61
|
+
if (lastFocusedElement.current) {
|
|
62
|
+
setTimeout(() => {
|
|
63
|
+
lastFocusedElement.current?.focus();
|
|
64
|
+
lastFocusedElement.current = null;
|
|
65
|
+
}, 0);
|
|
66
|
+
}
|
|
54
67
|
modalRegistered.current = false;
|
|
55
68
|
}
|
|
56
69
|
}, [triggerRefocusOnClose]);
|
|
@@ -23,7 +23,7 @@ export interface BoxProps extends FlexboxProps, Omit<GridProps, "gridGap" | "gri
|
|
|
23
23
|
scrollVariant?: ScrollVariant;
|
|
24
24
|
/** Set the box-sizing attribute of the Box component */
|
|
25
25
|
boxSizing?: BoxSizing;
|
|
26
|
-
/** Allows a tabindex to be specified */
|
|
26
|
+
/** (Deprecated) Allows a tabindex to be specified */
|
|
27
27
|
tabIndex?: number;
|
|
28
28
|
/** Gap, an integer multiplier of the base spacing constant (8px) or any valid CSS string." */
|
|
29
29
|
gap?: Gap;
|
|
@@ -9,8 +9,10 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
9
9
|
var _utils = require("../../style/utils");
|
|
10
10
|
var _box = _interopRequireDefault(require("./box.style"));
|
|
11
11
|
var _tags = _interopRequireDefault(require("../../__internal__/utils/helpers/tags"));
|
|
12
|
+
var _logger = _interopRequireDefault(require("../../__internal__/utils/logger"));
|
|
12
13
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
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); }
|
|
15
|
+
let deprecatedTabIndex = false;
|
|
14
16
|
const Box = exports.Box = /*#__PURE__*/_react.default.forwardRef(({
|
|
15
17
|
"data-component": dataComponent,
|
|
16
18
|
as,
|
|
@@ -34,6 +36,10 @@ const Box = exports.Box = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
34
36
|
"aria-hidden": ariaHidden,
|
|
35
37
|
...rest
|
|
36
38
|
}, ref) => {
|
|
39
|
+
if (!deprecatedTabIndex && tabIndex !== undefined) {
|
|
40
|
+
deprecatedTabIndex = true;
|
|
41
|
+
_logger.default.deprecate("The `tabIndex` prop for `Box` component has been deprecated and will soon be removed.");
|
|
42
|
+
}
|
|
37
43
|
return /*#__PURE__*/_react.default.createElement(_box.default, _extends({
|
|
38
44
|
as: as,
|
|
39
45
|
id: id,
|
|
@@ -63,7 +63,8 @@ const MenuFullscreen = ({
|
|
|
63
63
|
open: isOpen,
|
|
64
64
|
closeModal,
|
|
65
65
|
modalRef: menuRef,
|
|
66
|
-
topModalOverride
|
|
66
|
+
topModalOverride,
|
|
67
|
+
focusCallToActionElement: document.activeElement
|
|
67
68
|
});
|
|
68
69
|
return /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement(_portal.default, null, /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.CSSTransition, {
|
|
69
70
|
nodeRef: menuRef,
|
|
@@ -6,6 +6,7 @@ declare type UseModalManagerArgs = {
|
|
|
6
6
|
setTriggerRefocusFlag?: (flag: boolean) => void;
|
|
7
7
|
triggerRefocusOnClose?: boolean;
|
|
8
8
|
topModalOverride?: boolean;
|
|
9
|
+
focusCallToActionElement?: HTMLElement;
|
|
9
10
|
};
|
|
10
|
-
declare const useModalManager: ({ open, closeModal, modalRef, setTriggerRefocusFlag, triggerRefocusOnClose, topModalOverride, }: UseModalManagerArgs) => void;
|
|
11
|
+
declare const useModalManager: ({ open, closeModal, modalRef, setTriggerRefocusFlag, triggerRefocusOnClose, topModalOverride, focusCallToActionElement, }: UseModalManagerArgs) => void;
|
|
11
12
|
export default useModalManager;
|
|
@@ -13,10 +13,12 @@ const useModalManager = ({
|
|
|
13
13
|
modalRef,
|
|
14
14
|
setTriggerRefocusFlag,
|
|
15
15
|
triggerRefocusOnClose = true,
|
|
16
|
-
topModalOverride = false
|
|
16
|
+
topModalOverride = false,
|
|
17
|
+
focusCallToActionElement
|
|
17
18
|
}) => {
|
|
18
19
|
const listenerAdded = (0, _react.useRef)(false);
|
|
19
20
|
const modalRegistered = (0, _react.useRef)(false);
|
|
21
|
+
const lastFocusedElement = (0, _react.useRef)(null);
|
|
20
22
|
const handleClose = (0, _react.useCallback)(ev => {
|
|
21
23
|
const isTopmost = _modalManager.default.isTopmost(modalRef.current);
|
|
22
24
|
if (isTopmost) {
|
|
@@ -48,6 +50,11 @@ const useModalManager = ({
|
|
|
48
50
|
removeListener();
|
|
49
51
|
};
|
|
50
52
|
}, [removeListener]);
|
|
53
|
+
(0, _react.useEffect)(() => {
|
|
54
|
+
if (!lastFocusedElement.current && focusCallToActionElement && open) {
|
|
55
|
+
lastFocusedElement.current = focusCallToActionElement;
|
|
56
|
+
}
|
|
57
|
+
}, [open, focusCallToActionElement]);
|
|
51
58
|
const registerModal = (0, _react.useCallback)(ref => {
|
|
52
59
|
/* istanbul ignore else */
|
|
53
60
|
if (!modalRegistered.current) {
|
|
@@ -58,6 +65,12 @@ const useModalManager = ({
|
|
|
58
65
|
const unregisterModal = (0, _react.useCallback)(ref => {
|
|
59
66
|
if (modalRegistered.current) {
|
|
60
67
|
_modalManager.default.removeModal(ref, triggerRefocusOnClose);
|
|
68
|
+
if (lastFocusedElement.current) {
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
lastFocusedElement.current?.focus();
|
|
71
|
+
lastFocusedElement.current = null;
|
|
72
|
+
}, 0);
|
|
73
|
+
}
|
|
61
74
|
modalRegistered.current = false;
|
|
62
75
|
}
|
|
63
76
|
}, [triggerRefocusOnClose]);
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default } from "./tags-specs";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default } from "./tags-specs";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default } from "./tags-specs";
|
|
@@ -1,13 +0,0 @@
|
|
|
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 _tagsSpecs.default;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
var _tagsSpecs = _interopRequireDefault(require("./tags-specs"));
|
|
13
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
const rootTagTest = (rootNode, comp, elem, role) => {
|
|
8
|
-
expect(rootNode.prop("data-component")).toEqual(comp);
|
|
9
|
-
expect(rootNode.prop("data-element")).toEqual(elem);
|
|
10
|
-
expect(rootNode.prop("data-role")).toEqual(role);
|
|
11
|
-
};
|
|
12
|
-
var _default = exports.default = rootTagTest;
|