@itwin/itwinui-react 3.13.2 → 3.13.3
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 +6 -0
- package/DEV-cjs/core/ComboBox/ComboBoxMenu.js +6 -7
- package/DEV-cjs/core/Table/Table.js +6 -5
- package/DEV-cjs/core/Table/TableRowMemoized.js +13 -11
- package/DEV-cjs/core/Tree/Tree.js +7 -7
- 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 +6 -5
- package/DEV-esm/core/Table/TableRowMemoized.js +13 -11
- package/DEV-esm/core/Tree/Tree.js +7 -7
- 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 +5 -4
- package/cjs/core/Table/TableRowMemoized.js +17 -15
- package/cjs/core/Tree/Tree.js +6 -6
- 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 +5 -4
- package/esm/core/Table/TableRowMemoized.js +17 -15
- package/esm/core/Tree/Tree.js +6 -6
- 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
|
@@ -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,7 @@ export const Table = (props) => {
|
|
|
447
447
|
});
|
|
448
448
|
}
|
|
449
449
|
});
|
|
450
|
-
let virtualizer = useVirtualScroll({
|
|
450
|
+
let { virtualizer, css: virtualizerCss } = useVirtualScroll({
|
|
451
451
|
count: page.length,
|
|
452
452
|
getScrollElement: () => tableRef.current,
|
|
453
453
|
estimateSize: () => rowHeight,
|
|
@@ -772,15 +772,16 @@ export const Table = (props) => {
|
|
|
772
772
|
},
|
|
773
773
|
React.createElement(
|
|
774
774
|
ShadowRoot,
|
|
775
|
-
|
|
775
|
+
{
|
|
776
|
+
css: virtualizerCss,
|
|
777
|
+
},
|
|
776
778
|
enableVirtualization && 0 !== data.length
|
|
777
779
|
? React.createElement(
|
|
778
780
|
'div',
|
|
779
781
|
{
|
|
782
|
+
'data-iui-virtualizer': 'root',
|
|
780
783
|
style: {
|
|
781
784
|
minBlockSize: virtualizer.getTotalSize(),
|
|
782
|
-
minInlineSize: '100%',
|
|
783
|
-
contain: 'strict',
|
|
784
785
|
},
|
|
785
786
|
},
|
|
786
787
|
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,11 +117,9 @@ 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
|
-
position: 'absolute',
|
|
123
|
-
top: 0,
|
|
124
|
-
left: 0,
|
|
125
123
|
width: '100%',
|
|
126
124
|
transform: `translateY(${virtualItem.start}px)`,
|
|
127
125
|
},
|
|
@@ -194,7 +192,7 @@ let VirtualizedTree = React.forwardRef(
|
|
|
194
192
|
(index) => flatNodesList[index].nodeProps.nodeId,
|
|
195
193
|
[flatNodesList],
|
|
196
194
|
);
|
|
197
|
-
let virtualizer = useVirtualScroll({
|
|
195
|
+
let { virtualizer, css: virtualizerCss } = useVirtualScroll({
|
|
198
196
|
count: flatNodesList.length,
|
|
199
197
|
getScrollElement: () => parentRef.current,
|
|
200
198
|
estimateSize: () => 39,
|
|
@@ -211,13 +209,15 @@ let VirtualizedTree = React.forwardRef(
|
|
|
211
209
|
},
|
|
212
210
|
React.createElement(
|
|
213
211
|
ShadowRoot,
|
|
214
|
-
|
|
212
|
+
{
|
|
213
|
+
css: virtualizerCss,
|
|
214
|
+
},
|
|
215
215
|
React.createElement(
|
|
216
216
|
'div',
|
|
217
217
|
{
|
|
218
|
+
'data-iui-virtualizer': 'root',
|
|
218
219
|
style: {
|
|
219
220
|
minBlockSize: virtualizer.getTotalSize(),
|
|
220
|
-
contain: 'strict',
|
|
221
221
|
},
|
|
222
222
|
},
|
|
223
223
|
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
|
};
|