@candidstartup/react-virtual-scroll 0.6.1 → 0.7.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/README.md +3 -3
- package/dist/index.d.ts +38 -36
- package/dist/index.js +50 -95
- package/dist/index.js.map +1 -1
- package/package.json +8 -3
package/README.md
CHANGED
|
@@ -49,12 +49,12 @@ const list = React.useRef(null);
|
|
|
49
49
|
</VirtualList>
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
Check out the [full sample](https://github.com/TheCandidStartup/infinisheet/tree/main/packages/react-virtual-scroll/sandboxes/trillion-row-list) or [try it out on
|
|
52
|
+
Check out the [full sample](https://github.com/TheCandidStartup/infinisheet/tree/main/packages/react-virtual-scroll/sandboxes/trillion-row-list) or [try it out on Storybook](https://www.thecandidstartup.org/infinisheet/storybook/?path=/docs/react-virtual-scroll-virtuallist--docs)
|
|
53
53
|
|
|
54
54
|
## VirtualGrid Example
|
|
55
55
|
|
|
56
56
|
```jsx
|
|
57
|
-
import {
|
|
57
|
+
import { VirtualGrid, useVariableSizeItemOffsetMapping, useFixedSizeItemOffsetMapping } from '@candidstartup/react-virtual-scroll';
|
|
58
58
|
|
|
59
59
|
const rowMapping = useVariableSizeItemOffsetMapping(30, [50]);
|
|
60
60
|
const columnMapping = useFixedSizeItemOffsetMapping(280);
|
|
@@ -74,7 +74,7 @@ const grid = React.useRef(null);
|
|
|
74
74
|
</VirtualGrid>
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
Check out the [full sample](https://github.com/TheCandidStartup/infinisheet/tree/main/packages/react-virtual-scroll/sandboxes/trillion-square-grid) or [try it out on
|
|
77
|
+
Check out the [full sample](https://github.com/TheCandidStartup/infinisheet/tree/main/packages/react-virtual-scroll/sandboxes/trillion-square-grid) or [try it out on Storybook](https://www.thecandidstartup.org/infinisheet/storybook/?path=/docs/react-virtual-scroll-virtualgrid--docs)
|
|
78
78
|
|
|
79
79
|
# More
|
|
80
80
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import React$1 from 'react';
|
|
2
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { ItemOffsetMapping } from '@candidstartup/infinisheet-types';
|
|
4
|
+
export { ItemOffsetMapping } from '@candidstartup/infinisheet-types';
|
|
3
5
|
|
|
4
6
|
/**
|
|
5
7
|
* Props that an implementation of {@link VirtualContainerRender} must accept.
|
|
@@ -168,23 +170,6 @@ interface VirtualBaseProps extends VirtualScrollableProps {
|
|
|
168
170
|
/** Passed as {@link DisplayBaseItemProps.data} to each child item */
|
|
169
171
|
itemData?: unknown;
|
|
170
172
|
}
|
|
171
|
-
/**
|
|
172
|
-
* Interface that {@link VirtualList} and {@link VirtualGrid} use to determine size and
|
|
173
|
-
* positioning offset for items in a single dimension.
|
|
174
|
-
*/
|
|
175
|
-
interface ItemOffsetMapping {
|
|
176
|
-
/** Size of item with given index */
|
|
177
|
-
itemSize(itemIndex: number): number;
|
|
178
|
-
/** Offset from start of container to specified item
|
|
179
|
-
*
|
|
180
|
-
* `itemOffset(n)` should be equal to `Sum{i:0->n-1}(itemSize(i))`
|
|
181
|
-
*
|
|
182
|
-
* To efficiently support large containers, cost should be `O(logn)` or better.
|
|
183
|
-
*/
|
|
184
|
-
itemOffset(itemIndex: number): number;
|
|
185
|
-
/** Given an offset, return the index of the item that intersects that offset, together with the start offset of that item */
|
|
186
|
-
offsetToItem(offset: number): [itemIndex: number, startOffset: number];
|
|
187
|
-
}
|
|
188
173
|
/** Alias for type of event that React passes to a `div` element's `OnScroll` handler. */
|
|
189
174
|
type ScrollEvent = React$1.SyntheticEvent<HTMLDivElement>;
|
|
190
175
|
/**
|
|
@@ -207,7 +192,7 @@ type ScrollDirection = "forward" | "backward";
|
|
|
207
192
|
interface ScrollState {
|
|
208
193
|
/** Scroll bar offset. Equal to outer container's `scrollTop` or `scrollLeft` depending on dimension. */
|
|
209
194
|
scrollOffset: number;
|
|
210
|
-
/** Offset used to position current page of items in virtual space.
|
|
195
|
+
/** Offset used to position current page of items in virtual space. Total offset is `scrollOffset+renderOffset`. */
|
|
211
196
|
renderOffset: number;
|
|
212
197
|
/** Index of current page. */
|
|
213
198
|
page: number;
|
|
@@ -242,6 +227,10 @@ interface VirtualScrollProxy {
|
|
|
242
227
|
get clientWidth(): number;
|
|
243
228
|
/** Exposes DOM clientHeight property */
|
|
244
229
|
get clientHeight(): number;
|
|
230
|
+
/** Current vertical position of scroll bar */
|
|
231
|
+
get verticalOffset(): number;
|
|
232
|
+
/** Current horizontal position of scroll bar */
|
|
233
|
+
get horizontalOffset(): number;
|
|
245
234
|
}
|
|
246
235
|
/**
|
|
247
236
|
* Returns the offset needed to scroll in one dimension for a specified range
|
|
@@ -267,16 +256,19 @@ interface VirtualContentProps {
|
|
|
267
256
|
horizontalOffset: number;
|
|
268
257
|
}
|
|
269
258
|
/**
|
|
270
|
-
* Render prop for content
|
|
259
|
+
* Render prop for content in {@link VirtualScroll}
|
|
271
260
|
*
|
|
272
|
-
* Pass to {@link VirtualScroll} to render content
|
|
273
|
-
*
|
|
274
|
-
* and any `ref` to it.
|
|
261
|
+
* Pass as child to {@link VirtualScroll} to render content and forward {@link VirtualContentProps}
|
|
262
|
+
* to whatever needs them.
|
|
275
263
|
*
|
|
276
|
-
* @example
|
|
264
|
+
* @example Simple implementation
|
|
277
265
|
* ```
|
|
278
|
-
* const contentRender: VirtualContentRender = ({isScrolling,
|
|
279
|
-
* <
|
|
266
|
+
* const contentRender: VirtualContentRender = ({isScrolling, verticalOffset, horizontalOffset}) => (
|
|
267
|
+
* <DisplayGrid
|
|
268
|
+
* isScrolling={isScrolling}
|
|
269
|
+
* rowOffset={verticalOffset}
|
|
270
|
+
* columnOffset={horizontalOffset}
|
|
271
|
+
* {...rest}/>
|
|
280
272
|
* )
|
|
281
273
|
* ```
|
|
282
274
|
*/
|
|
@@ -299,6 +291,15 @@ interface VirtualScrollProps extends VirtualScrollableProps {
|
|
|
299
291
|
* @defaultValue 0
|
|
300
292
|
*/
|
|
301
293
|
scrollWidth?: number;
|
|
294
|
+
/**
|
|
295
|
+
* Determines whether the component should pass {@link VirtualContentProps.verticalOffset|verticalOffset} and
|
|
296
|
+
* {@link VirtualContentProps.horizontalOffset|horizontalOffset} to children when rendering.
|
|
297
|
+
*
|
|
298
|
+
* Can reduce the number of renders needed if these props aren't used
|
|
299
|
+
*
|
|
300
|
+
* @defaultValue true
|
|
301
|
+
* */
|
|
302
|
+
useOffsets?: boolean;
|
|
302
303
|
/**
|
|
303
304
|
* Callback after a scroll event has been processed and state updated but before rendering
|
|
304
305
|
* @param verticalOffset - Resulting overall vertical offset.
|
|
@@ -316,7 +317,7 @@ interface VirtualScrollProps extends VirtualScrollableProps {
|
|
|
316
317
|
* Customizable Virtual Scrolling Component
|
|
317
318
|
*
|
|
318
319
|
* Allows user to scroll over a virtual area `scrollHeight` x `scrollWidth` pixels.
|
|
319
|
-
* Use `onScroll` to track scroll state and
|
|
320
|
+
* Use `onScroll` to track scroll state and {@link VirtualContentRender} to render scroll state specific content into the viewport
|
|
320
321
|
*
|
|
321
322
|
* Accepts props defined by {@link VirtualScrollProps}.
|
|
322
323
|
* Refs are forwarded to {@link VirtualScrollProxy}.
|
|
@@ -441,10 +442,7 @@ interface DisplayGridProps extends DisplayBaseProps {
|
|
|
441
442
|
columnOffset: number;
|
|
442
443
|
/**
|
|
443
444
|
* Function that defines the key to use for each item given row and column index and value of {@link DisplayBaseProps.itemData}.
|
|
444
|
-
* @defaultValue
|
|
445
|
-
* ```ts
|
|
446
|
-
* (rowIndex, columnIndex, _data) => `${rowIndex}:${columnIndex}`
|
|
447
|
-
* ```
|
|
445
|
+
* @defaultValue `(rowIndex, columnIndex, _data) => '${rowIndex}:${columnIndex}'`
|
|
448
446
|
*/
|
|
449
447
|
itemKey?: (rowIndex: number, columnIndex: number, data: unknown) => React$1.Key;
|
|
450
448
|
}
|
|
@@ -478,6 +476,10 @@ interface VirtualGridProxy {
|
|
|
478
476
|
get clientWidth(): number;
|
|
479
477
|
/** Exposes DOM clientHeight property */
|
|
480
478
|
get clientHeight(): number;
|
|
479
|
+
/** Current vertical position of scroll bar */
|
|
480
|
+
get verticalOffset(): number;
|
|
481
|
+
/** Current horizontal position of scroll bar */
|
|
482
|
+
get horizontalOffset(): number;
|
|
481
483
|
}
|
|
482
484
|
/** Range to scroll to in one dimension specified as (offset,size). May be undefined if no need to scroll. */
|
|
483
485
|
type ScrollRange = [offset: number | undefined, size: number | undefined];
|
|
@@ -522,10 +524,7 @@ interface VirtualGridProps extends VirtualBaseProps {
|
|
|
522
524
|
columnOffsetMapping: ItemOffsetMapping;
|
|
523
525
|
/**
|
|
524
526
|
* Function that defines the key to use for each item given row and column index and value of {@link VirtualBaseProps.itemData}.
|
|
525
|
-
* @defaultValue
|
|
526
|
-
* ```ts
|
|
527
|
-
* (rowIndex, columnIndex, _data) => `${rowIndex}:${columnIndex}`
|
|
528
|
-
* ```
|
|
527
|
+
* @defaultValue `(rowIndex, columnIndex, _data) => '${rowIndex}:${columnIndex}'`
|
|
529
528
|
*/
|
|
530
529
|
itemKey?: (rowIndex: number, columnIndex: number, data: unknown) => React$1.Key;
|
|
531
530
|
/**
|
|
@@ -568,6 +567,8 @@ interface VirtualListProxy {
|
|
|
568
567
|
* @param option - Where to {@link ScrollToOption | position} the item within the viewport
|
|
569
568
|
*/
|
|
570
569
|
scrollToItem(index: number, option?: ScrollToOption): void;
|
|
570
|
+
/** Current scroll position */
|
|
571
|
+
get offset(): number;
|
|
571
572
|
}
|
|
572
573
|
/**
|
|
573
574
|
* Same logic as {@link VirtualListProxy.scrollToItem} usable with your own {@link VirtualScroll}
|
|
@@ -631,11 +632,12 @@ declare const VirtualList: React$1.ForwardRefExoticComponent<VirtualListProps &
|
|
|
631
632
|
declare function useFixedSizeItemOffsetMapping(itemSize: number): ItemOffsetMapping;
|
|
632
633
|
|
|
633
634
|
/**
|
|
634
|
-
* Returns an instance of {@link ItemOffsetMapping}
|
|
635
|
+
* Returns an instance of {@link ItemOffsetMapping}
|
|
636
|
+
* suitable for use when initial items have variable sizes.
|
|
635
637
|
*
|
|
636
638
|
* @param defaultItemSize - Size to use for all other items
|
|
637
639
|
* @param sizes - Array of sizes to use for the initial items, one size per item
|
|
638
640
|
*/
|
|
639
641
|
declare function useVariableSizeItemOffsetMapping(defaultItemSize: number, sizes?: number[]): ItemOffsetMapping;
|
|
640
642
|
|
|
641
|
-
export { AutoSizer, type AutoSizerProps, type AutoSizerRender, type AutoSizerRenderProps, type ComponentProps, type DisplayBaseItemProps, type DisplayBaseProps, DisplayGrid, type DisplayGridItem, type DisplayGridItemProps, type DisplayGridProps, DisplayList, type DisplayListItem, type DisplayListItemProps, type DisplayListProps, type
|
|
643
|
+
export { AutoSizer, type AutoSizerProps, type AutoSizerRender, type AutoSizerRenderProps, type ComponentProps, type DisplayBaseItemProps, type DisplayBaseProps, DisplayGrid, type DisplayGridItem, type DisplayGridItemProps, type DisplayGridProps, DisplayList, type DisplayListItem, type DisplayListItemProps, type DisplayListProps, type ScrollDirection, type ScrollEvent, type ScrollLayout, type ScrollRange, type ScrollState, type ScrollToOption, type VirtualBaseProps, VirtualContainer, type VirtualContainerComponentProps, type VirtualContainerRender, type VirtualContainerRenderProps, type VirtualContentProps, type VirtualContentRender, VirtualGrid, type VirtualGridProps, type VirtualGridProxy, VirtualList, type VirtualListProps, type VirtualListProxy, VirtualScroll, type VirtualScrollProps, type VirtualScrollProxy, type VirtualScrollableProps, getOffsetToScrollRange, getRangeToScroll, useFixedSizeItemOffsetMapping, useVariableSizeItemOffsetMapping, virtualGridScrollToItem, virtualListScrollToItem };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import React, { useState,
|
|
2
|
+
import React, { useState, useRef, createRef, useEffect, Fragment } from 'react';
|
|
3
|
+
import { FixedSizeItemOffsetMapping, VariableSizeItemOffsetMapping } from '@candidstartup/infinisheet-types';
|
|
3
4
|
|
|
4
5
|
const defaultContainerRender = ({ ...rest }, ref) => (jsx("div", { ref: ref, ...rest }));
|
|
5
6
|
/**
|
|
@@ -74,7 +75,8 @@ function AutoSizer(props) {
|
|
|
74
75
|
// I prefer simplicity of same behavior across all browsers.
|
|
75
76
|
const MAX_SUPPORTED_CSS_SIZE = 6000000;
|
|
76
77
|
const MIN_NUMBER_PAGES = 100;
|
|
77
|
-
|
|
78
|
+
/** Custom hook that implements logic for paged virtual scrolling in a single dimension */
|
|
79
|
+
function useVirtualScroll(totalSize, maxCssSize = MAX_SUPPORTED_CSS_SIZE, minNumberPages = MIN_NUMBER_PAGES, useTotalOffset = true) {
|
|
78
80
|
let renderSize = 0, pageSize = 0, numPages = 0;
|
|
79
81
|
if (totalSize < maxCssSize) {
|
|
80
82
|
// No paging needed
|
|
@@ -100,28 +102,30 @@ function useVirtualScroll(totalSize, maxCssSize = MAX_SUPPORTED_CSS_SIZE, minNum
|
|
|
100
102
|
page: 0,
|
|
101
103
|
scrollDirection: "forward",
|
|
102
104
|
};
|
|
103
|
-
const [
|
|
105
|
+
const [totalOffset, setTotalOffset] = useState(0);
|
|
106
|
+
const scrollState = useRef(initValue);
|
|
104
107
|
function onScroll(clientExtent, scrollExtent, scrollOffset) {
|
|
105
|
-
|
|
108
|
+
const currState = scrollState.current;
|
|
109
|
+
if (currState.scrollOffset == scrollOffset) {
|
|
106
110
|
// No need to change state if scroll position unchanged
|
|
107
|
-
return [scrollOffset,
|
|
111
|
+
return [scrollOffset, currState];
|
|
108
112
|
}
|
|
109
113
|
// Prevent Safari's elastic scrolling from causing visual shaking when scrolling past bounds.
|
|
110
114
|
let newOffset = Math.max(0, Math.min(scrollOffset, scrollExtent - clientExtent));
|
|
111
|
-
const newScrollDirection =
|
|
115
|
+
const newScrollDirection = currState.scrollOffset <= newOffset ? 'forward' : 'backward';
|
|
112
116
|
// Switch pages if needed
|
|
113
117
|
let newPage, newRenderOffset;
|
|
114
118
|
let retScrollOffset = scrollOffset;
|
|
115
|
-
const scrollDist = Math.abs(newOffset -
|
|
119
|
+
const scrollDist = Math.abs(newOffset - currState.scrollOffset);
|
|
116
120
|
if (scrollDist < clientExtent) {
|
|
117
121
|
// Scrolling part of visible window, don't want to skip items, so can't scale up movement
|
|
118
122
|
// If we cross page boundary we need to reset scroll bar position back to where it should be at start of page
|
|
119
|
-
newPage = Math.min(numPages - 1, Math.floor((scrollOffset +
|
|
123
|
+
newPage = Math.min(numPages - 1, Math.floor((scrollOffset + currState.renderOffset) / pageSize));
|
|
120
124
|
newRenderOffset = pageToRenderOffset(newPage);
|
|
121
|
-
if (newPage !=
|
|
125
|
+
if (newPage != currState.page) {
|
|
122
126
|
// Be very intentional about when we ask caller to reset scroll bar
|
|
123
127
|
// Don't want to trigger event loops
|
|
124
|
-
newOffset = scrollOffset +
|
|
128
|
+
newOffset = scrollOffset + currState.renderOffset - newRenderOffset;
|
|
125
129
|
retScrollOffset = newOffset;
|
|
126
130
|
}
|
|
127
131
|
}
|
|
@@ -141,19 +145,28 @@ function useVirtualScroll(totalSize, maxCssSize = MAX_SUPPORTED_CSS_SIZE, minNum
|
|
|
141
145
|
newRenderOffset = pageToRenderOffset(newPage);
|
|
142
146
|
}
|
|
143
147
|
const newScrollState = { scrollOffset: newOffset, renderOffset: newRenderOffset, page: newPage, scrollDirection: newScrollDirection };
|
|
144
|
-
|
|
148
|
+
scrollState.current = newScrollState;
|
|
149
|
+
if (useTotalOffset)
|
|
150
|
+
setTotalOffset(newOffset + newRenderOffset);
|
|
145
151
|
return [retScrollOffset, newScrollState];
|
|
146
152
|
}
|
|
147
153
|
function doScrollTo(offset, clientExtent) {
|
|
154
|
+
const currState = scrollState.current;
|
|
148
155
|
const safeOffset = Math.min(totalSize - clientExtent, Math.max(offset, 0));
|
|
149
|
-
const scrollDirection = (
|
|
156
|
+
const scrollDirection = (currState.scrollOffset + currState.renderOffset) <= safeOffset ? 'forward' : 'backward';
|
|
150
157
|
const page = Math.min(numPages - 1, Math.floor(safeOffset / pageSize));
|
|
151
158
|
const renderOffset = pageToRenderOffset(page);
|
|
152
159
|
const scrollOffset = safeOffset - renderOffset;
|
|
153
|
-
|
|
160
|
+
scrollState.current = { scrollOffset, renderOffset, page, scrollDirection };
|
|
161
|
+
if (useTotalOffset)
|
|
162
|
+
setTotalOffset(scrollOffset + renderOffset);
|
|
154
163
|
return scrollOffset;
|
|
155
164
|
}
|
|
156
|
-
|
|
165
|
+
function getCurrentOffset() {
|
|
166
|
+
const currState = scrollState.current;
|
|
167
|
+
return currState.scrollOffset + currState.renderOffset;
|
|
168
|
+
}
|
|
169
|
+
return { totalOffset, renderSize, onScroll, doScrollTo, getCurrentOffset, scrollState };
|
|
157
170
|
}
|
|
158
171
|
|
|
159
172
|
// Based on https://github.com/realwugang/use-event-listener
|
|
@@ -277,19 +290,17 @@ function getOffsetToScrollRange(offset, size, clientExtent, scrollOffset, option
|
|
|
277
290
|
* Customizable Virtual Scrolling Component
|
|
278
291
|
*
|
|
279
292
|
* Allows user to scroll over a virtual area `scrollHeight` x `scrollWidth` pixels.
|
|
280
|
-
* Use `onScroll` to track scroll state and
|
|
293
|
+
* Use `onScroll` to track scroll state and {@link VirtualContentRender} to render scroll state specific content into the viewport
|
|
281
294
|
*
|
|
282
295
|
* Accepts props defined by {@link VirtualScrollProps}.
|
|
283
296
|
* Refs are forwarded to {@link VirtualScrollProxy}.
|
|
284
297
|
* @group Components
|
|
285
298
|
*/
|
|
286
299
|
const VirtualScroll = React.forwardRef(function VirtualScroll(props, ref) {
|
|
287
|
-
const { width, height, scrollWidth = 0, scrollHeight = 0, className, innerClassName, children, onScroll: onScrollCallback, useIsScrolling: useIsScrolling$1 = false, innerRender, outerRender } = props;
|
|
300
|
+
const { width, height, scrollWidth = 0, scrollHeight = 0, className, innerClassName, children, onScroll: onScrollCallback, useIsScrolling: useIsScrolling$1 = false, useOffsets = true, innerRender, outerRender } = props;
|
|
288
301
|
const outerRef = React.useRef(null);
|
|
289
|
-
const {
|
|
290
|
-
const
|
|
291
|
-
const { scrollOffset: scrollColOffset, renderOffset: renderColOffset, renderSize: renderColumnSize, onScroll: onScrollColumn, doScrollTo: doScrollToColumn } = useVirtualScroll(scrollWidth, props.maxCssSize, props.minNumPages);
|
|
292
|
-
const currentHorizontalOffset = scrollColOffset + renderColOffset;
|
|
302
|
+
const { totalOffset: currentVerticalOffset, renderSize: renderRowSize, onScroll: onScrollRow, doScrollTo: doScrollToRow, getCurrentOffset: getVerticalOffset } = useVirtualScroll(scrollHeight, props.maxCssSize, props.minNumPages, useOffsets);
|
|
303
|
+
const { totalOffset: currentHorizontalOffset, renderSize: renderColumnSize, onScroll: onScrollColumn, doScrollTo: doScrollToColumn, getCurrentOffset: getHorizontalOffset } = useVirtualScroll(scrollWidth, props.maxCssSize, props.minNumPages, useOffsets);
|
|
293
304
|
const isActuallyScrolling = useIsScrolling(outerRef);
|
|
294
305
|
React.useImperativeHandle(ref, () => {
|
|
295
306
|
return {
|
|
@@ -321,9 +332,11 @@ const VirtualScroll = React.forwardRef(function VirtualScroll(props, ref) {
|
|
|
321
332
|
},
|
|
322
333
|
get clientHeight() {
|
|
323
334
|
return outerRef.current ? outerRef.current.clientHeight : /* istanbul ignore next */ 0;
|
|
324
|
-
}
|
|
335
|
+
},
|
|
336
|
+
get verticalOffset() { return getVerticalOffset(); },
|
|
337
|
+
get horizontalOffset() { return getHorizontalOffset(); }
|
|
325
338
|
};
|
|
326
|
-
}, [doScrollToRow, doScrollToColumn, currentVerticalOffset, currentHorizontalOffset]);
|
|
339
|
+
}, [doScrollToRow, doScrollToColumn, currentVerticalOffset, currentHorizontalOffset, getVerticalOffset, getHorizontalOffset]);
|
|
327
340
|
function onScroll(event) {
|
|
328
341
|
const { clientWidth, clientHeight, scrollWidth, scrollHeight, scrollLeft, scrollTop } = event.currentTarget;
|
|
329
342
|
const [newScrollTop, newRowScrollState] = onScrollRow(clientHeight, scrollHeight, scrollTop);
|
|
@@ -516,6 +529,12 @@ const VirtualGrid = React.forwardRef(function VirtualGrid(props, ref) {
|
|
|
516
529
|
},
|
|
517
530
|
get clientHeight() {
|
|
518
531
|
return scrollRef.current ? scrollRef.current.clientHeight : /* istanbul ignore next */ 0;
|
|
532
|
+
},
|
|
533
|
+
get verticalOffset() {
|
|
534
|
+
return scrollRef.current ? scrollRef.current.verticalOffset : /* istanbul ignore next */ 0;
|
|
535
|
+
},
|
|
536
|
+
get horizontalOffset() {
|
|
537
|
+
return scrollRef.current ? scrollRef.current.horizontalOffset : /* istanbul ignore next */ 0;
|
|
519
538
|
}
|
|
520
539
|
};
|
|
521
540
|
}, [rowOffsetMapping, columnOffsetMapping]);
|
|
@@ -576,6 +595,13 @@ const VirtualList = React.forwardRef(function VirtualList(props, ref) {
|
|
|
576
595
|
},
|
|
577
596
|
scrollToItem(index, option) {
|
|
578
597
|
virtualListScrollToItem(scrollRef, itemOffsetMapping, isVertical, index, option);
|
|
598
|
+
},
|
|
599
|
+
get offset() {
|
|
600
|
+
const scroll = scrollRef.current;
|
|
601
|
+
/* istanbul ignore if */
|
|
602
|
+
if (!scroll)
|
|
603
|
+
return 0;
|
|
604
|
+
return isVertical ? scroll.verticalOffset : scroll.horizontalOffset;
|
|
579
605
|
}
|
|
580
606
|
};
|
|
581
607
|
}, [itemOffsetMapping, isVertical]);
|
|
@@ -589,28 +615,6 @@ const VirtualList = React.forwardRef(function VirtualList(props, ref) {
|
|
|
589
615
|
}, children: ({ isScrolling, verticalOffset, horizontalOffset }) => (jsx(AutoSizer, { style: { height: '100%', width: '100%' }, children: ({ height, width }) => (jsx(DisplayList, { innerClassName: innerClassName, innerRender: innerRender, layout: layout, offset: isVertical ? verticalOffset : horizontalOffset, height: height, itemCount: itemCount, itemData: itemData, itemKey: itemKey, isScrolling: isScrolling, itemOffsetMapping: itemOffsetMapping, width: width, children: ChildVar })) })) }));
|
|
590
616
|
});
|
|
591
617
|
|
|
592
|
-
class FixedSizeItemOffsetMapping {
|
|
593
|
-
constructor(itemSize) {
|
|
594
|
-
Object.defineProperty(this, "fixedItemSize", {
|
|
595
|
-
enumerable: true,
|
|
596
|
-
configurable: true,
|
|
597
|
-
writable: true,
|
|
598
|
-
value: void 0
|
|
599
|
-
});
|
|
600
|
-
this.fixedItemSize = itemSize;
|
|
601
|
-
}
|
|
602
|
-
itemSize(_itemIndex) {
|
|
603
|
-
return this.fixedItemSize;
|
|
604
|
-
}
|
|
605
|
-
itemOffset(itemIndex) {
|
|
606
|
-
return itemIndex * this.fixedItemSize;
|
|
607
|
-
}
|
|
608
|
-
offsetToItem(offset) {
|
|
609
|
-
const itemIndex = Math.floor(offset / this.fixedItemSize);
|
|
610
|
-
const startOffset = itemIndex * this.fixedItemSize;
|
|
611
|
-
return [itemIndex, startOffset];
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
618
|
/**
|
|
615
619
|
* Returns an instance of {@link ItemOffsetMapping} suitable for use when all items have a fixed size.
|
|
616
620
|
*
|
|
@@ -620,58 +624,9 @@ function useFixedSizeItemOffsetMapping(itemSize) {
|
|
|
620
624
|
return new FixedSizeItemOffsetMapping(itemSize);
|
|
621
625
|
}
|
|
622
626
|
|
|
623
|
-
class VariableSizeItemOffsetMapping {
|
|
624
|
-
constructor(defaultItemSize, sizes) {
|
|
625
|
-
Object.defineProperty(this, "defaultItemSize", {
|
|
626
|
-
enumerable: true,
|
|
627
|
-
configurable: true,
|
|
628
|
-
writable: true,
|
|
629
|
-
value: void 0
|
|
630
|
-
});
|
|
631
|
-
Object.defineProperty(this, "sizes", {
|
|
632
|
-
enumerable: true,
|
|
633
|
-
configurable: true,
|
|
634
|
-
writable: true,
|
|
635
|
-
value: void 0
|
|
636
|
-
});
|
|
637
|
-
this.defaultItemSize = defaultItemSize;
|
|
638
|
-
this.sizes = sizes;
|
|
639
|
-
}
|
|
640
|
-
itemSize(itemIndex) {
|
|
641
|
-
return (itemIndex < this.sizes.length) ? this.sizes[itemIndex] : this.defaultItemSize;
|
|
642
|
-
}
|
|
643
|
-
itemOffset(itemIndex) {
|
|
644
|
-
let offset = 0;
|
|
645
|
-
let length = this.sizes.length;
|
|
646
|
-
if (itemIndex > length) {
|
|
647
|
-
const numDefaultSize = itemIndex - length;
|
|
648
|
-
offset = numDefaultSize * this.defaultItemSize;
|
|
649
|
-
}
|
|
650
|
-
else {
|
|
651
|
-
length = itemIndex;
|
|
652
|
-
}
|
|
653
|
-
for (let i = 0; i < length; i++) {
|
|
654
|
-
offset += this.sizes[i];
|
|
655
|
-
}
|
|
656
|
-
return offset;
|
|
657
|
-
}
|
|
658
|
-
offsetToItem(offset) {
|
|
659
|
-
let startOffset = 0;
|
|
660
|
-
const length = this.sizes.length;
|
|
661
|
-
for (let i = 0; i < length; i++) {
|
|
662
|
-
const size = this.sizes[i];
|
|
663
|
-
if (startOffset + size > offset) {
|
|
664
|
-
return [i, startOffset];
|
|
665
|
-
}
|
|
666
|
-
startOffset += size;
|
|
667
|
-
}
|
|
668
|
-
const itemIndex = Math.floor((offset - startOffset) / this.defaultItemSize);
|
|
669
|
-
startOffset += itemIndex * this.defaultItemSize;
|
|
670
|
-
return [itemIndex + length, startOffset];
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
627
|
/**
|
|
674
|
-
* Returns an instance of {@link ItemOffsetMapping}
|
|
628
|
+
* Returns an instance of {@link ItemOffsetMapping}
|
|
629
|
+
* suitable for use when initial items have variable sizes.
|
|
675
630
|
*
|
|
676
631
|
* @param defaultItemSize - Size to use for all other items
|
|
677
632
|
* @param sizes - Array of sizes to use for the initial items, one size per item
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/VirtualContainer.tsx","../src/AutoSizer.tsx","../src/useVirtualScroll.ts","../src/useEventListener.ts","../src/useAnimationTimeout.ts","../src/useIsScrolling.ts","../src/VirtualScrollProxy.ts","../src/VirtualScroll.tsx","../src/VirtualCommon.ts","../src/DisplayList.tsx","../src/DisplayGrid.tsx","../src/VirtualGridProxy.ts","../src/VirtualGrid.tsx","../src/VirtualListProxy.ts","../src/VirtualList.tsx","../src/useFixedSizeItemOffsetMapping.ts","../src/useVariableSizeItemOffsetMapping.ts"],"sourcesContent":["import React from \"react\";\n\n/**\n * Props that an implementation of {@link VirtualContainerRender} must accept.\n * \n * Includes all the props that a {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLDivElement | HTMLDivElement} would accept.\n */\nexport type VirtualContainerRenderProps = React.ComponentPropsWithoutRef<'div'>;\n\n/**\n * Render prop for a {@link VirtualContainer}\n *\n * Can be passed to {@link VirtualContainer} to replace default implementation. \n * Function must render a div and forward {@link VirtualContainerRenderProps}\n * and any `ref` to it. \n * \n * @example Minimal compliant implementation\n * ```\n * const containerRender: VirtualContainerRender = ({...rest}, ref) => (\n * <div ref={ref} {...rest} />\n * )\n * ```\n */\nexport type VirtualContainerRender = (props: VirtualContainerRenderProps, ref?: React.ForwardedRef<HTMLDivElement>) => JSX.Element;\n\n/**\n * Props that {@link VirtualContainer} accepts.\n */\nexport interface VirtualContainerComponentProps extends VirtualContainerRenderProps {\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link VirtualContainer}. */\n render?: VirtualContainerRender;\n}\n\nconst defaultContainerRender: VirtualContainerRender = ({...rest}, ref) => (\n <div ref={ref} {...rest} />\n)\n\n/**\n * Wrapper around a div used by other components in {@link @candidstartup/react-virtual-scroll!}. Most props are passed through to the div. Use the\n * {@link VirtualContainerComponentProps.render} prop to override the default behavior. \n * \n * @group Components\n */\nexport const VirtualContainer = React.forwardRef<HTMLDivElement, VirtualContainerComponentProps >(\n function VirtualContainer({render = defaultContainerRender, ...rest}, ref) {\n return render(rest, ref)\n})\n","import React from \"react\";\n\n/**\n * Props that an implementation of {@link AutoSizerRender} must accept.\n */\nexport interface AutoSizerRenderProps {\n /** Computed height */\n height: number,\n\n /** Computed width */\n width: number,\n}\n\n/**\n * Render prop for content in an {@link AutoSizer}\n *\n * Function renders content and forwards `width` and `height`\n * to whatever needs it.\n * \n * @example Simple implementation\n * ```\n * const autoSizeRender: AutoSizeRender = ({width, height}) => (\n * <VirtualList width={width} height={height} {...props} />\n * )\n * ```\n */\nexport type AutoSizerRender = (props: AutoSizerRenderProps) => JSX.Element;\n\n/**\n * Props accepted by {@link AutoSizer}\n */\nexport interface AutoSizerProps {\n /** Function implementing {@link AutoSizerRender} that renders the content that needs explicit sizing */\n children: AutoSizerRender\n\n /** The `className` applied to the container element */\n className?: string,\n\n /** Inline style to apply to the container element */\n style?: React.CSSProperties;\n}\n\n/**\n * HOC that calculates the size available to it and makes the computed size available to children.\n * The size available depends on DOM layout and style applied wherever the AutoSizer finds itself.\n * You will probably want to pass something appropriate via the `className` or `style` props.\n * \n * Accepts props defined by {@link AutoSizerProps}. \n * You must pass a single instance of {@link AutoSizerRender} as a child.\n * @group Components\n */\nexport function AutoSizer(props: AutoSizerProps) {\n const { children, className, style } = props;\n\n // Using separate primitive states rather than one composite so that React\n // can detect duplicates values and bail out of redundant renders.\n const [width, setWidth] = React.useState<number>(0);\n const [height, setHeight] = React.useState<number>(0);\n const ref = React.useRef<HTMLDivElement>(null);\n\n // Make sure resize callback is a stable value so we're not constantly\n // creating and disconnecting resize observers.\n const resizeCallback: ResizeObserverCallback = React.useCallback((entries) => {\n entries.forEach(entry => {\n // Context box sizes can contain fractional values while clientWidth\n // and clientHeight properties are always rounded to nearest integer.\n // Always use integer values to avoid confusion.\n const newWidth = Math.round(entry.contentBoxSize[0].inlineSize);\n setWidth(newWidth);\n const newHeight = Math.round(entry.borderBoxSize[0].blockSize);\n setHeight(newHeight);\n })\n }, []);\n\n // Expect effect to run only on initial mount\n React.useLayoutEffect(() => {\n const div = ref.current;\n /* istanbul ignore if*/\n if (!div)\n return;\n\n // Size on initial mount\n setHeight(div.clientHeight);\n setWidth(div.clientWidth);\n\n // Updates size on any subsequent resize. Only available in browser\n // environment so avoid crashing out when server side rendering, or\n // running unit test without ResizeObserver being mocked. \n if (typeof ResizeObserver !== 'undefined') {\n const resizeObserver = new ResizeObserver(resizeCallback);\n resizeObserver.observe(div);\n return () => { resizeObserver.disconnect() }\n }\n }, [resizeCallback])\n\n // No point rendering children until we've measured size and found a usable area\n const renderChildren = height > 0 && width > 0;\n\n // Ensure that size is driven only by parent. Wrapping child in a zero sized inner div\n // which it can overflow stops child's size having any impact on size of outer div. \n // Otherwise can end up in infinite loop if child makes itself bigger than the \n // actual width and height we pass to it. That could be because child has \n // padding/borders/margins or because child renders itself bigger than size it's given.\n return (\n <div ref={ref} className={className} style={style}>\n <div style={{ overflow: 'visible', width: 0, height: 0 }}>\n {renderChildren && children({height, width})}\n </div>\n </div>\n );\n}\n\nexport default AutoSizer;\n","import { useState } from \"react\";\n\n/** Direction of scrolling */\nexport type ScrollDirection = \"forward\" | \"backward\";\n\n/**\n * Overall scroll state for a single dimension.\n */\nexport interface ScrollState { \n /** Scroll bar offset. Equal to outer container's `scrollTop` or `scrollLeft` depending on dimension. */\n scrollOffset: number, \n\n /** Offset used to position current page of items in virtual space. Overall offset is `scrollOffset+renderOffset`. */\n renderOffset: number,\n\n /** Index of current page. */\n page: number, \n\n /** Current scrolling direction. Calculated by comparing current overall offset to that when last rendered. */\n scrollDirection: ScrollDirection, \n}\n\nexport interface VirtualScrollState extends ScrollState {\n renderSize: number;\n\n // Returns updated scrollOffset. Caller should update scroll bar position if different from value passed in. \n onScroll(clientExtent: number, scrollExtent: number, scrollOffset: number): [number, ScrollState];\n\n // Scroll to offset in logical space returning offset to update scroll bar position to\n doScrollTo(offset: number, clientExtent: number): number;\n}\n\n// Max size that is safe across all browsers (Firefox is the limiting factor)\n// SlickGrid tries to dynamically determine limit on other browsers (Chrome will do 30M) but\n// I prefer simplicity of same behavior across all browsers.\nconst MAX_SUPPORTED_CSS_SIZE = 6000000;\nconst MIN_NUMBER_PAGES = 100;\n\nexport function useVirtualScroll(totalSize: number, maxCssSize = MAX_SUPPORTED_CSS_SIZE, minNumberPages = MIN_NUMBER_PAGES): VirtualScrollState {\n let renderSize=0, pageSize=0, numPages=0;\n if (totalSize < maxCssSize) {\n // No paging needed\n renderSize = pageSize = totalSize;\n numPages = 1;\n } else {\n // Break into pages\n renderSize = maxCssSize;\n pageSize = renderSize / minNumberPages;\n numPages = Math.floor(totalSize / pageSize);\n }\n\n function pageToRenderOffset(page: number): number {\n if (page <= 0)\n return 0;\n\n if (page >= numPages-1)\n return totalSize - renderSize;\n\n return Math.round((page-1) * (totalSize - renderSize) / (numPages - 3));\n }\n\n const initValue: ScrollState = { \n scrollOffset: 0, \n renderOffset: 0,\n page: 0,\n scrollDirection: \"forward\",\n };\n const [scrollState, setScrollState] = useState(initValue);\n\n function onScroll(clientExtent: number, scrollExtent: number, scrollOffset: number): [number, ScrollState] {\n if (scrollState.scrollOffset == scrollOffset) {\n // No need to change state if scroll position unchanged\n return [scrollOffset, scrollState];\n }\n\n // Prevent Safari's elastic scrolling from causing visual shaking when scrolling past bounds.\n let newOffset = Math.max(0, Math.min(scrollOffset, scrollExtent - clientExtent));\n const newScrollDirection = scrollState.scrollOffset <= newOffset ? 'forward' : 'backward';\n\n // Switch pages if needed\n let newPage, newRenderOffset;\n let retScrollOffset = scrollOffset;\n const scrollDist = Math.abs(newOffset - scrollState.scrollOffset);\n if (scrollDist < clientExtent) {\n // Scrolling part of visible window, don't want to skip items, so can't scale up movement\n // If we cross page boundary we need to reset scroll bar position back to where it should be at start of page\n newPage = Math.min(numPages - 1, Math.floor((scrollOffset + scrollState.renderOffset) / pageSize));\n newRenderOffset = pageToRenderOffset(newPage);\n if (newPage != scrollState.page) {\n // Be very intentional about when we ask caller to reset scroll bar\n // Don't want to trigger event loops\n newOffset = scrollOffset + scrollState.renderOffset - newRenderOffset;\n retScrollOffset = newOffset;\n }\n } else {\n // Large scale scrolling, choosing page from a rolodex\n // First and last page are mapped 1:1 between grid and container\n if (newOffset < pageSize) {\n newPage = 0;\n } else if (newOffset >= renderSize - pageSize) {\n newPage = numPages - 1;\n } else {\n const scaleFactor = (totalSize - pageSize*2) / (renderSize - pageSize*2);\n newPage = Math.min(numPages - 3, Math.floor((newOffset - pageSize) * scaleFactor / pageSize)) + 1;\n }\n newRenderOffset = pageToRenderOffset(newPage);\n }\n\n const newScrollState: ScrollState = \n { scrollOffset: newOffset, renderOffset: newRenderOffset, page: newPage, scrollDirection: newScrollDirection };\n setScrollState(newScrollState);\n return [retScrollOffset, newScrollState];\n }\n\n function doScrollTo(offset: number, clientExtent: number) {\n const safeOffset = Math.min(totalSize - clientExtent, Math.max(offset, 0));\n const scrollDirection = (scrollState.scrollOffset + scrollState.renderOffset) <= safeOffset ? 'forward' : 'backward';\n const page = Math.min(numPages - 1, Math.floor(safeOffset / pageSize));\n const renderOffset = pageToRenderOffset(page);\n const scrollOffset = safeOffset - renderOffset;\n\n setScrollState({ scrollOffset, renderOffset, page, scrollDirection });\n return scrollOffset;\n }\n\n return {...scrollState, renderSize, onScroll, doScrollTo} as const;\n}\n\nexport default useVirtualScroll;\n","// Based on https://github.com/realwugang/use-event-listener\n// and https://github.com/donavon/use-event-listener/blob/develop/src/index.js\n\nimport { useRef, useEffect, RefObject, createRef } from 'react';\n\ninterface Options {\n capture?: boolean\n once?: boolean\n passive?: boolean\n}\n\ntype Listener = Window | Document | HTMLElement;\n\nfunction isListener(element: Listener | RefObject<HTMLElement>): element is Listener {\n return (element as Listener).addEventListener !== undefined;\n}\n\ntype EventHandler = (event: Event) => void;\n\nexport function useEventListener (eventName: string, \n handler: EventHandler, \n element: Listener | RefObject<HTMLElement> | null = window, \n options: Options = {}) {\n const savedHandler = useRef<EventHandler>();\n const { capture, passive, once } = options;\n\n useEffect(() => {\n savedHandler.current = handler\n }, [handler])\n\n useEffect(() => {\n if (!element)\n return;\n\n const el = isListener(element) ? element : element.current;\n if (!el)\n return;\n\n const eventListener = (event: Event) => savedHandler.current?.(event);\n const opts = { capture, passive, once };\n el.addEventListener(eventName, eventListener, opts);\n return () => {\n el.removeEventListener(eventName, eventListener, opts);\n };\n }, [eventName, element, capture, passive, once]);\n}\n\nexport default useEventListener;\n\n// In-source testing for private helper functions\nif (import.meta.vitest) {\n const { it, expect } = import.meta.vitest\n it('isListener', () => {\n expect(isListener(window)).toBe(true)\n expect(isListener(document)).toBe(true)\n expect(isListener(document.createElement(\"div\"))).toBe(true)\n expect(isListener(createRef())).toBe(false)\n })\n}","// Based on https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n// and https://www.joshwcomeau.com/snippets/react-hooks/use-timeout/\n// and https://github.com/bvaughn/react-window/blob/master/src/timer.js\n//\n// Equivalent functionality to a useTimeout hook but based on requestAnimationFrame instead of setTimeout. Use\n// when making frequent requests for short duration timeouts where browser may throttle setTimeout.\nimport { useEffect, useRef } from 'react';\n\ntype Callback = () => void;\n\nexport function useAnimationTimeout(callback: Callback, delay: number | null, key?: unknown) {\n const requestRef = useRef<number>();\n const savedCallback = useRef<Callback>(callback);\n\n // Remember the latest callback\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n \n const start = performance.now();\n \n useEffect(() => {\n function tick() {\n requestRef.current = undefined;\n if (delay === null)\n return;\n\n if (performance.now() - start >= delay) {\n savedCallback.current();\n } else {\n requestRef.current = requestAnimationFrame(tick);\n }\n }\n\n tick();\n\n return () => {\n if (typeof requestRef.current === 'number') {\n cancelAnimationFrame(requestRef.current);\n requestRef.current = undefined;\n }\n }\n }, [start, delay, key]);\n}\n\nexport default useAnimationTimeout;","import { useState, RefObject } from \"react\";\nimport { useEventListener } from './useEventListener';\nimport { useAnimationTimeout } from './useAnimationTimeout';\n\nconst DEBOUNCE_INTERVAL = 150;\nconst FALLBACK_INTERVAL = 500;\n\nexport function useIsScrolling(element: Window | HTMLElement | RefObject<HTMLElement> | null = window): boolean {\n const [scrollCount, setScrollCount] = useState(0);\n\n // scrollend implementations in both Chrome and Firefox are buggy with missing scrollend events\n // in some circumstances (using keyboard to scroll past end in Chrome, intermittently when using mouse wheel in Firefox)\n // Use a timeout even when scrollend is supported to handle missing events. In this case we use a longer interval as\n // don't want it to be over sensitive. \n const supportsScrollEnd = ('onscrollend' in window);\n const delay = supportsScrollEnd ? FALLBACK_INTERVAL : DEBOUNCE_INTERVAL;\n\n useEventListener(\"scroll\", () => setScrollCount(c => c + 1), element);\n useEventListener(\"scrollend\", () => setScrollCount(0), supportsScrollEnd ? element : null);\n useAnimationTimeout(() => setScrollCount(0), (scrollCount == 0) ? null : delay, scrollCount);\n\n return scrollCount > 0;\n}\n\nexport default useIsScrolling;","import { ScrollToOption } from './VirtualBase';\n\n/**\n * Custom ref handle returned by {@link VirtualScroll} that exposes imperative methods\n * \n * Use `React.useRef<VirtualScrollProxy>(null)` to create a ref.\n */\nexport interface VirtualScrollProxy {\n /**\n * Scrolls to the specified vertical and horizontal offset in pixels\n * Either offset can be left undefined to scroll in one dimension only\n * @param verticalOffset - Offset to scroll to vertically\n * @param horizontalOffset - Offset to scroll to horizontally\n */\n scrollTo(verticalOffset?: number, horizontalOffset?: number): void;\n\n /**\n * Scrolls to the specified area\n * Either offset/size pair can be left undefined to scroll in one dimension only\n * @param verticalOffset - Offset to scroll to vertically\n * @param verticalSize - Size of target area vertically\n * @param horizontalOffset - Offset to scroll to horizontally\n * @param horizontalSize - Size of target area horizontally\n * @param option - Where to {@link ScrollToOption | position} the area within the viewport\n */\n scrollToArea(verticalOffset?: number, verticalSize?: number, horizontalOffset?: number, horizontalSize?: number, option?: ScrollToOption): void;\n\n /** Exposes DOM clientWidth property */\n get clientWidth(): number;\n\n /** Exposes DOM clientHeight property */\n get clientHeight(): number;\n}\n\n/**\n * Returns the offset needed to scroll in one dimension for a specified range\n * \n * Used internally to implement {@link VirtualScrollProxy.scrollToArea}. Can be used directly for \n * advanced customization scenarios.\n */\nexport function getOffsetToScrollRange(offset: number | undefined, size: number | undefined, \n clientExtent: number, scrollOffset: number, option?: ScrollToOption): number | undefined\n{\n if (offset === undefined)\n return undefined;\n\n if (option != 'visible')\n return offset;\n\n // Start of item offscreen before start of viewport?\n if (offset < scrollOffset)\n return offset;\n\n size = size || 0;\n\n // Already completely visible?\n const endOffset = offset + size;\n const endViewport = scrollOffset + clientExtent;\n if (endOffset <= endViewport)\n return undefined;\n\n // Item offscreen past end of viewport\n\n // Item bigger than viewport? Make sure start is in view\n if (size > clientExtent)\n return offset;\n\n // Scroll so end of item aligns with end of viewport\n return offset - clientExtent + size;\n }\n","import React from \"react\";\nimport { VirtualContainer, VirtualContainerRender } from './VirtualContainer';\nimport { VirtualScrollableProps, ScrollEvent, ScrollToOption } from './VirtualBase';\nimport { useVirtualScroll, ScrollState } from './useVirtualScroll';\nimport { useIsScrolling as useIsScrollingHook} from './useIsScrolling';\nimport { getOffsetToScrollRange, VirtualScrollProxy } from './VirtualScrollProxy';\n\n/**\n * Props that an implementation of {@link VirtualContentRender} must accept.\n */\nexport interface VirtualContentProps {\n /** \n * Is the owning component being actively scrolled? Used to change how the content is rendered depending on scroll state.\n * \n * Only defined if {@link VirtualScrollableProps.useIsScrolling} is true. \n * */\n isScrolling?: boolean,\n\n /** Current scroll position vertical offset */\n verticalOffset: number,\n\n /** Current scroll position horizontal offset */\n horizontalOffset: number\n}\n\n/**\n * Render prop for content container in {@link VirtualScroll}\n *\n * Pass to {@link VirtualScroll} to render content into the viewport\n * implementation. Function must render a div and forward {@link VirtualContentProps}\n * and any `ref` to it. \n * \n * @example Minimal compliant implementation\n * ```\n * const contentRender: VirtualContentRender = ({isScrolling, ...rest}, ref) => (\n * <div ref={ref} {...rest} />\n * )\n * ```\n */\nexport type VirtualContentRender = (props: VirtualContentProps, ref?: React.ForwardedRef<HTMLDivElement>) => JSX.Element;\n\n/**\n * Props accepted by {@link VirtualScroll}\n */\nexport interface VirtualScrollProps extends VirtualScrollableProps {\n /** Function implementing {@link VirtualContentRender} that renders the content that needs to respond to scrolling */\n children: VirtualContentRender\n\n /** \n * Height of area to scroll over \n * \n * @defaultValue 0\n */\n scrollHeight?: number,\n\n /** \n * Width of area to scroll over \n * \n * @defaultValue 0\n */\n scrollWidth?: number,\n\n /**\n * Callback after a scroll event has been processed and state updated but before rendering\n * @param verticalOffset - Resulting overall vertical offset. \n * @param horizontalOffset - Resulting overall horizontal offset.\n * @param newVerticalScrollState - New vertical {@link ScrollState} that will be used for rendering.\n * @param newHorizontalScrollState - New horizontal {@link ScrollState} that will be used for rendering.\n */\n onScroll?: (verticalOffset: number, horizontalOffset: number, newVerticalScrollState: ScrollState, newHorizontalScrollState: ScrollState) => void;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link VirtualScroll} outer container. */\n outerRender?: VirtualContainerRender;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link VirtualScroll} inner container. */\n innerRender?: VirtualContainerRender;\n}\n\n// Using a named function rather than => so that the name shows up in React Developer Tools\n/**\n * Customizable Virtual Scrolling Component\n * \n * Allows user to scroll over a virtual area `scrollHeight` x `scrollWidth` pixels. \n * Use `onScroll` to track scroll state and `innerRender` to render scroll state specific content into the viewport\n * \n * Accepts props defined by {@link VirtualScrollProps}. \n * Refs are forwarded to {@link VirtualScrollProxy}. \n * @group Components\n */\nexport const VirtualScroll = React.forwardRef<VirtualScrollProxy, VirtualScrollProps>(function VirtualScroll(props, ref) {\n const { width, height, scrollWidth = 0, scrollHeight = 0, className, innerClassName, children,\n onScroll: onScrollCallback, useIsScrolling = false, innerRender, outerRender } = props;\n\n const outerRef = React.useRef<HTMLDivElement>(null);\n const { scrollOffset: scrollRowOffset, renderOffset: renderRowOffset, renderSize: renderRowSize,\n onScroll: onScrollRow, doScrollTo: doScrollToRow } = useVirtualScroll(scrollHeight, props.maxCssSize, props.minNumPages);\n const currentVerticalOffset = scrollRowOffset + renderRowOffset;\n const { scrollOffset: scrollColOffset, renderOffset: renderColOffset, renderSize: renderColumnSize,\n onScroll: onScrollColumn, doScrollTo: doScrollToColumn} = useVirtualScroll(scrollWidth, props.maxCssSize, props.minNumPages);\n const currentHorizontalOffset = scrollColOffset + renderColOffset;\n const isActuallyScrolling = useIsScrollingHook(outerRef);\n\n React.useImperativeHandle(ref, () => {\n return {\n scrollTo(rowOffset?: number, columnOffset?: number): void {\n if (rowOffset === undefined && columnOffset === undefined)\n return;\n\n const outer = outerRef.current;\n /* istanbul ignore else */\n if (outer) {\n const options: ScrollToOptions = {};\n if (rowOffset != undefined)\n options.top = doScrollToRow(rowOffset, outer.clientHeight);\n if (columnOffset != undefined)\n options.left = doScrollToColumn(columnOffset, outer.clientWidth);\n outer.scrollTo(options);\n }\n },\n\n scrollToArea(verticalOffset?: number, verticalSize?: number, horizontalOffset?: number, horizontalSize?: number, option?: ScrollToOption) {\n const outer = outerRef.current;\n /* istanbul ignore if*/\n if (!outer)\n return;\n\n const rowOffset = getOffsetToScrollRange(verticalOffset, verticalSize, outer.clientHeight, currentVerticalOffset, option);\n const colOffset = getOffsetToScrollRange(horizontalOffset, horizontalSize, outer.clientWidth, currentHorizontalOffset, option);\n this.scrollTo(rowOffset, colOffset);\n },\n\n get clientWidth(): number {\n return outerRef.current ? outerRef.current.clientWidth : /* istanbul ignore next */ 0;\n },\n\n get clientHeight(): number {\n return outerRef.current ? outerRef.current.clientHeight : /* istanbul ignore next */ 0;\n }\n }\n }, [ doScrollToRow, doScrollToColumn, currentVerticalOffset, currentHorizontalOffset ]);\n\n function onScroll(event: ScrollEvent) {\n const { clientWidth, clientHeight, scrollWidth, scrollHeight, scrollLeft, scrollTop } = event.currentTarget;\n const [newScrollTop, newRowScrollState] = onScrollRow(clientHeight, scrollHeight, scrollTop);\n const [newScrollLeft, newColumnScrollState] = onScrollColumn(clientWidth, scrollWidth, scrollLeft);\n if (outerRef.current && (newScrollTop != scrollTop || newScrollLeft != scrollLeft ))\n outerRef.current.scrollTo(newScrollLeft, newScrollTop);\n onScrollCallback?.(newRowScrollState.scrollOffset+newRowScrollState.renderOffset, \n newColumnScrollState.scrollOffset+newColumnScrollState.renderOffset, newRowScrollState, newColumnScrollState);\n }\n\n const isScrolling = useIsScrolling ? isActuallyScrolling : undefined;\n const verticalOffset = currentVerticalOffset;\n const horizontalOffset = currentHorizontalOffset;\n\n return (\n <VirtualContainer className={className} render={outerRender} onScroll={onScroll} ref={outerRef} \n style={{ position: \"relative\", height, width, overflow: \"auto\", willChange: \"transform\" }}>\n <VirtualContainer className={innerClassName} render={innerRender} \n style={{ zIndex: 1, position: 'sticky', top: 0, left: 0, width: '100%', height: '100%' }}>\n {children({isScrolling, verticalOffset, horizontalOffset})}\n </VirtualContainer>\n <div style={{ position: 'absolute', top: 0, left: 0, \n height: scrollHeight ? renderRowSize : '100%', \n width: scrollWidth ? renderColumnSize : '100%'}}/>\n </VirtualContainer>\n );\n});\n\nexport default VirtualScroll;\n","import type { ItemOffsetMapping } from \"./VirtualBase\";\n\ntype RangeToRender = [\n startIndex: number,\n startOffset: number,\n totalSize: number,\n sizes: number[]\n];\n\nexport function getRangeToRender(itemCount: number, itemOffsetMapping: ItemOffsetMapping, clientExtent: number, scrollOffset: number): RangeToRender {\n if (itemCount == 0) {\n return [0, 0, 0, []];\n }\n\n // Negative offset equivalent to reducing the size of the window (possibly down to nothing)\n if (scrollOffset < 0) {\n clientExtent += scrollOffset;\n scrollOffset = 0;\n }\n\n if (clientExtent <= 0) {\n return [0, 0, 0, []];\n }\n\n const [baseIndex, startOffset] = itemOffsetMapping.offsetToItem(scrollOffset);\n if (baseIndex >= itemCount) {\n return [0, 0, 0, []];\n }\n\n let itemIndex = Math.max(0, Math.min(itemCount - 1, baseIndex));\n const endOffset = scrollOffset + clientExtent;\n\n const startIndex = itemIndex;\n let offset = startOffset;\n const sizes: number[] = [];\n let totalSize = 0;\n\n while (offset < endOffset && itemIndex < itemCount) {\n const size = itemOffsetMapping.itemSize(itemIndex);\n sizes.push(size);\n totalSize += size;\n offset += size;\n itemIndex ++;\n }\n\n return [startIndex, startOffset, totalSize, sizes];\n}\n\nfunction formatRepeat(repeat: number, size: number): string {\n return (repeat == 1) ? `${size}px` : `repeat(${repeat},${size}px)`;\n}\n\nfunction join(a: string|undefined, s: string) {\n return a ? a + ' ' + s : s;\n}\n\nexport function getGridTemplate(sizes: number[]): string | undefined {\n const count = sizes.length;\n if (count == 0)\n return undefined;\n\n let ret = undefined;\n let lastSize = sizes[0];\n let repeat = 1;\n\n for (let i = 1; i < count; i ++) {\n const size = sizes[i];\n if (size == lastSize) {\n repeat ++;\n } else {\n const s = formatRepeat(repeat, lastSize);\n ret = join(ret,s);\n lastSize = size;\n repeat = 1;\n }\n }\n\n const s = formatRepeat(repeat, lastSize);\n return join(ret,s);\n}\n\n\n","import React from \"react\";\nimport { ItemOffsetMapping, ScrollLayout, DisplayBaseItemProps, DisplayBaseProps } from './VirtualBase';\nimport { getRangeToRender, getGridTemplate } from './VirtualCommon';\nimport { VirtualContainer } from './VirtualContainer';\n\n/**\n * Props accepted by {@link DisplayListItem}\n */\nexport interface DisplayListItemProps extends DisplayBaseItemProps {\n /** Index of item in the list being rendered */\n index: number,\n}\n\n/**\n * Type of item in a {@link DisplayList}\n *\n * Must be passed as a child to {@link DisplayList}. \n * Accepts props defined by {@link DisplayListItemProps}.\n * Component must pass {@link DisplayBaseItemProps.style} to whatever it renders. \n * \n * @example Basic implementation\n * ```\n * const Row = ({ index, style }: { index: number, style: React.CSSProperties }) => (\n * <div className=\"row\" style={style}>\n * { index }\n * </div>\n * );\n * ```\n */\nexport type DisplayListItem = React.ComponentType<DisplayListItemProps>;\n\n/**\n * Props accepted by {@link DisplayList}\n */\nexport interface DisplayListProps extends DisplayBaseProps {\n /** Component used as a template to render items in the list. Must implement {@link DisplayListItem} interface. */\n children: DisplayListItem,\n\n /** Number of items in the list */\n itemCount: number,\n\n /** Offset to start of displayed content */\n offset: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each item in the list\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n itemOffsetMapping: ItemOffsetMapping,\n\n /**\n * Function that defines the key to use for each item given item index and value of {@link DisplayBaseProps.itemData}.\n * @defaultValue `(index, _data) => index`\n */\n itemKey?: (index: number, data: unknown) => React.Key,\n\n /**\n * Choice of 'vertical' or 'horizontal' layouts\n * @defaultValue 'vertical'\n */\n layout?: ScrollLayout,\n}\n\nconst defaultItemKey = (index: number, _data: unknown) => index;\n\nconst boxStyle: React.CSSProperties = { boxSizing: 'border-box' };\n\n/**\n * Displays a window onto the contents of a virtualized list starting from `offset`.\n * \n * Accepts props defined by {@link DisplayListProps}. \n * You must pass a single instance of {@link DisplayListItem} as a child.\n * @group Components\n */\nexport function DisplayList(props: DisplayListProps) {\n const { width, height, itemCount, itemOffsetMapping, className, innerClassName, offset: renderOffset, children,\n itemData, itemKey = defaultItemKey, layout = 'vertical', outerRender, innerRender, isScrolling } = props;\n\n const isVertical = layout === 'vertical';\n\n const [startIndex, startOffset, renderSize, sizes] = getRangeToRender(itemCount, itemOffsetMapping, \n isVertical ? height : width, renderOffset);\n const template = getGridTemplate(sizes);\n const offset = startOffset - renderOffset;\n\n // We can decide the JSX child type at runtime as long as we use a variable that uses the same capitalized\n // naming convention as components do.\n const ChildVar = children;\n\n return (\n <VirtualContainer className={className} render={outerRender}\n style={{ position: \"relative\", height, width, overflow: \"hidden\", willChange: \"transform\" }}>\n <VirtualContainer className={innerClassName} render={innerRender}\n style={{ position: 'absolute',\n display: 'grid',\n gridTemplateColumns: isVertical ? undefined : template,\n gridTemplateRows: isVertical ? template : undefined,\n top: isVertical ? offset : 0, \n left: isVertical ? 0 : offset, \n height: isVertical ? renderSize : \"100%\", \n width: isVertical ? \"100%\" : renderSize }}>\n {sizes.map((_size, arrayIndex) => (\n <ChildVar data={itemData} isScrolling={isScrolling} \n key={itemKey(startIndex + arrayIndex, itemData)} index={startIndex + arrayIndex} style={boxStyle}/>\n ))}\n </VirtualContainer>\n </VirtualContainer>\n );\n}\n\nexport default DisplayList;\n","import React, { Fragment } from \"react\";\nimport { ItemOffsetMapping, DisplayBaseItemProps, DisplayBaseProps } from './VirtualBase';\nimport { getRangeToRender, getGridTemplate } from './VirtualCommon';\nimport { VirtualContainer } from './VirtualContainer';\n\n/**\n * Props accepted by {@link DisplayGridItem}\n */\nexport interface DisplayGridItemProps extends DisplayBaseItemProps {\n /** Row index of item in the grid being rendered */\n rowIndex: number,\n\n /** Column index of item in the grid being rendered */\n columnIndex: number,\n}\n\n/**\n * Type of item in a {@link DisplayGrid}\n *\n * Must be passed as a child to {@link DisplayGrid}. \n * Accepts props defined by {@link DisplayGridItemProps}.\n * Component must pass {@link DisplayBaseItemProps.style} to whatever it renders. \n * \n * @example Basic implementation\n * ```\n * const Row = ({ index, style }: { index: number, style: React.CSSProperties }) => (\n * <div className=\"row\" style={style}>\n * { index }\n * </div>\n * );\n * ```\n */\nexport type DisplayGridItem = React.ComponentType<DisplayGridItemProps>;\n\n/**\n * Props accepted by {@link DisplayGrid}\n */\nexport interface DisplayGridProps extends DisplayBaseProps {\n /** Component used as a template to render items in the list. Must implement {@link DisplayGridItem} interface. */\n children: DisplayGridItem,\n\n /** Number of rows in the grid */\n rowCount: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each row in the grid\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n rowOffsetMapping: ItemOffsetMapping,\n\n /** Number of columns in the grid */\n columnCount: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each column in the grid\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n columnOffsetMapping: ItemOffsetMapping,\n\n /** Vertical offset to start of displayed content */\n rowOffset: number,\n\n /** Horizontal offset to start of displayed content */\n columnOffset: number,\n\n /**\n * Function that defines the key to use for each item given row and column index and value of {@link DisplayBaseProps.itemData}.\n * @defaultValue\n * ```ts\n * (rowIndex, columnIndex, _data) => `${rowIndex}:${columnIndex}`\n * ```\n */\n itemKey?: (rowIndex: number, columnIndex: number, data: unknown) => React.Key,\n}\n\nconst defaultItemKey = (rowIndex: number, columnIndex: number, _data: unknown) => `${rowIndex}:${columnIndex}`;\n\nconst boxStyle: React.CSSProperties = { boxSizing: 'border-box' };\n\n/**\n * Displays a window onto the contents of a virtualized grid starting from `rowOffset`, `columnOffset`.\n * \n * Accepts props defined by {@link DisplayGridProps}. \n * You must pass a single instance of {@link DisplayGridItem} as a child.\n * @group Components\n */\nexport function DisplayGrid(props: DisplayGridProps) {\n const { width, height, rowCount, rowOffsetMapping, columnCount, columnOffsetMapping, className, innerClassName, \n rowOffset: rowRenderOffset, columnOffset: colRenderOffset, children,\n itemData, itemKey = defaultItemKey, outerRender, innerRender, isScrolling } = props;\n\n const [rowStartIndex, rowStartOffset, rowRenderSize, rowSizes] = getRangeToRender(rowCount, rowOffsetMapping, height, rowRenderOffset);\n const rowTemplate = getGridTemplate(rowSizes);\n\n const [colStartIndex, colStartOffset, colRenderSize, colSizes] = getRangeToRender(columnCount, columnOffsetMapping, width, colRenderOffset);\n const colTemplate = getGridTemplate(colSizes);\n\n const rowOffset = rowStartOffset - rowRenderOffset;\n const colOffset = colStartOffset - colRenderOffset;\n\n // We can decide the JSX child type at runtime as long as we use a variable that uses the same capitalized\n // naming convention as components do.\n const ChildVar = children;\n\n return (\n <VirtualContainer className={className} render={outerRender}\n style={{ position: \"relative\", height, width, overflow: \"hidden\", willChange: \"transform\" }}>\n <VirtualContainer className={innerClassName} render={innerRender}\n style={{ position: 'absolute',\n display: 'grid',\n gridTemplateColumns: colTemplate,\n gridTemplateRows: rowTemplate,\n top: rowOffset, \n left: colOffset, \n height: rowRenderSize, \n width: colRenderSize }}>\n {rowSizes.map((_rowSize, rowIndex) => (\n <Fragment key={itemKey(rowStartIndex + rowIndex, 0, itemData)}>\n {colSizes.map((_size, colIndex) => (\n <ChildVar data={itemData} isScrolling={isScrolling} \n key={itemKey(rowStartIndex + rowIndex, colStartIndex + colIndex, itemData)} \n rowIndex={rowStartIndex + rowIndex} columnIndex={colStartIndex + colIndex} style={boxStyle}/>\n ))}\n </Fragment>\n ))}\n </VirtualContainer>\n </VirtualContainer>\n );\n}\n\nexport default DisplayGrid;\n","import { ItemOffsetMapping, ScrollToOption } from './VirtualBase';\nimport { VirtualScrollProxy } from './VirtualScrollProxy';\n\n/**\n * Custom ref handle returned by {@link VirtualGrid} that exposes imperative methods\n * \n * Use `React.useRef<VirtualGridProxy>(null)` to create a ref.\n */\nexport interface VirtualGridProxy {\n /**\n * Scrolls the list to the specified row and column in pixels\n */\n scrollTo(rowOffset?: number, columnOffset?: number): void;\n\n /**\n * Scrolls the list so that the specified item is visible\n * @param rowIndex - Row of item to scroll to\n * @param columnIndex - Column of item to scroll to\n * @param option - Where to {@link ScrollToOption | position} the item within the viewport\n */\n scrollToItem(rowIndex?: number, columnIndex?: number, option?: ScrollToOption): void;\n\n /** Exposes DOM clientWidth property */\n get clientWidth(): number;\n\n /** Exposes DOM clientHeight property */\n get clientHeight(): number;\n}\n\n/** Range to scroll to in one dimension specified as (offset,size). May be undefined if no need to scroll. */\nexport type ScrollRange = [ offset: number|undefined, size: number|undefined ];\n\n/**\n * Returns the {@link ScrollRange} corresponding to a specified item.\n * \n * Used internally to implement {@link VirtualGridProxy.scrollToItem}. Can be used directly for \n * advanced customization scenarios.\n */\nexport function getRangeToScroll(index: number | undefined, mapping: ItemOffsetMapping): ScrollRange {\n if (index === undefined)\n return [undefined, undefined];\n\n return [mapping.itemOffset(index), mapping.itemSize(index)];\n}\n\n/**\n * Same logic as {@link VirtualGridProxy.scrollToItem} usable with your own {@link VirtualScroll}\n * \n * You're encouraged to put together your own combination of {@link VirtualScroll} and {@link DisplayGrid} for\n * advanced customization scenarios. This function provides `ScrollToItem` functionality for use with your own {@link VirtualScroll}.\n */\nexport function virtualGridScrollToItem(scrollRef: React.RefObject<VirtualScrollProxy>, rowOffsetMapping: ItemOffsetMapping, \n columnOffsetMapping: ItemOffsetMapping, rowIndex?: number, columnIndex?: number, option?: ScrollToOption) {\n\n const scroll = scrollRef.current;\n /* istanbul ignore if */\n if (!scroll)\n return;\n\n const [rowOffset, rowSize] = getRangeToScroll(rowIndex, rowOffsetMapping);\n const [colOffset, colSize] = getRangeToScroll(columnIndex, columnOffsetMapping);\n\n scroll.scrollToArea(rowOffset, rowSize, colOffset, colSize, option);\n}\n","import React from \"react\";\nimport { ItemOffsetMapping, VirtualBaseProps, ScrollToOption } from './VirtualBase';\nimport { DisplayGrid, DisplayGridItem } from './DisplayGrid';\nimport { VirtualContainerRender } from './VirtualContainer';\nimport { VirtualScroll } from './VirtualScroll';\nimport { VirtualScrollProxy } from './VirtualScrollProxy';\nimport { virtualGridScrollToItem, VirtualGridProxy } from './VirtualGridProxy';\nimport { AutoSizer } from './AutoSizer';\nimport { ScrollState } from './useVirtualScroll';\n\n/**\n * Props accepted by {@link VirtualGrid}\n */\nexport interface VirtualGridProps extends VirtualBaseProps {\n /** Component used as a template to render items in the grid. Must implement {@link DisplayGridItem} interface. */\n children: DisplayGridItem,\n\n /** Number of rows in the grid */\n rowCount: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each row in the grid\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n rowOffsetMapping: ItemOffsetMapping,\n\n /** Number of columns in the grid */\n columnCount: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each column in the grid\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n columnOffsetMapping: ItemOffsetMapping,\n\n /**\n * Function that defines the key to use for each item given row and column index and value of {@link VirtualBaseProps.itemData}.\n * @defaultValue\n * ```ts\n * (rowIndex, columnIndex, _data) => `${rowIndex}:${columnIndex}`\n * ```\n */\n itemKey?: (rowIndex: number, columnIndex: number, data: unknown) => React.Key,\n\n /**\n * Callback after a scroll event has been processed and state updated but before rendering\n * @param rowOffset - Resulting overall row offset. Can be passed to {@link ItemOffsetMapping} to determine first row.\n * @param columnOffset - Resulting overall column offset. Can be passed to {@link ItemOffsetMapping} to determine first column.\n * @param newRowScrollState - New {@link ScrollState} for rows that will be used for rendering.\n * @param newColumnScrollState - New {@link ScrollState} for columns that will be used for rendering.\n */\n onScroll?: (rowOffset: number, columnOffset: number, newRowScrollState: ScrollState, newColumnScrollState: ScrollState) => void;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link VirtualGrid} outer container. */\n outerRender?: VirtualContainerRender;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link DisplayGrid} within {@link VirtualGrid} inner container. */\n innerRender?: VirtualContainerRender;\n}\n\n// Using a named function rather than => so that the name shows up in React Developer Tools\n/**\n * Virtual Scrolling Grid\n * \n * Accepts props defined by {@link VirtualGridProps}. \n * Refs are forwarded to {@link VirtualGridProxy}. \n * You must pass a single instance of {@link DisplayGridItem} as a child.\n * @group Components\n */\nexport const VirtualGrid = React.forwardRef<VirtualGridProxy, VirtualGridProps>(function VirtualGrid(props, ref) {\n const { rowCount, rowOffsetMapping, columnCount, columnOffsetMapping, children, \n innerClassName, innerRender, itemData, itemKey, onScroll: onScrollCallback, ...scrollProps } = props;\n\n // Total size is same as offset to item one off the end\n const totalRowSize = rowOffsetMapping.itemOffset(rowCount);\n const totalColumnSize = columnOffsetMapping.itemOffset(columnCount);\n\n const scrollRef = React.useRef<VirtualScrollProxy>(null);\n\n\n React.useImperativeHandle(ref, () => {\n return {\n scrollTo(rowOffset?: number, columnOffset?: number): void {\n const scroll = scrollRef.current;\n /* istanbul ignore else */\n if (scroll)\n scroll.scrollTo(rowOffset, columnOffset);\n },\n\n scrollToItem(rowIndex?: number, columnIndex?: number, option?: ScrollToOption): void {\n virtualGridScrollToItem(scrollRef, rowOffsetMapping, columnOffsetMapping, rowIndex, columnIndex, option);\n },\n\n get clientWidth(): number {\n return scrollRef.current ? scrollRef.current.clientWidth : /* istanbul ignore next */ 0;\n },\n\n get clientHeight(): number {\n return scrollRef.current ? scrollRef.current.clientHeight : /* istanbul ignore next */ 0;\n }\n }\n }, [ rowOffsetMapping, columnOffsetMapping ]);\n\n\n // We can decide the JSX child type at runtime as long as we use a variable that uses the same capitalized\n // naming convention as components do. \n const ChildVar = children;\n\n return (\n <VirtualScroll\n ref={scrollRef}\n {...scrollProps}\n scrollHeight={totalRowSize}\n scrollWidth={totalColumnSize}\n onScroll={(verticalOffset, horizontalOffset, verticalScrollState, horizontalScrollState) => {\n if (onScrollCallback)\n onScrollCallback(verticalOffset, horizontalOffset, verticalScrollState, horizontalScrollState);\n }}>\n {({ isScrolling, verticalOffset, horizontalOffset }) => (\n <AutoSizer style={{ height: '100%', width: '100%' }}>\n {({height,width}) => (\n <DisplayGrid\n innerClassName={innerClassName}\n innerRender={innerRender}\n rowOffset={verticalOffset}\n columnOffset={horizontalOffset}\n height={height}\n rowCount={rowCount}\n columnCount={columnCount}\n itemData={itemData}\n itemKey={itemKey}\n isScrolling={isScrolling}\n rowOffsetMapping={rowOffsetMapping}\n columnOffsetMapping={columnOffsetMapping}\n width={width}>\n {ChildVar}\n </DisplayGrid>\n )}\n </AutoSizer>\n )}\n </VirtualScroll>\n );\n});\n\nexport default VirtualGrid;\n","import { ItemOffsetMapping, ScrollToOption } from './VirtualBase';\nimport { VirtualScrollProxy } from './VirtualScrollProxy';\n\n/**\n * Custom ref handle returned by {@link VirtualList} that exposes imperative methods\n * \n * Use `React.useRef<VirtualListProxy>(null)` to create a ref.\n */\nexport interface VirtualListProxy {\n /**\n * Scrolls the list to the specified offset in pixels\n * @param offset - Offset to scroll to\n */\n scrollTo(offset: number): void;\n\n /**\n * Scrolls the list so that the specified item is visible\n * @param index - Index of item to scroll to\n * @param option - Where to {@link ScrollToOption | position} the item within the viewport\n */\n scrollToItem(index: number, option?: ScrollToOption): void;\n}\n\n/**\n * Same logic as {@link VirtualListProxy.scrollToItem} usable with your own {@link VirtualScroll}\n * \n * You're encouraged to put together your own combination of {@link VirtualScroll} and {@link DisplayList} for\n * advanced customization scenarios. This function provides `ScrollToItem` functionality for use with your own {@link VirtualScroll}.\n */\nexport function virtualListScrollToItem(scrollRef: React.RefObject<VirtualScrollProxy>, itemOffsetMapping: ItemOffsetMapping, isVertical: boolean,\n index: number, option?: ScrollToOption) {\n\n const scroll = scrollRef.current;\n /* istanbul ignore if */\n if (!scroll)\n return;\n\n const itemOffset = itemOffsetMapping.itemOffset(index);\n const itemSize = itemOffsetMapping.itemSize(index);\n\n if (isVertical)\n scroll.scrollToArea(itemOffset, itemSize, undefined, undefined, option);\n else\n scroll.scrollToArea(undefined, undefined, itemOffset, itemSize, option);\n}","import React from \"react\";\nimport { ItemOffsetMapping, VirtualBaseProps, ScrollToOption, ScrollLayout } from './VirtualBase';\nimport { DisplayList, DisplayListItem } from './DisplayList';\nimport { VirtualContainerRender } from './VirtualContainer';\nimport { VirtualScroll } from './VirtualScroll';\nimport { VirtualScrollProxy } from './VirtualScrollProxy';\nimport { virtualListScrollToItem, VirtualListProxy } from './VirtualListProxy';\nimport { AutoSizer } from './AutoSizer';\nimport { ScrollState } from './useVirtualScroll';\n\n/**\n * Props accepted by {@link VirtualList}\n */\nexport interface VirtualListProps extends VirtualBaseProps {\n /** Component used as a template to render items in the list. Must implement {@link DisplayListItem} interface. */\n children: DisplayListItem,\n\n /** Number of items in the list */\n itemCount: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each item in the list\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n itemOffsetMapping: ItemOffsetMapping,\n\n /**\n * Function that defines the key to use for each item given item index and value of {@link VirtualBaseProps.itemData}.\n * @defaultValue `(index, _data) => index`\n */\n itemKey?: (index: number, data: unknown) => React.Key,\n\n /**\n * Choice of 'vertical' or 'horizontal' layouts\n * @defaultValue 'vertical'\n */\n layout?: ScrollLayout,\n\n /**\n * Callback after a scroll event has been processed and state updated but before rendering\n * @param offset - Resulting overall offset. Can be passed to {@link ItemOffsetMapping} to determine top item.\n * @param newScrollState - New {@link ScrollState} that will be used for rendering.\n */\n onScroll?: (offset: number, newScrollState: ScrollState) => void;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link VirtualList} outer container. */\n outerRender?: VirtualContainerRender;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link DisplayList} within {@link VirtualList} inner container. */\n innerRender?: VirtualContainerRender;\n}\n\n\n\n// Using a named function rather than => so that the name shows up in React Developer Tools\n/**\n * Virtual Scrolling List\n * \n * Accepts props defined by {@link VirtualListProps}. \n * Refs are forwarded to {@link VirtualListProxy}. \n * You must pass a single instance of {@link DisplayListItem} as a child.\n * @group Components\n */\nexport const VirtualList = React.forwardRef<VirtualListProxy, VirtualListProps>(function VirtualList(props, ref) {\n const { itemCount, itemOffsetMapping, children, layout = 'vertical', onScroll: onScrollCallback,\n innerClassName, innerRender, itemData, itemKey, ...scrollProps } = props;\n\n // Total size is same as offset to item one off the end\n const renderSize = itemOffsetMapping.itemOffset(itemCount);\n\n const scrollRef = React.useRef<VirtualScrollProxy>(null);\n const isVertical = layout === 'vertical';\n\n React.useImperativeHandle(ref, () => {\n return {\n scrollTo(offset: number): void {\n const scroll = scrollRef.current;\n /* istanbul ignore if */\n if (!scroll)\n return;\n\n if (isVertical)\n scroll.scrollTo(offset, undefined);\n else\n scroll.scrollTo(undefined, offset);\n },\n\n scrollToItem(index: number, option?: ScrollToOption): void {\n virtualListScrollToItem(scrollRef, itemOffsetMapping, isVertical, index, option);\n }\n }\n }, [ itemOffsetMapping, isVertical ]);\n\n // We can decide the JSX child type at runtime as long as we use a variable that uses the same capitalized\n // naming convention as components do.\n const ChildVar = children;\n\n return (\n <VirtualScroll\n ref={scrollRef}\n {...scrollProps}\n scrollHeight={isVertical ? renderSize : undefined}\n scrollWidth={isVertical ? undefined : renderSize}\n onScroll={(verticalOffset, horizontalOffset, verticalScrollState, horizontalScrollState) => {\n const newOffset = isVertical ? verticalOffset : horizontalOffset;\n if (onScrollCallback)\n onScrollCallback(newOffset, isVertical ? verticalScrollState : horizontalScrollState);\n }}>\n {({ isScrolling, verticalOffset, horizontalOffset }) => (\n <AutoSizer style={{ height: '100%', width: '100%' }}>\n {({height,width}) => (\n <DisplayList\n innerClassName={innerClassName}\n innerRender={innerRender}\n layout={layout}\n offset={isVertical ? verticalOffset : horizontalOffset}\n height={height}\n itemCount={itemCount}\n itemData={itemData}\n itemKey={itemKey}\n isScrolling={isScrolling}\n itemOffsetMapping={itemOffsetMapping}\n width={width}>\n {ChildVar}\n </DisplayList>\n )}\n </AutoSizer>\n )}\n </VirtualScroll>\n );\n});\n\nexport default VirtualList;\n","import { ItemOffsetMapping } from './VirtualBase';\n\nclass FixedSizeItemOffsetMapping implements ItemOffsetMapping {\n constructor (itemSize: number) {\n this.fixedItemSize = itemSize;\n }\n\n itemSize(_itemIndex: number): number {\n return this.fixedItemSize;\n }\n\n itemOffset(itemIndex: number): number {\n return itemIndex * this.fixedItemSize;\n }\n\n offsetToItem(offset: number): [itemIndex: number, startOffset: number] {\n const itemIndex = Math.floor(offset / this.fixedItemSize);\n const startOffset = itemIndex * this.fixedItemSize;\n\n return [itemIndex, startOffset];\n }\n\n fixedItemSize: number;\n}\n\n/**\n * Returns an instance of {@link ItemOffsetMapping} suitable for use when all items have a fixed size.\n * \n * @param itemSize - Size to use for all items\n */\nexport function useFixedSizeItemOffsetMapping(itemSize: number): ItemOffsetMapping {\n return new FixedSizeItemOffsetMapping(itemSize);\n}\n\nexport default useFixedSizeItemOffsetMapping;\n","import { ItemOffsetMapping } from './VirtualBase';\n\nclass VariableSizeItemOffsetMapping implements ItemOffsetMapping {\n constructor (defaultItemSize: number, sizes: number[]) {\n this.defaultItemSize = defaultItemSize;\n this.sizes = sizes;\n }\n\n itemSize(itemIndex: number): number {\n return (itemIndex < this.sizes.length) ? this.sizes[itemIndex] : this.defaultItemSize;\n }\n\n itemOffset(itemIndex: number): number {\n let offset = 0;\n let length = this.sizes.length;\n if (itemIndex > length) {\n const numDefaultSize = itemIndex - length;\n offset = numDefaultSize * this.defaultItemSize;\n } else {\n length = itemIndex;\n }\n \n for (let i = 0; i < length; i ++)\n {\n offset += this.sizes[i];\n }\n\n return offset;\n }\n\n offsetToItem(offset: number): [itemIndex: number, startOffset: number] {\n let startOffset = 0;\n const length = this.sizes.length;\n for (let i = 0; i < length; i ++) {\n const size = this.sizes[i];\n if (startOffset + size > offset) {\n return [i, startOffset];\n }\n startOffset += size;\n }\n\n const itemIndex = Math.floor((offset - startOffset) / this.defaultItemSize);\n startOffset += itemIndex * this.defaultItemSize;\n\n return [itemIndex+length, startOffset];\n }\n\n defaultItemSize: number;\n sizes: number[];\n}\n\n/**\n * Returns an instance of {@link ItemOffsetMapping} suitable for use when initial items have variable sizes.\n * \n * @param defaultItemSize - Size to use for all other items\n * @param sizes - Array of sizes to use for the initial items, one size per item\n */\nexport function useVariableSizeItemOffsetMapping(defaultItemSize: number, sizes?: number[]): ItemOffsetMapping {\n return new VariableSizeItemOffsetMapping(defaultItemSize, sizes || []);\n}\n\nexport default useVariableSizeItemOffsetMapping;"],"names":["_jsx","useIsScrolling","useIsScrollingHook","_jsxs","defaultItemKey","boxStyle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/VirtualContainer.tsx","../src/AutoSizer.tsx","../src/useVirtualScroll.ts","../src/useEventListener.ts","../src/useAnimationTimeout.ts","../src/useIsScrolling.ts","../src/VirtualScrollProxy.ts","../src/VirtualScroll.tsx","../src/VirtualCommon.ts","../src/DisplayList.tsx","../src/DisplayGrid.tsx","../src/VirtualGridProxy.ts","../src/VirtualGrid.tsx","../src/VirtualListProxy.ts","../src/VirtualList.tsx","../src/useFixedSizeItemOffsetMapping.ts","../src/useVariableSizeItemOffsetMapping.ts"],"sourcesContent":["import React from \"react\";\n\n/**\n * Props that an implementation of {@link VirtualContainerRender} must accept.\n * \n * Includes all the props that a {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLDivElement | HTMLDivElement} would accept.\n */\nexport type VirtualContainerRenderProps = React.ComponentPropsWithoutRef<'div'>;\n\n/**\n * Render prop for a {@link VirtualContainer}\n *\n * Can be passed to {@link VirtualContainer} to replace default implementation. \n * Function must render a div and forward {@link VirtualContainerRenderProps}\n * and any `ref` to it. \n * \n * @example Minimal compliant implementation\n * ```\n * const containerRender: VirtualContainerRender = ({...rest}, ref) => (\n * <div ref={ref} {...rest} />\n * )\n * ```\n */\nexport type VirtualContainerRender = (props: VirtualContainerRenderProps, ref?: React.ForwardedRef<HTMLDivElement>) => JSX.Element;\n\n/**\n * Props that {@link VirtualContainer} accepts.\n */\nexport interface VirtualContainerComponentProps extends VirtualContainerRenderProps {\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link VirtualContainer}. */\n render?: VirtualContainerRender;\n}\n\nconst defaultContainerRender: VirtualContainerRender = ({...rest}, ref) => (\n <div ref={ref} {...rest} />\n)\n\n/**\n * Wrapper around a div used by other components in {@link @candidstartup/react-virtual-scroll!}. Most props are passed through to the div. Use the\n * {@link VirtualContainerComponentProps.render} prop to override the default behavior. \n * \n * @group Components\n */\nexport const VirtualContainer = React.forwardRef<HTMLDivElement, VirtualContainerComponentProps >(\n function VirtualContainer({render = defaultContainerRender, ...rest}, ref) {\n return render(rest, ref)\n})\n","import React from \"react\";\n\n/**\n * Props that an implementation of {@link AutoSizerRender} must accept.\n */\nexport interface AutoSizerRenderProps {\n /** Computed height */\n height: number,\n\n /** Computed width */\n width: number,\n}\n\n/**\n * Render prop for content in an {@link AutoSizer}\n *\n * Function renders content and forwards `width` and `height`\n * to whatever needs it.\n * \n * @example Simple implementation\n * ```\n * const autoSizeRender: AutoSizeRender = ({width, height}) => (\n * <VirtualList width={width} height={height} {...props} />\n * )\n * ```\n */\nexport type AutoSizerRender = (props: AutoSizerRenderProps) => JSX.Element;\n\n/**\n * Props accepted by {@link AutoSizer}\n */\nexport interface AutoSizerProps {\n /** Function implementing {@link AutoSizerRender} that renders the content that needs explicit sizing */\n children: AutoSizerRender\n\n /** The `className` applied to the container element */\n className?: string,\n\n /** Inline style to apply to the container element */\n style?: React.CSSProperties;\n}\n\n/**\n * HOC that calculates the size available to it and makes the computed size available to children.\n * The size available depends on DOM layout and style applied wherever the AutoSizer finds itself.\n * You will probably want to pass something appropriate via the `className` or `style` props.\n * \n * Accepts props defined by {@link AutoSizerProps}. \n * You must pass a single instance of {@link AutoSizerRender} as a child.\n * @group Components\n */\nexport function AutoSizer(props: AutoSizerProps) {\n const { children, className, style } = props;\n\n // Using separate primitive states rather than one composite so that React\n // can detect duplicates values and bail out of redundant renders.\n const [width, setWidth] = React.useState<number>(0);\n const [height, setHeight] = React.useState<number>(0);\n const ref = React.useRef<HTMLDivElement>(null);\n\n // Make sure resize callback is a stable value so we're not constantly\n // creating and disconnecting resize observers.\n const resizeCallback: ResizeObserverCallback = React.useCallback((entries) => {\n entries.forEach(entry => {\n // Context box sizes can contain fractional values while clientWidth\n // and clientHeight properties are always rounded to nearest integer.\n // Always use integer values to avoid confusion.\n const newWidth = Math.round(entry.contentBoxSize[0].inlineSize);\n setWidth(newWidth);\n const newHeight = Math.round(entry.borderBoxSize[0].blockSize);\n setHeight(newHeight);\n })\n }, []);\n\n // Expect effect to run only on initial mount\n React.useLayoutEffect(() => {\n const div = ref.current;\n /* istanbul ignore if*/\n if (!div)\n return;\n\n // Size on initial mount\n setHeight(div.clientHeight);\n setWidth(div.clientWidth);\n\n // Updates size on any subsequent resize. Only available in browser\n // environment so avoid crashing out when server side rendering, or\n // running unit test without ResizeObserver being mocked. \n if (typeof ResizeObserver !== 'undefined') {\n const resizeObserver = new ResizeObserver(resizeCallback);\n resizeObserver.observe(div);\n return () => { resizeObserver.disconnect() }\n }\n }, [resizeCallback])\n\n // No point rendering children until we've measured size and found a usable area\n const renderChildren = height > 0 && width > 0;\n\n // Ensure that size is driven only by parent. Wrapping child in a zero sized inner div\n // which it can overflow stops child's size having any impact on size of outer div. \n // Otherwise can end up in infinite loop if child makes itself bigger than the \n // actual width and height we pass to it. That could be because child has \n // padding/borders/margins or because child renders itself bigger than size it's given.\n return (\n <div ref={ref} className={className} style={style}>\n <div style={{ overflow: 'visible', width: 0, height: 0 }}>\n {renderChildren && children({height, width})}\n </div>\n </div>\n );\n}\n\nexport default AutoSizer;\n","import { useState, useRef, RefObject } from \"react\";\n\n/** Direction of scrolling */\nexport type ScrollDirection = \"forward\" | \"backward\";\n\n/**\n * Overall scroll state for a single dimension.\n */\nexport interface ScrollState { \n /** Scroll bar offset. Equal to outer container's `scrollTop` or `scrollLeft` depending on dimension. */\n scrollOffset: number, \n\n /** Offset used to position current page of items in virtual space. Total offset is `scrollOffset+renderOffset`. */\n renderOffset: number,\n\n /** Index of current page. */\n page: number, \n\n /** Current scrolling direction. Calculated by comparing current overall offset to that when last rendered. */\n scrollDirection: ScrollDirection, \n}\n\nexport interface VirtualScrollState {\n /** Snapshot of overall offset at last render */\n totalOffset: number;\n\n /** Physical size of scrollable area */\n renderSize: number;\n\n // Returns updated scrollOffset. Caller should update scroll bar position if different from value passed in. \n onScroll(this: void, clientExtent: number, scrollExtent: number, scrollOffset: number): [number, ScrollState];\n\n // Scroll to offset in logical space returning offset to update scroll bar position to\n doScrollTo(this: void, offset: number, clientExtent: number): number;\n\n // Returns current overall offset (NOT a snapshot)\n getCurrentOffset(this: void): number;\n\n // Internal scroll state. Most scenarios will never need to access this. Mainly here for unit test.\n scrollState: RefObject<ScrollState>;\n}\n\n// Max size that is safe across all browsers (Firefox is the limiting factor)\n// SlickGrid tries to dynamically determine limit on other browsers (Chrome will do 30M) but\n// I prefer simplicity of same behavior across all browsers.\nconst MAX_SUPPORTED_CSS_SIZE = 6000000;\nconst MIN_NUMBER_PAGES = 100;\n\n/** Custom hook that implements logic for paged virtual scrolling in a single dimension */\nexport function useVirtualScroll(totalSize: number, maxCssSize = MAX_SUPPORTED_CSS_SIZE, minNumberPages = MIN_NUMBER_PAGES, \n useTotalOffset = true): VirtualScrollState {\n let renderSize=0, pageSize=0, numPages=0;\n if (totalSize < maxCssSize) {\n // No paging needed\n renderSize = pageSize = totalSize;\n numPages = 1;\n } else {\n // Break into pages\n renderSize = maxCssSize;\n pageSize = renderSize / minNumberPages;\n numPages = Math.floor(totalSize / pageSize);\n }\n\n function pageToRenderOffset(page: number): number {\n if (page <= 0)\n return 0;\n\n if (page >= numPages-1)\n return totalSize - renderSize;\n\n return Math.round((page-1) * (totalSize - renderSize) / (numPages - 3));\n }\n\n const initValue: ScrollState = { \n scrollOffset: 0, \n renderOffset: 0,\n page: 0,\n scrollDirection: \"forward\",\n };\n const [totalOffset, setTotalOffset] = useState<number>(0);\n const scrollState = useRef(initValue);\n\n function onScroll(clientExtent: number, scrollExtent: number, scrollOffset: number): [number, ScrollState] {\n const currState = scrollState.current;\n if (currState.scrollOffset == scrollOffset) {\n // No need to change state if scroll position unchanged\n return [scrollOffset, currState];\n }\n\n // Prevent Safari's elastic scrolling from causing visual shaking when scrolling past bounds.\n let newOffset = Math.max(0, Math.min(scrollOffset, scrollExtent - clientExtent));\n const newScrollDirection = currState.scrollOffset <= newOffset ? 'forward' : 'backward';\n\n // Switch pages if needed\n let newPage, newRenderOffset;\n let retScrollOffset = scrollOffset;\n const scrollDist = Math.abs(newOffset - currState.scrollOffset);\n if (scrollDist < clientExtent) {\n // Scrolling part of visible window, don't want to skip items, so can't scale up movement\n // If we cross page boundary we need to reset scroll bar position back to where it should be at start of page\n newPage = Math.min(numPages - 1, Math.floor((scrollOffset + currState.renderOffset) / pageSize));\n newRenderOffset = pageToRenderOffset(newPage);\n if (newPage != currState.page) {\n // Be very intentional about when we ask caller to reset scroll bar\n // Don't want to trigger event loops\n newOffset = scrollOffset + currState.renderOffset - newRenderOffset;\n retScrollOffset = newOffset;\n }\n } else {\n // Large scale scrolling, choosing page from a rolodex\n // First and last page are mapped 1:1 between grid and container\n if (newOffset < pageSize) {\n newPage = 0;\n } else if (newOffset >= renderSize - pageSize) {\n newPage = numPages - 1;\n } else {\n const scaleFactor = (totalSize - pageSize*2) / (renderSize - pageSize*2);\n newPage = Math.min(numPages - 3, Math.floor((newOffset - pageSize) * scaleFactor / pageSize)) + 1;\n }\n newRenderOffset = pageToRenderOffset(newPage);\n }\n\n const newScrollState: ScrollState = \n { scrollOffset: newOffset, renderOffset: newRenderOffset, page: newPage, scrollDirection: newScrollDirection };\n scrollState.current = newScrollState;\n if (useTotalOffset)\n setTotalOffset(newOffset + newRenderOffset);\n return [retScrollOffset, newScrollState];\n }\n\n function doScrollTo(offset: number, clientExtent: number) {\n const currState = scrollState.current;\n const safeOffset = Math.min(totalSize - clientExtent, Math.max(offset, 0));\n const scrollDirection = (currState.scrollOffset + currState.renderOffset) <= safeOffset ? 'forward' : 'backward';\n const page = Math.min(numPages - 1, Math.floor(safeOffset / pageSize));\n const renderOffset = pageToRenderOffset(page);\n const scrollOffset = safeOffset - renderOffset;\n\n scrollState.current = { scrollOffset, renderOffset, page, scrollDirection };\n if (useTotalOffset)\n setTotalOffset(scrollOffset + renderOffset);\n return scrollOffset;\n }\n\n function getCurrentOffset() {\n const currState = scrollState.current;\n return currState.scrollOffset + currState.renderOffset;\n }\n\n return {totalOffset, renderSize, onScroll, doScrollTo, getCurrentOffset, scrollState} as const;\n}\n\nexport default useVirtualScroll;\n","// Based on https://github.com/realwugang/use-event-listener\n// and https://github.com/donavon/use-event-listener/blob/develop/src/index.js\n\nimport { useRef, useEffect, RefObject, createRef } from 'react';\n\ninterface Options {\n capture?: boolean\n once?: boolean\n passive?: boolean\n}\n\ntype Listener = Window | Document | HTMLElement;\n\nfunction isListener(element: Listener | RefObject<HTMLElement>): element is Listener {\n return (element as Listener).addEventListener !== undefined;\n}\n\ntype EventHandler = (event: Event) => void;\n\nexport function useEventListener (eventName: string, \n handler: EventHandler, \n element: Listener | RefObject<HTMLElement> | null = window, \n options: Options = {}) {\n const savedHandler = useRef<EventHandler>();\n const { capture, passive, once } = options;\n\n useEffect(() => {\n savedHandler.current = handler\n }, [handler])\n\n useEffect(() => {\n if (!element)\n return;\n\n const el = isListener(element) ? element : element.current;\n if (!el)\n return;\n\n const eventListener = (event: Event) => savedHandler.current?.(event);\n const opts = { capture, passive, once };\n el.addEventListener(eventName, eventListener, opts);\n return () => {\n el.removeEventListener(eventName, eventListener, opts);\n };\n }, [eventName, element, capture, passive, once]);\n}\n\nexport default useEventListener;\n\n// In-source testing for private helper functions\nif (import.meta.vitest) {\n const { it, expect } = import.meta.vitest\n it('isListener', () => {\n expect(isListener(window)).toBe(true)\n expect(isListener(document)).toBe(true)\n expect(isListener(document.createElement(\"div\"))).toBe(true)\n expect(isListener(createRef())).toBe(false)\n })\n}","// Based on https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n// and https://www.joshwcomeau.com/snippets/react-hooks/use-timeout/\n// and https://github.com/bvaughn/react-window/blob/master/src/timer.js\n//\n// Equivalent functionality to a useTimeout hook but based on requestAnimationFrame instead of setTimeout. Use\n// when making frequent requests for short duration timeouts where browser may throttle setTimeout.\nimport { useEffect, useRef } from 'react';\n\ntype Callback = () => void;\n\nexport function useAnimationTimeout(callback: Callback, delay: number | null, key?: unknown) {\n const requestRef = useRef<number>();\n const savedCallback = useRef<Callback>(callback);\n\n // Remember the latest callback\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n \n const start = performance.now();\n \n useEffect(() => {\n function tick() {\n requestRef.current = undefined;\n if (delay === null)\n return;\n\n if (performance.now() - start >= delay) {\n savedCallback.current();\n } else {\n requestRef.current = requestAnimationFrame(tick);\n }\n }\n\n tick();\n\n return () => {\n if (typeof requestRef.current === 'number') {\n cancelAnimationFrame(requestRef.current);\n requestRef.current = undefined;\n }\n }\n }, [start, delay, key]);\n}\n\nexport default useAnimationTimeout;","import { useState, RefObject } from \"react\";\nimport { useEventListener } from './useEventListener';\nimport { useAnimationTimeout } from './useAnimationTimeout';\n\nconst DEBOUNCE_INTERVAL = 150;\nconst FALLBACK_INTERVAL = 500;\n\nexport function useIsScrolling(element: Window | HTMLElement | RefObject<HTMLElement> | null = window): boolean {\n const [scrollCount, setScrollCount] = useState(0);\n\n // scrollend implementations in both Chrome and Firefox are buggy with missing scrollend events\n // in some circumstances (using keyboard to scroll past end in Chrome, intermittently when using mouse wheel in Firefox)\n // Use a timeout even when scrollend is supported to handle missing events. In this case we use a longer interval as\n // don't want it to be over sensitive. \n const supportsScrollEnd = ('onscrollend' in window);\n const delay = supportsScrollEnd ? FALLBACK_INTERVAL : DEBOUNCE_INTERVAL;\n\n useEventListener(\"scroll\", () => setScrollCount(c => c + 1), element);\n useEventListener(\"scrollend\", () => setScrollCount(0), supportsScrollEnd ? element : null);\n useAnimationTimeout(() => setScrollCount(0), (scrollCount == 0) ? null : delay, scrollCount);\n\n return scrollCount > 0;\n}\n\nexport default useIsScrolling;","import { ScrollToOption } from './VirtualBase';\n\n/**\n * Custom ref handle returned by {@link VirtualScroll} that exposes imperative methods\n * \n * Use `React.useRef<VirtualScrollProxy>(null)` to create a ref.\n */\nexport interface VirtualScrollProxy {\n /**\n * Scrolls to the specified vertical and horizontal offset in pixels\n * Either offset can be left undefined to scroll in one dimension only\n * @param verticalOffset - Offset to scroll to vertically\n * @param horizontalOffset - Offset to scroll to horizontally\n */\n scrollTo(verticalOffset?: number, horizontalOffset?: number): void;\n\n /**\n * Scrolls to the specified area\n * Either offset/size pair can be left undefined to scroll in one dimension only\n * @param verticalOffset - Offset to scroll to vertically\n * @param verticalSize - Size of target area vertically\n * @param horizontalOffset - Offset to scroll to horizontally\n * @param horizontalSize - Size of target area horizontally\n * @param option - Where to {@link ScrollToOption | position} the area within the viewport\n */\n scrollToArea(verticalOffset?: number, verticalSize?: number, horizontalOffset?: number, horizontalSize?: number, option?: ScrollToOption): void;\n\n /** Exposes DOM clientWidth property */\n get clientWidth(): number;\n\n /** Exposes DOM clientHeight property */\n get clientHeight(): number;\n\n /** Current vertical position of scroll bar */\n get verticalOffset(): number;\n\n /** Current horizontal position of scroll bar */\n get horizontalOffset(): number;\n}\n\n/**\n * Returns the offset needed to scroll in one dimension for a specified range\n * \n * Used internally to implement {@link VirtualScrollProxy.scrollToArea}. Can be used directly for \n * advanced customization scenarios.\n */\nexport function getOffsetToScrollRange(offset: number | undefined, size: number | undefined, \n clientExtent: number, scrollOffset: number, option?: ScrollToOption): number | undefined\n{\n if (offset === undefined)\n return undefined;\n\n if (option != 'visible')\n return offset;\n\n // Start of item offscreen before start of viewport?\n if (offset < scrollOffset)\n return offset;\n\n size = size || 0;\n\n // Already completely visible?\n const endOffset = offset + size;\n const endViewport = scrollOffset + clientExtent;\n if (endOffset <= endViewport)\n return undefined;\n\n // Item offscreen past end of viewport\n\n // Item bigger than viewport? Make sure start is in view\n if (size > clientExtent)\n return offset;\n\n // Scroll so end of item aligns with end of viewport\n return offset - clientExtent + size;\n }\n","import React from \"react\";\nimport { VirtualContainer, VirtualContainerRender } from './VirtualContainer';\nimport { VirtualScrollableProps, ScrollEvent, ScrollToOption } from './VirtualBase';\nimport { useVirtualScroll, ScrollState } from './useVirtualScroll';\nimport { useIsScrolling as useIsScrollingHook} from './useIsScrolling';\nimport { getOffsetToScrollRange, VirtualScrollProxy } from './VirtualScrollProxy';\n\n/**\n * Props that an implementation of {@link VirtualContentRender} must accept.\n */\nexport interface VirtualContentProps {\n /** \n * Is the owning component being actively scrolled? Used to change how the content is rendered depending on scroll state.\n * \n * Only defined if {@link VirtualScrollableProps.useIsScrolling} is true. \n * */\n isScrolling?: boolean,\n\n /** Current scroll position vertical offset */\n verticalOffset: number,\n\n /** Current scroll position horizontal offset */\n horizontalOffset: number\n}\n\n/**\n * Render prop for content in {@link VirtualScroll}\n *\n * Pass as child to {@link VirtualScroll} to render content and forward {@link VirtualContentProps}\n * to whatever needs them. \n * \n * @example Simple implementation\n * ```\n * const contentRender: VirtualContentRender = ({isScrolling, verticalOffset, horizontalOffset}) => (\n * <DisplayGrid\n * isScrolling={isScrolling}\n * rowOffset={verticalOffset}\n * columnOffset={horizontalOffset}\n * {...rest}/>\n * )\n * ```\n */\nexport type VirtualContentRender = (props: VirtualContentProps, ref?: React.ForwardedRef<HTMLDivElement>) => JSX.Element;\n\n/**\n * Props accepted by {@link VirtualScroll}\n */\nexport interface VirtualScrollProps extends VirtualScrollableProps {\n /** Function implementing {@link VirtualContentRender} that renders the content that needs to respond to scrolling */\n children: VirtualContentRender\n\n /** \n * Height of area to scroll over \n * \n * @defaultValue 0\n */\n scrollHeight?: number,\n\n /** \n * Width of area to scroll over \n * \n * @defaultValue 0\n */\n scrollWidth?: number,\n\n /** \n * Determines whether the component should pass {@link VirtualContentProps.verticalOffset|verticalOffset} and \n * {@link VirtualContentProps.horizontalOffset|horizontalOffset} to children when rendering.\n * \n * Can reduce the number of renders needed if these props aren't used\n * \n * @defaultValue true\n * */\n useOffsets?: boolean,\n\n /**\n * Callback after a scroll event has been processed and state updated but before rendering\n * @param verticalOffset - Resulting overall vertical offset. \n * @param horizontalOffset - Resulting overall horizontal offset.\n * @param newVerticalScrollState - New vertical {@link ScrollState} that will be used for rendering.\n * @param newHorizontalScrollState - New horizontal {@link ScrollState} that will be used for rendering.\n */\n onScroll?: (verticalOffset: number, horizontalOffset: number, newVerticalScrollState: ScrollState, newHorizontalScrollState: ScrollState) => void;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link VirtualScroll} outer container. */\n outerRender?: VirtualContainerRender;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link VirtualScroll} inner container. */\n innerRender?: VirtualContainerRender;\n}\n\n// Using a named function rather than => so that the name shows up in React Developer Tools\n/**\n * Customizable Virtual Scrolling Component\n * \n * Allows user to scroll over a virtual area `scrollHeight` x `scrollWidth` pixels. \n * Use `onScroll` to track scroll state and {@link VirtualContentRender} to render scroll state specific content into the viewport\n * \n * Accepts props defined by {@link VirtualScrollProps}. \n * Refs are forwarded to {@link VirtualScrollProxy}. \n * @group Components\n */\nexport const VirtualScroll = React.forwardRef<VirtualScrollProxy, VirtualScrollProps>(function VirtualScroll(props, ref) {\n const { width, height, scrollWidth = 0, scrollHeight = 0, className, innerClassName, children,\n onScroll: onScrollCallback, useIsScrolling = false, useOffsets = true, innerRender, outerRender } = props;\n\n const outerRef = React.useRef<HTMLDivElement>(null);\n const { totalOffset: currentVerticalOffset, renderSize: renderRowSize, onScroll: onScrollRow,\n doScrollTo: doScrollToRow, getCurrentOffset: getVerticalOffset } = useVirtualScroll(scrollHeight, props.maxCssSize, props.minNumPages, useOffsets);\n const { totalOffset: currentHorizontalOffset, renderSize: renderColumnSize, onScroll: onScrollColumn,\n doScrollTo: doScrollToColumn, getCurrentOffset: getHorizontalOffset} = useVirtualScroll(scrollWidth, props.maxCssSize, props.minNumPages, useOffsets);\n const isActuallyScrolling = useIsScrollingHook(outerRef);\n\n React.useImperativeHandle(ref, () => {\n return {\n scrollTo(rowOffset?: number, columnOffset?: number): void {\n if (rowOffset === undefined && columnOffset === undefined)\n return;\n\n const outer = outerRef.current;\n /* istanbul ignore else */\n if (outer) {\n const options: ScrollToOptions = {};\n if (rowOffset != undefined)\n options.top = doScrollToRow(rowOffset, outer.clientHeight);\n if (columnOffset != undefined)\n options.left = doScrollToColumn(columnOffset, outer.clientWidth);\n outer.scrollTo(options);\n }\n },\n\n scrollToArea(verticalOffset?: number, verticalSize?: number, horizontalOffset?: number, horizontalSize?: number, option?: ScrollToOption) {\n const outer = outerRef.current;\n /* istanbul ignore if*/\n if (!outer)\n return;\n\n const rowOffset = getOffsetToScrollRange(verticalOffset, verticalSize, outer.clientHeight, currentVerticalOffset, option);\n const colOffset = getOffsetToScrollRange(horizontalOffset, horizontalSize, outer.clientWidth, currentHorizontalOffset, option);\n this.scrollTo(rowOffset, colOffset);\n },\n\n get clientWidth(): number {\n return outerRef.current ? outerRef.current.clientWidth : /* istanbul ignore next */ 0;\n },\n\n get clientHeight(): number {\n return outerRef.current ? outerRef.current.clientHeight : /* istanbul ignore next */ 0;\n },\n\n get verticalOffset(): number { return getVerticalOffset(); },\n\n get horizontalOffset(): number { return getHorizontalOffset(); }\n }\n }, [ doScrollToRow, doScrollToColumn, currentVerticalOffset, currentHorizontalOffset, getVerticalOffset, getHorizontalOffset ]);\n\n function onScroll(event: ScrollEvent) {\n const { clientWidth, clientHeight, scrollWidth, scrollHeight, scrollLeft, scrollTop } = event.currentTarget;\n const [newScrollTop, newRowScrollState] = onScrollRow(clientHeight, scrollHeight, scrollTop);\n const [newScrollLeft, newColumnScrollState] = onScrollColumn(clientWidth, scrollWidth, scrollLeft);\n if (outerRef.current && (newScrollTop != scrollTop || newScrollLeft != scrollLeft ))\n outerRef.current.scrollTo(newScrollLeft, newScrollTop);\n onScrollCallback?.(newRowScrollState.scrollOffset+newRowScrollState.renderOffset, \n newColumnScrollState.scrollOffset+newColumnScrollState.renderOffset, newRowScrollState, newColumnScrollState);\n }\n\n const isScrolling = useIsScrolling ? isActuallyScrolling : undefined;\n const verticalOffset = currentVerticalOffset;\n const horizontalOffset = currentHorizontalOffset;\n\n return (\n <VirtualContainer className={className} render={outerRender} onScroll={onScroll} ref={outerRef} \n style={{ position: \"relative\", height, width, overflow: \"auto\", willChange: \"transform\" }}>\n <VirtualContainer className={innerClassName} render={innerRender} \n style={{ zIndex: 1, position: 'sticky', top: 0, left: 0, width: '100%', height: '100%' }}>\n {children({isScrolling, verticalOffset, horizontalOffset})}\n </VirtualContainer>\n <div style={{ position: 'absolute', top: 0, left: 0, \n height: scrollHeight ? renderRowSize : '100%', \n width: scrollWidth ? renderColumnSize : '100%'}}/>\n </VirtualContainer>\n );\n});\n\nexport default VirtualScroll;\n","import type { ItemOffsetMapping } from \"@candidstartup/infinisheet-types\";\n\ntype RangeToRender = [\n startIndex: number,\n startOffset: number,\n totalSize: number,\n sizes: number[]\n];\n\nexport function getRangeToRender(itemCount: number, itemOffsetMapping: ItemOffsetMapping, clientExtent: number, scrollOffset: number): RangeToRender {\n if (itemCount == 0) {\n return [0, 0, 0, []];\n }\n\n // Negative offset equivalent to reducing the size of the window (possibly down to nothing)\n if (scrollOffset < 0) {\n clientExtent += scrollOffset;\n scrollOffset = 0;\n }\n\n if (clientExtent <= 0) {\n return [0, 0, 0, []];\n }\n\n const [baseIndex, startOffset] = itemOffsetMapping.offsetToItem(scrollOffset);\n if (baseIndex >= itemCount) {\n return [0, 0, 0, []];\n }\n\n let itemIndex = Math.max(0, Math.min(itemCount - 1, baseIndex));\n const endOffset = scrollOffset + clientExtent;\n\n const startIndex = itemIndex;\n let offset = startOffset;\n const sizes: number[] = [];\n let totalSize = 0;\n\n while (offset < endOffset && itemIndex < itemCount) {\n const size = itemOffsetMapping.itemSize(itemIndex);\n sizes.push(size);\n totalSize += size;\n offset += size;\n itemIndex ++;\n }\n\n return [startIndex, startOffset, totalSize, sizes];\n}\n\nfunction formatRepeat(repeat: number, size: number): string {\n return (repeat == 1) ? `${size}px` : `repeat(${repeat},${size}px)`;\n}\n\nfunction join(a: string|undefined, s: string) {\n return a ? a + ' ' + s : s;\n}\n\nexport function getGridTemplate(sizes: number[]): string | undefined {\n const count = sizes.length;\n if (count == 0)\n return undefined;\n\n let ret = undefined;\n let lastSize = sizes[0];\n let repeat = 1;\n\n for (let i = 1; i < count; i ++) {\n const size = sizes[i];\n if (size == lastSize) {\n repeat ++;\n } else {\n const s = formatRepeat(repeat, lastSize);\n ret = join(ret,s);\n lastSize = size;\n repeat = 1;\n }\n }\n\n const s = formatRepeat(repeat, lastSize);\n return join(ret,s);\n}\n\n\n","import React from \"react\";\nimport type { ItemOffsetMapping } from \"@candidstartup/infinisheet-types\";\nimport { ScrollLayout, DisplayBaseItemProps, DisplayBaseProps } from './VirtualBase';\nimport { getRangeToRender, getGridTemplate } from './VirtualCommon';\nimport { VirtualContainer } from './VirtualContainer';\n\n/**\n * Props accepted by {@link DisplayListItem}\n */\nexport interface DisplayListItemProps extends DisplayBaseItemProps {\n /** Index of item in the list being rendered */\n index: number,\n}\n\n/**\n * Type of item in a {@link DisplayList}\n *\n * Must be passed as a child to {@link DisplayList}. \n * Accepts props defined by {@link DisplayListItemProps}.\n * Component must pass {@link DisplayBaseItemProps.style} to whatever it renders. \n * \n * @example Basic implementation\n * ```\n * const Row = ({ index, style }: { index: number, style: React.CSSProperties }) => (\n * <div className=\"row\" style={style}>\n * { index }\n * </div>\n * );\n * ```\n */\nexport type DisplayListItem = React.ComponentType<DisplayListItemProps>;\n\n/**\n * Props accepted by {@link DisplayList}\n */\nexport interface DisplayListProps extends DisplayBaseProps {\n /** Component used as a template to render items in the list. Must implement {@link DisplayListItem} interface. */\n children: DisplayListItem,\n\n /** Number of items in the list */\n itemCount: number,\n\n /** Offset to start of displayed content */\n offset: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each item in the list\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n itemOffsetMapping: ItemOffsetMapping,\n\n /**\n * Function that defines the key to use for each item given item index and value of {@link DisplayBaseProps.itemData}.\n * @defaultValue `(index, _data) => index`\n */\n itemKey?: (index: number, data: unknown) => React.Key,\n\n /**\n * Choice of 'vertical' or 'horizontal' layouts\n * @defaultValue 'vertical'\n */\n layout?: ScrollLayout,\n}\n\nconst defaultItemKey = (index: number, _data: unknown) => index;\n\nconst boxStyle: React.CSSProperties = { boxSizing: 'border-box' };\n\n/**\n * Displays a window onto the contents of a virtualized list starting from `offset`.\n * \n * Accepts props defined by {@link DisplayListProps}. \n * You must pass a single instance of {@link DisplayListItem} as a child.\n * @group Components\n */\nexport function DisplayList(props: DisplayListProps) {\n const { width, height, itemCount, itemOffsetMapping, className, innerClassName, offset: renderOffset, children,\n itemData, itemKey = defaultItemKey, layout = 'vertical', outerRender, innerRender, isScrolling } = props;\n\n const isVertical = layout === 'vertical';\n\n const [startIndex, startOffset, renderSize, sizes] = getRangeToRender(itemCount, itemOffsetMapping, \n isVertical ? height : width, renderOffset);\n const template = getGridTemplate(sizes);\n const offset = startOffset - renderOffset;\n\n // We can decide the JSX child type at runtime as long as we use a variable that uses the same capitalized\n // naming convention as components do.\n const ChildVar = children;\n\n return (\n <VirtualContainer className={className} render={outerRender}\n style={{ position: \"relative\", height, width, overflow: \"hidden\", willChange: \"transform\" }}>\n <VirtualContainer className={innerClassName} render={innerRender}\n style={{ position: 'absolute',\n display: 'grid',\n gridTemplateColumns: isVertical ? undefined : template,\n gridTemplateRows: isVertical ? template : undefined,\n top: isVertical ? offset : 0, \n left: isVertical ? 0 : offset, \n height: isVertical ? renderSize : \"100%\", \n width: isVertical ? \"100%\" : renderSize }}>\n {sizes.map((_size, arrayIndex) => (\n <ChildVar data={itemData} isScrolling={isScrolling} \n key={itemKey(startIndex + arrayIndex, itemData)} index={startIndex + arrayIndex} style={boxStyle}/>\n ))}\n </VirtualContainer>\n </VirtualContainer>\n );\n}\n\nexport default DisplayList;\n","import React, { Fragment } from \"react\";\nimport type { ItemOffsetMapping } from \"@candidstartup/infinisheet-types\";\nimport { DisplayBaseItemProps, DisplayBaseProps } from './VirtualBase';\nimport { getRangeToRender, getGridTemplate } from './VirtualCommon';\nimport { VirtualContainer } from './VirtualContainer';\n\n/**\n * Props accepted by {@link DisplayGridItem}\n */\nexport interface DisplayGridItemProps extends DisplayBaseItemProps {\n /** Row index of item in the grid being rendered */\n rowIndex: number,\n\n /** Column index of item in the grid being rendered */\n columnIndex: number,\n}\n\n/**\n * Type of item in a {@link DisplayGrid}\n *\n * Must be passed as a child to {@link DisplayGrid}. \n * Accepts props defined by {@link DisplayGridItemProps}.\n * Component must pass {@link DisplayBaseItemProps.style} to whatever it renders. \n * \n * @example Basic implementation\n * ```\n * const Row = ({ index, style }: { index: number, style: React.CSSProperties }) => (\n * <div className=\"row\" style={style}>\n * { index }\n * </div>\n * );\n * ```\n */\nexport type DisplayGridItem = React.ComponentType<DisplayGridItemProps>;\n\n/**\n * Props accepted by {@link DisplayGrid}\n */\nexport interface DisplayGridProps extends DisplayBaseProps {\n /** Component used as a template to render items in the list. Must implement {@link DisplayGridItem} interface. */\n children: DisplayGridItem,\n\n /** Number of rows in the grid */\n rowCount: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each row in the grid\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n rowOffsetMapping: ItemOffsetMapping,\n\n /** Number of columns in the grid */\n columnCount: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each column in the grid\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n columnOffsetMapping: ItemOffsetMapping,\n\n /** Vertical offset to start of displayed content */\n rowOffset: number,\n\n /** Horizontal offset to start of displayed content */\n columnOffset: number,\n\n /**\n * Function that defines the key to use for each item given row and column index and value of {@link DisplayBaseProps.itemData}.\n * @defaultValue `(rowIndex, columnIndex, _data) => '${rowIndex}:${columnIndex}'`\n */\n itemKey?: (rowIndex: number, columnIndex: number, data: unknown) => React.Key,\n}\n\nconst defaultItemKey = (rowIndex: number, columnIndex: number, _data: unknown) => `${rowIndex}:${columnIndex}`;\n\nconst boxStyle: React.CSSProperties = { boxSizing: 'border-box' };\n\n/**\n * Displays a window onto the contents of a virtualized grid starting from `rowOffset`, `columnOffset`.\n * \n * Accepts props defined by {@link DisplayGridProps}. \n * You must pass a single instance of {@link DisplayGridItem} as a child.\n * @group Components\n */\nexport function DisplayGrid(props: DisplayGridProps) {\n const { width, height, rowCount, rowOffsetMapping, columnCount, columnOffsetMapping, className, innerClassName, \n rowOffset: rowRenderOffset, columnOffset: colRenderOffset, children,\n itemData, itemKey = defaultItemKey, outerRender, innerRender, isScrolling } = props;\n\n const [rowStartIndex, rowStartOffset, rowRenderSize, rowSizes] = getRangeToRender(rowCount, rowOffsetMapping, height, rowRenderOffset);\n const rowTemplate = getGridTemplate(rowSizes);\n\n const [colStartIndex, colStartOffset, colRenderSize, colSizes] = getRangeToRender(columnCount, columnOffsetMapping, width, colRenderOffset);\n const colTemplate = getGridTemplate(colSizes);\n\n const rowOffset = rowStartOffset - rowRenderOffset;\n const colOffset = colStartOffset - colRenderOffset;\n\n // We can decide the JSX child type at runtime as long as we use a variable that uses the same capitalized\n // naming convention as components do.\n const ChildVar = children;\n\n return (\n <VirtualContainer className={className} render={outerRender}\n style={{ position: \"relative\", height, width, overflow: \"hidden\", willChange: \"transform\" }}>\n <VirtualContainer className={innerClassName} render={innerRender}\n style={{ position: 'absolute',\n display: 'grid',\n gridTemplateColumns: colTemplate,\n gridTemplateRows: rowTemplate,\n top: rowOffset, \n left: colOffset, \n height: rowRenderSize, \n width: colRenderSize }}>\n {rowSizes.map((_rowSize, rowIndex) => (\n <Fragment key={itemKey(rowStartIndex + rowIndex, 0, itemData)}>\n {colSizes.map((_size, colIndex) => (\n <ChildVar data={itemData} isScrolling={isScrolling} \n key={itemKey(rowStartIndex + rowIndex, colStartIndex + colIndex, itemData)} \n rowIndex={rowStartIndex + rowIndex} columnIndex={colStartIndex + colIndex} style={boxStyle}/>\n ))}\n </Fragment>\n ))}\n </VirtualContainer>\n </VirtualContainer>\n );\n}\n\nexport default DisplayGrid;\n","import type { ItemOffsetMapping } from \"@candidstartup/infinisheet-types\";\nimport { ScrollToOption } from './VirtualBase';\nimport { VirtualScrollProxy } from './VirtualScrollProxy';\n\n/**\n * Custom ref handle returned by {@link VirtualGrid} that exposes imperative methods\n * \n * Use `React.useRef<VirtualGridProxy>(null)` to create a ref.\n */\nexport interface VirtualGridProxy {\n /**\n * Scrolls the list to the specified row and column in pixels\n */\n scrollTo(rowOffset?: number, columnOffset?: number): void;\n\n /**\n * Scrolls the list so that the specified item is visible\n * @param rowIndex - Row of item to scroll to\n * @param columnIndex - Column of item to scroll to\n * @param option - Where to {@link ScrollToOption | position} the item within the viewport\n */\n scrollToItem(rowIndex?: number, columnIndex?: number, option?: ScrollToOption): void;\n\n /** Exposes DOM clientWidth property */\n get clientWidth(): number;\n\n /** Exposes DOM clientHeight property */\n get clientHeight(): number;\n\n /** Current vertical position of scroll bar */\n get verticalOffset(): number;\n\n /** Current horizontal position of scroll bar */\n get horizontalOffset(): number;\n}\n\n/** Range to scroll to in one dimension specified as (offset,size). May be undefined if no need to scroll. */\nexport type ScrollRange = [ offset: number|undefined, size: number|undefined ];\n\n/**\n * Returns the {@link ScrollRange} corresponding to a specified item.\n * \n * Used internally to implement {@link VirtualGridProxy.scrollToItem}. Can be used directly for \n * advanced customization scenarios.\n */\nexport function getRangeToScroll(index: number | undefined, mapping: ItemOffsetMapping): ScrollRange {\n if (index === undefined)\n return [undefined, undefined];\n\n return [mapping.itemOffset(index), mapping.itemSize(index)];\n}\n\n/**\n * Same logic as {@link VirtualGridProxy.scrollToItem} usable with your own {@link VirtualScroll}\n * \n * You're encouraged to put together your own combination of {@link VirtualScroll} and {@link DisplayGrid} for\n * advanced customization scenarios. This function provides `ScrollToItem` functionality for use with your own {@link VirtualScroll}.\n */\nexport function virtualGridScrollToItem(scrollRef: React.RefObject<VirtualScrollProxy>, rowOffsetMapping: ItemOffsetMapping, \n columnOffsetMapping: ItemOffsetMapping, rowIndex?: number, columnIndex?: number, option?: ScrollToOption) {\n\n const scroll = scrollRef.current;\n /* istanbul ignore if */\n if (!scroll)\n return;\n\n const [rowOffset, rowSize] = getRangeToScroll(rowIndex, rowOffsetMapping);\n const [colOffset, colSize] = getRangeToScroll(columnIndex, columnOffsetMapping);\n\n scroll.scrollToArea(rowOffset, rowSize, colOffset, colSize, option);\n}\n","import React from \"react\";\nimport type { ItemOffsetMapping } from \"@candidstartup/infinisheet-types\";\nimport { VirtualBaseProps, ScrollToOption } from './VirtualBase';\nimport { DisplayGrid, DisplayGridItem } from './DisplayGrid';\nimport { VirtualContainerRender } from './VirtualContainer';\nimport { VirtualScroll } from './VirtualScroll';\nimport { VirtualScrollProxy } from './VirtualScrollProxy';\nimport { virtualGridScrollToItem, VirtualGridProxy } from './VirtualGridProxy';\nimport { AutoSizer } from './AutoSizer';\nimport { ScrollState } from './useVirtualScroll';\n\n/**\n * Props accepted by {@link VirtualGrid}\n */\nexport interface VirtualGridProps extends VirtualBaseProps {\n /** Component used as a template to render items in the grid. Must implement {@link DisplayGridItem} interface. */\n children: DisplayGridItem,\n\n /** Number of rows in the grid */\n rowCount: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each row in the grid\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n rowOffsetMapping: ItemOffsetMapping,\n\n /** Number of columns in the grid */\n columnCount: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each column in the grid\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n columnOffsetMapping: ItemOffsetMapping,\n\n /**\n * Function that defines the key to use for each item given row and column index and value of {@link VirtualBaseProps.itemData}.\n * @defaultValue `(rowIndex, columnIndex, _data) => '${rowIndex}:${columnIndex}'`\n */\n itemKey?: (rowIndex: number, columnIndex: number, data: unknown) => React.Key,\n\n /**\n * Callback after a scroll event has been processed and state updated but before rendering\n * @param rowOffset - Resulting overall row offset. Can be passed to {@link ItemOffsetMapping} to determine first row.\n * @param columnOffset - Resulting overall column offset. Can be passed to {@link ItemOffsetMapping} to determine first column.\n * @param newRowScrollState - New {@link ScrollState} for rows that will be used for rendering.\n * @param newColumnScrollState - New {@link ScrollState} for columns that will be used for rendering.\n */\n onScroll?: (rowOffset: number, columnOffset: number, newRowScrollState: ScrollState, newColumnScrollState: ScrollState) => void;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link VirtualGrid} outer container. */\n outerRender?: VirtualContainerRender;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link DisplayGrid} within {@link VirtualGrid} inner container. */\n innerRender?: VirtualContainerRender;\n}\n\n// Using a named function rather than => so that the name shows up in React Developer Tools\n/**\n * Virtual Scrolling Grid\n * \n * Accepts props defined by {@link VirtualGridProps}. \n * Refs are forwarded to {@link VirtualGridProxy}. \n * You must pass a single instance of {@link DisplayGridItem} as a child.\n * @group Components\n */\nexport const VirtualGrid = React.forwardRef<VirtualGridProxy, VirtualGridProps>(function VirtualGrid(props, ref) {\n const { rowCount, rowOffsetMapping, columnCount, columnOffsetMapping, children, \n innerClassName, innerRender, itemData, itemKey, onScroll: onScrollCallback, ...scrollProps } = props;\n\n // Total size is same as offset to item one off the end\n const totalRowSize = rowOffsetMapping.itemOffset(rowCount);\n const totalColumnSize = columnOffsetMapping.itemOffset(columnCount);\n\n const scrollRef = React.useRef<VirtualScrollProxy>(null);\n\n\n React.useImperativeHandle(ref, () => {\n return {\n scrollTo(rowOffset?: number, columnOffset?: number): void {\n const scroll = scrollRef.current;\n /* istanbul ignore else */\n if (scroll)\n scroll.scrollTo(rowOffset, columnOffset);\n },\n\n scrollToItem(rowIndex?: number, columnIndex?: number, option?: ScrollToOption): void {\n virtualGridScrollToItem(scrollRef, rowOffsetMapping, columnOffsetMapping, rowIndex, columnIndex, option);\n },\n\n get clientWidth(): number {\n return scrollRef.current ? scrollRef.current.clientWidth : /* istanbul ignore next */ 0;\n },\n\n get clientHeight(): number {\n return scrollRef.current ? scrollRef.current.clientHeight : /* istanbul ignore next */ 0;\n },\n\n get verticalOffset(): number {\n return scrollRef.current ? scrollRef.current.verticalOffset : /* istanbul ignore next */ 0;\n },\n\n get horizontalOffset(): number {\n return scrollRef.current ? scrollRef.current.horizontalOffset : /* istanbul ignore next */ 0;\n }\n }\n }, [ rowOffsetMapping, columnOffsetMapping ]);\n\n\n // We can decide the JSX child type at runtime as long as we use a variable that uses the same capitalized\n // naming convention as components do. \n const ChildVar = children;\n\n return (\n <VirtualScroll\n ref={scrollRef}\n {...scrollProps}\n scrollHeight={totalRowSize}\n scrollWidth={totalColumnSize}\n onScroll={(verticalOffset, horizontalOffset, verticalScrollState, horizontalScrollState) => {\n if (onScrollCallback)\n onScrollCallback(verticalOffset, horizontalOffset, verticalScrollState, horizontalScrollState);\n }}>\n {({ isScrolling, verticalOffset, horizontalOffset }) => (\n <AutoSizer style={{ height: '100%', width: '100%' }}>\n {({height,width}) => (\n <DisplayGrid\n innerClassName={innerClassName}\n innerRender={innerRender}\n rowOffset={verticalOffset}\n columnOffset={horizontalOffset}\n height={height}\n rowCount={rowCount}\n columnCount={columnCount}\n itemData={itemData}\n itemKey={itemKey}\n isScrolling={isScrolling}\n rowOffsetMapping={rowOffsetMapping}\n columnOffsetMapping={columnOffsetMapping}\n width={width}>\n {ChildVar}\n </DisplayGrid>\n )}\n </AutoSizer>\n )}\n </VirtualScroll>\n );\n});\n\nexport default VirtualGrid;\n","import type { ItemOffsetMapping } from \"@candidstartup/infinisheet-types\";\nimport { ScrollToOption } from './VirtualBase';\nimport { VirtualScrollProxy } from './VirtualScrollProxy';\n\n/**\n * Custom ref handle returned by {@link VirtualList} that exposes imperative methods\n * \n * Use `React.useRef<VirtualListProxy>(null)` to create a ref.\n */\nexport interface VirtualListProxy {\n /**\n * Scrolls the list to the specified offset in pixels\n * @param offset - Offset to scroll to\n */\n scrollTo(offset: number): void;\n\n /**\n * Scrolls the list so that the specified item is visible\n * @param index - Index of item to scroll to\n * @param option - Where to {@link ScrollToOption | position} the item within the viewport\n */\n scrollToItem(index: number, option?: ScrollToOption): void;\n\n /** Current scroll position */\n get offset(): number;\n}\n\n/**\n * Same logic as {@link VirtualListProxy.scrollToItem} usable with your own {@link VirtualScroll}\n * \n * You're encouraged to put together your own combination of {@link VirtualScroll} and {@link DisplayList} for\n * advanced customization scenarios. This function provides `ScrollToItem` functionality for use with your own {@link VirtualScroll}.\n */\nexport function virtualListScrollToItem(scrollRef: React.RefObject<VirtualScrollProxy>, itemOffsetMapping: ItemOffsetMapping, isVertical: boolean,\n index: number, option?: ScrollToOption) {\n\n const scroll = scrollRef.current;\n /* istanbul ignore if */\n if (!scroll)\n return;\n\n const itemOffset = itemOffsetMapping.itemOffset(index);\n const itemSize = itemOffsetMapping.itemSize(index);\n\n if (isVertical)\n scroll.scrollToArea(itemOffset, itemSize, undefined, undefined, option);\n else\n scroll.scrollToArea(undefined, undefined, itemOffset, itemSize, option);\n}","import React from \"react\";\nimport type { ItemOffsetMapping } from \"@candidstartup/infinisheet-types\";\nimport { VirtualBaseProps, ScrollToOption, ScrollLayout } from './VirtualBase';\nimport { DisplayList, DisplayListItem } from './DisplayList';\nimport { VirtualContainerRender } from './VirtualContainer';\nimport { VirtualScroll } from './VirtualScroll';\nimport { VirtualScrollProxy } from './VirtualScrollProxy';\nimport { virtualListScrollToItem, VirtualListProxy } from './VirtualListProxy';\nimport { AutoSizer } from './AutoSizer';\nimport { ScrollState } from './useVirtualScroll';\n\n/**\n * Props accepted by {@link VirtualList}\n */\nexport interface VirtualListProps extends VirtualBaseProps {\n /** Component used as a template to render items in the list. Must implement {@link DisplayListItem} interface. */\n children: DisplayListItem,\n\n /** Number of items in the list */\n itemCount: number,\n\n /** \n * Implementation of {@link ItemOffsetMapping} interface that defines size and offset to each item in the list\n * \n * Use {@link useFixedSizeItemOffsetMapping} or {@link useVariableSizeItemOffsetMapping} to create implementations\n * for common cases.\n */\n itemOffsetMapping: ItemOffsetMapping,\n\n /**\n * Function that defines the key to use for each item given item index and value of {@link VirtualBaseProps.itemData}.\n * @defaultValue `(index, _data) => index`\n */\n itemKey?: (index: number, data: unknown) => React.Key,\n\n /**\n * Choice of 'vertical' or 'horizontal' layouts\n * @defaultValue 'vertical'\n */\n layout?: ScrollLayout,\n\n /**\n * Callback after a scroll event has been processed and state updated but before rendering\n * @param offset - Resulting overall offset. Can be passed to {@link ItemOffsetMapping} to determine top item.\n * @param newScrollState - New {@link ScrollState} that will be used for rendering.\n */\n onScroll?: (offset: number, newScrollState: ScrollState) => void;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link VirtualList} outer container. */\n outerRender?: VirtualContainerRender;\n\n /** Render prop implementing {@link VirtualContainerRender}. Used to customize {@link DisplayList} within {@link VirtualList} inner container. */\n innerRender?: VirtualContainerRender;\n}\n\n\n\n// Using a named function rather than => so that the name shows up in React Developer Tools\n/**\n * Virtual Scrolling List\n * \n * Accepts props defined by {@link VirtualListProps}. \n * Refs are forwarded to {@link VirtualListProxy}. \n * You must pass a single instance of {@link DisplayListItem} as a child.\n * @group Components\n */\nexport const VirtualList = React.forwardRef<VirtualListProxy, VirtualListProps>(function VirtualList(props, ref) {\n const { itemCount, itemOffsetMapping, children, layout = 'vertical', onScroll: onScrollCallback,\n innerClassName, innerRender, itemData, itemKey, ...scrollProps } = props;\n\n // Total size is same as offset to item one off the end\n const renderSize = itemOffsetMapping.itemOffset(itemCount);\n\n const scrollRef = React.useRef<VirtualScrollProxy>(null);\n const isVertical = layout === 'vertical';\n\n React.useImperativeHandle(ref, () => {\n return {\n scrollTo(offset: number): void {\n const scroll = scrollRef.current;\n /* istanbul ignore if */\n if (!scroll)\n return;\n\n if (isVertical)\n scroll.scrollTo(offset, undefined);\n else\n scroll.scrollTo(undefined, offset);\n },\n\n scrollToItem(index: number, option?: ScrollToOption): void {\n virtualListScrollToItem(scrollRef, itemOffsetMapping, isVertical, index, option);\n },\n\n get offset(): number {\n const scroll = scrollRef.current;\n /* istanbul ignore if */\n if (!scroll)\n return 0;\n\n return isVertical ? scroll.verticalOffset : scroll.horizontalOffset;\n }\n }\n }, [ itemOffsetMapping, isVertical ]);\n\n // We can decide the JSX child type at runtime as long as we use a variable that uses the same capitalized\n // naming convention as components do.\n const ChildVar = children;\n\n return (\n <VirtualScroll\n ref={scrollRef}\n {...scrollProps}\n scrollHeight={isVertical ? renderSize : undefined}\n scrollWidth={isVertical ? undefined : renderSize}\n onScroll={(verticalOffset, horizontalOffset, verticalScrollState, horizontalScrollState) => {\n const newOffset = isVertical ? verticalOffset : horizontalOffset;\n if (onScrollCallback)\n onScrollCallback(newOffset, isVertical ? verticalScrollState : horizontalScrollState);\n }}>\n {({ isScrolling, verticalOffset, horizontalOffset }) => (\n <AutoSizer style={{ height: '100%', width: '100%' }}>\n {({height,width}) => (\n <DisplayList\n innerClassName={innerClassName}\n innerRender={innerRender}\n layout={layout}\n offset={isVertical ? verticalOffset : horizontalOffset}\n height={height}\n itemCount={itemCount}\n itemData={itemData}\n itemKey={itemKey}\n isScrolling={isScrolling}\n itemOffsetMapping={itemOffsetMapping}\n width={width}>\n {ChildVar}\n </DisplayList>\n )}\n </AutoSizer>\n )}\n </VirtualScroll>\n );\n});\n\nexport default VirtualList;\n","import { ItemOffsetMapping, FixedSizeItemOffsetMapping } from '@candidstartup/infinisheet-types';\nexport type { ItemOffsetMapping } from '@candidstartup/infinisheet-types';\n\n/**\n * Returns an instance of {@link ItemOffsetMapping} suitable for use when all items have a fixed size.\n * \n * @param itemSize - Size to use for all items\n */\nexport function useFixedSizeItemOffsetMapping(itemSize: number): ItemOffsetMapping {\n return new FixedSizeItemOffsetMapping(itemSize);\n}\n\nexport default useFixedSizeItemOffsetMapping;\n","import { ItemOffsetMapping, VariableSizeItemOffsetMapping } from '@candidstartup/infinisheet-types';\nexport type { ItemOffsetMapping } from '@candidstartup/infinisheet-types';\n\n/**\n * Returns an instance of {@link ItemOffsetMapping}\n * suitable for use when initial items have variable sizes.\n * \n * @param defaultItemSize - Size to use for all other items\n * @param sizes - Array of sizes to use for the initial items, one size per item\n */\nexport function useVariableSizeItemOffsetMapping(defaultItemSize: number, sizes?: number[]): ItemOffsetMapping {\n return new VariableSizeItemOffsetMapping(defaultItemSize, sizes || []);\n}\n\nexport default useVariableSizeItemOffsetMapping;\n"],"names":["_jsx","useIsScrolling","useIsScrollingHook","_jsxs","defaultItemKey","boxStyle"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@candidstartup/react-virtual-scroll",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.7.0",
|
|
5
5
|
"description": "Modern React components for lists and grids that scale to trillions of rows and columns",
|
|
6
6
|
"author": "Tim Wiegand <tim.wiegand@thecandidstartup.org>",
|
|
7
7
|
"license": "BSD-3-Clause",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
"table",
|
|
27
27
|
"grid",
|
|
28
28
|
"modern",
|
|
29
|
-
"scalable"
|
|
29
|
+
"scalable",
|
|
30
|
+
"infinisheet"
|
|
30
31
|
],
|
|
31
32
|
"publishConfig": {
|
|
32
33
|
"access": "public"
|
|
@@ -47,6 +48,7 @@
|
|
|
47
48
|
"dev": "vite",
|
|
48
49
|
"clean": "rimraf {dist,temp}",
|
|
49
50
|
"prebuild": "npm run clean",
|
|
51
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
50
52
|
"build-tsc": "tsc -p tsconfig.build.json",
|
|
51
53
|
"build-rollup": "rollup -c ../rollup.config.mjs",
|
|
52
54
|
"build": "npm run build-rollup",
|
|
@@ -59,5 +61,8 @@
|
|
|
59
61
|
"peerDependencies": {
|
|
60
62
|
"react": "^18.2.0"
|
|
61
63
|
},
|
|
62
|
-
"
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"@candidstartup/infinisheet-types": "^0.7.0"
|
|
66
|
+
},
|
|
67
|
+
"gitHead": "5ea8ee7cef0e539dd15b844bd074a745d08b6ba6"
|
|
63
68
|
}
|