@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,79 @@
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 Reanimated from 'react-native-reanimated';
1
+ import * as React from 'react';
2
+ import { Key, ReactElement, HTMLAttributes, CSSProperties, Ref, RefAttributes, Dispatch, SetStateAction } from 'react';
3
+
4
+ type ScrollEventTarget = Window | HTMLElement;
5
+
6
+ interface ScrollViewMethods {
7
+ getBoundingClientRect(): DOMRect | null | undefined;
8
+ getContentNode(): HTMLElement | null;
9
+ getCurrentScrollOffset(): number;
10
+ getScrollableNode(): HTMLElement;
11
+ getScrollEventTarget(): ScrollEventTarget | null;
12
+ getScrollResponder(): HTMLElement | null;
13
+ isWindowScroll?(): boolean;
14
+ scrollBy(x: number, y: number): void;
15
+ scrollTo(options: {
16
+ x?: number;
17
+ y?: number;
18
+ animated?: boolean;
19
+ }): void;
20
+ scrollToEnd(options?: {
21
+ animated?: boolean;
22
+ }): void;
23
+ scrollToOffset(params: {
24
+ offset: number;
25
+ animated?: boolean;
26
+ }): void;
27
+ }
5
28
 
6
29
  type AnimatedValue = number;
7
30
 
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";
31
+ 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}`;
32
+ type LegendListListenerType = Extract<ListenerType, "activeStickyIndex" | "footerSize" | "headerSize" | "lastItemKeys" | "lastPositionUpdate" | "numContainers" | "numContainersPooled" | "otherAxisSize" | "readyToRender" | "snapToOffsets" | "totalSize">;
33
+ type ListenerTypeValueMap = {
34
+ activeStickyIndex: number;
35
+ animatedScrollY: any;
36
+ debugComputedScroll: number;
37
+ debugRawScroll: number;
38
+ extraData: any;
39
+ footerSize: number;
40
+ headerSize: number;
41
+ lastItemKeys: string[];
42
+ lastPositionUpdate: number;
43
+ maintainVisibleContentPosition: MaintainVisibleContentPositionNormalized;
44
+ numColumns: number;
45
+ numContainers: number;
46
+ numContainersPooled: number;
47
+ otherAxisSize: number;
48
+ readyToRender: boolean;
49
+ scrollAdjust: number;
50
+ scrollAdjustPending: number;
51
+ scrollAdjustUserOffset: number;
52
+ scrollSize: {
53
+ width: number;
54
+ height: number;
55
+ };
56
+ snapToOffsets: number[];
57
+ stylePaddingTop: number;
58
+ totalSize: number;
59
+ } & {
60
+ [K in ListenerType as K extends `containerItemKey${number}` ? K : never]: string;
61
+ } & {
62
+ [K in ListenerType as K extends `containerItemData${number}` ? K : never]: any;
63
+ } & {
64
+ [K in ListenerType as K extends `containerPosition${number}` ? K : never]: number;
65
+ } & {
66
+ [K in ListenerType as K extends `containerColumn${number}` ? K : never]: number;
67
+ } & {
68
+ [K in ListenerType as K extends `containerSpan${number}` ? K : never]: number;
69
+ } & {
70
+ [K in ListenerType as K extends `containerSticky${number}` ? K : never]: boolean;
71
+ };
9
72
  interface StateContext {
10
- internalState: InternalState | undefined;
73
+ animatedScrollY: AnimatedValue;
74
+ columnWrapperStyle: ColumnWrapperStyle | undefined;
75
+ contextNum: number;
11
76
  listeners: Map<ListenerType, Set<(value: any) => void>>;
12
- values: Map<ListenerType, any>;
13
77
  mapViewabilityCallbacks: Map<string, ViewabilityCallback>;
14
78
  mapViewabilityValues: Map<string, ViewToken>;
15
79
  mapViewabilityAmountCallbacks: Map<number, ViewabilityAmountCallback>;
@@ -21,22 +85,85 @@ interface StateContext {
21
85
  previousStart: number;
22
86
  previousEnd: number;
23
87
  }>;
24
- columnWrapperStyle: ColumnWrapperStyle | undefined;
25
- viewRefs: Map<number, React$1.RefObject<View>>;
26
- animatedScrollY: AnimatedValue;
88
+ positionListeners: Map<string, Set<(value: any) => void>>;
89
+ state: InternalState;
90
+ values: Map<ListenerType, any>;
91
+ viewRefs: Map<number, React.RefObject<LooseView | null>>;
27
92
  }
28
93
 
29
94
  declare class ScrollAdjustHandler {
30
95
  private appliedAdjust;
31
96
  private pendingAdjust;
32
- private context;
33
- private mounted;
97
+ private ctx;
34
98
  constructor(ctx: StateContext);
35
99
  requestAdjust(add: number): void;
36
- setMounted(): void;
37
100
  getAdjust(): number;
101
+ commitPendingAdjust(scrollTarget: ScrollTarget): void;
38
102
  }
39
103
 
104
+ type BaseSharedValue<T = number> = {
105
+ get: () => T;
106
+ };
107
+ type StylesAsSharedValue<Style> = {
108
+ [key in keyof Style]: Style[key] | BaseSharedValue<Style[key]>;
109
+ };
110
+
111
+ interface Insets {
112
+ top: number;
113
+ left: number;
114
+ bottom: number;
115
+ right: number;
116
+ }
117
+ interface LayoutRectangle {
118
+ x: number;
119
+ y: number;
120
+ width: number;
121
+ height: number;
122
+ }
123
+ interface NativeScrollEvent {
124
+ contentOffset: {
125
+ x: number;
126
+ y: number;
127
+ };
128
+ contentSize: {
129
+ width: number;
130
+ height: number;
131
+ };
132
+ layoutMeasurement: {
133
+ width: number;
134
+ height: number;
135
+ };
136
+ contentInset: Insets;
137
+ zoomScale: number;
138
+ }
139
+ interface NativeSyntheticEvent<T> {
140
+ nativeEvent: T;
141
+ }
142
+ type ViewStyle = Record<string, unknown>;
143
+ type StyleProp<T> = T | T[] | null | undefined | false;
144
+ interface ScrollEventTargetLike {
145
+ addEventListener(type: string, listener: (...args: any[]) => void): void;
146
+ removeEventListener(type: string, listener: (...args: any[]) => void): void;
147
+ }
148
+ interface ScrollableNodeLike {
149
+ scrollLeft?: number;
150
+ scrollTop?: number;
151
+ }
152
+ interface LegendListScrollerRef {
153
+ flashScrollIndicators(): void;
154
+ getCurrentScrollOffset?(): number;
155
+ getScrollEventTarget(): ScrollEventTargetLike | null;
156
+ getScrollableNode(): ScrollableNodeLike | null;
157
+ getScrollResponder(): unknown;
158
+ scrollTo(options: {
159
+ animated?: boolean;
160
+ x?: number;
161
+ y?: number;
162
+ }): void;
163
+ scrollToEnd(options?: {
164
+ animated?: boolean;
165
+ }): void;
166
+ }
40
167
  type BaseScrollViewProps<TScrollView> = Omit<TScrollView, "contentOffset" | "maintainVisibleContentPosition" | "stickyHeaderIndices" | "removeClippedSubviews" | "children" | "onScroll">;
41
168
  interface DataModeProps<ItemT, TItemType extends string | undefined> {
42
169
  /**
@@ -51,7 +178,7 @@ interface DataModeProps<ItemT, TItemType extends string | undefined> {
51
178
  * - A React component: React.ComponentType<LegendListRenderItemProps<ItemT>>
52
179
  * @required when using data mode
53
180
  */
54
- renderItem: ((props: LegendListRenderItemProps<ItemT, TItemType>) => ReactNode) | React.ComponentType<LegendListRenderItemProps<ItemT, TItemType>>;
181
+ renderItem: ((props: LegendListRenderItemProps<ItemT, TItemType>) => React.ReactNode) | React.ComponentType<LegendListRenderItemProps<ItemT, TItemType>>;
55
182
  children?: never;
56
183
  }
57
184
  interface ChildrenModeProps {
@@ -60,7 +187,7 @@ interface ChildrenModeProps {
60
187
  * Each child will be treated as an individual list item.
61
188
  * @required when using children mode
62
189
  */
63
- children: ReactNode;
190
+ children: React.ReactNode;
64
191
  data?: never;
65
192
  renderItem?: never;
66
193
  }
@@ -71,10 +198,10 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
71
198
  */
72
199
  alignItemsAtEnd?: boolean;
73
200
  /**
74
- * If true, enables using average sizes for performance optimization.
75
- * @default true
201
+ * Keeps selected items mounted even when they scroll out of view.
202
+ * @default undefined
76
203
  */
77
- enableAverages?: boolean;
204
+ alwaysRender?: AlwaysRenderConfig;
78
205
  /**
79
206
  * Style applied to each column's wrapper view.
80
207
  */
@@ -111,7 +238,14 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
111
238
  * In case you have distinct item sizes, you can provide a function to get the size of an item.
112
239
  * Use instead of FlatList's getItemLayout or FlashList overrideItemLayout if you want to have accurate initialScrollOffset, you should provide this function
113
240
  */
114
- getEstimatedItemSize?: (index: number, item: ItemT, type: TItemType) => number;
241
+ getEstimatedItemSize?: (item: ItemT, index: number, type: TItemType) => number;
242
+ /**
243
+ * Customize layout for multi-column lists, such as allowing items to span multiple columns.
244
+ * Similar to FlashList's overrideItemLayout.
245
+ */
246
+ overrideItemLayout?: (layout: {
247
+ span?: number;
248
+ }, item: ItemT, index: number, maxColumns: number, extraData?: any) => void;
115
249
  /**
116
250
  * Ratio of initial container pool size to data length (e.g., 0.5 for half).
117
251
  * @default 2
@@ -129,6 +263,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
129
263
  initialScrollIndex?: number | {
130
264
  index: number;
131
265
  viewOffset?: number | undefined;
266
+ viewPosition?: number | undefined;
132
267
  };
133
268
  /**
134
269
  * When true, the list initializes scrolled to the last item.
@@ -168,6 +303,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
168
303
  ListHeaderComponentStyle?: StyleProp<ViewStyle> | undefined;
169
304
  /**
170
305
  * If true, auto-scrolls to end when new items are added.
306
+ * Use an options object to opt into specific triggers and control whether that scroll is animated.
171
307
  * @default false
172
308
  */
173
309
  maintainScrollAtEnd?: boolean | MaintainScrollAtEndOptions;
@@ -177,11 +313,19 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
177
313
  */
178
314
  maintainScrollAtEndThreshold?: number;
179
315
  /**
180
- * If true, maintains visibility of content across data changes (filtering/resorting/insertions).
181
- * Scroll-time stability for measurements is always enabled.
316
+ * Maintains visibility of content.
317
+ * - scroll (default: true) stabilizes during size/layout changes while scrolling.
318
+ * - data (default: false) stabilizes when the data array changes; passing true also sets the RN maintainVisibleContentPosition prop.
319
+ * - shouldRestorePosition can opt out specific items from data-change anchoring.
320
+ * - undefined (default) enables scroll stabilization but skips data-change anchoring.
321
+ * - true enables both behaviors; false disables both.
322
+ */
323
+ maintainVisibleContentPosition?: boolean | MaintainVisibleContentPositionConfig<ItemT>;
324
+ /**
325
+ * Web only: when true, listens to window/body scrolling instead of rendering a scrollable list container.
182
326
  * @default false
183
327
  */
184
- maintainVisibleContentPosition?: boolean;
328
+ useWindowScroll?: boolean;
185
329
  /**
186
330
  * Number of columns to render items in.
187
331
  * @default 1
@@ -208,6 +352,10 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
208
352
  itemKey: string;
209
353
  itemData: ItemT;
210
354
  }) => void;
355
+ /**
356
+ * Called when list layout metrics change.
357
+ */
358
+ onMetricsChange?: (metrics: LegendListMetrics) => void;
211
359
  /**
212
360
  * Function to call when the user pulls to refresh.
213
361
  */
@@ -248,7 +396,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
248
396
  /**
249
397
  * Ref to the underlying ScrollView component.
250
398
  */
251
- refScrollView?: React.Ref<ScrollView>;
399
+ refScrollView?: React.Ref<any>;
252
400
  /**
253
401
  * If true, shows a refresh indicator.
254
402
  * @default false
@@ -259,7 +407,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
259
407
  * Note: When using `stickyHeaderIndices`, you must provide an Animated ScrollView component.
260
408
  * @default (props) => <ScrollView {...props} />
261
409
  */
262
- renderScrollComponent?: (props: ScrollViewProps) => React.ReactElement<ScrollViewProps>;
410
+ renderScrollComponent?: (props: any) => React.ReactElement | null;
263
411
  /**
264
412
  * This will log a suggested estimatedItemSize.
265
413
  * @required
@@ -294,22 +442,72 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
294
442
  * @deprecated Use stickyHeaderIndices instead for parity with React Native.
295
443
  */
296
444
  stickyIndices?: number[];
445
+ /**
446
+ * Configuration for sticky headers.
447
+ * @default undefined
448
+ */
449
+ stickyHeaderConfig?: StickyHeaderConfig;
297
450
  getItemType?: (item: ItemT, index: number) => TItemType;
298
- getFixedItemSize?: (index: number, item: ItemT, type: TItemType) => number | undefined;
451
+ getFixedItemSize?: (item: ItemT, index: number, type: TItemType) => number | undefined;
299
452
  itemsAreEqual?: (itemPrevious: ItemT, item: ItemT, index: number, data: readonly ItemT[]) => boolean;
300
453
  }
301
- type LegendListPropsBase<ItemT, TScrollView extends ComponentProps<typeof ScrollView> | ComponentProps<typeof Animated.ScrollView> | ComponentProps<typeof Reanimated.ScrollView>, TItemType extends string | undefined = string | undefined> = BaseScrollViewProps<TScrollView> & LegendListSpecificProps<ItemT, TItemType> & (DataModeProps<ItemT, TItemType> | ChildrenModeProps);
454
+ type LegendListPropsBase<ItemT, TScrollViewProps = Record<string, any>, TItemType extends string | undefined = string | undefined> = BaseScrollViewProps<TScrollViewProps> & LegendListSpecificProps<ItemT, TItemType> & (DataModeProps<ItemT, TItemType> | ChildrenModeProps);
455
+ type LegendListPropsInternal = LegendListSpecificProps<any, string | undefined> & DataModeProps<any, string | undefined>;
456
+ interface MaintainVisibleContentPositionConfig<ItemT = any> {
457
+ data?: boolean;
458
+ size?: boolean;
459
+ shouldRestorePosition?: (item: ItemT, index: number, data: readonly ItemT[]) => boolean;
460
+ }
461
+ interface MaintainVisibleContentPositionNormalized<ItemT = any> {
462
+ data: boolean;
463
+ size: boolean;
464
+ shouldRestorePosition?: (item: ItemT, index: number, data: readonly ItemT[]) => boolean;
465
+ }
466
+ interface StickyHeaderConfig {
467
+ /**
468
+ * Specifies how far from the top edge sticky headers should start sticking.
469
+ * Useful for scenarios with a fixed navbar or header, where sticky elements pin below it..
470
+ * @default 0
471
+ */
472
+ offset?: number;
473
+ /**
474
+ * Component to render as a backdrop behind the sticky header.
475
+ * @default undefined
476
+ */
477
+ backdropComponent?: React.ComponentType<any> | React.ReactElement | null | undefined;
478
+ }
479
+ interface AlwaysRenderConfig {
480
+ top?: number;
481
+ bottom?: number;
482
+ indices?: number[];
483
+ keys?: string[];
484
+ }
485
+ interface MaintainScrollAtEndOnOptions {
486
+ dataChange?: boolean;
487
+ itemLayout?: boolean;
488
+ layout?: boolean;
489
+ }
302
490
  interface MaintainScrollAtEndOptions {
303
- onLayout?: boolean;
304
- onItemLayout?: boolean;
305
- onDataChange?: boolean;
491
+ /**
492
+ * Whether maintainScrollAtEnd should animate when it scrolls to the end.
493
+ */
494
+ animated?: boolean;
495
+ /**
496
+ * Which events should keep the list pinned to the end.
497
+ * - If omitted, object values default to all triggers.
498
+ * - If provided, only the keys set to `true` are enabled.
499
+ */
500
+ on?: MaintainScrollAtEndOnOptions;
306
501
  }
307
502
  interface ColumnWrapperStyle {
308
503
  rowGap?: number;
309
504
  gap?: number;
310
505
  columnGap?: number;
311
506
  }
312
- type LegendListProps<ItemT = any> = LegendListPropsBase<ItemT, ComponentProps<typeof ScrollView>>;
507
+ interface LegendListMetrics {
508
+ headerSize: number;
509
+ footerSize: number;
510
+ }
313
511
  interface ThresholdSnapshot {
314
512
  scrollPosition: number;
315
513
  contentSize?: number;
@@ -317,167 +515,222 @@ interface ThresholdSnapshot {
317
515
  atThreshold: boolean;
318
516
  }
319
517
  interface ScrollTarget {
320
- offset: number;
321
- index?: number;
322
- viewOffset?: number;
323
- viewPosition?: number;
324
518
  animated?: boolean;
519
+ index?: number;
325
520
  isInitialScroll?: boolean;
521
+ itemSize?: number;
522
+ offset: number;
326
523
  precomputedWithViewOffset?: boolean;
524
+ targetOffset?: number;
525
+ viewOffset?: number;
526
+ viewPosition?: number;
327
527
  }
328
528
  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>;
529
+ activeStickyIndex: number | undefined;
530
+ adjustingFromInitialMount?: number;
531
+ animFrameCheckFinishedScroll?: any;
532
+ averageSizes: Record<string, {
533
+ num: number;
534
+ avg: number;
535
+ }>;
536
+ columns: Array<number | undefined>;
537
+ columnSpans: Array<number | undefined>;
538
+ containerItemKeys: Map<string, number>;
334
539
  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;
540
+ dataChangeEpoch: number;
541
+ dataChangeNeedsScrollUpdate: boolean;
542
+ didColumnsChange?: boolean;
543
+ didDataChange?: boolean;
544
+ didFinishInitialScroll?: boolean;
545
+ didContainersLayout?: boolean;
546
+ enableScrollForNextCalculateItemsInView: boolean;
344
547
  endBuffered: number;
345
548
  endNoBuffer: number;
549
+ endReachedSnapshot: ThresholdSnapshot | undefined;
346
550
  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>;
551
+ hasScrolled?: boolean;
366
552
  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;
553
+ idsInView: string[];
389
554
  ignoreScrollFromMVCP?: {
390
555
  lt?: number;
391
556
  gt?: number;
392
557
  };
393
558
  ignoreScrollFromMVCPIgnored?: boolean;
394
559
  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;
560
+ indexByKey: Map<string, number>;
403
561
  initialAnchor?: InitialScrollAnchor;
562
+ initialNativeScrollWatchdog?: {
563
+ startScroll: number;
564
+ targetOffset: number;
565
+ };
566
+ initialScrollLastDidFinish: boolean;
567
+ initialScrollLastTarget: ScrollIndexWithOffsetAndContentOffset | undefined;
568
+ initialScrollLastTargetUsesOffset: boolean;
569
+ initialScrollPreviousDataLength: number;
570
+ initialScrollRetryLastLength: number | undefined;
571
+ initialScrollRetryWindowUntil: number;
572
+ initialScroll: ScrollIndexWithOffsetAndContentOffset | undefined;
573
+ initialScrollUsesOffset: boolean;
574
+ isAtEnd: boolean;
575
+ isAtStart: boolean;
576
+ isEndReached: boolean | null;
577
+ isFirst?: boolean;
578
+ isStartReached: boolean | null;
579
+ lastBatchingAction: number;
404
580
  lastLayout: LayoutRectangle | undefined;
405
- timeoutSetPaddingTop?: any;
406
- activeStickyIndex: number | undefined;
407
- stickyContainers: Map<number, number>;
408
- stickyContainerPool: Set<number>;
409
- scrollProcessingEnabled: boolean;
581
+ lastScrollAdjustForHistory?: number;
582
+ lastScrollDelta: number;
583
+ loadStartTime: number;
584
+ maintainingScrollAtEnd?: boolean;
585
+ minIndexSizeChanged: number | undefined;
586
+ mvcpAnchorLock?: {
587
+ id: string;
588
+ position: number;
589
+ quietPasses: number;
590
+ expiresAt: number;
591
+ };
592
+ contentInsetOverride?: Partial<Insets> | null;
593
+ nativeContentInset?: Insets;
594
+ nativeMarginTop: number;
595
+ needsOtherAxisSize?: boolean;
596
+ otherAxisSize?: number;
597
+ pendingNativeMVCPAdjust?: {
598
+ amount: number;
599
+ closestDistanceToClamp: number;
600
+ hasApproachedClamp: boolean;
601
+ manualApplied: number;
602
+ startScroll: number;
603
+ };
604
+ pendingMaintainScrollAtEnd?: boolean;
410
605
  pendingTotalSize?: number;
411
- adjustingFromInitialMount?: number;
606
+ pendingScrollResolve?: (() => void) | undefined;
607
+ positions: Array<number | undefined>;
608
+ previousData?: readonly unknown[];
609
+ queuedCalculateItemsInView: number | undefined;
610
+ queuedMVCPRecalculate?: number;
611
+ queuedInitialLayout?: boolean | undefined;
612
+ refScroller: React.RefObject<LegendListScrollerRef | null>;
613
+ scroll: number;
614
+ scrollAdjustHandler: ScrollAdjustHandler;
615
+ scrollForNextCalculateItemsInView: {
616
+ top: number | null;
617
+ bottom: number | null;
618
+ } | undefined;
619
+ scrollHistory: Array<{
620
+ scroll: number;
621
+ time: number;
622
+ }>;
623
+ scrollingTo?: ScrollTarget | undefined;
624
+ scrollLastCalculate?: number;
625
+ scrollLength: number;
626
+ scrollPending: number;
627
+ scrollPrev: number;
628
+ scrollPrevTime: number;
629
+ scrollProcessingEnabled: boolean;
630
+ scrollTime: number;
631
+ sizes: Map<string, number>;
632
+ sizesKnown: Map<string, number>;
633
+ startBuffered: number;
634
+ startBufferedId?: string;
635
+ startNoBuffer: number;
636
+ startReachedSnapshotDataChangeEpoch: number | undefined;
637
+ startReachedSnapshot: ThresholdSnapshot | undefined;
638
+ stickyContainerPool: Set<number>;
639
+ stickyContainers: Map<number, number>;
640
+ timeouts: Set<number>;
641
+ timeoutSetPaddingTop?: any;
642
+ timeoutSizeMessage: any;
643
+ timeoutCheckFinishedScrollFallback?: any;
644
+ totalSize: number;
645
+ triggerCalculateItemsInView?: (params?: {
646
+ doMVCP?: boolean;
647
+ dataChanged?: boolean;
648
+ forceFullItemPositions?: boolean;
649
+ }) => void;
650
+ viewabilityConfigCallbackPairs: ViewabilityConfigCallbackPairs<any> | undefined;
412
651
  props: {
413
652
  alignItemsAtEnd: boolean;
653
+ animatedProps: StylesAsSharedValue<Record<string, any>>;
654
+ alwaysRender: AlwaysRenderConfig | undefined;
655
+ alwaysRenderIndicesArr: number[];
656
+ alwaysRenderIndicesSet: Set<number>;
657
+ contentInset: Insets | undefined;
414
658
  data: readonly any[];
415
659
  dataVersion: Key | undefined;
660
+ drawDistance: number;
416
661
  estimatedItemSize: number | undefined;
417
- getEstimatedItemSize: LegendListProps["getEstimatedItemSize"];
418
- getFixedItemSize: LegendListProps["getFixedItemSize"];
419
- getItemType: LegendListProps["getItemType"];
662
+ getEstimatedItemSize: LegendListPropsInternal["getEstimatedItemSize"];
663
+ getFixedItemSize: LegendListPropsInternal["getFixedItemSize"];
664
+ getItemType: LegendListPropsInternal["getItemType"];
420
665
  horizontal: boolean;
421
- keyExtractor: LegendListProps["keyExtractor"];
422
- maintainScrollAtEnd: boolean | MaintainScrollAtEndOptions;
666
+ initialContainerPoolRatio: number;
667
+ itemsAreEqual: LegendListPropsInternal["itemsAreEqual"];
668
+ keyExtractor: LegendListPropsInternal["keyExtractor"];
669
+ maintainScrollAtEnd: MaintainScrollAtEndNormalized | undefined;
423
670
  maintainScrollAtEndThreshold: number | undefined;
424
- maintainVisibleContentPosition: boolean;
425
- onEndReached: LegendListProps["onEndReached"];
671
+ maintainVisibleContentPosition: MaintainVisibleContentPositionNormalized;
672
+ numColumns: number;
673
+ onEndReached: LegendListPropsInternal["onEndReached"];
426
674
  onEndReachedThreshold: number | null | undefined;
427
- onItemSizeChanged: LegendListProps["onItemSizeChanged"];
428
- onLoad: LegendListProps["onLoad"];
429
- onScroll: LegendListProps["onScroll"];
430
- onStartReached: LegendListProps["onStartReached"];
675
+ onItemSizeChanged: LegendListPropsInternal["onItemSizeChanged"];
676
+ onLoad: LegendListPropsInternal["onLoad"];
677
+ onScroll: LegendListPropsInternal["onScroll"];
678
+ onStartReached: LegendListPropsInternal["onStartReached"];
431
679
  onStartReachedThreshold: number | null | undefined;
432
- onStickyHeaderChange: LegendListProps["onStickyHeaderChange"];
680
+ onStickyHeaderChange: LegendListPropsInternal["onStickyHeaderChange"];
681
+ overrideItemLayout: LegendListPropsInternal["overrideItemLayout"];
433
682
  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;
683
+ renderItem: LegendListPropsInternal["renderItem"];
684
+ scrollBuffer?: number;
441
685
  snapToIndices: number[] | undefined;
442
- stickyIndicesSet: Set<number>;
686
+ positionComponentInternal: React.ComponentType<any> | undefined;
687
+ stickyPositionComponentInternal: React.ComponentType<any> | undefined;
443
688
  stickyIndicesArr: number[];
444
- itemsAreEqual: LegendListProps["itemsAreEqual"];
445
- enableAverages: boolean;
689
+ stickyIndicesSet: Set<number>;
690
+ stylePaddingBottom: number | undefined;
691
+ stylePaddingTop: number | undefined;
692
+ suggestEstimatedItemSize: boolean;
693
+ useWindowScroll: boolean;
446
694
  };
447
695
  }
448
696
  interface ViewableRange<T> {
449
- startBuffered: number;
450
- start: number;
451
- endBuffered: number;
452
697
  end: number;
698
+ endBuffered: number;
453
699
  items: T[];
700
+ start: number;
701
+ startBuffered: number;
454
702
  }
455
703
  interface LegendListRenderItemProps<ItemT, TItemType extends string | number | undefined = string | number | undefined> {
456
- item: ItemT;
457
- type: TItemType;
458
- index: number;
459
704
  data: readonly ItemT[];
460
705
  extraData: any;
706
+ index: number;
707
+ item: ItemT;
708
+ type: TItemType;
461
709
  }
462
- type ScrollState = {
463
- activeStickyIndex: number | undefined;
710
+ type LegendListState$1 = {
711
+ activeStickyIndex: number;
464
712
  contentLength: number;
465
713
  data: readonly any[];
466
- elementAtIndex: (index: number) => View | null | undefined;
714
+ elementAtIndex: (index: number) => any;
467
715
  end: number;
468
716
  endBuffered: number;
469
717
  isAtEnd: boolean;
470
718
  isAtStart: boolean;
719
+ isEndReached: boolean;
720
+ isStartReached: boolean;
721
+ listen: <T extends LegendListListenerType>(listenerType: T, callback: (value: ListenerTypeValueMap[T]) => void) => () => void;
722
+ listenToPosition: (key: string, callback: (value: number) => void) => () => void;
471
723
  positionAtIndex: (index: number) => number;
472
- positions: Map<string, number>;
724
+ positionByKey: (key: string) => number | undefined;
473
725
  scroll: number;
474
726
  scrollLength: number;
727
+ scrollVelocity: number;
475
728
  sizeAtIndex: (index: number) => number;
476
729
  sizes: Map<string, number>;
477
730
  start: number;
478
731
  startBuffered: number;
479
732
  };
480
- type LegendListRef = {
733
+ type LegendListRef$1 = {
481
734
  /**
482
735
  * Displays the scroll indicators momentarily.
483
736
  */
@@ -485,7 +738,7 @@ type LegendListRef = {
485
738
  /**
486
739
  * Returns the native ScrollView component reference.
487
740
  */
488
- getNativeScrollRef(): React.ElementRef<typeof ScrollViewComponent>;
741
+ getNativeScrollRef(): any;
489
742
  /**
490
743
  * Returns the scroll responder instance for handling scroll events.
491
744
  */
@@ -493,11 +746,11 @@ type LegendListRef = {
493
746
  /**
494
747
  * Returns the ScrollResponderMixin for advanced scroll handling.
495
748
  */
496
- getScrollResponder(): ScrollResponderMixin;
749
+ getScrollResponder(): any;
497
750
  /**
498
751
  * Returns the internal state of the scroll virtualization.
499
752
  */
500
- getState(): ScrollState;
753
+ getState(): LegendListState$1;
501
754
  /**
502
755
  * Scrolls a specific index into view.
503
756
  * @param params - Parameters for scrolling.
@@ -507,7 +760,7 @@ type LegendListRef = {
507
760
  scrollIndexIntoView(params: {
508
761
  animated?: boolean | undefined;
509
762
  index: number;
510
- }): void;
763
+ }): Promise<void>;
511
764
  /**
512
765
  * Scrolls a specific index into view.
513
766
  * @param params - Parameters for scrolling.
@@ -517,7 +770,7 @@ type LegendListRef = {
517
770
  scrollItemIntoView(params: {
518
771
  animated?: boolean | undefined;
519
772
  item: any;
520
- }): void;
773
+ }): Promise<void>;
521
774
  /**
522
775
  * Scrolls to the end of the list.
523
776
  * @param options - Options for scrolling.
@@ -527,7 +780,7 @@ type LegendListRef = {
527
780
  scrollToEnd(options?: {
528
781
  animated?: boolean | undefined;
529
782
  viewOffset?: number | undefined;
530
- }): void;
783
+ }): Promise<void>;
531
784
  /**
532
785
  * Scrolls to a specific index in the list.
533
786
  * @param params - Parameters for scrolling.
@@ -541,7 +794,7 @@ type LegendListRef = {
541
794
  index: number;
542
795
  viewOffset?: number | undefined;
543
796
  viewPosition?: number | undefined;
544
- }): void;
797
+ }): Promise<void>;
545
798
  /**
546
799
  * Scrolls to a specific item in the list.
547
800
  * @param params - Parameters for scrolling.
@@ -555,7 +808,7 @@ type LegendListRef = {
555
808
  item: any;
556
809
  viewOffset?: number | undefined;
557
810
  viewPosition?: number | undefined;
558
- }): void;
811
+ }): Promise<void>;
559
812
  /**
560
813
  * Scrolls to a specific offset in pixels.
561
814
  * @param params - Parameters for scrolling.
@@ -565,36 +818,49 @@ type LegendListRef = {
565
818
  scrollToOffset(params: {
566
819
  offset: number;
567
820
  animated?: boolean | undefined;
568
- }): void;
821
+ }): Promise<void>;
569
822
  /**
570
823
  * Sets or adds to the offset of the visible content anchor.
571
824
  * @param value - The offset to set or add.
572
825
  * @param animated - If true, uses Animated to animate the change.
573
826
  */
574
- setVisibleContentAnchorOffset(value: number | ((value: number) => number)): void;
827
+ setVisibleContentAnchorOffset(value: number | ((val: number) => number)): void;
575
828
  /**
576
829
  * Sets whether scroll processing is enabled.
577
830
  * @param enabled - If true, scroll processing is enabled.
578
831
  */
579
832
  setScrollProcessingEnabled(enabled: boolean): void;
833
+ /**
834
+ * Clears internal virtualization caches.
835
+ * @param options - Cache clearing options.
836
+ * @param options.mode - `sizes` clears measurement caches. `full` also clears key/position caches.
837
+ */
838
+ clearCaches(options?: {
839
+ mode?: "sizes" | "full";
840
+ }): void;
841
+ /**
842
+ * Reports an externally measured content inset. Pass null/undefined to clear.
843
+ * Values are merged on top of props/animated/native insets.
844
+ */
845
+ reportContentInset(inset?: Partial<Insets> | null): void;
580
846
  };
581
847
  interface ViewToken<ItemT = any> {
582
- item: ItemT;
583
- key: string;
848
+ containerId: number;
584
849
  index: number;
585
850
  isViewable: boolean;
586
- containerId: number;
851
+ item: ItemT;
852
+ key: string;
587
853
  }
588
854
  interface ViewAmountToken<ItemT = any> extends ViewToken<ItemT> {
589
- sizeVisible: number;
590
- size: number;
591
- percentVisible: number;
592
855
  percentOfScroller: number;
856
+ percentVisible: number;
593
857
  scrollSize: number;
858
+ size: number;
859
+ sizeVisible: number;
594
860
  }
595
861
  interface ViewabilityConfigCallbackPair<ItemT = any> {
596
- viewabilityConfig: ViewabilityConfig;
597
862
  onViewableItemsChanged?: OnViewableItemsChanged<ItemT>;
863
+ viewabilityConfig: ViewabilityConfig;
598
864
  }
599
865
  type ViewabilityConfigCallbackPairs<ItemT> = ViewabilityConfigCallbackPair<ItemT>[];
600
866
  type OnViewableItemsChanged<ItemT> = ((info: {
@@ -633,14 +899,14 @@ interface ViewabilityConfig {
633
899
  type ViewabilityCallback<ItemT = any> = (viewToken: ViewToken<ItemT>) => void;
634
900
  type ViewabilityAmountCallback<ItemT = any> = (viewToken: ViewAmountToken<ItemT>) => void;
635
901
  interface LegendListRecyclingState<T> {
636
- item: T;
637
- prevItem: T | undefined;
638
902
  index: number;
903
+ item: T;
639
904
  prevIndex: number | undefined;
905
+ prevItem: T | undefined;
640
906
  }
641
- type TypedForwardRef = <T, P = {}>(render: (props: P, ref: React.Ref<T>) => React.ReactNode) => (props: P & React.RefAttributes<T>) => React.ReactNode;
907
+ type TypedForwardRef = <T, P = {}>(render: (props: P, ref: React.Ref<T>) => React.ReactElement | null) => (props: P & React.RefAttributes<T>) => React.ReactElement | null;
642
908
  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 & {
909
+ type TypedMemo = <T extends React.ComponentType<any>>(Component: T, propsAreEqual?: (prevProps: Readonly<React.ComponentProps<T>>, nextProps: Readonly<React.ComponentProps<T>>) => boolean) => T & {
644
910
  displayName?: string;
645
911
  };
646
912
  declare const typedMemo: TypedMemo;
@@ -667,4 +933,73 @@ type GetRenderedItemResult<ItemT> = {
667
933
  };
668
934
  type GetRenderedItem = (key: string) => GetRenderedItemResult<any> | null;
669
935
 
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 };
936
+ type LooseLayoutChangeEvent = {
937
+ nativeEvent: {
938
+ layout: LayoutRectangle;
939
+ };
940
+ };
941
+ type LooseMeasureCallback = (x: number, y: number, width: number, height: number, pageX: number, pageY: number) => void;
942
+ interface LooseView {
943
+ measure?: (callback: LooseMeasureCallback) => void;
944
+ }
945
+ interface LooseScrollViewProps {
946
+ contentContainerStyle?: StyleProp<ViewStyle>;
947
+ contentInset?: Insets;
948
+ contentOffset?: {
949
+ x: number;
950
+ y: number;
951
+ };
952
+ horizontal?: boolean;
953
+ maintainVisibleContentPosition?: {
954
+ autoscrollToTopThreshold?: number;
955
+ minIndexForVisible: number;
956
+ };
957
+ onLayout?: (event: LooseLayoutChangeEvent) => void;
958
+ onMomentumScrollBegin?: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
959
+ onMomentumScrollEnd?: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
960
+ onScroll?: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
961
+ refreshControl?: ReactElement | null;
962
+ removeClippedSubviews?: boolean;
963
+ scrollEventThrottle?: number;
964
+ showsHorizontalScrollIndicator?: boolean;
965
+ showsVerticalScrollIndicator?: boolean;
966
+ stickyHeaderIndices?: number[];
967
+ style?: StyleProp<ViewStyle>;
968
+ }
969
+
970
+ type ScrollViewPropsWeb = Omit<LooseScrollViewProps, "style" | "contentContainerStyle" | "onScroll" | "onLayout" | "pagingEnabled" | "snapToInterval"> & Omit<HTMLAttributes<HTMLDivElement>, "onScroll" | "onLayout" | "style"> & {
971
+ style?: CSSProperties;
972
+ contentContainerStyle?: CSSProperties;
973
+ onScroll?: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
974
+ onLayout?: (event: LooseLayoutChangeEvent) => void;
975
+ };
976
+ type LegendListPropsOverrides<ItemT, TItemType extends string | undefined> = Omit<LegendListPropsBase<ItemT, ScrollViewPropsWeb, TItemType>, "refScrollView" | "renderScrollComponent" | "ListHeaderComponentStyle" | "ListFooterComponentStyle"> & {
977
+ refScrollView?: Ref<HTMLElement | ScrollViewMethods>;
978
+ ListHeaderComponentStyle?: CSSProperties | undefined;
979
+ ListFooterComponentStyle?: CSSProperties | undefined;
980
+ };
981
+ type LegendListProps<ItemT = any, TItemType extends string | undefined = string | undefined> = LegendListPropsOverrides<ItemT, TItemType>;
982
+ type LegendListRef = Omit<LegendListRef$1, "getNativeScrollRef" | "getScrollableNode" | "getScrollResponder"> & {
983
+ getNativeScrollRef(): HTMLElement | ScrollViewMethods;
984
+ getScrollableNode(): HTMLElement;
985
+ getScrollResponder(): HTMLElement | null;
986
+ };
987
+ type LegendListState = Omit<LegendListState$1, "elementAtIndex"> & {
988
+ elementAtIndex: (index: number) => HTMLElement | null | undefined;
989
+ };
990
+ type LegendListComponent = <ItemT = any>(props: LegendListProps<ItemT> & RefAttributes<LegendListRef>) => ReactElement | null;
991
+
992
+ declare function useViewability<ItemT = any>(callback: ViewabilityCallback<ItemT>, configId?: string): void;
993
+ declare function useViewabilityAmount<ItemT = any>(callback: ViewabilityAmountCallback<ItemT>): void;
994
+ declare function useRecyclingEffect(effect: (info: LegendListRecyclingState<unknown>) => void | (() => void)): void;
995
+ declare function useRecyclingState<ItemT>(valueOrFun: ((info: LegendListRecyclingState<ItemT>) => ItemT) | ItemT): readonly [ItemT, Dispatch<SetStateAction<ItemT>>];
996
+ declare function useIsLastItem(): boolean;
997
+ declare function useListScrollSize(): {
998
+ width: number;
999
+ height: number;
1000
+ };
1001
+ declare function useSyncLayout(): () => void;
1002
+
1003
+ declare const LegendList: LegendListComponent;
1004
+
1005
+ 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 };