carbon-react 151.2.2 → 151.3.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 (45) hide show
  1. package/esm/__internal__/dom/globals.d.ts +51 -0
  2. package/esm/__internal__/dom/globals.js +59 -0
  3. package/esm/__internal__/utils/helpers/events/events.d.ts +8 -0
  4. package/esm/__internal__/utils/helpers/events/events.js +12 -0
  5. package/esm/__spec_helper__/mock-element-scrollto.js +3 -0
  6. package/esm/__spec_helper__/mock-match-media.js +1 -1
  7. package/esm/__spec_helper__/mock-resize-observer.js +1 -1
  8. package/esm/components/action-popover/action-popover.component.js +7 -2
  9. package/esm/components/date/__internal__/date-picker/date-picker.component.js +11 -2
  10. package/esm/components/flat-table/__internal__/flat-table.context.d.ts +3 -1
  11. package/esm/components/flat-table/__internal__/flat-table.context.js +2 -1
  12. package/esm/components/flat-table/flat-table-row/flat-table-row.style.js +4 -1
  13. package/esm/components/flat-table/flat-table.component.js +10 -1
  14. package/esm/components/icon/icon.style.js +6 -4
  15. package/esm/components/menu/menu-full-screen/menu-full-screen.component.js +2 -1
  16. package/esm/components/modal/__internal__/modal-manager.js +18 -7
  17. package/esm/components/modal/modal.component.js +3 -1
  18. package/esm/components/multi-action-button/multi-action-button.component.js +6 -1
  19. package/esm/components/popover-container/popover-container.component.js +7 -2
  20. package/esm/components/split-button/split-button.component.js +5 -0
  21. package/esm/components/vertical-menu/vertical-menu-full-screen/vertical-menu-full-screen.component.js +3 -1
  22. package/esm/hooks/__internal__/useScrollBlock/scroll-block-manager.js +11 -4
  23. package/lib/__internal__/dom/globals.d.ts +51 -0
  24. package/lib/__internal__/dom/globals.js +67 -0
  25. package/lib/__internal__/utils/helpers/events/events.d.ts +8 -0
  26. package/lib/__internal__/utils/helpers/events/events.js +12 -0
  27. package/lib/__spec_helper__/mock-element-scrollto.js +3 -0
  28. package/lib/__spec_helper__/mock-match-media.js +1 -1
  29. package/lib/__spec_helper__/mock-resize-observer.js +1 -1
  30. package/lib/components/action-popover/action-popover.component.js +6 -1
  31. package/lib/components/date/__internal__/date-picker/date-picker.component.js +10 -1
  32. package/lib/components/flat-table/__internal__/flat-table.context.d.ts +3 -1
  33. package/lib/components/flat-table/__internal__/flat-table.context.js +2 -1
  34. package/lib/components/flat-table/flat-table-row/flat-table-row.style.js +4 -1
  35. package/lib/components/flat-table/flat-table.component.js +10 -1
  36. package/lib/components/icon/icon.style.js +6 -4
  37. package/lib/components/menu/menu-full-screen/menu-full-screen.component.js +2 -1
  38. package/lib/components/modal/__internal__/modal-manager.js +18 -7
  39. package/lib/components/modal/modal.component.js +3 -1
  40. package/lib/components/multi-action-button/multi-action-button.component.js +5 -0
  41. package/lib/components/popover-container/popover-container.component.js +6 -1
  42. package/lib/components/split-button/split-button.component.js +5 -0
  43. package/lib/components/vertical-menu/vertical-menu-full-screen/vertical-menu-full-screen.component.js +3 -1
  44. package/lib/hooks/__internal__/useScrollBlock/scroll-block-manager.js +12 -6
  45. package/package.json +2 -1
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Returns the global `window` object in a way that is friendly to SSR.
3
+ * This check can be avoided if you are sure that the code will only run in the browser.
4
+ * Some examples where you can ignore this:
5
+ * - `useEffect` hooks
6
+ * - `useLayoutEffect` hooks
7
+ * - Callbacks for event listeners
8
+ * - Files with the `"use-client"` directive
9
+ *
10
+ * Primarily, this is necessary when attempting to access the `window` object during rendering of components.
11
+ * However, even still, where possible, it is recommended to avoid accessing the `window` object during rendering
12
+ * because it can lead to hydration mismatches. This happens when the server-rendered HTML differs from what the
13
+ * client renders due to missing environment-specific data (e.g., `window.innerWidth` being undefined on the server).
14
+ *
15
+ * @returns The global `window` object, if it exists.
16
+ */
17
+ export declare function getWindow(): (Window & typeof globalThis) | undefined;
18
+ /**
19
+ * Returns the global `document` object in a way that is friendly to SSR.
20
+ * This check can be avoided if you are sure that the code will only run in the browser.
21
+ * Some examples where you can ignore this:
22
+ * - `useEffect` hooks
23
+ * - `useLayoutEffect` hooks
24
+ * - Callbacks for event listeners
25
+ * - Files with the `"use-client"` directive
26
+ *
27
+ * Primarily, this is necessary when attempting to access the `document` object during rendering of components.
28
+ * However, even still, where possible, it is recommended to avoid accessing the `document` object during rendering
29
+ * because it can lead to hydration mismatches. This happens when the server-rendered HTML differs from what the
30
+ * client renders due to missing environment-specific data (e.g., `document.children` being undefined on the server).
31
+ *
32
+ * @returns The global `document` object, if it exists.
33
+ */
34
+ export declare function getDocument(): Document | undefined;
35
+ /**
36
+ * Returns the global `navigator` object in a way that is friendly to SSR.
37
+ * This check can be avoided if you are sure that the code will only run in the browser.
38
+ * Some examples where you can ignore this:
39
+ * - `useEffect` hooks
40
+ * - `useLayoutEffect` hooks
41
+ * - Callbacks for event listeners
42
+ * - Files with the `"use-client"` directive
43
+ *
44
+ * Primarily, this is necessary when attempting to access the `navigator` object during rendering of components.
45
+ * However, even still, where possible, it is recommended to avoid accessing the `navigator` object during rendering
46
+ * because it can lead to hydration mismatches. This happens when the server-rendered HTML differs from what the
47
+ * client renders due to missing environment-specific data (e.g., `navigator.userAgent` being undefined on the server).
48
+ *
49
+ * @returns The global `navigator` object, if it exists.
50
+ */
51
+ export declare function getNavigator(): Navigator | undefined;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getDocument = getDocument;
7
+ exports.getNavigator = getNavigator;
8
+ exports.getWindow = getWindow;
9
+ /**
10
+ * Returns the global `window` object in a way that is friendly to SSR.
11
+ * This check can be avoided if you are sure that the code will only run in the browser.
12
+ * Some examples where you can ignore this:
13
+ * - `useEffect` hooks
14
+ * - `useLayoutEffect` hooks
15
+ * - Callbacks for event listeners
16
+ * - Files with the `"use-client"` directive
17
+ *
18
+ * Primarily, this is necessary when attempting to access the `window` object during rendering of components.
19
+ * However, even still, where possible, it is recommended to avoid accessing the `window` object during rendering
20
+ * because it can lead to hydration mismatches. This happens when the server-rendered HTML differs from what the
21
+ * client renders due to missing environment-specific data (e.g., `window.innerWidth` being undefined on the server).
22
+ *
23
+ * @returns The global `window` object, if it exists.
24
+ */
25
+ function getWindow() {
26
+ return typeof window !== "undefined" ? window : undefined;
27
+ }
28
+
29
+ /**
30
+ * Returns the global `document` object in a way that is friendly to SSR.
31
+ * This check can be avoided if you are sure that the code will only run in the browser.
32
+ * Some examples where you can ignore this:
33
+ * - `useEffect` hooks
34
+ * - `useLayoutEffect` hooks
35
+ * - Callbacks for event listeners
36
+ * - Files with the `"use-client"` directive
37
+ *
38
+ * Primarily, this is necessary when attempting to access the `document` object during rendering of components.
39
+ * However, even still, where possible, it is recommended to avoid accessing the `document` object during rendering
40
+ * because it can lead to hydration mismatches. This happens when the server-rendered HTML differs from what the
41
+ * client renders due to missing environment-specific data (e.g., `document.children` being undefined on the server).
42
+ *
43
+ * @returns The global `document` object, if it exists.
44
+ */
45
+ function getDocument() {
46
+ return typeof document !== "undefined" ? document : undefined;
47
+ }
48
+
49
+ /**
50
+ * Returns the global `navigator` object in a way that is friendly to SSR.
51
+ * This check can be avoided if you are sure that the code will only run in the browser.
52
+ * Some examples where you can ignore this:
53
+ * - `useEffect` hooks
54
+ * - `useLayoutEffect` hooks
55
+ * - Callbacks for event listeners
56
+ * - Files with the `"use-client"` directive
57
+ *
58
+ * Primarily, this is necessary when attempting to access the `navigator` object during rendering of components.
59
+ * However, even still, where possible, it is recommended to avoid accessing the `navigator` object during rendering
60
+ * because it can lead to hydration mismatches. This happens when the server-rendered HTML differs from what the
61
+ * client renders due to missing environment-specific data (e.g., `navigator.userAgent` being undefined on the server).
62
+ *
63
+ * @returns The global `navigator` object, if it exists.
64
+ */
65
+ function getNavigator() {
66
+ return typeof navigator !== "undefined" ? navigator : undefined;
67
+ }
@@ -71,6 +71,14 @@ declare const Events: {
71
71
  * Determines if the key pressed is the end key
72
72
  * */
73
73
  isEndKey: (ev: React.KeyboardEvent | KeyboardEvent) => boolean;
74
+ /**
75
+ * Determines if the key pressed is the page up key
76
+ * */
77
+ isPageUpKey: (ev: React.KeyboardEvent | KeyboardEvent) => boolean;
78
+ /**
79
+ * Determines if the key pressed is the page down key
80
+ * */
81
+ isPageDownKey: (ev: React.KeyboardEvent | KeyboardEvent) => boolean;
74
82
  /**
75
83
  * Gets the event's path which is an array of the objects on which listeners will be invoked.
76
84
  * @see https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath
@@ -109,6 +109,18 @@ const Events = {
109
109
  isEndKey: ev => {
110
110
  return ev.key === "End";
111
111
  },
112
+ /**
113
+ * Determines if the key pressed is the page up key
114
+ * */
115
+ isPageUpKey: ev => {
116
+ return ev.key === "PageUp";
117
+ },
118
+ /**
119
+ * Determines if the key pressed is the page down key
120
+ * */
121
+ isPageDownKey: ev => {
122
+ return ev.key === "PageDown";
123
+ },
112
124
  /**
113
125
  * Gets the event's path which is an array of the objects on which listeners will be invoked.
114
126
  * @see https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath
@@ -7,6 +7,9 @@ exports.default = void 0;
7
7
  const setupScrollToMock = () => {
8
8
  // need to mock the `scrollTo` method, which is undefined in JSDOM. As we're not actually testing this behaviour, just make it
9
9
  // do nothing.
10
+ if (typeof window === "undefined") {
11
+ return;
12
+ }
10
13
  HTMLElement.prototype.scrollTo = () => {};
11
14
  };
12
15
  var _default = exports.default = setupScrollToMock;
@@ -8,7 +8,7 @@ let mocked = false;
8
8
  let _matches = false;
9
9
  const removeEventListener = jest.fn();
10
10
  const setupMatchMediaMock = () => {
11
- if (!global.window) {
11
+ if (typeof window === "undefined") {
12
12
  return;
13
13
  }
14
14
  const noop = () => {};
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  const setupResizeObserverMock = () => {
8
- if (!window) {
8
+ if (typeof window === "undefined") {
9
9
  return;
10
10
  }
11
11
  window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(callback => {
@@ -18,6 +18,7 @@ var _actionPopoverDivider = _interopRequireDefault(require("./action-popover-div
18
18
  var _actionPopover2 = _interopRequireDefault(require("./__internal__/action-popover.context"));
19
19
  var _useModalManager = _interopRequireDefault(require("../../hooks/__internal__/useModalManager"));
20
20
  var _actionPopoverUtils = require("./__internal__/action-popover-utils");
21
+ var _flatTable = _interopRequireDefault(require("../flat-table/__internal__/flat-table.context"));
21
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
23
  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); }
23
24
  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; }
@@ -45,6 +46,9 @@ const ActionPopover = exports.ActionPopover = /*#__PURE__*/(0, _react.forwardRef
45
46
  const [guid] = (0, _react.useState)((0, _guid.default)());
46
47
  const buttonRef = (0, _react.useRef)(null);
47
48
  const menu = (0, _react.useRef)(null);
49
+ const {
50
+ isInFlatTable
51
+ } = (0, _react.useContext)(_flatTable.default);
48
52
  const hasProperChildren = (0, _react.useMemo)(() => {
49
53
  const incorrectChild = _react.default.Children.toArray(children).find(child => {
50
54
  if (! /*#__PURE__*/_react.default.isValidElement(child)) {
@@ -222,7 +226,8 @@ const ActionPopover = exports.ActionPopover = /*#__PURE__*/(0, _react.forwardRef
222
226
  }
223
227
  }, isOpen && /*#__PURE__*/_react.default.createElement(_popover.default, {
224
228
  placement: mappedPlacement,
225
- reference: buttonRef
229
+ reference: buttonRef,
230
+ disableBackgroundUI: isInFlatTable
226
231
  }, /*#__PURE__*/_react.default.createElement(_actionPopoverMenu.default, _extends({
227
232
  "data-component": "action-popover",
228
233
  ref: menu
@@ -14,6 +14,7 @@ var _weekday = _interopRequireDefault(require("../weekday"));
14
14
  var _utils = require("../utils");
15
15
  var _focusTrapUtils = require("../../../../__internal__/focus-trap/focus-trap-utils");
16
16
  var _events = _interopRequireDefault(require("../../../../__internal__/utils/helpers/events"));
17
+ var _flatTable = _interopRequireDefault(require("../../../flat-table/__internal__/flat-table.context"));
17
18
  var _dayPicker = _interopRequireDefault(require("./day-picker.style"));
18
19
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
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); }
@@ -109,6 +110,13 @@ const DatePicker = ({
109
110
  }
110
111
  }, 0);
111
112
  };
113
+ const {
114
+ isInFlatTable,
115
+ setHasOpenDatePicker
116
+ } = (0, _react.useContext)(_flatTable.default);
117
+ (0, _react.useEffect)(() => {
118
+ setHasOpenDatePicker?.(!!open);
119
+ }, [open, setHasOpenDatePicker]);
112
120
  (0, _react.useEffect)(() => {
113
121
  if (selectedDays) {
114
122
  setFocusedMonth(selectedDays);
@@ -131,7 +139,8 @@ const DatePicker = ({
131
139
  placement: "bottom-start",
132
140
  reference: inputElement,
133
141
  middleware: popoverMiddleware,
134
- disablePortal: disablePortal
142
+ disablePortal: disablePortal,
143
+ disableBackgroundUI: isInFlatTable
135
144
  }, /*#__PURE__*/_react.default.createElement(_dayPicker.default, {
136
145
  id: "styled-day-picker",
137
146
  "data-role": "date-picker",
@@ -1,7 +1,9 @@
1
- import React from "react";
1
+ import React, { Dispatch, SetStateAction } from "react";
2
2
  import { FlatTableProps } from "../flat-table.component";
3
3
  export interface FlatTableContextProps extends Pick<FlatTableProps, "colorTheme" | "size"> {
4
4
  getTabStopElementId: () => string;
5
+ isInFlatTable?: boolean;
6
+ setHasOpenDatePicker?: Dispatch<SetStateAction<boolean>>;
5
7
  }
6
8
  declare const _default: React.Context<FlatTableContextProps>;
7
9
  export default _default;
@@ -7,5 +7,6 @@ exports.default = void 0;
7
7
  var _react = _interopRequireDefault(require("react"));
8
8
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
9
  var _default = exports.default = /*#__PURE__*/_react.default.createContext({
10
- getTabStopElementId: () => ""
10
+ getTabStopElementId: () => "",
11
+ isInFlatTable: false
11
12
  });
@@ -13,6 +13,7 @@ var _flatTableHeader = _interopRequireDefault(require("../flat-table-header/flat
13
13
  var _icon = _interopRequireDefault(require("../../icon/icon.style"));
14
14
  var _color = require("../../../style/utils/color");
15
15
  var _addFocusStyling = _interopRequireDefault(require("../../../style/utils/add-focus-styling"));
16
+ var _globals = require("../../../__internal__/dom/globals");
16
17
  var _browserTypeCheck = require("../../../__internal__/utils/helpers/browser-type-check");
17
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
19
  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); }
@@ -110,6 +111,7 @@ const StyledFlatTableRow = _styledComponents.default.tr`
110
111
  draggable,
111
112
  rowHeight
112
113
  }) => {
114
+ const nav = (0, _globals.getNavigator)();
113
115
  const backgroundColor = bgColor ? (0, _color.toColor)(theme, bgColor) : undefined;
114
116
  const customBorderColor = horizontalBorderColor ? (0, _color.toColor)(theme, horizontalBorderColor) : undefined;
115
117
  const colorOfSelected = isInSidebar ? "var(--colorsUtilityMajor150)" : "var(--colorsUtilityMajor075)";
@@ -218,7 +220,8 @@ const StyledFlatTableRow = _styledComponents.default.tr`
218
220
  }
219
221
 
220
222
  /* Styling for safari. Position relative does not work on tr elements on Safari */
221
- ${(0, _browserTypeCheck.isSafari)(navigator) && (0, _styledComponents.css)`
223
+ // FIXME: this can cause hydration mismatches during SSR.
224
+ ${nav && (0, _browserTypeCheck.isSafari)(nav) && (0, _styledComponents.css)`
222
225
  position: -webkit-sticky;
223
226
  :after {
224
227
  border: none;
@@ -52,6 +52,7 @@ const FlatTable = ({
52
52
  const {
53
53
  isInSidebar
54
54
  } = (0, _react.useContext)(_drawerSidebar.default);
55
+ const [hasOpenDatePicker, setHasOpenDatePicker] = (0, _react.useState)(false);
55
56
  (0, _react.useLayoutEffect)(() => {
56
57
  const findRow = (rows, isFirstCol) => rows.find((row, index) => {
57
58
  const cells = Array.from(row.querySelectorAll("td, th"));
@@ -110,6 +111,12 @@ const FlatTable = ({
110
111
  return;
111
112
  }
112
113
  const currentFocusIndex = focusableElementsArray.findIndex(el => el === document.activeElement);
114
+ if (hasOpenDatePicker && (hasStickyHead || hasStickyFooter)) {
115
+ if (_events.default.isPageUpKey(ev) || _events.default.isPageDownKey(ev) || _events.default.isHomeKey(ev) || _events.default.isEndKey(ev)) {
116
+ ev.preventDefault();
117
+ }
118
+ return;
119
+ }
113
120
  if (_events.default.isDownKey(ev)) {
114
121
  ev.preventDefault();
115
122
  if (currentFocusIndex !== -1 && currentFocusIndex < focusableElementsArray.length) {
@@ -192,7 +199,9 @@ const FlatTable = ({
192
199
  value: {
193
200
  colorTheme,
194
201
  size,
195
- getTabStopElementId
202
+ getTabStopElementId,
203
+ isInFlatTable: true,
204
+ setHasOpenDatePicker
196
205
  }
197
206
  }, children))), footer && /*#__PURE__*/_react.default.createElement(_flatTable.StyledFlatTableFooter, {
198
207
  hasStickyFooter: hasStickyFooter,
@@ -11,6 +11,7 @@ var _base = _interopRequireDefault(require("../../style/themes/base"));
11
11
  var _addFocusStyling = _interopRequireDefault(require("../../style/utils/add-focus-styling"));
12
12
  var _color = _interopRequireDefault(require("../../style/utils/color"));
13
13
  var _getColorValue = _interopRequireDefault(require("../../style/utils/get-color-value"));
14
+ var _globals = require("../../__internal__/dom/globals");
14
15
  var _browserTypeCheck = _interopRequireWildcard(require("../../__internal__/utils/helpers/browser-type-check"));
15
16
  var _iconConfig = _interopRequireDefault(require("./icon-config"));
16
17
  var _iconUnicodes = _interopRequireDefault(require("./icon-unicodes"));
@@ -57,6 +58,8 @@ const StyledIcon = _styledComponents.default.span`
57
58
  let finalHoverColor;
58
59
  let bgColor;
59
60
  let bgHoverColor;
61
+ const win = (0, _globals.getWindow)();
62
+ const nav = (0, _globals.getNavigator)();
60
63
  const adjustedBgSize = adjustIconBgSize(fontSize, bgSize);
61
64
  try {
62
65
  if (disabled) {
@@ -125,12 +128,11 @@ const StyledIcon = _styledComponents.default.span`
125
128
  font-size: ${_iconConfig.default.iconSize[fontSize]};
126
129
  line-height: ${_iconConfig.default.iconSize[fontSize]};
127
130
  `}
128
-
129
- ${type === "services" && (0, _browserTypeCheck.default)(window) && (0, _styledComponents.css)`
131
+ // FIXME: this can cause hydration mismatches during SSR.
132
+ ${win && type === "services" && (0, _browserTypeCheck.default)(win) && (0, _styledComponents.css)`
130
133
  margin-top: ${fontSize === "small" ? "-7px" : "-8px"};
131
134
  `}
132
-
133
- ${type === "services" && (0, _browserTypeCheck.isSafari)(navigator) && !(0, _browserTypeCheck.default)(window) && (0, _styledComponents.css)`
135
+ ${nav && win && type === "services" && (0, _browserTypeCheck.isSafari)(nav) && !(0, _browserTypeCheck.default)(win) && (0, _styledComponents.css)`
134
136
  margin-top: -6px;
135
137
  `}
136
138
 
@@ -16,6 +16,7 @@ var _icon = _interopRequireDefault(require("../../icon"));
16
16
  var _portal = _interopRequireDefault(require("../../portal"));
17
17
  var _focusTrap = _interopRequireDefault(require("../../../__internal__/focus-trap"));
18
18
  var _menuDivider = _interopRequireDefault(require("../menu-divider/menu-divider.component"));
19
+ var _globals = require("../../../__internal__/dom/globals");
19
20
  var _useLocale = _interopRequireDefault(require("../../../hooks/__internal__/useLocale"));
20
21
  var _useModalAria = _interopRequireDefault(require("../../../hooks/__internal__/useModalAria"));
21
22
  var _useModalManager = _interopRequireDefault(require("../../../hooks/__internal__/useModalManager"));
@@ -63,7 +64,7 @@ const MenuFullscreen = ({
63
64
  closeModal,
64
65
  modalRef: menuRef,
65
66
  topModalOverride,
66
- focusCallToActionElement: document.activeElement
67
+ focusCallToActionElement: (0, _globals.getDocument)()?.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,
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.ModalManagerInstance = void 0;
7
+ var _globals = require("../../../__internal__/dom/globals");
7
8
  function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
8
9
  function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
9
10
  function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
@@ -33,12 +34,17 @@ let ModalManagerInstance = exports.ModalManagerInstance = /*#__PURE__*/function
33
34
  });
34
35
  this.callTopModalSetters();
35
36
  });
37
+ const safeWindow = (0, _globals.getWindow)();
38
+ if (!safeWindow) {
39
+ this.modalList = [];
40
+ return;
41
+ }
36
42
  // Due to possibility of multiple carbon versions using it
37
43
  // it is necessary to maintain same structure in this global variable
38
- if (!window.__CARBON_INTERNALS_MODAL_LIST) {
39
- window.__CARBON_INTERNALS_MODAL_LIST = [];
44
+ if (!safeWindow.__CARBON_INTERNALS_MODAL_LIST) {
45
+ safeWindow.__CARBON_INTERNALS_MODAL_LIST = [];
40
46
  }
41
- this.modalList = window.__CARBON_INTERNALS_MODAL_LIST;
47
+ this.modalList = safeWindow.__CARBON_INTERNALS_MODAL_LIST;
42
48
  }
43
49
  return _createClass(ModalManagerInstance, [{
44
50
  key: "getTopModal",
@@ -84,16 +90,21 @@ let ModalManagerInstance = exports.ModalManagerInstance = /*#__PURE__*/function
84
90
  }, {
85
91
  key: "clearList",
86
92
  value: function clearList() {
87
- window.__CARBON_INTERNALS_MODAL_LIST = [];
88
- this.modalList = window.__CARBON_INTERNALS_MODAL_LIST;
93
+ const safeWindow = (0, _globals.getWindow)();
94
+ const cleared = [];
95
+ if (safeWindow) {
96
+ safeWindow.__CARBON_INTERNALS_MODAL_LIST = cleared;
97
+ }
98
+ this.modalList = cleared;
89
99
  this.callTopModalSetters();
90
100
  }
91
101
  }, {
92
102
  key: "callTopModalSetters",
93
103
  value: function callTopModalSetters() {
94
- if (window.__CARBON_INTERNALS_MODAL_SETTER_LIST) {
104
+ const safeWindow = (0, _globals.getWindow)();
105
+ if (safeWindow?.__CARBON_INTERNALS_MODAL_SETTER_LIST) {
95
106
  const topModal = this.getTopModal()?.modal || null;
96
- for (const setTopModal of window.__CARBON_INTERNALS_MODAL_SETTER_LIST) {
107
+ for (const setTopModal of safeWindow.__CARBON_INTERNALS_MODAL_SETTER_LIST) {
97
108
  setTopModal(topModal);
98
109
  }
99
110
  }
@@ -8,6 +8,7 @@ var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactTransitionGroup = require("react-transition-group");
9
9
  var _useScrollBlock = _interopRequireDefault(require("../../hooks/__internal__/useScrollBlock"));
10
10
  var _portal = _interopRequireDefault(require("../portal"));
11
+ var _globals = require("../../__internal__/dom/globals");
11
12
  var _events = _interopRequireDefault(require("../../__internal__/utils/helpers/events"));
12
13
  var _useModalManager = _interopRequireDefault(require("../../hooks/__internal__/useModalManager"));
13
14
  var _modal = require("./modal.style");
@@ -62,13 +63,14 @@ const Modal = ({
62
63
  onCancel(ev);
63
64
  }
64
65
  }, [disableClose, disableEscKey, onCancel]);
66
+ const safeDocument = (0, _globals.getDocument)();
65
67
  (0, _useModalManager.default)({
66
68
  open,
67
69
  closeModal,
68
70
  modalRef: ref,
69
71
  setTriggerRefocusFlag,
70
72
  topModalOverride,
71
- focusCallToActionElement: restoreFocusOnClose ? document.activeElement : undefined
73
+ focusCallToActionElement: restoreFocusOnClose && safeDocument ? safeDocument.activeElement : undefined
72
74
  });
73
75
  let background;
74
76
  let content;
@@ -13,6 +13,7 @@ var _button = _interopRequireDefault(require("../button"));
13
13
  var _popover = _interopRequireDefault(require("../../__internal__/popover"));
14
14
  var _utils = require("../../style/utils");
15
15
  var _useChildButtons = _interopRequireDefault(require("../../hooks/__internal__/useChildButtons"));
16
+ var _flatTable = _interopRequireDefault(require("../flat-table/__internal__/flat-table.context"));
16
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
18
  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); }
18
19
  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; }
@@ -33,6 +34,9 @@ const MultiActionButton = exports.MultiActionButton = /*#__PURE__*/(0, _react.fo
33
34
  ...rest
34
35
  }, ref) => {
35
36
  const buttonRef = (0, _react.useRef)(null);
37
+ const {
38
+ isInFlatTable
39
+ } = (0, _react.useContext)(_flatTable.default);
36
40
  (0, _react.useImperativeHandle)(ref, () => ({
37
41
  focusMainButton() {
38
42
  buttonRef.current?.focus();
@@ -67,6 +71,7 @@ const MultiActionButton = exports.MultiActionButton = /*#__PURE__*/(0, _react.fo
67
71
  ...(0, _utils.filterOutStyledSystemSpacingProps)(rest)
68
72
  };
69
73
  const renderAdditionalButtons = () => /*#__PURE__*/_react.default.createElement(_popover.default, {
74
+ disableBackgroundUI: isInFlatTable,
70
75
  disablePortal: true,
71
76
  placement: position === "left" ? "bottom-start" : /* istanbul ignore next */"bottom-end",
72
77
  reference: buttonNode,
@@ -20,6 +20,7 @@ var _modal = _interopRequireDefault(require("../modal/__internal__/modal.context
20
20
  var _useFocusPortalContent = _interopRequireDefault(require("../../hooks/__internal__/useFocusPortalContent"));
21
21
  var _tags = _interopRequireDefault(require("../../__internal__/utils/helpers/tags/tags"));
22
22
  var _focusTrapUtils = require("../../__internal__/focus-trap/focus-trap-utils");
23
+ var _flatTable = _interopRequireDefault(require("../flat-table/__internal__/flat-table.context"));
23
24
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
25
  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); }
25
26
  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; }
@@ -106,6 +107,9 @@ const PopoverContainer = exports.PopoverContainer = /*#__PURE__*/(0, _react.forw
106
107
  const isOpen = isControlled ? open : isOpenInternal;
107
108
  const reduceMotion = !(0, _useMediaQuery.default)("screen and (prefers-reduced-motion: no-preference)");
108
109
  const popoverMiddleware = usePopoverMiddleware(shouldCoverButton);
110
+ const {
111
+ isInFlatTable
112
+ } = (0, _react.useContext)(_flatTable.default);
109
113
  const closePopover = (0, _react.useCallback)(ev => {
110
114
  /* istanbul ignore else */
111
115
  if (!isControlled) setIsOpenInternal(false);
@@ -249,7 +253,8 @@ const PopoverContainer = exports.PopoverContainer = /*#__PURE__*/(0, _react.forw
249
253
  placement: position === "right" ? "bottom-start" : "bottom-end",
250
254
  popoverStrategy: disableAnimation || reduceMotion ? "fixed" : "absolute",
251
255
  middleware: popoverMiddleware,
252
- childRefOverride: popoverContentNodeRef
256
+ childRefOverride: popoverContentNodeRef,
257
+ disableBackgroundUI: isInFlatTable
253
258
  }, childrenToRender())));
254
259
  });
255
260
  var _default = exports.default = PopoverContainer;
@@ -20,6 +20,7 @@ var _themes = require("../../style/themes");
20
20
  var _useChildButtons = _interopRequireDefault(require("../../hooks/__internal__/useChildButtons"));
21
21
  var _splitButton2 = _interopRequireDefault(require("./__internal__/split-button.context"));
22
22
  var _useLocale = _interopRequireDefault(require("../../hooks/__internal__/useLocale"));
23
+ var _flatTable = _interopRequireDefault(require("../flat-table/__internal__/flat-table.context"));
23
24
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
25
  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); }
25
26
  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; }
@@ -47,6 +48,9 @@ const SplitButton = exports.SplitButton = /*#__PURE__*/(0, _react.forwardRef)(({
47
48
  const buttonLabelId = (0, _react.useRef)((0, _guid.default)());
48
49
  const mainButtonRef = (0, _react.useRef)(null);
49
50
  const toggleButtonRef = (0, _react.useRef)(null);
51
+ const {
52
+ isInFlatTable
53
+ } = (0, _react.useContext)(_flatTable.default);
50
54
  (0, _react.useImperativeHandle)(ref, () => ({
51
55
  focusMainButton() {
52
56
  mainButtonRef.current?.focus();
@@ -133,6 +137,7 @@ const SplitButton = exports.SplitButton = /*#__PURE__*/(0, _react.forwardRef)(({
133
137
  function renderAdditionalButtons() {
134
138
  if (!showAdditionalButtons) return null;
135
139
  return /*#__PURE__*/_react.default.createElement(_popover.default, {
140
+ disableBackgroundUI: isInFlatTable,
136
141
  disablePortal: true,
137
142
  placement: position === "left" ? /* istanbul ignore next */"bottom-start" : "bottom-end",
138
143
  popoverStrategy: "fixed",
@@ -14,6 +14,7 @@ var _icon = _interopRequireDefault(require("../../icon"));
14
14
  var _box = _interopRequireDefault(require("../../box"));
15
15
  var _verticalMenu = require("../vertical-menu.style");
16
16
  var _verticalMenuFullScreen = _interopRequireDefault(require("./__internal__/vertical-menu-full-screen.context"));
17
+ var _globals = require("../../../__internal__/dom/globals");
17
18
  var _events = _interopRequireDefault(require("../../../__internal__/utils/helpers/events/events"));
18
19
  var _useModalManager = _interopRequireDefault(require("../../../hooks/__internal__/useModalManager"));
19
20
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -36,12 +37,13 @@ const VerticalMenuFullScreen = ({
36
37
  onClose(ev);
37
38
  }
38
39
  }, [onClose]);
40
+ const safeDocument = (0, _globals.getDocument)();
39
41
  (0, _useModalManager.default)({
40
42
  open: isOpen,
41
43
  closeModal: handleKeyDown,
42
44
  modalRef: menuWrapperRef,
43
45
  topModalOverride: true,
44
- focusCallToActionElement: document.activeElement
46
+ focusCallToActionElement: safeDocument?.activeElement
45
47
  });
46
48
 
47
49
  // TODO remove this as part of FE-5650
@@ -4,32 +4,38 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ var _globals = require("../../../__internal__/dom/globals");
7
8
  function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
8
9
  function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
9
10
  function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
10
11
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
11
12
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
12
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
13
- // TODO: This component can be refactored to remove redundant code
13
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // TODO: This component can be refactored to remove redundant code
14
14
  // once we can confirm that all Sage products use version 105.0.0^
15
15
  let ScrollBlockManager = /*#__PURE__*/function () {
16
16
  function ScrollBlockManager() {
17
17
  _classCallCheck(this, ScrollBlockManager);
18
18
  _defineProperty(this, "components", void 0);
19
19
  _defineProperty(this, "originalValues", void 0);
20
+ const safeWindow = (0, _globals.getWindow)();
21
+ if (!safeWindow) {
22
+ this.components = {};
23
+ this.originalValues = [];
24
+ return;
25
+ }
20
26
  // Due to possibility of multiple carbon versions using it
21
27
  // it is necessary to maintain same structure in this global variable
22
- if (!window.__CARBON_INTERNALS_SCROLL_BLOCKERS) {
23
- window.__CARBON_INTERNALS_SCROLL_BLOCKERS = {
28
+ if (!safeWindow.__CARBON_INTERNALS_SCROLL_BLOCKERS) {
29
+ safeWindow.__CARBON_INTERNALS_SCROLL_BLOCKERS = {
24
30
  components: {},
25
31
  // originalValues can be removed
26
32
  originalValues: [],
27
33
  restoreValues: null
28
34
  };
29
35
  }
30
- this.components = window.__CARBON_INTERNALS_SCROLL_BLOCKERS.components;
36
+ this.components = safeWindow.__CARBON_INTERNALS_SCROLL_BLOCKERS.components;
31
37
  // TODO: originalValues can be removed
32
- this.originalValues = window.__CARBON_INTERNALS_SCROLL_BLOCKERS.originalValues;
38
+ this.originalValues = safeWindow.__CARBON_INTERNALS_SCROLL_BLOCKERS.originalValues;
33
39
  }
34
40
  return _createClass(ScrollBlockManager, [{
35
41
  key: "registerComponent",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "carbon-react",
3
- "version": "151.2.2",
3
+ "version": "151.3.0",
4
4
  "description": "A library of reusable React components for easily building user interfaces.",
5
5
  "files": [
6
6
  "lib",
@@ -131,6 +131,7 @@
131
131
  "eslint-plugin-playwright": "^1.6.0",
132
132
  "eslint-plugin-react": "^7.33.2",
133
133
  "eslint-plugin-react-hooks": "^4.6.0",
134
+ "eslint-plugin-ssr-friendly": "^1.3.0",
134
135
  "eslint-plugin-testing-library": "^6.2.2",
135
136
  "events": "~1.1.1",
136
137
  "fast-glob": "^3.3.2",