carbon-react 126.3.0 → 126.4.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 (43) hide show
  1. package/esm/__internal__/popover/popover.component.d.ts +3 -2
  2. package/esm/__internal__/popover/popover.component.js +3 -2
  3. package/esm/components/popover-container/popover-container.component.js +51 -41
  4. package/esm/components/step-sequence/step-sequence.component.js +6 -0
  5. package/esm/components/tile/index.d.ts +2 -0
  6. package/esm/components/tile/index.js +1 -0
  7. package/esm/components/tile/tile-footer/tile-footer.component.d.ts +1 -1
  8. package/esm/components/tile/tile-footer/tile-footer.style.js +6 -1
  9. package/esm/components/tile/tile-header/index.d.ts +2 -0
  10. package/esm/components/tile/tile-header/index.js +1 -0
  11. package/esm/components/tile/tile-header/tile-header.component.d.ts +10 -0
  12. package/esm/components/tile/tile-header/tile-header.component.js +14 -0
  13. package/esm/components/tile/tile-header/tile-header.style.d.ts +5 -0
  14. package/esm/components/tile/tile-header/tile-header.style.js +32 -0
  15. package/esm/components/tile/tile.component.d.ts +4 -4
  16. package/esm/components/tile/tile.style.js +27 -2
  17. package/esm/hooks/__internal__/useFocusPortalContent/index.d.ts +1 -0
  18. package/esm/hooks/__internal__/useFocusPortalContent/index.js +1 -0
  19. package/esm/hooks/__internal__/useFocusPortalContent/useFocusPortalContent.d.ts +3 -0
  20. package/esm/hooks/__internal__/useFocusPortalContent/useFocusPortalContent.js +52 -0
  21. package/lib/__internal__/popover/popover.component.d.ts +3 -2
  22. package/lib/__internal__/popover/popover.component.js +3 -2
  23. package/lib/components/popover-container/popover-container.component.js +51 -41
  24. package/lib/components/step-sequence/step-sequence.component.js +6 -0
  25. package/lib/components/tile/index.d.ts +2 -0
  26. package/lib/components/tile/index.js +7 -0
  27. package/lib/components/tile/tile-footer/tile-footer.component.d.ts +1 -1
  28. package/lib/components/tile/tile-footer/tile-footer.style.js +6 -1
  29. package/lib/components/tile/tile-header/index.d.ts +2 -0
  30. package/lib/components/tile/tile-header/index.js +13 -0
  31. package/lib/components/tile/tile-header/package.json +6 -0
  32. package/lib/components/tile/tile-header/tile-header.component.d.ts +10 -0
  33. package/lib/components/tile/tile-header/tile-header.component.js +22 -0
  34. package/lib/components/tile/tile-header/tile-header.style.d.ts +5 -0
  35. package/lib/components/tile/tile-header/tile-header.style.js +40 -0
  36. package/lib/components/tile/tile.component.d.ts +4 -4
  37. package/lib/components/tile/tile.style.js +27 -2
  38. package/lib/hooks/__internal__/useFocusPortalContent/index.d.ts +1 -0
  39. package/lib/hooks/__internal__/useFocusPortalContent/index.js +13 -0
  40. package/lib/hooks/__internal__/useFocusPortalContent/package.json +6 -0
  41. package/lib/hooks/__internal__/useFocusPortalContent/useFocusPortalContent.d.ts +3 -0
  42. package/lib/hooks/__internal__/useFocusPortalContent/useFocusPortalContent.js +60 -0
  43. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import React from "react";
1
+ import React, { MutableRefObject } from "react";
2
2
  import { Placement, Middleware } from "@floating-ui/dom";
3
3
  declare type CustomRefObject<T> = {
4
4
  current?: T | null;
@@ -13,6 +13,7 @@ export interface PopoverProps {
13
13
  isOpen?: boolean;
14
14
  animationFrame?: boolean;
15
15
  popoverStrategy?: "absolute" | "fixed";
16
+ childRefOverride?: MutableRefObject<HTMLDivElement | null>;
16
17
  }
17
- declare const Popover: ({ children, placement, disablePortal, reference, middleware, disableBackgroundUI, isOpen, animationFrame, popoverStrategy, }: PopoverProps) => React.JSX.Element;
18
+ declare const Popover: ({ children, placement, disablePortal, reference, middleware, disableBackgroundUI, isOpen, animationFrame, popoverStrategy, childRefOverride, }: PopoverProps) => React.JSX.Element;
18
19
  export default Popover;
@@ -18,7 +18,8 @@ const Popover = ({
18
18
  disableBackgroundUI,
19
19
  isOpen = true,
20
20
  animationFrame,
21
- popoverStrategy = "absolute"
21
+ popoverStrategy = "absolute",
22
+ childRefOverride
22
23
  }) => {
23
24
  const elementDOM = useRef(null);
24
25
  const {
@@ -30,7 +31,7 @@ const Popover = ({
30
31
  elementDOM.current = document.createElement("div");
31
32
  mountNode.appendChild(elementDOM.current);
32
33
  }
33
- const childRef = React.Children.only(children).ref;
34
+ const childRef = childRefOverride || React.Children.only(children).ref;
34
35
  const innerRef = useRef(null);
35
36
  const floatingReference = childRef || innerRef;
36
37
  let content;
@@ -13,6 +13,7 @@ import useClickAwayListener from "../../hooks/__internal__/useClickAwayListener"
13
13
  import Events from "../../__internal__/utils/helpers/events";
14
14
  import FocusTrap from "../../__internal__/focus-trap";
15
15
  import { ModalContext } from "../modal";
16
+ import useFocusPortalContent from "../../hooks/__internal__/useFocusPortalContent";
16
17
  export const renderOpen = ({
17
18
  tabIndex,
18
19
  onClick,
@@ -22,18 +23,20 @@ export const renderOpen = ({
22
23
  id,
23
24
  "aria-expanded": ariaExpanded,
24
25
  "aria-haspopup": ariaHasPopup
25
- }) => /*#__PURE__*/React.createElement(PopoverContainerOpenIcon, {
26
- tabIndex: tabIndex,
27
- onClick: onClick,
28
- "data-element": dataElement,
29
- ref: ref,
30
- "aria-label": ariaLabel,
31
- "aria-haspopup": ariaHasPopup,
32
- "aria-expanded": ariaExpanded,
33
- id: id
34
- }, /*#__PURE__*/React.createElement(Icon, {
35
- type: "settings"
36
- }));
26
+ }) => {
27
+ return /*#__PURE__*/React.createElement(PopoverContainerOpenIcon, {
28
+ tabIndex: tabIndex,
29
+ onClick: onClick,
30
+ "data-element": dataElement,
31
+ ref: ref,
32
+ "aria-label": ariaLabel,
33
+ "aria-haspopup": ariaHasPopup,
34
+ "aria-expanded": ariaExpanded,
35
+ id: id
36
+ }, /*#__PURE__*/React.createElement(Icon, {
37
+ type: "settings"
38
+ }));
39
+ };
37
40
  export const renderClose = ({
38
41
  "data-element": dataElement,
39
42
  tabIndex,
@@ -84,8 +87,12 @@ export const PopoverContainer = ({
84
87
  const isOpen = isControlled ? open : isOpenInternal;
85
88
  const reduceMotion = !useMediaQuery("screen and (prefers-reduced-motion: no-preference)");
86
89
  const closePopover = useCallback(ev => {
87
- if (!isControlled) setIsOpenInternal(false);
88
- if (onClose) onClose(ev);
90
+ if (!isControlled) {
91
+ setIsOpenInternal(false);
92
+ }
93
+ if (onClose) {
94
+ onClose(ev);
95
+ }
89
96
  if (isOpen && openButtonRef.current) {
90
97
  openButtonRef.current.focus();
91
98
  }
@@ -115,6 +122,7 @@ export const PopoverContainer = ({
115
122
  const handleCloseButtonClick = e => {
116
123
  closePopover(e);
117
124
  };
125
+ useFocusPortalContent(shouldCoverButton ? undefined : popoverContentNodeRef, shouldCoverButton ? undefined : openButtonRef, closePopover);
118
126
  const renderOpenComponentProps = {
119
127
  tabIndex: 0,
120
128
  "aria-expanded": isOpen,
@@ -139,25 +147,7 @@ export const PopoverContainer = ({
139
147
  };
140
148
  const handleClick = useClickAwayListener(handleClickAway, "mousedown");
141
149
  const [isAnimationComplete, setIsAnimationComplete] = useState(false);
142
- const popover = /*#__PURE__*/React.createElement(Transition, {
143
- in: isOpen,
144
- timeout: {
145
- exit: 300
146
- },
147
- appear: true,
148
- mountOnEnter: true,
149
- unmountOnExit: true,
150
- nodeRef: popoverContentNodeRef,
151
- onEntered: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(true) : undefined,
152
- onExiting: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(false) : undefined
153
- }, state => isOpen && /*#__PURE__*/React.createElement(Popover, _extends({
154
- disablePortal: true,
155
- reference: popoverReference,
156
- placement: position === "right" ? "bottom-start" : "bottom-end",
157
- popoverStrategy: disableAnimation || reduceMotion ? "fixed" : "absolute"
158
- }, shouldCoverButton && {
159
- middleware: popoverMiddleware
160
- }), /*#__PURE__*/React.createElement(PopoverContainerContentStyle, _extends({
150
+ const popover = state => /*#__PURE__*/React.createElement(PopoverContainerContentStyle, _extends({
161
151
  "data-element": "popover-container-content",
162
152
  role: "dialog",
163
153
  animationState: state,
@@ -171,19 +161,39 @@ export const PopoverContainer = ({
171
161
  }, filterStyledSystemPaddingProps(rest)), /*#__PURE__*/React.createElement(PopoverContainerHeaderStyle, null, /*#__PURE__*/React.createElement(PopoverContainerTitleStyle, {
172
162
  id: popoverContainerId,
173
163
  "data-element": "popover-container-title"
174
- }, title), renderCloseComponent(renderCloseComponentProps)), children)));
175
- return /*#__PURE__*/React.createElement(PopoverContainerWrapperStyle, {
176
- "data-component": "popover-container",
177
- onMouseDown: handleClick
178
- }, /*#__PURE__*/React.createElement("div", {
179
- ref: popoverReference
180
- }, renderOpenComponent(renderOpenComponentProps)), shouldCoverButton ? /*#__PURE__*/React.createElement(ModalContext.Provider, {
164
+ }, title), renderCloseComponent(renderCloseComponentProps)), children);
165
+ const childrenToRender = state => shouldCoverButton ? /*#__PURE__*/React.createElement(ModalContext.Provider, {
181
166
  value: {
182
167
  isAnimationComplete
183
168
  }
184
169
  }, /*#__PURE__*/React.createElement(FocusTrap, {
185
170
  wrapperRef: popoverContentNodeRef,
186
171
  isOpen: isOpen
187
- }, popover)) : popover);
172
+ }, popover(state))) : popover(state);
173
+ return /*#__PURE__*/React.createElement(PopoverContainerWrapperStyle, {
174
+ "data-component": "popover-container",
175
+ onMouseDown: handleClick
176
+ }, /*#__PURE__*/React.createElement("div", {
177
+ ref: popoverReference
178
+ }, renderOpenComponent(renderOpenComponentProps)), /*#__PURE__*/React.createElement(Transition, {
179
+ in: isOpen,
180
+ timeout: {
181
+ exit: 300
182
+ },
183
+ appear: true,
184
+ mountOnEnter: true,
185
+ unmountOnExit: true,
186
+ nodeRef: popoverContentNodeRef,
187
+ onEntered: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(true) : undefined,
188
+ onExiting: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(false) : undefined
189
+ }, state => isOpen && /*#__PURE__*/React.createElement(Popover, _extends({
190
+ reference: popoverReference,
191
+ placement: position === "right" ? "bottom-start" : "bottom-end",
192
+ popoverStrategy: disableAnimation || reduceMotion ? "fixed" : "absolute"
193
+ }, shouldCoverButton && {
194
+ middleware: popoverMiddleware
195
+ }, {
196
+ childRefOverride: popoverContentNodeRef
197
+ }), childrenToRender(state))));
188
198
  };
189
199
  export default PopoverContainer;
@@ -1,15 +1,21 @@
1
1
  function _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }
2
2
  import React from "react";
3
3
  import PropTypes from "prop-types";
4
+ import Logger from "../../__internal__/utils/logger";
4
5
  import StyledStepSequence from "./step-sequence.style";
5
6
  export const StepSequenceContext = /*#__PURE__*/React.createContext({
6
7
  orientation: "horizontal"
7
8
  });
9
+ let deprecateWarnTriggered = false;
8
10
  export const StepSequence = ({
9
11
  children,
10
12
  orientation = "horizontal",
11
13
  ...props
12
14
  }) => {
15
+ if (!deprecateWarnTriggered) {
16
+ deprecateWarnTriggered = true;
17
+ Logger.deprecate("The `StepSequence` component is deprecated and will soon be removed," + " please use the `StepFlow` component instead.");
18
+ }
13
19
  return /*#__PURE__*/React.createElement(StyledStepSequence, _extends({
14
20
  "data-component": "step-sequence",
15
21
  orientation: orientation,
@@ -4,6 +4,8 @@ export { default as TileContent } from "./tile-content";
4
4
  export type { TileContentProps } from "./tile-content";
5
5
  export { default as TileFooter } from "./tile-footer";
6
6
  export type { TileFooterProps } from "./tile-footer";
7
+ export { default as TileHeader } from "./tile-header";
8
+ export type { TileHeaderProps } from "./tile-header";
7
9
  export { default as FlexTileContainer } from "./flex-tile-container";
8
10
  export type { FlexTileContainerProps } from "./flex-tile-container";
9
11
  export { default as FlexTileCell } from "./flex-tile-cell";
@@ -1,6 +1,7 @@
1
1
  export { default as Tile } from "./tile.component";
2
2
  export { default as TileContent } from "./tile-content";
3
3
  export { default as TileFooter } from "./tile-footer";
4
+ export { default as TileHeader } from "./tile-header";
4
5
  export { default as FlexTileContainer } from "./flex-tile-container";
5
6
  export { default as FlexTileCell } from "./flex-tile-cell";
6
7
  export { default as FlexTileDivider } from "./flex-tile-divider";
@@ -4,7 +4,7 @@ import { TagProps } from "../../../__internal__/utils/helpers/tags";
4
4
  export interface TileFooterProps extends PaddingProps, TagProps {
5
5
  children?: React.ReactNode;
6
6
  /** set which background color variant should be used */
7
- variant?: "default" | "black" | "transparent";
7
+ variant?: "default" | "black" | "transparent" | "grey";
8
8
  }
9
9
  export declare const TileFooter: ({ variant, children, ...rest }: TileFooterProps) => React.JSX.Element;
10
10
  export default TileFooter;
@@ -7,18 +7,23 @@ const getBackgroundColor = variant => {
7
7
  return "transparent";
8
8
  case "black":
9
9
  return "var(--colorsUtilityYin100)";
10
+ case "grey":
11
+ return "var(--colorsUtilityMajor025)";
10
12
  default:
11
13
  return "var(--colorsUtilityMajor100)";
12
14
  }
13
15
  };
14
16
  const StyledTileFooter = styled.div`
15
17
  ${padding}
18
+ border-bottom-left-radius: calc(var(--tileBorderRadius) - 1px);
19
+ border-bottom-right-radius: calc(var(--tileBorderRadius) - 1px);
16
20
 
17
21
  ${({
18
22
  variant
19
23
  }) => css`
20
24
  background: ${getBackgroundColor(variant)};
21
- border-top: 1px solid var(--colorsUtilityMajor100);
25
+ border-top: 1px solid
26
+ ${variant === "grey" ? "var(--colorsUtilityMajor200)" : "var(--colorsUtilityMajor100)"};
22
27
  `}
23
28
  `;
24
29
  StyledTileFooter.defaultProps = {
@@ -0,0 +1,2 @@
1
+ export { default } from "./tile-header.component";
2
+ export type { TileHeaderProps } from "./tile-header.component";
@@ -0,0 +1 @@
1
+ export { default } from "./tile-header.component";
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { PaddingProps } from "styled-system";
3
+ import { TagProps } from "../../../__internal__/utils/helpers/tags";
4
+ export interface TileHeaderProps extends PaddingProps, TagProps {
5
+ children?: React.ReactNode;
6
+ /** set which background color variant should be used */
7
+ variant?: "default" | "black" | "transparent" | "grey";
8
+ }
9
+ export declare const TileHeader: ({ variant, children, ...rest }: TileHeaderProps) => React.JSX.Element;
10
+ export default TileHeader;
@@ -0,0 +1,14 @@
1
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }
2
+ import React from "react";
3
+ import PropTypes from "prop-types";
4
+ import StyledTileHeader from "./tile-header.style";
5
+ import tagComponent from "../../../__internal__/utils/helpers/tags";
6
+ import filterStyledSystemPaddingProps from "../../../style/utils/filter-styled-system-padding-props";
7
+ export const TileHeader = ({
8
+ variant,
9
+ children,
10
+ ...rest
11
+ }) => /*#__PURE__*/React.createElement(StyledTileHeader, _extends({
12
+ variant: variant
13
+ }, filterStyledSystemPaddingProps(rest), tagComponent("tile-header", rest)), children);
14
+ export default TileHeader;
@@ -0,0 +1,5 @@
1
+ import { TileHeaderProps } from "./tile-header.component";
2
+ declare const StyledTileHeader: import("styled-components").StyledComponent<"div", any, {
3
+ variant: TileHeaderProps["variant"];
4
+ }, never>;
5
+ export default StyledTileHeader;
@@ -0,0 +1,32 @@
1
+ import styled, { css } from "styled-components";
2
+ import { padding } from "styled-system";
3
+ import { baseTheme } from "../../../style/themes";
4
+ const getBackgroundColor = variant => {
5
+ switch (variant) {
6
+ case "transparent":
7
+ return "transparent";
8
+ case "black":
9
+ return "var(--colorsUtilityYin100)";
10
+ case "grey":
11
+ return "var(--colorsUtilityMajor025)";
12
+ default:
13
+ return "var(--colorsUtilityMajor100)";
14
+ }
15
+ };
16
+ const StyledTileHeader = styled.div`
17
+ ${padding}
18
+ border-top-left-radius: calc(var(--tileBorderRadius) - 1px);
19
+ border-top-right-radius: calc(var(--tileBorderRadius) - 1px);
20
+
21
+ ${({
22
+ variant
23
+ }) => css`
24
+ background: ${getBackgroundColor(variant)};
25
+ border-bottom: 1px solid
26
+ ${variant === "grey" ? "var(--colorsUtilityMajor200)" : "var(--colorsUtilityMajor100)"};
27
+ `}
28
+ `;
29
+ StyledTileHeader.defaultProps = {
30
+ theme: baseTheme
31
+ };
32
+ export default StyledTileHeader;
@@ -4,8 +4,8 @@ import { SpaceProps, WidthProps } from "styled-system";
4
4
  import { TagProps } from "../../__internal__/utils/helpers/tags";
5
5
  declare type DesignTokensType = keyof typeof DesignTokens;
6
6
  export interface TileProps extends SpaceProps, WidthProps, TagProps {
7
- /** Sets the theme of the tile - either 'tile', 'transparent' or 'active' */
8
- variant?: "tile" | "transparent" | "active";
7
+ /** Sets the theme of the tile */
8
+ variant?: "tile" | "transparent" | "active" | "grey";
9
9
  /**
10
10
  * The content to render within the tile. Each child will be wrapped with
11
11
  * a TileContent wrapper, which allows any individual child component to take a
@@ -25,8 +25,8 @@ export interface TileProps extends SpaceProps, WidthProps, TagProps {
25
25
  borderWidth?: Extract<DesignTokensType, `borderWidth${string}`>;
26
26
  /** Sets the border variant that should be used */
27
27
  borderVariant?: "default" | "selected" | "positive" | "negative" | "caution" | "info";
28
- /** Sets the level of roundness of the corners, "default" is 8px and "large" is 16px */
29
- roundness?: "default" | "large";
28
+ /** Sets the level of roundness of the corners, "default" is 8px, "large" is 16px and "small" is 4px */
29
+ roundness?: "default" | "large" | "small";
30
30
  /**
31
31
  * Set a percentage-based height for the whole Tile component, relative to its parent.
32
32
  */
@@ -18,6 +18,16 @@ const getBorderColor = borderVariant => {
18
18
  return "var(--colorsUtilityMajor100)";
19
19
  }
20
20
  };
21
+ const getBorderRadius = roundness => {
22
+ switch (roundness) {
23
+ case "large":
24
+ return "var(--borderRadius200)";
25
+ case "small":
26
+ return "var(--borderRadius050)";
27
+ default:
28
+ return "var(--borderRadius100)";
29
+ }
30
+ };
21
31
  const StyledTile = styled.div`
22
32
  ${({
23
33
  borderVariant,
@@ -32,8 +42,18 @@ const StyledTile = styled.div`
32
42
 
33
43
  box-sizing: border-box;
34
44
  border: var(--${borderWidth}) solid ${getBorderColor(borderVariant)};
35
- border-radius: ${roundness === "default" ? "var(--borderRadius100)" : "var(--borderRadius200)"};
36
- overflow: hidden;
45
+ border-radius: ${getBorderRadius(roundness)};
46
+ --tileBorderRadius: ${getBorderRadius(roundness)};
47
+
48
+ > *:first-child {
49
+ border-top-left-radius: calc(${getBorderRadius(roundness)} - 1px);
50
+ border-top-right-radius: calc(${getBorderRadius(roundness)} - 1px);
51
+ }
52
+
53
+ > *:last-child {
54
+ border-bottom-left-radius: calc(${getBorderRadius(roundness)} - 1px);
55
+ border-bottom-right-radius: calc(${getBorderRadius(roundness)} - 1px);
56
+ }
37
57
 
38
58
  ${variant === "tile" && css`
39
59
  background-color: var(--colorsUtilityYang100);
@@ -48,6 +68,11 @@ const StyledTile = styled.div`
48
68
  border-color: var(--colorsActionMajor500);
49
69
  `}
50
70
 
71
+ ${variant === "grey" && css`
72
+ background-color: var(--colorsUtilityMajor025);
73
+ border-color: var(--colorsUtilityMajor200);
74
+ `}
75
+
51
76
  display: flex;
52
77
  flex-direction: ${isHorizontal ? "row" : "column"};
53
78
  position: relative;
@@ -0,0 +1 @@
1
+ export { default } from "./useFocusPortalContent";
@@ -0,0 +1 @@
1
+ export { default } from "./useFocusPortalContent";
@@ -0,0 +1,3 @@
1
+ import { RefObject } from "react";
2
+ declare const _default: (container?: RefObject<HTMLElement>, target?: RefObject<HTMLElement>, focusCallback?: ((ev: KeyboardEvent) => void) | undefined) => void;
3
+ export default _default;
@@ -0,0 +1,52 @@
1
+ import { useEffect } from "react";
2
+ import Events from "../../../__internal__/utils/helpers/events";
3
+ import { defaultFocusableSelectors } from "../../../__internal__/focus-trap/focus-trap-utils";
4
+ export default ((container, target, focusCallback) => {
5
+ useEffect(() => {
6
+ const handleFocusPortalContent = ev => {
7
+ if (container?.current && target?.current) {
8
+ const focusableElementsInContainer = Array.from(container.current?.querySelectorAll(defaultFocusableSelectors) || /* istanbul ignore next */[]);
9
+ if (target?.current === document.activeElement) {
10
+ if (Events.isTabKey(ev) && !Events.isShiftKey(ev) && focusableElementsInContainer[0]) {
11
+ ev.preventDefault();
12
+ focusableElementsInContainer[0]?.focus();
13
+ }
14
+ return;
15
+ }
16
+
17
+ /* istanbul ignore if */
18
+ if (!focusableElementsInContainer.length) {
19
+ return;
20
+ }
21
+ const lastElementFocused = focusableElementsInContainer[focusableElementsInContainer.length - 1] === document.activeElement;
22
+ const firstElementFocused = focusableElementsInContainer[0] === document.activeElement;
23
+ if (Events.isTabKey(ev)) {
24
+ // last element focused inside portal navigate to next element in DOM after the target/ trigger element
25
+ if (lastElementFocused && !Events.isShiftKey(ev)) {
26
+ ev.preventDefault();
27
+ const allFocusableElements = Array.from(document.querySelectorAll(defaultFocusableSelectors) || /* istanbul ignore next */[]);
28
+ const filteredElements = allFocusableElements.filter(el => el === target.current || Number(el.tabIndex) !== -1);
29
+ const nextIndex = filteredElements.indexOf(target.current) + 1;
30
+ focusCallback?.(ev);
31
+ filteredElements[nextIndex]?.focus();
32
+ return;
33
+ }
34
+ // first element focused inside portal navigate back to the target/ trigger element
35
+ if (firstElementFocused && Events.isShiftKey(ev)) {
36
+ ev.preventDefault();
37
+ focusCallback?.(ev);
38
+
39
+ /* istanbul ignore else */
40
+ if (target.current !== document.activeElement) {
41
+ target.current?.focus();
42
+ }
43
+ }
44
+ }
45
+ }
46
+ };
47
+ document.addEventListener("keydown", handleFocusPortalContent);
48
+ return () => {
49
+ document.removeEventListener("keydown", handleFocusPortalContent);
50
+ };
51
+ }, [target, container, focusCallback]);
52
+ });
@@ -1,4 +1,4 @@
1
- import React from "react";
1
+ import React, { MutableRefObject } from "react";
2
2
  import { Placement, Middleware } from "@floating-ui/dom";
3
3
  declare type CustomRefObject<T> = {
4
4
  current?: T | null;
@@ -13,6 +13,7 @@ export interface PopoverProps {
13
13
  isOpen?: boolean;
14
14
  animationFrame?: boolean;
15
15
  popoverStrategy?: "absolute" | "fixed";
16
+ childRefOverride?: MutableRefObject<HTMLDivElement | null>;
16
17
  }
17
- declare const Popover: ({ children, placement, disablePortal, reference, middleware, disableBackgroundUI, isOpen, animationFrame, popoverStrategy, }: PopoverProps) => React.JSX.Element;
18
+ declare const Popover: ({ children, placement, disablePortal, reference, middleware, disableBackgroundUI, isOpen, animationFrame, popoverStrategy, childRefOverride, }: PopoverProps) => React.JSX.Element;
18
19
  export default Popover;
@@ -27,7 +27,8 @@ const Popover = ({
27
27
  disableBackgroundUI,
28
28
  isOpen = true,
29
29
  animationFrame,
30
- popoverStrategy = "absolute"
30
+ popoverStrategy = "absolute",
31
+ childRefOverride
31
32
  }) => {
32
33
  const elementDOM = (0, _react.useRef)(null);
33
34
  const {
@@ -39,7 +40,7 @@ const Popover = ({
39
40
  elementDOM.current = document.createElement("div");
40
41
  mountNode.appendChild(elementDOM.current);
41
42
  }
42
- const childRef = _react.default.Children.only(children).ref;
43
+ const childRef = childRefOverride || _react.default.Children.only(children).ref;
43
44
  const innerRef = (0, _react.useRef)(null);
44
45
  const floatingReference = childRef || innerRef;
45
46
  let content;
@@ -18,6 +18,7 @@ var _useClickAwayListener = _interopRequireDefault(require("../../hooks/__intern
18
18
  var _events = _interopRequireDefault(require("../../__internal__/utils/helpers/events"));
19
19
  var _focusTrap = _interopRequireDefault(require("../../__internal__/focus-trap"));
20
20
  var _modal = require("../modal");
21
+ var _useFocusPortalContent = _interopRequireDefault(require("../../hooks/__internal__/useFocusPortalContent"));
21
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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 && Object.prototype.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; }
@@ -31,18 +32,20 @@ const renderOpen = ({
31
32
  id,
32
33
  "aria-expanded": ariaExpanded,
33
34
  "aria-haspopup": ariaHasPopup
34
- }) => /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerOpenIcon, {
35
- tabIndex: tabIndex,
36
- onClick: onClick,
37
- "data-element": dataElement,
38
- ref: ref,
39
- "aria-label": ariaLabel,
40
- "aria-haspopup": ariaHasPopup,
41
- "aria-expanded": ariaExpanded,
42
- id: id
43
- }, /*#__PURE__*/_react.default.createElement(_icon.default, {
44
- type: "settings"
45
- }));
35
+ }) => {
36
+ return /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerOpenIcon, {
37
+ tabIndex: tabIndex,
38
+ onClick: onClick,
39
+ "data-element": dataElement,
40
+ ref: ref,
41
+ "aria-label": ariaLabel,
42
+ "aria-haspopup": ariaHasPopup,
43
+ "aria-expanded": ariaExpanded,
44
+ id: id
45
+ }, /*#__PURE__*/_react.default.createElement(_icon.default, {
46
+ type: "settings"
47
+ }));
48
+ };
46
49
  exports.renderOpen = renderOpen;
47
50
  const renderClose = ({
48
51
  "data-element": dataElement,
@@ -95,8 +98,12 @@ const PopoverContainer = ({
95
98
  const isOpen = isControlled ? open : isOpenInternal;
96
99
  const reduceMotion = !(0, _useMediaQuery.default)("screen and (prefers-reduced-motion: no-preference)");
97
100
  const closePopover = (0, _react.useCallback)(ev => {
98
- if (!isControlled) setIsOpenInternal(false);
99
- if (onClose) onClose(ev);
101
+ if (!isControlled) {
102
+ setIsOpenInternal(false);
103
+ }
104
+ if (onClose) {
105
+ onClose(ev);
106
+ }
100
107
  if (isOpen && openButtonRef.current) {
101
108
  openButtonRef.current.focus();
102
109
  }
@@ -126,6 +133,7 @@ const PopoverContainer = ({
126
133
  const handleCloseButtonClick = e => {
127
134
  closePopover(e);
128
135
  };
136
+ (0, _useFocusPortalContent.default)(shouldCoverButton ? undefined : popoverContentNodeRef, shouldCoverButton ? undefined : openButtonRef, closePopover);
129
137
  const renderOpenComponentProps = {
130
138
  tabIndex: 0,
131
139
  "aria-expanded": isOpen,
@@ -150,25 +158,7 @@ const PopoverContainer = ({
150
158
  };
151
159
  const handleClick = (0, _useClickAwayListener.default)(handleClickAway, "mousedown");
152
160
  const [isAnimationComplete, setIsAnimationComplete] = (0, _react.useState)(false);
153
- const popover = /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.Transition, {
154
- in: isOpen,
155
- timeout: {
156
- exit: 300
157
- },
158
- appear: true,
159
- mountOnEnter: true,
160
- unmountOnExit: true,
161
- nodeRef: popoverContentNodeRef,
162
- onEntered: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(true) : undefined,
163
- onExiting: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(false) : undefined
164
- }, state => isOpen && /*#__PURE__*/_react.default.createElement(_popover.default, _extends({
165
- disablePortal: true,
166
- reference: popoverReference,
167
- placement: position === "right" ? "bottom-start" : "bottom-end",
168
- popoverStrategy: disableAnimation || reduceMotion ? "fixed" : "absolute"
169
- }, shouldCoverButton && {
170
- middleware: popoverMiddleware
171
- }), /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerContentStyle, _extends({
161
+ const popover = state => /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerContentStyle, _extends({
172
162
  "data-element": "popover-container-content",
173
163
  role: "dialog",
174
164
  animationState: state,
@@ -182,20 +172,40 @@ const PopoverContainer = ({
182
172
  }, (0, _utils.filterStyledSystemPaddingProps)(rest)), /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerHeaderStyle, null, /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerTitleStyle, {
183
173
  id: popoverContainerId,
184
174
  "data-element": "popover-container-title"
185
- }, title), renderCloseComponent(renderCloseComponentProps)), children)));
186
- return /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerWrapperStyle, {
187
- "data-component": "popover-container",
188
- onMouseDown: handleClick
189
- }, /*#__PURE__*/_react.default.createElement("div", {
190
- ref: popoverReference
191
- }, renderOpenComponent(renderOpenComponentProps)), shouldCoverButton ? /*#__PURE__*/_react.default.createElement(_modal.ModalContext.Provider, {
175
+ }, title), renderCloseComponent(renderCloseComponentProps)), children);
176
+ const childrenToRender = state => shouldCoverButton ? /*#__PURE__*/_react.default.createElement(_modal.ModalContext.Provider, {
192
177
  value: {
193
178
  isAnimationComplete
194
179
  }
195
180
  }, /*#__PURE__*/_react.default.createElement(_focusTrap.default, {
196
181
  wrapperRef: popoverContentNodeRef,
197
182
  isOpen: isOpen
198
- }, popover)) : popover);
183
+ }, popover(state))) : popover(state);
184
+ return /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerWrapperStyle, {
185
+ "data-component": "popover-container",
186
+ onMouseDown: handleClick
187
+ }, /*#__PURE__*/_react.default.createElement("div", {
188
+ ref: popoverReference
189
+ }, renderOpenComponent(renderOpenComponentProps)), /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.Transition, {
190
+ in: isOpen,
191
+ timeout: {
192
+ exit: 300
193
+ },
194
+ appear: true,
195
+ mountOnEnter: true,
196
+ unmountOnExit: true,
197
+ nodeRef: popoverContentNodeRef,
198
+ onEntered: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(true) : undefined,
199
+ onExiting: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(false) : undefined
200
+ }, state => isOpen && /*#__PURE__*/_react.default.createElement(_popover.default, _extends({
201
+ reference: popoverReference,
202
+ placement: position === "right" ? "bottom-start" : "bottom-end",
203
+ popoverStrategy: disableAnimation || reduceMotion ? "fixed" : "absolute"
204
+ }, shouldCoverButton && {
205
+ middleware: popoverMiddleware
206
+ }, {
207
+ childRefOverride: popoverContentNodeRef
208
+ }), childrenToRender(state))));
199
209
  };
200
210
  exports.PopoverContainer = PopoverContainer;
201
211
  var _default = exports.default = PopoverContainer;
@@ -6,17 +6,23 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = exports.StepSequenceContext = exports.StepSequence = void 0;
7
7
  var _react = _interopRequireDefault(require("react"));
8
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _logger = _interopRequireDefault(require("../../__internal__/utils/logger"));
9
10
  var _stepSequence = _interopRequireDefault(require("./step-sequence.style"));
10
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
12
  function _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }
12
13
  const StepSequenceContext = exports.StepSequenceContext = /*#__PURE__*/_react.default.createContext({
13
14
  orientation: "horizontal"
14
15
  });
16
+ let deprecateWarnTriggered = false;
15
17
  const StepSequence = ({
16
18
  children,
17
19
  orientation = "horizontal",
18
20
  ...props
19
21
  }) => {
22
+ if (!deprecateWarnTriggered) {
23
+ deprecateWarnTriggered = true;
24
+ _logger.default.deprecate("The `StepSequence` component is deprecated and will soon be removed," + " please use the `StepFlow` component instead.");
25
+ }
20
26
  return /*#__PURE__*/_react.default.createElement(_stepSequence.default, _extends({
21
27
  "data-component": "step-sequence",
22
28
  orientation: orientation,
@@ -4,6 +4,8 @@ export { default as TileContent } from "./tile-content";
4
4
  export type { TileContentProps } from "./tile-content";
5
5
  export { default as TileFooter } from "./tile-footer";
6
6
  export type { TileFooterProps } from "./tile-footer";
7
+ export { default as TileHeader } from "./tile-header";
8
+ export type { TileHeaderProps } from "./tile-header";
7
9
  export { default as FlexTileContainer } from "./flex-tile-container";
8
10
  export type { FlexTileContainerProps } from "./flex-tile-container";
9
11
  export { default as FlexTileCell } from "./flex-tile-cell";
@@ -39,9 +39,16 @@ Object.defineProperty(exports, "TileFooter", {
39
39
  return _tileFooter.default;
40
40
  }
41
41
  });
42
+ Object.defineProperty(exports, "TileHeader", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _tileHeader.default;
46
+ }
47
+ });
42
48
  var _tile = _interopRequireDefault(require("./tile.component"));
43
49
  var _tileContent = _interopRequireDefault(require("./tile-content"));
44
50
  var _tileFooter = _interopRequireDefault(require("./tile-footer"));
51
+ var _tileHeader = _interopRequireDefault(require("./tile-header"));
45
52
  var _flexTileContainer = _interopRequireDefault(require("./flex-tile-container"));
46
53
  var _flexTileCell = _interopRequireDefault(require("./flex-tile-cell"));
47
54
  var _flexTileDivider = _interopRequireDefault(require("./flex-tile-divider"));
@@ -4,7 +4,7 @@ import { TagProps } from "../../../__internal__/utils/helpers/tags";
4
4
  export interface TileFooterProps extends PaddingProps, TagProps {
5
5
  children?: React.ReactNode;
6
6
  /** set which background color variant should be used */
7
- variant?: "default" | "black" | "transparent";
7
+ variant?: "default" | "black" | "transparent" | "grey";
8
8
  }
9
9
  export declare const TileFooter: ({ variant, children, ...rest }: TileFooterProps) => React.JSX.Element;
10
10
  export default TileFooter;
@@ -15,18 +15,23 @@ const getBackgroundColor = variant => {
15
15
  return "transparent";
16
16
  case "black":
17
17
  return "var(--colorsUtilityYin100)";
18
+ case "grey":
19
+ return "var(--colorsUtilityMajor025)";
18
20
  default:
19
21
  return "var(--colorsUtilityMajor100)";
20
22
  }
21
23
  };
22
24
  const StyledTileFooter = _styledComponents.default.div`
23
25
  ${_styledSystem.padding}
26
+ border-bottom-left-radius: calc(var(--tileBorderRadius) - 1px);
27
+ border-bottom-right-radius: calc(var(--tileBorderRadius) - 1px);
24
28
 
25
29
  ${({
26
30
  variant
27
31
  }) => (0, _styledComponents.css)`
28
32
  background: ${getBackgroundColor(variant)};
29
- border-top: 1px solid var(--colorsUtilityMajor100);
33
+ border-top: 1px solid
34
+ ${variant === "grey" ? "var(--colorsUtilityMajor200)" : "var(--colorsUtilityMajor100)"};
30
35
  `}
31
36
  `;
32
37
  StyledTileFooter.defaultProps = {
@@ -0,0 +1,2 @@
1
+ export { default } from "./tile-header.component";
2
+ export type { TileHeaderProps } from "./tile-header.component";
@@ -0,0 +1,13 @@
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 _tileHeader.default;
10
+ }
11
+ });
12
+ var _tileHeader = _interopRequireDefault(require("./tile-header.component"));
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "../../../../esm/components/tile/tile-header/index.js",
4
+ "main": "./index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { PaddingProps } from "styled-system";
3
+ import { TagProps } from "../../../__internal__/utils/helpers/tags";
4
+ export interface TileHeaderProps extends PaddingProps, TagProps {
5
+ children?: React.ReactNode;
6
+ /** set which background color variant should be used */
7
+ variant?: "default" | "black" | "transparent" | "grey";
8
+ }
9
+ export declare const TileHeader: ({ variant, children, ...rest }: TileHeaderProps) => React.JSX.Element;
10
+ export default TileHeader;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.TileHeader = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _tileHeader = _interopRequireDefault(require("./tile-header.style"));
10
+ var _tags = _interopRequireDefault(require("../../../__internal__/utils/helpers/tags"));
11
+ var _filterStyledSystemPaddingProps = _interopRequireDefault(require("../../../style/utils/filter-styled-system-padding-props"));
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }
14
+ const TileHeader = ({
15
+ variant,
16
+ children,
17
+ ...rest
18
+ }) => /*#__PURE__*/_react.default.createElement(_tileHeader.default, _extends({
19
+ variant: variant
20
+ }, (0, _filterStyledSystemPaddingProps.default)(rest), (0, _tags.default)("tile-header", rest)), children);
21
+ exports.TileHeader = TileHeader;
22
+ var _default = exports.default = TileHeader;
@@ -0,0 +1,5 @@
1
+ import { TileHeaderProps } from "./tile-header.component";
2
+ declare const StyledTileHeader: import("styled-components").StyledComponent<"div", any, {
3
+ variant: TileHeaderProps["variant"];
4
+ }, never>;
5
+ export default StyledTileHeader;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _styledComponents = _interopRequireWildcard(require("styled-components"));
8
+ var _styledSystem = require("styled-system");
9
+ var _themes = require("../../../style/themes");
10
+ 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); }
11
+ 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 && Object.prototype.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; }
12
+ const getBackgroundColor = variant => {
13
+ switch (variant) {
14
+ case "transparent":
15
+ return "transparent";
16
+ case "black":
17
+ return "var(--colorsUtilityYin100)";
18
+ case "grey":
19
+ return "var(--colorsUtilityMajor025)";
20
+ default:
21
+ return "var(--colorsUtilityMajor100)";
22
+ }
23
+ };
24
+ const StyledTileHeader = _styledComponents.default.div`
25
+ ${_styledSystem.padding}
26
+ border-top-left-radius: calc(var(--tileBorderRadius) - 1px);
27
+ border-top-right-radius: calc(var(--tileBorderRadius) - 1px);
28
+
29
+ ${({
30
+ variant
31
+ }) => (0, _styledComponents.css)`
32
+ background: ${getBackgroundColor(variant)};
33
+ border-bottom: 1px solid
34
+ ${variant === "grey" ? "var(--colorsUtilityMajor200)" : "var(--colorsUtilityMajor100)"};
35
+ `}
36
+ `;
37
+ StyledTileHeader.defaultProps = {
38
+ theme: _themes.baseTheme
39
+ };
40
+ var _default = exports.default = StyledTileHeader;
@@ -4,8 +4,8 @@ import { SpaceProps, WidthProps } from "styled-system";
4
4
  import { TagProps } from "../../__internal__/utils/helpers/tags";
5
5
  declare type DesignTokensType = keyof typeof DesignTokens;
6
6
  export interface TileProps extends SpaceProps, WidthProps, TagProps {
7
- /** Sets the theme of the tile - either 'tile', 'transparent' or 'active' */
8
- variant?: "tile" | "transparent" | "active";
7
+ /** Sets the theme of the tile */
8
+ variant?: "tile" | "transparent" | "active" | "grey";
9
9
  /**
10
10
  * The content to render within the tile. Each child will be wrapped with
11
11
  * a TileContent wrapper, which allows any individual child component to take a
@@ -25,8 +25,8 @@ export interface TileProps extends SpaceProps, WidthProps, TagProps {
25
25
  borderWidth?: Extract<DesignTokensType, `borderWidth${string}`>;
26
26
  /** Sets the border variant that should be used */
27
27
  borderVariant?: "default" | "selected" | "positive" | "negative" | "caution" | "info";
28
- /** Sets the level of roundness of the corners, "default" is 8px and "large" is 16px */
29
- roundness?: "default" | "large";
28
+ /** Sets the level of roundness of the corners, "default" is 8px, "large" is 16px and "small" is 4px */
29
+ roundness?: "default" | "large" | "small";
30
30
  /**
31
31
  * Set a percentage-based height for the whole Tile component, relative to its parent.
32
32
  */
@@ -27,6 +27,16 @@ const getBorderColor = borderVariant => {
27
27
  return "var(--colorsUtilityMajor100)";
28
28
  }
29
29
  };
30
+ const getBorderRadius = roundness => {
31
+ switch (roundness) {
32
+ case "large":
33
+ return "var(--borderRadius200)";
34
+ case "small":
35
+ return "var(--borderRadius050)";
36
+ default:
37
+ return "var(--borderRadius100)";
38
+ }
39
+ };
30
40
  const StyledTile = _styledComponents.default.div`
31
41
  ${({
32
42
  borderVariant,
@@ -41,8 +51,18 @@ const StyledTile = _styledComponents.default.div`
41
51
 
42
52
  box-sizing: border-box;
43
53
  border: var(--${borderWidth}) solid ${getBorderColor(borderVariant)};
44
- border-radius: ${roundness === "default" ? "var(--borderRadius100)" : "var(--borderRadius200)"};
45
- overflow: hidden;
54
+ border-radius: ${getBorderRadius(roundness)};
55
+ --tileBorderRadius: ${getBorderRadius(roundness)};
56
+
57
+ > *:first-child {
58
+ border-top-left-radius: calc(${getBorderRadius(roundness)} - 1px);
59
+ border-top-right-radius: calc(${getBorderRadius(roundness)} - 1px);
60
+ }
61
+
62
+ > *:last-child {
63
+ border-bottom-left-radius: calc(${getBorderRadius(roundness)} - 1px);
64
+ border-bottom-right-radius: calc(${getBorderRadius(roundness)} - 1px);
65
+ }
46
66
 
47
67
  ${variant === "tile" && (0, _styledComponents.css)`
48
68
  background-color: var(--colorsUtilityYang100);
@@ -57,6 +77,11 @@ const StyledTile = _styledComponents.default.div`
57
77
  border-color: var(--colorsActionMajor500);
58
78
  `}
59
79
 
80
+ ${variant === "grey" && (0, _styledComponents.css)`
81
+ background-color: var(--colorsUtilityMajor025);
82
+ border-color: var(--colorsUtilityMajor200);
83
+ `}
84
+
60
85
  display: flex;
61
86
  flex-direction: ${isHorizontal ? "row" : "column"};
62
87
  position: relative;
@@ -0,0 +1 @@
1
+ export { default } from "./useFocusPortalContent";
@@ -0,0 +1,13 @@
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 _useFocusPortalContent.default;
10
+ }
11
+ });
12
+ var _useFocusPortalContent = _interopRequireDefault(require("./useFocusPortalContent"));
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "../../../../esm/hooks/__internal__/useFocusPortalContent/index.js",
4
+ "main": "./index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -0,0 +1,3 @@
1
+ import { RefObject } from "react";
2
+ declare const _default: (container?: RefObject<HTMLElement>, target?: RefObject<HTMLElement>, focusCallback?: ((ev: KeyboardEvent) => void) | undefined) => void;
3
+ export default _default;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = require("react");
8
+ var _events = _interopRequireDefault(require("../../../__internal__/utils/helpers/events"));
9
+ var _focusTrapUtils = require("../../../__internal__/focus-trap/focus-trap-utils");
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ var _default = (container, target, focusCallback) => {
12
+ (0, _react.useEffect)(() => {
13
+ const handleFocusPortalContent = ev => {
14
+ if (container?.current && target?.current) {
15
+ const focusableElementsInContainer = Array.from(container.current?.querySelectorAll(_focusTrapUtils.defaultFocusableSelectors) || /* istanbul ignore next */[]);
16
+ if (target?.current === document.activeElement) {
17
+ if (_events.default.isTabKey(ev) && !_events.default.isShiftKey(ev) && focusableElementsInContainer[0]) {
18
+ ev.preventDefault();
19
+ focusableElementsInContainer[0]?.focus();
20
+ }
21
+ return;
22
+ }
23
+
24
+ /* istanbul ignore if */
25
+ if (!focusableElementsInContainer.length) {
26
+ return;
27
+ }
28
+ const lastElementFocused = focusableElementsInContainer[focusableElementsInContainer.length - 1] === document.activeElement;
29
+ const firstElementFocused = focusableElementsInContainer[0] === document.activeElement;
30
+ if (_events.default.isTabKey(ev)) {
31
+ // last element focused inside portal navigate to next element in DOM after the target/ trigger element
32
+ if (lastElementFocused && !_events.default.isShiftKey(ev)) {
33
+ ev.preventDefault();
34
+ const allFocusableElements = Array.from(document.querySelectorAll(_focusTrapUtils.defaultFocusableSelectors) || /* istanbul ignore next */[]);
35
+ const filteredElements = allFocusableElements.filter(el => el === target.current || Number(el.tabIndex) !== -1);
36
+ const nextIndex = filteredElements.indexOf(target.current) + 1;
37
+ focusCallback?.(ev);
38
+ filteredElements[nextIndex]?.focus();
39
+ return;
40
+ }
41
+ // first element focused inside portal navigate back to the target/ trigger element
42
+ if (firstElementFocused && _events.default.isShiftKey(ev)) {
43
+ ev.preventDefault();
44
+ focusCallback?.(ev);
45
+
46
+ /* istanbul ignore else */
47
+ if (target.current !== document.activeElement) {
48
+ target.current?.focus();
49
+ }
50
+ }
51
+ }
52
+ }
53
+ };
54
+ document.addEventListener("keydown", handleFocusPortalContent);
55
+ return () => {
56
+ document.removeEventListener("keydown", handleFocusPortalContent);
57
+ };
58
+ }, [target, container, focusCallback]);
59
+ };
60
+ exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "carbon-react",
3
- "version": "126.3.0",
3
+ "version": "126.4.0",
4
4
  "description": "A library of reusable React components for easily building user interfaces.",
5
5
  "files": [
6
6
  "lib",