@itwin/itwinui-react 3.13.2 → 3.13.4
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/CHANGELOG.md +15 -0
- package/DEV-cjs/core/ComboBox/ComboBoxMenu.js +6 -7
- package/DEV-cjs/core/Table/Table.js +11 -6
- package/DEV-cjs/core/Table/TableRowMemoized.js +13 -11
- package/DEV-cjs/core/Tree/Tree.js +9 -8
- package/DEV-cjs/styles.js +1 -1
- package/DEV-cjs/utils/hooks/useVirtualScroll.js +27 -6
- package/DEV-esm/core/ComboBox/ComboBoxMenu.js +6 -7
- package/DEV-esm/core/Table/Table.js +11 -6
- package/DEV-esm/core/Table/TableRowMemoized.js +13 -11
- package/DEV-esm/core/Tree/Tree.js +9 -8
- package/DEV-esm/styles.js +1 -1
- package/DEV-esm/utils/hooks/useVirtualScroll.js +27 -6
- package/cjs/core/ComboBox/ComboBoxMenu.js +6 -7
- package/cjs/core/Table/Table.js +13 -5
- package/cjs/core/Table/TableRowMemoized.js +17 -15
- package/cjs/core/Tree/Tree.js +8 -7
- package/cjs/styles.js +1 -1
- package/cjs/utils/hooks/useVirtualScroll.d.ts +25 -5
- package/cjs/utils/hooks/useVirtualScroll.js +28 -6
- package/esm/core/ComboBox/ComboBoxMenu.js +6 -7
- package/esm/core/Table/Table.js +13 -5
- package/esm/core/Table/TableRowMemoized.js +17 -15
- package/esm/core/Tree/Tree.js +8 -7
- package/esm/styles.js +1 -1
- package/esm/utils/hooks/useVirtualScroll.d.ts +25 -5
- package/esm/utils/hooks/useVirtualScroll.js +28 -6
- package/package.json +1 -1
- package/styles.css +8 -8
|
@@ -5,10 +5,30 @@ import type { Virtualizer } from '@tanstack/react-virtual';
|
|
|
5
5
|
* `data-iui-index` and adds wraps the `scrollToIndex` function in a `setTimeout` so it can be used in `useLayoutEffect`.
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
|
-
* const virtualizer = useVirtualScroll({
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* const { virtualizer, css } = useVirtualScroll({
|
|
9
|
+
* count: item.length,
|
|
10
|
+
* getScrollElement: () => parentRef.current,
|
|
11
|
+
* estimateSize: () => 30,
|
|
12
12
|
* });
|
|
13
|
+
*
|
|
14
|
+
* <Parent ref={parentRef}>
|
|
15
|
+
* <ShadowRoot css={css}>
|
|
16
|
+
* <div data-iui-virtualizer="root" style={{ height: virtualizer.getTotalSize() }}>
|
|
17
|
+
* <slot />
|
|
18
|
+
* </div>
|
|
19
|
+
* </ShadowRoot>
|
|
20
|
+
*
|
|
21
|
+
* {virtualizer.getVirtualItems().map((item) => (
|
|
22
|
+
* <Item
|
|
23
|
+
* data-iui-virtualizer="item"
|
|
24
|
+
* data-iui-index={item.index}
|
|
25
|
+
* style={{ transform: `translateY(${item.start}px)`}}
|
|
26
|
+
* ref={virtualizer.measureElement}
|
|
27
|
+
* />
|
|
28
|
+
* ))}
|
|
29
|
+
* </Parent>
|
|
13
30
|
*/
|
|
14
|
-
export declare const useVirtualScroll: (params: Parameters<typeof useVirtualizer>[0]) =>
|
|
31
|
+
export declare const useVirtualScroll: (params: Parameters<typeof useVirtualizer>[0]) => {
|
|
32
|
+
virtualizer: Virtualizer<Element, Element>;
|
|
33
|
+
css: string;
|
|
34
|
+
};
|
|
@@ -11,9 +11,24 @@ Object.defineProperty(exports, 'useVirtualScroll', {
|
|
|
11
11
|
const _interop_require_default = require('@swc/helpers/_/_interop_require_default');
|
|
12
12
|
const _reactvirtual = require('@tanstack/react-virtual');
|
|
13
13
|
const _react = _interop_require_default._(require('react'));
|
|
14
|
+
const css = `
|
|
15
|
+
:host {
|
|
16
|
+
contain: layout;
|
|
17
|
+
background-color: var(--iui-color-background);
|
|
18
|
+
}
|
|
19
|
+
[data-iui-virtualizer='root'] {
|
|
20
|
+
min-inline-size: 100%;
|
|
21
|
+
position: relative;
|
|
22
|
+
}
|
|
23
|
+
::slotted([data-iui-virtualizer='item']) {
|
|
24
|
+
position: absolute !important;
|
|
25
|
+
top: 0 !important;
|
|
26
|
+
left: 0 !important;
|
|
27
|
+
}
|
|
28
|
+
`;
|
|
14
29
|
const useVirtualScroll = (params) => {
|
|
15
30
|
let { ...rest } = params;
|
|
16
|
-
let
|
|
31
|
+
let _virtualizer = (0, _reactvirtual.useVirtualizer)({
|
|
17
32
|
indexAttribute: 'data-iui-index',
|
|
18
33
|
overscan: 10,
|
|
19
34
|
...rest,
|
|
@@ -21,19 +36,26 @@ const useVirtualScroll = (params) => {
|
|
|
21
36
|
let scrollToIndex = _react.default.useCallback(
|
|
22
37
|
(index, options) => {
|
|
23
38
|
setTimeout(() => {
|
|
24
|
-
|
|
39
|
+
_virtualizer.scrollToIndex(index, {
|
|
25
40
|
align: 'auto',
|
|
26
41
|
...options,
|
|
27
42
|
});
|
|
28
43
|
});
|
|
29
44
|
},
|
|
30
|
-
[
|
|
45
|
+
[_virtualizer],
|
|
31
46
|
);
|
|
32
|
-
|
|
47
|
+
let virtualizer = _react.default.useMemo(
|
|
33
48
|
() => ({
|
|
34
|
-
...
|
|
49
|
+
..._virtualizer,
|
|
35
50
|
scrollToIndex,
|
|
36
51
|
}),
|
|
37
|
-
[
|
|
52
|
+
[_virtualizer, scrollToIndex],
|
|
53
|
+
);
|
|
54
|
+
return _react.default.useMemo(
|
|
55
|
+
() => ({
|
|
56
|
+
virtualizer,
|
|
57
|
+
css,
|
|
58
|
+
}),
|
|
59
|
+
[virtualizer],
|
|
38
60
|
);
|
|
39
61
|
};
|
|
@@ -31,7 +31,7 @@ let VirtualizedComboBoxMenu = (props) => {
|
|
|
31
31
|
currentElement.getAttribute('data-iui-filtered-index') ?? focusedIndex,
|
|
32
32
|
);
|
|
33
33
|
}, [focusedIndex, menuRef]);
|
|
34
|
-
let virtualizer = useVirtualScroll({
|
|
34
|
+
let { virtualizer, css: virtualizerCss } = useVirtualScroll({
|
|
35
35
|
count: filteredOptions.length || 1,
|
|
36
36
|
getScrollElement: () => menuRef.current,
|
|
37
37
|
estimateSize: () => (mostlySubLabeled ? 48 : 36),
|
|
@@ -49,10 +49,8 @@ let VirtualizedComboBoxMenu = (props) => {
|
|
|
49
49
|
return React.cloneElement(menuItem, {
|
|
50
50
|
key: virtualItem.key,
|
|
51
51
|
ref: virtualizer.measureElement,
|
|
52
|
+
'data-iui-virtualizer': 'item',
|
|
52
53
|
style: {
|
|
53
|
-
position: 'absolute',
|
|
54
|
-
top: 0,
|
|
55
|
-
left: 0,
|
|
56
54
|
width: '100%',
|
|
57
55
|
transform: `translateY(${virtualItem.start}px)`,
|
|
58
56
|
},
|
|
@@ -65,16 +63,17 @@ let VirtualizedComboBoxMenu = (props) => {
|
|
|
65
63
|
null,
|
|
66
64
|
React.createElement(
|
|
67
65
|
ShadowRoot,
|
|
68
|
-
|
|
66
|
+
{
|
|
67
|
+
css: virtualizerCss,
|
|
68
|
+
},
|
|
69
69
|
React.createElement(
|
|
70
70
|
Box,
|
|
71
71
|
{
|
|
72
72
|
as: 'div',
|
|
73
|
+
'data-iui-virtualizer': 'root',
|
|
73
74
|
...rest,
|
|
74
75
|
style: {
|
|
75
76
|
minBlockSize: virtualizer.getTotalSize(),
|
|
76
|
-
minInlineSize: '100%',
|
|
77
|
-
contain: 'strict',
|
|
78
77
|
...props.style,
|
|
79
78
|
},
|
|
80
79
|
},
|
package/esm/core/Table/Table.js
CHANGED
|
@@ -447,7 +447,8 @@ export const Table = (props) => {
|
|
|
447
447
|
});
|
|
448
448
|
}
|
|
449
449
|
});
|
|
450
|
-
let virtualizer = useVirtualScroll({
|
|
450
|
+
let { virtualizer, css: virtualizerCss } = useVirtualScroll({
|
|
451
|
+
enabled: enableVirtualization,
|
|
451
452
|
count: page.length,
|
|
452
453
|
getScrollElement: () => tableRef.current,
|
|
453
454
|
estimateSize: () => rowHeight,
|
|
@@ -604,10 +605,16 @@ export const Table = (props) => {
|
|
|
604
605
|
headerGroup.headers.findIndex(
|
|
605
606
|
(c) => c.id !== SELECTION_CELL_ID,
|
|
606
607
|
);
|
|
607
|
-
if ([void 0, 0].includes(column.minWidth))
|
|
608
|
+
if ([void 0, 0].includes(column.minWidth)) {
|
|
608
609
|
column.minWidth = columnHasExpanders
|
|
609
610
|
? COLUMN_MIN_WIDTHS.withExpander
|
|
610
611
|
: COLUMN_MIN_WIDTHS.default;
|
|
612
|
+
if (
|
|
613
|
+
'number' == typeof column.width &&
|
|
614
|
+
column.minWidth > column.width
|
|
615
|
+
)
|
|
616
|
+
column.minWidth = column.width;
|
|
617
|
+
}
|
|
611
618
|
let columnProps = column.getHeaderProps({
|
|
612
619
|
...restSortProps,
|
|
613
620
|
className: cx(
|
|
@@ -772,15 +779,16 @@ export const Table = (props) => {
|
|
|
772
779
|
},
|
|
773
780
|
React.createElement(
|
|
774
781
|
ShadowRoot,
|
|
775
|
-
|
|
782
|
+
{
|
|
783
|
+
css: virtualizerCss,
|
|
784
|
+
},
|
|
776
785
|
enableVirtualization && 0 !== data.length
|
|
777
786
|
? React.createElement(
|
|
778
787
|
'div',
|
|
779
788
|
{
|
|
789
|
+
'data-iui-virtualizer': 'root',
|
|
780
790
|
style: {
|
|
781
791
|
minBlockSize: virtualizer.getTotalSize(),
|
|
782
|
-
minInlineSize: '100%',
|
|
783
|
-
contain: 'strict',
|
|
784
792
|
},
|
|
785
793
|
},
|
|
786
794
|
React.createElement('slot', null),
|
|
@@ -50,27 +50,29 @@ export const TableRow = (props) => {
|
|
|
50
50
|
minWidth: '100%',
|
|
51
51
|
...(null != virtualItem
|
|
52
52
|
? {
|
|
53
|
-
position: 'absolute',
|
|
54
|
-
top: 0,
|
|
55
|
-
left: 0,
|
|
56
53
|
transform: `translateY(${virtualItem.start}px)`,
|
|
57
54
|
}
|
|
58
55
|
: {}),
|
|
59
56
|
},
|
|
60
57
|
}),
|
|
61
58
|
...restUserRowProps,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
59
|
+
...{
|
|
60
|
+
className: cx(
|
|
61
|
+
'iui-table-row',
|
|
62
|
+
{
|
|
63
|
+
'iui-table-row-expanded': row.isExpanded && subComponent,
|
|
64
|
+
'iui-loading': isLoading,
|
|
65
|
+
},
|
|
66
|
+
userRowProps?.className,
|
|
67
|
+
),
|
|
68
|
+
'aria-selected': row.isSelected || void 0,
|
|
69
|
+
'aria-disabled': isDisabled || void 0,
|
|
70
|
+
'data-iui-status': status,
|
|
71
|
+
'data-iui-index': virtualItem?.index,
|
|
72
|
+
...(null != virtualItem && {
|
|
73
|
+
'data-iui-virtualizer': 'item',
|
|
74
|
+
}),
|
|
75
|
+
},
|
|
74
76
|
};
|
|
75
77
|
let refs = useMergedRefs(
|
|
76
78
|
intersectionRef,
|
package/esm/core/Tree/Tree.js
CHANGED
|
@@ -117,12 +117,11 @@ export const Tree = (props) => {
|
|
|
117
117
|
...children.props,
|
|
118
118
|
key: virtualItem.key,
|
|
119
119
|
'data-iui-index': virtualItem.index,
|
|
120
|
+
'data-iui-virtualizer': 'item',
|
|
120
121
|
ref: virtualizer.measureElement,
|
|
121
122
|
style: {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
left: 0,
|
|
125
|
-
width: '100%',
|
|
123
|
+
...children.props.style,
|
|
124
|
+
'--_iui-width': '100%',
|
|
126
125
|
transform: `translateY(${virtualItem.start}px)`,
|
|
127
126
|
},
|
|
128
127
|
}))
|
|
@@ -194,7 +193,7 @@ let VirtualizedTree = React.forwardRef(
|
|
|
194
193
|
(index) => flatNodesList[index].nodeProps.nodeId,
|
|
195
194
|
[flatNodesList],
|
|
196
195
|
);
|
|
197
|
-
let virtualizer = useVirtualScroll({
|
|
196
|
+
let { virtualizer, css: virtualizerCss } = useVirtualScroll({
|
|
198
197
|
count: flatNodesList.length,
|
|
199
198
|
getScrollElement: () => parentRef.current,
|
|
200
199
|
estimateSize: () => 39,
|
|
@@ -211,13 +210,15 @@ let VirtualizedTree = React.forwardRef(
|
|
|
211
210
|
},
|
|
212
211
|
React.createElement(
|
|
213
212
|
ShadowRoot,
|
|
214
|
-
|
|
213
|
+
{
|
|
214
|
+
css: virtualizerCss,
|
|
215
|
+
},
|
|
215
216
|
React.createElement(
|
|
216
217
|
'div',
|
|
217
218
|
{
|
|
219
|
+
'data-iui-virtualizer': 'root',
|
|
218
220
|
style: {
|
|
219
221
|
minBlockSize: virtualizer.getTotalSize(),
|
|
220
|
-
contain: 'strict',
|
|
221
222
|
},
|
|
222
223
|
},
|
|
223
224
|
React.createElement('slot', null),
|
package/esm/styles.js
CHANGED
|
@@ -5,10 +5,30 @@ import type { Virtualizer } from '@tanstack/react-virtual';
|
|
|
5
5
|
* `data-iui-index` and adds wraps the `scrollToIndex` function in a `setTimeout` so it can be used in `useLayoutEffect`.
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
|
-
* const virtualizer = useVirtualScroll({
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* const { virtualizer, css } = useVirtualScroll({
|
|
9
|
+
* count: item.length,
|
|
10
|
+
* getScrollElement: () => parentRef.current,
|
|
11
|
+
* estimateSize: () => 30,
|
|
12
12
|
* });
|
|
13
|
+
*
|
|
14
|
+
* <Parent ref={parentRef}>
|
|
15
|
+
* <ShadowRoot css={css}>
|
|
16
|
+
* <div data-iui-virtualizer="root" style={{ height: virtualizer.getTotalSize() }}>
|
|
17
|
+
* <slot />
|
|
18
|
+
* </div>
|
|
19
|
+
* </ShadowRoot>
|
|
20
|
+
*
|
|
21
|
+
* {virtualizer.getVirtualItems().map((item) => (
|
|
22
|
+
* <Item
|
|
23
|
+
* data-iui-virtualizer="item"
|
|
24
|
+
* data-iui-index={item.index}
|
|
25
|
+
* style={{ transform: `translateY(${item.start}px)`}}
|
|
26
|
+
* ref={virtualizer.measureElement}
|
|
27
|
+
* />
|
|
28
|
+
* ))}
|
|
29
|
+
* </Parent>
|
|
13
30
|
*/
|
|
14
|
-
export declare const useVirtualScroll: (params: Parameters<typeof useVirtualizer>[0]) =>
|
|
31
|
+
export declare const useVirtualScroll: (params: Parameters<typeof useVirtualizer>[0]) => {
|
|
32
|
+
virtualizer: Virtualizer<Element, Element>;
|
|
33
|
+
css: string;
|
|
34
|
+
};
|
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
2
2
|
import React from 'react';
|
|
3
|
+
let css = `
|
|
4
|
+
:host {
|
|
5
|
+
contain: layout;
|
|
6
|
+
background-color: var(--iui-color-background);
|
|
7
|
+
}
|
|
8
|
+
[data-iui-virtualizer='root'] {
|
|
9
|
+
min-inline-size: 100%;
|
|
10
|
+
position: relative;
|
|
11
|
+
}
|
|
12
|
+
::slotted([data-iui-virtualizer='item']) {
|
|
13
|
+
position: absolute !important;
|
|
14
|
+
top: 0 !important;
|
|
15
|
+
left: 0 !important;
|
|
16
|
+
}
|
|
17
|
+
`;
|
|
3
18
|
export const useVirtualScroll = (params) => {
|
|
4
19
|
let { ...rest } = params;
|
|
5
|
-
let
|
|
20
|
+
let _virtualizer = useVirtualizer({
|
|
6
21
|
indexAttribute: 'data-iui-index',
|
|
7
22
|
overscan: 10,
|
|
8
23
|
...rest,
|
|
@@ -10,19 +25,26 @@ export const useVirtualScroll = (params) => {
|
|
|
10
25
|
let scrollToIndex = React.useCallback(
|
|
11
26
|
(index, options) => {
|
|
12
27
|
setTimeout(() => {
|
|
13
|
-
|
|
28
|
+
_virtualizer.scrollToIndex(index, {
|
|
14
29
|
align: 'auto',
|
|
15
30
|
...options,
|
|
16
31
|
});
|
|
17
32
|
});
|
|
18
33
|
},
|
|
19
|
-
[
|
|
34
|
+
[_virtualizer],
|
|
20
35
|
);
|
|
21
|
-
|
|
36
|
+
let virtualizer = React.useMemo(
|
|
22
37
|
() => ({
|
|
23
|
-
...
|
|
38
|
+
..._virtualizer,
|
|
24
39
|
scrollToIndex,
|
|
25
40
|
}),
|
|
26
|
-
[
|
|
41
|
+
[_virtualizer, scrollToIndex],
|
|
42
|
+
);
|
|
43
|
+
return React.useMemo(
|
|
44
|
+
() => ({
|
|
45
|
+
virtualizer,
|
|
46
|
+
css,
|
|
47
|
+
}),
|
|
48
|
+
[virtualizer],
|
|
27
49
|
);
|
|
28
50
|
};
|