@mui/x-virtualizer 0.3.3 → 1.0.0-alpha.1

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 (49) hide show
  1. package/CHANGELOG.md +591 -3
  2. package/{esm/features/colspan.d.ts → features/colspan.d.mts} +4 -4
  3. package/{esm/features/dimensions.d.ts → features/dimensions.d.mts} +2 -2
  4. package/{esm/features/dimensions.js → features/dimensions.mjs} +1 -1
  5. package/features/index.d.mts +5 -0
  6. package/features/index.mjs +5 -0
  7. package/{esm/features/keyboard.d.ts → features/keyboard.d.mts} +1 -1
  8. package/{esm/features/keyboard.js → features/keyboard.mjs} +2 -2
  9. package/{esm/features/rowspan.d.ts → features/rowspan.d.mts} +3 -3
  10. package/features/virtualization/index.d.mts +2 -0
  11. package/features/virtualization/index.mjs +2 -0
  12. package/{esm/features/virtualization/layout.d.ts → features/virtualization/layout.d.mts} +9 -9
  13. package/features/virtualization/layout.js +60 -4
  14. package/{esm/features/virtualization/layout.js → features/virtualization/layout.mjs} +61 -4
  15. package/{esm/features/virtualization/virtualization.d.ts → features/virtualization/virtualization.d.mts} +5 -5
  16. package/features/virtualization/virtualization.js +10 -25
  17. package/{esm/features/virtualization/virtualization.js → features/virtualization/virtualization.mjs} +11 -26
  18. package/index.d.mts +3 -0
  19. package/index.js +1 -1
  20. package/{esm/index.js → index.mjs} +4 -4
  21. package/{esm/models/dimensions.d.ts → models/dimensions.d.mts} +1 -1
  22. package/models/index.d.mts +4 -0
  23. package/models/index.mjs +4 -0
  24. package/{esm/models/rowspan.d.ts → models/rowspan.d.mts} +1 -1
  25. package/package.json +42 -17
  26. package/{esm/useVirtualizer.d.ts → useVirtualizer.d.mts} +20 -20
  27. package/{esm/useVirtualizer.js → useVirtualizer.mjs} +6 -6
  28. package/utils/useRefCallback.d.mts +1 -0
  29. package/utils/useRefCallback.d.ts +1 -0
  30. package/utils/useRefCallback.js +28 -0
  31. package/utils/useRefCallback.mjs +21 -0
  32. package/esm/features/index.d.ts +0 -5
  33. package/esm/features/index.js +0 -5
  34. package/esm/features/virtualization/index.d.ts +0 -2
  35. package/esm/features/virtualization/index.js +0 -2
  36. package/esm/index.d.ts +0 -3
  37. package/esm/models/index.d.ts +0 -4
  38. package/esm/models/index.js +0 -4
  39. package/esm/package.json +0 -1
  40. /package/{esm/constants.d.ts → constants.d.mts} +0 -0
  41. /package/{esm/constants.js → constants.mjs} +0 -0
  42. /package/{esm/features/colspan.js → features/colspan.mjs} +0 -0
  43. /package/{esm/features/rowspan.js → features/rowspan.mjs} +0 -0
  44. /package/{esm/models/colspan.d.ts → models/colspan.d.mts} +0 -0
  45. /package/{esm/models/colspan.js → models/colspan.mjs} +0 -0
  46. /package/{esm/models/core.d.ts → models/core.d.mts} +0 -0
  47. /package/{esm/models/core.js → models/core.mjs} +0 -0
  48. /package/{esm/models/dimensions.js → models/dimensions.mjs} +0 -0
  49. /package/{esm/models/rowspan.js → models/rowspan.mjs} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { Store } from '@mui/x-internals/store';
2
- import type { BaseState, ParamsWithDefaults } from "../useVirtualizer.js";
3
- import type { RowSpanningState } from "../models/rowspan.js";
4
- import { Virtualization } from "./virtualization/index.js";
2
+ import type { BaseState, ParamsWithDefaults } from "../useVirtualizer.mjs";
3
+ import type { RowSpanningState } from "../models/rowspan.mjs";
4
+ import { Virtualization } from "./virtualization/index.mjs";
5
5
  export declare const Rowspan: {
6
6
  initialize: typeof initializeState;
7
7
  use: typeof useRowspan;
@@ -0,0 +1,2 @@
1
+ export * from "./layout.mjs";
2
+ export * from "./virtualization.mjs";
@@ -0,0 +1,2 @@
1
+ export * from "./layout.mjs";
2
+ export * from "./virtualization.mjs";
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { Store } from '@mui/x-internals/store';
3
- import { Dimensions } from "../dimensions.js";
4
- import { Virtualization, type VirtualizationLayoutParams } from "./virtualization.js";
5
- import type { BaseState, ParamsWithDefaults } from "../../useVirtualizer.js";
3
+ import { Dimensions } from "../dimensions.mjs";
4
+ import { Virtualization, type VirtualizationLayoutParams } from "./virtualization.mjs";
5
+ import type { BaseState, ParamsWithDefaults } from "../../useVirtualizer.mjs";
6
6
  type RequiredAPI = Dimensions.API;
7
7
  type BaseElements = {
8
8
  scroller: React.RefObject<HTMLElement | null>;
@@ -48,18 +48,18 @@ export declare class LayoutDataGrid extends Layout<DataGridElements> {
48
48
  scrollbarHorizontalProps: (args_0: Virtualization.State<Layout<AnyElements>> & Dimensions.State) => {
49
49
  ref: any;
50
50
  scrollPosition: {
51
- current: import("../../models/index.js").ScrollPosition;
51
+ current: import("../../models/index.mjs").ScrollPosition;
52
52
  };
53
53
  };
54
54
  scrollbarVerticalProps: (args_0: Virtualization.State<Layout<AnyElements>> & Dimensions.State) => {
55
55
  ref: any;
56
56
  scrollPosition: {
57
- current: import("../../models/index.js").ScrollPosition;
57
+ current: import("../../models/index.mjs").ScrollPosition;
58
58
  };
59
59
  };
60
60
  scrollAreaProps: (args_0: Virtualization.State<Layout<AnyElements>> & Dimensions.State) => {
61
61
  scrollPosition: {
62
- current: import("../../models/index.js").ScrollPosition;
62
+ current: import("../../models/index.mjs").ScrollPosition;
63
63
  };
64
64
  };
65
65
  };
@@ -90,18 +90,18 @@ export declare class LayoutDataGridLegacy extends LayoutDataGrid {
90
90
  getScrollbarVerticalProps: () => {
91
91
  ref: any;
92
92
  scrollPosition: {
93
- current: import("../../models/index.js").ScrollPosition;
93
+ current: import("../../models/index.mjs").ScrollPosition;
94
94
  };
95
95
  };
96
96
  getScrollbarHorizontalProps: () => {
97
97
  ref: any;
98
98
  scrollPosition: {
99
- current: import("../../models/index.js").ScrollPosition;
99
+ current: import("../../models/index.mjs").ScrollPosition;
100
100
  };
101
101
  };
102
102
  getScrollAreaProps: () => {
103
103
  scrollPosition: {
104
- current: import("../../models/index.js").ScrollPosition;
104
+ current: import("../../models/index.mjs").ScrollPosition;
105
105
  };
106
106
  };
107
107
  };
@@ -1,17 +1,20 @@
1
1
  "use strict";
2
+ 'use client';
2
3
 
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
4
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
6
  Object.defineProperty(exports, "__esModule", {
6
7
  value: true
7
8
  });
8
9
  exports.LayoutList = exports.LayoutDataGridLegacy = exports.LayoutDataGrid = exports.Layout = void 0;
10
+ var React = _interopRequireWildcard(require("react"));
9
11
  var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
10
12
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
11
13
  var platform = _interopRequireWildcard(require("@mui/x-internals/platform"));
12
14
  var _store = require("@mui/x-internals/store");
13
15
  var _dimensions = require("../../features/dimensions");
14
16
  var _virtualization = require("./virtualization");
17
+ var _useRefCallback = _interopRequireDefault(require("../../utils/useRefCallback"));
15
18
  /* eslint-disable react-hooks/rules-of-hooks */
16
19
 
17
20
  class Layout {
@@ -35,8 +38,8 @@ class LayoutDataGrid extends Layout {
35
38
  scrollerRef,
36
39
  containerRef
37
40
  } = layoutParams;
38
- const scrollbarVerticalRef = (0, _useEventCallback.default)(this.refSetter('scrollbarVertical'));
39
- const scrollbarHorizontalRef = (0, _useEventCallback.default)(this.refSetter('scrollbarHorizontal'));
41
+ const scrollbarVerticalRef = useScrollbarRefCallback(this.refs.scroller, this.refSetter('scrollbarVertical'), 'scrollTop');
42
+ const scrollbarHorizontalRef = useScrollbarRefCallback(this.refs.scroller, this.refSetter('scrollbarHorizontal'), 'scrollLeft');
40
43
  store.state.virtualization.context = {
41
44
  scrollerRef,
42
45
  containerRef,
@@ -51,8 +54,10 @@ class LayoutDataGrid extends Layout {
51
54
  scrollerProps: (0, _store.createSelectorMemoized)(_virtualization.Virtualization.selectors.context, _dimensions.Dimensions.selectors.autoHeight, _dimensions.Dimensions.selectors.needsHorizontalScrollbar, (context, autoHeight, needsHorizontalScrollbar) => ({
52
55
  ref: context.scrollerRef,
53
56
  style: {
57
+ // TODO: fall back to overflow: 'auto' if no overflowX or overflowY is set?
54
58
  overflowX: !needsHorizontalScrollbar ? 'hidden' : undefined,
55
59
  overflowY: autoHeight ? 'hidden' : undefined
60
+ // TODO: should include display: 'flex', flexDirection: 'column' since the Content has flexBasis and flexShrink?
56
61
  },
57
62
  role: 'presentation',
58
63
  // `tabIndex` shouldn't be used along role=presentation, but it fixes a Firefox bug
@@ -160,4 +165,55 @@ class LayoutList extends Layout {
160
165
  }))
161
166
  };
162
167
  }
163
- exports.LayoutList = LayoutList;
168
+ exports.LayoutList = LayoutList;
169
+ function useScrollbarRefCallback(scrollerRef, refSetter, scrollProperty) {
170
+ const isLocked = React.useRef(false);
171
+ const lastPosition = React.useRef(0);
172
+ const handleScrollerScroll = (0, _useEventCallback.default)(scrollbar => {
173
+ const scroller = scrollerRef.current;
174
+ if (!scroller) {
175
+ return;
176
+ }
177
+ const scrollerPosition = scroller[scrollProperty];
178
+ if (scrollerPosition === lastPosition.current) {
179
+ return;
180
+ }
181
+ lastPosition.current = scrollerPosition;
182
+ if (isLocked.current) {
183
+ isLocked.current = false;
184
+ return;
185
+ }
186
+ isLocked.current = true;
187
+ scrollbar[scrollProperty] = scrollerPosition;
188
+ });
189
+ const handleScrollbarScroll = (0, _useEventCallback.default)(scrollbar => {
190
+ const scroller = scrollerRef.current;
191
+ if (!scroller) {
192
+ return;
193
+ }
194
+ if (isLocked.current) {
195
+ isLocked.current = false;
196
+ return;
197
+ }
198
+ isLocked.current = true;
199
+ scroller[scrollProperty] = scrollbar[scrollProperty];
200
+ });
201
+ return (0, _useRefCallback.default)(scrollbar => {
202
+ refSetter(scrollbar);
203
+ const scroller = scrollerRef.current;
204
+ if (!scroller) {
205
+ return undefined;
206
+ }
207
+ const onScrollerScroll = () => handleScrollerScroll(scrollbar);
208
+ const onScrollbarScroll = () => handleScrollbarScroll(scrollbar);
209
+ const options = {
210
+ passive: true
211
+ };
212
+ scroller.addEventListener('scroll', onScrollerScroll, options);
213
+ scrollbar.addEventListener('scroll', onScrollbarScroll, options);
214
+ return () => {
215
+ scroller.removeEventListener('scroll', onScrollerScroll);
216
+ scrollbar.removeEventListener('scroll', onScrollbarScroll);
217
+ };
218
+ });
219
+ }
@@ -1,9 +1,13 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
1
4
  import useForkRef from '@mui/utils/useForkRef';
2
5
  import useEventCallback from '@mui/utils/useEventCallback';
3
6
  import * as platform from '@mui/x-internals/platform';
4
7
  import { createSelectorMemoized } from '@mui/x-internals/store';
5
- import { Dimensions } from "../dimensions.js";
6
- import { Virtualization } from "./virtualization.js";
8
+ import { Dimensions } from "../dimensions.mjs";
9
+ import { Virtualization } from "./virtualization.mjs";
10
+ import useRefCallback from "../../utils/useRefCallback.mjs";
7
11
 
8
12
  /* eslint-disable react-hooks/rules-of-hooks */
9
13
 
@@ -27,8 +31,8 @@ export class LayoutDataGrid extends Layout {
27
31
  scrollerRef,
28
32
  containerRef
29
33
  } = layoutParams;
30
- const scrollbarVerticalRef = useEventCallback(this.refSetter('scrollbarVertical'));
31
- const scrollbarHorizontalRef = useEventCallback(this.refSetter('scrollbarHorizontal'));
34
+ const scrollbarVerticalRef = useScrollbarRefCallback(this.refs.scroller, this.refSetter('scrollbarVertical'), 'scrollTop');
35
+ const scrollbarHorizontalRef = useScrollbarRefCallback(this.refs.scroller, this.refSetter('scrollbarHorizontal'), 'scrollLeft');
32
36
  store.state.virtualization.context = {
33
37
  scrollerRef,
34
38
  containerRef,
@@ -43,8 +47,10 @@ export class LayoutDataGrid extends Layout {
43
47
  scrollerProps: createSelectorMemoized(Virtualization.selectors.context, Dimensions.selectors.autoHeight, Dimensions.selectors.needsHorizontalScrollbar, (context, autoHeight, needsHorizontalScrollbar) => ({
44
48
  ref: context.scrollerRef,
45
49
  style: {
50
+ // TODO: fall back to overflow: 'auto' if no overflowX or overflowY is set?
46
51
  overflowX: !needsHorizontalScrollbar ? 'hidden' : undefined,
47
52
  overflowY: autoHeight ? 'hidden' : undefined
53
+ // TODO: should include display: 'flex', flexDirection: 'column' since the Content has flexBasis and flexShrink?
48
54
  },
49
55
  role: 'presentation',
50
56
  // `tabIndex` shouldn't be used along role=presentation, but it fixes a Firefox bug
@@ -149,4 +155,55 @@ export class LayoutList extends Layout {
149
155
  }
150
156
  }))
151
157
  }))();
158
+ }
159
+ function useScrollbarRefCallback(scrollerRef, refSetter, scrollProperty) {
160
+ const isLocked = React.useRef(false);
161
+ const lastPosition = React.useRef(0);
162
+ const handleScrollerScroll = useEventCallback(scrollbar => {
163
+ const scroller = scrollerRef.current;
164
+ if (!scroller) {
165
+ return;
166
+ }
167
+ const scrollerPosition = scroller[scrollProperty];
168
+ if (scrollerPosition === lastPosition.current) {
169
+ return;
170
+ }
171
+ lastPosition.current = scrollerPosition;
172
+ if (isLocked.current) {
173
+ isLocked.current = false;
174
+ return;
175
+ }
176
+ isLocked.current = true;
177
+ scrollbar[scrollProperty] = scrollerPosition;
178
+ });
179
+ const handleScrollbarScroll = useEventCallback(scrollbar => {
180
+ const scroller = scrollerRef.current;
181
+ if (!scroller) {
182
+ return;
183
+ }
184
+ if (isLocked.current) {
185
+ isLocked.current = false;
186
+ return;
187
+ }
188
+ isLocked.current = true;
189
+ scroller[scrollProperty] = scrollbar[scrollProperty];
190
+ });
191
+ return useRefCallback(scrollbar => {
192
+ refSetter(scrollbar);
193
+ const scroller = scrollerRef.current;
194
+ if (!scroller) {
195
+ return undefined;
196
+ }
197
+ const onScrollerScroll = () => handleScrollerScroll(scrollbar);
198
+ const onScrollbarScroll = () => handleScrollbarScroll(scrollbar);
199
+ const options = {
200
+ passive: true
201
+ };
202
+ scroller.addEventListener('scroll', onScrollerScroll, options);
203
+ scrollbar.addEventListener('scroll', onScrollbarScroll, options);
204
+ return () => {
205
+ scroller.removeEventListener('scroll', onScrollerScroll);
206
+ scrollbar.removeEventListener('scroll', onScrollbarScroll);
207
+ };
208
+ });
152
209
  }
@@ -1,11 +1,11 @@
1
1
  import * as React from 'react';
2
2
  import type { integer } from '@mui/x-internals/types';
3
3
  import { Store } from '@mui/x-internals/store';
4
- import type { CellColSpanInfo } from "../../models/colspan.js";
5
- import { Dimensions } from "../dimensions.js";
6
- import type { BaseState, ParamsWithDefaults } from "../../useVirtualizer.js";
7
- import type { Layout } from "./layout.js";
8
- import { RenderContext, ColumnsRenderContext, ColumnWithWidth, RowId, ScrollPosition } from "../../models/index.js";
4
+ import type { CellColSpanInfo } from "../../models/colspan.mjs";
5
+ import { Dimensions } from "../dimensions.mjs";
6
+ import type { BaseState, ParamsWithDefaults } from "../../useVirtualizer.mjs";
7
+ import type { Layout } from "./layout.mjs";
8
+ import { RenderContext, ColumnsRenderContext, ColumnWithWidth, RowId, ScrollPosition } from "../../models/index.mjs";
9
9
  export type VirtualizationParams = {
10
10
  /** @default false */
11
11
  isRtl?: boolean;
@@ -10,6 +10,7 @@ exports.Virtualization = exports.EMPTY_RENDER_CONTEXT = void 0;
10
10
  exports.areRenderContextsEqual = areRenderContextsEqual;
11
11
  exports.computeOffsetLeft = computeOffsetLeft;
12
12
  exports.roundToDecimalPlaces = roundToDecimalPlaces;
13
+ var _formatErrorMessage2 = _interopRequireDefault(require("@mui/x-internals/formatErrorMessage"));
13
14
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
14
15
  var React = _interopRequireWildcard(require("react"));
15
16
  var ReactDOM = _interopRequireWildcard(require("react-dom"));
@@ -20,7 +21,7 @@ var _useEnhancedEffect = _interopRequireDefault(require("@mui/utils/useEnhancedE
20
21
  var platform = _interopRequireWildcard(require("@mui/x-internals/platform"));
21
22
  var _useRunOnce = require("@mui/x-internals/useRunOnce");
22
23
  var _store = require("@mui/x-internals/store");
23
- var _reactMajor = _interopRequireDefault(require("@mui/x-internals/reactMajor"));
24
+ var _useRefCallback = _interopRequireDefault(require("../../utils/useRefCallback"));
24
25
  var _core = require("../../models/core");
25
26
  var _dimensions = require("../dimensions");
26
27
  var _models = require("../../models");
@@ -300,11 +301,11 @@ function useVirtualization(store, params, api) {
300
301
  let virtualRowIndex = -1;
301
302
  const focusedVirtualCell = params.focusedVirtualCell?.();
302
303
  if (!isPinnedSection && focusedVirtualCell) {
303
- if (focusedVirtualCell.rowIndex < firstRowToRender) {
304
+ if (focusedVirtualCell.rowIndex < firstRowToRender && focusedVirtualCell.rowIndex >= 0 && focusedVirtualCell.rowIndex < rowModels.length) {
304
305
  rowIndexes.unshift(focusedVirtualCell.rowIndex);
305
306
  virtualRowIndex = focusedVirtualCell.rowIndex;
306
307
  }
307
- if (focusedVirtualCell.rowIndex > lastRowToRender) {
308
+ if (focusedVirtualCell.rowIndex > lastRowToRender && focusedVirtualCell.rowIndex < rowModels.length) {
308
309
  rowIndexes.push(focusedVirtualCell.rowIndex);
309
310
  virtualRowIndex = focusedVirtualCell.rowIndex;
310
311
  }
@@ -461,7 +462,7 @@ function useVirtualization(store, params, api) {
461
462
  }
462
463
  }, [layout.refs.scroller, columnsTotalWidth, contentHeight]);
463
464
  const isFirstSizing = React.useRef(true);
464
- const containerRef = useRefCallback(node => {
465
+ const containerRef = (0, _useRefCallback.default)(node => {
465
466
  layout.refs.container.current = node;
466
467
  const unsubscribe = (0, _dimensions.observeRootNode)(node, store, rootSize => {
467
468
  if (rootSize.width === 0 && rootSize.height === 0 && store.state.rootSize.height !== 0 && store.state.rootSize.width !== 0) {
@@ -481,7 +482,7 @@ function useVirtualization(store, params, api) {
481
482
  layout.refs.container.current = null;
482
483
  };
483
484
  });
484
- const scrollerRef = useRefCallback(node => {
485
+ const scrollerRef = (0, _useRefCallback.default)(node => {
485
486
  layout.refs.scroller.current = node;
486
487
  const opts = {
487
488
  passive: true
@@ -513,22 +514,6 @@ function useVirtualization(store, params, api) {
513
514
  scheduleUpdateRenderContext
514
515
  }, createSpanningAPI());
515
516
  }
516
- function useRefCallback(fn) {
517
- const refCleanup = React.useRef(undefined);
518
- const refCallback = (0, _useEventCallback.default)(node => {
519
- if (!node) {
520
- // Cleanup for R18
521
- refCleanup.current?.();
522
- return;
523
- }
524
- refCleanup.current = fn(node);
525
- if (_reactMajor.default >= 19) {
526
- /* eslint-disable-next-line consistent-return */
527
- return refCleanup.current;
528
- }
529
- });
530
- return refCallback;
531
- }
532
517
  function inputsSelector(store, params, api, enabledForRows, enabledForColumns) {
533
518
  const dimensions = _dimensions.Dimensions.selectors.dimensions(store.state);
534
519
  const rows = params.rows;
@@ -804,7 +789,7 @@ function bufferForDirection(isRtl, direction, rowBufferPx, columnBufferPx, verti
804
789
  };
805
790
  default:
806
791
  // eslint unable to figure out enum exhaustiveness
807
- throw new Error('unreachable');
792
+ throw /* minify-error-disabled */new Error('unreachable');
808
793
  }
809
794
  }
810
795
  function createScrollCache(isRtl, rowBufferPx, columnBufferPx, verticalBuffer, horizontalBuffer) {
@@ -850,13 +835,13 @@ function getFirstNonSpannedColumnToRender({
850
835
  /** Placeholder API functions for colspan & rowspan to re-implement */
851
836
  function createSpanningAPI() {
852
837
  const getCellColSpanInfo = () => {
853
- throw new Error('Unimplemented: colspan feature is required');
838
+ throw new Error(process.env.NODE_ENV !== "production" ? 'MUI X: Unimplemented: colspan feature is required' : (0, _formatErrorMessage2.default)(200));
854
839
  };
855
840
  const calculateColSpan = () => {
856
- throw new Error('Unimplemented: colspan feature is required');
841
+ throw new Error(process.env.NODE_ENV !== "production" ? 'MUI X: Unimplemented: colspan feature is required' : (0, _formatErrorMessage2.default)(200));
857
842
  };
858
843
  const getHiddenCellsOrigin = () => {
859
- throw new Error('Unimplemented: rowspan feature is required');
844
+ throw new Error(process.env.NODE_ENV !== "production" ? 'MUI X: Unimplemented: rowspan feature is required' : (0, _formatErrorMessage2.default)(201));
860
845
  };
861
846
  return {
862
847
  getCellColSpanInfo,
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
 
3
+ import _formatErrorMessage from "@mui/x-internals/formatErrorMessage";
3
4
  import _extends from "@babel/runtime/helpers/esm/extends";
4
5
  import * as React from 'react';
5
6
  import * as ReactDOM from 'react-dom';
@@ -10,10 +11,10 @@ import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
10
11
  import * as platform from '@mui/x-internals/platform';
11
12
  import { useRunOnce } from '@mui/x-internals/useRunOnce';
12
13
  import { createSelector, useStore, useStoreEffect } from '@mui/x-internals/store';
13
- import reactMajor from '@mui/x-internals/reactMajor';
14
- import { PinnedRows, PinnedColumns } from "../../models/core.js";
15
- import { Dimensions, observeRootNode } from "../dimensions.js";
16
- import { ScrollPosition, ScrollDirection } from "../../models/index.js";
14
+ import useRefCallback from "../../utils/useRefCallback.mjs";
15
+ import { PinnedRows, PinnedColumns } from "../../models/core.mjs";
16
+ import { Dimensions, observeRootNode } from "../dimensions.mjs";
17
+ import { ScrollPosition, ScrollDirection } from "../../models/index.mjs";
17
18
 
18
19
  /* eslint-disable import/export, @typescript-eslint/no-redeclare */
19
20
 
@@ -291,11 +292,11 @@ function useVirtualization(store, params, api) {
291
292
  let virtualRowIndex = -1;
292
293
  const focusedVirtualCell = params.focusedVirtualCell?.();
293
294
  if (!isPinnedSection && focusedVirtualCell) {
294
- if (focusedVirtualCell.rowIndex < firstRowToRender) {
295
+ if (focusedVirtualCell.rowIndex < firstRowToRender && focusedVirtualCell.rowIndex >= 0 && focusedVirtualCell.rowIndex < rowModels.length) {
295
296
  rowIndexes.unshift(focusedVirtualCell.rowIndex);
296
297
  virtualRowIndex = focusedVirtualCell.rowIndex;
297
298
  }
298
- if (focusedVirtualCell.rowIndex > lastRowToRender) {
299
+ if (focusedVirtualCell.rowIndex > lastRowToRender && focusedVirtualCell.rowIndex < rowModels.length) {
299
300
  rowIndexes.push(focusedVirtualCell.rowIndex);
300
301
  virtualRowIndex = focusedVirtualCell.rowIndex;
301
302
  }
@@ -504,22 +505,6 @@ function useVirtualization(store, params, api) {
504
505
  scheduleUpdateRenderContext
505
506
  }, createSpanningAPI());
506
507
  }
507
- function useRefCallback(fn) {
508
- const refCleanup = React.useRef(undefined);
509
- const refCallback = useEventCallback(node => {
510
- if (!node) {
511
- // Cleanup for R18
512
- refCleanup.current?.();
513
- return;
514
- }
515
- refCleanup.current = fn(node);
516
- if (reactMajor >= 19) {
517
- /* eslint-disable-next-line consistent-return */
518
- return refCleanup.current;
519
- }
520
- });
521
- return refCallback;
522
- }
523
508
  function inputsSelector(store, params, api, enabledForRows, enabledForColumns) {
524
509
  const dimensions = Dimensions.selectors.dimensions(store.state);
525
510
  const rows = params.rows;
@@ -795,7 +780,7 @@ function bufferForDirection(isRtl, direction, rowBufferPx, columnBufferPx, verti
795
780
  };
796
781
  default:
797
782
  // eslint unable to figure out enum exhaustiveness
798
- throw new Error('unreachable');
783
+ throw /* minify-error-disabled */new Error('unreachable');
799
784
  }
800
785
  }
801
786
  function createScrollCache(isRtl, rowBufferPx, columnBufferPx, verticalBuffer, horizontalBuffer) {
@@ -841,13 +826,13 @@ function getFirstNonSpannedColumnToRender({
841
826
  /** Placeholder API functions for colspan & rowspan to re-implement */
842
827
  function createSpanningAPI() {
843
828
  const getCellColSpanInfo = () => {
844
- throw new Error('Unimplemented: colspan feature is required');
829
+ throw new Error(process.env.NODE_ENV !== "production" ? 'MUI X: Unimplemented: colspan feature is required' : _formatErrorMessage(200));
845
830
  };
846
831
  const calculateColSpan = () => {
847
- throw new Error('Unimplemented: colspan feature is required');
832
+ throw new Error(process.env.NODE_ENV !== "production" ? 'MUI X: Unimplemented: colspan feature is required' : _formatErrorMessage(200));
848
833
  };
849
834
  const getHiddenCellsOrigin = () => {
850
- throw new Error('Unimplemented: rowspan feature is required');
835
+ throw new Error(process.env.NODE_ENV !== "production" ? 'MUI X: Unimplemented: rowspan feature is required' : _formatErrorMessage(201));
851
836
  };
852
837
  return {
853
838
  getCellColSpanInfo,
package/index.d.mts ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./useVirtualizer.mjs";
2
+ export * from "./features/index.mjs";
3
+ export * from "./constants.mjs";
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-virtualizer v0.3.3
2
+ * @mui/x-virtualizer v1.0.0-alpha.1
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -1,10 +1,10 @@
1
1
  /**
2
- * @mui/x-virtualizer v0.3.3
2
+ * @mui/x-virtualizer v1.0.0-alpha.1
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
- export * from "./useVirtualizer.js";
9
- export * from "./features/index.js";
10
- export * from "./constants.js";
8
+ export * from "./useVirtualizer.mjs";
9
+ export * from "./features/index.mjs";
10
+ export * from "./constants.mjs";
@@ -1,4 +1,4 @@
1
- import { Size } from "./core.js";
1
+ import { Size } from "./core.mjs";
2
2
  export interface DimensionsState {
3
3
  /**
4
4
  * Indicates that the dimensions have been initialized.
@@ -0,0 +1,4 @@
1
+ export * from "./core.mjs";
2
+ export * from "./colspan.mjs";
3
+ export * from "./dimensions.mjs";
4
+ export * from "./rowspan.mjs";
@@ -0,0 +1,4 @@
1
+ export * from "./core.mjs";
2
+ export * from "./colspan.mjs";
3
+ export * from "./dimensions.mjs";
4
+ export * from "./rowspan.mjs";
@@ -1,4 +1,4 @@
1
- import { RowId, RowRange } from "./core.js";
1
+ import { RowId, RowRange } from "./core.mjs";
2
2
  type ColumnIndex = number;
3
3
  export interface RowSpanningCaches {
4
4
  spannedCells: Record<RowId, Record<ColumnIndex, number>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-virtualizer",
3
- "version": "0.3.3",
3
+ "version": "1.0.0-alpha.1",
4
4
  "author": "MUI Team",
5
5
  "description": "MUI virtualization library",
6
6
  "license": "MIT",
@@ -27,9 +27,9 @@
27
27
  "directory": "packages/x-virtualizer"
28
28
  },
29
29
  "dependencies": {
30
- "@babel/runtime": "^7.28.4",
31
- "@mui/utils": "^7.3.5",
32
- "@mui/x-internals": "8.26.0"
30
+ "@babel/runtime": "^7.28.6",
31
+ "@mui/utils": "^7.3.7",
32
+ "@mui/x-internals": "9.0.0-alpha.2"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
@@ -39,40 +39,65 @@
39
39
  "node": ">=14.0.0"
40
40
  },
41
41
  "type": "commonjs",
42
- "main": "./index.js",
43
- "types": "./index.d.ts",
44
42
  "exports": {
45
43
  "./package.json": "./package.json",
46
44
  ".": {
45
+ "import": {
46
+ "types": "./index.d.mts",
47
+ "default": "./index.mjs"
48
+ },
47
49
  "require": {
48
50
  "types": "./index.d.ts",
49
51
  "default": "./index.js"
50
52
  },
51
53
  "default": {
52
- "types": "./esm/index.d.ts",
53
- "default": "./esm/index.js"
54
+ "types": "./index.d.mts",
55
+ "default": "./index.mjs"
54
56
  }
55
57
  },
56
58
  "./useVirtualizer": {
59
+ "import": {
60
+ "types": "./useVirtualizer.d.mts",
61
+ "default": "./useVirtualizer.mjs"
62
+ },
57
63
  "require": {
58
64
  "types": "./useVirtualizer.d.ts",
59
65
  "default": "./useVirtualizer.js"
60
66
  },
61
67
  "default": {
62
- "types": "./esm/useVirtualizer.d.ts",
63
- "default": "./esm/useVirtualizer.js"
68
+ "types": "./useVirtualizer.d.mts",
69
+ "default": "./useVirtualizer.mjs"
64
70
  }
65
71
  },
66
- "./*": {
72
+ "./features": {
73
+ "import": {
74
+ "types": "./features/index.d.mts",
75
+ "default": "./features/index.mjs"
76
+ },
67
77
  "require": {
68
- "types": "./*/index.d.ts",
69
- "default": "./*/index.js"
78
+ "types": "./features/index.d.ts",
79
+ "default": "./features/index.js"
70
80
  },
71
81
  "default": {
72
- "types": "./esm/*/index.d.ts",
73
- "default": "./esm/*/index.js"
82
+ "types": "./features/index.d.mts",
83
+ "default": "./features/index.mjs"
74
84
  }
75
85
  },
76
- "./esm": null
77
- }
86
+ "./models": {
87
+ "import": {
88
+ "types": "./models/index.d.mts",
89
+ "default": "./models/index.mjs"
90
+ },
91
+ "require": {
92
+ "types": "./models/index.d.ts",
93
+ "default": "./models/index.js"
94
+ },
95
+ "default": {
96
+ "types": "./models/index.d.mts",
97
+ "default": "./models/index.mjs"
98
+ }
99
+ }
100
+ },
101
+ "main": "./index.js",
102
+ "types": "./index.d.ts"
78
103
  }