lkd-web-kit 0.8.1 → 0.8.2

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.
Files changed (58) hide show
  1. package/dist/components/EmptyState/index.cjs +1 -1
  2. package/dist/components/Icon.cjs +1 -1
  3. package/dist/components/InfinityLoadMoreButton/index.cjs +1 -1
  4. package/dist/components/InfinitySelect/index.cjs +3 -3
  5. package/dist/components/InfinitySelect/index.js +1 -1
  6. package/dist/components/MyCheckboxGroup/index.cjs +1 -1
  7. package/dist/components/MyDateInput/index.cjs +1 -1
  8. package/dist/components/MyDatePickerInput/CalendarIcon.cjs +1 -1
  9. package/dist/components/MyDatePickerInput/index.cjs +1 -1
  10. package/dist/components/MyDateTimePicker/index.cjs +1 -1
  11. package/dist/components/MyMonthPickerInput/index.cjs +1 -1
  12. package/dist/components/MyMultiSelect/index.cjs +1 -1
  13. package/dist/components/MyNotifications/index.cjs +2 -2
  14. package/dist/components/MyNotifications/index.js +1 -1
  15. package/dist/components/MyNumberInput/index.cjs +1 -1
  16. package/dist/components/MyRadioGroup/index.cjs +1 -1
  17. package/dist/components/MySelect/index.cjs +1 -1
  18. package/dist/components/MyTextInput/index.cjs +1 -1
  19. package/dist/components/MyTextarea/index.cjs +1 -1
  20. package/dist/components/MyTimeInput/index.cjs +1 -1
  21. package/dist/components/NavItems.cjs +1 -1
  22. package/dist/contexts/NavigationHistoryContext/hook.cjs +1 -1
  23. package/dist/contexts/NavigationHistoryContext/index.cjs +1 -1
  24. package/dist/contexts/PageDataContext/index.cjs +1 -1
  25. package/dist/form/Form.cjs +1 -1
  26. package/dist/form/FormSubmitButton.cjs +1 -1
  27. package/dist/form/base/FormCheckbox.cjs +1 -1
  28. package/dist/form/base/FormCheckboxGroup.cjs +1 -1
  29. package/dist/form/base/FormDateInput.cjs +1 -1
  30. package/dist/form/base/FormDatePickerInput.cjs +1 -1
  31. package/dist/form/base/FormDateTimePicker.cjs +1 -1
  32. package/dist/form/base/FormMonthPickerInput.cjs +1 -1
  33. package/dist/form/base/FormMultiSelect.cjs +1 -1
  34. package/dist/form/base/FormNumberInput.cjs +1 -1
  35. package/dist/form/base/FormRadioGroup.cjs +1 -1
  36. package/dist/form/base/FormSelect.cjs +1 -1
  37. package/dist/form/base/FormSelectInfinity.cjs +1 -1
  38. package/dist/form/base/FormTextInput.cjs +1 -1
  39. package/dist/form/base/FormTextarea.cjs +1 -1
  40. package/dist/form/base/FormTimeInput.cjs +1 -1
  41. package/dist/form/utils/nullable-but-required.cjs +1 -1
  42. package/dist/form/utils/optional-but-required.cjs +1 -1
  43. package/dist/hocs/withController.cjs +1 -1
  44. package/dist/hocs/withModalManager.cjs +1 -1
  45. package/dist/hooks/useBreakpoint.cjs +1 -1
  46. package/dist/hooks/useOnScrollProgress.cjs +1 -1
  47. package/dist/hooks/useUpdateSearchParams.cjs +1 -1
  48. package/dist/hooks/useZodConfig.cjs +1 -1
  49. package/dist/mantine/my-default-theme.cjs +1 -1
  50. package/dist/utils/ky/addBodyJsonHook.cjs +1 -1
  51. package/package.json +4 -4
  52. package/dist/node_modules/@mantine/notifications/styles.css +0 -42
  53. package/dist/node_modules/@tanstack/react-virtual/dist/esm/index.cjs +0 -39
  54. package/dist/node_modules/@tanstack/react-virtual/dist/esm/index.js +0 -37
  55. package/dist/node_modules/@tanstack/virtual-core/dist/esm/index.cjs +0 -716
  56. package/dist/node_modules/@tanstack/virtual-core/dist/esm/index.js +0 -710
  57. package/dist/node_modules/@tanstack/virtual-core/dist/esm/utils.cjs +0 -55
  58. package/dist/node_modules/@tanstack/virtual-core/dist/esm/utils.js +0 -52
@@ -1,710 +0,0 @@
1
- import { approxEqual, debounce, memo, notUndefined } from "./utils.js";
2
- //#region node_modules/@tanstack/virtual-core/dist/esm/index.js
3
- var getRect = (element) => {
4
- const { offsetWidth, offsetHeight } = element;
5
- return {
6
- width: offsetWidth,
7
- height: offsetHeight
8
- };
9
- };
10
- var defaultKeyExtractor = (index) => index;
11
- var defaultRangeExtractor = (range) => {
12
- const start = Math.max(range.startIndex - range.overscan, 0);
13
- const end = Math.min(range.endIndex + range.overscan, range.count - 1);
14
- const arr = [];
15
- for (let i = start; i <= end; i++) arr.push(i);
16
- return arr;
17
- };
18
- var observeElementRect = (instance, cb) => {
19
- const element = instance.scrollElement;
20
- if (!element) return;
21
- const targetWindow = instance.targetWindow;
22
- if (!targetWindow) return;
23
- const handler = (rect) => {
24
- const { width, height } = rect;
25
- cb({
26
- width: Math.round(width),
27
- height: Math.round(height)
28
- });
29
- };
30
- handler(getRect(element));
31
- if (!targetWindow.ResizeObserver) return () => {};
32
- const observer = new targetWindow.ResizeObserver((entries) => {
33
- const run = () => {
34
- const entry = entries[0];
35
- if (entry == null ? void 0 : entry.borderBoxSize) {
36
- const box = entry.borderBoxSize[0];
37
- if (box) {
38
- handler({
39
- width: box.inlineSize,
40
- height: box.blockSize
41
- });
42
- return;
43
- }
44
- }
45
- handler(getRect(element));
46
- };
47
- instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();
48
- });
49
- observer.observe(element, { box: "border-box" });
50
- return () => {
51
- observer.unobserve(element);
52
- };
53
- };
54
- var addEventListenerOptions = { passive: true };
55
- var supportsScrollend = typeof window == "undefined" ? true : "onscrollend" in window;
56
- var observeElementOffset = (instance, cb) => {
57
- const element = instance.scrollElement;
58
- if (!element) return;
59
- const targetWindow = instance.targetWindow;
60
- if (!targetWindow) return;
61
- let offset = 0;
62
- const fallback = instance.options.useScrollendEvent && supportsScrollend ? () => void 0 : debounce(targetWindow, () => {
63
- cb(offset, false);
64
- }, instance.options.isScrollingResetDelay);
65
- const createHandler = (isScrolling) => () => {
66
- const { horizontal, isRtl } = instance.options;
67
- offset = horizontal ? element["scrollLeft"] * (isRtl && -1 || 1) : element["scrollTop"];
68
- fallback();
69
- cb(offset, isScrolling);
70
- };
71
- const handler = createHandler(true);
72
- const endHandler = createHandler(false);
73
- element.addEventListener("scroll", handler, addEventListenerOptions);
74
- const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;
75
- if (registerScrollendEvent) element.addEventListener("scrollend", endHandler, addEventListenerOptions);
76
- return () => {
77
- element.removeEventListener("scroll", handler);
78
- if (registerScrollendEvent) element.removeEventListener("scrollend", endHandler);
79
- };
80
- };
81
- var measureElement = (element, entry, instance) => {
82
- if (entry == null ? void 0 : entry.borderBoxSize) {
83
- const box = entry.borderBoxSize[0];
84
- if (box) return Math.round(box[instance.options.horizontal ? "inlineSize" : "blockSize"]);
85
- }
86
- return element[instance.options.horizontal ? "offsetWidth" : "offsetHeight"];
87
- };
88
- var elementScroll = (offset, { adjustments = 0, behavior }, instance) => {
89
- var _a, _b;
90
- const toOffset = offset + adjustments;
91
- (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null || _b.call(_a, {
92
- [instance.options.horizontal ? "left" : "top"]: toOffset,
93
- behavior
94
- });
95
- };
96
- var Virtualizer = class {
97
- constructor(opts) {
98
- this.unsubs = [];
99
- this.scrollElement = null;
100
- this.targetWindow = null;
101
- this.isScrolling = false;
102
- this.scrollState = null;
103
- this.measurementsCache = [];
104
- this.itemSizeCache = /* @__PURE__ */ new Map();
105
- this.laneAssignments = /* @__PURE__ */ new Map();
106
- this.pendingMeasuredCacheIndexes = [];
107
- this.prevLanes = void 0;
108
- this.lanesChangedFlag = false;
109
- this.lanesSettling = false;
110
- this.scrollRect = null;
111
- this.scrollOffset = null;
112
- this.scrollDirection = null;
113
- this.scrollAdjustments = 0;
114
- this.elementsCache = /* @__PURE__ */ new Map();
115
- this.now = () => {
116
- var _a, _b, _c;
117
- return ((_c = (_b = (_a = this.targetWindow) == null ? void 0 : _a.performance) == null ? void 0 : _b.now) == null ? void 0 : _c.call(_b)) ?? Date.now();
118
- };
119
- this.observer = /* @__PURE__ */ (() => {
120
- let _ro = null;
121
- const get = () => {
122
- if (_ro) return _ro;
123
- if (!this.targetWindow || !this.targetWindow.ResizeObserver) return null;
124
- return _ro = new this.targetWindow.ResizeObserver((entries) => {
125
- entries.forEach((entry) => {
126
- const run = () => {
127
- const node = entry.target;
128
- const index = this.indexFromElement(node);
129
- if (!node.isConnected) {
130
- this.observer.unobserve(node);
131
- return;
132
- }
133
- if (this.shouldMeasureDuringScroll(index)) this.resizeItem(index, this.options.measureElement(node, entry, this));
134
- };
135
- this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();
136
- });
137
- });
138
- };
139
- return {
140
- disconnect: () => {
141
- var _a;
142
- (_a = get()) == null || _a.disconnect();
143
- _ro = null;
144
- },
145
- observe: (target) => {
146
- var _a;
147
- return (_a = get()) == null ? void 0 : _a.observe(target, { box: "border-box" });
148
- },
149
- unobserve: (target) => {
150
- var _a;
151
- return (_a = get()) == null ? void 0 : _a.unobserve(target);
152
- }
153
- };
154
- })();
155
- this.range = null;
156
- this.setOptions = (opts2) => {
157
- Object.entries(opts2).forEach(([key, value]) => {
158
- if (typeof value === "undefined") delete opts2[key];
159
- });
160
- this.options = {
161
- debug: false,
162
- initialOffset: 0,
163
- overscan: 1,
164
- paddingStart: 0,
165
- paddingEnd: 0,
166
- scrollPaddingStart: 0,
167
- scrollPaddingEnd: 0,
168
- horizontal: false,
169
- getItemKey: defaultKeyExtractor,
170
- rangeExtractor: defaultRangeExtractor,
171
- onChange: () => {},
172
- measureElement,
173
- initialRect: {
174
- width: 0,
175
- height: 0
176
- },
177
- scrollMargin: 0,
178
- gap: 0,
179
- indexAttribute: "data-index",
180
- initialMeasurementsCache: [],
181
- lanes: 1,
182
- isScrollingResetDelay: 150,
183
- enabled: true,
184
- isRtl: false,
185
- useScrollendEvent: false,
186
- useAnimationFrameWithResizeObserver: false,
187
- laneAssignmentMode: "estimate",
188
- ...opts2
189
- };
190
- };
191
- this.notify = (sync) => {
192
- var _a, _b;
193
- (_b = (_a = this.options).onChange) == null || _b.call(_a, this, sync);
194
- };
195
- this.maybeNotify = memo(() => {
196
- this.calculateRange();
197
- return [
198
- this.isScrolling,
199
- this.range ? this.range.startIndex : null,
200
- this.range ? this.range.endIndex : null
201
- ];
202
- }, (isScrolling) => {
203
- this.notify(isScrolling);
204
- }, {
205
- key: process.env.NODE_ENV !== "production" && "maybeNotify",
206
- debug: () => this.options.debug,
207
- initialDeps: [
208
- this.isScrolling,
209
- this.range ? this.range.startIndex : null,
210
- this.range ? this.range.endIndex : null
211
- ]
212
- });
213
- this.cleanup = () => {
214
- this.unsubs.filter(Boolean).forEach((d) => d());
215
- this.unsubs = [];
216
- this.observer.disconnect();
217
- if (this.rafId != null && this.targetWindow) {
218
- this.targetWindow.cancelAnimationFrame(this.rafId);
219
- this.rafId = null;
220
- }
221
- this.scrollState = null;
222
- this.scrollElement = null;
223
- this.targetWindow = null;
224
- };
225
- this._didMount = () => {
226
- return () => {
227
- this.cleanup();
228
- };
229
- };
230
- this._willUpdate = () => {
231
- var _a;
232
- const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;
233
- if (this.scrollElement !== scrollElement) {
234
- this.cleanup();
235
- if (!scrollElement) {
236
- this.maybeNotify();
237
- return;
238
- }
239
- this.scrollElement = scrollElement;
240
- if (this.scrollElement && "ownerDocument" in this.scrollElement) this.targetWindow = this.scrollElement.ownerDocument.defaultView;
241
- else this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;
242
- this.elementsCache.forEach((cached) => {
243
- this.observer.observe(cached);
244
- });
245
- this.unsubs.push(this.options.observeElementRect(this, (rect) => {
246
- this.scrollRect = rect;
247
- this.maybeNotify();
248
- }));
249
- this.unsubs.push(this.options.observeElementOffset(this, (offset, isScrolling) => {
250
- this.scrollAdjustments = 0;
251
- this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? "forward" : "backward" : null;
252
- this.scrollOffset = offset;
253
- this.isScrolling = isScrolling;
254
- if (this.scrollState) this.scheduleScrollReconcile();
255
- this.maybeNotify();
256
- }));
257
- this._scrollToOffset(this.getScrollOffset(), {
258
- adjustments: void 0,
259
- behavior: void 0
260
- });
261
- }
262
- };
263
- this.rafId = null;
264
- this.getSize = () => {
265
- if (!this.options.enabled) {
266
- this.scrollRect = null;
267
- return 0;
268
- }
269
- this.scrollRect = this.scrollRect ?? this.options.initialRect;
270
- return this.scrollRect[this.options.horizontal ? "width" : "height"];
271
- };
272
- this.getScrollOffset = () => {
273
- if (!this.options.enabled) {
274
- this.scrollOffset = null;
275
- return 0;
276
- }
277
- this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === "function" ? this.options.initialOffset() : this.options.initialOffset);
278
- return this.scrollOffset;
279
- };
280
- this.getFurthestMeasurement = (measurements, index) => {
281
- const furthestMeasurementsFound = /* @__PURE__ */ new Map();
282
- const furthestMeasurements = /* @__PURE__ */ new Map();
283
- for (let m = index - 1; m >= 0; m--) {
284
- const measurement = measurements[m];
285
- if (furthestMeasurementsFound.has(measurement.lane)) continue;
286
- const previousFurthestMeasurement = furthestMeasurements.get(measurement.lane);
287
- if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) furthestMeasurements.set(measurement.lane, measurement);
288
- else if (measurement.end < previousFurthestMeasurement.end) furthestMeasurementsFound.set(measurement.lane, true);
289
- if (furthestMeasurementsFound.size === this.options.lanes) break;
290
- }
291
- return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {
292
- if (a.end === b.end) return a.index - b.index;
293
- return a.end - b.end;
294
- })[0] : void 0;
295
- };
296
- this.getMeasurementOptions = memo(() => [
297
- this.options.count,
298
- this.options.paddingStart,
299
- this.options.scrollMargin,
300
- this.options.getItemKey,
301
- this.options.enabled,
302
- this.options.lanes,
303
- this.options.laneAssignmentMode
304
- ], (count, paddingStart, scrollMargin, getItemKey, enabled, lanes, laneAssignmentMode) => {
305
- if (this.prevLanes !== void 0 && this.prevLanes !== lanes) this.lanesChangedFlag = true;
306
- this.prevLanes = lanes;
307
- this.pendingMeasuredCacheIndexes = [];
308
- return {
309
- count,
310
- paddingStart,
311
- scrollMargin,
312
- getItemKey,
313
- enabled,
314
- lanes,
315
- laneAssignmentMode
316
- };
317
- }, { key: false });
318
- this.getMeasurements = memo(() => [this.getMeasurementOptions(), this.itemSizeCache], ({ count, paddingStart, scrollMargin, getItemKey, enabled, lanes, laneAssignmentMode }, itemSizeCache) => {
319
- if (!enabled) {
320
- this.measurementsCache = [];
321
- this.itemSizeCache.clear();
322
- this.laneAssignments.clear();
323
- return [];
324
- }
325
- if (this.laneAssignments.size > count) {
326
- for (const index of this.laneAssignments.keys()) if (index >= count) this.laneAssignments.delete(index);
327
- }
328
- if (this.lanesChangedFlag) {
329
- this.lanesChangedFlag = false;
330
- this.lanesSettling = true;
331
- this.measurementsCache = [];
332
- this.itemSizeCache.clear();
333
- this.laneAssignments.clear();
334
- this.pendingMeasuredCacheIndexes = [];
335
- }
336
- if (this.measurementsCache.length === 0 && !this.lanesSettling) {
337
- this.measurementsCache = this.options.initialMeasurementsCache;
338
- this.measurementsCache.forEach((item) => {
339
- this.itemSizeCache.set(item.key, item.size);
340
- });
341
- }
342
- const min = this.lanesSettling ? 0 : this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
343
- this.pendingMeasuredCacheIndexes = [];
344
- if (this.lanesSettling && this.measurementsCache.length === count) this.lanesSettling = false;
345
- const measurements = this.measurementsCache.slice(0, min);
346
- const laneLastIndex = new Array(lanes).fill(void 0);
347
- for (let m = 0; m < min; m++) {
348
- const item = measurements[m];
349
- if (item) laneLastIndex[item.lane] = m;
350
- }
351
- for (let i = min; i < count; i++) {
352
- const key = getItemKey(i);
353
- const cachedLane = this.laneAssignments.get(i);
354
- let lane;
355
- let start;
356
- const shouldCacheLane = laneAssignmentMode === "estimate" || itemSizeCache.has(key);
357
- if (cachedLane !== void 0 && this.options.lanes > 1) {
358
- lane = cachedLane;
359
- const prevIndex = laneLastIndex[lane];
360
- const prevInLane = prevIndex !== void 0 ? measurements[prevIndex] : void 0;
361
- start = prevInLane ? prevInLane.end + this.options.gap : paddingStart + scrollMargin;
362
- } else {
363
- const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);
364
- start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;
365
- lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;
366
- if (this.options.lanes > 1 && shouldCacheLane) this.laneAssignments.set(i, lane);
367
- }
368
- const measuredSize = itemSizeCache.get(key);
369
- const size = typeof measuredSize === "number" ? measuredSize : this.options.estimateSize(i);
370
- const end = start + size;
371
- measurements[i] = {
372
- index: i,
373
- start,
374
- size,
375
- end,
376
- key,
377
- lane
378
- };
379
- laneLastIndex[lane] = i;
380
- }
381
- this.measurementsCache = measurements;
382
- return measurements;
383
- }, {
384
- key: process.env.NODE_ENV !== "production" && "getMeasurements",
385
- debug: () => this.options.debug
386
- });
387
- this.calculateRange = memo(() => [
388
- this.getMeasurements(),
389
- this.getSize(),
390
- this.getScrollOffset(),
391
- this.options.lanes
392
- ], (measurements, outerSize, scrollOffset, lanes) => {
393
- return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({
394
- measurements,
395
- outerSize,
396
- scrollOffset,
397
- lanes
398
- }) : null;
399
- }, {
400
- key: process.env.NODE_ENV !== "production" && "calculateRange",
401
- debug: () => this.options.debug
402
- });
403
- this.getVirtualIndexes = memo(() => {
404
- let startIndex = null;
405
- let endIndex = null;
406
- const range = this.calculateRange();
407
- if (range) {
408
- startIndex = range.startIndex;
409
- endIndex = range.endIndex;
410
- }
411
- this.maybeNotify.updateDeps([
412
- this.isScrolling,
413
- startIndex,
414
- endIndex
415
- ]);
416
- return [
417
- this.options.rangeExtractor,
418
- this.options.overscan,
419
- this.options.count,
420
- startIndex,
421
- endIndex
422
- ];
423
- }, (rangeExtractor, overscan, count, startIndex, endIndex) => {
424
- return startIndex === null || endIndex === null ? [] : rangeExtractor({
425
- startIndex,
426
- endIndex,
427
- overscan,
428
- count
429
- });
430
- }, {
431
- key: process.env.NODE_ENV !== "production" && "getVirtualIndexes",
432
- debug: () => this.options.debug
433
- });
434
- this.indexFromElement = (node) => {
435
- const attributeName = this.options.indexAttribute;
436
- const indexStr = node.getAttribute(attributeName);
437
- if (!indexStr) {
438
- console.warn(`Missing attribute name '${attributeName}={index}' on measured element.`);
439
- return -1;
440
- }
441
- return parseInt(indexStr, 10);
442
- };
443
- this.shouldMeasureDuringScroll = (index) => {
444
- var _a;
445
- if (!this.scrollState || this.scrollState.behavior !== "smooth") return true;
446
- const scrollIndex = this.scrollState.index ?? ((_a = this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)) == null ? void 0 : _a.index);
447
- if (scrollIndex !== void 0 && this.range) {
448
- const bufferSize = Math.max(this.options.overscan, Math.ceil((this.range.endIndex - this.range.startIndex) / 2));
449
- const minIndex = Math.max(0, scrollIndex - bufferSize);
450
- const maxIndex = Math.min(this.options.count - 1, scrollIndex + bufferSize);
451
- return index >= minIndex && index <= maxIndex;
452
- }
453
- return true;
454
- };
455
- this.measureElement = (node) => {
456
- if (!node) {
457
- this.elementsCache.forEach((cached, key2) => {
458
- if (!cached.isConnected) {
459
- this.observer.unobserve(cached);
460
- this.elementsCache.delete(key2);
461
- }
462
- });
463
- return;
464
- }
465
- const index = this.indexFromElement(node);
466
- const key = this.options.getItemKey(index);
467
- const prevNode = this.elementsCache.get(key);
468
- if (prevNode !== node) {
469
- if (prevNode) this.observer.unobserve(prevNode);
470
- this.observer.observe(node);
471
- this.elementsCache.set(key, node);
472
- }
473
- if ((!this.isScrolling || this.scrollState) && this.shouldMeasureDuringScroll(index)) this.resizeItem(index, this.options.measureElement(node, void 0, this));
474
- };
475
- this.resizeItem = (index, size) => {
476
- var _a;
477
- const item = this.measurementsCache[index];
478
- if (!item) return;
479
- const delta = size - (this.itemSizeCache.get(item.key) ?? item.size);
480
- if (delta !== 0) {
481
- if (((_a = this.scrollState) == null ? void 0 : _a.behavior) !== "smooth" && (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(item, delta, this) : item.start < this.getScrollOffset() + this.scrollAdjustments)) {
482
- if (process.env.NODE_ENV !== "production" && this.options.debug) console.info("correction", delta);
483
- this._scrollToOffset(this.getScrollOffset(), {
484
- adjustments: this.scrollAdjustments += delta,
485
- behavior: void 0
486
- });
487
- }
488
- this.pendingMeasuredCacheIndexes.push(item.index);
489
- this.itemSizeCache = new Map(this.itemSizeCache.set(item.key, size));
490
- this.notify(false);
491
- }
492
- };
493
- this.getVirtualItems = memo(() => [this.getVirtualIndexes(), this.getMeasurements()], (indexes, measurements) => {
494
- const virtualItems = [];
495
- for (let k = 0, len = indexes.length; k < len; k++) {
496
- const measurement = measurements[indexes[k]];
497
- virtualItems.push(measurement);
498
- }
499
- return virtualItems;
500
- }, {
501
- key: process.env.NODE_ENV !== "production" && "getVirtualItems",
502
- debug: () => this.options.debug
503
- });
504
- this.getVirtualItemForOffset = (offset) => {
505
- const measurements = this.getMeasurements();
506
- if (measurements.length === 0) return;
507
- return notUndefined(measurements[findNearestBinarySearch(0, measurements.length - 1, (index) => notUndefined(measurements[index]).start, offset)]);
508
- };
509
- this.getMaxScrollOffset = () => {
510
- if (!this.scrollElement) return 0;
511
- if ("scrollHeight" in this.scrollElement) return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight;
512
- else {
513
- const doc = this.scrollElement.document.documentElement;
514
- return this.options.horizontal ? doc.scrollWidth - this.scrollElement.innerWidth : doc.scrollHeight - this.scrollElement.innerHeight;
515
- }
516
- };
517
- this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {
518
- if (!this.scrollElement) return 0;
519
- const size = this.getSize();
520
- const scrollOffset = this.getScrollOffset();
521
- if (align === "auto") align = toOffset >= scrollOffset + size ? "end" : "start";
522
- if (align === "center") toOffset += (itemSize - size) / 2;
523
- else if (align === "end") toOffset -= size;
524
- const maxOffset = this.getMaxScrollOffset();
525
- return Math.max(Math.min(maxOffset, toOffset), 0);
526
- };
527
- this.getOffsetForIndex = (index, align = "auto") => {
528
- index = Math.max(0, Math.min(index, this.options.count - 1));
529
- const size = this.getSize();
530
- const scrollOffset = this.getScrollOffset();
531
- const item = this.measurementsCache[index];
532
- if (!item) return;
533
- if (align === "auto") if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) align = "end";
534
- else if (item.start <= scrollOffset + this.options.scrollPaddingStart) align = "start";
535
- else return [scrollOffset, align];
536
- if (align === "end" && index === this.options.count - 1) return [this.getMaxScrollOffset(), align];
537
- const toOffset = align === "end" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;
538
- return [this.getOffsetForAlignment(toOffset, align, item.size), align];
539
- };
540
- this.scrollToOffset = (toOffset, { align = "start", behavior = "auto" } = {}) => {
541
- const offset = this.getOffsetForAlignment(toOffset, align);
542
- const now = this.now();
543
- this.scrollState = {
544
- index: null,
545
- align,
546
- behavior,
547
- startedAt: now,
548
- lastTargetOffset: offset,
549
- stableFrames: 0
550
- };
551
- this._scrollToOffset(offset, {
552
- adjustments: void 0,
553
- behavior
554
- });
555
- this.scheduleScrollReconcile();
556
- };
557
- this.scrollToIndex = (index, { align: initialAlign = "auto", behavior = "auto" } = {}) => {
558
- index = Math.max(0, Math.min(index, this.options.count - 1));
559
- const offsetInfo = this.getOffsetForIndex(index, initialAlign);
560
- if (!offsetInfo) return;
561
- const [offset, align] = offsetInfo;
562
- const now = this.now();
563
- this.scrollState = {
564
- index,
565
- align,
566
- behavior,
567
- startedAt: now,
568
- lastTargetOffset: offset,
569
- stableFrames: 0
570
- };
571
- this._scrollToOffset(offset, {
572
- adjustments: void 0,
573
- behavior
574
- });
575
- this.scheduleScrollReconcile();
576
- };
577
- this.scrollBy = (delta, { behavior = "auto" } = {}) => {
578
- const offset = this.getScrollOffset() + delta;
579
- const now = this.now();
580
- this.scrollState = {
581
- index: null,
582
- align: "start",
583
- behavior,
584
- startedAt: now,
585
- lastTargetOffset: offset,
586
- stableFrames: 0
587
- };
588
- this._scrollToOffset(offset, {
589
- adjustments: void 0,
590
- behavior
591
- });
592
- this.scheduleScrollReconcile();
593
- };
594
- this.getTotalSize = () => {
595
- var _a;
596
- const measurements = this.getMeasurements();
597
- let end;
598
- if (measurements.length === 0) end = this.options.paddingStart;
599
- else if (this.options.lanes === 1) end = ((_a = measurements[measurements.length - 1]) == null ? void 0 : _a.end) ?? 0;
600
- else {
601
- const endByLane = Array(this.options.lanes).fill(null);
602
- let endIndex = measurements.length - 1;
603
- while (endIndex >= 0 && endByLane.some((val) => val === null)) {
604
- const item = measurements[endIndex];
605
- if (endByLane[item.lane] === null) endByLane[item.lane] = item.end;
606
- endIndex--;
607
- }
608
- end = Math.max(...endByLane.filter((val) => val !== null));
609
- }
610
- return Math.max(end - this.options.scrollMargin + this.options.paddingEnd, 0);
611
- };
612
- this._scrollToOffset = (offset, { adjustments, behavior }) => {
613
- this.options.scrollToFn(offset, {
614
- behavior,
615
- adjustments
616
- }, this);
617
- };
618
- this.measure = () => {
619
- this.itemSizeCache = /* @__PURE__ */ new Map();
620
- this.laneAssignments = /* @__PURE__ */ new Map();
621
- this.notify(false);
622
- };
623
- this.setOptions(opts);
624
- }
625
- scheduleScrollReconcile() {
626
- if (!this.targetWindow) {
627
- this.scrollState = null;
628
- return;
629
- }
630
- if (this.rafId != null) return;
631
- this.rafId = this.targetWindow.requestAnimationFrame(() => {
632
- this.rafId = null;
633
- this.reconcileScroll();
634
- });
635
- }
636
- reconcileScroll() {
637
- if (!this.scrollState) return;
638
- if (!this.scrollElement) return;
639
- if (this.now() - this.scrollState.startedAt > 5e3) {
640
- this.scrollState = null;
641
- return;
642
- }
643
- const offsetInfo = this.scrollState.index != null ? this.getOffsetForIndex(this.scrollState.index, this.scrollState.align) : void 0;
644
- const targetOffset = offsetInfo ? offsetInfo[0] : this.scrollState.lastTargetOffset;
645
- const STABLE_FRAMES = 1;
646
- const targetChanged = targetOffset !== this.scrollState.lastTargetOffset;
647
- if (!targetChanged && approxEqual(targetOffset, this.getScrollOffset())) {
648
- this.scrollState.stableFrames++;
649
- if (this.scrollState.stableFrames >= STABLE_FRAMES) {
650
- this.scrollState = null;
651
- return;
652
- }
653
- } else {
654
- this.scrollState.stableFrames = 0;
655
- if (targetChanged) {
656
- this.scrollState.lastTargetOffset = targetOffset;
657
- this.scrollState.behavior = "auto";
658
- this._scrollToOffset(targetOffset, {
659
- adjustments: void 0,
660
- behavior: "auto"
661
- });
662
- }
663
- }
664
- this.scheduleScrollReconcile();
665
- }
666
- };
667
- var findNearestBinarySearch = (low, high, getCurrentValue, value) => {
668
- while (low <= high) {
669
- const middle = (low + high) / 2 | 0;
670
- const currentValue = getCurrentValue(middle);
671
- if (currentValue < value) low = middle + 1;
672
- else if (currentValue > value) high = middle - 1;
673
- else return middle;
674
- }
675
- if (low > 0) return low - 1;
676
- else return 0;
677
- };
678
- function calculateRange({ measurements, outerSize, scrollOffset, lanes }) {
679
- const lastIndex = measurements.length - 1;
680
- const getOffset = (index) => measurements[index].start;
681
- if (measurements.length <= lanes) return {
682
- startIndex: 0,
683
- endIndex: lastIndex
684
- };
685
- let startIndex = findNearestBinarySearch(0, lastIndex, getOffset, scrollOffset);
686
- let endIndex = startIndex;
687
- if (lanes === 1) while (endIndex < lastIndex && measurements[endIndex].end < scrollOffset + outerSize) endIndex++;
688
- else if (lanes > 1) {
689
- const endPerLane = Array(lanes).fill(0);
690
- while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {
691
- const item = measurements[endIndex];
692
- endPerLane[item.lane] = item.end;
693
- endIndex++;
694
- }
695
- const startPerLane = Array(lanes).fill(scrollOffset + outerSize);
696
- while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {
697
- const item = measurements[startIndex];
698
- startPerLane[item.lane] = item.start;
699
- startIndex--;
700
- }
701
- startIndex = Math.max(0, startIndex - startIndex % lanes);
702
- endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));
703
- }
704
- return {
705
- startIndex,
706
- endIndex
707
- };
708
- }
709
- //#endregion
710
- export { Virtualizer, defaultKeyExtractor, defaultRangeExtractor, elementScroll, measureElement, observeElementOffset, observeElementRect };