@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.
@@ -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
- * count: item.length,
10
- * getScrollElement: () => parentRef.current,
11
- * estimateSize: () => 30,
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]) => Virtualizer<Element, Element>;
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 virtualizer = (0, _reactvirtual.useVirtualizer)({
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
- virtualizer.scrollToIndex(index, {
39
+ _virtualizer.scrollToIndex(index, {
25
40
  align: 'auto',
26
41
  ...options,
27
42
  });
28
43
  });
29
44
  },
30
- [virtualizer],
45
+ [_virtualizer],
31
46
  );
32
- return _react.default.useMemo(
47
+ let virtualizer = _react.default.useMemo(
33
48
  () => ({
34
- ...virtualizer,
49
+ ..._virtualizer,
35
50
  scrollToIndex,
36
51
  }),
37
- [virtualizer, scrollToIndex],
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
- null,
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
  },
@@ -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
- null,
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
- className: cx(
63
- 'iui-table-row',
64
- {
65
- 'iui-table-row-expanded': row.isExpanded && subComponent,
66
- 'iui-loading': isLoading,
67
- },
68
- userRowProps?.className,
69
- ),
70
- 'aria-selected': row.isSelected || void 0,
71
- 'aria-disabled': isDisabled || void 0,
72
- 'data-iui-status': status,
73
- 'data-iui-index': virtualItem?.index,
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,
@@ -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
- position: 'absolute',
123
- top: 0,
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
- null,
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
@@ -1,4 +1,4 @@
1
- const t = '3.13.2';
1
+ const t = '3.13.4';
2
2
  const u = new Proxy(
3
3
  {},
4
4
  {
@@ -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
- * count: item.length,
10
- * getScrollElement: () => parentRef.current,
11
- * estimateSize: () => 30,
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]) => Virtualizer<Element, Element>;
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 virtualizer = useVirtualizer({
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
- virtualizer.scrollToIndex(index, {
28
+ _virtualizer.scrollToIndex(index, {
14
29
  align: 'auto',
15
30
  ...options,
16
31
  });
17
32
  });
18
33
  },
19
- [virtualizer],
34
+ [_virtualizer],
20
35
  );
21
- return React.useMemo(
36
+ let virtualizer = React.useMemo(
22
37
  () => ({
23
- ...virtualizer,
38
+ ..._virtualizer,
24
39
  scrollToIndex,
25
40
  }),
26
- [virtualizer, scrollToIndex],
41
+ [_virtualizer, scrollToIndex],
42
+ );
43
+ return React.useMemo(
44
+ () => ({
45
+ virtualizer,
46
+ css,
47
+ }),
48
+ [virtualizer],
27
49
  );
28
50
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/itwinui-react",
3
- "version": "3.13.2",
3
+ "version": "3.13.4",
4
4
  "author": "Bentley Systems",
5
5
  "license": "MIT",
6
6
  "type": "module",