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

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 (45) hide show
  1. package/.DS_Store +0 -0
  2. package/CHANGELOG.md +19 -0
  3. package/README.md +8 -1
  4. package/animated.d.ts +607 -5
  5. package/animated.js +2 -2
  6. package/animated.mjs +1 -1
  7. package/index.d.ts +1192 -11
  8. package/index.js +1989 -946
  9. package/index.mjs +1988 -947
  10. package/index.native.js +1758 -866
  11. package/index.native.mjs +1740 -850
  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 +52 -1
  19. package/{types-JPHClxiw.d.mts → react-native.d.ts} +399 -154
  20. package/{section-list.native.js → react-native.js} +1838 -1094
  21. package/{section-list.native.mjs → react-native.mjs} +1811 -1077
  22. package/{types-JPHClxiw.d.ts → react.d.ts} +456 -154
  23. package/react.js +4812 -0
  24. package/react.mjs +4782 -0
  25. package/reanimated.d.ts +618 -7
  26. package/reanimated.js +156 -30
  27. package/reanimated.mjs +155 -29
  28. package/section-list.d.ts +607 -5
  29. package/section-list.js +38 -3679
  30. package/section-list.mjs +34 -3676
  31. package/animated.d.mts +0 -9
  32. package/index.d.mts +0 -23
  33. package/index.native.d.mts +0 -23
  34. package/index.native.d.ts +0 -23
  35. package/keyboard-controller.d.mts +0 -12
  36. package/keyboard-controller.d.ts +0 -12
  37. package/keyboard-controller.js +0 -69
  38. package/keyboard-controller.mjs +0 -48
  39. package/keyboard.d.mts +0 -13
  40. package/reanimated.d.mts +0 -18
  41. package/section-list.d.mts +0 -113
  42. package/section-list.native.d.mts +0 -113
  43. package/section-list.native.d.ts +0 -113
  44. package/types-YNdphn_A.d.mts +0 -670
  45. 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.
@@ -177,11 +293,19 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
177
293
  */
178
294
  maintainScrollAtEndThreshold?: number;
179
295
  /**
180
- * If true, maintains visibility of content across data changes (filtering/resorting/insertions).
181
- * Scroll-time stability for measurements is always enabled.
296
+ * Maintains visibility of content.
297
+ * - scroll (default: true) stabilizes during size/layout changes while scrolling.
298
+ * - data (default: false) stabilizes when the data array changes; passing true also sets the RN maintainVisibleContentPosition prop.
299
+ * - shouldRestorePosition can opt out specific items from data-change anchoring.
300
+ * - undefined (default) enables scroll stabilization but skips data-change anchoring.
301
+ * - true enables both behaviors; false disables both.
302
+ */
303
+ maintainVisibleContentPosition?: boolean | MaintainVisibleContentPositionConfig<ItemT>;
304
+ /**
305
+ * Web only: when true, listens to window/body scrolling instead of rendering a scrollable list container.
182
306
  * @default false
183
307
  */
184
- maintainVisibleContentPosition?: boolean;
308
+ useWindowScroll?: boolean;
185
309
  /**
186
310
  * Number of columns to render items in.
187
311
  * @default 1
@@ -208,6 +332,10 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
208
332
  itemKey: string;
209
333
  itemData: ItemT;
210
334
  }) => void;
335
+ /**
336
+ * Called when list layout metrics change.
337
+ */
338
+ onMetricsChange?: (metrics: LegendListMetrics) => void;
211
339
  /**
212
340
  * Function to call when the user pulls to refresh.
213
341
  */
@@ -248,7 +376,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
248
376
  /**
249
377
  * Ref to the underlying ScrollView component.
250
378
  */
251
- refScrollView?: React.Ref<ScrollView>;
379
+ refScrollView?: React.Ref<any>;
252
380
  /**
253
381
  * If true, shows a refresh indicator.
254
382
  * @default false
@@ -259,7 +387,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
259
387
  * Note: When using `stickyHeaderIndices`, you must provide an Animated ScrollView component.
260
388
  * @default (props) => <ScrollView {...props} />
261
389
  */
262
- renderScrollComponent?: (props: ScrollViewProps) => React.ReactElement<ScrollViewProps>;
390
+ renderScrollComponent?: (props: any) => React.ReactElement | null;
263
391
  /**
264
392
  * This will log a suggested estimatedItemSize.
265
393
  * @required
@@ -294,11 +422,46 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
294
422
  * @deprecated Use stickyHeaderIndices instead for parity with React Native.
295
423
  */
296
424
  stickyIndices?: number[];
425
+ /**
426
+ * Configuration for sticky headers.
427
+ * @default undefined
428
+ */
429
+ stickyHeaderConfig?: StickyHeaderConfig;
297
430
  getItemType?: (item: ItemT, index: number) => TItemType;
298
- getFixedItemSize?: (index: number, item: ItemT, type: TItemType) => number | undefined;
431
+ getFixedItemSize?: (item: ItemT, index: number, type: TItemType) => number | undefined;
299
432
  itemsAreEqual?: (itemPrevious: ItemT, item: ItemT, index: number, data: readonly ItemT[]) => boolean;
300
433
  }
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);
434
+ type LegendListPropsBase<ItemT, TScrollViewProps = Record<string, any>, TItemType extends string | undefined = string | undefined> = BaseScrollViewProps<TScrollViewProps> & LegendListSpecificProps<ItemT, TItemType> & (DataModeProps<ItemT, TItemType> | ChildrenModeProps);
435
+ type LegendListPropsInternal = LegendListSpecificProps<any, string | undefined> & DataModeProps<any, string | undefined>;
436
+ interface MaintainVisibleContentPositionConfig<ItemT = any> {
437
+ data?: boolean;
438
+ size?: boolean;
439
+ shouldRestorePosition?: (item: ItemT, index: number, data: readonly ItemT[]) => boolean;
440
+ }
441
+ interface MaintainVisibleContentPositionNormalized<ItemT = any> {
442
+ data: boolean;
443
+ size: boolean;
444
+ shouldRestorePosition?: (item: ItemT, index: number, data: readonly ItemT[]) => boolean;
445
+ }
446
+ interface StickyHeaderConfig {
447
+ /**
448
+ * Specifies how far from the top edge sticky headers should start sticking.
449
+ * Useful for scenarios with a fixed navbar or header, where sticky elements pin below it..
450
+ * @default 0
451
+ */
452
+ offset?: number;
453
+ /**
454
+ * Component to render as a backdrop behind the sticky header.
455
+ * @default undefined
456
+ */
457
+ backdropComponent?: React.ComponentType<any> | React.ReactElement | null | undefined;
458
+ }
459
+ interface AlwaysRenderConfig {
460
+ top?: number;
461
+ bottom?: number;
462
+ indices?: number[];
463
+ keys?: string[];
464
+ }
302
465
  interface MaintainScrollAtEndOptions {
303
466
  onLayout?: boolean;
304
467
  onItemLayout?: boolean;
@@ -309,7 +472,10 @@ interface ColumnWrapperStyle {
309
472
  gap?: number;
310
473
  columnGap?: number;
311
474
  }
312
- type LegendListProps<ItemT = any> = LegendListPropsBase<ItemT, ComponentProps<typeof ScrollView>>;
475
+ interface LegendListMetrics {
476
+ headerSize: number;
477
+ footerSize: number;
478
+ }
313
479
  interface ThresholdSnapshot {
314
480
  scrollPosition: number;
315
481
  contentSize?: number;
@@ -317,167 +483,202 @@ interface ThresholdSnapshot {
317
483
  atThreshold: boolean;
318
484
  }
319
485
  interface ScrollTarget {
320
- offset: number;
321
- index?: number;
322
- viewOffset?: number;
323
- viewPosition?: number;
324
486
  animated?: boolean;
487
+ index?: number;
325
488
  isInitialScroll?: boolean;
489
+ itemSize?: number;
490
+ offset: number;
326
491
  precomputedWithViewOffset?: boolean;
492
+ viewOffset?: number;
493
+ viewPosition?: number;
327
494
  }
328
495
  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>;
496
+ activeStickyIndex: number | undefined;
497
+ adjustingFromInitialMount?: number;
498
+ animFrameCheckFinishedScroll?: any;
499
+ averageSizes: Record<string, {
500
+ num: number;
501
+ avg: number;
502
+ }>;
503
+ columns: Array<number | undefined>;
504
+ columnSpans: Array<number | undefined>;
505
+ containerItemKeys: Map<string, number>;
334
506
  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;
507
+ dataChangeEpoch: number;
508
+ dataChangeNeedsScrollUpdate: boolean;
509
+ didColumnsChange?: boolean;
510
+ didDataChange?: boolean;
511
+ didFinishInitialScroll?: boolean;
512
+ didContainersLayout?: boolean;
513
+ enableScrollForNextCalculateItemsInView: boolean;
344
514
  endBuffered: number;
345
515
  endNoBuffer: number;
516
+ endReachedSnapshot: ThresholdSnapshot | undefined;
346
517
  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>;
518
+ hasScrolled?: boolean;
366
519
  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;
520
+ idsInView: string[];
389
521
  ignoreScrollFromMVCP?: {
390
522
  lt?: number;
391
523
  gt?: number;
392
524
  };
393
525
  ignoreScrollFromMVCPIgnored?: boolean;
394
526
  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;
527
+ indexByKey: Map<string, number>;
403
528
  initialAnchor?: InitialScrollAnchor;
529
+ initialScroll: ScrollIndexWithOffsetAndContentOffset | undefined;
530
+ isAtEnd: boolean;
531
+ isAtStart: boolean;
532
+ isEndReached: boolean | null;
533
+ isFirst?: boolean;
534
+ isStartReached: boolean | null;
535
+ lastBatchingAction: number;
404
536
  lastLayout: LayoutRectangle | undefined;
405
- timeoutSetPaddingTop?: any;
406
- activeStickyIndex: number | undefined;
407
- stickyContainers: Map<number, number>;
408
- stickyContainerPool: Set<number>;
409
- scrollProcessingEnabled: boolean;
537
+ lastScrollAdjustForHistory?: number;
538
+ lastScrollDelta: number;
539
+ loadStartTime: number;
540
+ maintainingScrollAtEnd?: boolean;
541
+ minIndexSizeChanged: number | undefined;
542
+ mvcpAnchorLock?: {
543
+ id: string;
544
+ position: number;
545
+ quietPasses: number;
546
+ expiresAt: number;
547
+ };
548
+ contentInsetOverride?: Partial<Insets> | null;
549
+ nativeContentInset?: Insets;
550
+ nativeMarginTop: number;
551
+ needsOtherAxisSize?: boolean;
552
+ otherAxisSize?: number;
410
553
  pendingTotalSize?: number;
411
- adjustingFromInitialMount?: number;
554
+ pendingScrollResolve?: (() => void) | undefined;
555
+ positions: Array<number | undefined>;
556
+ previousData?: readonly unknown[];
557
+ queuedCalculateItemsInView: number | undefined;
558
+ queuedMVCPRecalculate?: number;
559
+ queuedInitialLayout?: boolean | undefined;
560
+ refScroller: React.RefObject<LegendListScrollerRef | null>;
561
+ scroll: number;
562
+ scrollAdjustHandler: ScrollAdjustHandler;
563
+ scrollForNextCalculateItemsInView: {
564
+ top: number | null;
565
+ bottom: number | null;
566
+ } | undefined;
567
+ scrollHistory: Array<{
568
+ scroll: number;
569
+ time: number;
570
+ }>;
571
+ scrollingTo?: ScrollTarget | undefined;
572
+ scrollLastCalculate?: number;
573
+ scrollLength: number;
574
+ scrollPending: number;
575
+ scrollPrev: number;
576
+ scrollPrevTime: number;
577
+ scrollProcessingEnabled: boolean;
578
+ scrollTime: number;
579
+ sizes: Map<string, number>;
580
+ sizesKnown: Map<string, number>;
581
+ startBuffered: number;
582
+ startBufferedId?: string;
583
+ startNoBuffer: number;
584
+ startReachedSnapshotDataChangeEpoch: number | undefined;
585
+ startReachedSnapshot: ThresholdSnapshot | undefined;
586
+ stickyContainerPool: Set<number>;
587
+ stickyContainers: Map<number, number>;
588
+ timeouts: Set<number>;
589
+ timeoutSetPaddingTop?: any;
590
+ timeoutSizeMessage: any;
591
+ timeoutCheckFinishedScrollFallback?: any;
592
+ totalSize: number;
593
+ triggerCalculateItemsInView?: (params?: {
594
+ doMVCP?: boolean;
595
+ dataChanged?: boolean;
596
+ forceFullItemPositions?: boolean;
597
+ }) => void;
598
+ viewabilityConfigCallbackPairs: ViewabilityConfigCallbackPairs<any> | undefined;
412
599
  props: {
413
600
  alignItemsAtEnd: boolean;
601
+ animatedProps: StylesAsSharedValue<Record<string, any>>;
602
+ alwaysRender: AlwaysRenderConfig | undefined;
603
+ alwaysRenderIndicesArr: number[];
604
+ alwaysRenderIndicesSet: Set<number>;
605
+ contentInset: Insets | undefined;
414
606
  data: readonly any[];
415
607
  dataVersion: Key | undefined;
608
+ drawDistance: number;
416
609
  estimatedItemSize: number | undefined;
417
- getEstimatedItemSize: LegendListProps["getEstimatedItemSize"];
418
- getFixedItemSize: LegendListProps["getFixedItemSize"];
419
- getItemType: LegendListProps["getItemType"];
610
+ getEstimatedItemSize: LegendListPropsInternal["getEstimatedItemSize"];
611
+ getFixedItemSize: LegendListPropsInternal["getFixedItemSize"];
612
+ getItemType: LegendListPropsInternal["getItemType"];
420
613
  horizontal: boolean;
421
- keyExtractor: LegendListProps["keyExtractor"];
614
+ initialContainerPoolRatio: number;
615
+ itemsAreEqual: LegendListPropsInternal["itemsAreEqual"];
616
+ keyExtractor: LegendListPropsInternal["keyExtractor"];
422
617
  maintainScrollAtEnd: boolean | MaintainScrollAtEndOptions;
423
618
  maintainScrollAtEndThreshold: number | undefined;
424
- maintainVisibleContentPosition: boolean;
425
- onEndReached: LegendListProps["onEndReached"];
619
+ maintainVisibleContentPosition: MaintainVisibleContentPositionNormalized;
620
+ numColumns: number;
621
+ onEndReached: LegendListPropsInternal["onEndReached"];
426
622
  onEndReachedThreshold: number | null | undefined;
427
- onItemSizeChanged: LegendListProps["onItemSizeChanged"];
428
- onLoad: LegendListProps["onLoad"];
429
- onScroll: LegendListProps["onScroll"];
430
- onStartReached: LegendListProps["onStartReached"];
623
+ onItemSizeChanged: LegendListPropsInternal["onItemSizeChanged"];
624
+ onLoad: LegendListPropsInternal["onLoad"];
625
+ onScroll: LegendListPropsInternal["onScroll"];
626
+ onStartReached: LegendListPropsInternal["onStartReached"];
431
627
  onStartReachedThreshold: number | null | undefined;
432
- onStickyHeaderChange: LegendListProps["onStickyHeaderChange"];
628
+ onStickyHeaderChange: LegendListPropsInternal["onStickyHeaderChange"];
629
+ overrideItemLayout: LegendListPropsInternal["overrideItemLayout"];
433
630
  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;
631
+ renderItem: LegendListPropsInternal["renderItem"];
632
+ scrollBuffer?: number;
441
633
  snapToIndices: number[] | undefined;
442
- stickyIndicesSet: Set<number>;
634
+ positionComponentInternal: React.ComponentType<any> | undefined;
635
+ stickyPositionComponentInternal: React.ComponentType<any> | undefined;
443
636
  stickyIndicesArr: number[];
444
- itemsAreEqual: LegendListProps["itemsAreEqual"];
445
- enableAverages: boolean;
637
+ stickyIndicesSet: Set<number>;
638
+ stylePaddingBottom: number | undefined;
639
+ stylePaddingTop: number | undefined;
640
+ suggestEstimatedItemSize: boolean;
641
+ useWindowScroll: boolean;
446
642
  };
447
643
  }
448
644
  interface ViewableRange<T> {
449
- startBuffered: number;
450
- start: number;
451
- endBuffered: number;
452
645
  end: number;
646
+ endBuffered: number;
453
647
  items: T[];
648
+ start: number;
649
+ startBuffered: number;
454
650
  }
455
651
  interface LegendListRenderItemProps<ItemT, TItemType extends string | number | undefined = string | number | undefined> {
456
- item: ItemT;
457
- type: TItemType;
458
- index: number;
459
652
  data: readonly ItemT[];
460
653
  extraData: any;
654
+ index: number;
655
+ item: ItemT;
656
+ type: TItemType;
461
657
  }
462
- type ScrollState = {
463
- activeStickyIndex: number | undefined;
658
+ type LegendListState$1 = {
659
+ activeStickyIndex: number;
464
660
  contentLength: number;
465
661
  data: readonly any[];
466
- elementAtIndex: (index: number) => View | null | undefined;
662
+ elementAtIndex: (index: number) => any;
467
663
  end: number;
468
664
  endBuffered: number;
469
665
  isAtEnd: boolean;
470
666
  isAtStart: boolean;
667
+ isEndReached: boolean;
668
+ isStartReached: boolean;
669
+ listen: <T extends LegendListListenerType>(listenerType: T, callback: (value: ListenerTypeValueMap[T]) => void) => () => void;
670
+ listenToPosition: (key: string, callback: (value: number) => void) => () => void;
471
671
  positionAtIndex: (index: number) => number;
472
- positions: Map<string, number>;
672
+ positionByKey: (key: string) => number | undefined;
473
673
  scroll: number;
474
674
  scrollLength: number;
675
+ scrollVelocity: number;
475
676
  sizeAtIndex: (index: number) => number;
476
677
  sizes: Map<string, number>;
477
678
  start: number;
478
679
  startBuffered: number;
479
680
  };
480
- type LegendListRef = {
681
+ type LegendListRef$1 = {
481
682
  /**
482
683
  * Displays the scroll indicators momentarily.
483
684
  */
@@ -485,7 +686,7 @@ type LegendListRef = {
485
686
  /**
486
687
  * Returns the native ScrollView component reference.
487
688
  */
488
- getNativeScrollRef(): React.ElementRef<typeof ScrollViewComponent>;
689
+ getNativeScrollRef(): any;
489
690
  /**
490
691
  * Returns the scroll responder instance for handling scroll events.
491
692
  */
@@ -493,11 +694,11 @@ type LegendListRef = {
493
694
  /**
494
695
  * Returns the ScrollResponderMixin for advanced scroll handling.
495
696
  */
496
- getScrollResponder(): ScrollResponderMixin;
697
+ getScrollResponder(): any;
497
698
  /**
498
699
  * Returns the internal state of the scroll virtualization.
499
700
  */
500
- getState(): ScrollState;
701
+ getState(): LegendListState$1;
501
702
  /**
502
703
  * Scrolls a specific index into view.
503
704
  * @param params - Parameters for scrolling.
@@ -507,7 +708,7 @@ type LegendListRef = {
507
708
  scrollIndexIntoView(params: {
508
709
  animated?: boolean | undefined;
509
710
  index: number;
510
- }): void;
711
+ }): Promise<void>;
511
712
  /**
512
713
  * Scrolls a specific index into view.
513
714
  * @param params - Parameters for scrolling.
@@ -517,7 +718,7 @@ type LegendListRef = {
517
718
  scrollItemIntoView(params: {
518
719
  animated?: boolean | undefined;
519
720
  item: any;
520
- }): void;
721
+ }): Promise<void>;
521
722
  /**
522
723
  * Scrolls to the end of the list.
523
724
  * @param options - Options for scrolling.
@@ -527,7 +728,7 @@ type LegendListRef = {
527
728
  scrollToEnd(options?: {
528
729
  animated?: boolean | undefined;
529
730
  viewOffset?: number | undefined;
530
- }): void;
731
+ }): Promise<void>;
531
732
  /**
532
733
  * Scrolls to a specific index in the list.
533
734
  * @param params - Parameters for scrolling.
@@ -541,7 +742,7 @@ type LegendListRef = {
541
742
  index: number;
542
743
  viewOffset?: number | undefined;
543
744
  viewPosition?: number | undefined;
544
- }): void;
745
+ }): Promise<void>;
545
746
  /**
546
747
  * Scrolls to a specific item in the list.
547
748
  * @param params - Parameters for scrolling.
@@ -555,7 +756,7 @@ type LegendListRef = {
555
756
  item: any;
556
757
  viewOffset?: number | undefined;
557
758
  viewPosition?: number | undefined;
558
- }): void;
759
+ }): Promise<void>;
559
760
  /**
560
761
  * Scrolls to a specific offset in pixels.
561
762
  * @param params - Parameters for scrolling.
@@ -565,36 +766,49 @@ type LegendListRef = {
565
766
  scrollToOffset(params: {
566
767
  offset: number;
567
768
  animated?: boolean | undefined;
568
- }): void;
769
+ }): Promise<void>;
569
770
  /**
570
771
  * Sets or adds to the offset of the visible content anchor.
571
772
  * @param value - The offset to set or add.
572
773
  * @param animated - If true, uses Animated to animate the change.
573
774
  */
574
- setVisibleContentAnchorOffset(value: number | ((value: number) => number)): void;
775
+ setVisibleContentAnchorOffset(value: number | ((val: number) => number)): void;
575
776
  /**
576
777
  * Sets whether scroll processing is enabled.
577
778
  * @param enabled - If true, scroll processing is enabled.
578
779
  */
579
780
  setScrollProcessingEnabled(enabled: boolean): void;
781
+ /**
782
+ * Clears internal virtualization caches.
783
+ * @param options - Cache clearing options.
784
+ * @param options.mode - `sizes` clears measurement caches. `full` also clears key/position caches.
785
+ */
786
+ clearCaches(options?: {
787
+ mode?: "sizes" | "full";
788
+ }): void;
789
+ /**
790
+ * Reports an externally measured content inset. Pass null/undefined to clear.
791
+ * Values are merged on top of props/animated/native insets.
792
+ */
793
+ reportContentInset(inset?: Partial<Insets> | null): void;
580
794
  };
581
795
  interface ViewToken<ItemT = any> {
582
- item: ItemT;
583
- key: string;
796
+ containerId: number;
584
797
  index: number;
585
798
  isViewable: boolean;
586
- containerId: number;
799
+ item: ItemT;
800
+ key: string;
587
801
  }
588
802
  interface ViewAmountToken<ItemT = any> extends ViewToken<ItemT> {
589
- sizeVisible: number;
590
- size: number;
591
- percentVisible: number;
592
803
  percentOfScroller: number;
804
+ percentVisible: number;
593
805
  scrollSize: number;
806
+ size: number;
807
+ sizeVisible: number;
594
808
  }
595
809
  interface ViewabilityConfigCallbackPair<ItemT = any> {
596
- viewabilityConfig: ViewabilityConfig;
597
810
  onViewableItemsChanged?: OnViewableItemsChanged<ItemT>;
811
+ viewabilityConfig: ViewabilityConfig;
598
812
  }
599
813
  type ViewabilityConfigCallbackPairs<ItemT> = ViewabilityConfigCallbackPair<ItemT>[];
600
814
  type OnViewableItemsChanged<ItemT> = ((info: {
@@ -633,14 +847,14 @@ interface ViewabilityConfig {
633
847
  type ViewabilityCallback<ItemT = any> = (viewToken: ViewToken<ItemT>) => void;
634
848
  type ViewabilityAmountCallback<ItemT = any> = (viewToken: ViewAmountToken<ItemT>) => void;
635
849
  interface LegendListRecyclingState<T> {
636
- item: T;
637
- prevItem: T | undefined;
638
850
  index: number;
851
+ item: T;
639
852
  prevIndex: number | undefined;
853
+ prevItem: T | undefined;
640
854
  }
641
- type TypedForwardRef = <T, P = {}>(render: (props: P, ref: React.Ref<T>) => React.ReactNode) => (props: P & React.RefAttributes<T>) => React.ReactNode;
855
+ type TypedForwardRef = <T, P = {}>(render: (props: P, ref: React.Ref<T>) => React.ReactElement | null) => (props: P & React.RefAttributes<T>) => React.ReactElement | null;
642
856
  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 & {
857
+ type TypedMemo = <T extends React.ComponentType<any>>(Component: T, propsAreEqual?: (prevProps: Readonly<React.ComponentProps<T>>, nextProps: Readonly<React.ComponentProps<T>>) => boolean) => T & {
644
858
  displayName?: string;
645
859
  };
646
860
  declare const typedMemo: TypedMemo;
@@ -667,4 +881,35 @@ type GetRenderedItemResult<ItemT> = {
667
881
  };
668
882
  type GetRenderedItem = (key: string) => GetRenderedItemResult<any> | null;
669
883
 
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 };
884
+ type LegendListPropsOverrides<ItemT, TItemType extends string | undefined> = Omit<LegendListPropsBase<ItemT, ScrollViewProps, TItemType>, "onScroll" | "refScrollView" | "renderScrollComponent" | "ListHeaderComponentStyle" | "ListFooterComponentStyle"> & {
885
+ onScroll?: (event: NativeSyntheticEvent$1<NativeScrollEvent$1>) => void;
886
+ refScrollView?: React.Ref<ScrollView>;
887
+ renderScrollComponent?: (props: ScrollViewProps) => React.ReactElement<ScrollViewProps>;
888
+ ListHeaderComponentStyle?: StyleProp$1<ViewStyle$1> | undefined;
889
+ ListFooterComponentStyle?: StyleProp$1<ViewStyle$1> | undefined;
890
+ };
891
+ type LegendListProps<ItemT = any, TItemType extends string | undefined = string | undefined> = LegendListPropsOverrides<ItemT, TItemType>;
892
+ type LegendListRef = Omit<LegendListRef$1, "getNativeScrollRef" | "getScrollResponder" | "reportContentInset"> & {
893
+ getNativeScrollRef(): React.ElementRef<typeof ScrollViewComponent>;
894
+ getScrollResponder(): ScrollResponderMixin;
895
+ reportContentInset(inset?: Partial<Insets$1> | null): void;
896
+ };
897
+ type LegendListState = Omit<LegendListState$1, "elementAtIndex"> & {
898
+ elementAtIndex: (index: number) => View | null | undefined;
899
+ };
900
+ type LegendListComponent = <ItemT = any>(props: LegendListProps<ItemT> & React.RefAttributes<LegendListRef>) => React.ReactElement | null;
901
+
902
+ declare function useViewability<ItemT = any>(callback: ViewabilityCallback<ItemT>, configId?: string): void;
903
+ declare function useViewabilityAmount<ItemT = any>(callback: ViewabilityAmountCallback<ItemT>): void;
904
+ declare function useRecyclingEffect(effect: (info: LegendListRecyclingState<unknown>) => void | (() => void)): void;
905
+ declare function useRecyclingState<ItemT>(valueOrFun: ((info: LegendListRecyclingState<ItemT>) => ItemT) | ItemT): readonly [ItemT, Dispatch<SetStateAction<ItemT>>];
906
+ declare function useIsLastItem(): boolean;
907
+ declare function useListScrollSize(): {
908
+ width: number;
909
+ height: number;
910
+ };
911
+ declare function useSyncLayout(): () => void;
912
+
913
+ declare const LegendList: LegendListComponent;
914
+
915
+ 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 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 };