@tanstack/virtual-core 3.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,559 @@
1
+ /**
2
+ * virtual-core
3
+ *
4
+ * Copyright (c) TanStack
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE.md file in the root directory of this source tree.
8
+ *
9
+ * @license MIT
10
+ */
11
+ (function (global, factory) {
12
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
13
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
14
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.VirtualCore = {}));
15
+ })(this, (function (exports) { 'use strict';
16
+
17
+ var props = ["bottom", "height", "left", "right", "top", "width"];
18
+
19
+ var rectChanged = function rectChanged(a, b) {
20
+ if (a === void 0) {
21
+ a = {};
22
+ }
23
+
24
+ if (b === void 0) {
25
+ b = {};
26
+ }
27
+
28
+ return props.some(function (prop) {
29
+ return a[prop] !== b[prop];
30
+ });
31
+ };
32
+
33
+ var observedNodes = /*#__PURE__*/new Map();
34
+ var rafId;
35
+
36
+ var run = function run() {
37
+ var changedStates = [];
38
+ observedNodes.forEach(function (state, node) {
39
+ var newRect = node.getBoundingClientRect();
40
+
41
+ if (rectChanged(newRect, state.rect)) {
42
+ state.rect = newRect;
43
+ changedStates.push(state);
44
+ }
45
+ });
46
+ changedStates.forEach(function (state) {
47
+ state.callbacks.forEach(function (cb) {
48
+ return cb(state.rect);
49
+ });
50
+ });
51
+ rafId = window.requestAnimationFrame(run);
52
+ };
53
+
54
+ function observeRect(node, cb) {
55
+ return {
56
+ observe: function observe() {
57
+ var wasEmpty = observedNodes.size === 0;
58
+
59
+ if (observedNodes.has(node)) {
60
+ observedNodes.get(node).callbacks.push(cb);
61
+ } else {
62
+ observedNodes.set(node, {
63
+ rect: undefined,
64
+ hasRectChanged: false,
65
+ callbacks: [cb]
66
+ });
67
+ }
68
+
69
+ if (wasEmpty) run();
70
+ },
71
+ unobserve: function unobserve() {
72
+ var state = observedNodes.get(node);
73
+
74
+ if (state) {
75
+ // Remove the callback
76
+ var index = state.callbacks.indexOf(cb);
77
+ if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference
78
+
79
+ if (!state.callbacks.length) observedNodes["delete"](node); // Stop the loop
80
+
81
+ if (!observedNodes.size) cancelAnimationFrame(rafId);
82
+ }
83
+ }
84
+ };
85
+ }
86
+
87
+ function memo(getDeps, fn, opts) {
88
+ let deps = [];
89
+ let result;
90
+ return () => {
91
+ let depTime;
92
+ if (opts.key && opts.debug != null && opts.debug()) depTime = Date.now();
93
+ const newDeps = getDeps();
94
+ const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);
95
+
96
+ if (!depsChanged) {
97
+ return result;
98
+ }
99
+
100
+ deps = newDeps;
101
+ let resultTime;
102
+ if (opts.key && opts.debug != null && opts.debug()) resultTime = Date.now();
103
+ result = fn(...newDeps);
104
+ opts == null ? void 0 : opts.onChange == null ? void 0 : opts.onChange(result);
105
+
106
+ if (opts.key && opts.debug != null && opts.debug()) {
107
+ const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;
108
+ const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;
109
+ const resultFpsPercentage = resultEndTime / 16;
110
+
111
+ const pad = (str, num) => {
112
+ str = String(str);
113
+
114
+ while (str.length < num) {
115
+ str = ' ' + str;
116
+ }
117
+
118
+ return str;
119
+ };
120
+
121
+ console.info("%c\u23F1 " + pad(resultEndTime, 5) + " /" + pad(depEndTime, 5) + " ms", "\n font-size: .6rem;\n font-weight: bold;\n color: hsl(" + Math.max(0, Math.min(120 - 120 * resultFpsPercentage, 120)) + "deg 100% 31%);", opts == null ? void 0 : opts.key);
122
+ }
123
+
124
+ return result;
125
+ };
126
+ }
127
+
128
+ //
129
+ const defaultEstimateSize = () => 50;
130
+ const defaultKeyExtractor = index => index;
131
+ const defaultRangeExtractor = range => {
132
+ const start = Math.max(range.startIndex - range.overscan, 0);
133
+ const end = Math.min(range.endIndex + range.overscan, range.count - 1);
134
+ const arr = [];
135
+
136
+ for (let i = start; i <= end; i++) {
137
+ arr.push(i);
138
+ }
139
+
140
+ return arr;
141
+ };
142
+ const observeElementRect = (instance, cb) => {
143
+ const observer = observeRect(instance.scrollElement, rect => {
144
+ cb(rect);
145
+ });
146
+
147
+ if (!instance.scrollElement) {
148
+ return;
149
+ }
150
+
151
+ cb(instance.scrollElement.getBoundingClientRect());
152
+ observer.observe();
153
+ return () => {
154
+ observer.unobserve();
155
+ };
156
+ };
157
+ const observeWindowRect = (instance, cb) => {
158
+ const onResize = () => {
159
+ cb({
160
+ width: instance.scrollElement.innerWidth,
161
+ height: instance.scrollElement.innerHeight
162
+ });
163
+ };
164
+
165
+ if (!instance.scrollElement) {
166
+ return;
167
+ }
168
+
169
+ onResize();
170
+ instance.scrollElement.addEventListener('resize', onResize, {
171
+ capture: false,
172
+ passive: true
173
+ });
174
+ return () => {
175
+ instance.scrollElement.removeEventListener('resize', onResize);
176
+ };
177
+ };
178
+ const observeElementOffset = (instance, cb) => {
179
+ const onScroll = () => cb(instance.scrollElement[instance.options.horizontal ? 'scrollLeft' : 'scrollTop']);
180
+
181
+ if (!instance.scrollElement) {
182
+ return;
183
+ }
184
+
185
+ onScroll();
186
+ instance.scrollElement.addEventListener('scroll', onScroll, {
187
+ capture: false,
188
+ passive: true
189
+ });
190
+ return () => {
191
+ instance.scrollElement.removeEventListener('scroll', onScroll);
192
+ };
193
+ };
194
+ const observeWindowOffset = (instance, cb) => {
195
+ const onScroll = () => cb(instance.scrollElement[instance.options.horizontal ? 'scrollX' : 'scrollY']);
196
+
197
+ if (!instance.scrollElement) {
198
+ return;
199
+ }
200
+
201
+ onScroll();
202
+ instance.scrollElement.addEventListener('scroll', onScroll, {
203
+ capture: false,
204
+ passive: true
205
+ });
206
+ return () => {
207
+ instance.scrollElement.removeEventListener('scroll', onScroll);
208
+ };
209
+ };
210
+ const defaultMeasureElement = (element, instance) => {
211
+ return element.getBoundingClientRect()[instance.getSizeKey()];
212
+ };
213
+ const windowScroll = (offset, canSmooth, instance) => {
214
+ var _instance$scrollEleme;
215
+ (_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo({
216
+ [instance.options.horizontal ? 'left' : 'top']: offset,
217
+ behavior: canSmooth ? 'smooth' : undefined
218
+ });
219
+ };
220
+ const elementScroll = (offset, canSmooth, instance) => {
221
+ var _instance$scrollEleme2;
222
+ (_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo({
223
+ [instance.options.horizontal ? 'left' : 'top']: offset,
224
+ behavior: canSmooth ? 'smooth' : undefined
225
+ });
226
+ };
227
+ class Virtualizer {
228
+ //
229
+ // virtualItems: VirtualItem<TItemElement>[]
230
+ // totalSize: number
231
+ // scrollToOffset: (offset: number, options?: ScrollToOffsetOptions) => void
232
+ // scrollToIndex: (index: number, options?: ScrollToIndexOptions) => void
233
+ // measure: (index: number) => void
234
+ constructor(_opts) {
235
+ var _this = this;
236
+
237
+ this.unsubs = [];
238
+ this.scrollElement = null;
239
+ this.measurementsCache = [];
240
+ this.itemMeasurementsCache = {};
241
+ this.pendingMeasuredCacheIndexes = [];
242
+
243
+ this.setOptions = opts => {
244
+ Object.entries(opts).forEach(_ref => {
245
+ let [key, value] = _ref;
246
+ if (typeof value === 'undefined') delete opts[key];
247
+ });
248
+ this.options = {
249
+ debug: false,
250
+ initialOffset: 0,
251
+ estimateSize: defaultEstimateSize,
252
+ overscan: 1,
253
+ paddingStart: 0,
254
+ paddingEnd: 0,
255
+ horizontal: false,
256
+ keyExtractor: defaultKeyExtractor,
257
+ rangeExtractor: defaultRangeExtractor,
258
+ enableSmoothScroll: false,
259
+ onChange: () => {},
260
+ measureElement: defaultMeasureElement,
261
+ initialRect: {
262
+ width: 0,
263
+ height: 0
264
+ },
265
+ ...opts
266
+ };
267
+ };
268
+
269
+ this.notify = () => {
270
+ var _this$options$onChang, _this$options;
271
+
272
+ (_this$options$onChang = (_this$options = this.options).onChange) == null ? void 0 : _this$options$onChang.call(_this$options, this);
273
+ };
274
+
275
+ this.cleanup = () => {
276
+ this.unsubs.filter(Boolean).forEach(d => d());
277
+ this.unsubs = [];
278
+ };
279
+
280
+ this._didMount = () => {
281
+ return () => {
282
+ this.cleanup();
283
+ };
284
+ };
285
+
286
+ this._willUpdate = () => {
287
+ const scrollElement = this.options.getScrollElement();
288
+
289
+ if (this.scrollElement !== scrollElement) {
290
+ this.cleanup();
291
+ this.scrollElement = scrollElement;
292
+ this.unsubs.push(this.options.observeElementRect(this, rect => {
293
+ this.scrollRect = rect;
294
+ this.notify();
295
+ }));
296
+ this.unsubs.push(this.options.observeElementOffset(this, offset => {
297
+ this.scrollOffset = offset;
298
+ this.notify();
299
+ }));
300
+ }
301
+ };
302
+
303
+ this.getSize = () => {
304
+ return this.scrollRect[this.getSizeKey()];
305
+ };
306
+
307
+ this.getMeasurements = memo(() => [this.options.count, this.options.paddingStart, this.getEstimateSizeFn(), this.options.keyExtractor, this.itemMeasurementsCache], (count, paddingStart, estimateSize, keyExtractor, measurementsCache) => {
308
+ const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
309
+ this.pendingMeasuredCacheIndexes = [];
310
+ const measurements = this.measurementsCache.slice(0, min);
311
+
312
+ for (let i = min; i < count; i++) {
313
+ const key = keyExtractor(i);
314
+ const measuredSize = measurementsCache[key];
315
+ const start = measurements[i - 1] ? measurements[i - 1].end : paddingStart;
316
+ const size = typeof measuredSize === 'number' ? measuredSize : estimateSize(i);
317
+ const end = start + size;
318
+ measurements[i] = {
319
+ index: i,
320
+ start,
321
+ size,
322
+ end,
323
+ key
324
+ };
325
+ }
326
+
327
+ this.measurementsCache = measurements;
328
+ return measurements;
329
+ }, {
330
+ key: 'getMeasurements',
331
+ debug: () => this.options.debug
332
+ });
333
+ this.calculateRange = memo(() => [this.getMeasurements(), this.getSize(), this.scrollOffset], (measurements, outerSize, scrollOffset) => {
334
+ return calculateRange({
335
+ measurements,
336
+ outerSize,
337
+ scrollOffset
338
+ });
339
+ }, {
340
+ key: 'calculateRange',
341
+ debug: () => this.options.debug
342
+ });
343
+ this.getIndexes = memo(() => [this.options.rangeExtractor, this.calculateRange(), this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
344
+ return rangeExtractor({ ...range,
345
+ overscan,
346
+ count: count
347
+ });
348
+ }, {
349
+ key: 'getIndexes'
350
+ });
351
+ this.getVirtualItems = memo(() => [this.getIndexes(), this.getMeasurements(), this.options.measureElement], (indexes, measurements, measureElement) => {
352
+ const virtualItems = [];
353
+
354
+ for (let k = 0, len = indexes.length; k < len; k++) {
355
+ const i = indexes[k];
356
+ const measurement = measurements[i];
357
+ const item = { ...measurement,
358
+ measureElement: measurableItem => {
359
+ if (measurableItem) {
360
+ const measuredItemSize = measureElement(measurableItem, this);
361
+
362
+ if (measuredItemSize !== item.size) {
363
+ if (item.start < this.scrollOffset) {
364
+ if (this.options.debug) console.info('correction', measuredItemSize - item.size);
365
+
366
+ this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
367
+ }
368
+
369
+ this.pendingMeasuredCacheIndexes.push(i);
370
+ this.itemMeasurementsCache = { ...this.itemMeasurementsCache,
371
+ [item.key]: measuredItemSize
372
+ };
373
+ this.notify();
374
+ }
375
+ }
376
+ }
377
+ };
378
+ virtualItems.push(item);
379
+ }
380
+
381
+ return virtualItems;
382
+ }, {
383
+ key: 'getIndexes'
384
+ });
385
+
386
+ this.scrollToOffset = function (toOffset, _temp) {
387
+ let {
388
+ align
389
+ } = _temp === void 0 ? {
390
+ align: 'start'
391
+ } : _temp;
392
+ const offset = _this.scrollOffset;
393
+
394
+ const size = _this.getSize();
395
+
396
+ if (align === 'auto') {
397
+ if (toOffset <= offset) {
398
+ align = 'start';
399
+ } else if (toOffset >= offset + size) {
400
+ align = 'end';
401
+ } else {
402
+ align = 'start';
403
+ }
404
+ }
405
+
406
+ if (align === 'start') {
407
+ _this._scrollToOffset(toOffset, true);
408
+ } else if (align === 'end') {
409
+ _this._scrollToOffset(toOffset - size, true);
410
+ } else if (align === 'center') {
411
+ _this._scrollToOffset(toOffset - size / 2, true);
412
+ }
413
+ };
414
+
415
+ this.tryScrollToIndex = function (index, _temp2) {
416
+ let {
417
+ align,
418
+ ...rest
419
+ } = _temp2 === void 0 ? {
420
+ align: 'auto'
421
+ } : _temp2;
422
+
423
+ const measurements = _this.getMeasurements();
424
+
425
+ const offset = _this.scrollOffset;
426
+
427
+ const size = _this.getSize();
428
+
429
+ const {
430
+ count
431
+ } = _this.options;
432
+ const measurement = measurements[Math.max(0, Math.min(index, count - 1))];
433
+
434
+ if (!measurement) {
435
+ return;
436
+ }
437
+
438
+ if (align === 'auto') {
439
+ if (measurement.end >= offset + size) {
440
+ align = 'end';
441
+ } else if (measurement.start <= offset) {
442
+ align = 'start';
443
+ } else {
444
+ return;
445
+ }
446
+ }
447
+
448
+ const toOffset = align === 'center' ? measurement.start + measurement.size / 2 : align === 'end' ? measurement.end : measurement.start;
449
+
450
+ _this.scrollToOffset(toOffset, {
451
+ align,
452
+ ...rest
453
+ });
454
+ };
455
+
456
+ this.scrollToIndex = (index, options) => {
457
+ // We do a double request here because of
458
+ // dynamic sizes which can cause offset shift
459
+ // and end up in the wrong spot. Unfortunately,
460
+ // we can't know about those dynamic sizes until
461
+ // we try and render them. So double down!
462
+ this.tryScrollToIndex(index, options);
463
+ requestAnimationFrame(() => {
464
+ this.tryScrollToIndex(index, options);
465
+ });
466
+ };
467
+
468
+ this.getTotalSize = () => {
469
+ var _this$getMeasurements;
470
+
471
+ return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
472
+ };
473
+
474
+ this.getSizeKey = () => this.options.horizontal ? 'width' : 'height';
475
+
476
+ this._scrollToOffset = (offset, canSmooth) => {
477
+ this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
478
+ };
479
+
480
+ this.getEstimateSizeFn = memo(() => [this.options.estimateSize], d => d, {
481
+ key: false,
482
+ onChange: () => {
483
+ this.itemMeasurementsCache = {};
484
+ }
485
+ });
486
+
487
+ this.measure = () => {
488
+ this.itemMeasurementsCache = {};
489
+ this.notify();
490
+ };
491
+
492
+ this.setOptions(_opts);
493
+ this.scrollRect = this.options.initialRect;
494
+ this.scrollOffset = this.options.initialOffset;
495
+ }
496
+
497
+ }
498
+
499
+ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
500
+ while (low <= high) {
501
+ const middle = (low + high) / 2 | 0;
502
+ const currentValue = getCurrentValue(middle);
503
+
504
+ if (currentValue < value) {
505
+ low = middle + 1;
506
+ } else if (currentValue > value) {
507
+ high = middle - 1;
508
+ } else {
509
+ return middle;
510
+ }
511
+ }
512
+
513
+ if (low > 0) {
514
+ return low - 1;
515
+ } else {
516
+ return 0;
517
+ }
518
+ };
519
+
520
+ function calculateRange(_ref2) {
521
+ let {
522
+ measurements,
523
+ outerSize,
524
+ scrollOffset
525
+ } = _ref2;
526
+ const count = measurements.length - 1;
527
+
528
+ const getOffset = index => measurements[index].start;
529
+
530
+ const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset);
531
+ let endIndex = startIndex;
532
+
533
+ while (endIndex < count && measurements[endIndex].end < scrollOffset + outerSize) {
534
+ endIndex++;
535
+ }
536
+
537
+ return {
538
+ startIndex,
539
+ endIndex
540
+ };
541
+ }
542
+
543
+ exports.Virtualizer = Virtualizer;
544
+ exports.defaultEstimateSize = defaultEstimateSize;
545
+ exports.defaultKeyExtractor = defaultKeyExtractor;
546
+ exports.defaultMeasureElement = defaultMeasureElement;
547
+ exports.defaultRangeExtractor = defaultRangeExtractor;
548
+ exports.elementScroll = elementScroll;
549
+ exports.memo = memo;
550
+ exports.observeElementOffset = observeElementOffset;
551
+ exports.observeElementRect = observeElementRect;
552
+ exports.observeWindowOffset = observeWindowOffset;
553
+ exports.observeWindowRect = observeWindowRect;
554
+ exports.windowScroll = windowScroll;
555
+
556
+ Object.defineProperty(exports, '__esModule', { value: true });
557
+
558
+ }));
559
+ //# sourceMappingURL=index.development.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.development.js","sources":["../../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["var props = [\"bottom\", \"height\", \"left\", \"right\", \"top\", \"width\"];\n\nvar rectChanged = function rectChanged(a, b) {\n if (a === void 0) {\n a = {};\n }\n\n if (b === void 0) {\n b = {};\n }\n\n return props.some(function (prop) {\n return a[prop] !== b[prop];\n });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n var changedStates = [];\n observedNodes.forEach(function (state, node) {\n var newRect = node.getBoundingClientRect();\n\n if (rectChanged(newRect, state.rect)) {\n state.rect = newRect;\n changedStates.push(state);\n }\n });\n changedStates.forEach(function (state) {\n state.callbacks.forEach(function (cb) {\n return cb(state.rect);\n });\n });\n rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n return {\n observe: function observe() {\n var wasEmpty = observedNodes.size === 0;\n\n if (observedNodes.has(node)) {\n observedNodes.get(node).callbacks.push(cb);\n } else {\n observedNodes.set(node, {\n rect: undefined,\n hasRectChanged: false,\n callbacks: [cb]\n });\n }\n\n if (wasEmpty) run();\n },\n unobserve: function unobserve() {\n var state = observedNodes.get(node);\n\n if (state) {\n // Remove the callback\n var index = state.callbacks.indexOf(cb);\n if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n if (!observedNodes.size) cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\nexport default observeRect;\n//# sourceMappingURL=observe-rect.esm.js.map\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n","import observeRect from '@reach/observe-rect'\nimport React from 'react'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultEstimateSize = () => 50\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const defaultMeasureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[instance.getSizeKey()]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n count: number\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n getScrollElement: () => TScrollElement\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n //\n\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n estimateSize?: (index: number) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n initialOffset?: number\n keyExtractor?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n\n //\n // virtualItems: VirtualItem<TItemElement>[]\n // totalSize: number\n // scrollToOffset: (offset: number, options?: ScrollToOffsetOptions) => void\n // scrollToIndex: (index: number, options?: ScrollToIndexOptions) => void\n // measure: (index: number) => void\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n estimateSize: defaultEstimateSize,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n keyExtractor: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: false,\n onChange: () => {},\n measureElement: defaultMeasureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.getSizeKey()]\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.getEstimateSizeFn(),\n this.options.keyExtractor,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, estimateSize, keyExtractor, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = keyExtractor(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number' ? measuredSize : estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n private tryScrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size) {\n align = 'end'\n } else if (measurement.start <= offset) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'center'\n ? measurement.start + measurement.size / 2\n : align === 'end'\n ? measurement.end\n : measurement.start\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n scrollToIndex = (index: number, options?: ScrollToIndexOptions) => {\n // We do a double request here because of\n // dynamic sizes which can cause offset shift\n // and end up in the wrong spot. Unfortunately,\n // we can't know about those dynamic sizes until\n // we try and render them. So double down!\n this.tryScrollToIndex(index, options)\n requestAnimationFrame(() => {\n this.tryScrollToIndex(index, options)\n })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n getSizeKey = () => (this.options.horizontal ? 'width' : 'height')\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n this.options.scrollToFn(\n offset,\n this.options.enableSmoothScroll && canSmooth,\n this,\n )\n }\n\n private getEstimateSizeFn = memo(\n () => [this.options.estimateSize],\n (d) => d,\n {\n key: false,\n onChange: () => {\n this.itemMeasurementsCache = {}\n },\n },\n )\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["memo","getDeps","fn","opts","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultEstimateSize","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","observeElementRect","instance","cb","observer","observeRect","scrollElement","rect","getBoundingClientRect","observe","unobserve","observeWindowRect","onResize","width","innerWidth","height","innerHeight","addEventListener","capture","passive","removeEventListener","observeElementOffset","onScroll","options","horizontal","observeWindowOffset","defaultMeasureElement","element","getSizeKey","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","forEach","value","initialOffset","estimateSize","paddingStart","paddingEnd","keyExtractor","rangeExtractor","enableSmoothScroll","measureElement","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","getEstimateSizeFn","measurements","slice","measuredSize","size","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","virtualItems","k","len","measurement","item","measurableItem","measuredItemSize","_scrollToOffset","scrollToOffset","toOffset","align","tryScrollToIndex","rest","scrollToIndex","requestAnimationFrame","getTotalSize","scrollToFn","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * virtual-core
3
+ *
4
+ * Copyright (c) TanStack
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE.md file in the root directory of this source tree.
8
+ *
9
+ * @license MIT
10
+ */
11
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).VirtualCore={})}(this,(function(e){"use strict";var t,s=["bottom","height","left","right","top","width"],n=new Map,o=function e(){var o=[];n.forEach((function(e,t){var n,i,l=t.getBoundingClientRect();n=l,i=e.rect,void 0===n&&(n={}),void 0===i&&(i={}),s.some((function(e){return n[e]!==i[e]}))&&(e.rect=l,o.push(e))})),o.forEach((function(e){e.callbacks.forEach((function(t){return t(e.rect)}))})),t=window.requestAnimationFrame(e)};function i(e,t,s){let n,o=[];return()=>{let i;s.key&&null!=s.debug&&s.debug()&&(i=Date.now());const l=e();if(!(l.length!==o.length||l.some(((e,t)=>o[t]!==e))))return n;let r;if(o=l,s.key&&null!=s.debug&&s.debug()&&(r=Date.now()),n=t(...l),null==s||null==s.onChange||s.onChange(n),s.key&&null!=s.debug&&s.debug()){const e=Math.round(100*(Date.now()-i))/100,t=Math.round(100*(Date.now()-r))/100,n=t/16,o=(e,t)=>{for(e=String(e);e.length<t;)e=" "+e;return e};console.info("%c⏱ "+o(t,5)+" /"+o(e,5)+" ms","\n font-size: .6rem;\n font-weight: bold;\n color: hsl("+Math.max(0,Math.min(120-120*n,120))+"deg 100% 31%);",null==s?void 0:s.key)}return n}}const l=()=>50,r=e=>e,a=e=>{const t=Math.max(e.startIndex-e.overscan,0),s=Math.min(e.endIndex+e.overscan,e.count-1),n=[];for(let e=t;e<=s;e++)n.push(e);return n},c=(e,t)=>e.getBoundingClientRect()[t.getSizeKey()];e.Virtualizer=class{constructor(e){var t=this;this.unsubs=[],this.scrollElement=null,this.measurementsCache=[],this.itemMeasurementsCache={},this.pendingMeasuredCacheIndexes=[],this.setOptions=e=>{Object.entries(e).forEach((t=>{let[s,n]=t;void 0===n&&delete e[s]})),this.options={debug:!1,initialOffset:0,estimateSize:l,overscan:1,paddingStart:0,paddingEnd:0,horizontal:!1,keyExtractor:r,rangeExtractor:a,enableSmoothScroll:!1,onChange:()=>{},measureElement:c,initialRect:{width:0,height:0},...e}},this.notify=()=>{var e,t;null==(e=(t=this.options).onChange)||e.call(t,this)},this.cleanup=()=>{this.unsubs.filter(Boolean).forEach((e=>e())),this.unsubs=[]},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{const e=this.options.getScrollElement();this.scrollElement!==e&&(this.cleanup(),this.scrollElement=e,this.unsubs.push(this.options.observeElementRect(this,(e=>{this.scrollRect=e,this.notify()}))),this.unsubs.push(this.options.observeElementOffset(this,(e=>{this.scrollOffset=e,this.notify()}))))},this.getSize=()=>this.scrollRect[this.getSizeKey()],this.getMeasurements=i((()=>[this.options.count,this.options.paddingStart,this.getEstimateSizeFn(),this.options.keyExtractor,this.itemMeasurementsCache]),((e,t,s,n,o)=>{const i=this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[];const l=this.measurementsCache.slice(0,i);for(let r=i;r<e;r++){const e=n(r),i=o[e],a=l[r-1]?l[r-1].end:t,c="number"==typeof i?i:s(r),h=a+c;l[r]={index:r,start:a,size:c,end:h,key:e}}return this.measurementsCache=l,l}),{key:!1,debug:()=>this.options.debug}),this.calculateRange=i((()=>[this.getMeasurements(),this.getSize(),this.scrollOffset]),((e,t,s)=>function(e){let{measurements:t,outerSize:s,scrollOffset:n}=e;const o=t.length-1,i=((e,t,s,n)=>{for(;e<=t;){const o=(e+t)/2|0,i=s(o);if(i<n)e=o+1;else{if(!(i>n))return o;t=o-1}}return e>0?e-1:0})(0,o,(e=>t[e].start),n);let l=i;for(;l<o&&t[l].end<n+s;)l++;return{startIndex:i,endIndex:l}}({measurements:e,outerSize:t,scrollOffset:s})),{key:!1,debug:()=>this.options.debug}),this.getIndexes=i((()=>[this.options.rangeExtractor,this.calculateRange(),this.options.overscan,this.options.count]),((e,t,s,n)=>e({...t,overscan:s,count:n})),{key:!1}),this.getVirtualItems=i((()=>[this.getIndexes(),this.getMeasurements(),this.options.measureElement]),((e,t,s)=>{const n=[];for(let o=0,i=e.length;o<i;o++){const i=e[o],l={...t[i],measureElement:e=>{if(e){const t=s(e,this);t!==l.size&&(l.start<this.scrollOffset&&this._scrollToOffset(this.scrollOffset+(t-l.size),!1),this.pendingMeasuredCacheIndexes.push(i),this.itemMeasurementsCache={...this.itemMeasurementsCache,[l.key]:t},this.notify())}}};n.push(l)}return n}),{key:!1}),this.scrollToOffset=function(e,s){let{align:n}=void 0===s?{align:"start"}:s;const o=t.scrollOffset,i=t.getSize();"auto"===n&&(n=e<=o?"start":e>=o+i?"end":"start"),"start"===n?t._scrollToOffset(e,!0):"end"===n?t._scrollToOffset(e-i,!0):"center"===n&&t._scrollToOffset(e-i/2,!0)},this.tryScrollToIndex=function(e,s){let{align:n,...o}=void 0===s?{align:"auto"}:s;const i=t.getMeasurements(),l=t.scrollOffset,r=t.getSize(),{count:a}=t.options,c=i[Math.max(0,Math.min(e,a-1))];if(!c)return;if("auto"===n)if(c.end>=l+r)n="end";else{if(!(c.start<=l))return;n="start"}const h="center"===n?c.start+c.size/2:"end"===n?c.end:c.start;t.scrollToOffset(h,{align:n,...o})},this.scrollToIndex=(e,t)=>{this.tryScrollToIndex(e,t),requestAnimationFrame((()=>{this.tryScrollToIndex(e,t)}))},this.getTotalSize=()=>{var e;return((null==(e=this.getMeasurements()[this.options.count-1])?void 0:e.end)||this.options.paddingStart)+this.options.paddingEnd},this.getSizeKey=()=>this.options.horizontal?"width":"height",this._scrollToOffset=(e,t)=>{this.options.scrollToFn(e,this.options.enableSmoothScroll&&t,this)},this.getEstimateSizeFn=i((()=>[this.options.estimateSize]),(e=>e),{key:!1,onChange:()=>{this.itemMeasurementsCache={}}}),this.measure=()=>{this.itemMeasurementsCache={},this.notify()},this.setOptions(e),this.scrollRect=this.options.initialRect,this.scrollOffset=this.options.initialOffset}},e.defaultEstimateSize=l,e.defaultKeyExtractor=r,e.defaultMeasureElement=c,e.defaultRangeExtractor=a,e.elementScroll=(e,t,s)=>{var n;null==(n=s.scrollElement)||n.scrollTo({[s.options.horizontal?"left":"top"]:e,behavior:t?"smooth":void 0})},e.memo=i,e.observeElementOffset=(e,t)=>{const s=()=>t(e.scrollElement[e.options.horizontal?"scrollLeft":"scrollTop"]);if(e.scrollElement)return s(),e.scrollElement.addEventListener("scroll",s,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("scroll",s)}},e.observeElementRect=(e,s)=>{const i=function(e,s){return{observe:function(){var t=0===n.size;n.has(e)?n.get(e).callbacks.push(s):n.set(e,{rect:void 0,hasRectChanged:!1,callbacks:[s]}),t&&o()},unobserve:function(){var o=n.get(e);if(o){var i=o.callbacks.indexOf(s);i>=0&&o.callbacks.splice(i,1),o.callbacks.length||n.delete(e),n.size||cancelAnimationFrame(t)}}}}(e.scrollElement,(e=>{s(e)}));if(e.scrollElement)return s(e.scrollElement.getBoundingClientRect()),i.observe(),()=>{i.unobserve()}},e.observeWindowOffset=(e,t)=>{const s=()=>t(e.scrollElement[e.options.horizontal?"scrollX":"scrollY"]);if(e.scrollElement)return s(),e.scrollElement.addEventListener("scroll",s,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("scroll",s)}},e.observeWindowRect=(e,t)=>{const s=()=>{t({width:e.scrollElement.innerWidth,height:e.scrollElement.innerHeight})};if(e.scrollElement)return s(),e.scrollElement.addEventListener("resize",s,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("resize",s)}},e.windowScroll=(e,t,s)=>{var n;null==(n=s.scrollElement)||n.scrollTo({[s.options.horizontal?"left":"top"]:e,behavior:t?"smooth":void 0})},Object.defineProperty(e,"__esModule",{value:!0})}));
12
+ //# sourceMappingURL=index.production.js.map