@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.
- package/{dist/index.d.mts → index.d.mts} +28 -21
- package/{dist/index.d.ts → index.d.ts} +28 -21
- package/{dist/index.js → index.js} +808 -760
- package/{dist/index.mjs → index.mjs} +808 -760
- package/{dist → integrations}/animated.d.mts +2 -1
- package/{dist → integrations}/animated.d.ts +2 -1
- package/{dist → integrations}/animated.js +2 -2
- package/{dist → integrations}/animated.mjs +2 -2
- package/{dist → integrations}/keyboard-controller.d.mts +4 -0
- package/{dist → integrations}/keyboard-controller.d.ts +4 -0
- package/{dist → integrations}/keyboard-controller.js +4 -4
- package/{dist → integrations}/keyboard-controller.mjs +4 -4
- package/{dist → integrations}/reanimated.js +7 -7
- package/{dist → integrations}/reanimated.mjs +7 -7
- package/package.json +34 -88
- package/.claude/settings.local.json +0 -8
- package/.cursor/rules/changelog.mdc +0 -60
- package/.github/FUNDING.yml +0 -15
- package/.gitignore +0 -5
- package/.prettierrc.json +0 -5
- package/.vscode/settings.json +0 -14
- package/CLAUDE.md +0 -126
- package/biome.json +0 -46
- package/bun.lock +0 -1289
- package/bunfig.toml +0 -2
- package/dist/CHANGELOG.md +0 -119
- package/dist/LICENSE +0 -21
- package/dist/README.md +0 -139
- package/dist/package.json +0 -35
- package/example/README.md +0 -40
- package/example/api/data/genres.json +0 -23
- package/example/api/data/playlist/10402-10749.json +0 -1
- package/example/api/data/playlist/10402-10770.json +0 -1
- package/example/api/data/playlist/10402-37.json +0 -1
- package/example/api/data/playlist/10749-10752.json +0 -1
- package/example/api/data/playlist/10749-10770.json +0 -1
- package/example/api/data/playlist/10749-37.json +0 -1
- package/example/api/data/playlist/10749-878.json +0 -1
- package/example/api/data/playlist/10751-10402.json +0 -1
- package/example/api/data/playlist/10751-10752.json +0 -1
- package/example/api/data/playlist/10751-37.json +0 -1
- package/example/api/data/playlist/10751-53.json +0 -1
- package/example/api/data/playlist/10751-878.json +0 -1
- package/example/api/data/playlist/10751-9648.json +0 -1
- package/example/api/data/playlist/10752-37.json +0 -1
- package/example/api/data/playlist/12-10402.json +0 -1
- package/example/api/data/playlist/12-10749.json +0 -1
- package/example/api/data/playlist/12-18.json +0 -1
- package/example/api/data/playlist/12-27.json +0 -1
- package/example/api/data/playlist/12-35.json +0 -1
- package/example/api/data/playlist/14-36.json +0 -1
- package/example/api/data/playlist/14-878.json +0 -1
- package/example/api/data/playlist/16-10751.json +0 -1
- package/example/api/data/playlist/16-10770.json +0 -1
- package/example/api/data/playlist/16-35.json +0 -1
- package/example/api/data/playlist/16-36.json +0 -1
- package/example/api/data/playlist/16-53.json +0 -1
- package/example/api/data/playlist/18-10751.json +0 -1
- package/example/api/data/playlist/18-10752.json +0 -1
- package/example/api/data/playlist/18-37.json +0 -1
- package/example/api/data/playlist/18-53.json +0 -1
- package/example/api/data/playlist/18-878.json +0 -1
- package/example/api/data/playlist/27-10749.json +0 -1
- package/example/api/data/playlist/27-10770.json +0 -1
- package/example/api/data/playlist/28-10749.json +0 -1
- package/example/api/data/playlist/28-10751.json +0 -1
- package/example/api/data/playlist/28-10770.json +0 -1
- package/example/api/data/playlist/28-16.json +0 -1
- package/example/api/data/playlist/28-18.json +0 -1
- package/example/api/data/playlist/28-36.json +0 -1
- package/example/api/data/playlist/28-37.json +0 -1
- package/example/api/data/playlist/28-53.json +0 -1
- package/example/api/data/playlist/28-80.json +0 -1
- package/example/api/data/playlist/28-99.json +0 -1
- package/example/api/data/playlist/35-10749.json +0 -1
- package/example/api/data/playlist/35-10751.json +0 -1
- package/example/api/data/playlist/35-10752.json +0 -1
- package/example/api/data/playlist/35-27.json +0 -1
- package/example/api/data/playlist/35-36.json +0 -1
- package/example/api/data/playlist/35-53.json +0 -1
- package/example/api/data/playlist/35-80.json +0 -1
- package/example/api/data/playlist/36-37.json +0 -1
- package/example/api/data/playlist/36-878.json +0 -1
- package/example/api/data/playlist/36-9648.json +0 -1
- package/example/api/data/playlist/53-10752.json +0 -1
- package/example/api/data/playlist/80-10770.json +0 -1
- package/example/api/data/playlist/80-14.json +0 -1
- package/example/api/data/playlist/80-18.json +0 -1
- package/example/api/data/playlist/80-37.json +0 -1
- package/example/api/data/playlist/878-37.json +0 -1
- package/example/api/data/playlist/9648-10770.json +0 -1
- package/example/api/data/playlist/9648-37.json +0 -1
- package/example/api/data/playlist/9648-53.json +0 -1
- package/example/api/data/playlist/9648-878.json +0 -1
- package/example/api/data/playlist/99-10749.json +0 -1
- package/example/api/data/playlist/99-14.json +0 -1
- package/example/api/data/playlist/99-18.json +0 -1
- package/example/api/data/playlist/99-27.json +0 -1
- package/example/api/data/playlist/99-53.json +0 -1
- package/example/api/data/playlist/99-9648.json +0 -1
- package/example/api/data/playlist/index.ts +0 -73
- package/example/api/data/rows.json +0 -1
- package/example/api/index.ts +0 -36
- package/example/app/(tabs)/_layout.tsx +0 -60
- package/example/app/(tabs)/cards.tsx +0 -81
- package/example/app/(tabs)/index.tsx +0 -205
- package/example/app/(tabs)/moviesL.tsx +0 -7
- package/example/app/(tabs)/moviesLR.tsx +0 -7
- package/example/app/+not-found.tsx +0 -32
- package/example/app/_layout.tsx +0 -34
- package/example/app/accurate-scrollto/index.tsx +0 -125
- package/example/app/accurate-scrollto-2/index.tsx +0 -52
- package/example/app/accurate-scrollto-huge/index.tsx +0 -128
- package/example/app/add-to-end/index.tsx +0 -82
- package/example/app/ai-chat/index.tsx +0 -236
- package/example/app/bidirectional-infinite-list/index.tsx +0 -133
- package/example/app/cards-columns/index.tsx +0 -37
- package/example/app/cards-flashlist/index.tsx +0 -122
- package/example/app/cards-flatlist/index.tsx +0 -94
- package/example/app/cards-no-recycle/index.tsx +0 -110
- package/example/app/cards-renderItem.tsx +0 -354
- package/example/app/chat-example/index.tsx +0 -167
- package/example/app/chat-infinite/index.tsx +0 -239
- package/example/app/chat-keyboard/index.tsx +0 -248
- package/example/app/chat-resize-outer/index.tsx +0 -247
- package/example/app/columns/index.tsx +0 -78
- package/example/app/countries/index.tsx +0 -182
- package/example/app/countries-flashlist/index.tsx +0 -163
- package/example/app/countries-reorder/index.tsx +0 -187
- package/example/app/extra-data/index.tsx +0 -86
- package/example/app/filter-elements/filter-data-provider.tsx +0 -55
- package/example/app/filter-elements/index.tsx +0 -118
- package/example/app/initial-scroll-index/index.tsx +0 -106
- package/example/app/initial-scroll-index/renderFixedItem.tsx +0 -215
- package/example/app/initial-scroll-index-free-height/index.tsx +0 -70
- package/example/app/initial-scroll-index-keyed/index.tsx +0 -62
- package/example/app/lazy-list/index.tsx +0 -123
- package/example/app/movies-flashlist/index.tsx +0 -7
- package/example/app/mutable-cells/index.tsx +0 -104
- package/example/app/video-feed/index.tsx +0 -119
- package/example/app.config.js +0 -22
- package/example/app.json +0 -45
- package/example/assets/fonts/SpaceMono-Regular.ttf +0 -0
- package/example/assets/images/adaptive-icon.png +0 -0
- package/example/assets/images/favicon.png +0 -0
- package/example/assets/images/icon.png +0 -0
- package/example/assets/images/partial-react-logo.png +0 -0
- package/example/assets/images/react-logo.png +0 -0
- package/example/assets/images/react-logo@2x.png +0 -0
- package/example/assets/images/react-logo@3x.png +0 -0
- package/example/assets/images/splash-icon.png +0 -0
- package/example/autoscroll.sh +0 -101
- package/example/bun.lock +0 -2266
- package/example/bunfig.toml +0 -2
- package/example/components/Breathe.tsx +0 -54
- package/example/components/Circle.tsx +0 -69
- package/example/components/Collapsible.tsx +0 -44
- package/example/components/ExternalLink.tsx +0 -24
- package/example/components/HapticTab.tsx +0 -18
- package/example/components/HelloWave.tsx +0 -37
- package/example/components/Movies.tsx +0 -179
- package/example/components/ParallaxScrollView.tsx +0 -81
- package/example/components/ThemedText.tsx +0 -60
- package/example/components/ThemedView.tsx +0 -14
- package/example/components/__tests__/ThemedText-test.tsx +0 -10
- package/example/components/__tests__/__snapshots__/ThemedText-test.tsx.snap +0 -24
- package/example/components/ui/IconSymbol.ios.tsx +0 -32
- package/example/components/ui/IconSymbol.tsx +0 -43
- package/example/components/ui/TabBarBackground.ios.tsx +0 -22
- package/example/components/ui/TabBarBackground.tsx +0 -6
- package/example/constants/Colors.ts +0 -26
- package/example/constants/constants.ts +0 -5
- package/example/constants/useScrollTest.ts +0 -19
- package/example/hooks/useColorScheme.ts +0 -1
- package/example/hooks/useColorScheme.web.ts +0 -8
- package/example/hooks/useThemeColor.ts +0 -22
- package/example/ios/.xcode.env +0 -11
- package/example/ios/Podfile +0 -64
- package/example/ios/Podfile.lock +0 -2767
- package/example/ios/Podfile.properties.json +0 -5
- package/example/ios/listtest/AppDelegate.swift +0 -70
- package/example/ios/listtest/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png +0 -0
- package/example/ios/listtest/Images.xcassets/AppIcon.appiconset/Contents.json +0 -14
- package/example/ios/listtest/Images.xcassets/Contents.json +0 -6
- package/example/ios/listtest/Images.xcassets/SplashScreenBackground.colorset/Contents.json +0 -20
- package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/Contents.json +0 -23
- package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image.png +0 -0
- package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image@2x.png +0 -0
- package/example/ios/listtest/Images.xcassets/SplashScreenLogo.imageset/image@3x.png +0 -0
- package/example/ios/listtest/Info.plist +0 -85
- package/example/ios/listtest/PrivacyInfo.xcprivacy +0 -48
- package/example/ios/listtest/SplashScreen.storyboard +0 -42
- package/example/ios/listtest/Supporting/Expo.plist +0 -12
- package/example/ios/listtest/listtest-Bridging-Header.h +0 -3
- package/example/ios/listtest/listtest.entitlements +0 -5
- package/example/ios/listtest.xcodeproj/project.pbxproj +0 -547
- package/example/ios/listtest.xcodeproj/xcshareddata/xcschemes/listtest.xcscheme +0 -88
- package/example/ios/listtest.xcworkspace/contents.xcworkspacedata +0 -10
- package/example/metro.config.js +0 -16
- package/example/package.json +0 -73
- package/example/scripts/reset-project.js +0 -84
- package/example/tsconfig.json +0 -26
- package/posttsup.ts +0 -24
- package/src/Container.tsx +0 -176
- package/src/Containers.tsx +0 -85
- package/src/ContextContainer.ts +0 -145
- package/src/DebugView.tsx +0 -83
- package/src/LazyLegendList.tsx +0 -41
- package/src/LeanView.tsx +0 -18
- package/src/LegendList.tsx +0 -558
- package/src/ListComponent.tsx +0 -191
- package/src/ScrollAdjust.tsx +0 -24
- package/src/ScrollAdjustHandler.ts +0 -26
- package/src/Separator.tsx +0 -14
- package/src/animated.tsx +0 -6
- package/src/calculateItemsInView.ts +0 -363
- package/src/calculateOffsetForIndex.ts +0 -23
- package/src/calculateOffsetWithOffsetPosition.ts +0 -26
- package/src/checkAllSizesKnown.ts +0 -17
- package/src/checkAtBottom.ts +0 -36
- package/src/checkAtTop.ts +0 -27
- package/src/checkThreshold.ts +0 -30
- package/src/constants.ts +0 -11
- package/src/createColumnWrapperStyle.ts +0 -16
- package/src/doInitialAllocateContainers.ts +0 -40
- package/src/doMaintainScrollAtEnd.ts +0 -34
- package/src/findAvailableContainers.ts +0 -98
- package/src/finishScrollTo.ts +0 -8
- package/src/getId.ts +0 -21
- package/src/getItemSize.ts +0 -52
- package/src/getRenderedItem.ts +0 -34
- package/src/getScrollVelocity.ts +0 -47
- package/src/handleLayout.ts +0 -70
- package/src/helpers.ts +0 -39
- package/src/index.ts +0 -11
- package/src/keyboard-controller.tsx +0 -63
- package/src/onScroll.ts +0 -66
- package/src/prepareMVCP.ts +0 -50
- package/src/reanimated.tsx +0 -63
- package/src/requestAdjust.ts +0 -41
- package/src/scrollTo.ts +0 -40
- package/src/scrollToIndex.ts +0 -34
- package/src/setDidLayout.ts +0 -25
- package/src/setPaddingTop.ts +0 -28
- package/src/state.tsx +0 -304
- package/src/types.ts +0 -610
- package/src/updateAlignItemsPaddingTop.ts +0 -18
- package/src/updateAllPositions.ts +0 -130
- package/src/updateItemSize.ts +0 -203
- package/src/updateTotalSize.ts +0 -44
- package/src/useAnimatedValue.ts +0 -6
- package/src/useCombinedRef.ts +0 -22
- package/src/useInit.ts +0 -17
- package/src/useSyncLayout.tsx +0 -68
- package/src/useValue$.ts +0 -53
- package/src/viewability.ts +0 -279
- package/tsconfig.json +0 -59
- package/tsup.config.ts +0 -21
- package/{dist → integrations}/reanimated.d.mts +1 -1
- 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,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
|
-
});
|
package/example/app/_layout.tsx
DELETED
|
@@ -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;
|