react-virtual-renderer 1.1.3 → 1.1.5
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/dist/App.d.ts.map +1 -1
- package/dist/App.js +65 -3
- package/dist/App.js.map +1 -1
- package/dist/components/VirtualGrid.d.ts +30 -0
- package/dist/components/VirtualGrid.d.ts.map +1 -1
- package/dist/components/VirtualGrid.js +147 -117
- package/dist/components/VirtualGrid.js.map +1 -1
- package/dist/components/VirtualList.d.ts +0 -4
- package/dist/components/VirtualList.d.ts.map +1 -1
- package/dist/components/VirtualList.js +76 -86
- package/dist/components/VirtualList.js.map +1 -1
- package/dist/components/VirtualLiveRegion.d.ts +12 -0
- package/dist/components/VirtualLiveRegion.d.ts.map +1 -0
- package/dist/components/VirtualLiveRegion.js +27 -0
- package/dist/components/VirtualLiveRegion.js.map +1 -0
- package/dist/core/FenwickTree.d.ts +47 -0
- package/dist/core/FenwickTree.d.ts.map +1 -0
- package/dist/core/FenwickTree.js +206 -0
- package/dist/core/FenwickTree.js.map +1 -0
- package/dist/core/GridLayoutEngine.d.ts +64 -0
- package/dist/core/GridLayoutEngine.d.ts.map +1 -0
- package/dist/core/GridLayoutEngine.js +153 -0
- package/dist/core/GridLayoutEngine.js.map +1 -0
- package/dist/core/GroupedListEngine.d.ts +21 -0
- package/dist/core/GroupedListEngine.d.ts.map +1 -0
- package/dist/core/GroupedListEngine.js +22 -0
- package/dist/core/GroupedListEngine.js.map +1 -0
- package/dist/core/ListController.d.ts +31 -0
- package/dist/core/ListController.d.ts.map +1 -0
- package/dist/core/ListController.js +71 -0
- package/dist/core/ListController.js.map +1 -0
- package/dist/core/MeasurementSystem.d.ts +1 -1
- package/dist/core/MeasurementSystem.d.ts.map +1 -1
- package/dist/core/MeasurementSystem.js +22 -10
- package/dist/core/MeasurementSystem.js.map +1 -1
- package/dist/core/VirtualizationEngine.d.ts +24 -13
- package/dist/core/VirtualizationEngine.d.ts.map +1 -1
- package/dist/core/VirtualizationEngine.js +50 -87
- package/dist/core/VirtualizationEngine.js.map +1 -1
- package/dist/examples/DynamicHeightLists.d.ts +2 -0
- package/dist/examples/DynamicHeightLists.d.ts.map +1 -0
- package/dist/examples/DynamicHeightLists.js +42 -0
- package/dist/examples/DynamicHeightLists.js.map +1 -0
- package/dist/examples/FixedGrid.d.ts +2 -0
- package/dist/examples/FixedGrid.d.ts.map +1 -0
- package/dist/examples/FixedGrid.js +40 -0
- package/dist/examples/FixedGrid.js.map +1 -0
- package/dist/examples/GroupedContactList.d.ts +2 -0
- package/dist/examples/GroupedContactList.d.ts.map +1 -0
- package/dist/examples/GroupedContactList.js +20 -0
- package/dist/examples/GroupedContactList.js.map +1 -0
- package/dist/examples/InfiniteScrollLists.d.ts +2 -0
- package/dist/examples/InfiniteScrollLists.d.ts.map +1 -0
- package/dist/examples/InfiniteScrollLists.js +93 -0
- package/dist/examples/InfiniteScrollLists.js.map +1 -0
- package/dist/examples/MasonaryGrid.d.ts +2 -0
- package/dist/examples/MasonaryGrid.d.ts.map +1 -0
- package/dist/examples/MasonaryGrid.js +36 -0
- package/dist/examples/MasonaryGrid.js.map +1 -0
- package/dist/examples/PerfHarness.d.ts +2 -0
- package/dist/examples/PerfHarness.d.ts.map +1 -0
- package/dist/examples/PerfHarness.js +131 -0
- package/dist/examples/PerfHarness.js.map +1 -0
- package/dist/hooks/useBidirectionalInfiniteScroll.d.ts +32 -0
- package/dist/hooks/useBidirectionalInfiniteScroll.d.ts.map +1 -0
- package/dist/hooks/useBidirectionalInfiniteScroll.js +89 -0
- package/dist/hooks/useBidirectionalInfiniteScroll.js.map +1 -0
- package/dist/hooks/useInfiniteScroll.d.ts +36 -12
- package/dist/hooks/useInfiniteScroll.d.ts.map +1 -1
- package/dist/hooks/useInfiniteScroll.js +46 -45
- package/dist/hooks/useInfiniteScroll.js.map +1 -1
- package/dist/hooks/useRevoingTabIndex.d.ts +11 -0
- package/dist/hooks/useRevoingTabIndex.d.ts.map +1 -0
- package/dist/hooks/useRevoingTabIndex.js +28 -0
- package/dist/hooks/useRevoingTabIndex.js.map +1 -0
- package/dist/hooks/useVirtualAllyProps.d.ts +23 -0
- package/dist/hooks/useVirtualAllyProps.d.ts.map +1 -0
- package/dist/hooks/useVirtualAllyProps.js +25 -0
- package/dist/hooks/useVirtualAllyProps.js.map +1 -0
- package/dist/hooks/useVirtualList.d.ts +2 -0
- package/dist/hooks/useVirtualList.d.ts.map +1 -1
- package/dist/hooks/useVirtualList.js +12 -4
- package/dist/hooks/useVirtualList.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/main.js +4 -4
- package/dist/main.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental, append-only masonry/grid position engine.
|
|
3
|
+
*
|
|
4
|
+
* PERFORMANCE: the previous VirtualGrid recomputed EVERY item's
|
|
5
|
+
* position from scratch (a full O(n) pass) whenever the items array
|
|
6
|
+
* changed identity - including the ordinary infinite-scroll case of
|
|
7
|
+
* appending 20 new items to an existing 50,000-item masonry board,
|
|
8
|
+
* which turned a single "load more" into an O(n) pass over everything
|
|
9
|
+
* already laid out.
|
|
10
|
+
*
|
|
11
|
+
* This engine keeps running state - per-column heights for masonry, a
|
|
12
|
+
* running row-offset for dynamic-height grid rows - and only computes
|
|
13
|
+
* positions for items it hasn't seen before. Appending k new items
|
|
14
|
+
* costs O(k), never O(n + k). A full reset (columns/width/gap/layout
|
|
15
|
+
* changed) is the only path that pays an O(n) cost, same as any other
|
|
16
|
+
* virtualization library when the layout itself is invalidated.
|
|
17
|
+
*
|
|
18
|
+
* NOTE ON VIRTUAL_GRID'S FAST PATH: this engine is only used for
|
|
19
|
+
* masonry layout, or grid layout with a per-index rowHeight function.
|
|
20
|
+
* Plain grid layout with a fixed numeric rowHeight never touches this
|
|
21
|
+
* file at all - VirtualGrid computes those positions with direct O(1)
|
|
22
|
+
* arithmetic and no array (see VirtualGrid.tsx), which is faster still.
|
|
23
|
+
*/
|
|
24
|
+
export class GridLayoutEngine {
|
|
25
|
+
constructor() {
|
|
26
|
+
Object.defineProperty(this, "positions", {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
configurable: true,
|
|
29
|
+
writable: true,
|
|
30
|
+
value: []
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(this, "colHeights", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: []
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(this, "rowOffsets", {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: true,
|
|
42
|
+
value: [0]
|
|
43
|
+
});
|
|
44
|
+
Object.defineProperty(this, "currentRowMax", {
|
|
45
|
+
enumerable: true,
|
|
46
|
+
configurable: true,
|
|
47
|
+
writable: true,
|
|
48
|
+
value: 0
|
|
49
|
+
});
|
|
50
|
+
Object.defineProperty(this, "maxBottom", {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
configurable: true,
|
|
53
|
+
writable: true,
|
|
54
|
+
value: 0
|
|
55
|
+
});
|
|
56
|
+
Object.defineProperty(this, "params", {
|
|
57
|
+
enumerable: true,
|
|
58
|
+
configurable: true,
|
|
59
|
+
writable: true,
|
|
60
|
+
value: null
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
sameParams(p) {
|
|
64
|
+
if (!this.params)
|
|
65
|
+
return false;
|
|
66
|
+
return (this.params.cols === p.cols &&
|
|
67
|
+
this.params.colWidth === p.colWidth &&
|
|
68
|
+
this.params.gap === p.gap &&
|
|
69
|
+
this.params.layout === p.layout &&
|
|
70
|
+
this.params.rowHeight === p.rowHeight);
|
|
71
|
+
}
|
|
72
|
+
reset(p) {
|
|
73
|
+
this.positions = [];
|
|
74
|
+
this.colHeights = new Array(p.cols).fill(0);
|
|
75
|
+
this.rowOffsets = [0];
|
|
76
|
+
this.currentRowMax = 0;
|
|
77
|
+
this.maxBottom = 0;
|
|
78
|
+
this.params = p;
|
|
79
|
+
}
|
|
80
|
+
sizeOf(rowHeight, index) {
|
|
81
|
+
return typeof rowHeight === 'function' ? rowHeight(index) : rowHeight;
|
|
82
|
+
}
|
|
83
|
+
/** Masonry: place each new item in whichever column is currently shortest. */
|
|
84
|
+
appendMasonry(fromIndex, itemCount, p) {
|
|
85
|
+
for (let i = fromIndex; i < itemCount; i++) {
|
|
86
|
+
const h = this.sizeOf(p.rowHeight, i);
|
|
87
|
+
let minCol = 0;
|
|
88
|
+
for (let c = 1; c < p.cols; c++) {
|
|
89
|
+
if (this.colHeights[c] < this.colHeights[minCol])
|
|
90
|
+
minCol = c;
|
|
91
|
+
}
|
|
92
|
+
const x = minCol * (p.colWidth + p.gap);
|
|
93
|
+
const y = this.colHeights[minCol];
|
|
94
|
+
this.positions.push({ x, y, width: p.colWidth, height: h });
|
|
95
|
+
this.colHeights[minCol] += h + p.gap;
|
|
96
|
+
if (y + h > this.maxBottom)
|
|
97
|
+
this.maxBottom = y + h;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Grid with per-index rowHeight function: rows advance by the
|
|
102
|
+
* tallest item seen in that row so far. `rowOffsets[r]` is only
|
|
103
|
+
* ever written once (when row r's first item is appended), reading
|
|
104
|
+
* `currentRowMax` accumulated while row r-1 was being built - so
|
|
105
|
+
* this stays correct across multiple incremental append() calls,
|
|
106
|
+
* not just a single full pass.
|
|
107
|
+
*/
|
|
108
|
+
appendGrid(fromIndex, itemCount, p) {
|
|
109
|
+
for (let i = fromIndex; i < itemCount; i++) {
|
|
110
|
+
const row = Math.floor(i / p.cols);
|
|
111
|
+
const col = i % p.cols;
|
|
112
|
+
const h = this.sizeOf(p.rowHeight, i);
|
|
113
|
+
while (this.rowOffsets.length <= row) {
|
|
114
|
+
const prevRow = this.rowOffsets.length - 1;
|
|
115
|
+
const gapBefore = prevRow >= 0 ? p.gap : 0;
|
|
116
|
+
this.rowOffsets.push(this.rowOffsets[prevRow] + this.currentRowMax + gapBefore);
|
|
117
|
+
this.currentRowMax = 0;
|
|
118
|
+
}
|
|
119
|
+
const y = this.rowOffsets[row];
|
|
120
|
+
const x = col * (p.colWidth + p.gap);
|
|
121
|
+
this.positions.push({ x, y, width: p.colWidth, height: h });
|
|
122
|
+
this.currentRowMax = Math.max(this.currentRowMax, h);
|
|
123
|
+
if (y + h > this.maxBottom)
|
|
124
|
+
this.maxBottom = y + h;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Ensure positions exist for `itemCount` items under the given
|
|
129
|
+
* params. Existing entries are reused by reference - callers get
|
|
130
|
+
* back the same array instances for indices they've already seen,
|
|
131
|
+
* which keeps this cheap to call on every render.
|
|
132
|
+
*/
|
|
133
|
+
sync(itemCount, p) {
|
|
134
|
+
if (!this.sameParams(p) || itemCount < this.positions.length) {
|
|
135
|
+
this.reset(p);
|
|
136
|
+
}
|
|
137
|
+
const from = this.positions.length;
|
|
138
|
+
if (from < itemCount) {
|
|
139
|
+
if (p.layout === 'masonry') {
|
|
140
|
+
this.appendMasonry(from, itemCount, p);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
this.appendGrid(from, itemCount, p);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return this.positions;
|
|
147
|
+
}
|
|
148
|
+
/** O(1) - tracked incrementally as items are appended, never rescanned. */
|
|
149
|
+
getTotalHeight() {
|
|
150
|
+
return this.maxBottom;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=GridLayoutEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GridLayoutEngine.js","sourceRoot":"","sources":["../../src/core/GridLayoutEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface GroupDefinition<T> {
|
|
2
|
+
items: T[];
|
|
3
|
+
getGroupKey: (item: T) => string;
|
|
4
|
+
}
|
|
5
|
+
export interface FlattenedRow<T> {
|
|
6
|
+
type: 'header' | 'item';
|
|
7
|
+
groupKey: string;
|
|
8
|
+
item?: T;
|
|
9
|
+
itemIndex?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Flattens grouped data into one virtualizable array with header rows
|
|
13
|
+
* interspersed - VirtualList treats a header as just another row, no
|
|
14
|
+
* special-casing in the engine. Your existing `stickyIndices` prop is
|
|
15
|
+
* what actually pins headers visually while scrolling.
|
|
16
|
+
*/
|
|
17
|
+
export declare function flattenGroups<T>({ items, getGroupKey }: GroupDefinition<T>): {
|
|
18
|
+
rows: FlattenedRow<T>[];
|
|
19
|
+
stickyIndices: number[];
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=GroupedListEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupedListEngine.d.ts","sourceRoot":"","sources":["../../src/core/GroupedListEngine.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,eAAe,CAAC,CAAC;IAC9B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC3B,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG;IAC1E,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B,CAgBA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flattens grouped data into one virtualizable array with header rows
|
|
3
|
+
* interspersed - VirtualList treats a header as just another row, no
|
|
4
|
+
* special-casing in the engine. Your existing `stickyIndices` prop is
|
|
5
|
+
* what actually pins headers visually while scrolling.
|
|
6
|
+
*/
|
|
7
|
+
export function flattenGroups({ items, getGroupKey }) {
|
|
8
|
+
const rows = [];
|
|
9
|
+
const stickyIndices = [];
|
|
10
|
+
let lastKey = null;
|
|
11
|
+
items.forEach((item, itemIndex) => {
|
|
12
|
+
const key = getGroupKey(item);
|
|
13
|
+
if (key !== lastKey) {
|
|
14
|
+
stickyIndices.push(rows.length);
|
|
15
|
+
rows.push({ type: 'header', groupKey: key });
|
|
16
|
+
lastKey = key;
|
|
17
|
+
}
|
|
18
|
+
rows.push({ type: 'item', groupKey: key, item, itemIndex });
|
|
19
|
+
});
|
|
20
|
+
return { rows, stickyIndices };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=GroupedListEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupedListEngine.js","sourceRoot":"","sources":["../../src/core/GroupedListEngine.ts"],"names":[],"mappings":"AAaA;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAI,EAAE,KAAK,EAAE,WAAW,EAAsB;IAIvE,MAAM,IAAI,GAAsB,EAAE,CAAC;IACnC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAElC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAClB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7C,OAAO,GAAG,GAAG,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface ListControllerOptions {
|
|
2
|
+
itemCount: number;
|
|
3
|
+
estimatedItemSize: number;
|
|
4
|
+
overscan?: number;
|
|
5
|
+
}
|
|
6
|
+
type Listener = () => void;
|
|
7
|
+
/**
|
|
8
|
+
* Framework-agnostic controller: owns the engine + scroll state,
|
|
9
|
+
* exposes subscribe/getSnapshot. React binds via useSyncExternalStore;
|
|
10
|
+
* Vue could bind via a reactive ref; Svelte via a store - the engine
|
|
11
|
+
* itself never needs to know any of that exists.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ListController {
|
|
14
|
+
private engine;
|
|
15
|
+
private scrollOffset;
|
|
16
|
+
private containerSize;
|
|
17
|
+
private itemCount;
|
|
18
|
+
private overscan;
|
|
19
|
+
private listeners;
|
|
20
|
+
constructor({ itemCount, estimatedItemSize, overscan }: ListControllerOptions);
|
|
21
|
+
subscribe: (listener: Listener) => () => boolean;
|
|
22
|
+
private notify;
|
|
23
|
+
setScrollOffset(offset: number): void;
|
|
24
|
+
setContainerSize(size: number): void;
|
|
25
|
+
setItemCount(count: number): void;
|
|
26
|
+
recordItemSize(index: number, size: number): void;
|
|
27
|
+
getSnapshot(): import("..").ItemSize[];
|
|
28
|
+
getTotalSize(): number;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=ListController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListController.d.ts","sourceRoot":"","sources":["../../src/core/ListController.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAE3B;;;;;GAKG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAuB;gBAE5B,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAY,EAAE,EAAE,qBAAqB;IAOjF,SAAS,GAAI,UAAU,QAAQ,mBAG7B;IAEF,OAAO,CAAC,MAAM;IAEd,eAAe,CAAC,MAAM,EAAE,MAAM;IAC9B,gBAAgB,CAAC,IAAI,EAAE,MAAM;IAC7B,YAAY,CAAC,KAAK,EAAE,MAAM;IAC1B,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAE1C,WAAW;IAIX,YAAY;CACf"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// packages/core/src/ListController.ts
|
|
2
|
+
import { VirtualizationEngine } from './VirtualizationEngine';
|
|
3
|
+
/**
|
|
4
|
+
* Framework-agnostic controller: owns the engine + scroll state,
|
|
5
|
+
* exposes subscribe/getSnapshot. React binds via useSyncExternalStore;
|
|
6
|
+
* Vue could bind via a reactive ref; Svelte via a store - the engine
|
|
7
|
+
* itself never needs to know any of that exists.
|
|
8
|
+
*/
|
|
9
|
+
export class ListController {
|
|
10
|
+
constructor({ itemCount, estimatedItemSize, overscan = 5 }) {
|
|
11
|
+
Object.defineProperty(this, "engine", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
writable: true,
|
|
15
|
+
value: void 0
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(this, "scrollOffset", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: 0
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(this, "containerSize", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true,
|
|
27
|
+
value: 0
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(this, "itemCount", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
configurable: true,
|
|
32
|
+
writable: true,
|
|
33
|
+
value: void 0
|
|
34
|
+
});
|
|
35
|
+
Object.defineProperty(this, "overscan", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true,
|
|
39
|
+
value: void 0
|
|
40
|
+
});
|
|
41
|
+
Object.defineProperty(this, "listeners", {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
configurable: true,
|
|
44
|
+
writable: true,
|
|
45
|
+
value: new Set()
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(this, "subscribe", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
value: (listener) => {
|
|
52
|
+
this.listeners.add(listener);
|
|
53
|
+
return () => this.listeners.delete(listener);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
this.engine = new VirtualizationEngine(estimatedItemSize);
|
|
57
|
+
this.itemCount = itemCount;
|
|
58
|
+
this.overscan = overscan;
|
|
59
|
+
this.engine.setItemCount(itemCount);
|
|
60
|
+
}
|
|
61
|
+
notify() { this.listeners.forEach((l) => l()); }
|
|
62
|
+
setScrollOffset(offset) { this.scrollOffset = offset; this.notify(); }
|
|
63
|
+
setContainerSize(size) { this.containerSize = size; this.notify(); }
|
|
64
|
+
setItemCount(count) { this.itemCount = count; this.engine.setItemCount(count); this.notify(); }
|
|
65
|
+
recordItemSize(index, size) { this.engine.recordItemSize(index, size); this.notify(); }
|
|
66
|
+
getSnapshot() {
|
|
67
|
+
return this.engine.getVisibleItems(this.scrollOffset, this.containerSize, this.itemCount, this.overscan);
|
|
68
|
+
}
|
|
69
|
+
getTotalSize() { return this.engine.getTotalSize(); }
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=ListController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListController.js","sourceRoot":"","sources":["../../src/core/ListController.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAU9D;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IAQvB,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAQ,GAAG,CAAC,EAAyB;QAPzE;;;;;WAA6B;QAC7B;;;;mBAAe,CAAC;WAAC;QACjB;;;;mBAAgB,CAAC;WAAC;QAClB;;;;;WAAkB;QAClB;;;;;WAAiB;QACjB;;;;mBAAY,IAAI,GAAG,EAAY;WAAC;QASxC;;;;mBAAY,CAAC,QAAkB,EAAE,EAAE;gBAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjD,CAAC;WAAC;QATE,IAAI,CAAC,MAAM,GAAG,IAAI,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAOO,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAExD,eAAe,CAAC,MAAc,IAAI,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9E,gBAAgB,CAAC,IAAY,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5E,YAAY,CAAC,KAAa,IAAI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvG,cAAc,CAAC,KAAa,EAAE,IAAY,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEvG,WAAW;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7G,CAAC;IAED,YAAY,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;CACxD"}
|
|
@@ -38,7 +38,7 @@ export declare class MeasurementSystem {
|
|
|
38
38
|
* (height-only). Pass `onMeasureWidth` to also receive width
|
|
39
39
|
* updates for elements observed in 'width' axis mode.
|
|
40
40
|
*/
|
|
41
|
-
startMeasuring(
|
|
41
|
+
startMeasuring(onMeasure: (index: number, size: number) => void, onMeasureWidth?: (index: number, size: number) => void): void;
|
|
42
42
|
/**
|
|
43
43
|
* Observe item.
|
|
44
44
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MeasurementSystem.d.ts","sourceRoot":"","sources":["../../src/core/MeasurementSystem.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,cAAc,CAA+B;IAErD,OAAO,CAAC,YAAY,CAA6B;IAEjD;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,CAA6B;IAEtD,OAAO,CAAC,gBAAgB,CACe;IAEvC;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAC+B;IAEnD,OAAO,CAAC,cAAc,CACQ;IAE9B;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CACG;IAE9B,OAAO,CAAC,KAAK,CAAuB;IAEpC,OAAO,CAAC,SAAS,CAEC;IAElB;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAEJ;;IAclB;;;;;;;OAOG;IACH,cAAc,
|
|
1
|
+
{"version":3,"file":"MeasurementSystem.d.ts","sourceRoot":"","sources":["../../src/core/MeasurementSystem.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,cAAc,CAA+B;IAErD,OAAO,CAAC,YAAY,CAA6B;IAEjD;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,CAA6B;IAEtD,OAAO,CAAC,gBAAgB,CACe;IAEvC;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAC+B;IAEnD,OAAO,CAAC,cAAc,CACQ;IAE9B;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CACG;IAE9B,OAAO,CAAC,KAAK,CAAuB;IAEpC,OAAO,CAAC,SAAS,CAEC;IAElB;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAEJ;;IAclB;;;;;;;OAOG;IACH,cAAc,CAEV,SAAS,EAAE,CACP,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,KACX,IAAI,EACT,cAAc,CAAC,EAAE,CACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,KACX,IAAI,GACV,IAAI;IA6BP;;;;;;;;OAQG;IACH,WAAW,CACP,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EACpB,IAAI,GAAE,QAAQ,GAAG,OAAkB,GACpC,IAAI;IAsBP;;OAEG;IACH,aAAa,CACT,OAAO,EAAE,WAAW,GACrB,IAAI;IAYP;;OAEG;IACH,OAAO,CAAC,YAAY,CAkElB;IAEF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiC3B;;;;;OAKG;IACH,WAAW,CACP,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EACpB,IAAI,GAAE,QAAQ,GAAG,OAAkB,GACpC,IAAI;IAwCP;;OAEG;IACH,aAAa,IAAI,IAAI;IAarB,cAAc,CACV,KAAK,EAAE,MAAM,GACd,MAAM,GAAG,SAAS;IAMrB;;;;OAIG;IACH,mBAAmB,CACf,KAAK,EAAE,MAAM,GACd,MAAM,GAAG,SAAS;IAIrB,kBAAkB,IAAI,GAAG,CACrB,MAAM,EACN,MAAM,CACT;IAMD;;OAEG;IACH,uBAAuB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAI9C,YAAY,IAAI,IAAI;IAKpB;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAKzB,OAAO,IAAI,IAAI;CAgBlB"}
|
|
@@ -128,18 +128,30 @@ export class MeasurementSystem {
|
|
|
128
128
|
* (height-only). Pass `onMeasureWidth` to also receive width
|
|
129
129
|
* updates for elements observed in 'width' axis mode.
|
|
130
130
|
*/
|
|
131
|
-
startMeasuring(
|
|
131
|
+
startMeasuring(
|
|
132
|
+
// container: HTMLElement,
|
|
133
|
+
onMeasure, onMeasureWidth) {
|
|
132
134
|
this.onMeasure = onMeasure;
|
|
133
135
|
this.onMeasureWidth = onMeasureWidth ?? null;
|
|
134
|
-
const items =
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
136
|
+
// const items =
|
|
137
|
+
// container.querySelectorAll<HTMLElement>(
|
|
138
|
+
// '[data-virtualize-index]'
|
|
139
|
+
// );
|
|
140
|
+
// items.forEach((item) => {
|
|
141
|
+
// const indexAttr =
|
|
142
|
+
// item.dataset.virtualizeIndex;
|
|
143
|
+
// if (
|
|
144
|
+
// indexAttr === undefined
|
|
145
|
+
// ) {
|
|
146
|
+
// return;
|
|
147
|
+
// }
|
|
148
|
+
// const index =
|
|
149
|
+
// Number(indexAttr);
|
|
150
|
+
// this.observeItem(
|
|
151
|
+
// index,
|
|
152
|
+
// item
|
|
153
|
+
// );
|
|
154
|
+
// });
|
|
143
155
|
}
|
|
144
156
|
/**
|
|
145
157
|
* Observe item.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MeasurementSystem.js","sourceRoot":"","sources":["../../src/core/MeasurementSystem.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAiB;IAiD1B;QAhDQ;;;;mBAAwC,IAAI;WAAC;QAE7C;;;;mBAAe,IAAI,GAAG,EAAkB;WAAC;QAEjD;;;;WAIG;QACK;;;;mBAAoB,IAAI,GAAG,EAAkB;WAAC;QAE9C;;;;mBACJ,IAAI,OAAO,EAAuB;WAAC;QAEvC;;;;WAIG;QACK;;;;mBACJ,IAAI,OAAO,EAAmC;WAAC;QAE3C;;;;mBACJ,IAAI,GAAG,EAAkB;WAAC;QAE9B;;;WAGG;QACK;;;;mBACJ,IAAI,GAAG,EAAkB;WAAC;QAEtB;;;;mBAAuB,IAAI;WAAC;QAE5B;;;;mBAEK,IAAI;WAAC;QAElB;;;;;WAKG;QACK;;;;mBAEK,IAAI;WAAC;QAiHlB;;WAEG;QACK;;;;mBAAe,CACnB,OAA8B,EAC1B,EAAE;gBACN,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC1B,MAAM,OAAO,GACT,KAAK,CAAC,MAAqB,CAAC;oBAEhC,MAAM,KAAK,GACP,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACrB,OAAO,CACV,CAAC;oBAEN,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACtB,SAAS;oBACb,CAAC;oBAED,MAAM,IAAI,GACN,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC;oBAE/C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;wBACnB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CACxB,KAAK,CAAC,WAAW,CAAC,KAAK,CAC1B,CAAC;wBAEF,IACI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;4BACjC,SAAS,EACX,CAAC;4BACC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CACtB,KAAK,EACL,SAAS,CACZ,CAAC;4BAEF,IAAI,CAAC,mBAAmB,CAAC,GAAG,CACxB,KAAK,EACL,SAAS,CACZ,CAAC;wBACN,CAAC;wBAED,SAAS;oBACb,CAAC;oBAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACnB,KAAK,CAAC,WAAW,CAAC,MAAM,CAC3B,CAAC;oBAEF,IACI,IAAI,CAAC,YAAY,CAAC,GAAG,CACjB,KAAK,CACR,KAAK,IAAI,EACZ,CAAC;wBACC,SAAS;oBACb,CAAC;oBAED,IAAI,CAAC,YAAY,CAAC,GAAG,CACjB,KAAK,EACL,IAAI,CACP,CAAC;oBAEF,IAAI,CAAC,cAAc,CAAC,GAAG,CACnB,KAAK,EACL,IAAI,CACP,CAAC;gBACN,CAAC;gBAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC/B,CAAC;WAAC;QAnLE,IACI,OAAO,MAAM,KAAK,WAAW;YAC7B,gBAAgB,IAAI,MAAM,EAC5B,CAAC;YACC,IAAI,CAAC,cAAc;gBACf,IAAI,cAAc,CACd,IAAI,CAAC,YAAY,CACpB,CAAC;QACV,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,
|
|
1
|
+
{"version":3,"file":"MeasurementSystem.js","sourceRoot":"","sources":["../../src/core/MeasurementSystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +1,41 @@
|
|
|
1
1
|
import { ItemSize, VirtualRange } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Core offset/range math shared by VirtualList and VirtualGrid.
|
|
4
|
+
*
|
|
5
|
+
* PERFORMANCE: previously this held a plain prefix-sum array and a
|
|
6
|
+
* `dirty` flag, rebuilding the WHOLE array (O(n)) the next time
|
|
7
|
+
* anything was read after any single item's size changed. Every read
|
|
8
|
+
* (getItemOffset, getTotalSize, the binary search for visible range)
|
|
9
|
+
* paid that O(n) cost whenever a measurement had landed since the last
|
|
10
|
+
* read - which, for a dynamic-height list, is essentially every scroll
|
|
11
|
+
* frame.
|
|
12
|
+
*
|
|
13
|
+
* This version is backed by a FenwickTree (see FenwickTree.ts). There
|
|
14
|
+
* is no dirty flag and no rebuild: every operation below is O(log n),
|
|
15
|
+
* full stop, regardless of how many items have been re-measured.
|
|
16
|
+
*/
|
|
2
17
|
export declare class VirtualizationEngine {
|
|
3
|
-
private
|
|
18
|
+
private tree;
|
|
4
19
|
private estimatedItemSize;
|
|
5
20
|
private itemCount;
|
|
6
|
-
private prefix;
|
|
7
|
-
private dirty;
|
|
8
21
|
constructor(estimatedItemSize?: number);
|
|
9
22
|
setItemCount(count: number): void;
|
|
10
23
|
recordItemSize(index: number, size: number): void;
|
|
11
24
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* until they are re-measured and recordItemSize() is called
|
|
16
|
-
* again for them.
|
|
25
|
+
* Invalidate cached measurements from `fromIndex` onward
|
|
26
|
+
* (inclusive), or everything if omitted. Affected indices fall
|
|
27
|
+
* back to `estimatedItemSize` until re-measured.
|
|
17
28
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
29
|
+
* Each reset index is a single O(log n) point update - so
|
|
30
|
+
* invalidating a suffix of k items is O(k log n), not a full
|
|
31
|
+
* array rebuild. A full invalidate (no fromIndex) is the one
|
|
32
|
+
* intentionally O(n) path in this class, reserved for "the whole
|
|
33
|
+
* dataset changed" situations, not the scroll hot path.
|
|
21
34
|
*/
|
|
22
35
|
invalidateFrom(fromIndex?: number): void;
|
|
23
|
-
private rebuildPrefix;
|
|
24
36
|
getItemSize(index: number): number;
|
|
25
37
|
getItemOffset(index: number): number;
|
|
26
38
|
getTotalSize(): number;
|
|
27
|
-
private binarySearch;
|
|
28
39
|
getVisibleRange(scrollOffset: number, containerSize: number, itemCount: number, overscan?: number): VirtualRange;
|
|
29
40
|
getVisibleItems(scrollOffset: number, containerSize: number, itemCount: number, overscan: number): ItemSize[];
|
|
30
41
|
getScrollOffsetForIndex(index: number, containerSize: number, alignment?: 'start' | 'center' | 'end'): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualizationEngine.d.ts","sourceRoot":"","sources":["../../src/core/VirtualizationEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,QAAQ,EACR,YAAY,
|
|
1
|
+
{"version":3,"file":"VirtualizationEngine.d.ts","sourceRoot":"","sources":["../../src/core/VirtualizationEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,QAAQ,EACR,YAAY,EACf,MAAM,UAAU,CAAC;AAGlB;;;;;;;;;;;;;;GAcG;AACH,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,SAAS,CAAK;gBAEV,iBAAiB,SAAK;IAKlC,YAAY,CAAC,KAAK,EAAE,MAAM;IAM1B,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAK1C;;;;;;;;;;OAUG;IACH,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAYxC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKlC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIpC,YAAY,IAAI,MAAM;IAItB,eAAe,CACX,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,SAAI,GACb,YAAY;IAuBf,eAAe,CACX,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACjB,QAAQ,EAAE;IAqBb,uBAAuB,CACnB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,SAAS,GAAE,OAAO,GAAG,QAAQ,GAAG,KAAe;CAetD"}
|