@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 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 CodeSandbox](https://codesandbox.io/p/sandbox/github/TheCandidStartup/infinisheet/main/packages/react-virtual-scroll/sandboxes/trillion-row-list?file=%2Findex.js)
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 { VirtualList, useVariableSizeItemOffsetMapping, useFixedSizeItemOffsetMapping } from '@candidstartup/react-virtual-scroll';
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 CodeSandbox](https://codesandbox.io/p/sandbox/github/TheCandidStartup/infinisheet/main/packages/react-virtual-scroll/sandboxes/trillion-square-grid?file=%2Findex.js)
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. Overall offset is `scrollOffset+renderOffset`. */
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 container in {@link VirtualScroll}
259
+ * Render prop for content in {@link VirtualScroll}
271
260
  *
272
- * Pass to {@link VirtualScroll} to render content into the viewport
273
- * implementation. Function must render a div and forward {@link VirtualContentProps}
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 Minimal compliant implementation
264
+ * @example Simple implementation
277
265
  * ```
278
- * const contentRender: VirtualContentRender = ({isScrolling, ...rest}, ref) => (
279
- * <div ref={ref} {...rest} />
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 `innerRender` to render scroll state specific content into the viewport
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} suitable for use when initial items have variable sizes.
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 ItemOffsetMapping, 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 };
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, createRef, useRef, useEffect, Fragment } from 'react';
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
- function useVirtualScroll(totalSize, maxCssSize = MAX_SUPPORTED_CSS_SIZE, minNumberPages = MIN_NUMBER_PAGES) {
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 [scrollState, setScrollState] = useState(initValue);
105
+ const [totalOffset, setTotalOffset] = useState(0);
106
+ const scrollState = useRef(initValue);
104
107
  function onScroll(clientExtent, scrollExtent, scrollOffset) {
105
- if (scrollState.scrollOffset == scrollOffset) {
108
+ const currState = scrollState.current;
109
+ if (currState.scrollOffset == scrollOffset) {
106
110
  // No need to change state if scroll position unchanged
107
- return [scrollOffset, scrollState];
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 = scrollState.scrollOffset <= newOffset ? 'forward' : 'backward';
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 - scrollState.scrollOffset);
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 + scrollState.renderOffset) / pageSize));
123
+ newPage = Math.min(numPages - 1, Math.floor((scrollOffset + currState.renderOffset) / pageSize));
120
124
  newRenderOffset = pageToRenderOffset(newPage);
121
- if (newPage != scrollState.page) {
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 + scrollState.renderOffset - newRenderOffset;
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
- setScrollState(newScrollState);
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 = (scrollState.scrollOffset + scrollState.renderOffset) <= safeOffset ? 'forward' : 'backward';
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
- setScrollState({ scrollOffset, renderOffset, page, scrollDirection });
160
+ scrollState.current = { scrollOffset, renderOffset, page, scrollDirection };
161
+ if (useTotalOffset)
162
+ setTotalOffset(scrollOffset + renderOffset);
154
163
  return scrollOffset;
155
164
  }
156
- return { ...scrollState, renderSize, onScroll, doScrollTo };
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 `innerRender` to render scroll state specific content into the viewport
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 { scrollOffset: scrollRowOffset, renderOffset: renderRowOffset, renderSize: renderRowSize, onScroll: onScrollRow, doScrollTo: doScrollToRow } = useVirtualScroll(scrollHeight, props.maxCssSize, props.minNumPages);
290
- const currentVerticalOffset = scrollRowOffset + renderRowOffset;
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} suitable for use when initial items have variable sizes.
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":";;;AAiCA,MAAM,sBAAsB,GAA2B,CAAC,EAAC,GAAG,IAAI,EAAC,EAAE,GAAG,MACpEA,aAAK,GAAG,EAAE,GAAG,EAAM,GAAA,IAAI,EAAI,CAAA,CAC5B;AAED;;;;;AAKG;MACU,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAC9C,SAAS,gBAAgB,CAAC,EAAC,MAAM,GAAG,sBAAsB,EAAE,GAAG,IAAI,EAAC,EAAE,GAAG,EAAA;AACvE,IAAA,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;AAC5B,CAAC;;ACJD;;;;;;;;AAQG;AACG,SAAU,SAAS,CAAC,KAAqB,EAAA;IAC7C,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK;;;AAI5C,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAS,CAAC,CAAC;AACnD,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAS,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC;;;IAI9C,MAAM,cAAc,GAA2B,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,KAAI;AAC3E,QAAA,OAAO,CAAC,OAAO,CAAC,KAAK,IAAG;;;;AAItB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YAC/D,QAAQ,CAAC,QAAQ,CAAC;AAClB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9D,SAAS,CAAC,SAAS,CAAC;AACtB,SAAC,CAAC;KACH,EAAE,EAAE,CAAC;;AAGN,IAAA,KAAK,CAAC,eAAe,CAAC,MAAK;AACzB,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO;;AAEvB,QAAA,IAAI,CAAC,GAAG;YACN;;AAGF,QAAA,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;AAC3B,QAAA,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;;;;AAKzB,QAAA,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;AACzC,YAAA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,cAAc,CAAC;AACzD,YAAA,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC;YAC3B,OAAO,MAAK,EAAG,cAAc,CAAC,UAAU,EAAE,CAAA,EAAE;;AAEhD,KAAC,EAAE,CAAC,cAAc,CAAC,CAAC;;IAGpB,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;;;;;;IAO9C,QACEA,aAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,YAC/CA,GAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAA,QAAA,EACvD,cAAc,IAAI,QAAQ,CAAC,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC,EACtC,CAAA,EAAA,CACF;AAEV;;AC9EA;AACA;AACA;AACA,MAAM,sBAAsB,GAAG,OAAO;AACtC,MAAM,gBAAgB,GAAG,GAAG;AAEtB,SAAU,gBAAgB,CAAC,SAAiB,EAAE,UAAU,GAAG,sBAAsB,EAAE,cAAc,GAAG,gBAAgB,EAAA;IACxH,IAAI,UAAU,GAAC,CAAC,EAAE,QAAQ,GAAC,CAAC,EAAE,QAAQ,GAAC,CAAC;AACxC,IAAA,IAAI,SAAS,GAAG,UAAU,EAAE;;AAE1B,QAAA,UAAU,GAAG,QAAQ,GAAG,SAAS;QACjC,QAAQ,GAAG,CAAC;;SACP;;QAEL,UAAU,GAAG,UAAU;AACvB,QAAA,QAAQ,GAAG,UAAU,GAAG,cAAc;QACtC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC;;IAG7C,SAAS,kBAAkB,CAAC,IAAY,EAAA;QACtC,IAAI,IAAI,IAAI,CAAC;AACX,YAAA,OAAO,CAAC;AAEV,QAAA,IAAI,IAAI,IAAI,QAAQ,GAAC,CAAC;YACpB,OAAO,SAAS,GAAG,UAAU;QAE/B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAC,CAAC,KAAK,SAAS,GAAG,UAAU,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;;AAGzE,IAAA,MAAM,SAAS,GAAgB;AAC7B,QAAA,YAAY,EAAE,CAAC;AACf,QAAA,YAAY,EAAE,CAAC;AACf,QAAA,IAAI,EAAE,CAAC;AACP,QAAA,eAAe,EAAE,SAAS;KAC3B;IACD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC;AAEzD,IAAA,SAAS,QAAQ,CAAC,YAAoB,EAAE,YAAoB,EAAE,YAAoB,EAAA;AAChF,QAAA,IAAI,WAAW,CAAC,YAAY,IAAI,YAAY,EAAE;;AAE5C,YAAA,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC;;;AAIpC,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY,CAAC,CAAC;AAChF,QAAA,MAAM,kBAAkB,GAAG,WAAW,CAAC,YAAY,IAAI,SAAS,GAAG,SAAS,GAAG,UAAU;;QAGzF,IAAI,OAAO,EAAE,eAAe;QAC5B,IAAI,eAAe,GAAG,YAAY;AAClC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC;AACjE,QAAA,IAAI,UAAU,GAAG,YAAY,EAAE;;;YAG7B,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC;AAClG,YAAA,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC;AAC7C,YAAA,IAAI,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE;;;gBAG/B,SAAS,GAAG,YAAY,GAAG,WAAW,CAAC,YAAY,GAAG,eAAe;gBACrE,eAAe,GAAG,SAAS;;;aAExB;;;AAGL,YAAA,IAAI,SAAS,GAAG,QAAQ,EAAE;gBACxB,OAAO,GAAG,CAAC;;AACN,iBAAA,IAAI,SAAS,IAAI,UAAU,GAAG,QAAQ,EAAE;AAC7C,gBAAA,OAAO,GAAG,QAAQ,GAAG,CAAC;;iBACjB;AACL,gBAAA,MAAM,WAAW,GAAG,CAAC,SAAS,GAAG,QAAQ,GAAC,CAAC,KAAK,UAAU,GAAG,QAAQ,GAAC,CAAC,CAAC;gBACxE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,QAAQ,IAAI,WAAW,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC;;AAEnG,YAAA,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC;;AAG/C,QAAA,MAAM,cAAc,GAClB,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE;QAChH,cAAc,CAAC,cAAc,CAAC;AAC9B,QAAA,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC;;AAG1C,IAAA,SAAS,UAAU,CAAC,MAAc,EAAE,YAAoB,EAAA;AACtD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,eAAe,GAAG,CAAC,WAAW,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,KAAK,UAAU,GAAG,SAAS,GAAG,UAAU;AACpH,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;AACtE,QAAA,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC;AAC7C,QAAA,MAAM,YAAY,GAAG,UAAU,GAAG,YAAY;QAE9C,cAAc,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AACrE,QAAA,OAAO,YAAY;;IAGrB,OAAO,EAAC,GAAG,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAU;AACpE;;AC9HA;AACA;AAYA,SAAS,UAAU,CAAC,OAA0C,EAAA;AAC5D,IAAA,OAAQ,OAAoB,CAAC,gBAAgB,KAAK,SAAS;AAC7D;AAIM,SAAU,gBAAgB,CAAE,SAAiB,EACjB,OAAqB,EACrB,OAAoD,GAAA,MAAM,EAC1D,OAAA,GAAmB,EAAE,EAAA;AACrD,IAAA,MAAM,YAAY,GAAG,MAAM,EAAgB;IAC3C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO;IAE1C,SAAS,CAAC,MAAK;AACb,QAAA,YAAY,CAAC,OAAO,GAAG,OAAO;AAChC,KAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAEb,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,OAAO;YACV;AAEF,QAAA,MAAM,EAAE,GAAI,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO;AAC3D,QAAA,IAAI,CAAC,EAAE;YACL;AAEF,QAAA,MAAM,aAAa,GAAG,CAAC,KAAY,KAAK,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;QACrE,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;QACvC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC;AACnD,QAAA,OAAO,MAAK;YACV,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC;AACxD,SAAC;AACH,KAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAClD;AAIA;AACA,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM;AACzC,IAAA,EAAE,CAAC,YAAY,EAAE,MAAK;QACpB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,QAAA,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5D,QAAA,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7C,KAAC,CAAC;AACJ;;AC1DA;AACA;AACA;AACA;AACA;AACA;SAKgB,mBAAmB,CAAC,QAAkB,EAAE,KAAoB,EAAE,GAAa,EAAA;AACzF,IAAA,MAAM,UAAU,GAAG,MAAM,EAAU;AACnC,IAAA,MAAM,aAAa,GAAG,MAAM,CAAW,QAAQ,CAAC;;IAGhD,SAAS,CAAC,MAAK;AACb,QAAA,aAAa,CAAC,OAAO,GAAG,QAAQ;AAClC,KAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AAEd,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;IAE/B,SAAS,CAAC,MAAK;AACb,QAAA,SAAS,IAAI,GAAA;AACX,YAAA,UAAU,CAAC,OAAO,GAAG,SAAS;YAC9B,IAAI,KAAK,KAAK,IAAI;gBAChB;YAEF,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,KAAK,EAAE;gBACtC,aAAa,CAAC,OAAO,EAAE;;iBAClB;AACL,gBAAA,UAAU,CAAC,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC;;;AAIpD,QAAA,IAAI,EAAE;AAEN,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,EAAE;AAC1C,gBAAA,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC;AACxC,gBAAA,UAAU,CAAC,OAAO,GAAG,SAAS;;AAElC,SAAC;KACF,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AACzB;;ACvCA,MAAM,iBAAiB,GAAG,GAAG;AAC7B,MAAM,iBAAiB,GAAG,GAAG;AAEb,SAAA,cAAc,CAAC,OAAA,GAAgE,MAAM,EAAA;IACnG,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;;;;;AAMjD,IAAA,MAAM,iBAAiB,IAAI,aAAa,IAAI,MAAM,CAAC;IACnD,MAAM,KAAK,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB;AAEvE,IAAA,gBAAgB,CAAC,QAAQ,EAAE,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IACrE,gBAAgB,CAAC,WAAW,EAAE,MAAM,cAAc,CAAC,CAAC,CAAC,EAAE,iBAAiB,GAAG,OAAO,GAAG,IAAI,CAAC;IAC1F,mBAAmB,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,WAAW,CAAC;IAE5F,OAAO,WAAW,GAAG,CAAC;AACxB;;ACYA;;;;;AAKG;AACG,SAAU,sBAAsB,CAAC,MAA0B,EAAE,IAAwB,EACzF,YAAoB,EAAE,YAAoB,EAAE,MAAuB,EAAA;IAEnE,IAAI,MAAM,KAAK,SAAS;AACtB,QAAA,OAAO,SAAS;IAElB,IAAI,MAAM,IAAI,SAAS;AACrB,QAAA,OAAO,MAAM;;IAGf,IAAI,MAAM,GAAG,YAAY;AACvB,QAAA,OAAO,MAAM;AAEf,IAAA,IAAI,GAAG,IAAI,IAAI,CAAC;;AAGhB,IAAA,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI;AAC/B,IAAA,MAAM,WAAW,GAAG,YAAY,GAAG,YAAY;IAC/C,IAAI,SAAS,IAAI,WAAW;AAC1B,QAAA,OAAO,SAAS;;;IAKlB,IAAI,IAAI,GAAG,YAAY;AACrB,QAAA,OAAO,MAAM;;AAGf,IAAA,OAAO,MAAM,GAAG,YAAY,GAAG,IAAI;AACpC;;ACSD;AACA;;;;;;;;;AASG;AACI,MAAM,aAAa,GAAG,KAAK,CAAC,UAAU,CAAyC,SAAS,aAAa,CAAC,KAAK,EAAE,GAAG,EAAA;AACrH,IAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAC3F,QAAQ,EAAE,gBAAgB,kBAAEC,gBAAc,GAAG,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,KAAK;IAExF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC;AACnD,IAAA,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAC7F,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC;AAC1H,IAAA,MAAM,qBAAqB,GAAG,eAAe,GAAG,eAAe;AAC/D,IAAA,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAChG,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC;AAC9H,IAAA,MAAM,uBAAuB,GAAG,eAAe,GAAG,eAAe;AACjE,IAAA,MAAM,mBAAmB,GAAGC,cAAkB,CAAC,QAAQ,CAAC;AAExD,IAAA,KAAK,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAK;QAClC,OAAO;YACL,QAAQ,CAAC,SAAkB,EAAE,YAAqB,EAAA;AAChD,gBAAA,IAAI,SAAS,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS;oBACvD;AAEF,gBAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO;;gBAE9B,IAAI,KAAK,EAAE;oBACT,MAAM,OAAO,GAAoB,EAAE;oBACnC,IAAI,SAAS,IAAI,SAAS;wBACxB,OAAO,CAAC,GAAG,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC;oBAC5D,IAAI,YAAY,IAAI,SAAS;wBAC3B,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC;AAClE,oBAAA,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;;aAE1B;YAED,YAAY,CAAC,cAAuB,EAAE,YAAqB,EAAE,gBAAyB,EAAE,cAAuB,EAAE,MAAuB,EAAA;AACtI,gBAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO;;AAE9B,gBAAA,IAAI,CAAC,KAAK;oBACR;AAEF,gBAAA,MAAM,SAAS,GAAG,sBAAsB,CAAC,cAAc,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,qBAAqB,EAAE,MAAM,CAAC;AACzH,gBAAA,MAAM,SAAS,GAAG,sBAAsB,CAAC,gBAAgB,EAAE,cAAc,EAAE,KAAK,CAAC,WAAW,EAAE,uBAAuB,EAAE,MAAM,CAAC;AAC9H,gBAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;aACpC;AAED,YAAA,IAAI,WAAW,GAAA;AACb,gBAAA,OAAO,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,8BAA8B,CAAC;aACtF;AAED,YAAA,IAAI,YAAY,GAAA;AACd,gBAAA,OAAO,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,8BAA8B,CAAC;;SAEzF;KACF,EAAE,CAAE,aAAa,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,uBAAuB,CAAE,CAAC;IAEvF,SAAS,QAAQ,CAAC,KAAkB,EAAA;AAClC,QAAA,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,aAAa;AAC3G,QAAA,MAAM,CAAC,YAAY,EAAE,iBAAiB,CAAC,GAAG,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,SAAS,CAAC;AAC5F,QAAA,MAAM,CAAC,aAAa,EAAE,oBAAoB,CAAC,GAAG,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC;AAClG,QAAA,IAAI,QAAQ,CAAC,OAAO,KAAK,YAAY,IAAI,SAAS,IAAI,aAAa,IAAI,UAAU,CAAE;YACjF,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC;QACxD,gBAAgB,GAAG,iBAAiB,CAAC,YAAY,GAAC,iBAAiB,CAAC,YAAY,EAC9E,oBAAoB,CAAC,YAAY,GAAC,oBAAoB,CAAC,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,CAAC;;IAGjH,MAAM,WAAW,GAAGD,gBAAc,GAAG,mBAAmB,GAAG,SAAS;IACpE,MAAM,cAAc,GAAG,qBAAqB;IAC5C,MAAM,gBAAgB,GAAG,uBAAuB;IAEhD,QACEE,KAAC,gBAAgB,EAAA,EAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAC1F,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,EAC3F,QAAA,EAAA,CAAAH,GAAA,CAAC,gBAAgB,EAAA,EAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAC9D,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAA,QAAA,EACvF,QAAQ,CAAC,EAAC,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAC,CAAC,EACzC,CAAA,EACnBA,GAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;oBACjD,MAAM,EAAE,YAAY,GAAG,aAAa,GAAG,MAAM;AAC7C,oBAAA,KAAK,EAAE,WAAW,GAAG,gBAAgB,GAAG,MAAM,EAAC,EAAG,CAAA,CAAA,EAAA,CACnC;AAEvB,CAAC;;AC9JK,SAAU,gBAAgB,CAAC,SAAiB,EAAE,iBAAoC,EAAE,YAAoB,EAAE,YAAoB,EAAA;AAClI,IAAA,IAAI,SAAS,IAAI,CAAC,EAAE;QAClB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;;AAItB,IAAA,IAAI,YAAY,GAAG,CAAC,EAAE;QACpB,YAAY,IAAI,YAAY;QAC5B,YAAY,GAAG,CAAC;;AAGlB,IAAA,IAAI,YAAY,IAAI,CAAC,EAAE;QACrB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;AAGtB,IAAA,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,iBAAiB,CAAC,YAAY,CAAC,YAAY,CAAC;AAC7E,IAAA,IAAI,SAAS,IAAI,SAAS,EAAE;QAC1B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;AAGtB,IAAA,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;AAC/D,IAAA,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY;IAE7C,MAAM,UAAU,GAAG,SAAS;IAC5B,IAAI,MAAM,GAAG,WAAW;IACxB,MAAM,KAAK,GAAa,EAAE;IAC1B,IAAI,SAAS,GAAG,CAAC;IAEjB,OAAO,MAAM,GAAG,SAAS,IAAI,SAAS,GAAG,SAAS,EAAE;QAClD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC;AAClD,QAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAChB,SAAS,IAAI,IAAI;QACjB,MAAM,IAAI,IAAI;AACd,QAAA,SAAS,EAAG;;IAGd,OAAO,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC;AACpD;AAEA,SAAS,YAAY,CAAC,MAAc,EAAE,IAAY,EAAA;AAChD,IAAA,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAA,EAAG,IAAI,CAAI,EAAA,CAAA,GAAG,CAAA,OAAA,EAAU,MAAM,CAAI,CAAA,EAAA,IAAI,KAAK;AACpE;AAEA,SAAS,IAAI,CAAC,CAAmB,EAAE,CAAS,EAAA;AAC1C,IAAA,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AAC5B;AAEM,SAAU,eAAe,CAAC,KAAe,EAAA;AAC7C,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM;IAC1B,IAAI,KAAK,IAAI,CAAC;AACZ,QAAA,OAAO,SAAS;IAElB,IAAI,GAAG,GAAG,SAAS;AACnB,IAAA,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;IACvB,IAAI,MAAM,GAAG,CAAC;AAEd,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAG,EAAE;AAC/B,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,IAAI,IAAI,QAAQ,EAAE;AACpB,YAAA,MAAM,EAAG;;aACJ;YACL,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;AACxC,YAAA,GAAG,GAAG,IAAI,CAAC,GAAG,EAAC,CAAC,CAAC;YACjB,QAAQ,GAAG,IAAI;YACf,MAAM,GAAG,CAAC;;;IAId,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;AACxC,IAAA,OAAO,IAAI,CAAC,GAAG,EAAC,CAAC,CAAC;AACpB;;ACdA,MAAMI,gBAAc,GAAG,CAAC,KAAa,EAAE,KAAc,KAAK,KAAK;AAE/D,MAAMC,UAAQ,GAAwB,EAAE,SAAS,EAAE,YAAY,EAAE;AAEjE;;;;;;AAMG;AACG,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAC5G,QAAQ,EAAE,OAAO,GAAGD,gBAAc,EAAE,MAAM,GAAG,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,KAAK;AAE1G,IAAA,MAAM,UAAU,GAAG,MAAM,KAAK,UAAU;AAExC,IAAA,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,EAChG,UAAU,GAAG,MAAM,GAAG,KAAK,EAAE,YAAY,CAAC;AAC5C,IAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC;AACvC,IAAA,MAAM,MAAM,GAAG,WAAW,GAAG,YAAY;;;IAIzC,MAAM,QAAQ,GAAG,QAAQ;IAEzB,QACCJ,IAAC,gBAAgB,EAAA,EAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EACtD,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,EAC5F,QAAA,EAAAA,GAAA,CAAC,gBAAgB,EAAA,EAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAC/D,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU;AAC3B,gBAAA,OAAO,EAAE,MAAM;gBACf,mBAAmB,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ;gBACtD,gBAAgB,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS;gBACnD,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,CAAC;gBAC5B,IAAI,EAAE,UAAU,GAAG,CAAC,GAAG,MAAM;gBAC7B,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM;gBACxC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,EAAE,EAC1C,QAAA,EAAA,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,MAC3BA,GAAA,CAAC,QAAQ,EAAA,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EACC,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,KAAK,EAAEK,UAAQ,EAAA,EAA3F,OAAO,CAAC,UAAU,GAAG,UAAU,EAAE,QAAQ,CAAC,CAAoD,CACtG,CAAC,EAAA,CACe,EACF,CAAA;AAEvB;;AC/BA,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,WAAmB,EAAE,KAAc,KAAK,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,WAAW,EAAE;AAE9G,MAAM,QAAQ,GAAwB,EAAE,SAAS,EAAE,YAAY,EAAE;AAEjE;;;;;;AAMG;AACG,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,SAAS,EAAE,cAAc,EAC5G,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EACnE,QAAQ,EAAE,OAAO,GAAG,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,KAAK;IAErF,MAAM,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,CAAC,GAAG,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,eAAe,CAAC;AACtI,IAAA,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC;IAE7C,MAAM,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,CAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,mBAAmB,EAAE,KAAK,EAAE,eAAe,CAAC;AAC3I,IAAA,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC;AAE7C,IAAA,MAAM,SAAS,GAAG,cAAc,GAAG,eAAe;AAClD,IAAA,MAAM,SAAS,GAAG,cAAc,GAAG,eAAe;;;IAIlD,MAAM,QAAQ,GAAG,QAAQ;IAEzB,QACCL,IAAC,gBAAgB,EAAA,EAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EACtD,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,EAC5F,QAAA,EAAAA,GAAA,CAAC,gBAAgB,EAAA,EAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAC/D,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU;AAC3B,gBAAA,OAAO,EAAE,MAAM;AACf,gBAAA,mBAAmB,EAAE,WAAW;AAChC,gBAAA,gBAAgB,EAAE,WAAW;AAC7B,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,MAAM,EAAE,aAAa;AACrB,gBAAA,KAAK,EAAE,aAAa,EAAE,YACvB,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,MAC/BA,GAAC,CAAA,QAAQ,cACR,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,MAC5BA,GAAC,CAAA,QAAQ,IAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAEhD,QAAQ,EAAE,aAAa,GAAG,QAAQ,EAAE,WAAW,EAAE,aAAa,GAAG,QAAQ,EAAE,KAAK,EAAE,QAAQ,EADrF,EAAA,OAAO,CAAC,aAAa,GAAG,QAAQ,EAAE,aAAa,GAAG,QAAQ,EAAE,QAAQ,CAAC,CACmB,CAChG,CAAC,EAAA,EALa,OAAO,CAAC,aAAa,GAAG,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,CAMlD,CACZ,CAAC,EACe,CAAA,EAAA,CACF;AAEvB;;ACpGA;;;;;AAKG;AACa,SAAA,gBAAgB,CAAC,KAAyB,EAAE,OAA0B,EAAA;IACpF,IAAI,KAAK,KAAK,SAAS;AACrB,QAAA,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;AAE/B,IAAA,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7D;AAEA;;;;;AAKG;AACa,SAAA,uBAAuB,CAAC,SAA8C,EAAE,gBAAmC,EACzH,mBAAsC,EAAE,QAAiB,EAAE,WAAoB,EAAE,MAAuB,EAAA;AAExG,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO;;AAEhC,IAAA,IAAI,CAAC,MAAM;QACT;AAEF,IAAA,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,CAAC;AACzE,IAAA,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,mBAAmB,CAAC;AAE/E,IAAA,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC;AACrE;;ACCA;AACA;;;;;;;AAOG;AACI,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAqC,SAAS,WAAW,CAAC,KAAK,EAAE,GAAG,EAAA;AAC7G,IAAA,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAC5E,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK;;IAGtG,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC1D,MAAM,eAAe,GAAG,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC;IAEnE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAqB,IAAI,CAAC;AAGxD,IAAA,KAAK,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAK;QAClC,OAAO;YACL,QAAQ,CAAC,SAAkB,EAAE,YAAqB,EAAA;AAChD,gBAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO;;AAEhC,gBAAA,IAAI,MAAM;AACR,oBAAA,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;aAC3C;AAED,YAAA,YAAY,CAAC,QAAiB,EAAE,WAAoB,EAAE,MAAuB,EAAA;AAC3E,gBAAA,uBAAuB,CAAC,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC;aACzG;AAED,YAAA,IAAI,WAAW,GAAA;AACb,gBAAA,OAAO,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,8BAA8B,CAAC;aACxF;AAED,YAAA,IAAI,YAAY,GAAA;AACd,gBAAA,OAAO,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,8BAA8B,CAAC;;SAE3F;AACH,KAAC,EAAE,CAAE,gBAAgB,EAAE,mBAAmB,CAAE,CAAC;;;IAK7C,MAAM,QAAQ,GAAG,QAAQ;AAEzB,IAAA,QACEA,GAAA,CAAC,aAAa,EAAA,EACZ,GAAG,EAAE,SAAS,EAAA,GACV,WAAW,EACf,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,CAAC,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,KAAI;AACzF,YAAA,IAAI,gBAAgB;gBAClB,gBAAgB,CAAC,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,CAAC;SACjG,EAAA,QAAA,EACA,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MACjDA,GAAA,CAAC,SAAS,EAAC,EAAA,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAClD,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,MACdA,GAAC,CAAA,WAAW,IACV,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,gBAAgB,EAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,mBAAmB,EAAE,mBAAmB,EACxC,KAAK,EAAE,KAAK,YACX,QAAQ,EAAA,CACC,CACf,EACW,CAAA,CACX,EACa,CAAA;AAEpB,CAAC;;AC3HD;;;;;AAKG;AACG,SAAU,uBAAuB,CAAC,SAA8C,EAAE,iBAAoC,EAAE,UAAmB,EAC/I,KAAa,EAAE,MAAuB,EAAA;AAEtC,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO;;AAEhC,IAAA,IAAI,CAAC,MAAM;QACT;IAEF,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC;IACtD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC;AAElD,IAAA,IAAI,UAAU;AACZ,QAAA,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC;;AAEvE,QAAA,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;AAC3E;;ACYA;AACA;;;;;;;AAOG;AACI,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAqC,SAAS,WAAW,CAAC,KAAK,EAAE,GAAG,EAAA;AAC7G,IAAA,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAC7F,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK;;IAG1E,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC;IAE1D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAqB,IAAI,CAAC;AACxD,IAAA,MAAM,UAAU,GAAG,MAAM,KAAK,UAAU;AAExC,IAAA,KAAK,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAK;QAClC,OAAO;AACL,YAAA,QAAQ,CAAC,MAAc,EAAA;AACrB,gBAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO;;AAEhC,gBAAA,IAAI,CAAC,MAAM;oBACT;AAEF,gBAAA,IAAI,UAAU;AACZ,oBAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;;AAElC,oBAAA,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;aACrC;YAED,YAAY,CAAC,KAAa,EAAE,MAAuB,EAAA;gBACjD,uBAAuB,CAAC,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC;;SAEnF;AACH,KAAC,EAAE,CAAE,iBAAiB,EAAE,UAAU,CAAE,CAAC;;;IAIrC,MAAM,QAAQ,GAAG,QAAQ;IAEzB,QACEA,IAAC,aAAa,EAAA,EACZ,GAAG,EAAE,SAAS,KACV,WAAW,EACf,YAAY,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,EACjD,WAAW,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,EAChD,QAAQ,EAAE,CAAC,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,KAAI;YACzF,MAAM,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,gBAAgB;AAChE,YAAA,IAAI,gBAAgB;AAClB,gBAAA,gBAAgB,CAAC,SAAS,EAAE,UAAU,GAAG,mBAAmB,GAAG,qBAAqB,CAAC;SACxF,EAAA,QAAA,EACA,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MACjDA,GAAA,CAAC,SAAS,EAAC,EAAA,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAClD,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,MACdA,GAAC,CAAA,WAAW,IACV,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,gBAAgB,EACtD,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,KAAK,EAAE,KAAK,YACX,QAAQ,EAAA,CACC,CACf,EACW,CAAA,CACX,EACa,CAAA;AAEpB,CAAC;;AClID,MAAM,0BAA0B,CAAA;AAC9B,IAAA,WAAA,CAAa,QAAgB,EAAA;AAmB7B,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,eAAA,EAAA;;;;;AAAsB,SAAA,CAAA;AAlBpB,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ;;AAG/B,IAAA,QAAQ,CAAC,UAAkB,EAAA;QACzB,OAAO,IAAI,CAAC,aAAa;;AAG3B,IAAA,UAAU,CAAC,SAAiB,EAAA;AAC1B,QAAA,OAAO,SAAS,GAAG,IAAI,CAAC,aAAa;;AAGvC,IAAA,YAAY,CAAC,MAAc,EAAA;AACzB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;AACzD,QAAA,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,aAAa;AAElD,QAAA,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;;AAIlC;AAED;;;;AAIG;AACG,SAAU,6BAA6B,CAAC,QAAgB,EAAA;AAC5D,IAAA,OAAO,IAAI,0BAA0B,CAAC,QAAQ,CAAC;AACjD;;AC9BA,MAAM,6BAA6B,CAAA;IACjC,WAAa,CAAA,eAAuB,EAAE,KAAe,EAAA;AA4CrD,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,iBAAA,EAAA;;;;;AAAwB,SAAA,CAAA;AACxB,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;;;;AAAgB,SAAA,CAAA;AA5Cd,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe;AACtC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;;AAGpB,IAAA,QAAQ,CAAC,SAAiB,EAAA;QACxB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,eAAe;;AAGvF,IAAA,UAAU,CAAC,SAAiB,EAAA;QAC1B,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AAC9B,QAAA,IAAI,SAAS,GAAG,MAAM,EAAE;AACtB,YAAA,MAAM,cAAc,GAAG,SAAS,GAAG,MAAM;AACzC,YAAA,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC,eAAe;;aACzC;YACL,MAAM,GAAG,SAAS;;AAGpB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAG,EAChC;AACE,YAAA,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;;AAGzB,QAAA,OAAO,MAAM;;AAGf,IAAA,YAAY,CAAC,MAAc,EAAA;QACzB,IAAI,WAAW,GAAG,CAAC;AACnB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AAChC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAG,EAAE;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1B,YAAA,IAAI,WAAW,GAAG,IAAI,GAAG,MAAM,EAAE;AAC/B,gBAAA,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC;;YAEzB,WAAW,IAAI,IAAI;;AAGrB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,WAAW,IAAI,IAAI,CAAC,eAAe,CAAC;AAC3E,QAAA,WAAW,IAAI,SAAS,GAAG,IAAI,CAAC,eAAe;AAE/C,QAAA,OAAO,CAAC,SAAS,GAAC,MAAM,EAAE,WAAW,CAAC;;AAKzC;AAED;;;;;AAKG;AACa,SAAA,gCAAgC,CAAC,eAAuB,EAAE,KAAgB,EAAA;IACxF,OAAO,IAAI,6BAA6B,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC;AACxE;;;;"}
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.6.1",
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
- "gitHead": "b0c5ff0cc859dd86af7b18231563a3440b380737"
64
+ "dependencies": {
65
+ "@candidstartup/infinisheet-types": "^0.7.0"
66
+ },
67
+ "gitHead": "5ea8ee7cef0e539dd15b844bd074a745d08b6ba6"
63
68
  }