@legendapp/list 3.0.0-beta.5 → 3.0.0-beta.51

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 (51) 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 +657 -5
  5. package/animated.js +2 -2
  6. package/animated.mjs +1 -1
  7. package/index.d.ts +1316 -11
  8. package/index.js +4023 -1277
  9. package/index.mjs +4022 -1278
  10. package/index.native.js +3784 -1333
  11. package/index.native.mjs +3772 -1323
  12. package/keyboard-chat.d.ts +228 -0
  13. package/keyboard-chat.js +105 -0
  14. package/keyboard-chat.mjs +84 -0
  15. package/keyboard-test.d.ts +216 -0
  16. package/keyboard-test.js +52 -0
  17. package/keyboard-test.mjs +31 -0
  18. package/keyboard.d.ts +216 -8
  19. package/keyboard.js +355 -64
  20. package/keyboard.mjs +358 -66
  21. package/package.json +68 -1
  22. package/{types-YNdphn_A.d.mts → react-native.d.ts} +306 -263
  23. package/react-native.js +6019 -0
  24. package/react-native.mjs +5990 -0
  25. package/{types-YNdphn_A.d.ts → react-native.web.d.ts} +367 -261
  26. package/react-native.web.js +6553 -0
  27. package/react-native.web.mjs +6524 -0
  28. package/react.d.ts +776 -0
  29. package/react.js +6553 -0
  30. package/react.mjs +6524 -0
  31. package/reanimated.d.ts +679 -8
  32. package/reanimated.js +226 -29
  33. package/reanimated.mjs +228 -31
  34. package/section-list.d.ts +661 -5
  35. package/section-list.js +50 -3675
  36. package/section-list.mjs +48 -3674
  37. package/animated.d.mts +0 -9
  38. package/index.d.mts +0 -23
  39. package/index.native.d.mts +0 -23
  40. package/index.native.d.ts +0 -23
  41. package/keyboard-controller.d.mts +0 -12
  42. package/keyboard-controller.d.ts +0 -12
  43. package/keyboard-controller.js +0 -69
  44. package/keyboard-controller.mjs +0 -48
  45. package/keyboard.d.mts +0 -13
  46. package/reanimated.d.mts +0 -18
  47. package/section-list.d.mts +0 -113
  48. package/section-list.native.d.mts +0 -113
  49. package/section-list.native.d.ts +0 -113
  50. package/section-list.native.js +0 -3711
  51. package/section-list.native.mjs +0 -3690
@@ -1,42 +1,94 @@
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, 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
- type AnimatedValue = number;
7
-
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";
9
- interface StateContext {
10
- internalState: InternalState | undefined;
11
- listeners: Map<ListenerType, Set<(value: any) => void>>;
12
- values: Map<ListenerType, any>;
13
- mapViewabilityCallbacks: Map<string, ViewabilityCallback>;
14
- mapViewabilityValues: Map<string, ViewToken>;
15
- mapViewabilityAmountCallbacks: Map<number, ViewabilityAmountCallback>;
16
- mapViewabilityAmountValues: Map<number, ViewAmountToken>;
17
- mapViewabilityConfigStates: Map<string, {
18
- viewableItems: ViewToken[];
19
- start: number;
20
- end: number;
21
- previousStart: number;
22
- previousEnd: number;
23
- }>;
24
- columnWrapperStyle: ColumnWrapperStyle | undefined;
25
- viewRefs: Map<number, React$1.RefObject<View>>;
26
- animatedScrollY: AnimatedValue;
5
+ interface MaintainVisibleContentPositionNormalized<ItemT = any> {
6
+ data: boolean;
7
+ size: boolean;
8
+ shouldRestorePosition?: (item: ItemT, index: number, data: readonly ItemT[]) => boolean;
27
9
  }
28
10
 
29
- declare class ScrollAdjustHandler {
30
- private appliedAdjust;
31
- private pendingAdjust;
32
- private context;
33
- private mounted;
34
- constructor(ctx: StateContext);
35
- requestAdjust(add: number): void;
36
- setMounted(): void;
37
- getAdjust(): number;
38
- }
11
+ type ListenerType = "activeStickyIndex" | "anchoredEndSpaceSize" | "debugComputedScroll" | "debugRawScroll" | "extraData" | "footerSize" | "headerSize" | "lastItemKeys" | "lastPositionUpdate" | "maintainVisibleContentPosition" | "numColumns" | "numContainers" | "numContainersPooled" | "otherAxisSize" | "readyToRender" | "scrollAdjust" | "scrollAdjustPending" | "scrollAdjustUserOffset" | "scrollSize" | "snapToOffsets" | "stylePaddingTop" | "totalSize" | "isAtEnd" | "isAtStart" | "isNearEnd" | "isNearStart" | "isWithinMaintainScrollAtEndThreshold" | `containerColumn${number}` | `containerSpan${number}` | `containerItemData${number}` | `containerItemKey${number}` | `containerPosition${number}` | `containerSticky${number}`;
12
+ type LegendListListenerType = Extract<ListenerType, "activeStickyIndex" | "anchoredEndSpaceSize" | "footerSize" | "headerSize" | "isAtEnd" | "isAtStart" | "isNearEnd" | "isNearStart" | "isWithinMaintainScrollAtEndThreshold" | "lastItemKeys" | "lastPositionUpdate" | "numContainers" | "numContainersPooled" | "otherAxisSize" | "readyToRender" | "snapToOffsets" | "totalSize">;
13
+ type ListenerTypeValueMap = {
14
+ activeStickyIndex: number;
15
+ anchoredEndSpaceSize: number;
16
+ animatedScrollY: any;
17
+ debugComputedScroll: number;
18
+ debugRawScroll: number;
19
+ extraData: any;
20
+ footerSize: number;
21
+ headerSize: number;
22
+ isAtEnd: boolean;
23
+ isAtStart: boolean;
24
+ isNearEnd: boolean;
25
+ isNearStart: boolean;
26
+ isWithinMaintainScrollAtEndThreshold: boolean;
27
+ lastItemKeys: string[];
28
+ lastPositionUpdate: number;
29
+ maintainVisibleContentPosition: MaintainVisibleContentPositionNormalized;
30
+ numColumns: number;
31
+ numContainers: number;
32
+ numContainersPooled: number;
33
+ otherAxisSize: number;
34
+ readyToRender: boolean;
35
+ scrollAdjust: number;
36
+ scrollAdjustPending: number;
37
+ scrollAdjustUserOffset: number;
38
+ scrollSize: {
39
+ width: number;
40
+ height: number;
41
+ };
42
+ snapToOffsets: number[];
43
+ stylePaddingTop: number;
44
+ totalSize: number;
45
+ } & {
46
+ [K in ListenerType as K extends `containerItemKey${number}` ? K : never]: string;
47
+ } & {
48
+ [K in ListenerType as K extends `containerItemData${number}` ? K : never]: any;
49
+ } & {
50
+ [K in ListenerType as K extends `containerPosition${number}` ? K : never]: number;
51
+ } & {
52
+ [K in ListenerType as K extends `containerColumn${number}` ? K : never]: number;
53
+ } & {
54
+ [K in ListenerType as K extends `containerSpan${number}` ? K : never]: number;
55
+ } & {
56
+ [K in ListenerType as K extends `containerSticky${number}` ? K : never]: boolean;
57
+ };
39
58
 
59
+ interface Insets {
60
+ top: number;
61
+ left: number;
62
+ bottom: number;
63
+ right: number;
64
+ }
65
+ interface LayoutRectangle {
66
+ x: number;
67
+ y: number;
68
+ width: number;
69
+ height: number;
70
+ }
71
+ interface NativeScrollEvent {
72
+ contentOffset: {
73
+ x: number;
74
+ y: number;
75
+ };
76
+ contentSize: {
77
+ width: number;
78
+ height: number;
79
+ };
80
+ layoutMeasurement: {
81
+ width: number;
82
+ height: number;
83
+ };
84
+ contentInset: Insets;
85
+ zoomScale: number;
86
+ }
87
+ interface NativeSyntheticEvent<T> {
88
+ nativeEvent: T;
89
+ }
90
+ type ViewStyle = Record<string, unknown>;
91
+ type StyleProp<T> = T | T[] | null | undefined | false;
40
92
  type BaseScrollViewProps<TScrollView> = Omit<TScrollView, "contentOffset" | "maintainVisibleContentPosition" | "stickyHeaderIndices" | "removeClippedSubviews" | "children" | "onScroll">;
41
93
  interface DataModeProps<ItemT, TItemType extends string | undefined> {
42
94
  /**
@@ -51,7 +103,7 @@ interface DataModeProps<ItemT, TItemType extends string | undefined> {
51
103
  * - A React component: React.ComponentType<LegendListRenderItemProps<ItemT>>
52
104
  * @required when using data mode
53
105
  */
54
- renderItem: ((props: LegendListRenderItemProps<ItemT, TItemType>) => ReactNode) | React.ComponentType<LegendListRenderItemProps<ItemT, TItemType>>;
106
+ renderItem: ((props: LegendListRenderItemProps<ItemT, TItemType>) => React.ReactNode) | React.ComponentType<LegendListRenderItemProps<ItemT, TItemType>>;
55
107
  children?: never;
56
108
  }
57
109
  interface ChildrenModeProps {
@@ -60,7 +112,7 @@ interface ChildrenModeProps {
60
112
  * Each child will be treated as an individual list item.
61
113
  * @required when using children mode
62
114
  */
63
- children: ReactNode;
115
+ children: React.ReactNode;
64
116
  data?: never;
65
117
  renderItem?: never;
66
118
  }
@@ -71,14 +123,19 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
71
123
  */
72
124
  alignItemsAtEnd?: boolean;
73
125
  /**
74
- * If true, enables using average sizes for performance optimization.
75
- * @default true
126
+ * Keeps selected items mounted even when they scroll out of view.
127
+ * @default undefined
76
128
  */
77
- enableAverages?: boolean;
129
+ alwaysRender?: AlwaysRenderConfig;
78
130
  /**
79
131
  * Style applied to each column's wrapper view.
80
132
  */
81
133
  columnWrapperStyle?: ColumnWrapperStyle;
134
+ /**
135
+ * Version token that forces the list to treat data as updated even when the array reference is stable.
136
+ * Increment or change this when mutating the data array in place.
137
+ */
138
+ dataVersion?: Key;
82
139
  /**
83
140
  * Distance in pixels to pre-render items ahead of the visible area.
84
141
  * @default 250
@@ -103,25 +160,34 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
103
160
  */
104
161
  extraData?: any;
105
162
  /**
106
- * Version token that forces the list to treat data as updated even when the array reference is stable.
107
- * Increment or change this when mutating the data array in place.
163
+ * In case you have distinct item sizes, you can provide a function to get the size of an item.
108
164
  */
109
- dataVersion?: Key;
165
+ getEstimatedItemSize?: (item: ItemT, index: number, type: TItemType) => number;
110
166
  /**
111
- * In case you have distinct item sizes, you can provide a function to get the size of an item.
112
- * Use instead of FlatList's getItemLayout or FlashList overrideItemLayout if you want to have accurate initialScrollOffset, you should provide this function
167
+ * In case items always have a fixed size, you can provide a function to return it.
168
+ */
169
+ getFixedItemSize?: (item: ItemT, index: number, type: TItemType) => number | undefined;
170
+ /**
171
+ * Returns a stable item type used for pooling and size estimation.
113
172
  */
114
- getEstimatedItemSize?: (index: number, item: ItemT, type: TItemType) => number;
173
+ getItemType?: (item: ItemT, index: number) => TItemType;
174
+ /**
175
+ * Component to render between items, receiving the leading item as prop.
176
+ */
177
+ ItemSeparatorComponent?: React.ComponentType<{
178
+ leadingItem: ItemT;
179
+ }>;
115
180
  /**
116
181
  * Ratio of initial container pool size to data length (e.g., 0.5 for half).
117
182
  * @default 2
118
183
  */
119
184
  initialContainerPoolRatio?: number | undefined;
120
185
  /**
121
- * Initial scroll position in pixels.
122
- * @default 0
186
+ * When true, the list initializes scrolled to the last item.
187
+ * Overrides `initialScrollIndex` and `initialScrollOffset` when data is available.
188
+ * @default false
123
189
  */
124
- initialScrollOffset?: number;
190
+ initialScrollAtEnd?: boolean;
125
191
  /**
126
192
  * Index to scroll to initially.
127
193
  * @default 0
@@ -129,19 +195,17 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
129
195
  initialScrollIndex?: number | {
130
196
  index: number;
131
197
  viewOffset?: number | undefined;
198
+ viewPosition?: number | undefined;
132
199
  };
133
200
  /**
134
- * When true, the list initializes scrolled to the last item.
135
- * Overrides `initialScrollIndex` and `initialScrollOffset` when data is available.
136
- * @default false
201
+ * Initial scroll position in pixels.
202
+ * @default 0
137
203
  */
138
- initialScrollAtEnd?: boolean;
204
+ initialScrollOffset?: number;
139
205
  /**
140
- * Component to render between items, receiving the leading item as prop.
206
+ * Custom equality function to detect semantically unchanged items.
141
207
  */
142
- ItemSeparatorComponent?: React.ComponentType<{
143
- leadingItem: ItemT;
144
- }>;
208
+ itemsAreEqual?: (itemPrevious: ItemT, item: ItemT, index: number, data: readonly ItemT[]) => boolean;
145
209
  /**
146
210
  * Function to extract a unique key for each item.
147
211
  */
@@ -168,6 +232,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
168
232
  ListHeaderComponentStyle?: StyleProp<ViewStyle> | undefined;
169
233
  /**
170
234
  * If true, auto-scrolls to end when new items are added.
235
+ * Use an options object to opt into specific triggers and control whether that scroll is animated.
171
236
  * @default false
172
237
  */
173
238
  maintainScrollAtEnd?: boolean | MaintainScrollAtEndOptions;
@@ -177,11 +242,18 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
177
242
  */
178
243
  maintainScrollAtEndThreshold?: number;
179
244
  /**
180
- * If true, maintains visibility of content across data changes (filtering/resorting/insertions).
181
- * Scroll-time stability for measurements is always enabled.
182
- * @default false
245
+ * Maintains visibility of content.
246
+ * - scroll (default: true) stabilizes during size/layout changes while scrolling.
247
+ * - data (default: false) stabilizes when the data array changes; passing true also sets the RN maintainVisibleContentPosition prop.
248
+ * - shouldRestorePosition can opt out specific items from data-change anchoring.
249
+ * - undefined (default) enables scroll stabilization but skips data-change anchoring.
250
+ * - true enables both behaviors; false disables both.
183
251
  */
184
- maintainVisibleContentPosition?: boolean;
252
+ maintainVisibleContentPosition?: boolean | MaintainVisibleContentPositionConfig<ItemT>;
253
+ /**
254
+ * Keeps an item visually anchored to the start by adding trailing space when the content below it underflows.
255
+ */
256
+ anchoredEndSpace?: AnchoredEndSpaceConfig;
185
257
  /**
186
258
  * Number of columns to render items in.
187
259
  * @default 1
@@ -208,10 +280,23 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
208
280
  itemKey: string;
209
281
  itemData: ItemT;
210
282
  }) => void;
283
+ /**
284
+ * Called after the initial render work completes.
285
+ */
286
+ onLoad?: (info: {
287
+ elapsedTimeInMs: number;
288
+ }) => void;
289
+ /**
290
+ * Called when list layout metrics change.
291
+ */
292
+ onMetricsChange?: (metrics: LegendListMetrics) => void;
211
293
  /**
212
294
  * Function to call when the user pulls to refresh.
213
295
  */
214
296
  onRefresh?: () => void;
297
+ /**
298
+ * Called when the list scrolls.
299
+ */
215
300
  onScroll?: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
216
301
  /**
217
302
  * Called when scrolling reaches the start within onStartReachedThreshold.
@@ -235,6 +320,12 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
235
320
  * Called when the viewability of items changes.
236
321
  */
237
322
  onViewableItemsChanged?: OnViewableItemsChanged<ItemT> | undefined;
323
+ /**
324
+ * Customize layout for multi-column lists, such as allowing items to span multiple columns.
325
+ */
326
+ overrideItemLayout?: (layout: {
327
+ span?: number;
328
+ }, item: ItemT, index: number, maxColumns: number, extraData?: any) => void;
238
329
  /**
239
330
  * Offset in pixels for the refresh indicator.
240
331
  * @default 0
@@ -248,7 +339,7 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
248
339
  /**
249
340
  * Ref to the underlying ScrollView component.
250
341
  */
251
- refScrollView?: React.Ref<ScrollView>;
342
+ refScrollView?: React.Ref<any>;
252
343
  /**
253
344
  * If true, shows a refresh indicator.
254
345
  * @default false
@@ -259,7 +350,11 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
259
350
  * Note: When using `stickyHeaderIndices`, you must provide an Animated ScrollView component.
260
351
  * @default (props) => <ScrollView {...props} />
261
352
  */
262
- renderScrollComponent?: (props: ScrollViewProps) => React.ReactElement<ScrollViewProps>;
353
+ renderScrollComponent?: (props: any) => React.ReactElement | null;
354
+ /**
355
+ * Array of item indices to use as snap points.
356
+ */
357
+ snapToIndices?: number[];
263
358
  /**
264
359
  * This will log a suggested estimatedItemSize.
265
360
  * @required
@@ -274,15 +369,6 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
274
369
  * Pairs of viewability configs and their callbacks for tracking visibility.
275
370
  */
276
371
  viewabilityConfigCallbackPairs?: ViewabilityConfigCallbackPairs<ItemT> | undefined;
277
- /**
278
- * If true, delays rendering until initial layout is complete.
279
- * @default false
280
- */
281
- waitForInitialLayout?: boolean;
282
- onLoad?: (info: {
283
- elapsedTimeInMs: number;
284
- }) => void;
285
- snapToIndices?: number[];
286
372
  /**
287
373
  * Array of child indices determining which children get docked to the top of the screen when scrolling.
288
374
  * For example, passing stickyHeaderIndices={[0]} will cause the first child to be fixed to the top of the scroll view.
@@ -294,190 +380,109 @@ interface LegendListSpecificProps<ItemT, TItemType extends string | undefined> {
294
380
  * @deprecated Use stickyHeaderIndices instead for parity with React Native.
295
381
  */
296
382
  stickyIndices?: number[];
297
- getItemType?: (item: ItemT, index: number) => TItemType;
298
- getFixedItemSize?: (index: number, item: ItemT, type: TItemType) => number | undefined;
299
- itemsAreEqual?: (itemPrevious: ItemT, item: ItemT, index: number, data: readonly ItemT[]) => boolean;
383
+ /**
384
+ * Configuration for sticky headers.
385
+ * @default undefined
386
+ */
387
+ stickyHeaderConfig?: StickyHeaderConfig;
388
+ /**
389
+ * Web only: when true, listens to window/body scrolling instead of rendering a scrollable list container.
390
+ * @default false
391
+ */
392
+ useWindowScroll?: boolean;
393
+ }
394
+ type LegendListPropsBase<ItemT, TScrollViewProps = Record<string, any>, TItemType extends string | undefined = string | undefined> = BaseScrollViewProps<TScrollViewProps> & LegendListSpecificProps<ItemT, TItemType> & (DataModeProps<ItemT, TItemType> | ChildrenModeProps);
395
+ interface MaintainVisibleContentPositionConfig<ItemT = any> {
396
+ data?: boolean;
397
+ size?: boolean;
398
+ shouldRestorePosition?: (item: ItemT, index: number, data: readonly ItemT[]) => boolean;
399
+ }
400
+ interface AnchoredEndSpaceConfig {
401
+ anchorIndex: number;
402
+ anchorOffset?: number;
403
+ anchorMaxSize?: number;
404
+ includeInEndInset?: boolean;
405
+ onSizeChanged?: (size: number) => void;
406
+ }
407
+ interface StickyHeaderConfig {
408
+ /**
409
+ * Specifies how far from the top edge sticky headers should start sticking.
410
+ * Useful for scenarios with a fixed navbar or header, where sticky elements pin below it..
411
+ * @default 0
412
+ */
413
+ offset?: number;
414
+ /**
415
+ * Component to render as a backdrop behind the sticky header.
416
+ * @default undefined
417
+ */
418
+ backdropComponent?: React.ComponentType<any> | React.ReactElement | null | undefined;
419
+ }
420
+ interface AlwaysRenderConfig {
421
+ top?: number;
422
+ bottom?: number;
423
+ indices?: number[];
424
+ keys?: string[];
425
+ }
426
+ interface MaintainScrollAtEndOnOptions {
427
+ dataChange?: boolean;
428
+ itemLayout?: boolean;
429
+ layout?: boolean;
300
430
  }
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);
302
431
  interface MaintainScrollAtEndOptions {
303
- onLayout?: boolean;
304
- onItemLayout?: boolean;
305
- onDataChange?: boolean;
432
+ /**
433
+ * Whether maintainScrollAtEnd should animate when it scrolls to the end.
434
+ */
435
+ animated?: boolean;
436
+ /**
437
+ * Which events should keep the list pinned to the end.
438
+ * - If omitted, object values default to all triggers.
439
+ * - If provided, only the keys set to `true` are enabled.
440
+ */
441
+ on?: MaintainScrollAtEndOnOptions;
306
442
  }
307
443
  interface ColumnWrapperStyle {
308
444
  rowGap?: number;
309
445
  gap?: number;
310
446
  columnGap?: number;
311
447
  }
312
- type LegendListProps<ItemT = any> = LegendListPropsBase<ItemT, ComponentProps<typeof ScrollView>>;
313
- interface ThresholdSnapshot {
314
- scrollPosition: number;
315
- contentSize?: number;
316
- dataLength?: number;
317
- atThreshold: boolean;
318
- }
319
- interface ScrollTarget {
320
- offset: number;
321
- index?: number;
322
- viewOffset?: number;
323
- viewPosition?: number;
324
- animated?: boolean;
325
- isInitialScroll?: boolean;
326
- precomputedWithViewOffset?: boolean;
327
- }
328
- 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>;
334
- 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;
344
- endBuffered: number;
345
- endNoBuffer: number;
346
- 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>;
366
- 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;
389
- ignoreScrollFromMVCP?: {
390
- lt?: number;
391
- gt?: number;
392
- };
393
- ignoreScrollFromMVCPIgnored?: boolean;
394
- 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;
403
- initialAnchor?: InitialScrollAnchor;
404
- lastLayout: LayoutRectangle | undefined;
405
- timeoutSetPaddingTop?: any;
406
- activeStickyIndex: number | undefined;
407
- stickyContainers: Map<number, number>;
408
- stickyContainerPool: Set<number>;
409
- scrollProcessingEnabled: boolean;
410
- pendingTotalSize?: number;
411
- adjustingFromInitialMount?: number;
412
- props: {
413
- alignItemsAtEnd: boolean;
414
- data: readonly any[];
415
- dataVersion: Key | undefined;
416
- estimatedItemSize: number | undefined;
417
- getEstimatedItemSize: LegendListProps["getEstimatedItemSize"];
418
- getFixedItemSize: LegendListProps["getFixedItemSize"];
419
- getItemType: LegendListProps["getItemType"];
420
- horizontal: boolean;
421
- keyExtractor: LegendListProps["keyExtractor"];
422
- maintainScrollAtEnd: boolean | MaintainScrollAtEndOptions;
423
- maintainScrollAtEndThreshold: number | undefined;
424
- maintainVisibleContentPosition: boolean;
425
- onEndReached: LegendListProps["onEndReached"];
426
- onEndReachedThreshold: number | null | undefined;
427
- onItemSizeChanged: LegendListProps["onItemSizeChanged"];
428
- onLoad: LegendListProps["onLoad"];
429
- onScroll: LegendListProps["onScroll"];
430
- onStartReached: LegendListProps["onStartReached"];
431
- onStartReachedThreshold: number | null | undefined;
432
- onStickyHeaderChange: LegendListProps["onStickyHeaderChange"];
433
- 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;
441
- snapToIndices: number[] | undefined;
442
- stickyIndicesSet: Set<number>;
443
- stickyIndicesArr: number[];
444
- itemsAreEqual: LegendListProps["itemsAreEqual"];
445
- enableAverages: boolean;
446
- };
447
- }
448
- interface ViewableRange<T> {
449
- startBuffered: number;
450
- start: number;
451
- endBuffered: number;
452
- end: number;
453
- items: T[];
448
+ interface LegendListMetrics {
449
+ headerSize: number;
450
+ footerSize: number;
454
451
  }
455
452
  interface LegendListRenderItemProps<ItemT, TItemType extends string | number | undefined = string | number | undefined> {
456
- item: ItemT;
457
- type: TItemType;
458
- index: number;
459
453
  data: readonly ItemT[];
460
454
  extraData: any;
455
+ index: number;
456
+ item: ItemT;
457
+ type: TItemType;
461
458
  }
462
- type ScrollState = {
463
- activeStickyIndex: number | undefined;
459
+ type LegendListState$1 = {
460
+ activeStickyIndex: number;
464
461
  contentLength: number;
465
462
  data: readonly any[];
466
- elementAtIndex: (index: number) => View | null | undefined;
463
+ elementAtIndex: (index: number) => any;
467
464
  end: number;
468
465
  endBuffered: number;
469
466
  isAtEnd: boolean;
470
467
  isAtStart: boolean;
468
+ isNearEnd: boolean;
469
+ isNearStart: boolean;
470
+ isEndReached: boolean;
471
+ isStartReached: boolean;
472
+ isWithinMaintainScrollAtEndThreshold: boolean;
473
+ listen: <T extends LegendListListenerType>(listenerType: T, callback: (value: ListenerTypeValueMap[T]) => void) => () => void;
474
+ listenToPosition: (key: string, callback: (value: number) => void) => () => void;
471
475
  positionAtIndex: (index: number) => number;
472
- positions: Map<string, number>;
476
+ positionByKey: (key: string) => number | undefined;
473
477
  scroll: number;
474
478
  scrollLength: number;
479
+ scrollVelocity: number;
475
480
  sizeAtIndex: (index: number) => number;
476
481
  sizes: Map<string, number>;
477
482
  start: number;
478
483
  startBuffered: number;
479
484
  };
480
- type LegendListRef = {
485
+ type LegendListRef$1 = {
481
486
  /**
482
487
  * Displays the scroll indicators momentarily.
483
488
  */
@@ -485,7 +490,7 @@ type LegendListRef = {
485
490
  /**
486
491
  * Returns the native ScrollView component reference.
487
492
  */
488
- getNativeScrollRef(): React.ElementRef<typeof ScrollViewComponent>;
493
+ getNativeScrollRef(): any;
489
494
  /**
490
495
  * Returns the scroll responder instance for handling scroll events.
491
496
  */
@@ -493,11 +498,11 @@ type LegendListRef = {
493
498
  /**
494
499
  * Returns the ScrollResponderMixin for advanced scroll handling.
495
500
  */
496
- getScrollResponder(): ScrollResponderMixin;
501
+ getScrollResponder(): any;
497
502
  /**
498
503
  * Returns the internal state of the scroll virtualization.
499
504
  */
500
- getState(): ScrollState;
505
+ getState(): LegendListState$1;
501
506
  /**
502
507
  * Scrolls a specific index into view.
503
508
  * @param params - Parameters for scrolling.
@@ -507,7 +512,7 @@ type LegendListRef = {
507
512
  scrollIndexIntoView(params: {
508
513
  animated?: boolean | undefined;
509
514
  index: number;
510
- }): void;
515
+ }): Promise<void>;
511
516
  /**
512
517
  * Scrolls a specific index into view.
513
518
  * @param params - Parameters for scrolling.
@@ -517,7 +522,7 @@ type LegendListRef = {
517
522
  scrollItemIntoView(params: {
518
523
  animated?: boolean | undefined;
519
524
  item: any;
520
- }): void;
525
+ }): Promise<void>;
521
526
  /**
522
527
  * Scrolls to the end of the list.
523
528
  * @param options - Options for scrolling.
@@ -527,7 +532,7 @@ type LegendListRef = {
527
532
  scrollToEnd(options?: {
528
533
  animated?: boolean | undefined;
529
534
  viewOffset?: number | undefined;
530
- }): void;
535
+ }): Promise<void>;
531
536
  /**
532
537
  * Scrolls to a specific index in the list.
533
538
  * @param params - Parameters for scrolling.
@@ -541,7 +546,7 @@ type LegendListRef = {
541
546
  index: number;
542
547
  viewOffset?: number | undefined;
543
548
  viewPosition?: number | undefined;
544
- }): void;
549
+ }): Promise<void>;
545
550
  /**
546
551
  * Scrolls to a specific item in the list.
547
552
  * @param params - Parameters for scrolling.
@@ -555,7 +560,7 @@ type LegendListRef = {
555
560
  item: any;
556
561
  viewOffset?: number | undefined;
557
562
  viewPosition?: number | undefined;
558
- }): void;
563
+ }): Promise<void>;
559
564
  /**
560
565
  * Scrolls to a specific offset in pixels.
561
566
  * @param params - Parameters for scrolling.
@@ -565,42 +570,60 @@ type LegendListRef = {
565
570
  scrollToOffset(params: {
566
571
  offset: number;
567
572
  animated?: boolean | undefined;
568
- }): void;
573
+ }): Promise<void>;
569
574
  /**
570
575
  * Sets or adds to the offset of the visible content anchor.
571
576
  * @param value - The offset to set or add.
572
577
  * @param animated - If true, uses Animated to animate the change.
573
578
  */
574
- setVisibleContentAnchorOffset(value: number | ((value: number) => number)): void;
579
+ setVisibleContentAnchorOffset(value: number | ((val: number) => number)): void;
575
580
  /**
576
581
  * Sets whether scroll processing is enabled.
577
582
  * @param enabled - If true, scroll processing is enabled.
578
583
  */
579
584
  setScrollProcessingEnabled(enabled: boolean): void;
585
+ /**
586
+ * Clears internal virtualization caches.
587
+ * @param options - Cache clearing options.
588
+ * @param options.mode - `sizes` clears measurement caches. `full` also clears key/position caches.
589
+ */
590
+ clearCaches(options?: {
591
+ mode?: "sizes" | "full";
592
+ }): void;
593
+ /**
594
+ * Reports an externally measured content inset. Pass null/undefined to clear.
595
+ * Values are merged on top of props/animated/native insets.
596
+ */
597
+ reportContentInset(inset?: Partial<Insets> | null): void;
580
598
  };
581
599
  interface ViewToken<ItemT = any> {
582
- item: ItemT;
583
- key: string;
600
+ containerId: number;
584
601
  index: number;
585
602
  isViewable: boolean;
586
- containerId: number;
603
+ item: ItemT;
604
+ key: string;
587
605
  }
588
606
  interface ViewAmountToken<ItemT = any> extends ViewToken<ItemT> {
589
- sizeVisible: number;
590
- size: number;
591
- percentVisible: number;
592
607
  percentOfScroller: number;
608
+ percentVisible: number;
593
609
  scrollSize: number;
610
+ size: number;
611
+ sizeVisible: number;
594
612
  }
595
613
  interface ViewabilityConfigCallbackPair<ItemT = any> {
596
- viewabilityConfig: ViewabilityConfig;
597
614
  onViewableItemsChanged?: OnViewableItemsChanged<ItemT>;
615
+ viewabilityConfig: ViewabilityConfig;
598
616
  }
599
617
  type ViewabilityConfigCallbackPairs<ItemT> = ViewabilityConfigCallbackPair<ItemT>[];
600
- type OnViewableItemsChanged<ItemT> = ((info: {
601
- viewableItems: Array<ViewToken<ItemT>>;
618
+ interface OnViewableItemsChangedInfo<ItemT> {
602
619
  changed: Array<ViewToken<ItemT>>;
603
- }) => void) | null;
620
+ end: number;
621
+ endBuffered: number;
622
+ start: number;
623
+ startBuffered: number;
624
+ viewableItems: Array<ViewToken<ItemT>>;
625
+ }
626
+ type OnViewableItemsChanged<ItemT> = ((info: OnViewableItemsChangedInfo<ItemT>) => void) | null;
604
627
  interface ViewabilityConfig {
605
628
  /**
606
629
  * A unique ID to identify this viewability config
@@ -633,17 +656,11 @@ interface ViewabilityConfig {
633
656
  type ViewabilityCallback<ItemT = any> = (viewToken: ViewToken<ItemT>) => void;
634
657
  type ViewabilityAmountCallback<ItemT = any> = (viewToken: ViewAmountToken<ItemT>) => void;
635
658
  interface LegendListRecyclingState<T> {
636
- item: T;
637
- prevItem: T | undefined;
638
659
  index: number;
660
+ item: T;
639
661
  prevIndex: number | undefined;
662
+ prevItem: T | undefined;
640
663
  }
641
- type TypedForwardRef = <T, P = {}>(render: (props: P, ref: React.Ref<T>) => React.ReactNode) => (props: P & React.RefAttributes<T>) => React.ReactNode;
642
- 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 & {
644
- displayName?: string;
645
- };
646
- declare const typedMemo: TypedMemo;
647
664
  interface ScrollIndexWithOffset {
648
665
  index: number;
649
666
  viewOffset?: number;
@@ -655,16 +672,42 @@ interface ScrollIndexWithOffsetPosition extends ScrollIndexWithOffset {
655
672
  interface ScrollIndexWithOffsetAndContentOffset extends ScrollIndexWithOffsetPosition {
656
673
  contentOffset?: number;
657
674
  }
675
+ /** @deprecated Kept for backwards compatibility. Use `ScrollIndexWithOffsetPosition`. */
658
676
  interface InitialScrollAnchor extends ScrollIndexWithOffsetPosition {
659
677
  attempts?: number;
660
678
  lastDelta?: number;
661
679
  settledTicks?: number;
662
680
  }
663
- type GetRenderedItemResult<ItemT> = {
664
- index: number;
665
- item: ItemT;
666
- renderedItem: React.ReactNode;
681
+
682
+ type LegendListPropsOverrides<ItemT, TItemType extends string | undefined> = Omit<LegendListPropsBase<ItemT, ScrollViewProps, TItemType>, "anchoredEndSpace" | "onScroll" | "refScrollView" | "renderScrollComponent" | "ListHeaderComponentStyle" | "ListFooterComponentStyle"> & {
683
+ onScroll?: (event: NativeSyntheticEvent$1<NativeScrollEvent$1>) => void;
684
+ refScrollView?: React.Ref<ScrollView>;
685
+ renderScrollComponent?: (props: ScrollViewProps) => React.ReactElement<ScrollViewProps>;
686
+ ListHeaderComponentStyle?: StyleProp$1<ViewStyle$1> | undefined;
687
+ ListFooterComponentStyle?: StyleProp$1<ViewStyle$1> | undefined;
688
+ };
689
+ type LegendListProps<ItemT = any, TItemType extends string | undefined = string | undefined> = LegendListPropsOverrides<ItemT, TItemType>;
690
+ type LegendListRef = Omit<LegendListRef$1, "getNativeScrollRef" | "getScrollResponder" | "reportContentInset"> & {
691
+ getNativeScrollRef(): React.ElementRef<typeof ScrollViewComponent>;
692
+ getScrollResponder(): ScrollResponderMixin;
693
+ reportContentInset(inset?: Partial<Insets$1> | null): void;
694
+ };
695
+ type LegendListState = Omit<LegendListState$1, "elementAtIndex"> & {
696
+ elementAtIndex: (index: number) => View | null | undefined;
667
697
  };
668
- type GetRenderedItem = (key: string) => GetRenderedItemResult<any> | null;
698
+ type LegendListComponent = <ItemT = any>(props: LegendListProps<ItemT> & React.RefAttributes<LegendListRef>) => React.ReactElement | null;
699
+
700
+ declare function useViewability<ItemT = any>(callback: ViewabilityCallback<ItemT>, configId?: string): void;
701
+ declare function useViewabilityAmount<ItemT = any>(callback: ViewabilityAmountCallback<ItemT>): void;
702
+ declare function useRecyclingEffect(effect: (info: LegendListRecyclingState<unknown>) => void | (() => void)): void;
703
+ declare function useRecyclingState<ItemT>(valueOrFun: ((info: LegendListRecyclingState<ItemT>) => ItemT) | ItemT): readonly [ItemT, Dispatch<SetStateAction<ItemT>>];
704
+ declare function useIsLastItem(): boolean;
705
+ declare function useListScrollSize(): {
706
+ width: number;
707
+ height: number;
708
+ };
709
+ declare function useSyncLayout(): () => void;
710
+
711
+ declare const LegendList: LegendListComponent;
669
712
 
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 };
713
+ export { type AlwaysRenderConfig, type ColumnWrapperStyle, type InitialScrollAnchor, type Insets, type LayoutRectangle, LegendList, type LegendListComponent, type LegendListMetrics, type LegendListProps, type LegendListRecyclingState, type LegendListRef, type LegendListRenderItemProps, type LegendListState, type MaintainScrollAtEndOnOptions, type MaintainScrollAtEndOptions, type MaintainVisibleContentPositionConfig, type NativeScrollEvent, type NativeSyntheticEvent, type OnViewableItemsChanged, type OnViewableItemsChangedInfo, type ScrollIndexWithOffset, type ScrollIndexWithOffsetAndContentOffset, type ScrollIndexWithOffsetPosition, type StickyHeaderConfig, type StyleProp, type ViewAmountToken, type ViewStyle, type ViewToken, type ViewabilityAmountCallback, type ViewabilityCallback, type ViewabilityConfig, type ViewabilityConfigCallbackPair, type ViewabilityConfigCallbackPairs, useIsLastItem, useListScrollSize, useRecyclingEffect, useRecyclingState, useSyncLayout, useViewability, useViewabilityAmount };