react-native-header-motion 1.0.0-alpha.0 → 1.0.0
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/README.md +65 -528
- package/lib/module/components/Bridge.js +16 -0
- package/lib/module/components/Bridge.js.map +1 -0
- package/lib/module/components/FlatList.js +5 -54
- package/lib/module/components/FlatList.js.map +1 -1
- package/lib/module/components/Header.js +71 -13
- package/lib/module/components/Header.js.map +1 -1
- package/lib/module/components/HeaderDynamic.js +34 -0
- package/lib/module/components/HeaderDynamic.js.map +1 -0
- package/lib/module/components/HeaderMotion.js +14 -20
- package/lib/module/components/HeaderMotion.js.map +1 -1
- package/lib/module/components/HeaderPanBoundary.js +54 -0
- package/lib/module/components/HeaderPanBoundary.js.map +1 -0
- package/lib/module/components/NavigationBridge.js +20 -0
- package/lib/module/components/NavigationBridge.js.map +1 -0
- package/lib/module/components/ScrollManager.js +19 -7
- package/lib/module/components/ScrollManager.js.map +1 -1
- package/lib/module/components/ScrollView.js +6 -39
- package/lib/module/components/ScrollView.js.map +1 -1
- package/lib/module/components/createHeaderMotionScrollable.js +136 -0
- package/lib/module/components/createHeaderMotionScrollable.js.map +1 -0
- package/lib/module/components/index.js +3 -1
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/context.js +8 -1
- package/lib/module/context.js.map +1 -1
- package/lib/module/hooks/index.js +1 -0
- package/lib/module/hooks/index.js.map +1 -1
- package/lib/module/hooks/useActiveScrollId.js +7 -6
- package/lib/module/hooks/useActiveScrollId.js.map +1 -1
- package/lib/module/hooks/useConsumerScrollHandlers.js +86 -0
- package/lib/module/hooks/useConsumerScrollHandlers.js.map +1 -0
- package/lib/module/hooks/useHeaderMotionBridge.js +14 -0
- package/lib/module/hooks/useHeaderMotionBridge.js.map +1 -0
- package/lib/module/hooks/useMotionProgress.js +12 -42
- package/lib/module/hooks/useMotionProgress.js.map +1 -1
- package/lib/module/hooks/useMotionProgress.test.js +56 -0
- package/lib/module/hooks/useMotionProgress.test.js.map +1 -0
- package/lib/module/hooks/useScrollManager.js +168 -87
- package/lib/module/hooks/useScrollManager.js.map +1 -1
- package/lib/module/index.js +21 -18
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/defaults.js +2 -1
- package/lib/module/utils/defaults.js.map +1 -1
- package/lib/module/utils/header.js +24 -0
- package/lib/module/utils/header.js.map +1 -0
- package/lib/module/utils/headerOffsetStyle.js +31 -0
- package/lib/module/utils/headerOffsetStyle.js.map +1 -0
- package/lib/module/utils/index.js +2 -0
- package/lib/module/utils/index.js.map +1 -1
- package/lib/typescript/docs/docusaurus.config.d.ts +4 -0
- package/lib/typescript/docs/docusaurus.config.d.ts.map +1 -0
- package/lib/typescript/docs/sidebars.d.ts +4 -0
- package/lib/typescript/docs/sidebars.d.ts.map +1 -0
- package/lib/typescript/docs/src/pages/index.d.ts +2 -0
- package/lib/typescript/docs/src/pages/index.d.ts.map +1 -0
- package/lib/typescript/src/components/Bridge.d.ts +19 -0
- package/lib/typescript/src/components/Bridge.d.ts.map +1 -0
- package/lib/typescript/src/components/FlatList.d.ts +7 -15
- package/lib/typescript/src/components/FlatList.d.ts.map +1 -1
- package/lib/typescript/src/components/Header.d.ts +73 -12
- package/lib/typescript/src/components/Header.d.ts.map +1 -1
- package/lib/typescript/src/components/HeaderDynamic.d.ts +11 -0
- package/lib/typescript/src/components/HeaderDynamic.d.ts.map +1 -0
- package/lib/typescript/src/components/HeaderMotion.d.ts +38 -23
- package/lib/typescript/src/components/HeaderMotion.d.ts.map +1 -1
- package/lib/typescript/src/components/HeaderPanBoundary.d.ts +11 -0
- package/lib/typescript/src/components/HeaderPanBoundary.d.ts.map +1 -0
- package/lib/typescript/src/components/NavigationBridge.d.ts +19 -0
- package/lib/typescript/src/components/NavigationBridge.d.ts.map +1 -0
- package/lib/typescript/src/components/ScrollManager.d.ts +13 -9
- package/lib/typescript/src/components/ScrollManager.d.ts.map +1 -1
- package/lib/typescript/src/components/ScrollView.d.ts +7 -14
- package/lib/typescript/src/components/ScrollView.d.ts.map +1 -1
- package/lib/typescript/src/components/createHeaderMotionScrollable.d.ts +86 -0
- package/lib/typescript/src/components/createHeaderMotionScrollable.d.ts.map +1 -0
- package/lib/typescript/src/components/index.d.ts +3 -1
- package/lib/typescript/src/components/index.d.ts.map +1 -1
- package/lib/typescript/src/context.d.ts +3 -17
- package/lib/typescript/src/context.d.ts.map +1 -1
- package/lib/typescript/src/hooks/index.d.ts +1 -0
- package/lib/typescript/src/hooks/index.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useActiveScrollId.d.ts +7 -6
- package/lib/typescript/src/hooks/useActiveScrollId.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useConsumerScrollHandlers.d.ts +64 -0
- package/lib/typescript/src/hooks/useConsumerScrollHandlers.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useHeaderMotionBridge.d.ts +10 -0
- package/lib/typescript/src/hooks/useHeaderMotionBridge.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useMotionProgress.d.ts +8 -25
- package/lib/typescript/src/hooks/useMotionProgress.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useMotionProgress.test.d.ts +2 -0
- package/lib/typescript/src/hooks/useMotionProgress.test.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useScrollManager.d.ts +61 -29
- package/lib/typescript/src/hooks/useScrollManager.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +56 -26
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +54 -17
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/utils/defaults.d.ts +3 -2
- package/lib/typescript/src/utils/defaults.d.ts.map +1 -1
- package/lib/typescript/src/utils/header.d.ts +10 -0
- package/lib/typescript/src/utils/header.d.ts.map +1 -0
- package/lib/typescript/src/utils/headerOffsetStyle.d.ts +19 -0
- package/lib/typescript/src/utils/headerOffsetStyle.d.ts.map +1 -0
- package/lib/typescript/src/utils/index.d.ts +2 -0
- package/lib/typescript/src/utils/index.d.ts.map +1 -1
- package/lib/typescript/src/utils/refreshControl.d.ts +12 -12
- package/package.json +12 -5
- package/src/components/Bridge.tsx +29 -0
- package/src/components/FlatList.tsx +18 -76
- package/src/components/Header.tsx +159 -23
- package/src/components/HeaderDynamic.tsx +45 -0
- package/src/components/HeaderMotion.tsx +47 -50
- package/src/components/HeaderPanBoundary.tsx +92 -0
- package/src/components/NavigationBridge.tsx +30 -0
- package/src/components/ScrollManager.tsx +23 -11
- package/src/components/ScrollView.tsx +16 -60
- package/src/components/createHeaderMotionScrollable.tsx +438 -0
- package/src/components/index.ts +3 -1
- package/src/context.ts +11 -24
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useActiveScrollId.ts +7 -6
- package/src/hooks/useConsumerScrollHandlers.ts +148 -0
- package/src/hooks/useHeaderMotionBridge.ts +15 -0
- package/src/hooks/useMotionProgress.test.ts +67 -0
- package/src/hooks/useMotionProgress.ts +12 -45
- package/src/hooks/useScrollManager.ts +251 -114
- package/src/index.ts +82 -36
- package/src/types.ts +81 -29
- package/src/utils/defaults.ts +7 -1
- package/src/utils/header.tsx +52 -0
- package/src/utils/headerOffsetStyle.ts +40 -0
- package/src/utils/index.ts +2 -0
- package/lib/module/components/HeaderBase.js +0 -107
- package/lib/module/components/HeaderBase.js.map +0 -1
- package/lib/typescript/src/components/HeaderBase.d.ts +0 -41
- package/lib/typescript/src/components/HeaderBase.d.ts.map +0 -1
- package/src/components/HeaderBase.tsx +0 -140
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { useMemo } from 'react';
|
|
2
|
-
import { Platform, StyleSheet, View, type ViewProps } from 'react-native';
|
|
3
|
-
import {
|
|
4
|
-
Gesture,
|
|
5
|
-
GestureDetector,
|
|
6
|
-
GestureHandlerRootView,
|
|
7
|
-
} from 'react-native-gesture-handler';
|
|
8
|
-
import Animated, {
|
|
9
|
-
useAnimatedReaction,
|
|
10
|
-
withDecay,
|
|
11
|
-
type AnimatedProps,
|
|
12
|
-
} from 'react-native-reanimated';
|
|
13
|
-
|
|
14
|
-
const PLATFORM_PANNING_ENABLED = Platform.select({
|
|
15
|
-
default: true,
|
|
16
|
-
android: false,
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
import type { MotionProgress } from '../types';
|
|
20
|
-
|
|
21
|
-
export type HeaderBaseProps = ViewProps;
|
|
22
|
-
export type AnimatedHeaderBaseProps = AnimatedProps<ViewProps> &
|
|
23
|
-
Pick<MotionProgress, 'animatedHeaderBaseProps'> & {
|
|
24
|
-
/**
|
|
25
|
-
* Wraps the header with GestureHandlerRootView.
|
|
26
|
-
* Keep this disabled when your app already has a root-level GestureHandlerRootView.
|
|
27
|
-
*/
|
|
28
|
-
withGestureHandlerRootView?: boolean;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Base header component with absolute positioning.
|
|
33
|
-
* Provides a foundation for building headers that need to be positioned absolutely.
|
|
34
|
-
*
|
|
35
|
-
* @example
|
|
36
|
-
* ```tsx
|
|
37
|
-
* <HeaderBase
|
|
38
|
-
* onLayout={measureTotalHeight}
|
|
39
|
-
* >
|
|
40
|
-
* ...
|
|
41
|
-
* </HeaderBase>
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
export function HeaderBase({ style, ...rest }: HeaderBaseProps) {
|
|
45
|
-
return <View style={[style, styles.container]} {...rest} />;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Animated version of HeaderBase using Reanimated's Animated.View.
|
|
50
|
-
* Use this when you need to animate the header based on scroll progress.
|
|
51
|
-
*
|
|
52
|
-
* @example
|
|
53
|
-
* ```tsx
|
|
54
|
-
* <AnimatedHeaderBase
|
|
55
|
-
* onLayout={measureTotalHeight}
|
|
56
|
-
* style={[{ paddingTop: insets.top }, animatedStyle]}
|
|
57
|
-
* >
|
|
58
|
-
* ...
|
|
59
|
-
* </AnimatedHeaderBase>
|
|
60
|
-
* ```
|
|
61
|
-
*/
|
|
62
|
-
|
|
63
|
-
// TODO: Thinking about DX, perhaps creating another context in AnimatedHeaderBase or somewhere else could make sense
|
|
64
|
-
// Note: Depending on feedback, there might be a need to intercept ongoing scroll when starting to pan (perhaps even on the tap itself but to be checked what feels better when using)
|
|
65
|
-
// Note: Depending on feedback, there might be a need to block momentum by forcing scrollTo
|
|
66
|
-
export function AnimatedHeaderBase({
|
|
67
|
-
style,
|
|
68
|
-
animatedHeaderBaseProps,
|
|
69
|
-
withGestureHandlerRootView = false,
|
|
70
|
-
...rest
|
|
71
|
-
}: AnimatedHeaderBaseProps) {
|
|
72
|
-
if (!animatedHeaderBaseProps) {
|
|
73
|
-
throw new Error(
|
|
74
|
-
'AnimatedHeaderBase requires `animatedHeaderBaseProps`. Pass the value from HeaderMotion.Header or useMotionProgress.'
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const {
|
|
79
|
-
enableHeaderPan,
|
|
80
|
-
scrollToRef,
|
|
81
|
-
headerPanMomentumOffset: momentumScrollOffset,
|
|
82
|
-
} = animatedHeaderBaseProps;
|
|
83
|
-
|
|
84
|
-
useAnimatedReaction(
|
|
85
|
-
() => momentumScrollOffset.get(),
|
|
86
|
-
(offset, prevOffset) => {
|
|
87
|
-
if (offset !== null) {
|
|
88
|
-
const dy = offset - (prevOffset ?? 0);
|
|
89
|
-
scrollToRef.current?.(dy);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
const isPanEnabled = PLATFORM_PANNING_ENABLED && enableHeaderPan;
|
|
95
|
-
|
|
96
|
-
const pan = useMemo(
|
|
97
|
-
() =>
|
|
98
|
-
Gesture.Pan()
|
|
99
|
-
.enabled(isPanEnabled)
|
|
100
|
-
.onChange((e) => {
|
|
101
|
-
const dy = e.changeY;
|
|
102
|
-
scrollToRef.current?.(dy);
|
|
103
|
-
})
|
|
104
|
-
.onEnd((e) => {
|
|
105
|
-
momentumScrollOffset.set(
|
|
106
|
-
withDecay(
|
|
107
|
-
{
|
|
108
|
-
velocity: e.velocityY,
|
|
109
|
-
},
|
|
110
|
-
() => momentumScrollOffset.set(null)
|
|
111
|
-
)
|
|
112
|
-
);
|
|
113
|
-
})
|
|
114
|
-
.shouldCancelWhenOutside(false),
|
|
115
|
-
// Note: In first testing Android works without gesture handler whatsoever. If this functionality is needed, we can further control it with a prop in the future
|
|
116
|
-
[isPanEnabled, scrollToRef, momentumScrollOffset]
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
const content = (
|
|
120
|
-
<GestureDetector gesture={pan}>
|
|
121
|
-
<Animated.View style={[style, styles.container]} {...rest} />
|
|
122
|
-
</GestureDetector>
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
if (!withGestureHandlerRootView) {
|
|
126
|
-
return content;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return <GestureHandlerRootView>{content}</GestureHandlerRootView>;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const styles = StyleSheet.create({
|
|
133
|
-
container: {
|
|
134
|
-
position: 'absolute',
|
|
135
|
-
left: 0,
|
|
136
|
-
right: 0,
|
|
137
|
-
},
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
// TODO: Lib refactor: context repetition, make people use less boilerplate by just wrapping the header with <HeaderBaseOrSomethingElse ctx={headerProps} /> that does everything under the hood (measuring total for example). That will then allow for people to use context inside
|