@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
@@ -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;