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

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 (264) hide show
  1. package/{dist/animated.d.mts → animated.d.mts} +10 -3
  2. package/{dist/animated.d.ts → animated.d.ts} +10 -3
  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} +86 -167
  6. package/{dist/index.d.ts → index.d.ts} +86 -167
  7. package/{dist/index.js → index.js} +1594 -1098
  8. package/{dist/index.mjs → index.mjs} +1596 -1100
  9. package/keyboard-controller.d.mts +148 -0
  10. package/keyboard-controller.d.ts +148 -0
  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/reanimated.js +60 -0
  17. package/reanimated.mjs +53 -0
  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/keyboard-controller.d.mts +0 -261
  32. package/dist/keyboard-controller.d.ts +0 -261
  33. package/dist/package.json +0 -35
  34. package/dist/reanimated.js +0 -58
  35. package/dist/reanimated.mjs +0 -51
  36. package/example/README.md +0 -40
  37. package/example/api/data/genres.json +0 -23
  38. package/example/api/data/playlist/10402-10749.json +0 -1
  39. package/example/api/data/playlist/10402-10770.json +0 -1
  40. package/example/api/data/playlist/10402-37.json +0 -1
  41. package/example/api/data/playlist/10749-10752.json +0 -1
  42. package/example/api/data/playlist/10749-10770.json +0 -1
  43. package/example/api/data/playlist/10749-37.json +0 -1
  44. package/example/api/data/playlist/10749-878.json +0 -1
  45. package/example/api/data/playlist/10751-10402.json +0 -1
  46. package/example/api/data/playlist/10751-10752.json +0 -1
  47. package/example/api/data/playlist/10751-37.json +0 -1
  48. package/example/api/data/playlist/10751-53.json +0 -1
  49. package/example/api/data/playlist/10751-878.json +0 -1
  50. package/example/api/data/playlist/10751-9648.json +0 -1
  51. package/example/api/data/playlist/10752-37.json +0 -1
  52. package/example/api/data/playlist/12-10402.json +0 -1
  53. package/example/api/data/playlist/12-10749.json +0 -1
  54. package/example/api/data/playlist/12-18.json +0 -1
  55. package/example/api/data/playlist/12-27.json +0 -1
  56. package/example/api/data/playlist/12-35.json +0 -1
  57. package/example/api/data/playlist/14-36.json +0 -1
  58. package/example/api/data/playlist/14-878.json +0 -1
  59. package/example/api/data/playlist/16-10751.json +0 -1
  60. package/example/api/data/playlist/16-10770.json +0 -1
  61. package/example/api/data/playlist/16-35.json +0 -1
  62. package/example/api/data/playlist/16-36.json +0 -1
  63. package/example/api/data/playlist/16-53.json +0 -1
  64. package/example/api/data/playlist/18-10751.json +0 -1
  65. package/example/api/data/playlist/18-10752.json +0 -1
  66. package/example/api/data/playlist/18-37.json +0 -1
  67. package/example/api/data/playlist/18-53.json +0 -1
  68. package/example/api/data/playlist/18-878.json +0 -1
  69. package/example/api/data/playlist/27-10749.json +0 -1
  70. package/example/api/data/playlist/27-10770.json +0 -1
  71. package/example/api/data/playlist/28-10749.json +0 -1
  72. package/example/api/data/playlist/28-10751.json +0 -1
  73. package/example/api/data/playlist/28-10770.json +0 -1
  74. package/example/api/data/playlist/28-16.json +0 -1
  75. package/example/api/data/playlist/28-18.json +0 -1
  76. package/example/api/data/playlist/28-36.json +0 -1
  77. package/example/api/data/playlist/28-37.json +0 -1
  78. package/example/api/data/playlist/28-53.json +0 -1
  79. package/example/api/data/playlist/28-80.json +0 -1
  80. package/example/api/data/playlist/28-99.json +0 -1
  81. package/example/api/data/playlist/35-10749.json +0 -1
  82. package/example/api/data/playlist/35-10751.json +0 -1
  83. package/example/api/data/playlist/35-10752.json +0 -1
  84. package/example/api/data/playlist/35-27.json +0 -1
  85. package/example/api/data/playlist/35-36.json +0 -1
  86. package/example/api/data/playlist/35-53.json +0 -1
  87. package/example/api/data/playlist/35-80.json +0 -1
  88. package/example/api/data/playlist/36-37.json +0 -1
  89. package/example/api/data/playlist/36-878.json +0 -1
  90. package/example/api/data/playlist/36-9648.json +0 -1
  91. package/example/api/data/playlist/53-10752.json +0 -1
  92. package/example/api/data/playlist/80-10770.json +0 -1
  93. package/example/api/data/playlist/80-14.json +0 -1
  94. package/example/api/data/playlist/80-18.json +0 -1
  95. package/example/api/data/playlist/80-37.json +0 -1
  96. package/example/api/data/playlist/878-37.json +0 -1
  97. package/example/api/data/playlist/9648-10770.json +0 -1
  98. package/example/api/data/playlist/9648-37.json +0 -1
  99. package/example/api/data/playlist/9648-53.json +0 -1
  100. package/example/api/data/playlist/9648-878.json +0 -1
  101. package/example/api/data/playlist/99-10749.json +0 -1
  102. package/example/api/data/playlist/99-14.json +0 -1
  103. package/example/api/data/playlist/99-18.json +0 -1
  104. package/example/api/data/playlist/99-27.json +0 -1
  105. package/example/api/data/playlist/99-53.json +0 -1
  106. package/example/api/data/playlist/99-9648.json +0 -1
  107. package/example/api/data/playlist/index.ts +0 -73
  108. package/example/api/data/rows.json +0 -1
  109. package/example/api/index.ts +0 -36
  110. package/example/app/(tabs)/_layout.tsx +0 -60
  111. package/example/app/(tabs)/cards.tsx +0 -81
  112. package/example/app/(tabs)/index.tsx +0 -205
  113. package/example/app/(tabs)/moviesL.tsx +0 -7
  114. package/example/app/(tabs)/moviesLR.tsx +0 -7
  115. package/example/app/+not-found.tsx +0 -32
  116. package/example/app/_layout.tsx +0 -34
  117. package/example/app/accurate-scrollto/index.tsx +0 -125
  118. package/example/app/accurate-scrollto-2/index.tsx +0 -52
  119. package/example/app/accurate-scrollto-huge/index.tsx +0 -128
  120. package/example/app/add-to-end/index.tsx +0 -82
  121. package/example/app/ai-chat/index.tsx +0 -236
  122. package/example/app/bidirectional-infinite-list/index.tsx +0 -133
  123. package/example/app/cards-columns/index.tsx +0 -37
  124. package/example/app/cards-flashlist/index.tsx +0 -122
  125. package/example/app/cards-flatlist/index.tsx +0 -94
  126. package/example/app/cards-no-recycle/index.tsx +0 -110
  127. package/example/app/cards-renderItem.tsx +0 -354
  128. package/example/app/chat-example/index.tsx +0 -167
  129. package/example/app/chat-infinite/index.tsx +0 -239
  130. package/example/app/chat-keyboard/index.tsx +0 -248
  131. package/example/app/chat-resize-outer/index.tsx +0 -247
  132. package/example/app/columns/index.tsx +0 -78
  133. package/example/app/countries/index.tsx +0 -182
  134. package/example/app/countries-flashlist/index.tsx +0 -163
  135. package/example/app/countries-reorder/index.tsx +0 -187
  136. package/example/app/extra-data/index.tsx +0 -86
  137. package/example/app/filter-elements/filter-data-provider.tsx +0 -55
  138. package/example/app/filter-elements/index.tsx +0 -118
  139. package/example/app/initial-scroll-index/index.tsx +0 -106
  140. package/example/app/initial-scroll-index/renderFixedItem.tsx +0 -215
  141. package/example/app/initial-scroll-index-free-height/index.tsx +0 -70
  142. package/example/app/initial-scroll-index-keyed/index.tsx +0 -62
  143. package/example/app/lazy-list/index.tsx +0 -123
  144. package/example/app/movies-flashlist/index.tsx +0 -7
  145. package/example/app/mutable-cells/index.tsx +0 -104
  146. package/example/app/video-feed/index.tsx +0 -119
  147. package/example/app.config.js +0 -22
  148. package/example/app.json +0 -45
  149. package/example/assets/fonts/SpaceMono-Regular.ttf +0 -0
  150. package/example/assets/images/adaptive-icon.png +0 -0
  151. package/example/assets/images/favicon.png +0 -0
  152. package/example/assets/images/icon.png +0 -0
  153. package/example/assets/images/partial-react-logo.png +0 -0
  154. package/example/assets/images/react-logo.png +0 -0
  155. package/example/assets/images/react-logo@2x.png +0 -0
  156. package/example/assets/images/react-logo@3x.png +0 -0
  157. package/example/assets/images/splash-icon.png +0 -0
  158. package/example/autoscroll.sh +0 -101
  159. package/example/bun.lock +0 -2266
  160. package/example/bunfig.toml +0 -2
  161. package/example/components/Breathe.tsx +0 -54
  162. package/example/components/Circle.tsx +0 -69
  163. package/example/components/Collapsible.tsx +0 -44
  164. package/example/components/ExternalLink.tsx +0 -24
  165. package/example/components/HapticTab.tsx +0 -18
  166. package/example/components/HelloWave.tsx +0 -37
  167. package/example/components/Movies.tsx +0 -179
  168. package/example/components/ParallaxScrollView.tsx +0 -81
  169. package/example/components/ThemedText.tsx +0 -60
  170. package/example/components/ThemedView.tsx +0 -14
  171. package/example/components/__tests__/ThemedText-test.tsx +0 -10
  172. package/example/components/__tests__/__snapshots__/ThemedText-test.tsx.snap +0 -24
  173. package/example/components/ui/IconSymbol.ios.tsx +0 -32
  174. package/example/components/ui/IconSymbol.tsx +0 -43
  175. package/example/components/ui/TabBarBackground.ios.tsx +0 -22
  176. package/example/components/ui/TabBarBackground.tsx +0 -6
  177. package/example/constants/Colors.ts +0 -26
  178. package/example/constants/constants.ts +0 -5
  179. package/example/constants/useScrollTest.ts +0 -19
  180. package/example/hooks/useColorScheme.ts +0 -1
  181. package/example/hooks/useColorScheme.web.ts +0 -8
  182. package/example/hooks/useThemeColor.ts +0 -22
  183. package/example/ios/.xcode.env +0 -11
  184. package/example/ios/Podfile +0 -64
  185. package/example/ios/Podfile.lock +0 -2767
  186. package/example/ios/Podfile.properties.json +0 -5
  187. package/example/ios/listtest/AppDelegate.swift +0 -70
  188. package/example/ios/listtest/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png +0 -0
  189. package/example/ios/listtest/Images.xcassets/AppIcon.appiconset/Contents.json +0 -14
  190. package/example/ios/listtest/Images.xcassets/Contents.json +0 -6
  191. package/example/ios/listtest/Images.xcassets/SplashScreenBackground.colorset/Contents.json +0 -20
  192. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/Contents.json +0 -23
  193. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image.png +0 -0
  194. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image@2x.png +0 -0
  195. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image@3x.png +0 -0
  196. package/example/ios/listtest/Info.plist +0 -85
  197. package/example/ios/listtest/PrivacyInfo.xcprivacy +0 -48
  198. package/example/ios/listtest/SplashScreen.storyboard +0 -42
  199. package/example/ios/listtest/Supporting/Expo.plist +0 -12
  200. package/example/ios/listtest/listtest-Bridging-Header.h +0 -3
  201. package/example/ios/listtest/listtest.entitlements +0 -5
  202. package/example/ios/listtest.xcodeproj/project.pbxproj +0 -547
  203. package/example/ios/listtest.xcodeproj/xcshareddata/xcschemes/listtest.xcscheme +0 -88
  204. package/example/ios/listtest.xcworkspace/contents.xcworkspacedata +0 -10
  205. package/example/metro.config.js +0 -16
  206. package/example/package.json +0 -73
  207. package/example/scripts/reset-project.js +0 -84
  208. package/example/tsconfig.json +0 -26
  209. package/posttsup.ts +0 -24
  210. package/src/Container.tsx +0 -176
  211. package/src/Containers.tsx +0 -85
  212. package/src/ContextContainer.ts +0 -145
  213. package/src/DebugView.tsx +0 -83
  214. package/src/LazyLegendList.tsx +0 -41
  215. package/src/LeanView.tsx +0 -18
  216. package/src/LegendList.tsx +0 -558
  217. package/src/ListComponent.tsx +0 -191
  218. package/src/ScrollAdjust.tsx +0 -24
  219. package/src/ScrollAdjustHandler.ts +0 -26
  220. package/src/Separator.tsx +0 -14
  221. package/src/animated.tsx +0 -6
  222. package/src/calculateItemsInView.ts +0 -363
  223. package/src/calculateOffsetForIndex.ts +0 -23
  224. package/src/calculateOffsetWithOffsetPosition.ts +0 -26
  225. package/src/checkAllSizesKnown.ts +0 -17
  226. package/src/checkAtBottom.ts +0 -36
  227. package/src/checkAtTop.ts +0 -27
  228. package/src/checkThreshold.ts +0 -30
  229. package/src/constants.ts +0 -11
  230. package/src/createColumnWrapperStyle.ts +0 -16
  231. package/src/doInitialAllocateContainers.ts +0 -40
  232. package/src/doMaintainScrollAtEnd.ts +0 -34
  233. package/src/findAvailableContainers.ts +0 -98
  234. package/src/finishScrollTo.ts +0 -8
  235. package/src/getId.ts +0 -21
  236. package/src/getItemSize.ts +0 -52
  237. package/src/getRenderedItem.ts +0 -34
  238. package/src/getScrollVelocity.ts +0 -47
  239. package/src/handleLayout.ts +0 -70
  240. package/src/helpers.ts +0 -39
  241. package/src/index.ts +0 -11
  242. package/src/keyboard-controller.tsx +0 -63
  243. package/src/onScroll.ts +0 -66
  244. package/src/prepareMVCP.ts +0 -50
  245. package/src/reanimated.tsx +0 -63
  246. package/src/requestAdjust.ts +0 -41
  247. package/src/scrollTo.ts +0 -40
  248. package/src/scrollToIndex.ts +0 -34
  249. package/src/setDidLayout.ts +0 -25
  250. package/src/setPaddingTop.ts +0 -28
  251. package/src/state.tsx +0 -304
  252. package/src/types.ts +0 -610
  253. package/src/updateAlignItemsPaddingTop.ts +0 -18
  254. package/src/updateAllPositions.ts +0 -130
  255. package/src/updateItemSize.ts +0 -203
  256. package/src/updateTotalSize.ts +0 -44
  257. package/src/useAnimatedValue.ts +0 -6
  258. package/src/useCombinedRef.ts +0 -22
  259. package/src/useInit.ts +0 -17
  260. package/src/useSyncLayout.tsx +0 -68
  261. package/src/useValue$.ts +0 -53
  262. package/src/viewability.ts +0 -279
  263. package/tsconfig.json +0 -59
  264. package/tsup.config.ts +0 -21
@@ -1,205 +0,0 @@
1
- import { ThemedText } from "@/components/ThemedText";
2
- import { ThemedView } from "@/components/ThemedView";
3
- import { LegendList } from "@legendapp/list";
4
- import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs";
5
- import { Link, type LinkProps } from "expo-router";
6
- import { useCallback } from "react";
7
- import { type LayoutChangeEvent, Platform, Pressable, StyleSheet, View, useColorScheme } from "react-native";
8
- import { SafeAreaView } from "react-native-safe-area-context";
9
-
10
- // @ts-expect-error nativeFabricUIManager is not defined in the global object types
11
- export const IsNewArchitecture = global.nativeFabricUIManager != null;
12
-
13
- type ListElement = {
14
- id: number;
15
- title: string;
16
- url: LinkProps["href"];
17
- index: number;
18
- };
19
-
20
- const data: ListElement[] = [
21
- {
22
- title: "Bidirectional Infinite List",
23
- url: "/bidirectional-infinite-list",
24
- },
25
- {
26
- title: "Chat example",
27
- url: "/chat-example",
28
- },
29
- {
30
- title: "AI Chat",
31
- url: "/ai-chat",
32
- },
33
- {
34
- title: "Infinite chat",
35
- url: "/chat-infinite",
36
- },
37
- {
38
- title: "Countries List",
39
- url: "/countries",
40
- },
41
- {
42
- title: "Lazy List",
43
- url: "/lazy-list",
44
- },
45
- {
46
- title: "Accurate scrollToIndex",
47
- url: "/accurate-scrollto",
48
- },
49
- {
50
- title: "Accurate scrollToIndex 2",
51
- url: "/accurate-scrollto-2",
52
- },
53
- {
54
- title: "Columns",
55
- url: "/columns",
56
- },
57
-
58
- {
59
- title: "Cards Columns",
60
- url: "/cards-columns",
61
- },
62
- {
63
- title: "Chat keyboard",
64
- url: "/chat-keyboard",
65
- },
66
- {
67
- title: "Movies FlashList",
68
- url: "/movies-flashlist",
69
- },
70
- {
71
- title: "Initial scroll index precise navigation",
72
- url: "/initial-scroll-index",
73
- },
74
- {
75
- title: "Initial scroll index(free element height)",
76
- url: "/initial-scroll-index-free-height",
77
- },
78
- {
79
- title: "Initial Scroll Index keyed",
80
- url: "/initial-scroll-index-keyed",
81
- },
82
- {
83
- title: "Mutable elements",
84
- url: "/mutable-cells",
85
- },
86
- {
87
- title: "Extra data",
88
- url: "/extra-data",
89
- },
90
- {
91
- title: "Countries List(FlashList)",
92
- url: "/countries-flashlist",
93
- },
94
- {
95
- title: "Filter elements",
96
- url: "/filter-elements",
97
- },
98
- {
99
- title: "Video feed",
100
- url: "/video-feed",
101
- },
102
- {
103
- title: "Countries Reorder",
104
- url: "/countries-reorder",
105
- },
106
- {
107
- title: "Cards FlashList",
108
- url: "/cards-flashlist",
109
- },
110
- {
111
- title: "Cards no recycle",
112
- url: "/cards-no-recycle",
113
- },
114
- {
115
- title: "Cards FlatList",
116
- url: "/cards-flatlist",
117
- },
118
- {
119
- title: "Add to the end",
120
- url: "/add-to-end",
121
- },
122
- {
123
- title: "Chat resize outer",
124
- url: "/chat-resize-outer",
125
- },
126
- {
127
- title: "Accurate scrollToHuge",
128
- url: "/accurate-scrollto-huge",
129
- },
130
- ].map(
131
- (v, i) =>
132
- ({
133
- ...v,
134
- id: i + 1,
135
- }) as ListElement,
136
- );
137
-
138
- const RightIcon = () => <ThemedText type="subtitle">›</ThemedText>;
139
-
140
- const ListItem = ({ title, url, index }: ListElement) => {
141
- const theme = useColorScheme() ?? "light";
142
-
143
- return (
144
- <Link href={url} asChild>
145
- <Pressable>
146
- <ThemedView
147
- style={[
148
- styles.item,
149
- { borderColor: theme === "light" ? "#ccc" : "#666" },
150
- index === 0 && { borderTopWidth: 1 },
151
- ]}
152
- >
153
- <ThemedText>{title}</ThemedText>
154
- <RightIcon />
155
- </ThemedView>
156
- </Pressable>
157
- </Link>
158
- );
159
- };
160
-
161
- const ListElements = () => {
162
- const height = useBottomTabBarHeight();
163
- const onLayout = useCallback((event: LayoutChangeEvent) => {
164
- console.log("onlayout", event.nativeEvent.layout);
165
- }, []);
166
- return (
167
- <SafeAreaView style={styles.container}>
168
- <LegendList
169
- estimatedItemSize={60}
170
- data={data}
171
- renderItem={({ item, index }) => <ListItem {...item} index={index} />}
172
- keyExtractor={(item) => item.id.toString()}
173
- onItemSizeChanged={(info) => {
174
- console.log("item size changed", info);
175
- }}
176
- ListHeaderComponent={
177
- <View style={{ paddingHorizontal: 16, paddingVertical: 8 }}>
178
- <ThemedText style={{ fontWeight: "bold" }}>
179
- {IsNewArchitecture ? "New" : "Old"} Architecture, {__DEV__ ? "DEV" : "PROD"}
180
- </ThemedText>
181
- </View>
182
- }
183
- ListFooterComponent={<View />}
184
- ListFooterComponentStyle={{ height: Platform.OS === "ios" ? height : 0 }}
185
- onLayout={onLayout}
186
- />
187
- </SafeAreaView>
188
- );
189
- };
190
-
191
- const styles = StyleSheet.create({
192
- container: {
193
- flex: 1,
194
- },
195
- item: {
196
- padding: 16,
197
- height: 60,
198
- borderBottomWidth: 1,
199
- width: "100%",
200
- flexDirection: "row",
201
- justifyContent: "space-between",
202
- },
203
- });
204
-
205
- export default ListElements;
@@ -1,7 +0,0 @@
1
- import Movies from "@/components/Movies";
2
-
3
- const App = () => {
4
- return <Movies isLegend={true} />;
5
- };
6
-
7
- export default App;
@@ -1,7 +0,0 @@
1
- import Movies from "@/components/Movies";
2
-
3
- const App = () => {
4
- return <Movies isLegend={true} recycleItems={true} />;
5
- };
6
-
7
- export default App;
@@ -1,32 +0,0 @@
1
- import { Link, Stack } from "expo-router";
2
- import { StyleSheet } from "react-native";
3
-
4
- import { ThemedText } from "@/components/ThemedText";
5
- import { ThemedView } from "@/components/ThemedView";
6
-
7
- export default function NotFoundScreen() {
8
- return (
9
- <>
10
- <Stack.Screen options={{ title: "Oops!" }} />
11
- <ThemedView style={styles.container}>
12
- <ThemedText type="title">This screen doesn't exist.</ThemedText>
13
- <Link href="/" style={styles.link}>
14
- <ThemedText type="link">Go to home screen!</ThemedText>
15
- </Link>
16
- </ThemedView>
17
- </>
18
- );
19
- }
20
-
21
- const styles = StyleSheet.create({
22
- container: {
23
- flex: 1,
24
- alignItems: "center",
25
- justifyContent: "center",
26
- padding: 20,
27
- },
28
- link: {
29
- marginTop: 15,
30
- paddingVertical: 15,
31
- },
32
- });
@@ -1,34 +0,0 @@
1
- import { DarkTheme, DefaultTheme, ThemeProvider } from "@react-navigation/native";
2
- import { Stack } from "expo-router";
3
- import { StatusBar } from "expo-status-bar";
4
- import "react-native-reanimated";
5
- import { useColorScheme } from "@/hooks/useColorScheme";
6
- import { GestureHandlerRootView } from "react-native-gesture-handler";
7
- import { ReanimatedLogLevel } from "react-native-reanimated";
8
- import { configureReanimatedLogger } from "react-native-reanimated";
9
- import { enableFreeze } from "react-native-screens";
10
-
11
- // Prevent the splash screen from auto-hiding before asset loading is complete.
12
- enableFreeze(); // freeze inactive tabs in the tabbar, to improve benchmarking accuracy
13
-
14
- configureReanimatedLogger({
15
- level: ReanimatedLogLevel.warn,
16
- strict: false, // Reanimated runs in strict mode by default
17
- });
18
-
19
- export default function RootLayout() {
20
- const colorScheme = useColorScheme();
21
- console.log("starting in", __DEV__ ? "dev" : "prod");
22
-
23
- return (
24
- <GestureHandlerRootView style={{ flex: 1 }}>
25
- <ThemeProvider value={colorScheme === "dark" ? DarkTheme : DefaultTheme}>
26
- <Stack>
27
- <Stack.Screen name="(tabs)" options={{ headerShown: false, title: "Examples" }} />
28
- <Stack.Screen name="+not-found" />
29
- </Stack>
30
- <StatusBar style="auto" />
31
- </ThemeProvider>
32
- </GestureHandlerRootView>
33
- );
34
- }
@@ -1,125 +0,0 @@
1
- import { type Item, renderItem } from "@/app/cards-renderItem";
2
- import { DRAW_DISTANCE, ESTIMATED_ITEM_LENGTH } from "@/constants/constants";
3
- import { LegendList, type LegendListRef } from "@legendapp/list";
4
- import { useRef, useState } from "react";
5
- import { Button, Platform, StatusBar, StyleSheet, Text, View } from "react-native";
6
- import { TextInput } from "react-native-gesture-handler";
7
-
8
- interface CardsProps {
9
- numColumns?: number;
10
- }
11
-
12
- export default function AccurateScrollTo({ numColumns = 1 }: CardsProps) {
13
- const listRef = useRef<LegendListRef>(null);
14
-
15
- const [data, setData] = useState<Item[]>(
16
- () =>
17
- Array.from({ length: 1000 }, (_, i) => ({
18
- id: i.toString(),
19
- })) as any[],
20
- );
21
-
22
- const buttonText = useRef<string>("");
23
-
24
- return (
25
- <View style={styles.container}>
26
- <View style={styles.searchContainer}>
27
- <TextInput
28
- style={styles.searchInput}
29
- placeholder="Select item to scroll to"
30
- clearButtonMode="while-editing"
31
- autoCapitalize="none"
32
- autoCorrect={false}
33
- onChangeText={(text) => {
34
- buttonText.current = text;
35
- }}
36
- />
37
- <Button
38
- title="Scroll to item"
39
- onPress={() => {
40
- const index = Number(buttonText.current) || 0;
41
- console.log("scrolling to index", index);
42
- if (index !== -1) {
43
- listRef.current?.scrollToIndex({ index, animated: true });
44
- }
45
- }}
46
- />
47
- <Button
48
- title="Scroll to end"
49
- onPress={() => {
50
- console.log("scrolling to end");
51
- listRef.current?.scrollToEnd({ animated: true });
52
- }}
53
- />
54
- </View>
55
- <LegendList
56
- ref={listRef}
57
- contentContainerStyle={styles.listContainer}
58
- data={data}
59
- renderItem={renderItem}
60
- keyExtractor={(item) => `id${item.id}`}
61
- estimatedItemSize={ESTIMATED_ITEM_LENGTH + 120}
62
- drawDistance={DRAW_DISTANCE}
63
- maintainVisibleContentPosition
64
- recycleItems={true}
65
- numColumns={numColumns}
66
- ListEmptyComponent={
67
- <View style={styles.listEmpty}>
68
- <Text style={{ color: "white" }}>Empty</Text>
69
- </View>
70
- }
71
- />
72
- </View>
73
- );
74
- }
75
-
76
- const styles = StyleSheet.create({
77
- listHeader: {
78
- alignSelf: "center",
79
- height: 100,
80
- width: 100,
81
- backgroundColor: "#456AAA",
82
- borderRadius: 12,
83
- marginHorizontal: 8,
84
- marginVertical: 8,
85
- },
86
- listEmpty: {
87
- flex: 1,
88
- justifyContent: "center",
89
- alignItems: "center",
90
- backgroundColor: "#6789AB",
91
- paddingVertical: 16,
92
- },
93
- outerContainer: {
94
- backgroundColor: "#456",
95
- bottom: Platform.OS === "ios" ? 82 : 0,
96
- },
97
- scrollContainer: {},
98
- listContainer: {
99
- width: 400,
100
- maxWidth: "100%",
101
- marginHorizontal: "auto",
102
- paddingBottom: 200,
103
- },
104
- searchContainer: {
105
- padding: 8,
106
- backgroundColor: "#fff",
107
- borderBottomWidth: 1,
108
- borderBottomColor: "#e0e0e0",
109
- flexDirection: "row",
110
- justifyContent: "space-between",
111
- },
112
- searchInput: {
113
- height: 40,
114
- backgroundColor: "#f5f5f5",
115
- borderRadius: 8,
116
- paddingHorizontal: 12,
117
- fontSize: 16,
118
- flexGrow: 1,
119
- },
120
- container: {
121
- flex: 1,
122
- marginTop: StatusBar.currentHeight || 0,
123
- backgroundColor: "#f5f5f5",
124
- },
125
- });
@@ -1,52 +0,0 @@
1
- import { LegendList, type LegendListRef, type LegendListRenderItemProps } from "@legendapp/list";
2
- import { useEffect, useRef } from "react";
3
- import { Text, View } from "react-native";
4
- const App = () => {
5
- const dummyData = Array.from({ length: 100 }, (_, index) => ({
6
- id: index,
7
- name: `Item ${index}`,
8
- value: Math.floor(Math.random() * 1000),
9
- isActive: Math.random() > 0.5,
10
- height: Math.floor(Math.random() * 200) + 50, // Random height between 50 and 250
11
- createdAt: new Date(Date.now() - Math.floor(Math.random() * 10000000000)).toISOString(),
12
- }));
13
- const renderItem = (props: LegendListRenderItemProps<any>) => {
14
- return (
15
- <View
16
- style={{
17
- padding: 10,
18
- backgroundColor: "#fff",
19
- borderColor: "#ddd",
20
- height: props.item.height,
21
- borderWidth: 1,
22
- borderRadius: 12,
23
- }}
24
- >
25
- <Text style={{ fontWeight: "bold" }}>{props.item.name}</Text>
26
- </View>
27
- );
28
- };
29
- const listRef = useRef<LegendListRef>(null);
30
- useEffect(() => {
31
- setTimeout(() => {
32
- listRef.current?.scrollToIndex({
33
- index: 80,
34
- animated: true,
35
- });
36
- }, 1000);
37
- }, []);
38
- return (
39
- <View style={{ flex: 1, padding: 20, backgroundColor: "gray" }}>
40
- <LegendList
41
- ref={listRef}
42
- data={dummyData}
43
- maintainVisibleContentPosition
44
- keyExtractor={(item) => `id${item.id}`}
45
- renderItem={renderItem}
46
- estimatedItemSize={25}
47
- recycleItems
48
- />
49
- </View>
50
- );
51
- };
52
- export default App;
@@ -1,128 +0,0 @@
1
- import { type Item, renderItem } from "@/app/cards-renderItem";
2
- import { DRAW_DISTANCE, ESTIMATED_ITEM_LENGTH } from "@/constants/constants";
3
- import { LegendList, type LegendListRef } from "@legendapp/list";
4
- import { useRef, useState } from "react";
5
- import { Button, Platform, StatusBar, StyleSheet, Text, View } from "react-native";
6
- import { TextInput } from "react-native-gesture-handler";
7
-
8
- interface CardsProps {
9
- numColumns?: number;
10
- }
11
-
12
- export default function AccurateScrollToHuge({ numColumns = 1 }: CardsProps) {
13
- const listRef = useRef<LegendListRef>(null);
14
-
15
- const [data, setData] = useState<Item[]>(
16
- () =>
17
- Array.from({ length: 1000 }, (_, i) => ({
18
- id: i.toString(),
19
- })) as any[],
20
- );
21
-
22
- const buttonText = useRef<string>("");
23
-
24
- return (
25
- <View style={styles.container}>
26
- <View style={styles.searchContainer}>
27
- <TextInput
28
- style={styles.searchInput}
29
- placeholder="Select item to scroll to"
30
- clearButtonMode="while-editing"
31
- autoCapitalize="none"
32
- autoCorrect={false}
33
- onChangeText={(text) => {
34
- buttonText.current = text;
35
- }}
36
- />
37
- <Button
38
- title="Scroll to item"
39
- onPress={() => {
40
- const index = Number(buttonText.current) || 0;
41
- console.log("scrolling to index", index);
42
- if (index !== -1) {
43
- listRef.current?.scrollToIndex({ index, animated: true });
44
- }
45
- }}
46
- />
47
- <Button
48
- title="Scroll to end"
49
- onPress={() => {
50
- console.log("scrolling to end");
51
- listRef.current?.scrollToEnd({ animated: true });
52
- }}
53
- />
54
- </View>
55
- <LegendList
56
- ref={listRef}
57
- contentContainerStyle={styles.listContainer}
58
- data={data}
59
- // @ts-ignore
60
- renderItem={({ item, index }) =>
61
- // @ts-ignore
62
- renderItem({ item, index, numSentences: (indexForData) => ((indexForData * 7919) % 40) + 40 })
63
- }
64
- keyExtractor={(item) => `id${item.id}`}
65
- estimatedItemSize={ESTIMATED_ITEM_LENGTH + 120}
66
- drawDistance={DRAW_DISTANCE}
67
- maintainVisibleContentPosition
68
- recycleItems={true}
69
- numColumns={numColumns}
70
- ListEmptyComponent={
71
- <View style={styles.listEmpty}>
72
- <Text style={{ color: "white" }}>Empty</Text>
73
- </View>
74
- }
75
- />
76
- </View>
77
- );
78
- }
79
-
80
- const styles = StyleSheet.create({
81
- listHeader: {
82
- alignSelf: "center",
83
- height: 100,
84
- width: 100,
85
- backgroundColor: "#456AAA",
86
- borderRadius: 12,
87
- marginHorizontal: 8,
88
- marginVertical: 8,
89
- },
90
- listEmpty: {
91
- flex: 1,
92
- justifyContent: "center",
93
- alignItems: "center",
94
- backgroundColor: "#6789AB",
95
- paddingVertical: 16,
96
- },
97
- outerContainer: {
98
- backgroundColor: "#456",
99
- bottom: Platform.OS === "ios" ? 82 : 0,
100
- },
101
- scrollContainer: {},
102
- listContainer: {
103
- width: 400,
104
- maxWidth: "100%",
105
- marginHorizontal: "auto",
106
- },
107
- searchContainer: {
108
- padding: 8,
109
- backgroundColor: "#fff",
110
- borderBottomWidth: 1,
111
- borderBottomColor: "#e0e0e0",
112
- flexDirection: "row",
113
- justifyContent: "space-between",
114
- },
115
- searchInput: {
116
- height: 40,
117
- backgroundColor: "#f5f5f5",
118
- borderRadius: 8,
119
- paddingHorizontal: 12,
120
- fontSize: 16,
121
- flexGrow: 1,
122
- },
123
- container: {
124
- flex: 1,
125
- marginTop: StatusBar.currentHeight || 0,
126
- backgroundColor: "#f5f5f5",
127
- },
128
- });
@@ -1,82 +0,0 @@
1
- import { LegendList } from "@legendapp/list";
2
- import { useState } from "react";
3
- import { Button, SafeAreaView, StyleSheet, Text, View } from "react-native";
4
-
5
- const ListComponent = () => {
6
- const [items, setItems] = useState<{ id: string; title: string }[]>([]);
7
- const [counter, setCounter] = useState(0);
8
-
9
- const addSixtyItems = () => {
10
- const newItems = [];
11
- const startIndex = counter;
12
-
13
- for (let i = 0; i < 60; i++) {
14
- newItems.push({
15
- id: `item-${startIndex + i}`,
16
-
17
- title: `Item ${startIndex + i}`,
18
- });
19
- }
20
-
21
- setItems([...items, ...newItems]);
22
- setCounter((prev) => prev + 60);
23
- };
24
-
25
- const renderItem = ({ item }: { item: { id: string; title: string } }) => (
26
- <View style={styles.itemContainer}>
27
- <Text style={styles.itemText}>{item.title}</Text>
28
- </View>
29
- );
30
-
31
- return (
32
- <SafeAreaView style={styles.safeArea}>
33
- <View style={styles.container}>
34
- <Button title="Add 60 Items" onPress={addSixtyItems} color="#4285F4" />
35
-
36
- <LegendList
37
- data={items}
38
- renderItem={renderItem}
39
- keyExtractor={(item) => item.id}
40
- style={styles.list}
41
- contentContainerStyle={styles.listContent}
42
- maintainScrollAtEnd
43
- />
44
- </View>
45
- </SafeAreaView>
46
- );
47
- };
48
-
49
- const styles = StyleSheet.create({
50
- safeArea: {
51
- flex: 1,
52
- backgroundColor: "#f5f5f5",
53
- },
54
- container: {
55
- flex: 1,
56
- padding: 16,
57
- backgroundColor: "#f5f5f5",
58
- },
59
- list: {
60
- flex: 1,
61
- marginTop: 16,
62
- },
63
- listContent: {
64
- paddingBottom: 16,
65
- },
66
- itemContainer: {
67
- backgroundColor: "white",
68
- padding: 16,
69
- marginVertical: 8,
70
- borderRadius: 8,
71
- shadowColor: "#000",
72
- shadowOffset: { width: 0, height: 1 },
73
- shadowOpacity: 0.2,
74
- shadowRadius: 1,
75
- elevation: 2,
76
- },
77
- itemText: {
78
- fontSize: 16,
79
- },
80
- });
81
-
82
- export default ListComponent;