@react-x11/components 0.2.1 → 0.3.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/dist/internal/heights.d.ts +26 -1
- package/dist/internal/heights.d.ts.map +1 -1
- package/dist/internal/heights.js +57 -6
- package/dist/internal/heights.js.map +1 -1
- package/dist/internal/scroll.d.ts +11 -0
- package/dist/internal/scroll.d.ts.map +1 -1
- package/dist/internal/scroll.js +43 -3
- package/dist/internal/scroll.js.map +1 -1
- package/dist/internal/timers.d.ts +8 -0
- package/dist/internal/timers.d.ts.map +1 -1
- package/dist/internal/timers.js +10 -0
- package/dist/internal/timers.js.map +1 -1
- package/dist/internal/window.d.ts +161 -0
- package/dist/internal/window.d.ts.map +1 -0
- package/dist/internal/window.js +417 -0
- package/dist/internal/window.js.map +1 -0
- package/dist/table/index.d.ts +73 -2
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +405 -161
- package/dist/table/index.js.map +1 -1
- package/dist/tree/index.d.ts +65 -5
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +446 -189
- package/dist/tree/index.js.map +1 -1
- package/package.json +1 -1
- package/src/internal/heights.ts +57 -6
- package/src/internal/scroll.ts +59 -3
- package/src/internal/timers.ts +13 -0
- package/src/internal/window.ts +570 -0
- package/src/table/index.ts +599 -178
- package/src/tree/index.ts +687 -260
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
// The virtualization window: which rows are worth building, given where the
|
|
2
|
+
// viewport is and what it is doing.
|
|
3
|
+
//
|
|
4
|
+
// **Shared between `<Tree>` and `<Table>`** — the fourth piece both
|
|
5
|
+
// virtualizers stand on, beside `./heights.ts`, `./timers.ts` and
|
|
6
|
+
// `./scroll.ts`, and promoted for the same reason: the slice arithmetic, the
|
|
7
|
+
// viewport bookkeeping and the offset re-read after layout were line-for-line
|
|
8
|
+
// identical in both, and the scroll-responsiveness work lands in one place
|
|
9
|
+
// instead of two. See the header of `./heights.ts` for why this directory is
|
|
10
|
+
// internal rather than a shared module with a subpath.
|
|
11
|
+
//
|
|
12
|
+
// What a scroll actually costs on this renderer is the reason this file is
|
|
13
|
+
// more than `indexAt(top) ± overscan`. A wheel notch scrolls the pane and
|
|
14
|
+
// repaints the exposed strip **synchronously, before React runs** — core
|
|
15
|
+
// blits on the event's own frame — so whatever is mounted in that strip is
|
|
16
|
+
// what the user sees. Rows built by the re-render land a frame later at the
|
|
17
|
+
// earliest. The only scroll with no blank frame at all is one that lands
|
|
18
|
+
// inside rows that were already built, which is what the window is for:
|
|
19
|
+
//
|
|
20
|
+
// - **Idle prefetch.** While nothing is scrolling, the window grows
|
|
21
|
+
// chunk-by-chunk beyond the overscan, up to `prefetch` rows each side —
|
|
22
|
+
// prep work done while nobody is watching, so the next scroll lands on
|
|
23
|
+
// rows that are already there. Grown in small steps so no single commit
|
|
24
|
+
// is felt, and paused the moment a scroll arrives.
|
|
25
|
+
// - **Velocity lead.** While scrolling, the window extends in the
|
|
26
|
+
// direction of travel by the distance the next few frames will cover, so
|
|
27
|
+
// the rows being built are the ones about to be exposed rather than ones
|
|
28
|
+
// already behind the viewport.
|
|
29
|
+
// - **Hysteresis.** Rows already built stay in the window until the budget
|
|
30
|
+
// forces them out, trailing side first — a direction reversal lands on
|
|
31
|
+
// rows still mounted instead of rebuilding them. The budget caps what a
|
|
32
|
+
// render can be asked to carry: the on-screen slice plus `prefetch` rows
|
|
33
|
+
// each side.
|
|
34
|
+
// - **Skeletons.** A scroll that outruns everything — a thumb dragged
|
|
35
|
+
// across the list, a flick past the band — floods the window with rows
|
|
36
|
+
// no single render can build in time. Those render as *skeletons*: the
|
|
37
|
+
// row box at its indexed height, none of its content. A skeleton commit
|
|
38
|
+
// is cheap, so it lands frames sooner than the full rows would, and
|
|
39
|
+
// what blits in reads as rows arriving rather than a void. Upgrades
|
|
40
|
+
// follow viewport-first, a budget per render, until none remain.
|
|
41
|
+
//
|
|
42
|
+
// A row outside the viewport costs its share of layout and nothing on the
|
|
43
|
+
// wire — the pane clips it — so the band is cheap to hold and pays for
|
|
44
|
+
// itself on the first notch that lands inside it.
|
|
45
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
46
|
+
import { cancelLater, later } from './timers.js';
|
|
47
|
+
const EMPTY_KEYS = new Set();
|
|
48
|
+
/** Rows kept either side of the viewport, so a fast scroll does not show a
|
|
49
|
+
* gap before the next frame catches up. The components' default. */
|
|
50
|
+
export const DEFAULT_OVERSCAN = 6;
|
|
51
|
+
/** How long the viewport must have been showing unresolved content before
|
|
52
|
+
* the fast-scroll pill appears. A catch-up the next few frames absorb is
|
|
53
|
+
* not worth announcing — the pill is for the delay you can feel. */
|
|
54
|
+
export const SCROLL_HINT_DELAY_MS = 250;
|
|
55
|
+
/** How far past the overscan the idle band grows, rows per side — the
|
|
56
|
+
* components' default for their `prefetch` prop. Roughly two viewports of
|
|
57
|
+
* ordinary rows: enough that a flick lands inside it, small enough that
|
|
58
|
+
* holding it is never felt. */
|
|
59
|
+
export const DEFAULT_PREFETCH = 40;
|
|
60
|
+
/**
|
|
61
|
+
* What to build before the viewport has been measured. `onViewport` cannot
|
|
62
|
+
* arrive until layout has run, which is a frame after the first commit, so
|
|
63
|
+
* there is always one render that has to guess — and guessing "all of them"
|
|
64
|
+
* puts a hundred thousand rows in the tree for a frame.
|
|
65
|
+
*/
|
|
66
|
+
const ASSUMED_ROWS = 40;
|
|
67
|
+
/** How long the pane must sit quiet before prefetch may grow. Longer than a
|
|
68
|
+
* frame, shorter than a reader's pause. */
|
|
69
|
+
const IDLE_MS = 120;
|
|
70
|
+
/** Between growth steps — each step is one commit of `GROW_CHUNK` rows per
|
|
71
|
+
* side, so the band arrives in pieces no single frame feels. */
|
|
72
|
+
const GROW_MS = 40;
|
|
73
|
+
const GROW_CHUNK = 16;
|
|
74
|
+
/** How far ahead the velocity lead looks — about three frames: one for the
|
|
75
|
+
* render to land, one for its paint, one of margin. */
|
|
76
|
+
const LEAD_MS = 50;
|
|
77
|
+
/** Velocity is an EMA of the per-event slope; a gap longer than this between
|
|
78
|
+
* events is a stop, not a very slow scroll. */
|
|
79
|
+
const VEL_GAP_MS = 250;
|
|
80
|
+
/** Above this the scroll is a flick, not a read — px/ms, about three rows a
|
|
81
|
+
* frame. What `fast()` answers with, for work worth deferring to the
|
|
82
|
+
* settle. */
|
|
83
|
+
const FAST_V = 1.5;
|
|
84
|
+
/** More rows than this entering the window in one render is a flood — a
|
|
85
|
+
* teleport or a hard flick — and floods build skeletons first. An ordinary
|
|
86
|
+
* notch brings in a handful and never trips this. */
|
|
87
|
+
export const SKELETON_THRESHOLD = 16;
|
|
88
|
+
/** New full rows built per render while a flood is being caught up with.
|
|
89
|
+
* Measured (rowcost probe, 300-row commits, warm caches): a default-shape
|
|
90
|
+
* row costs ~0.11ms against a skeleton's ~0.06ms — about 2×, not the 10×
|
|
91
|
+
* the original pacing assumed — so the budgets lean generous and the
|
|
92
|
+
* skeleton tier is there for heavy `render` seams and for the look of
|
|
93
|
+
* rows arriving, not because full rows are ruinous. */
|
|
94
|
+
export const BURST_BUDGET = 24;
|
|
95
|
+
/** The same, once the scroll has stopped: bigger steps, still paced, so a
|
|
96
|
+
* settle after a long flood is a few quick commits rather than one big
|
|
97
|
+
* one. */
|
|
98
|
+
export const SETTLE_BUDGET = 48;
|
|
99
|
+
/**
|
|
100
|
+
* The window a virtualizing component builds its rows from.
|
|
101
|
+
*
|
|
102
|
+
* Owns the viewport state and the slice; the component keeps everything the
|
|
103
|
+
* two virtualizers genuinely differ on — what a row *is*, measuring it,
|
|
104
|
+
* revealing it. Call after `heights.sync`, so the slice is computed against
|
|
105
|
+
* the rows this render is about to draw.
|
|
106
|
+
*/
|
|
107
|
+
export function useVirtualWindow(inputs) {
|
|
108
|
+
const [view, setView] = useState({
|
|
109
|
+
top: 0,
|
|
110
|
+
height: 0,
|
|
111
|
+
width: 0,
|
|
112
|
+
});
|
|
113
|
+
const viewRef = useRef(view);
|
|
114
|
+
viewRef.current = view;
|
|
115
|
+
const inp = useRef(inputs);
|
|
116
|
+
inp.current = inputs;
|
|
117
|
+
/** Re-render with the same viewport — how an idle tick asks the slice to
|
|
118
|
+
* be recomputed so the band can take its next growth step. */
|
|
119
|
+
const [, bump] = useState(0);
|
|
120
|
+
/** The window built last render, kept so this render can keep it. */
|
|
121
|
+
const built = useRef(null);
|
|
122
|
+
/** The scroll's slope, px/ms, EMA over the events of the current burst —
|
|
123
|
+
* signed, positive downwards. Meaningful only while `active`. */
|
|
124
|
+
const vel = useRef({ t: 0, top: 0, v: 0 });
|
|
125
|
+
/** A burst is in flight: velocity is live and growth is paused. Cleared by
|
|
126
|
+
* the idle tick rather than by a clock read at render time, so a render's
|
|
127
|
+
* output never depends on when it ran. */
|
|
128
|
+
const active = useRef(false);
|
|
129
|
+
/** Whether the slice this render produced still wants another step — band
|
|
130
|
+
* growth left to do, or skeletons left to upgrade — read by the idle tick
|
|
131
|
+
* to decide whether a re-render is worth it. */
|
|
132
|
+
const wantsGrowth = useRef(false);
|
|
133
|
+
/** Skeletons the slice this render carries — the tick shortens its own
|
|
134
|
+
* clock while any remain, so a flood is caught up with at `GROW_MS` pace
|
|
135
|
+
* rather than waiting out the idle delay. */
|
|
136
|
+
const hasSkeletons = useRef(false);
|
|
137
|
+
/** The rows currently built in full, by id — everything else in the slice
|
|
138
|
+
* is a skeleton. Ids, not indexes, so a re-sort moves the rows without
|
|
139
|
+
* demoting them. */
|
|
140
|
+
const real = useRef(new Set());
|
|
141
|
+
/** When the current catch-up began — see `catchupSince` on the result. */
|
|
142
|
+
const catchupStart = useRef(null);
|
|
143
|
+
const idleTimer = useRef(null);
|
|
144
|
+
const tick = useCallback(() => {
|
|
145
|
+
idleTimer.current = null;
|
|
146
|
+
const wasActive = active.current;
|
|
147
|
+
active.current = false;
|
|
148
|
+
if (!wasActive && !wantsGrowth.current)
|
|
149
|
+
return;
|
|
150
|
+
// One re-render on settling even when there is nothing to grow: it is
|
|
151
|
+
// the render a component's deferred-while-scrolling work (measuring,
|
|
152
|
+
// estimate adaptation) runs on.
|
|
153
|
+
bump((n) => n + 1);
|
|
154
|
+
if (wantsGrowth.current) {
|
|
155
|
+
idleTimer.current = later(tick, GROW_MS);
|
|
156
|
+
}
|
|
157
|
+
}, []);
|
|
158
|
+
const scrolled = useCallback((top) => {
|
|
159
|
+
// Only a virtualizing component reads the vertical offset — a whole
|
|
160
|
+
// one has no slice to rebuild, and re-rendering it on a scroll it
|
|
161
|
+
// already drew would be work for nothing.
|
|
162
|
+
if (!inp.current.virtualizing)
|
|
163
|
+
return;
|
|
164
|
+
globalThis.__scrolls = (globalThis.__scrolls ?? 0) + 1;
|
|
165
|
+
const now = Date.now();
|
|
166
|
+
const s = vel.current;
|
|
167
|
+
const dt = now - s.t;
|
|
168
|
+
if (dt > 0 && dt < VEL_GAP_MS) {
|
|
169
|
+
// Blend rather than replace: a wheel's notches arrive unevenly, and
|
|
170
|
+
// the lead must not whip around on every one.
|
|
171
|
+
s.v = s.v * 0.6 + ((top - s.top) / dt) * 0.4;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
s.v = 0;
|
|
175
|
+
}
|
|
176
|
+
s.t = now;
|
|
177
|
+
s.top = top;
|
|
178
|
+
active.current = true;
|
|
179
|
+
cancelLater(idleTimer.current);
|
|
180
|
+
idleTimer.current = later(tick, IDLE_MS);
|
|
181
|
+
setView((prev) => (prev.top === top ? prev : { ...prev, top }));
|
|
182
|
+
}, [tick]);
|
|
183
|
+
const sized = useCallback((width, height) => {
|
|
184
|
+
viewRef.current = { ...viewRef.current, width, height };
|
|
185
|
+
setView((prev) => prev.width === width && prev.height === height
|
|
186
|
+
? prev
|
|
187
|
+
: { ...prev, width, height });
|
|
188
|
+
}, []);
|
|
189
|
+
const sync = useCallback(() => {
|
|
190
|
+
const { box, virtualizing } = inp.current;
|
|
191
|
+
const node = box.current;
|
|
192
|
+
if (!node || !virtualizing)
|
|
193
|
+
return;
|
|
194
|
+
const y = node.scrollY;
|
|
195
|
+
setView((prev) => (prev.top === y ? prev : { ...prev, top: y }));
|
|
196
|
+
}, []);
|
|
197
|
+
const scrolling = useCallback(() => active.current, []);
|
|
198
|
+
const fast = useCallback(() => active.current && Math.abs(vel.current.v) >= FAST_V, []);
|
|
199
|
+
// The idle clock has to start somewhere even when nothing ever scrolls —
|
|
200
|
+
// a table that mounts and sits still owes itself the band. After any
|
|
201
|
+
// render that still wants growth, make sure a tick is coming — and while
|
|
202
|
+
// skeletons remain, a *near* one: they are on screen, and waiting out the
|
|
203
|
+
// idle delay to fill them in would be a visible pause.
|
|
204
|
+
useEffect(() => {
|
|
205
|
+
if (hasSkeletons.current) {
|
|
206
|
+
cancelLater(idleTimer.current);
|
|
207
|
+
idleTimer.current = later(tick, GROW_MS);
|
|
208
|
+
}
|
|
209
|
+
else if (wantsGrowth.current && idleTimer.current === null) {
|
|
210
|
+
idleTimer.current = later(tick, IDLE_MS);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
useEffect(() => () => cancelLater(idleTimer.current), []);
|
|
214
|
+
const { heights, rows, exact, virtualizing, overscan, prefetch, threshold, burstBudget, settleBudget, } = inputs;
|
|
215
|
+
const count = rows.length;
|
|
216
|
+
let first = 0;
|
|
217
|
+
let last = count;
|
|
218
|
+
let jumped = false;
|
|
219
|
+
wantsGrowth.current = false;
|
|
220
|
+
/** Skeletons are still being filled in from the last render — the band
|
|
221
|
+
* must not grow while they are, or the debt outruns the catch-up. */
|
|
222
|
+
const catchingUp = hasSkeletons.current;
|
|
223
|
+
if (virtualizing) {
|
|
224
|
+
// The core: what is on screen plus the overscan — extended, while a
|
|
225
|
+
// burst is in flight, by where that burst will be in a few frames. The
|
|
226
|
+
// lead goes on the edge being exposed; the overscan already covers the
|
|
227
|
+
// trailing one.
|
|
228
|
+
//
|
|
229
|
+
// **Clamped to one viewport.** A scrollbar scrub moves millions of
|
|
230
|
+
// pixels a second, and an unclamped `v × LEAD_MS` asked the slice for
|
|
231
|
+
// tens of thousands of rows — one commit mounting them froze the app
|
|
232
|
+
// for seconds, the very thing a virtualized list exists to prevent. A
|
|
233
|
+
// viewport ahead is all a lead can usefully buy: anything further is
|
|
234
|
+
// out of sight again before it finishes landing.
|
|
235
|
+
const rawLead = active.current ? vel.current.v * LEAD_MS : 0;
|
|
236
|
+
const lead = Math.max(-view.height, Math.min(view.height, rawLead));
|
|
237
|
+
const topEdge = Math.max(0, view.top + Math.min(0, lead));
|
|
238
|
+
const coreFirst = Math.max(0, heights.indexAt(topEdge) - overscan);
|
|
239
|
+
let coreLast;
|
|
240
|
+
if (view.height > 0) {
|
|
241
|
+
const botEdge = view.top + view.height + Math.max(0, lead);
|
|
242
|
+
coreLast = Math.min(count, heights.indexAt(botEdge) + 1 + overscan);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
coreLast = Math.min(count, coreFirst + ASSUMED_ROWS);
|
|
246
|
+
}
|
|
247
|
+
first = coreFirst;
|
|
248
|
+
last = coreLast;
|
|
249
|
+
if (prefetch > 0 && view.height > 0) {
|
|
250
|
+
// Keep what the last render built, so far as it touches the window —
|
|
251
|
+
// a band the viewport just left is the band a reversal comes back to.
|
|
252
|
+
// A band that does not touch it at all is a teleport's leavings, and
|
|
253
|
+
// rebuilding from the core is cheaper than carrying rows a screenful
|
|
254
|
+
// of nothing away.
|
|
255
|
+
const b = built.current;
|
|
256
|
+
if (b) {
|
|
257
|
+
const bf = Math.min(Math.max(0, b.first), count);
|
|
258
|
+
const bl = Math.min(Math.max(bf, b.last), count);
|
|
259
|
+
if (bl > bf && bl >= first && bf <= last) {
|
|
260
|
+
first = Math.min(first, bf);
|
|
261
|
+
last = Math.max(last, bl);
|
|
262
|
+
}
|
|
263
|
+
else if (bl > bf) {
|
|
264
|
+
jumped = true;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Grown while idle, one chunk per side per tick — never during a
|
|
268
|
+
// burst, whose renders have rows of their own to build, and never
|
|
269
|
+
// while skeletons are still filling in, whose catch-up comes first.
|
|
270
|
+
// Upward growth stops at the first row the index has no real height
|
|
271
|
+
// for — see `exact` on the inputs for why building one would make
|
|
272
|
+
// the view wobble while idle.
|
|
273
|
+
const targetFirst = Math.max(0, coreFirst - prefetch);
|
|
274
|
+
const targetLast = Math.min(count, coreLast + prefetch);
|
|
275
|
+
const growableUp = () => first > targetFirst && (exact || heights.isMeasured(first - 1));
|
|
276
|
+
if (!active.current && !catchingUp) {
|
|
277
|
+
const stop = Math.max(targetFirst, first - GROW_CHUNK);
|
|
278
|
+
while (first > stop && growableUp())
|
|
279
|
+
first--;
|
|
280
|
+
if (last < targetLast)
|
|
281
|
+
last = Math.min(targetLast, last + GROW_CHUNK);
|
|
282
|
+
}
|
|
283
|
+
wantsGrowth.current = growableUp() || last < targetLast;
|
|
284
|
+
// The budget: the core plus a full band each side. Trim the trailing
|
|
285
|
+
// side first — those rows are the furthest from coming back. The
|
|
286
|
+
// top-side cut stops at the first row the index has no real height
|
|
287
|
+
// for, the same rule growth follows and for the reverse reason: a
|
|
288
|
+
// row laid out taller than the index believes contributes its real
|
|
289
|
+
// height while mounted and its guessed one once dropped, so cutting
|
|
290
|
+
// it silently shrinks the content above the viewport and the view
|
|
291
|
+
// yanks up by the difference with no debt left to put it right. Held
|
|
292
|
+
// a render or two longer, it gets measured, and the next trim takes
|
|
293
|
+
// it cleanly.
|
|
294
|
+
const budget = coreLast - coreFirst + 2 * prefetch;
|
|
295
|
+
let excess = last - first - budget;
|
|
296
|
+
if (excess > 0) {
|
|
297
|
+
const cutAbove = (want) => {
|
|
298
|
+
let k = 0;
|
|
299
|
+
while (k < want && (exact || heights.isMeasured(first + k)))
|
|
300
|
+
k++;
|
|
301
|
+
return k;
|
|
302
|
+
};
|
|
303
|
+
const aboveExtra = coreFirst - first;
|
|
304
|
+
const belowExtra = last - coreLast;
|
|
305
|
+
if (vel.current.v >= 0) {
|
|
306
|
+
const cut = cutAbove(Math.min(aboveExtra, excess));
|
|
307
|
+
first += cut;
|
|
308
|
+
excess -= cut;
|
|
309
|
+
last -= Math.min(belowExtra, excess);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
const cut = Math.min(belowExtra, excess);
|
|
313
|
+
last -= cut;
|
|
314
|
+
excess -= cut;
|
|
315
|
+
first += cutAbove(Math.min(aboveExtra, excess));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
built.current = { first, last };
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
built.current = null;
|
|
323
|
+
}
|
|
324
|
+
// The skeleton tier: which of the slice's rows are worth building in full
|
|
325
|
+
// *this* render. All of them, almost always — a flood is the exception.
|
|
326
|
+
let skeletons = EMPTY_KEYS;
|
|
327
|
+
let pending = 0;
|
|
328
|
+
hasSkeletons.current = false;
|
|
329
|
+
if (virtualizing) {
|
|
330
|
+
const prev = real.current;
|
|
331
|
+
const next = new Set();
|
|
332
|
+
let entering = 0;
|
|
333
|
+
for (let i = first; i < last; i++) {
|
|
334
|
+
if (prev.has(rows[i].id))
|
|
335
|
+
next.add(rows[i].id);
|
|
336
|
+
else
|
|
337
|
+
entering++;
|
|
338
|
+
}
|
|
339
|
+
// A window with nothing carried over and no scroll in flight is a mount
|
|
340
|
+
// or a wholesale data change, not a flood — those build in full, or the
|
|
341
|
+
// first paint would be skeletons.
|
|
342
|
+
const flood = entering > threshold && (active.current || next.size > 0);
|
|
343
|
+
if (!flood) {
|
|
344
|
+
for (let i = first; i < last; i++)
|
|
345
|
+
next.add(rows[i].id);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
// Viewport rows first — they are the ones being looked at — then
|
|
349
|
+
// outward, up to the budget; the rest are skeletons until the ticks
|
|
350
|
+
// catch up.
|
|
351
|
+
let budget = active.current ? burstBudget : settleBudget;
|
|
352
|
+
const vFirst = heights.indexAt(view.top);
|
|
353
|
+
const vLast = view.height > 0 ? heights.indexAt(view.top + view.height) : vFirst;
|
|
354
|
+
const take = (i) => {
|
|
355
|
+
if (i < first || i >= last || budget <= 0)
|
|
356
|
+
return;
|
|
357
|
+
if (!next.has(rows[i].id)) {
|
|
358
|
+
next.add(rows[i].id);
|
|
359
|
+
budget--;
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
for (let i = vFirst; i <= vLast && i < last; i++)
|
|
363
|
+
take(i);
|
|
364
|
+
for (let d = 1; budget > 0 && (vFirst - d >= first || vLast + d < last); d++) {
|
|
365
|
+
take(vLast + d);
|
|
366
|
+
take(vFirst - d);
|
|
367
|
+
}
|
|
368
|
+
const skel = new Set();
|
|
369
|
+
for (let i = first; i < last; i++) {
|
|
370
|
+
if (!next.has(rows[i].id)) {
|
|
371
|
+
skel.add(rows[i].id);
|
|
372
|
+
if (i >= vFirst && i <= vLast)
|
|
373
|
+
pending++;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
skeletons = skel;
|
|
377
|
+
hasSkeletons.current = skel.size > 0;
|
|
378
|
+
if (skel.size > 0)
|
|
379
|
+
wantsGrowth.current = true;
|
|
380
|
+
}
|
|
381
|
+
real.current = next;
|
|
382
|
+
}
|
|
383
|
+
else if (real.current.size > 0) {
|
|
384
|
+
real.current = new Set();
|
|
385
|
+
}
|
|
386
|
+
// The catch-up clock: started the first render the viewport stops being
|
|
387
|
+
// whole — placeholders in view, or a scrub outrunning the built rows —
|
|
388
|
+
// and cleared when the catch-up ends, on the same condition a hint's
|
|
389
|
+
// latch releases. Renders keep coming while it runs (the skeleton ticks,
|
|
390
|
+
// the scrub's own events), so a deadline measured against it is
|
|
391
|
+
// re-evaluated within a tick of passing.
|
|
392
|
+
if (virtualizing && (pending > 0 || (jumped && active.current))) {
|
|
393
|
+
catchupStart.current ??= Date.now();
|
|
394
|
+
}
|
|
395
|
+
else if (pending === 0 && !active.current) {
|
|
396
|
+
catchupStart.current = null;
|
|
397
|
+
}
|
|
398
|
+
/** Where the slice starts, and how much of the list is below it — the two
|
|
399
|
+
* spacers that keep the scrollbar measuring the whole list. */
|
|
400
|
+
const above = virtualizing ? heights.offsetAt(first) : 0;
|
|
401
|
+
const below = virtualizing ? heights.total() - heights.offsetAt(last) : 0;
|
|
402
|
+
return {
|
|
403
|
+
view,
|
|
404
|
+
viewRef,
|
|
405
|
+
slice: { first, last, above, below },
|
|
406
|
+
skeletons,
|
|
407
|
+
jumped,
|
|
408
|
+
catchupSince: catchupStart.current,
|
|
409
|
+
pending,
|
|
410
|
+
scrolled,
|
|
411
|
+
sized,
|
|
412
|
+
sync,
|
|
413
|
+
scrolling,
|
|
414
|
+
fast,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/internal/window.ts"],"names":[],"mappings":"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"}
|
package/dist/table/index.d.ts
CHANGED
|
@@ -5,6 +5,28 @@ import type { Host } from './hx.js';
|
|
|
5
5
|
import type { TableCellState, TableColumn, TableHeaderCellState, TableRow, TableRowId, TableRowState, TableSort } from './rows.js';
|
|
6
6
|
export type { ResolvedWidths, TableCellState, TableColumn, TableHeaderCellState, TableRow, TableRowId, TableRowState, TableSort, } from './rows.js';
|
|
7
7
|
export { MIN_COLUMN, UNSIZED_MIN, columnValue, defaultCompare, orderRows, resolveGetId, resolveWidths, } from './rows.js';
|
|
8
|
+
/**
|
|
9
|
+
* What `renderScrollHint` is told: where the viewport is, while a fast
|
|
10
|
+
* scroll is still being caught up with. The top row itself is included so a
|
|
11
|
+
* hint can show what is *at* this position — a date, a group, a name — the
|
|
12
|
+
* way a photo library's scrubber shows the month.
|
|
13
|
+
*/
|
|
14
|
+
export interface TableScrollHintState<Row = any> {
|
|
15
|
+
/** The first row in view, in display order. */
|
|
16
|
+
row: TableRow<Row>;
|
|
17
|
+
/** Its position, 1-based — "row `from` of `count`". */
|
|
18
|
+
from: number;
|
|
19
|
+
/** The last row in view, 1-based. */
|
|
20
|
+
to: number;
|
|
21
|
+
/** How many rows the table has. */
|
|
22
|
+
count: number;
|
|
23
|
+
/** How many of the rows in view are still placeholders. */
|
|
24
|
+
pending: number;
|
|
25
|
+
/** When the viewport first stopped being whole, epoch ms — what the
|
|
26
|
+
* show-delay was measured against. `Date.now() - since` is how long the
|
|
27
|
+
* user has been looking at unresolved content. */
|
|
28
|
+
since: number;
|
|
29
|
+
}
|
|
8
30
|
/** The selection that just changed, alongside the whole set. `id`/`row` name
|
|
9
31
|
* the row the gesture landed on; a select-all has no single row to name. */
|
|
10
32
|
export interface TableSelectChange<Row> {
|
|
@@ -78,14 +100,25 @@ interface TableBaseProps<Row> extends Omit<BoxProps, 'style' | 'children' | 'ref
|
|
|
78
100
|
*/
|
|
79
101
|
rowHeight?: number;
|
|
80
102
|
/** What an unmeasured row is assumed — and floored — at, while measuring.
|
|
81
|
-
* Default 24. The scrollbar is this guess for every row not yet seen
|
|
82
|
-
*
|
|
103
|
+
* Default 24. The scrollbar is this guess for every row not yet seen; it
|
|
104
|
+
* converges as you scroll, and once enough rows have been measured the
|
|
105
|
+
* guess itself is re-learnt from their mean, so the scrollbar lands near
|
|
106
|
+
* the truth without visiting the whole list. */
|
|
83
107
|
estimatedRowHeight?: number;
|
|
84
108
|
/** Build only the rows on screen. `'auto'` (the default) turns it on past
|
|
85
109
|
* 200 rows. */
|
|
86
110
|
virtual?: boolean | 'auto';
|
|
87
111
|
/** Rows built either side of the viewport. */
|
|
88
112
|
overscan?: number;
|
|
113
|
+
/**
|
|
114
|
+
* Rows built *beyond* the overscan while the table sits idle, per side.
|
|
115
|
+
* Default 40. The pane blits a scroll before React can run, so the only
|
|
116
|
+
* scroll with no blank frame is one that lands on rows already built —
|
|
117
|
+
* this band is that, grown in small steps while nobody is scrolling, and
|
|
118
|
+
* kept behind the viewport so a reversal lands on rows still mounted.
|
|
119
|
+
* `0` turns the band off: the slice is exactly viewport-plus-overscan.
|
|
120
|
+
*/
|
|
121
|
+
prefetch?: number;
|
|
89
122
|
/**
|
|
90
123
|
* Everything inside the row box, given what would have been there.
|
|
91
124
|
*
|
|
@@ -97,6 +130,44 @@ interface TableBaseProps<Row> extends Omit<BoxProps, 'style' | 'children' | 'ref
|
|
|
97
130
|
/** The body's content when the rows resolve empty. Nothing by default —
|
|
98
131
|
* the header still shows. */
|
|
99
132
|
renderEmpty?: () => ReactNode;
|
|
133
|
+
/**
|
|
134
|
+
* The fast-scroll overlay. Shown only while a scroll has outrun the rows
|
|
135
|
+
* far enough that placeholders cover a meaningful part of the viewport —
|
|
136
|
+
* a scroll the table absorbs within a frame never shows it — and hidden
|
|
137
|
+
* the moment the view is whole again. The default is a pill reading
|
|
138
|
+
* "2,345 / 100,000"; return something else to replace it (the state
|
|
139
|
+
* carries the top row, so a hint can show a date or a name instead of a
|
|
140
|
+
* number), or null for no overlay at all.
|
|
141
|
+
*/
|
|
142
|
+
renderScrollHint?: (state: TableScrollHintState<Row>) => ReactNode;
|
|
143
|
+
/**
|
|
144
|
+
* How long the viewport must have been showing unresolved content before
|
|
145
|
+
* the overlay appears, in milliseconds. Default 250: a catch-up the next
|
|
146
|
+
* few frames absorb is never announced. `0` shows it the moment a
|
|
147
|
+
* catch-up engages.
|
|
148
|
+
*/
|
|
149
|
+
scrollHintDelay?: number;
|
|
150
|
+
/**
|
|
151
|
+
* Tuning for the catch-up pacing — how a scroll that outruns the built
|
|
152
|
+
* rows is absorbed. All optional, all in rows:
|
|
153
|
+
*
|
|
154
|
+
* - `threshold` (default 16): more rows than this entering the window in
|
|
155
|
+
* one render is a flood, and floods build skeletons first. Raise it
|
|
156
|
+
* past the window size to never show skeletons; `0` skeletons every
|
|
157
|
+
* scroll.
|
|
158
|
+
* - `burst` (default 24): full rows built per render while the scroll is
|
|
159
|
+
* still moving.
|
|
160
|
+
* - `settle` (default 48): the same once it has stopped.
|
|
161
|
+
*
|
|
162
|
+
* The defaults follow the measured cost of a default-shape row (about
|
|
163
|
+
* twice a skeleton, warm); tables with heavy `render` seams may want
|
|
164
|
+
* smaller budgets, and cheap tables may raise the threshold instead.
|
|
165
|
+
*/
|
|
166
|
+
catchup?: {
|
|
167
|
+
threshold?: number;
|
|
168
|
+
burst?: number;
|
|
169
|
+
settle?: number;
|
|
170
|
+
};
|
|
100
171
|
styles?: TableStyles<Row>;
|
|
101
172
|
style?: StyleProp;
|
|
102
173
|
/** Whether the table is a tab stop. Default true; `false` for a table
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/table/index.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,KAAK,EAEV,aAAa,EACb,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/table/index.ts"],"names":[],"mappings":"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"}
|