@legendapp/list 2.0.0-next.2 → 2.0.0-next.20

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 (260) hide show
  1. package/{dist/animated.d.mts → animated.d.mts} +7 -2
  2. package/{dist/animated.d.ts → animated.d.ts} +7 -2
  3. package/{dist/animated.js → animated.js} +2 -2
  4. package/{dist/animated.mjs → animated.mjs} +2 -2
  5. package/{dist/index.d.mts → index.d.mts} +106 -56
  6. package/{dist/index.d.ts → index.d.ts} +106 -56
  7. package/{dist/index.js → index.js} +1589 -1095
  8. package/{dist/index.mjs → index.mjs} +1591 -1097
  9. package/{dist/keyboard-controller.d.mts → keyboard-controller.d.mts} +28 -8
  10. package/{dist/keyboard-controller.d.ts → keyboard-controller.d.ts} +28 -8
  11. package/{dist/keyboard-controller.js → keyboard-controller.js} +4 -4
  12. package/{dist/keyboard-controller.mjs → keyboard-controller.mjs} +4 -4
  13. package/package.json +34 -88
  14. package/{dist/reanimated.d.mts → reanimated.d.mts} +2 -2
  15. package/{dist/reanimated.d.ts → reanimated.d.ts} +2 -2
  16. package/{dist/reanimated.js → reanimated.js} +7 -7
  17. package/{dist/reanimated.mjs → reanimated.mjs} +7 -7
  18. package/.claude/settings.local.json +0 -8
  19. package/.cursor/rules/changelog.mdc +0 -60
  20. package/.github/FUNDING.yml +0 -15
  21. package/.gitignore +0 -5
  22. package/.prettierrc.json +0 -5
  23. package/.vscode/settings.json +0 -14
  24. package/CLAUDE.md +0 -126
  25. package/biome.json +0 -46
  26. package/bun.lock +0 -1289
  27. package/bunfig.toml +0 -2
  28. package/dist/CHANGELOG.md +0 -119
  29. package/dist/LICENSE +0 -21
  30. package/dist/README.md +0 -139
  31. package/dist/package.json +0 -35
  32. package/example/README.md +0 -40
  33. package/example/api/data/genres.json +0 -23
  34. package/example/api/data/playlist/10402-10749.json +0 -1
  35. package/example/api/data/playlist/10402-10770.json +0 -1
  36. package/example/api/data/playlist/10402-37.json +0 -1
  37. package/example/api/data/playlist/10749-10752.json +0 -1
  38. package/example/api/data/playlist/10749-10770.json +0 -1
  39. package/example/api/data/playlist/10749-37.json +0 -1
  40. package/example/api/data/playlist/10749-878.json +0 -1
  41. package/example/api/data/playlist/10751-10402.json +0 -1
  42. package/example/api/data/playlist/10751-10752.json +0 -1
  43. package/example/api/data/playlist/10751-37.json +0 -1
  44. package/example/api/data/playlist/10751-53.json +0 -1
  45. package/example/api/data/playlist/10751-878.json +0 -1
  46. package/example/api/data/playlist/10751-9648.json +0 -1
  47. package/example/api/data/playlist/10752-37.json +0 -1
  48. package/example/api/data/playlist/12-10402.json +0 -1
  49. package/example/api/data/playlist/12-10749.json +0 -1
  50. package/example/api/data/playlist/12-18.json +0 -1
  51. package/example/api/data/playlist/12-27.json +0 -1
  52. package/example/api/data/playlist/12-35.json +0 -1
  53. package/example/api/data/playlist/14-36.json +0 -1
  54. package/example/api/data/playlist/14-878.json +0 -1
  55. package/example/api/data/playlist/16-10751.json +0 -1
  56. package/example/api/data/playlist/16-10770.json +0 -1
  57. package/example/api/data/playlist/16-35.json +0 -1
  58. package/example/api/data/playlist/16-36.json +0 -1
  59. package/example/api/data/playlist/16-53.json +0 -1
  60. package/example/api/data/playlist/18-10751.json +0 -1
  61. package/example/api/data/playlist/18-10752.json +0 -1
  62. package/example/api/data/playlist/18-37.json +0 -1
  63. package/example/api/data/playlist/18-53.json +0 -1
  64. package/example/api/data/playlist/18-878.json +0 -1
  65. package/example/api/data/playlist/27-10749.json +0 -1
  66. package/example/api/data/playlist/27-10770.json +0 -1
  67. package/example/api/data/playlist/28-10749.json +0 -1
  68. package/example/api/data/playlist/28-10751.json +0 -1
  69. package/example/api/data/playlist/28-10770.json +0 -1
  70. package/example/api/data/playlist/28-16.json +0 -1
  71. package/example/api/data/playlist/28-18.json +0 -1
  72. package/example/api/data/playlist/28-36.json +0 -1
  73. package/example/api/data/playlist/28-37.json +0 -1
  74. package/example/api/data/playlist/28-53.json +0 -1
  75. package/example/api/data/playlist/28-80.json +0 -1
  76. package/example/api/data/playlist/28-99.json +0 -1
  77. package/example/api/data/playlist/35-10749.json +0 -1
  78. package/example/api/data/playlist/35-10751.json +0 -1
  79. package/example/api/data/playlist/35-10752.json +0 -1
  80. package/example/api/data/playlist/35-27.json +0 -1
  81. package/example/api/data/playlist/35-36.json +0 -1
  82. package/example/api/data/playlist/35-53.json +0 -1
  83. package/example/api/data/playlist/35-80.json +0 -1
  84. package/example/api/data/playlist/36-37.json +0 -1
  85. package/example/api/data/playlist/36-878.json +0 -1
  86. package/example/api/data/playlist/36-9648.json +0 -1
  87. package/example/api/data/playlist/53-10752.json +0 -1
  88. package/example/api/data/playlist/80-10770.json +0 -1
  89. package/example/api/data/playlist/80-14.json +0 -1
  90. package/example/api/data/playlist/80-18.json +0 -1
  91. package/example/api/data/playlist/80-37.json +0 -1
  92. package/example/api/data/playlist/878-37.json +0 -1
  93. package/example/api/data/playlist/9648-10770.json +0 -1
  94. package/example/api/data/playlist/9648-37.json +0 -1
  95. package/example/api/data/playlist/9648-53.json +0 -1
  96. package/example/api/data/playlist/9648-878.json +0 -1
  97. package/example/api/data/playlist/99-10749.json +0 -1
  98. package/example/api/data/playlist/99-14.json +0 -1
  99. package/example/api/data/playlist/99-18.json +0 -1
  100. package/example/api/data/playlist/99-27.json +0 -1
  101. package/example/api/data/playlist/99-53.json +0 -1
  102. package/example/api/data/playlist/99-9648.json +0 -1
  103. package/example/api/data/playlist/index.ts +0 -73
  104. package/example/api/data/rows.json +0 -1
  105. package/example/api/index.ts +0 -36
  106. package/example/app/(tabs)/_layout.tsx +0 -60
  107. package/example/app/(tabs)/cards.tsx +0 -81
  108. package/example/app/(tabs)/index.tsx +0 -205
  109. package/example/app/(tabs)/moviesL.tsx +0 -7
  110. package/example/app/(tabs)/moviesLR.tsx +0 -7
  111. package/example/app/+not-found.tsx +0 -32
  112. package/example/app/_layout.tsx +0 -34
  113. package/example/app/accurate-scrollto/index.tsx +0 -125
  114. package/example/app/accurate-scrollto-2/index.tsx +0 -52
  115. package/example/app/accurate-scrollto-huge/index.tsx +0 -128
  116. package/example/app/add-to-end/index.tsx +0 -82
  117. package/example/app/ai-chat/index.tsx +0 -236
  118. package/example/app/bidirectional-infinite-list/index.tsx +0 -133
  119. package/example/app/cards-columns/index.tsx +0 -37
  120. package/example/app/cards-flashlist/index.tsx +0 -122
  121. package/example/app/cards-flatlist/index.tsx +0 -94
  122. package/example/app/cards-no-recycle/index.tsx +0 -110
  123. package/example/app/cards-renderItem.tsx +0 -354
  124. package/example/app/chat-example/index.tsx +0 -167
  125. package/example/app/chat-infinite/index.tsx +0 -239
  126. package/example/app/chat-keyboard/index.tsx +0 -248
  127. package/example/app/chat-resize-outer/index.tsx +0 -247
  128. package/example/app/columns/index.tsx +0 -78
  129. package/example/app/countries/index.tsx +0 -182
  130. package/example/app/countries-flashlist/index.tsx +0 -163
  131. package/example/app/countries-reorder/index.tsx +0 -187
  132. package/example/app/extra-data/index.tsx +0 -86
  133. package/example/app/filter-elements/filter-data-provider.tsx +0 -55
  134. package/example/app/filter-elements/index.tsx +0 -118
  135. package/example/app/initial-scroll-index/index.tsx +0 -106
  136. package/example/app/initial-scroll-index/renderFixedItem.tsx +0 -215
  137. package/example/app/initial-scroll-index-free-height/index.tsx +0 -70
  138. package/example/app/initial-scroll-index-keyed/index.tsx +0 -62
  139. package/example/app/lazy-list/index.tsx +0 -123
  140. package/example/app/movies-flashlist/index.tsx +0 -7
  141. package/example/app/mutable-cells/index.tsx +0 -104
  142. package/example/app/video-feed/index.tsx +0 -119
  143. package/example/app.config.js +0 -22
  144. package/example/app.json +0 -45
  145. package/example/assets/fonts/SpaceMono-Regular.ttf +0 -0
  146. package/example/assets/images/adaptive-icon.png +0 -0
  147. package/example/assets/images/favicon.png +0 -0
  148. package/example/assets/images/icon.png +0 -0
  149. package/example/assets/images/partial-react-logo.png +0 -0
  150. package/example/assets/images/react-logo.png +0 -0
  151. package/example/assets/images/react-logo@2x.png +0 -0
  152. package/example/assets/images/react-logo@3x.png +0 -0
  153. package/example/assets/images/splash-icon.png +0 -0
  154. package/example/autoscroll.sh +0 -101
  155. package/example/bun.lock +0 -2266
  156. package/example/bunfig.toml +0 -2
  157. package/example/components/Breathe.tsx +0 -54
  158. package/example/components/Circle.tsx +0 -69
  159. package/example/components/Collapsible.tsx +0 -44
  160. package/example/components/ExternalLink.tsx +0 -24
  161. package/example/components/HapticTab.tsx +0 -18
  162. package/example/components/HelloWave.tsx +0 -37
  163. package/example/components/Movies.tsx +0 -179
  164. package/example/components/ParallaxScrollView.tsx +0 -81
  165. package/example/components/ThemedText.tsx +0 -60
  166. package/example/components/ThemedView.tsx +0 -14
  167. package/example/components/__tests__/ThemedText-test.tsx +0 -10
  168. package/example/components/__tests__/__snapshots__/ThemedText-test.tsx.snap +0 -24
  169. package/example/components/ui/IconSymbol.ios.tsx +0 -32
  170. package/example/components/ui/IconSymbol.tsx +0 -43
  171. package/example/components/ui/TabBarBackground.ios.tsx +0 -22
  172. package/example/components/ui/TabBarBackground.tsx +0 -6
  173. package/example/constants/Colors.ts +0 -26
  174. package/example/constants/constants.ts +0 -5
  175. package/example/constants/useScrollTest.ts +0 -19
  176. package/example/hooks/useColorScheme.ts +0 -1
  177. package/example/hooks/useColorScheme.web.ts +0 -8
  178. package/example/hooks/useThemeColor.ts +0 -22
  179. package/example/ios/.xcode.env +0 -11
  180. package/example/ios/Podfile +0 -64
  181. package/example/ios/Podfile.lock +0 -2767
  182. package/example/ios/Podfile.properties.json +0 -5
  183. package/example/ios/listtest/AppDelegate.swift +0 -70
  184. package/example/ios/listtest/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png +0 -0
  185. package/example/ios/listtest/Images.xcassets/AppIcon.appiconset/Contents.json +0 -14
  186. package/example/ios/listtest/Images.xcassets/Contents.json +0 -6
  187. package/example/ios/listtest/Images.xcassets/SplashScreenBackground.colorset/Contents.json +0 -20
  188. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/Contents.json +0 -23
  189. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image.png +0 -0
  190. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image@2x.png +0 -0
  191. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image@3x.png +0 -0
  192. package/example/ios/listtest/Info.plist +0 -85
  193. package/example/ios/listtest/PrivacyInfo.xcprivacy +0 -48
  194. package/example/ios/listtest/SplashScreen.storyboard +0 -42
  195. package/example/ios/listtest/Supporting/Expo.plist +0 -12
  196. package/example/ios/listtest/listtest-Bridging-Header.h +0 -3
  197. package/example/ios/listtest/listtest.entitlements +0 -5
  198. package/example/ios/listtest.xcodeproj/project.pbxproj +0 -547
  199. package/example/ios/listtest.xcodeproj/xcshareddata/xcschemes/listtest.xcscheme +0 -88
  200. package/example/ios/listtest.xcworkspace/contents.xcworkspacedata +0 -10
  201. package/example/metro.config.js +0 -16
  202. package/example/package.json +0 -73
  203. package/example/scripts/reset-project.js +0 -84
  204. package/example/tsconfig.json +0 -26
  205. package/posttsup.ts +0 -24
  206. package/src/Container.tsx +0 -176
  207. package/src/Containers.tsx +0 -85
  208. package/src/ContextContainer.ts +0 -145
  209. package/src/DebugView.tsx +0 -83
  210. package/src/LazyLegendList.tsx +0 -41
  211. package/src/LeanView.tsx +0 -18
  212. package/src/LegendList.tsx +0 -558
  213. package/src/ListComponent.tsx +0 -191
  214. package/src/ScrollAdjust.tsx +0 -24
  215. package/src/ScrollAdjustHandler.ts +0 -26
  216. package/src/Separator.tsx +0 -14
  217. package/src/animated.tsx +0 -6
  218. package/src/calculateItemsInView.ts +0 -363
  219. package/src/calculateOffsetForIndex.ts +0 -23
  220. package/src/calculateOffsetWithOffsetPosition.ts +0 -26
  221. package/src/checkAllSizesKnown.ts +0 -17
  222. package/src/checkAtBottom.ts +0 -36
  223. package/src/checkAtTop.ts +0 -27
  224. package/src/checkThreshold.ts +0 -30
  225. package/src/constants.ts +0 -11
  226. package/src/createColumnWrapperStyle.ts +0 -16
  227. package/src/doInitialAllocateContainers.ts +0 -40
  228. package/src/doMaintainScrollAtEnd.ts +0 -34
  229. package/src/findAvailableContainers.ts +0 -98
  230. package/src/finishScrollTo.ts +0 -8
  231. package/src/getId.ts +0 -21
  232. package/src/getItemSize.ts +0 -52
  233. package/src/getRenderedItem.ts +0 -34
  234. package/src/getScrollVelocity.ts +0 -47
  235. package/src/handleLayout.ts +0 -70
  236. package/src/helpers.ts +0 -39
  237. package/src/index.ts +0 -11
  238. package/src/keyboard-controller.tsx +0 -63
  239. package/src/onScroll.ts +0 -66
  240. package/src/prepareMVCP.ts +0 -50
  241. package/src/reanimated.tsx +0 -63
  242. package/src/requestAdjust.ts +0 -41
  243. package/src/scrollTo.ts +0 -40
  244. package/src/scrollToIndex.ts +0 -34
  245. package/src/setDidLayout.ts +0 -25
  246. package/src/setPaddingTop.ts +0 -28
  247. package/src/state.tsx +0 -304
  248. package/src/types.ts +0 -610
  249. package/src/updateAlignItemsPaddingTop.ts +0 -18
  250. package/src/updateAllPositions.ts +0 -130
  251. package/src/updateItemSize.ts +0 -203
  252. package/src/updateTotalSize.ts +0 -44
  253. package/src/useAnimatedValue.ts +0 -6
  254. package/src/useCombinedRef.ts +0 -22
  255. package/src/useInit.ts +0 -17
  256. package/src/useSyncLayout.tsx +0 -68
  257. package/src/useValue$.ts +0 -53
  258. package/src/viewability.ts +0 -279
  259. package/tsconfig.json +0 -59
  260. package/tsup.config.ts +0 -21
package/src/types.ts DELETED
@@ -1,610 +0,0 @@
1
- import { type ComponentProps, type ReactNode, forwardRef, memo } from "react";
2
- import type {
3
- Animated,
4
- LayoutRectangle,
5
- NativeScrollEvent,
6
- NativeSyntheticEvent,
7
- ScrollResponderMixin,
8
- ScrollView,
9
- ScrollViewComponent,
10
- ScrollViewProps,
11
- StyleProp,
12
- ViewStyle,
13
- } from "react-native";
14
- import type Reanimated from "react-native-reanimated";
15
-
16
- import type { ScrollAdjustHandler } from "./ScrollAdjustHandler";
17
-
18
- export type LegendListPropsBase<
19
- ItemT,
20
- TScrollView extends
21
- | ComponentProps<typeof ScrollView>
22
- | ComponentProps<typeof Animated.ScrollView>
23
- | ComponentProps<typeof Reanimated.ScrollView>,
24
- > = Omit<
25
- TScrollView,
26
- | "contentOffset"
27
- | "contentInset"
28
- | "maintainVisibleContentPosition"
29
- | "stickyHeaderIndices"
30
- | "removeClippedSubviews"
31
- | "children"
32
- > & {
33
- /**
34
- * If true, aligns items at the end of the list.
35
- * @default false
36
- */
37
- alignItemsAtEnd?: boolean;
38
-
39
- /**
40
- * Style applied to each column's wrapper view.
41
- */
42
- columnWrapperStyle?: ColumnWrapperStyle;
43
-
44
- /**
45
- * Array of items to render in the list.
46
- * @required
47
- */
48
- data: ReadonlyArray<ItemT>;
49
-
50
- /**
51
- * Distance in pixels to pre-render items ahead of the visible area.
52
- * @default 250
53
- */
54
- drawDistance?: number;
55
-
56
- /**
57
- * Estimated size of each item in pixels, a hint for the first render. After some
58
- * items are rendered, the average size of rendered items will be used instead.
59
- * @default undefined
60
- */
61
- estimatedItemSize?: number;
62
-
63
- /**
64
- * Estimated size of the ScrollView in pixels, a hint for the first render to improve performance
65
- * @default undefined
66
- */
67
- estimatedListSize?: { height: number; width: number };
68
-
69
- /**
70
- * Extra data to trigger re-rendering when changed.
71
- */
72
- extraData?: any;
73
-
74
- /**
75
- * In case you have distinct item sizes, you can provide a function to get the size of an item.
76
- * Use instead of FlatList's getItemLayout or FlashList overrideItemLayout if you want to have accurate initialScrollOffset, you should provide this function
77
- */
78
- getEstimatedItemSize?: (index: number, item: ItemT) => number;
79
-
80
- /**
81
- * Ratio of initial container pool size to data length (e.g., 0.5 for half).
82
- * @default 2
83
- */
84
- initialContainerPoolRatio?: number | undefined;
85
-
86
- /**
87
- * Initial scroll position in pixels.
88
- * @default 0
89
- */
90
- initialScrollOffset?: number;
91
-
92
- /**
93
- * Index to scroll to initially.
94
- * @default 0
95
- */
96
- initialScrollIndex?:
97
- | number
98
- | {
99
- index: number;
100
- viewOffset?: number | undefined;
101
- viewPosition?: number | undefined;
102
- };
103
-
104
- /**
105
- * Component to render between items, receiving the leading item as prop.
106
- */
107
- ItemSeparatorComponent?: React.ComponentType<{ leadingItem: ItemT }>;
108
-
109
- /**
110
- * Function to extract a unique key for each item.
111
- */
112
- keyExtractor?: (item: ItemT, index: number) => string;
113
-
114
- /**
115
- * Component or element to render when the list is empty.
116
- */
117
- ListEmptyComponent?: React.ComponentType<any> | React.ReactElement | null | undefined;
118
-
119
- /**
120
- * Component or element to render below the list.
121
- */
122
- ListFooterComponent?: React.ComponentType<any> | React.ReactElement | null | undefined;
123
-
124
- /**
125
- * Style for the footer component.
126
- */
127
- ListFooterComponentStyle?: StyleProp<ViewStyle> | undefined;
128
-
129
- /**
130
- * Component or element to render above the list.
131
- */
132
- ListHeaderComponent?: React.ComponentType<any> | React.ReactElement | null | undefined;
133
-
134
- /**
135
- * Style for the header component.
136
- */
137
- ListHeaderComponentStyle?: StyleProp<ViewStyle> | undefined;
138
-
139
- /**
140
- * If true, auto-scrolls to end when new items are added.
141
- * @default false
142
- */
143
- maintainScrollAtEnd?: boolean | MaintainScrollAtEndOptions;
144
-
145
- /**
146
- * Distance threshold in percentage of screen size to trigger maintainScrollAtEnd.
147
- * @default 0.1
148
- */
149
- maintainScrollAtEndThreshold?: number;
150
-
151
- /**
152
- * If true, maintains visibility of content during scroll (e.g., after insertions).
153
- * @default false
154
- */
155
- maintainVisibleContentPosition?: boolean;
156
-
157
- /**
158
- * Number of columns to render items in.
159
- * @default 1
160
- */
161
- numColumns?: number;
162
-
163
- /**
164
- * Called when scrolling reaches the end within onEndReachedThreshold.
165
- */
166
- onEndReached?: ((info: { distanceFromEnd: number }) => void) | null | undefined;
167
-
168
- /**
169
- * How close to the end (in fractional units of visible length) to trigger onEndReached.
170
- * @default 0.5
171
- */
172
- onEndReachedThreshold?: number | null | undefined;
173
-
174
- /**
175
- * Called when an item's size changes.
176
- */
177
- onItemSizeChanged?: (info: {
178
- size: number;
179
- previous: number;
180
- index: number;
181
- itemKey: string;
182
- itemData: ItemT;
183
- }) => void;
184
-
185
- /**
186
- * Function to call when the user pulls to refresh.
187
- */
188
- onRefresh?: () => void;
189
-
190
- /**
191
- * Called when scrolling reaches the start within onStartReachedThreshold.
192
- */
193
- onStartReached?: ((info: { distanceFromStart: number }) => void) | null | undefined;
194
-
195
- /**
196
- * How close to the start (in fractional units of visible length) to trigger onStartReached.
197
- * @default 0.5
198
- */
199
- onStartReachedThreshold?: number | null | undefined;
200
-
201
- /**
202
- * Called when the viewability of items changes.
203
- */
204
- onViewableItemsChanged?: OnViewableItemsChanged | undefined;
205
-
206
- /**
207
- * Offset in pixels for the refresh indicator.
208
- * @default 0
209
- */
210
- progressViewOffset?: number;
211
-
212
- /**
213
- * If true, recycles item views for better performance.
214
- * @default false
215
- */
216
- recycleItems?: boolean;
217
-
218
- /**
219
- * Ref to the underlying ScrollView component.
220
- */
221
- refScrollView?: React.Ref<ScrollView>;
222
-
223
- /**
224
- * If true, shows a refresh indicator.
225
- * @default false
226
- */
227
- refreshing?: boolean;
228
-
229
- /**
230
- * Function or React component to render each item in the list.
231
- * Can be either:
232
- * - A function: (props: LegendListRenderItemProps<ItemT>) => ReactNode
233
- * - A React component: React.ComponentType<LegendListRenderItemProps<ItemT>>
234
- * @required
235
- */
236
- renderItem?:
237
- | ((props: LegendListRenderItemProps<ItemT>) => ReactNode)
238
- | React.ComponentType<LegendListRenderItemProps<ItemT>>;
239
-
240
- /**
241
- * Render custom ScrollView component.
242
- * @default (props) => <ScrollView {...props} />
243
- */
244
- renderScrollComponent?: (props: ScrollViewProps) => React.ReactElement<ScrollViewProps>;
245
-
246
- /**
247
- * This will log a suggested estimatedItemSize.
248
- * @required
249
- * @default false
250
- */
251
- suggestEstimatedItemSize?: boolean;
252
-
253
- /**
254
- * Configuration for determining item viewability.
255
- */
256
- viewabilityConfig?: ViewabilityConfig;
257
-
258
- /**
259
- * Pairs of viewability configs and their callbacks for tracking visibility.
260
- */
261
- viewabilityConfigCallbackPairs?: ViewabilityConfigCallbackPairs | undefined;
262
-
263
- /**
264
- * If true, delays rendering until initial layout is complete.
265
- * @default false
266
- */
267
- waitForInitialLayout?: boolean;
268
-
269
- onLoad?: (info: { elapsedTimeInMs: number }) => void;
270
- };
271
-
272
- export interface MaintainScrollAtEndOptions {
273
- onLayout?: boolean;
274
- onItemLayout?: boolean;
275
- onDataChange?: boolean;
276
- }
277
-
278
- export interface ColumnWrapperStyle {
279
- rowGap?: number;
280
- gap?: number;
281
- columnGap?: number;
282
- }
283
-
284
- export type LegendListProps<ItemT> = LegendListPropsBase<
285
- ItemT,
286
- Omit<ComponentProps<typeof ScrollView>, "scrollEventThrottle">
287
- >;
288
-
289
- export interface InternalState {
290
- positions: Map<string, number>;
291
- columns: Map<string, number>;
292
- sizes: Map<string, number>;
293
- sizesKnown: Map<string, number>;
294
- containerItemKeys: Set<string>;
295
- pendingAdjust: number;
296
- isStartReached: boolean;
297
- isEndReached: boolean;
298
- isAtEnd: boolean;
299
- isAtStart: boolean;
300
- hasScrolled?: boolean;
301
- scrollLength: number;
302
- startBuffered: number;
303
- startBufferedId?: string;
304
- startNoBuffer: number;
305
- endBuffered: number;
306
- endNoBuffer: number;
307
- firstFullyOnScreenIndex: number;
308
- idsInView: string[];
309
- scrollPending: number;
310
- scroll: number;
311
- scrollTime: number;
312
- scrollPrev: number;
313
- scrollPrevTime: number;
314
- scrollAdjustHandler: ScrollAdjustHandler;
315
- maintainingScrollAtEnd?: boolean;
316
- totalSize: number;
317
- otherAxisSize?: number;
318
- timeouts: Set<number>;
319
- timeoutSizeMessage: any;
320
- nativeMarginTop: number;
321
- indexByKey: Map<string, number>;
322
- idCache: Map<number, string>;
323
- viewabilityConfigCallbackPairs: ViewabilityConfigCallbackPairs | undefined;
324
- scrollHistory: Array<{ scroll: number; time: number }>;
325
- startReachedBlockedByTimer: boolean;
326
- endReachedBlockedByTimer: boolean;
327
- scrollForNextCalculateItemsInView: { top: number; bottom: number } | undefined;
328
- enableScrollForNextCalculateItemsInView: boolean;
329
- minIndexSizeChanged: number | undefined;
330
- queuedInitialLayout?: boolean | undefined;
331
- queuedCalculateItemsInView: number | undefined;
332
- lastBatchingAction: number;
333
- ignoreScrollFromMVCP?: { lt?: number; gt?: number };
334
- ignoreScrollFromMVCPTimeout?: any;
335
- scrollingTo?:
336
- | { offset: number; index?: number; viewOffset?: number; viewPosition?: number; animated?: boolean }
337
- | undefined;
338
- needsOtherAxisSize?: boolean;
339
- averageSizes: Record<
340
- string,
341
- {
342
- num: number;
343
- avg: number;
344
- }
345
- >;
346
- refScroller: React.RefObject<ScrollView>;
347
- loadStartTime: number;
348
- initialScroll: ScrollIndexWithOffsetPosition | undefined;
349
- lastLayout: LayoutRectangle | undefined;
350
- props: {
351
- alignItemsAtEnd: boolean;
352
- data: readonly any[];
353
- estimatedItemSize: number | undefined;
354
- getEstimatedItemSize: ((index: number, item: any) => number) | undefined;
355
- horizontal: boolean;
356
- keyExtractor: ((item: any, index: number) => string) | undefined;
357
- maintainScrollAtEnd: boolean | MaintainScrollAtEndOptions;
358
- maintainScrollAtEndThreshold: number | undefined;
359
- maintainVisibleContentPosition: boolean;
360
- onEndReached: (((info: { distanceFromEnd: number }) => void) | null | undefined) | undefined;
361
- onEndReachedThreshold: number | null | undefined;
362
- onItemSizeChanged:
363
- | ((info: {
364
- size: number;
365
- previous: number;
366
- index: number;
367
- itemKey: string;
368
- itemData: any;
369
- }) => void)
370
- | undefined;
371
- onLoad: ((info: { elapsedTimeInMs: number }) => void) | undefined;
372
- onScroll: ((event: NativeSyntheticEvent<NativeScrollEvent>) => void) | undefined;
373
- onStartReached: (((info: { distanceFromStart: number }) => void) | null | undefined) | undefined;
374
- onStartReachedThreshold: number | null | undefined;
375
- suggestEstimatedItemSize: boolean;
376
- stylePaddingBottom: number | undefined;
377
- renderItem:
378
- | ((props: LegendListRenderItemProps<any>) => ReactNode)
379
- | React.ComponentType<LegendListRenderItemProps<any>>;
380
- initialScroll: { index: number; viewOffset?: number; viewPosition?: number } | undefined;
381
- scrollBuffer: number;
382
- viewabilityConfigCallbackPairs: ViewabilityConfigCallbackPairs | undefined;
383
- numColumns: number;
384
- initialContainerPoolRatio: number;
385
- stylePaddingTop: number | undefined;
386
- };
387
- }
388
-
389
- export interface ViewableRange<T> {
390
- startBuffered: number;
391
- start: number;
392
- endBuffered: number;
393
- end: number;
394
- items: T[];
395
- }
396
-
397
- export interface LegendListRenderItemProps<ItemT> {
398
- item: ItemT;
399
- index: number;
400
- extraData: any;
401
- }
402
-
403
- export type ScrollState = {
404
- contentLength: number;
405
- end: number;
406
- endBuffered: number;
407
- isAtEnd: boolean;
408
- isAtStart: boolean;
409
- scroll: number;
410
- scrollLength: number;
411
- start: number;
412
- startBuffered: number;
413
- sizes: Map<string, number>;
414
- sizeAtIndex: (index: number) => number;
415
- };
416
-
417
- export type LegendListRef = {
418
- /**
419
- * Displays the scroll indicators momentarily.
420
- */
421
- flashScrollIndicators(): void;
422
-
423
- /**
424
- * Returns the native ScrollView component reference.
425
- */
426
- getNativeScrollRef(): React.ElementRef<typeof ScrollViewComponent>;
427
-
428
- /**
429
- * Returns the scroll responder instance for handling scroll events.
430
- */
431
- getScrollableNode(): any;
432
-
433
- /**
434
- * Returns the ScrollResponderMixin for advanced scroll handling.
435
- */
436
- getScrollResponder(): ScrollResponderMixin;
437
-
438
- /**
439
- * Returns the internal state of the scroll virtualization.
440
- */
441
- getState(): ScrollState;
442
-
443
- /**
444
- * Scrolls a specific index into view.
445
- * @param params - Parameters for scrolling.
446
- * @param params.animated - If true, animates the scroll. Default: true.
447
- * @param params.index - The index to scroll to.
448
- */
449
- scrollIndexIntoView(params: {
450
- animated?: boolean | undefined;
451
- index: number;
452
- }): void;
453
-
454
- /**
455
- * Scrolls a specific index into view.
456
- * @param params - Parameters for scrolling.
457
- * @param params.animated - If true, animates the scroll. Default: true.
458
- * @param params.item - The item to scroll to.
459
- */
460
- scrollItemIntoView(params: {
461
- animated?: boolean | undefined;
462
- item: any;
463
- }): void;
464
-
465
- /**
466
- * Scrolls to the end of the list.
467
- * @param options - Options for scrolling.
468
- * @param options.animated - If true, animates the scroll. Default: true.
469
- */
470
- scrollToEnd(options?: { animated?: boolean | undefined }): void;
471
-
472
- /**
473
- * Scrolls to a specific index in the list.
474
- * @param params - Parameters for scrolling.
475
- * @param params.animated - If true, animates the scroll. Default: true.
476
- * @param params.index - The index to scroll to.
477
- * @param params.viewOffset - Offset from the target position.
478
- * @param params.viewPosition - Position of the item in the viewport (0 to 1).
479
- */
480
- scrollToIndex(params: {
481
- animated?: boolean | undefined;
482
- index: number;
483
- viewOffset?: number | undefined;
484
- viewPosition?: number | undefined;
485
- }): void;
486
-
487
- /**
488
- * Scrolls to a specific item in the list.
489
- * @param params - Parameters for scrolling.
490
- * @param params.animated - If true, animates the scroll. Default: true.
491
- * @param params.item - The item to scroll to.
492
- * @param params.viewOffset - Offset from the target position.
493
- * @param params.viewPosition - Position of the item in the viewport (0 to 1).
494
- */
495
- scrollToItem(params: {
496
- animated?: boolean | undefined;
497
- item: any;
498
- viewOffset?: number | undefined;
499
- viewPosition?: number | undefined;
500
- }): void;
501
-
502
- /**
503
- * Scrolls to a specific offset in pixels.
504
- * @param params - Parameters for scrolling.
505
- * @param params.offset - The pixel offset to scroll to.
506
- * @param params.animated - If true, animates the scroll. Default: true.
507
- */
508
- scrollToOffset(params: { offset: number; animated?: boolean | undefined }): void;
509
-
510
- /**
511
- * Sets or adds to the offset of the visible content anchor.
512
- * @param value - The offset to set or add.
513
- * @param animated - If true, uses Animated to animate the change.
514
- */
515
- setVisibleContentAnchorOffset(value: number | ((value: number) => number)): void;
516
- };
517
-
518
- export interface ViewToken<ItemT = any> {
519
- item: ItemT;
520
- key: string;
521
- index: number;
522
- isViewable: boolean;
523
- containerId: number;
524
- }
525
-
526
- export interface ViewAmountToken<ItemT = any> extends ViewToken<ItemT> {
527
- sizeVisible: number;
528
- size: number;
529
- percentVisible: number;
530
- percentOfScroller: number;
531
- scrollSize: number;
532
- }
533
-
534
- export interface ViewabilityConfigCallbackPair {
535
- viewabilityConfig: ViewabilityConfig;
536
- onViewableItemsChanged?: OnViewableItemsChanged;
537
- }
538
-
539
- export type ViewabilityConfigCallbackPairs = ViewabilityConfigCallbackPair[];
540
-
541
- export type OnViewableItemsChanged =
542
- | ((info: { viewableItems: Array<ViewToken>; changed: Array<ViewToken> }) => void)
543
- | null;
544
-
545
- export interface ViewabilityConfig {
546
- /**
547
- * A unique ID to identify this viewability config
548
- */
549
- id?: string;
550
-
551
- /**
552
- * Minimum amount of time (in milliseconds) that an item must be physically viewable before the
553
- * viewability callback will be fired. A high number means that scrolling through content without
554
- * stopping will not mark the content as viewable.
555
- */
556
- minimumViewTime?: number | undefined;
557
-
558
- /**
559
- * Percent of viewport that must be covered for a partially occluded item to count as
560
- * "viewable", 0-100. Fully visible items are always considered viewable. A value of 0 means
561
- * that a single pixel in the viewport makes the item viewable, and a value of 100 means that
562
- * an item must be either entirely visible or cover the entire viewport to count as viewable.
563
- */
564
- viewAreaCoveragePercentThreshold?: number | undefined;
565
-
566
- /**
567
- * Similar to `viewAreaCoveragePercentThreshold`, but considers the percent of the item that is visible,
568
- * rather than the fraction of the viewable area it covers.
569
- */
570
- itemVisiblePercentThreshold?: number | undefined;
571
-
572
- /**
573
- * Nothing is considered viewable until the user scrolls or `recordInteraction` is called after
574
- * render.
575
- */
576
- waitForInteraction?: boolean | undefined;
577
- }
578
-
579
- export type ViewabilityCallback = (viewToken: ViewToken) => void;
580
- export type ViewabilityAmountCallback = (viewToken: ViewAmountToken) => void;
581
-
582
- export interface LegendListRecyclingState<T> {
583
- item: T;
584
- prevItem: T | undefined;
585
- index: number;
586
- prevIndex: number | undefined;
587
- }
588
-
589
- // biome-ignore lint/complexity/noBannedTypes: This is correct
590
- export type TypedForwardRef = <T, P = {}>(
591
- render: (props: P, ref: React.Ref<T>) => React.ReactNode,
592
- ) => (props: P & React.RefAttributes<T>) => React.ReactNode;
593
-
594
- export const typedForwardRef = forwardRef as TypedForwardRef;
595
-
596
- export type TypedMemo = <T extends React.ComponentType<any>>(
597
- Component: T,
598
- propsAreEqual?: (prevProps: Readonly<ComponentProps<T>>, nextProps: Readonly<ComponentProps<T>>) => boolean,
599
- ) => T & { displayName?: string };
600
-
601
- export const typedMemo = memo as TypedMemo;
602
-
603
- export type ScrollIndexWithOffsetPosition = {
604
- index: number;
605
- viewOffset?: number;
606
- viewPosition?: number;
607
- };
608
-
609
- export type GetRenderedItemResult<ItemT> = { index: number; item: ItemT; renderedItem: React.ReactNode };
610
- export type GetRenderedItem = (key: string) => GetRenderedItemResult<any> | null;
@@ -1,18 +0,0 @@
1
- import { setPaddingTop } from "./setPaddingTop";
2
- import { type StateContext, getContentSize } from "./state";
3
- import type { InternalState } from "./types";
4
-
5
- export function updateAlignItemsPaddingTop(ctx: StateContext, state: InternalState) {
6
- const {
7
- scrollLength,
8
- props: { alignItemsAtEnd, data },
9
- } = state;
10
- if (alignItemsAtEnd) {
11
- let alignItemsPaddingTop = 0;
12
- if (data?.length > 0) {
13
- const contentSize = getContentSize(ctx);
14
- alignItemsPaddingTop = Math.max(0, Math.floor(scrollLength - contentSize));
15
- }
16
- setPaddingTop(ctx, { alignItemsPaddingTop });
17
- }
18
- }