carbon-react 124.3.0 → 124.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.
- package/esm/__spec_helper__/index.js +3 -1
- package/esm/__spec_helper__/mock-element-scrollto.d.ts +2 -0
- package/esm/__spec_helper__/mock-element-scrollto.js +6 -0
- package/esm/__spec_helper__/select-test-utils.d.ts +3 -0
- package/esm/__spec_helper__/select-test-utils.js +39 -0
- package/esm/components/box/box.component.d.ts +1 -3
- package/esm/components/box/box.component.js +3 -4
- package/esm/components/box/box.config.d.ts +0 -1
- package/esm/components/box/box.config.js +0 -7
- package/esm/components/box/box.style.js +4 -3
- package/esm/components/select/select-list/select-list.component.js +41 -7
- package/esm/components/tile/flex-tile-cell/flex-tile-cell.component.d.ts +9 -0
- package/esm/components/tile/flex-tile-cell/flex-tile-cell.component.js +3808 -0
- package/esm/components/tile/flex-tile-cell/index.d.ts +2 -0
- package/esm/components/tile/flex-tile-cell/index.js +1 -0
- package/esm/components/tile/flex-tile-container/flex-tile-container.component.d.ts +8 -0
- package/esm/components/tile/flex-tile-container/flex-tile-container.component.js +29 -0
- package/esm/components/tile/flex-tile-container/index.d.ts +2 -0
- package/esm/components/tile/flex-tile-container/index.js +1 -0
- package/esm/components/tile/flex-tile-divider/flex-tile-divider.component.d.ts +3 -0
- package/esm/components/tile/flex-tile-divider/flex-tile-divider.component.js +17 -0
- package/esm/components/tile/flex-tile-divider/index.d.ts +1 -0
- package/esm/components/tile/flex-tile-divider/index.js +1 -0
- package/esm/components/tile/index.d.ts +5 -0
- package/esm/components/tile/index.js +4 -1
- package/esm/style/utils/box-gap.d.ts +5 -0
- package/esm/style/utils/box-gap.js +9 -0
- package/lib/__spec_helper__/index.js +3 -1
- package/lib/__spec_helper__/mock-element-scrollto.d.ts +2 -0
- package/lib/__spec_helper__/mock-element-scrollto.js +12 -0
- package/lib/__spec_helper__/select-test-utils.d.ts +3 -0
- package/lib/__spec_helper__/select-test-utils.js +47 -0
- package/lib/components/box/box.component.d.ts +1 -3
- package/lib/components/box/box.component.js +3 -4
- package/lib/components/box/box.config.d.ts +0 -1
- package/lib/components/box/box.config.js +0 -7
- package/lib/components/box/box.style.js +4 -3
- package/lib/components/select/select-list/select-list.component.js +40 -6
- package/lib/components/tile/flex-tile-cell/flex-tile-cell.component.d.ts +9 -0
- package/lib/components/tile/flex-tile-cell/flex-tile-cell.component.js +3815 -0
- package/lib/components/tile/flex-tile-cell/index.d.ts +2 -0
- package/lib/components/tile/flex-tile-cell/index.js +13 -0
- package/lib/components/tile/flex-tile-cell/package.json +6 -0
- package/lib/components/tile/flex-tile-container/flex-tile-container.component.d.ts +8 -0
- package/lib/components/tile/flex-tile-container/flex-tile-container.component.js +36 -0
- package/lib/components/tile/flex-tile-container/index.d.ts +2 -0
- package/lib/components/tile/flex-tile-container/index.js +13 -0
- package/lib/components/tile/flex-tile-container/package.json +6 -0
- package/lib/components/tile/flex-tile-divider/flex-tile-divider.component.d.ts +3 -0
- package/lib/components/tile/flex-tile-divider/flex-tile-divider.component.js +25 -0
- package/lib/components/tile/flex-tile-divider/index.d.ts +1 -0
- package/lib/components/tile/flex-tile-divider/index.js +13 -0
- package/lib/components/tile/flex-tile-divider/package.json +6 -0
- package/lib/components/tile/index.d.ts +5 -0
- package/lib/components/tile/index.js +21 -0
- package/lib/style/utils/box-gap.d.ts +5 -0
- package/lib/style/utils/box-gap.js +18 -0
- package/package.json +3 -2
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { enableFetchMocks } from "jest-fetch-mock";
|
|
2
2
|
import { setupMatchMediaMock } from "./mock-match-media";
|
|
3
3
|
import setupResizeObserverMock from "./mock-resize-observer";
|
|
4
|
+
import setupScrollToMock from "./mock-element-scrollto";
|
|
4
5
|
enableFetchMocks();
|
|
5
6
|
setupResizeObserverMock();
|
|
6
|
-
setupMatchMediaMock();
|
|
7
|
+
setupMatchMediaMock();
|
|
8
|
+
setupScrollToMock();
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { act } from "react-dom/test-utils";
|
|
2
|
+
import { mockResizeObserver } from "jsdom-testing-mocks";
|
|
3
|
+
import StyledSelectListContainer from "../components/select/select-list/select-list-container.style";
|
|
4
|
+
const resizeObserver = mockResizeObserver();
|
|
5
|
+
export function simulateSelectTextboxEvent(container, eventType,
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
|
+
...eventArgs) {
|
|
8
|
+
const selectText = container.find('input[type="text"]').first();
|
|
9
|
+
selectText.simulate(eventType, ...eventArgs);
|
|
10
|
+
const selectList = container.find(StyledSelectListContainer).getDOMNode();
|
|
11
|
+
// need to manually trigger a resize to make react-virtual realise that child options should be rendered
|
|
12
|
+
act(() => {
|
|
13
|
+
resizeObserver.mockElementSize(selectList, {
|
|
14
|
+
contentBoxSize: {
|
|
15
|
+
inlineSize: 500,
|
|
16
|
+
blockSize: 180
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
resizeObserver.resize();
|
|
20
|
+
});
|
|
21
|
+
if (eventType === "focus") jest.runOnlyPendingTimers();
|
|
22
|
+
container.update();
|
|
23
|
+
}
|
|
24
|
+
export function simulateDropdownEvent(container, eventType) {
|
|
25
|
+
const dropdown = container.find('[type="dropdown"]').first();
|
|
26
|
+
dropdown.simulate(eventType);
|
|
27
|
+
const selectList = container.find(StyledSelectListContainer).getDOMNode();
|
|
28
|
+
// need to manually trigger a resize to make react-virtual realise that child options should be rendered
|
|
29
|
+
act(() => {
|
|
30
|
+
resizeObserver.mockElementSize(selectList, {
|
|
31
|
+
contentBoxSize: {
|
|
32
|
+
inlineSize: 500,
|
|
33
|
+
blockSize: 180
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
resizeObserver.resize();
|
|
37
|
+
});
|
|
38
|
+
container.update();
|
|
39
|
+
}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { SpaceProps, LayoutProps, FlexboxProps, PositionProps, GridProps } from "styled-system";
|
|
3
3
|
import * as DesignTokens from "@sage/design-tokens/js/base/common";
|
|
4
|
+
import { Gap } from "style/utils/box-gap";
|
|
4
5
|
import { TagProps } from "../../__internal__/utils/helpers/tags";
|
|
5
|
-
declare const GAP_VALUES: readonly [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
|
6
6
|
export declare type OverflowWrap = "break-word" | "anywhere";
|
|
7
7
|
export declare type ScrollVariant = "light" | "dark";
|
|
8
8
|
export declare type BoxSizing = "content-box" | "border-box";
|
|
9
|
-
export declare type AllowedNumericalValues = typeof GAP_VALUES[number];
|
|
10
|
-
export declare type Gap = AllowedNumericalValues | string;
|
|
11
9
|
declare type DesignTokensType = keyof typeof DesignTokens;
|
|
12
10
|
declare type BoxShadowsType = Extract<DesignTokensType, `boxShadow${string}`>;
|
|
13
11
|
declare type BorderRadiusType = Extract<DesignTokensType, `borderRadius${string}`>;
|
|
@@ -4,7 +4,6 @@ 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
|
-
const GAP_VALUES = [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
|
8
7
|
const Box = /*#__PURE__*/React.forwardRef(({
|
|
9
8
|
"data-component": dataComponent,
|
|
10
9
|
as,
|
|
@@ -475,7 +474,7 @@ Box.propTypes = {
|
|
|
475
474
|
"children": PropTypes.node,
|
|
476
475
|
"className": PropTypes.string,
|
|
477
476
|
"color": PropTypes.string,
|
|
478
|
-
"columnGap": PropTypes.oneOfType([PropTypes.
|
|
477
|
+
"columnGap": PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
|
|
479
478
|
"data-component": PropTypes.string,
|
|
480
479
|
"data-element": PropTypes.string,
|
|
481
480
|
"data-role": PropTypes.string,
|
|
@@ -986,7 +985,7 @@ Box.propTypes = {
|
|
|
986
985
|
"valueOf": PropTypes.func.isRequired
|
|
987
986
|
})]),
|
|
988
987
|
"flexWrap": PropTypes.oneOfType([PropTypes.oneOf(["-moz-initial", "inherit", "initial", "nowrap", "revert-layer", "revert", "unset", "wrap-reverse", "wrap"]), PropTypes.arrayOf(PropTypes.oneOf(["-moz-initial", "inherit", "initial", "nowrap", "revert-layer", "revert", "unset", "wrap-reverse", "wrap", null])), PropTypes.object]),
|
|
989
|
-
"gap": PropTypes.oneOfType([PropTypes.
|
|
988
|
+
"gap": PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
|
|
990
989
|
"gridArea": PropTypes.oneOfType([PropTypes.oneOf(["-moz-initial", "auto", "inherit", "initial", "revert-layer", "revert", "unset"]), PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.oneOf(["-moz-initial", "auto", "inherit", "initial", "revert-layer", "revert", "unset", null]), PropTypes.shape({
|
|
991
990
|
"__@iterator": PropTypes.func.isRequired,
|
|
992
991
|
"anchor": PropTypes.func.isRequired,
|
|
@@ -3423,7 +3422,7 @@ Box.propTypes = {
|
|
|
3423
3422
|
"valueOf": PropTypes.func.isRequired
|
|
3424
3423
|
}), PropTypes.string]),
|
|
3425
3424
|
"role": PropTypes.string,
|
|
3426
|
-
"rowGap": PropTypes.oneOfType([PropTypes.
|
|
3425
|
+
"rowGap": PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
|
|
3427
3426
|
"scrollVariant": PropTypes.oneOf(["dark", "light"]),
|
|
3428
3427
|
"size": PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.oneOf([null]), PropTypes.number, PropTypes.shape({
|
|
3429
3428
|
"__@iterator": PropTypes.func.isRequired,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { space } from "../../style/themes/base/base-theme.config";
|
|
2
1
|
export default {
|
|
3
2
|
light: {
|
|
4
3
|
thumb: "var(--colorsUtilityMajor300)",
|
|
@@ -7,11 +6,5 @@ export default {
|
|
|
7
6
|
dark: {
|
|
8
7
|
thumb: "var(--colorsUtilityMajor200)",
|
|
9
8
|
track: "var(--colorsUtilityMajor400)"
|
|
10
|
-
},
|
|
11
|
-
gap: gapValue => {
|
|
12
|
-
if (typeof gapValue === "number") {
|
|
13
|
-
return space[gapValue];
|
|
14
|
-
}
|
|
15
|
-
return gapValue;
|
|
16
9
|
}
|
|
17
10
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import styled, { css } from "styled-components";
|
|
2
2
|
import { space, layout, flexbox, grid, position as positionFn } from "styled-system";
|
|
3
|
+
import boxGap from "../../style/utils/box-gap";
|
|
3
4
|
import BaseTheme from "../../style/themes/base";
|
|
4
5
|
import styledColor from "../../style/utils/color";
|
|
5
6
|
import boxConfig from "./box.config";
|
|
@@ -88,15 +89,15 @@ const StyledBox = styled.div`
|
|
|
88
89
|
rowGap
|
|
89
90
|
}) => (display === "flex" || display === "inline-flex" || display === "grid" || display === "inline-grid") && css`
|
|
90
91
|
${gap !== undefined && css`
|
|
91
|
-
gap: ${
|
|
92
|
+
gap: ${boxGap(gap)};
|
|
92
93
|
`}
|
|
93
94
|
|
|
94
95
|
${columnGap !== undefined && css`
|
|
95
|
-
column-gap: ${
|
|
96
|
+
column-gap: ${boxGap(columnGap)};
|
|
96
97
|
`}
|
|
97
98
|
|
|
98
99
|
${rowGap !== undefined && css`
|
|
99
|
-
row-gap: ${
|
|
100
|
+
row-gap: ${boxGap(rowGap)};
|
|
100
101
|
`}
|
|
101
102
|
`};
|
|
102
103
|
|
|
@@ -2,8 +2,9 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
|
|
|
2
2
|
import React, { useEffect, useState, useCallback, useLayoutEffect, useRef, useMemo } from "react";
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
4
|
import { flip, offset, size } from "@floating-ui/dom";
|
|
5
|
-
import { useVirtualizer } from "@tanstack/react-virtual";
|
|
5
|
+
import { useVirtualizer, defaultRangeExtractor } from "@tanstack/react-virtual";
|
|
6
6
|
import findLastIndex from "lodash/findLastIndex";
|
|
7
|
+
import usePrevious from "../../../hooks/__internal__/usePrevious";
|
|
7
8
|
import useScrollBlock from "../../../hooks/__internal__/useScrollBlock";
|
|
8
9
|
import useModalManager from "../../../hooks/__internal__/useModalManager";
|
|
9
10
|
import { StyledSelectList, StyledSelectLoaderContainer, StyledSelectListTable, StyledSelectListTableHeader, StyledSelectListTableBody } from "./select-list.style";
|
|
@@ -60,7 +61,26 @@ const SelectList = /*#__PURE__*/React.forwardRef(({
|
|
|
60
61
|
allowScroll
|
|
61
62
|
} = useScrollBlock();
|
|
62
63
|
const actionButtonHeight = useRef(0);
|
|
64
|
+
const wasOpen = usePrevious(isOpen);
|
|
65
|
+
|
|
66
|
+
// ensure scroll-position goes back to the top whenever the list is (re)-opened. (On Safari, without this it remains at the bottom if it had been scrolled
|
|
67
|
+
// to the bottom before closing.)
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (isOpen && !wasOpen) {
|
|
70
|
+
listContainerRef.current?.scrollTo(0, 0);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
63
73
|
const overscan = enableVirtualScroll ? virtualScrollOverscan : React.Children.count(children);
|
|
74
|
+
|
|
75
|
+
// need to use a custom rangeExtractor that ensure the currently-selected option, if any, always appears as an option returned from the virtualiser.
|
|
76
|
+
// This ensures that the aria-activedescendant value is always valid even when the currently-selected item is out of the visible range.
|
|
77
|
+
const rangeExtractor = range => {
|
|
78
|
+
const toRender = defaultRangeExtractor(range);
|
|
79
|
+
if (currentOptionsListIndex !== -1 && !toRender.includes(currentOptionsListIndex)) {
|
|
80
|
+
toRender.push(currentOptionsListIndex);
|
|
81
|
+
}
|
|
82
|
+
return toRender;
|
|
83
|
+
};
|
|
64
84
|
const virtualizer = useVirtualizer({
|
|
65
85
|
count: React.Children.count(children),
|
|
66
86
|
getScrollElement: () => listContainerRef.current,
|
|
@@ -68,9 +88,21 @@ const SelectList = /*#__PURE__*/React.forwardRef(({
|
|
|
68
88
|
// value doesn't really seem to matter since we're dynamically measuring, but 40px is the height of a single-line option
|
|
69
89
|
overscan,
|
|
70
90
|
paddingStart: multiColumn ? TABLE_HEADER_HEIGHT : 0,
|
|
71
|
-
scrollPaddingEnd: actionButtonHeight.current
|
|
91
|
+
scrollPaddingEnd: actionButtonHeight.current,
|
|
92
|
+
rangeExtractor
|
|
72
93
|
});
|
|
73
94
|
const items = virtualizer.getVirtualItems();
|
|
95
|
+
|
|
96
|
+
// getVirtualItems returns an empty array of items if the select list is currently closed - which is correct visually but
|
|
97
|
+
// we need to ensure that any currently-selected option is still in the DOM to avoid any accessibility issues.
|
|
98
|
+
// The isOpen prop will ensure that no options are visible regardless of what is in the items array.
|
|
99
|
+
if (items.length === 0 && currentOptionsListIndex !== -1) {
|
|
100
|
+
// only index property is required with the item not visible so the following type assertion, even though incorrect,
|
|
101
|
+
// should be OK
|
|
102
|
+
items.push({
|
|
103
|
+
index: currentOptionsListIndex
|
|
104
|
+
});
|
|
105
|
+
}
|
|
74
106
|
const listHeight = virtualizer.getTotalSize();
|
|
75
107
|
useEffect(() => {
|
|
76
108
|
if (isOpen) {
|
|
@@ -119,11 +151,13 @@ const SelectList = /*#__PURE__*/React.forwardRef(({
|
|
|
119
151
|
measureElement(element);
|
|
120
152
|
}
|
|
121
153
|
};
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
154
|
+
|
|
155
|
+
// the rangeExtractor above can cause an undefined value to be appended to the return items.
|
|
156
|
+
// Easiest way to stop that crashing is just to filter it out.
|
|
157
|
+
const renderedChildren = items.filter(item => item !== undefined).map(({
|
|
158
|
+
index,
|
|
159
|
+
start
|
|
160
|
+
}) => {
|
|
127
161
|
const child = childrenList[index];
|
|
128
162
|
if (! /*#__PURE__*/React.isValidElement(child)) {
|
|
129
163
|
return child;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { BoxProps } from "../../box";
|
|
3
|
+
import { TagProps } from "../../../__internal__/utils/helpers/tags";
|
|
4
|
+
export interface FlexTileCellProps extends TagProps, BoxProps {
|
|
5
|
+
/** The content to render within the responsive cell. */
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
export declare const FlexTileCell: ({ children, flexGrow, flexBasis, flexShrink, ...rest }: FlexTileCellProps) => JSX.Element;
|
|
9
|
+
export default FlexTileCell;
|