@legendapp/list 3.0.0-beta.4 → 3.0.0-beta.41

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 (49) hide show
  1. package/.DS_Store +0 -0
  2. package/CHANGELOG.md +19 -0
  3. package/README.md +9 -2
  4. package/animated.d.ts +620 -5
  5. package/animated.js +2 -2
  6. package/animated.mjs +1 -1
  7. package/index.d.ts +1227 -11
  8. package/index.js +2594 -1023
  9. package/index.mjs +2593 -1024
  10. package/index.native.js +2347 -961
  11. package/index.native.mjs +2327 -943
  12. package/keyboard-test.d.ts +206 -0
  13. package/keyboard-test.js +34 -0
  14. package/keyboard-test.mjs +13 -0
  15. package/keyboard.d.ts +206 -8
  16. package/keyboard.js +340 -32
  17. package/keyboard.mjs +343 -34
  18. package/package.json +62 -1
  19. package/{types-JPHClxiw.d.mts → react-native.d.ts} +436 -158
  20. package/react-native.js +4942 -0
  21. package/react-native.mjs +4911 -0
  22. package/{types-JPHClxiw.d.ts → react-native.web.d.ts} +493 -158
  23. package/react-native.web.js +5357 -0
  24. package/react-native.web.mjs +5326 -0
  25. package/{types-YNdphn_A.d.mts → react.d.ts} +493 -158
  26. package/react.js +5357 -0
  27. package/react.mjs +5326 -0
  28. package/reanimated.d.ts +631 -7
  29. package/reanimated.js +156 -30
  30. package/reanimated.mjs +155 -29
  31. package/section-list.d.ts +620 -5
  32. package/section-list.js +38 -3679
  33. package/section-list.mjs +34 -3676
  34. package/animated.d.mts +0 -9
  35. package/index.d.mts +0 -23
  36. package/index.native.d.mts +0 -23
  37. package/index.native.d.ts +0 -23
  38. package/keyboard-controller.d.mts +0 -12
  39. package/keyboard-controller.d.ts +0 -12
  40. package/keyboard-controller.js +0 -69
  41. package/keyboard-controller.mjs +0 -48
  42. package/keyboard.d.mts +0 -13
  43. package/reanimated.d.mts +0 -18
  44. package/section-list.d.mts +0 -113
  45. package/section-list.native.d.mts +0 -113
  46. package/section-list.native.d.ts +0 -113
  47. package/section-list.native.js +0 -3700
  48. package/section-list.native.mjs +0 -3679
  49. package/types-YNdphn_A.d.ts +0 -670
@@ -1,15 +1,60 @@
1
- import * as React$1 from 'react';
2
- import { ComponentProps, Key, ReactNode } from 'react';
3
- import { View, ScrollView, Animated, LayoutRectangle, ScrollViewComponent, ScrollResponderMixin, StyleProp, ViewStyle, NativeSyntheticEvent, NativeScrollEvent, ScrollViewProps } from 'react-native';
4
- import Animated$1 from 'react-native-reanimated';
1
+ import * as React from 'react';
2
+ import { Key, Dispatch, SetStateAction } from 'react';
3
+ import { ScrollViewProps, NativeSyntheticEvent as NativeSyntheticEvent$1, NativeScrollEvent as NativeScrollEvent$1, ScrollView, StyleProp as StyleProp$1, ViewStyle as ViewStyle$1, ScrollViewComponent, ScrollResponderMixin, Insets as Insets$1, View } from 'react-native';
5
4
 
6
5
  type AnimatedValue = number;
7
6
 
8
- type ListenerType = "numContainers" | "numContainersPooled" | `containerItemKey${number}` | `containerItemData${number}` | `containerPosition${number}` | `containerColumn${number}` | `containerSticky${number}` | `containerStickyOffset${number}` | "containersDidLayout" | "extraData" | "numColumns" | "lastItemKeys" | "totalSize" | "alignItemsPaddingTop" | "lastPositionUpdate" | "stylePaddingTop" | "scrollAdjust" | "scrollAdjustUserOffset" | "scrollAdjustPending" | "scrollingTo" | "headerSize" | "footerSize" | "maintainVisibleContentPosition" | "debugRawScroll" | "debugComputedScroll" | "otherAxisSize" | "snapToOffsets" | "scrollSize" | "activeStickyIndex";
7
+ type LooseMeasureCallback = (x: number, y: number, width: number, height: number, pageX: number, pageY: number) => void;
8
+ interface LooseView {
9
+ measure?: (callback: LooseMeasureCallback) => void;
10
+ }
11
+
12
+ type ListenerType = "activeStickyIndex" | "debugComputedScroll" | "debugRawScroll" | "extraData" | "footerSize" | "headerSize" | "lastItemKeys" | "lastPositionUpdate" | "maintainVisibleContentPosition" | "numColumns" | "numContainers" | "numContainersPooled" | "otherAxisSize" | "readyToRender" | "scrollAdjust" | "scrollAdjustPending" | "scrollAdjustUserOffset" | "scrollSize" | "snapToOffsets" | "stylePaddingTop" | "totalSize" | `containerColumn${number}` | `containerSpan${number}` | `containerItemData${number}` | `containerItemKey${number}` | `containerPosition${number}` | `containerSticky${number}`;
13
+ type LegendListListenerType = Extract<ListenerType, "activeStickyIndex" | "footerSize" | "headerSize" | "lastItemKeys" | "lastPositionUpdate" | "numContainers" | "numContainersPooled" | "otherAxisSize" | "readyToRender" | "snapToOffsets" | "totalSize">;
14
+ type ListenerTypeValueMap = {
15
+ activeStickyIndex: number;
16
+ animatedScrollY: any;
17
+ debugComputedScroll: number;
18
+ debugRawScroll: number;
19
+ extraData: any;
20
+ footerSize: number;
21
+ headerSize: number;
22
+ lastItemKeys: string[];
23
+ lastPositionUpdate: number;
24
+ maintainVisibleContentPosition: MaintainVisibleContentPositionNormalized;
25
+ numColumns: number;
26
+ numContainers: number;
27
+ numContainersPooled: number;
28
+ otherAxisSize: number;
29
+ readyToRender: boolean;
30
+ scrollAdjust: number;
31
+ scrollAdjustPending: number;
32
+ scrollAdjustUserOffset: number;
33
+ scrollSize: {
34
+ width: number;
35
+ height: number;
36
+ };
37
+ snapToOffsets: number[];
38
+ stylePaddingTop: number;
39
+ totalSize: number;
40
+ } & {
41
+ [K in ListenerType as K extends `containerItemKey${number}` ? K : never]: string;
42
+ } & {
43
+ [K in ListenerType as K extends `containerItemData${number}` ? K : never]: any;
44
+ } & {
45
+ [K in ListenerType as K extends `containerPosition${number}` ? K : never]: number;
46
+ } & {
47
+ [K in ListenerType as K extends `containerColumn${number}` ? K : never]: number;
48
+ } & {
49
+ [K in ListenerType as K extends `containerSpan${number}` ? K : never]: number;
50
+ } & {
51
+ [K in ListenerType as K extends `containerSticky${number}` ? K : never]: boolean;
52
+ };
9
53
  interface StateContext {
10
- internalState: InternalState | undefined;
54
+ animatedScrollY: AnimatedValue;
55
+ columnWrapperStyle: ColumnWrapperStyle | undefined;
56
+ contextNum: number;
11
57
  listeners: Map<ListenerType, Set<(value: any) => void>>;
12
- values: Map<ListenerType, any>;
13
58
  mapViewabilityCallbacks: Map<string, ViewabilityCallback>;
14
59
  mapViewabilityValues: Map<string, ViewToken>;
15
60
  mapViewabilityAmountCallbacks: Map<number, ViewabilityAmountCallback>;
@@ -21,22 +66,85 @@ interface StateContext {
21
66
  previousStart: number;
22
67
  previousEnd: number;
23
68
  }>;
24
- columnWrapperStyle: ColumnWrapperStyle | undefined;
25
- viewRefs: Map<number, React$1.RefObject<View>>;
26
- animatedScrollY: AnimatedValue;
69
+ positionListeners: Map<string, Set<(value: any) => void>>;
70
+ state: InternalState;
71
+ values: Map<ListenerType, any>;
72
+ viewRefs: Map<number, React.RefObject<LooseView | null>>;
27
73
  }
28
74
 
29
75
  declare class ScrollAdjustHandler {
30
76
  private appliedAdjust;
31
77
  private pendingAdjust;
32
- private context;
33
- private mounted;
78
+ private ctx;
34
79
  constructor(ctx: StateContext);
35
80
  requestAdjust(add: number): void;
36
- setMounted(): void;
37
81
  getAdjust(): number;
82
+ commitPendingAdjust(scrollTarget: ScrollTarget): void;
38
83
  }
39
84
 
85
+ type BaseSharedValue<T = number> = {
86
+ get: () => T;
87
+ };
88
+ type StylesAsSharedValue<Style> = {
89
+ [key in keyof Style]: Style[key] | BaseSharedValue<Style[key]>;
90
+ };
91
+
92
+ interface Insets {
93
+ top: number;
94
+ left: number;
95
+ bottom: number;
96
+ right: number;
97
+ }
98
+ interface LayoutRectangle {
99
+ x: number;
100
+ y: number;
101
+ width: number;
102
+ height: number;
103
+ }
104
+ interface NativeScrollEvent {
105
+ contentOffset: {
106
+ x: number;
107
+ y: number;
108
+ };
109
+ contentSize: {
110
+ width: number;
111
+ height: number;
112
+ };
113
+ layoutMeasurement: {
114
+ width: number;
115
+ height: number;
116
+ };
117
+ contentInset: Insets;
118
+ zoomScale: number;
119
+ }
120
+ interface NativeSyntheticEvent<T> {
121
+ nativeEvent: T;
122
+ }
123
+ type ViewStyle = Record<string, unknown>;
124
+ type StyleProp<T> = T | T[] | null | undefined | false;
125
+ interface ScrollEventTargetLike {
126
+ addEventListener(type: string, listener: (...args: any[]) => void): void;
127
+ removeEventListener(type: string, listener: (...args: any[]) => void): void;
128
+ }
129
+ interface ScrollableNodeLike {
130
+ scrollLeft?: number;
131
+ scrollTop?: number;
132
+ }
133
+ interface LegendListScrollerRef {
134
+ flashScrollIndicators(): void;
135
+ getCurrentScrollOffset?(): number;
136
+ getScrollEventTarget(): ScrollEventTargetLike | null;
137
+ getScrollableNode(): ScrollableNodeLike | null;
138
+ getScrollResponder(): unknown;
139
+ scrollTo(options: {
140
+ animated?: boolean;
141
+ x?: number;
142
+ y?: number;
143
+ }): void;
144
+ scrollToEnd(options?: {
145
+ animated?: boolean;
146
+ }): void;
147
+ }
40
148
  type BaseScrollViewProps<TScrollView> = Omit<TScrollView, "contentOffset" | "maintainVisibleContentPosition" | "stickyHeaderIndices" | "removeClippedSubviews" | "children" | "onScroll">;
41
149
  interface DataModeProps<ItemT, TItemType extends string | undefined> {
42
150
  /**
@@ -51,7 +159,7 @@ interface DataModeProps<ItemT, TItemType extends string | undefined> {
51
159
  * - A React component: React.ComponentType<LegendListRenderItemProps<ItemT>>
52
160
  * @required when using data mode
53
161
  */
54
- renderItem: ((props: LegendListRenderItemProps<ItemT, TItemType>) => ReactNode) | React.ComponentType<LegendListRenderItemProps<ItemT, TItemType>>;
162
+ renderItem: ((props: LegendListRenderItemProps<ItemT, TItemType>) => React.ReactNode) | React.ComponentType<LegendListRenderItemProps<ItemT, TItemType>>;
55
163
  children?: never;
56
164
  }
57
165
  interface ChildrenModeProps {
@@ -60,7 +168,7 @@ interface ChildrenModeProps {
60
168
  * Each child will be treated as an individual list item.
61
169
  * @required when using children mode
62
170
  */
63
- children: ReactNode;
171
+ children: React.ReactNode;
64
172
  data?: never;
65
173
  renderItem?: never;
66
174
  }
@@ -71,10 +179,10 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
71
179
  */
72
180
  alignItemsAtEnd?: boolean;
73
181
  /**
74
- * If true, enables using average sizes for performance optimization.
75
- * @default true
182
+ * Keeps selected items mounted even when they scroll out of view.
183
+ * @default undefined
76
184
  */
77
- enableAverages?: boolean;
185
+ alwaysRender?: AlwaysRenderConfig;
78
186
  /**
79
187
  * Style applied to each column's wrapper view.
80
188
  */
@@ -111,7 +219,14 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
111
219
  * In case you have distinct item sizes, you can provide a function to get the size of an item.
112
220
  * Use instead of FlatList's getItemLayout or FlashList overrideItemLayout if you want to have accurate initialScrollOffset, you should provide this function
113
221
  */
114
- getEstimatedItemSize?: (index: number, item: ItemT, type: TItemType) => number;
222
+ getEstimatedItemSize?: (item: ItemT, index: number, type: TItemType) => number;
223
+ /**
224
+ * Customize layout for multi-column lists, such as allowing items to span multiple columns.
225
+ * Similar to FlashList's overrideItemLayout.
226
+ */
227
+ overrideItemLayout?: (layout: {
228
+ span?: number;
229
+ }, item: ItemT, index: number, maxColumns: number, extraData?: any) => void;
115
230
  /**
116
231
  * Ratio of initial container pool size to data length (e.g., 0.5 for half).
117
232
  * @default 2
@@ -129,6 +244,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
129
244
  initialScrollIndex?: number | {
130
245
  index: number;
131
246
  viewOffset?: number | undefined;
247
+ viewPosition?: number | undefined;
132
248
  };
133
249
  /**
134
250
  * When true, the list initializes scrolled to the last item.
@@ -168,6 +284,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
168
284
  ListHeaderComponentStyle?: StyleProp<ViewStyle> | undefined;
169
285
  /**
170
286
  * If true, auto-scrolls to end when new items are added.
287
+ * Use an options object to opt into specific triggers and control whether that scroll is animated.
171
288
  * @default false
172
289
  */
173
290
  maintainScrollAtEnd?: boolean | MaintainScrollAtEndOptions;
@@ -177,11 +294,19 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
177
294
  */
178
295
  maintainScrollAtEndThreshold?: number;
179
296
  /**
180
- * If true, maintains visibility of content across data changes (filtering/resorting/insertions).
181
- * Scroll-time stability for measurements is always enabled.
297
+ * Maintains visibility of content.
298
+ * - scroll (default: true) stabilizes during size/layout changes while scrolling.
299
+ * - data (default: false) stabilizes when the data array changes; passing true also sets the RN maintainVisibleContentPosition prop.
300
+ * - shouldRestorePosition can opt out specific items from data-change anchoring.
301
+ * - undefined (default) enables scroll stabilization but skips data-change anchoring.
302
+ * - true enables both behaviors; false disables both.
303
+ */
304
+ maintainVisibleContentPosition?: boolean | MaintainVisibleContentPositionConfig<ItemT>;
305
+ /**
306
+ * Web only: when true, listens to window/body scrolling instead of rendering a scrollable list container.
182
307
  * @default false
183
308
  */
184
- maintainVisibleContentPosition?: boolean;
309
+ useWindowScroll?: boolean;
185
310
  /**
186
311
  * Number of columns to render items in.
187
312
  * @default 1
@@ -208,6 +333,10 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
208
333
  itemKey: string;
209
334
  itemData: ItemT;
210
335
  }) => void;
336
+ /**
337
+ * Called when list layout metrics change.
338
+ */
339
+ onMetricsChange?: (metrics: LegendListMetrics) => void;
211
340
  /**
212
341
  * Function to call when the user pulls to refresh.
213
342
  */
@@ -248,7 +377,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
248
377
  /**
249
378
  * Ref to the underlying ScrollView component.
250
379
  */
251
- refScrollView?: React.Ref<ScrollView>;
380
+ refScrollView?: React.Ref<any>;
252
381
  /**
253
382
  * If true, shows a refresh indicator.
254
383
  * @default false
@@ -259,7 +388,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
259
388
  * Note: When using `stickyHeaderIndices`, you must provide an Animated ScrollView component.
260
389
  * @default (props) => <ScrollView {...props} />
261
390
  */
262
- renderScrollComponent?: (props: ScrollViewProps) => React.ReactElement<ScrollViewProps>;
391
+ renderScrollComponent?: (props: any) => React.ReactElement | null;
263
392
  /**
264
393
  * This will log a suggested estimatedItemSize.
265
394
  * @required
@@ -294,22 +423,72 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
294
423
  * @deprecated Use stickyHeaderIndices instead for parity with React Native.
295
424
  */
296
425
  stickyIndices?: number[];
426
+ /**
427
+ * Configuration for sticky headers.
428
+ * @default undefined
429
+ */
430
+ stickyHeaderConfig?: StickyHeaderConfig;
297
431
  getItemType?: (item: ItemT, index: number) => TItemType;
298
- getFixedItemSize?: (index: number, item: ItemT, type: TItemType) => number | undefined;
432
+ getFixedItemSize?: (item: ItemT, index: number, type: TItemType) => number | undefined;
299
433
  itemsAreEqual?: (itemPrevious: ItemT, item: ItemT, index: number, data: readonly ItemT[]) => boolean;
300
434
  }
301
- type LegendListPropsBase<ItemT, TScrollView extends ComponentProps<typeof ScrollView> | ComponentProps<typeof Animated.ScrollView> | ComponentProps<typeof Animated$1.ScrollView>, TItemType extends string | undefined = string | undefined> = BaseScrollViewProps<TScrollView> & LegendListSpecificProps<ItemT, TItemType> & (DataModeProps<ItemT, TItemType> | ChildrenModeProps);
435
+ type LegendListPropsBase<ItemT, TScrollViewProps = Record<string, any>, TItemType extends string | undefined = string | undefined> = BaseScrollViewProps<TScrollViewProps> & LegendListSpecificProps<ItemT, TItemType> & (DataModeProps<ItemT, TItemType> | ChildrenModeProps);
436
+ type LegendListPropsInternal = LegendListSpecificProps<any, string | undefined> & DataModeProps<any, string | undefined>;
437
+ interface MaintainVisibleContentPositionConfig<ItemT = any> {
438
+ data?: boolean;
439
+ size?: boolean;
440
+ shouldRestorePosition?: (item: ItemT, index: number, data: readonly ItemT[]) => boolean;
441
+ }
442
+ interface MaintainVisibleContentPositionNormalized<ItemT = any> {
443
+ data: boolean;
444
+ size: boolean;
445
+ shouldRestorePosition?: (item: ItemT, index: number, data: readonly ItemT[]) => boolean;
446
+ }
447
+ interface StickyHeaderConfig {
448
+ /**
449
+ * Specifies how far from the top edge sticky headers should start sticking.
450
+ * Useful for scenarios with a fixed navbar or header, where sticky elements pin below it..
451
+ * @default 0
452
+ */
453
+ offset?: number;
454
+ /**
455
+ * Component to render as a backdrop behind the sticky header.
456
+ * @default undefined
457
+ */
458
+ backdropComponent?: React.ComponentType<any> | React.ReactElement | null | undefined;
459
+ }
460
+ interface AlwaysRenderConfig {
461
+ top?: number;
462
+ bottom?: number;
463
+ indices?: number[];
464
+ keys?: string[];
465
+ }
466
+ interface MaintainScrollAtEndOnOptions {
467
+ dataChange?: boolean;
468
+ itemLayout?: boolean;
469
+ layout?: boolean;
470
+ }
302
471
  interface MaintainScrollAtEndOptions {
303
- onLayout?: boolean;
304
- onItemLayout?: boolean;
305
- onDataChange?: boolean;
472
+ /**
473
+ * Whether maintainScrollAtEnd should animate when it scrolls to the end.
474
+ */
475
+ animated?: boolean;
476
+ /**
477
+ * Which events should keep the list pinned to the end.
478
+ * - If omitted, object values default to all triggers.
479
+ * - If provided, only the keys set to `true` are enabled.
480
+ */
481
+ on?: MaintainScrollAtEndOnOptions;
306
482
  }
307
483
  interface ColumnWrapperStyle {
308
484
  rowGap?: number;
309
485
  gap?: number;
310
486
  columnGap?: number;
311
487
  }
312
- type LegendListProps<ItemT = any> = LegendListPropsBase<ItemT, ComponentProps<typeof ScrollView>>;
488
+ interface LegendListMetrics {
489
+ headerSize: number;
490
+ footerSize: number;
491
+ }
313
492
  interface ThresholdSnapshot {
314
493
  scrollPosition: number;
315
494
  contentSize?: number;
@@ -317,167 +496,222 @@ interface ThresholdSnapshot {
317
496
  atThreshold: boolean;
318
497
  }
319
498
  interface ScrollTarget {
320
- offset: number;
321
- index?: number;
322
- viewOffset?: number;
323
- viewPosition?: number;
324
499
  animated?: boolean;
500
+ index?: number;
325
501
  isInitialScroll?: boolean;
502
+ itemSize?: number;
503
+ offset: number;
326
504
  precomputedWithViewOffset?: boolean;
505
+ targetOffset?: number;
506
+ viewOffset?: number;
507
+ viewPosition?: number;
327
508
  }
328
509
  interface InternalState {
329
- positions: Map<string, number>;
330
- columns: Map<string, number>;
331
- sizes: Map<string, number>;
332
- sizesKnown: Map<string, number>;
333
- containerItemKeys: Set<string>;
510
+ activeStickyIndex: number | undefined;
511
+ adjustingFromInitialMount?: number;
512
+ animFrameCheckFinishedScroll?: any;
513
+ averageSizes: Record<string, {
514
+ num: number;
515
+ avg: number;
516
+ }>;
517
+ columns: Array<number | undefined>;
518
+ columnSpans: Array<number | undefined>;
519
+ containerItemKeys: Map<string, number>;
334
520
  containerItemTypes: Map<number, string>;
335
- isStartReached: boolean;
336
- isEndReached: boolean;
337
- isAtEnd: boolean;
338
- isAtStart: boolean;
339
- hasScrolled?: boolean;
340
- scrollLength: number;
341
- startBuffered: number;
342
- startBufferedId?: string;
343
- startNoBuffer: number;
521
+ dataChangeEpoch: number;
522
+ dataChangeNeedsScrollUpdate: boolean;
523
+ didColumnsChange?: boolean;
524
+ didDataChange?: boolean;
525
+ didFinishInitialScroll?: boolean;
526
+ didContainersLayout?: boolean;
527
+ enableScrollForNextCalculateItemsInView: boolean;
344
528
  endBuffered: number;
345
529
  endNoBuffer: number;
530
+ endReachedSnapshot: ThresholdSnapshot | undefined;
346
531
  firstFullyOnScreenIndex: number;
347
- idsInView: string[];
348
- scrollPending: number;
349
- scroll: number;
350
- scrollTime: number;
351
- scrollPrev: number;
352
- scrollPrevTime: number;
353
- scrollAdjustHandler: ScrollAdjustHandler;
354
- triggerCalculateItemsInView?: (params?: {
355
- doMVCP?: boolean;
356
- dataChanged?: boolean;
357
- forceFullItemPositions?: boolean;
358
- }) => void;
359
- maintainingScrollAtEnd?: boolean;
360
- totalSize: number;
361
- otherAxisSize?: number;
362
- timeouts: Set<number>;
363
- timeoutSizeMessage: any;
364
- nativeMarginTop: number;
365
- indexByKey: Map<string, number>;
532
+ hasScrolled?: boolean;
366
533
  idCache: string[];
367
- viewabilityConfigCallbackPairs: ViewabilityConfigCallbackPairs<any> | undefined;
368
- scrollHistory: Array<{
369
- scroll: number;
370
- time: number;
371
- }>;
372
- lastScrollAdjustForHistory?: number;
373
- startReachedSnapshot: ThresholdSnapshot | undefined;
374
- endReachedSnapshot: ThresholdSnapshot | undefined;
375
- scrollForNextCalculateItemsInView: {
376
- top: number;
377
- bottom: number;
378
- } | undefined;
379
- enableScrollForNextCalculateItemsInView: boolean;
380
- minIndexSizeChanged: number | undefined;
381
- queuedInitialLayout?: boolean | undefined;
382
- queuedCalculateItemsInView: number | undefined;
383
- dataChangeNeedsScrollUpdate: boolean;
384
- previousData?: readonly unknown[];
385
- didColumnsChange?: boolean;
386
- didDataChange?: boolean;
387
- isFirst?: boolean;
388
- lastBatchingAction: number;
534
+ idsInView: string[];
389
535
  ignoreScrollFromMVCP?: {
390
536
  lt?: number;
391
537
  gt?: number;
392
538
  };
393
539
  ignoreScrollFromMVCPIgnored?: boolean;
394
540
  ignoreScrollFromMVCPTimeout?: any;
395
- needsOtherAxisSize?: boolean;
396
- averageSizes: Record<string, {
397
- num: number;
398
- avg: number;
399
- }>;
400
- refScroller: React.RefObject<ScrollView>;
401
- loadStartTime: number;
402
- initialScroll: ScrollIndexWithOffsetAndContentOffset | undefined;
541
+ indexByKey: Map<string, number>;
403
542
  initialAnchor?: InitialScrollAnchor;
543
+ initialNativeScrollWatchdog?: {
544
+ startScroll: number;
545
+ targetOffset: number;
546
+ };
547
+ initialScrollLastDidFinish: boolean;
548
+ initialScrollLastTarget: ScrollIndexWithOffsetAndContentOffset | undefined;
549
+ initialScrollLastTargetUsesOffset: boolean;
550
+ initialScrollPreviousDataLength: number;
551
+ initialScrollRetryLastLength: number | undefined;
552
+ initialScrollRetryWindowUntil: number;
553
+ initialScroll: ScrollIndexWithOffsetAndContentOffset | undefined;
554
+ initialScrollUsesOffset: boolean;
555
+ isAtEnd: boolean;
556
+ isAtStart: boolean;
557
+ isEndReached: boolean | null;
558
+ isFirst?: boolean;
559
+ isStartReached: boolean | null;
560
+ lastBatchingAction: number;
404
561
  lastLayout: LayoutRectangle | undefined;
405
- timeoutSetPaddingTop?: any;
406
- activeStickyIndex: number | undefined;
407
- stickyContainers: Map<number, number>;
408
- stickyContainerPool: Set<number>;
409
- scrollProcessingEnabled: boolean;
562
+ lastScrollAdjustForHistory?: number;
563
+ lastScrollDelta: number;
564
+ loadStartTime: number;
565
+ maintainingScrollAtEnd?: boolean;
566
+ minIndexSizeChanged: number | undefined;
567
+ mvcpAnchorLock?: {
568
+ id: string;
569
+ position: number;
570
+ quietPasses: number;
571
+ expiresAt: number;
572
+ };
573
+ contentInsetOverride?: Partial<Insets> | null;
574
+ nativeContentInset?: Insets;
575
+ nativeMarginTop: number;
576
+ needsOtherAxisSize?: boolean;
577
+ otherAxisSize?: number;
578
+ pendingNativeMVCPAdjust?: {
579
+ amount: number;
580
+ closestDistanceToClamp: number;
581
+ hasApproachedClamp: boolean;
582
+ manualApplied: number;
583
+ startScroll: number;
584
+ };
585
+ pendingMaintainScrollAtEnd?: boolean;
410
586
  pendingTotalSize?: number;
411
- adjustingFromInitialMount?: number;
587
+ pendingScrollResolve?: (() => void) | undefined;
588
+ positions: Array<number | undefined>;
589
+ previousData?: readonly unknown[];
590
+ queuedCalculateItemsInView: number | undefined;
591
+ queuedMVCPRecalculate?: number;
592
+ queuedInitialLayout?: boolean | undefined;
593
+ refScroller: React.RefObject<LegendListScrollerRef | null>;
594
+ scroll: number;
595
+ scrollAdjustHandler: ScrollAdjustHandler;
596
+ scrollForNextCalculateItemsInView: {
597
+ top: number | null;
598
+ bottom: number | null;
599
+ } | undefined;
600
+ scrollHistory: Array<{
601
+ scroll: number;
602
+ time: number;
603
+ }>;
604
+ scrollingTo?: ScrollTarget | undefined;
605
+ scrollLastCalculate?: number;
606
+ scrollLength: number;
607
+ scrollPending: number;
608
+ scrollPrev: number;
609
+ scrollPrevTime: number;
610
+ scrollProcessingEnabled: boolean;
611
+ scrollTime: number;
612
+ sizes: Map<string, number>;
613
+ sizesKnown: Map<string, number>;
614
+ startBuffered: number;
615
+ startBufferedId?: string;
616
+ startNoBuffer: number;
617
+ startReachedSnapshotDataChangeEpoch: number | undefined;
618
+ startReachedSnapshot: ThresholdSnapshot | undefined;
619
+ stickyContainerPool: Set<number>;
620
+ stickyContainers: Map<number, number>;
621
+ timeouts: Set<number>;
622
+ timeoutSetPaddingTop?: any;
623
+ timeoutSizeMessage: any;
624
+ timeoutCheckFinishedScrollFallback?: any;
625
+ totalSize: number;
626
+ triggerCalculateItemsInView?: (params?: {
627
+ doMVCP?: boolean;
628
+ dataChanged?: boolean;
629
+ forceFullItemPositions?: boolean;
630
+ }) => void;
631
+ viewabilityConfigCallbackPairs: ViewabilityConfigCallbackPairs<any> | undefined;
412
632
  props: {
413
633
  alignItemsAtEnd: boolean;
634
+ animatedProps: StylesAsSharedValue<Record<string, any>>;
635
+ alwaysRender: AlwaysRenderConfig | undefined;
636
+ alwaysRenderIndicesArr: number[];
637
+ alwaysRenderIndicesSet: Set<number>;
638
+ contentInset: Insets | undefined;
414
639
  data: readonly any[];
415
640
  dataVersion: Key | undefined;
641
+ drawDistance: number;
416
642
  estimatedItemSize: number | undefined;
417
- getEstimatedItemSize: LegendListProps["getEstimatedItemSize"];
418
- getFixedItemSize: LegendListProps["getFixedItemSize"];
419
- getItemType: LegendListProps["getItemType"];
643
+ getEstimatedItemSize: LegendListPropsInternal["getEstimatedItemSize"];
644
+ getFixedItemSize: LegendListPropsInternal["getFixedItemSize"];
645
+ getItemType: LegendListPropsInternal["getItemType"];
420
646
  horizontal: boolean;
421
- keyExtractor: LegendListProps["keyExtractor"];
422
- maintainScrollAtEnd: boolean | MaintainScrollAtEndOptions;
647
+ initialContainerPoolRatio: number;
648
+ itemsAreEqual: LegendListPropsInternal["itemsAreEqual"];
649
+ keyExtractor: LegendListPropsInternal["keyExtractor"];
650
+ maintainScrollAtEnd: MaintainScrollAtEndNormalized | undefined;
423
651
  maintainScrollAtEndThreshold: number | undefined;
424
- maintainVisibleContentPosition: boolean;
425
- onEndReached: LegendListProps["onEndReached"];
652
+ maintainVisibleContentPosition: MaintainVisibleContentPositionNormalized;
653
+ numColumns: number;
654
+ onEndReached: LegendListPropsInternal["onEndReached"];
426
655
  onEndReachedThreshold: number | null | undefined;
427
- onItemSizeChanged: LegendListProps["onItemSizeChanged"];
428
- onLoad: LegendListProps["onLoad"];
429
- onScroll: LegendListProps["onScroll"];
430
- onStartReached: LegendListProps["onStartReached"];
656
+ onItemSizeChanged: LegendListPropsInternal["onItemSizeChanged"];
657
+ onLoad: LegendListPropsInternal["onLoad"];
658
+ onScroll: LegendListPropsInternal["onScroll"];
659
+ onStartReached: LegendListPropsInternal["onStartReached"];
431
660
  onStartReachedThreshold: number | null | undefined;
432
- onStickyHeaderChange: LegendListProps["onStickyHeaderChange"];
661
+ onStickyHeaderChange: LegendListPropsInternal["onStickyHeaderChange"];
662
+ overrideItemLayout: LegendListPropsInternal["overrideItemLayout"];
433
663
  recycleItems: boolean;
434
- suggestEstimatedItemSize: boolean;
435
- stylePaddingBottom: number | undefined;
436
- renderItem: LegendListProps["renderItem"];
437
- scrollBuffer: number;
438
- numColumns: number;
439
- initialContainerPoolRatio: number;
440
- stylePaddingTop: number | undefined;
664
+ renderItem: LegendListPropsInternal["renderItem"];
665
+ scrollBuffer?: number;
441
666
  snapToIndices: number[] | undefined;
442
- stickyIndicesSet: Set<number>;
667
+ positionComponentInternal: React.ComponentType<any> | undefined;
668
+ stickyPositionComponentInternal: React.ComponentType<any> | undefined;
443
669
  stickyIndicesArr: number[];
444
- itemsAreEqual: LegendListProps["itemsAreEqual"];
445
- enableAverages: boolean;
670
+ stickyIndicesSet: Set<number>;
671
+ stylePaddingBottom: number | undefined;
672
+ stylePaddingTop: number | undefined;
673
+ suggestEstimatedItemSize: boolean;
674
+ useWindowScroll: boolean;
446
675
  };
447
676
  }
448
677
  interface ViewableRange<T> {
449
- startBuffered: number;
450
- start: number;
451
- endBuffered: number;
452
678
  end: number;
679
+ endBuffered: number;
453
680
  items: T[];
681
+ start: number;
682
+ startBuffered: number;
454
683
  }
455
684
  interface LegendListRenderItemProps<ItemT, TItemType extends string | number | undefined = string | number | undefined> {
456
- item: ItemT;
457
- type: TItemType;
458
- index: number;
459
685
  data: readonly ItemT[];
460
686
  extraData: any;
687
+ index: number;
688
+ item: ItemT;
689
+ type: TItemType;
461
690
  }
462
- type ScrollState = {
463
- activeStickyIndex: number | undefined;
691
+ type LegendListState$1 = {
692
+ activeStickyIndex: number;
464
693
  contentLength: number;
465
694
  data: readonly any[];
466
- elementAtIndex: (index: number) => View | null | undefined;
695
+ elementAtIndex: (index: number) => any;
467
696
  end: number;
468
697
  endBuffered: number;
469
698
  isAtEnd: boolean;
470
699
  isAtStart: boolean;
700
+ isEndReached: boolean;
701
+ isStartReached: boolean;
702
+ listen: <T extends LegendListListenerType>(listenerType: T, callback: (value: ListenerTypeValueMap[T]) => void) => () => void;
703
+ listenToPosition: (key: string, callback: (value: number) => void) => () => void;
471
704
  positionAtIndex: (index: number) => number;
472
- positions: Map<string, number>;
705
+ positionByKey: (key: string) => number | undefined;
473
706
  scroll: number;
474
707
  scrollLength: number;
708
+ scrollVelocity: number;
475
709
  sizeAtIndex: (index: number) => number;
476
710
  sizes: Map<string, number>;
477
711
  start: number;
478
712
  startBuffered: number;
479
713
  };
480
- type LegendListRef = {
714
+ type LegendListRef$1 = {
481
715
  /**
482
716
  * Displays the scroll indicators momentarily.
483
717
  */
@@ -485,7 +719,7 @@ type LegendListRef = {
485
719
  /**
486
720
  * Returns the native ScrollView component reference.
487
721
  */
488
- getNativeScrollRef(): React.ElementRef<typeof ScrollViewComponent>;
722
+ getNativeScrollRef(): any;
489
723
  /**
490
724
  * Returns the scroll responder instance for handling scroll events.
491
725
  */
@@ -493,11 +727,11 @@ type LegendListRef = {
493
727
  /**
494
728
  * Returns the ScrollResponderMixin for advanced scroll handling.
495
729
  */
496
- getScrollResponder(): ScrollResponderMixin;
730
+ getScrollResponder(): any;
497
731
  /**
498
732
  * Returns the internal state of the scroll virtualization.
499
733
  */
500
- getState(): ScrollState;
734
+ getState(): LegendListState$1;
501
735
  /**
502
736
  * Scrolls a specific index into view.
503
737
  * @param params - Parameters for scrolling.
@@ -507,7 +741,7 @@ type LegendListRef = {
507
741
  scrollIndexIntoView(params: {
508
742
  animated?: boolean | undefined;
509
743
  index: number;
510
- }): void;
744
+ }): Promise<void>;
511
745
  /**
512
746
  * Scrolls a specific index into view.
513
747
  * @param params - Parameters for scrolling.
@@ -517,7 +751,7 @@ type LegendListRef = {
517
751
  scrollItemIntoView(params: {
518
752
  animated?: boolean | undefined;
519
753
  item: any;
520
- }): void;
754
+ }): Promise<void>;
521
755
  /**
522
756
  * Scrolls to the end of the list.
523
757
  * @param options - Options for scrolling.
@@ -527,7 +761,7 @@ type LegendListRef = {
527
761
  scrollToEnd(options?: {
528
762
  animated?: boolean | undefined;
529
763
  viewOffset?: number | undefined;
530
- }): void;
764
+ }): Promise<void>;
531
765
  /**
532
766
  * Scrolls to a specific index in the list.
533
767
  * @param params - Parameters for scrolling.
@@ -541,7 +775,7 @@ type LegendListRef = {
541
775
  index: number;
542
776
  viewOffset?: number | undefined;
543
777
  viewPosition?: number | undefined;
544
- }): void;
778
+ }): Promise<void>;
545
779
  /**
546
780
  * Scrolls to a specific item in the list.
547
781
  * @param params - Parameters for scrolling.
@@ -555,7 +789,7 @@ type LegendListRef = {
555
789
  item: any;
556
790
  viewOffset?: number | undefined;
557
791
  viewPosition?: number | undefined;
558
- }): void;
792
+ }): Promise<void>;
559
793
  /**
560
794
  * Scrolls to a specific offset in pixels.
561
795
  * @param params - Parameters for scrolling.
@@ -565,36 +799,49 @@ type LegendListRef = {
565
799
  scrollToOffset(params: {
566
800
  offset: number;
567
801
  animated?: boolean | undefined;
568
- }): void;
802
+ }): Promise<void>;
569
803
  /**
570
804
  * Sets or adds to the offset of the visible content anchor.
571
805
  * @param value - The offset to set or add.
572
806
  * @param animated - If true, uses Animated to animate the change.
573
807
  */
574
- setVisibleContentAnchorOffset(value: number | ((value: number) => number)): void;
808
+ setVisibleContentAnchorOffset(value: number | ((val: number) => number)): void;
575
809
  /**
576
810
  * Sets whether scroll processing is enabled.
577
811
  * @param enabled - If true, scroll processing is enabled.
578
812
  */
579
813
  setScrollProcessingEnabled(enabled: boolean): void;
814
+ /**
815
+ * Clears internal virtualization caches.
816
+ * @param options - Cache clearing options.
817
+ * @param options.mode - `sizes` clears measurement caches. `full` also clears key/position caches.
818
+ */
819
+ clearCaches(options?: {
820
+ mode?: "sizes" | "full";
821
+ }): void;
822
+ /**
823
+ * Reports an externally measured content inset. Pass null/undefined to clear.
824
+ * Values are merged on top of props/animated/native insets.
825
+ */
826
+ reportContentInset(inset?: Partial<Insets> | null): void;
580
827
  };
581
828
  interface ViewToken<ItemT = any> {
582
- item: ItemT;
583
- key: string;
829
+ containerId: number;
584
830
  index: number;
585
831
  isViewable: boolean;
586
- containerId: number;
832
+ item: ItemT;
833
+ key: string;
587
834
  }
588
835
  interface ViewAmountToken<ItemT = any> extends ViewToken<ItemT> {
589
- sizeVisible: number;
590
- size: number;
591
- percentVisible: number;
592
836
  percentOfScroller: number;
837
+ percentVisible: number;
593
838
  scrollSize: number;
839
+ size: number;
840
+ sizeVisible: number;
594
841
  }
595
842
  interface ViewabilityConfigCallbackPair<ItemT = any> {
596
- viewabilityConfig: ViewabilityConfig;
597
843
  onViewableItemsChanged?: OnViewableItemsChanged<ItemT>;
844
+ viewabilityConfig: ViewabilityConfig;
598
845
  }
599
846
  type ViewabilityConfigCallbackPairs<ItemT> = ViewabilityConfigCallbackPair<ItemT>[];
600
847
  type OnViewableItemsChanged<ItemT> = ((info: {
@@ -633,14 +880,14 @@ interface ViewabilityConfig {
633
880
  type ViewabilityCallback<ItemT = any> = (viewToken: ViewToken<ItemT>) => void;
634
881
  type ViewabilityAmountCallback<ItemT = any> = (viewToken: ViewAmountToken<ItemT>) => void;
635
882
  interface LegendListRecyclingState<T> {
636
- item: T;
637
- prevItem: T | undefined;
638
883
  index: number;
884
+ item: T;
639
885
  prevIndex: number | undefined;
886
+ prevItem: T | undefined;
640
887
  }
641
- type TypedForwardRef = <T, P = {}>(render: (props: P, ref: React.Ref<T>) => React.ReactNode) => (props: P & React.RefAttributes<T>) => React.ReactNode;
888
+ type TypedForwardRef = <T, P = {}>(render: (props: P, ref: React.Ref<T>) => React.ReactElement | null) => (props: P & React.RefAttributes<T>) => React.ReactElement | null;
642
889
  declare const typedForwardRef: TypedForwardRef;
643
- type TypedMemo = <T extends React.ComponentType<any>>(Component: T, propsAreEqual?: (prevProps: Readonly<React.JSXElementConstructor<T>>, nextProps: Readonly<React.JSXElementConstructor<T>>) => boolean) => T & {
890
+ type TypedMemo = <T extends React.ComponentType<any>>(Component: T, propsAreEqual?: (prevProps: Readonly<React.ComponentProps<T>>, nextProps: Readonly<React.ComponentProps<T>>) => boolean) => T & {
644
891
  displayName?: string;
645
892
  };
646
893
  declare const typedMemo: TypedMemo;
@@ -667,4 +914,35 @@ type GetRenderedItemResult<ItemT> = {
667
914
  };
668
915
  type GetRenderedItem = (key: string) => GetRenderedItemResult<any> | null;
669
916
 
670
- export { type ColumnWrapperStyle as C, type GetRenderedItemResult as G, type InternalState as I, type LegendListProps as L, type MaintainScrollAtEndOptions as M, type OnViewableItemsChanged as O, type ScrollTarget as S, type ThresholdSnapshot as T, type ViewabilityCallback as V, type LegendListRef as a, type ViewabilityAmountCallback as b, type LegendListRecyclingState as c, type LegendListPropsBase as d, type ViewableRange as e, type LegendListRenderItemProps as f, type ScrollState as g, type ViewToken as h, type ViewAmountToken as i, type ViewabilityConfigCallbackPair as j, type ViewabilityConfigCallbackPairs as k, type ViewabilityConfig as l, type TypedForwardRef as m, type TypedMemo as n, typedMemo as o, type ScrollIndexWithOffset as p, type ScrollIndexWithOffsetPosition as q, type ScrollIndexWithOffsetAndContentOffset as r, type InitialScrollAnchor as s, typedForwardRef as t, type GetRenderedItem as u };
917
+ type LegendListPropsOverrides<ItemT, TItemType extends string | undefined> = Omit<LegendListPropsBase<ItemT, ScrollViewProps, TItemType>, "onScroll" | "refScrollView" | "renderScrollComponent" | "ListHeaderComponentStyle" | "ListFooterComponentStyle"> & {
918
+ onScroll?: (event: NativeSyntheticEvent$1<NativeScrollEvent$1>) => void;
919
+ refScrollView?: React.Ref<ScrollView>;
920
+ renderScrollComponent?: (props: ScrollViewProps) => React.ReactElement<ScrollViewProps>;
921
+ ListHeaderComponentStyle?: StyleProp$1<ViewStyle$1> | undefined;
922
+ ListFooterComponentStyle?: StyleProp$1<ViewStyle$1> | undefined;
923
+ };
924
+ type LegendListProps<ItemT = any, TItemType extends string | undefined = string | undefined> = LegendListPropsOverrides<ItemT, TItemType>;
925
+ type LegendListRef = Omit<LegendListRef$1, "getNativeScrollRef" | "getScrollResponder" | "reportContentInset"> & {
926
+ getNativeScrollRef(): React.ElementRef<typeof ScrollViewComponent>;
927
+ getScrollResponder(): ScrollResponderMixin;
928
+ reportContentInset(inset?: Partial<Insets$1> | null): void;
929
+ };
930
+ type LegendListState = Omit<LegendListState$1, "elementAtIndex"> & {
931
+ elementAtIndex: (index: number) => View | null | undefined;
932
+ };
933
+ type LegendListComponent = <ItemT = any>(props: LegendListProps<ItemT> & React.RefAttributes<LegendListRef>) => React.ReactElement | null;
934
+
935
+ declare function useViewability<ItemT = any>(callback: ViewabilityCallback<ItemT>, configId?: string): void;
936
+ declare function useViewabilityAmount<ItemT = any>(callback: ViewabilityAmountCallback<ItemT>): void;
937
+ declare function useRecyclingEffect(effect: (info: LegendListRecyclingState<unknown>) => void | (() => void)): void;
938
+ declare function useRecyclingState<ItemT>(valueOrFun: ((info: LegendListRecyclingState<ItemT>) => ItemT) | ItemT): readonly [ItemT, Dispatch<SetStateAction<ItemT>>];
939
+ declare function useIsLastItem(): boolean;
940
+ declare function useListScrollSize(): {
941
+ width: number;
942
+ height: number;
943
+ };
944
+ declare function useSyncLayout(): () => void;
945
+
946
+ declare const LegendList: LegendListComponent;
947
+
948
+ export { type AlwaysRenderConfig, type BaseScrollViewProps, type ColumnWrapperStyle, type GetRenderedItem, type GetRenderedItemResult, type InitialScrollAnchor, type Insets, type InternalState, type LayoutRectangle, LegendList, type LegendListComponent, type LegendListMetrics, type LegendListProps, type LegendListPropsBase, type LegendListRecyclingState, type LegendListRef, type LegendListRenderItemProps, type LegendListScrollerRef, type LegendListState, type MaintainScrollAtEndOnOptions, type MaintainScrollAtEndOptions, type MaintainVisibleContentPositionConfig, type MaintainVisibleContentPositionNormalized, type NativeScrollEvent, type NativeSyntheticEvent, type OnViewableItemsChanged, type ScrollEventTargetLike, type ScrollIndexWithOffset, type ScrollIndexWithOffsetAndContentOffset, type ScrollIndexWithOffsetPosition, type ScrollTarget, type ScrollableNodeLike, type StickyHeaderConfig, type StyleProp, type ThresholdSnapshot, type TypedForwardRef, type TypedMemo, type ViewAmountToken, type ViewStyle, type ViewToken, type ViewabilityAmountCallback, type ViewabilityCallback, type ViewabilityConfig, type ViewabilityConfigCallbackPair, type ViewabilityConfigCallbackPairs, type ViewableRange, typedForwardRef, typedMemo, useIsLastItem, useListScrollSize, useRecyclingEffect, useRecyclingState, useSyncLayout, useViewability, useViewabilityAmount };