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

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/index.d.mts → index.d.mts} +28 -21
  2. package/{dist/index.d.ts → index.d.ts} +28 -21
  3. package/{dist/index.js → index.js} +808 -760
  4. package/{dist/index.mjs → index.mjs} +808 -760
  5. package/{dist → integrations}/animated.d.mts +2 -1
  6. package/{dist → integrations}/animated.d.ts +2 -1
  7. package/{dist → integrations}/animated.js +2 -2
  8. package/{dist → integrations}/animated.mjs +2 -2
  9. package/{dist → integrations}/keyboard-controller.d.mts +4 -0
  10. package/{dist → integrations}/keyboard-controller.d.ts +4 -0
  11. package/{dist → integrations}/keyboard-controller.js +4 -4
  12. package/{dist → integrations}/keyboard-controller.mjs +4 -4
  13. package/{dist → integrations}/reanimated.js +7 -7
  14. package/{dist → integrations}/reanimated.mjs +7 -7
  15. package/package.json +34 -88
  16. package/.claude/settings.local.json +0 -8
  17. package/.cursor/rules/changelog.mdc +0 -60
  18. package/.github/FUNDING.yml +0 -15
  19. package/.gitignore +0 -5
  20. package/.prettierrc.json +0 -5
  21. package/.vscode/settings.json +0 -14
  22. package/CLAUDE.md +0 -126
  23. package/biome.json +0 -46
  24. package/bun.lock +0 -1289
  25. package/bunfig.toml +0 -2
  26. package/dist/CHANGELOG.md +0 -119
  27. package/dist/LICENSE +0 -21
  28. package/dist/README.md +0 -139
  29. package/dist/package.json +0 -35
  30. package/example/README.md +0 -40
  31. package/example/api/data/genres.json +0 -23
  32. package/example/api/data/playlist/10402-10749.json +0 -1
  33. package/example/api/data/playlist/10402-10770.json +0 -1
  34. package/example/api/data/playlist/10402-37.json +0 -1
  35. package/example/api/data/playlist/10749-10752.json +0 -1
  36. package/example/api/data/playlist/10749-10770.json +0 -1
  37. package/example/api/data/playlist/10749-37.json +0 -1
  38. package/example/api/data/playlist/10749-878.json +0 -1
  39. package/example/api/data/playlist/10751-10402.json +0 -1
  40. package/example/api/data/playlist/10751-10752.json +0 -1
  41. package/example/api/data/playlist/10751-37.json +0 -1
  42. package/example/api/data/playlist/10751-53.json +0 -1
  43. package/example/api/data/playlist/10751-878.json +0 -1
  44. package/example/api/data/playlist/10751-9648.json +0 -1
  45. package/example/api/data/playlist/10752-37.json +0 -1
  46. package/example/api/data/playlist/12-10402.json +0 -1
  47. package/example/api/data/playlist/12-10749.json +0 -1
  48. package/example/api/data/playlist/12-18.json +0 -1
  49. package/example/api/data/playlist/12-27.json +0 -1
  50. package/example/api/data/playlist/12-35.json +0 -1
  51. package/example/api/data/playlist/14-36.json +0 -1
  52. package/example/api/data/playlist/14-878.json +0 -1
  53. package/example/api/data/playlist/16-10751.json +0 -1
  54. package/example/api/data/playlist/16-10770.json +0 -1
  55. package/example/api/data/playlist/16-35.json +0 -1
  56. package/example/api/data/playlist/16-36.json +0 -1
  57. package/example/api/data/playlist/16-53.json +0 -1
  58. package/example/api/data/playlist/18-10751.json +0 -1
  59. package/example/api/data/playlist/18-10752.json +0 -1
  60. package/example/api/data/playlist/18-37.json +0 -1
  61. package/example/api/data/playlist/18-53.json +0 -1
  62. package/example/api/data/playlist/18-878.json +0 -1
  63. package/example/api/data/playlist/27-10749.json +0 -1
  64. package/example/api/data/playlist/27-10770.json +0 -1
  65. package/example/api/data/playlist/28-10749.json +0 -1
  66. package/example/api/data/playlist/28-10751.json +0 -1
  67. package/example/api/data/playlist/28-10770.json +0 -1
  68. package/example/api/data/playlist/28-16.json +0 -1
  69. package/example/api/data/playlist/28-18.json +0 -1
  70. package/example/api/data/playlist/28-36.json +0 -1
  71. package/example/api/data/playlist/28-37.json +0 -1
  72. package/example/api/data/playlist/28-53.json +0 -1
  73. package/example/api/data/playlist/28-80.json +0 -1
  74. package/example/api/data/playlist/28-99.json +0 -1
  75. package/example/api/data/playlist/35-10749.json +0 -1
  76. package/example/api/data/playlist/35-10751.json +0 -1
  77. package/example/api/data/playlist/35-10752.json +0 -1
  78. package/example/api/data/playlist/35-27.json +0 -1
  79. package/example/api/data/playlist/35-36.json +0 -1
  80. package/example/api/data/playlist/35-53.json +0 -1
  81. package/example/api/data/playlist/35-80.json +0 -1
  82. package/example/api/data/playlist/36-37.json +0 -1
  83. package/example/api/data/playlist/36-878.json +0 -1
  84. package/example/api/data/playlist/36-9648.json +0 -1
  85. package/example/api/data/playlist/53-10752.json +0 -1
  86. package/example/api/data/playlist/80-10770.json +0 -1
  87. package/example/api/data/playlist/80-14.json +0 -1
  88. package/example/api/data/playlist/80-18.json +0 -1
  89. package/example/api/data/playlist/80-37.json +0 -1
  90. package/example/api/data/playlist/878-37.json +0 -1
  91. package/example/api/data/playlist/9648-10770.json +0 -1
  92. package/example/api/data/playlist/9648-37.json +0 -1
  93. package/example/api/data/playlist/9648-53.json +0 -1
  94. package/example/api/data/playlist/9648-878.json +0 -1
  95. package/example/api/data/playlist/99-10749.json +0 -1
  96. package/example/api/data/playlist/99-14.json +0 -1
  97. package/example/api/data/playlist/99-18.json +0 -1
  98. package/example/api/data/playlist/99-27.json +0 -1
  99. package/example/api/data/playlist/99-53.json +0 -1
  100. package/example/api/data/playlist/99-9648.json +0 -1
  101. package/example/api/data/playlist/index.ts +0 -73
  102. package/example/api/data/rows.json +0 -1
  103. package/example/api/index.ts +0 -36
  104. package/example/app/(tabs)/_layout.tsx +0 -60
  105. package/example/app/(tabs)/cards.tsx +0 -81
  106. package/example/app/(tabs)/index.tsx +0 -205
  107. package/example/app/(tabs)/moviesL.tsx +0 -7
  108. package/example/app/(tabs)/moviesLR.tsx +0 -7
  109. package/example/app/+not-found.tsx +0 -32
  110. package/example/app/_layout.tsx +0 -34
  111. package/example/app/accurate-scrollto/index.tsx +0 -125
  112. package/example/app/accurate-scrollto-2/index.tsx +0 -52
  113. package/example/app/accurate-scrollto-huge/index.tsx +0 -128
  114. package/example/app/add-to-end/index.tsx +0 -82
  115. package/example/app/ai-chat/index.tsx +0 -236
  116. package/example/app/bidirectional-infinite-list/index.tsx +0 -133
  117. package/example/app/cards-columns/index.tsx +0 -37
  118. package/example/app/cards-flashlist/index.tsx +0 -122
  119. package/example/app/cards-flatlist/index.tsx +0 -94
  120. package/example/app/cards-no-recycle/index.tsx +0 -110
  121. package/example/app/cards-renderItem.tsx +0 -354
  122. package/example/app/chat-example/index.tsx +0 -167
  123. package/example/app/chat-infinite/index.tsx +0 -239
  124. package/example/app/chat-keyboard/index.tsx +0 -248
  125. package/example/app/chat-resize-outer/index.tsx +0 -247
  126. package/example/app/columns/index.tsx +0 -78
  127. package/example/app/countries/index.tsx +0 -182
  128. package/example/app/countries-flashlist/index.tsx +0 -163
  129. package/example/app/countries-reorder/index.tsx +0 -187
  130. package/example/app/extra-data/index.tsx +0 -86
  131. package/example/app/filter-elements/filter-data-provider.tsx +0 -55
  132. package/example/app/filter-elements/index.tsx +0 -118
  133. package/example/app/initial-scroll-index/index.tsx +0 -106
  134. package/example/app/initial-scroll-index/renderFixedItem.tsx +0 -215
  135. package/example/app/initial-scroll-index-free-height/index.tsx +0 -70
  136. package/example/app/initial-scroll-index-keyed/index.tsx +0 -62
  137. package/example/app/lazy-list/index.tsx +0 -123
  138. package/example/app/movies-flashlist/index.tsx +0 -7
  139. package/example/app/mutable-cells/index.tsx +0 -104
  140. package/example/app/video-feed/index.tsx +0 -119
  141. package/example/app.config.js +0 -22
  142. package/example/app.json +0 -45
  143. package/example/assets/fonts/SpaceMono-Regular.ttf +0 -0
  144. package/example/assets/images/adaptive-icon.png +0 -0
  145. package/example/assets/images/favicon.png +0 -0
  146. package/example/assets/images/icon.png +0 -0
  147. package/example/assets/images/partial-react-logo.png +0 -0
  148. package/example/assets/images/react-logo.png +0 -0
  149. package/example/assets/images/react-logo@2x.png +0 -0
  150. package/example/assets/images/react-logo@3x.png +0 -0
  151. package/example/assets/images/splash-icon.png +0 -0
  152. package/example/autoscroll.sh +0 -101
  153. package/example/bun.lock +0 -2266
  154. package/example/bunfig.toml +0 -2
  155. package/example/components/Breathe.tsx +0 -54
  156. package/example/components/Circle.tsx +0 -69
  157. package/example/components/Collapsible.tsx +0 -44
  158. package/example/components/ExternalLink.tsx +0 -24
  159. package/example/components/HapticTab.tsx +0 -18
  160. package/example/components/HelloWave.tsx +0 -37
  161. package/example/components/Movies.tsx +0 -179
  162. package/example/components/ParallaxScrollView.tsx +0 -81
  163. package/example/components/ThemedText.tsx +0 -60
  164. package/example/components/ThemedView.tsx +0 -14
  165. package/example/components/__tests__/ThemedText-test.tsx +0 -10
  166. package/example/components/__tests__/__snapshots__/ThemedText-test.tsx.snap +0 -24
  167. package/example/components/ui/IconSymbol.ios.tsx +0 -32
  168. package/example/components/ui/IconSymbol.tsx +0 -43
  169. package/example/components/ui/TabBarBackground.ios.tsx +0 -22
  170. package/example/components/ui/TabBarBackground.tsx +0 -6
  171. package/example/constants/Colors.ts +0 -26
  172. package/example/constants/constants.ts +0 -5
  173. package/example/constants/useScrollTest.ts +0 -19
  174. package/example/hooks/useColorScheme.ts +0 -1
  175. package/example/hooks/useColorScheme.web.ts +0 -8
  176. package/example/hooks/useThemeColor.ts +0 -22
  177. package/example/ios/.xcode.env +0 -11
  178. package/example/ios/Podfile +0 -64
  179. package/example/ios/Podfile.lock +0 -2767
  180. package/example/ios/Podfile.properties.json +0 -5
  181. package/example/ios/listtest/AppDelegate.swift +0 -70
  182. package/example/ios/listtest/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png +0 -0
  183. package/example/ios/listtest/Images.xcassets/AppIcon.appiconset/Contents.json +0 -14
  184. package/example/ios/listtest/Images.xcassets/Contents.json +0 -6
  185. package/example/ios/listtest/Images.xcassets/SplashScreenBackground.colorset/Contents.json +0 -20
  186. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/Contents.json +0 -23
  187. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image.png +0 -0
  188. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image@2x.png +0 -0
  189. package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image@3x.png +0 -0
  190. package/example/ios/listtest/Info.plist +0 -85
  191. package/example/ios/listtest/PrivacyInfo.xcprivacy +0 -48
  192. package/example/ios/listtest/SplashScreen.storyboard +0 -42
  193. package/example/ios/listtest/Supporting/Expo.plist +0 -12
  194. package/example/ios/listtest/listtest-Bridging-Header.h +0 -3
  195. package/example/ios/listtest/listtest.entitlements +0 -5
  196. package/example/ios/listtest.xcodeproj/project.pbxproj +0 -547
  197. package/example/ios/listtest.xcodeproj/xcshareddata/xcschemes/listtest.xcscheme +0 -88
  198. package/example/ios/listtest.xcworkspace/contents.xcworkspacedata +0 -10
  199. package/example/metro.config.js +0 -16
  200. package/example/package.json +0 -73
  201. package/example/scripts/reset-project.js +0 -84
  202. package/example/tsconfig.json +0 -26
  203. package/posttsup.ts +0 -24
  204. package/src/Container.tsx +0 -176
  205. package/src/Containers.tsx +0 -85
  206. package/src/ContextContainer.ts +0 -145
  207. package/src/DebugView.tsx +0 -83
  208. package/src/LazyLegendList.tsx +0 -41
  209. package/src/LeanView.tsx +0 -18
  210. package/src/LegendList.tsx +0 -558
  211. package/src/ListComponent.tsx +0 -191
  212. package/src/ScrollAdjust.tsx +0 -24
  213. package/src/ScrollAdjustHandler.ts +0 -26
  214. package/src/Separator.tsx +0 -14
  215. package/src/animated.tsx +0 -6
  216. package/src/calculateItemsInView.ts +0 -363
  217. package/src/calculateOffsetForIndex.ts +0 -23
  218. package/src/calculateOffsetWithOffsetPosition.ts +0 -26
  219. package/src/checkAllSizesKnown.ts +0 -17
  220. package/src/checkAtBottom.ts +0 -36
  221. package/src/checkAtTop.ts +0 -27
  222. package/src/checkThreshold.ts +0 -30
  223. package/src/constants.ts +0 -11
  224. package/src/createColumnWrapperStyle.ts +0 -16
  225. package/src/doInitialAllocateContainers.ts +0 -40
  226. package/src/doMaintainScrollAtEnd.ts +0 -34
  227. package/src/findAvailableContainers.ts +0 -98
  228. package/src/finishScrollTo.ts +0 -8
  229. package/src/getId.ts +0 -21
  230. package/src/getItemSize.ts +0 -52
  231. package/src/getRenderedItem.ts +0 -34
  232. package/src/getScrollVelocity.ts +0 -47
  233. package/src/handleLayout.ts +0 -70
  234. package/src/helpers.ts +0 -39
  235. package/src/index.ts +0 -11
  236. package/src/keyboard-controller.tsx +0 -63
  237. package/src/onScroll.ts +0 -66
  238. package/src/prepareMVCP.ts +0 -50
  239. package/src/reanimated.tsx +0 -63
  240. package/src/requestAdjust.ts +0 -41
  241. package/src/scrollTo.ts +0 -40
  242. package/src/scrollToIndex.ts +0 -34
  243. package/src/setDidLayout.ts +0 -25
  244. package/src/setPaddingTop.ts +0 -28
  245. package/src/state.tsx +0 -304
  246. package/src/types.ts +0 -610
  247. package/src/updateAlignItemsPaddingTop.ts +0 -18
  248. package/src/updateAllPositions.ts +0 -130
  249. package/src/updateItemSize.ts +0 -203
  250. package/src/updateTotalSize.ts +0 -44
  251. package/src/useAnimatedValue.ts +0 -6
  252. package/src/useCombinedRef.ts +0 -22
  253. package/src/useInit.ts +0 -17
  254. package/src/useSyncLayout.tsx +0 -68
  255. package/src/useValue$.ts +0 -53
  256. package/src/viewability.ts +0 -279
  257. package/tsconfig.json +0 -59
  258. package/tsup.config.ts +0 -21
  259. package/{dist → integrations}/reanimated.d.mts +1 -1
  260. package/{dist → integrations}/reanimated.d.ts +1 -1
@@ -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;