react-native-header-motion 0.4.0 → 1.0.0-beta.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 +400 -335
- package/lib/module/components/Bridge.js +16 -0
- package/lib/module/components/Bridge.js.map +1 -0
- package/lib/module/components/FlatList.js +5 -62
- 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 +59 -23
- 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 +7 -5
- package/lib/module/components/ScrollManager.js.map +1 -1
- package/lib/module/components/ScrollView.js +6 -47
- 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/useHeaderMotionBridge.js +14 -0
- package/lib/module/hooks/useHeaderMotionBridge.js.map +1 -0
- package/lib/module/hooks/useMotionProgress.js +10 -36
- 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 +219 -109
- 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 +3 -0
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/utils/refreshControl.js +93 -0
- package/lib/module/utils/refreshControl.js.map +1 -0
- package/lib/module/utils/values.js +36 -0
- package/lib/module/utils/values.js.map +1 -1
- 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 +37 -18
- 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 +18 -25
- 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 -13
- 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/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 +63 -31
- 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 +63 -15
- 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 +3 -0
- package/lib/typescript/src/utils/index.d.ts.map +1 -1
- package/lib/typescript/src/utils/refreshControl.d.ts +150 -0
- package/lib/typescript/src/utils/refreshControl.d.ts.map +1 -0
- package/lib/typescript/src/utils/values.d.ts +4 -1
- package/lib/typescript/src/utils/values.d.ts.map +1 -1
- package/package.json +13 -5
- package/src/components/Bridge.tsx +29 -0
- package/src/components/FlatList.tsx +18 -84
- package/src/components/Header.tsx +159 -23
- package/src/components/HeaderDynamic.tsx +45 -0
- package/src/components/HeaderMotion.tsx +114 -41
- package/src/components/HeaderPanBoundary.tsx +92 -0
- package/src/components/NavigationBridge.tsx +30 -0
- package/src/components/ScrollManager.tsx +38 -43
- package/src/components/ScrollView.tsx +16 -68
- package/src/components/createHeaderMotionScrollable.tsx +438 -0
- package/src/components/index.ts +3 -1
- package/src/context.ts +12 -18
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useActiveScrollId.ts +7 -6
- package/src/hooks/useHeaderMotionBridge.ts +15 -0
- package/src/hooks/useMotionProgress.test.ts +67 -0
- package/src/hooks/useMotionProgress.ts +12 -37
- package/src/hooks/useScrollManager.ts +310 -129
- package/src/index.ts +82 -36
- package/src/types.ts +85 -25
- 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 +3 -0
- package/src/utils/refreshControl.tsx +118 -0
- package/src/utils/values.ts +57 -1
- package/lib/module/components/HeaderBase.js +0 -59
- package/lib/module/components/HeaderBase.js.map +0 -1
- package/lib/module/hooks/refreshControl.js +0 -31
- package/lib/module/hooks/refreshControl.js.map +0 -1
- package/lib/typescript/src/components/HeaderBase.d.ts +0 -34
- package/lib/typescript/src/components/HeaderBase.d.ts.map +0 -1
- package/lib/typescript/src/hooks/refreshControl.d.ts +0 -13
- package/lib/typescript/src/hooks/refreshControl.d.ts.map +0 -1
- package/src/components/HeaderBase.tsx +0 -51
- package/src/hooks/refreshControl.ts +0 -55
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useHeaderMotionBridge } from "../hooks/useHeaderMotionBridge.js";
|
|
4
|
+
/**
|
|
5
|
+
* Reads the current HeaderMotion context and exposes it through a render
|
|
6
|
+
* function so it can be forwarded into another subtree.
|
|
7
|
+
*/
|
|
8
|
+
export function Bridge({
|
|
9
|
+
children
|
|
10
|
+
}) {
|
|
11
|
+
if (typeof children !== 'function') {
|
|
12
|
+
throw new Error('HeaderMotion.Bridge only accepts a render function as its child.');
|
|
13
|
+
}
|
|
14
|
+
return children(useHeaderMotionBridge());
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=Bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useHeaderMotionBridge","Bridge","children","Error"],"sourceRoot":"../../../src","sources":["components/Bridge.tsx"],"mappings":";;AAAA,SAASA,qBAAqB,QAAQ,mCAAgC;AAgBtE;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAAC;EAAEC;AAAkC,CAAC,EAAE;EAC5D,IAAI,OAAOA,QAAQ,KAAK,UAAU,EAAE;IAClC,MAAM,IAAIC,KAAK,CACb,kEACF,CAAC;EACH;EAEA,OAAOD,QAAQ,CAACF,qBAAqB,CAAC,CAAC,CAAC;AAC1C","ignoreList":[]}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { forwardRef } from 'react';
|
|
4
3
|
import Animated from 'react-native-reanimated';
|
|
5
|
-
import {
|
|
6
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
4
|
+
import { createHeaderMotionScrollable } from "./createHeaderMotionScrollable.js";
|
|
7
5
|
/**
|
|
8
6
|
* Animated FlatList component that integrates with HeaderMotion.
|
|
9
7
|
* Automatically handles scroll tracking and header animation synchronization.
|
|
@@ -21,64 +19,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
21
19
|
* </HeaderMotion>
|
|
22
20
|
* ```
|
|
23
21
|
*/
|
|
24
|
-
export
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
onScroll,
|
|
29
|
-
onScrollBeginDrag,
|
|
30
|
-
onScrollEndDrag,
|
|
31
|
-
onMomentumScrollBegin,
|
|
32
|
-
onMomentumScrollEnd,
|
|
33
|
-
...props
|
|
34
|
-
}) {
|
|
35
|
-
return /*#__PURE__*/_jsx(HeaderMotionScrollManager, {
|
|
36
|
-
scrollId: scrollId,
|
|
37
|
-
animatedRef: animatedRef,
|
|
38
|
-
refreshControl: props.refreshControl,
|
|
39
|
-
refreshing: props.refreshing,
|
|
40
|
-
onRefresh: props.onRefresh,
|
|
41
|
-
progressViewOffset: props.progressViewOffset,
|
|
42
|
-
onScroll: onScroll,
|
|
43
|
-
onScrollBeginDrag: onScrollBeginDrag,
|
|
44
|
-
onScrollEndDrag: onScrollEndDrag,
|
|
45
|
-
onMomentumScrollBegin: onMomentumScrollBegin,
|
|
46
|
-
onMomentumScrollEnd: onMomentumScrollEnd,
|
|
47
|
-
children: ({
|
|
48
|
-
onScroll: managedOnScroll,
|
|
49
|
-
refreshControl: managedRefreshControl,
|
|
50
|
-
...scrollViewProps
|
|
51
|
-
}, {
|
|
52
|
-
originalHeaderHeight,
|
|
53
|
-
minHeightContentContainerStyle
|
|
54
|
-
}) => /*#__PURE__*/_jsx(Animated.FlatList, {
|
|
55
|
-
...scrollViewProps,
|
|
56
|
-
...props,
|
|
57
|
-
onScroll: managedOnScroll,
|
|
58
|
-
...(managedRefreshControl && {
|
|
59
|
-
refreshControl: managedRefreshControl
|
|
60
|
-
}),
|
|
61
|
-
renderScrollComponent: scrollComponentProps => /*#__PURE__*/_jsx(AnimatedScrollContainer, {
|
|
62
|
-
...scrollComponentProps,
|
|
63
|
-
contentContainerStyle: [minHeightContentContainerStyle, {
|
|
64
|
-
paddingTop: originalHeaderHeight
|
|
65
|
-
}, contentContainerStyle]
|
|
66
|
-
})
|
|
67
|
-
})
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
const AnimatedScrollContainer = /*#__PURE__*/forwardRef(({
|
|
71
|
-
children,
|
|
72
|
-
contentContainerStyle,
|
|
73
|
-
...rest
|
|
74
|
-
}, ref) => {
|
|
75
|
-
return /*#__PURE__*/_jsx(Animated.ScrollView, {
|
|
76
|
-
...rest,
|
|
77
|
-
ref: ref,
|
|
78
|
-
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
79
|
-
style: contentContainerStyle,
|
|
80
|
-
children: children
|
|
81
|
-
})
|
|
82
|
-
});
|
|
22
|
+
export const FlatList = createHeaderMotionScrollable(Animated.FlatList, {
|
|
23
|
+
displayName: 'HeaderMotion.FlatList',
|
|
24
|
+
contentContainerMode: 'renderScrollComponent',
|
|
25
|
+
isComponentAnimated: true
|
|
83
26
|
});
|
|
84
27
|
//# sourceMappingURL=FlatList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["Animated","createHeaderMotionScrollable","FlatList","displayName","contentContainerMode","isComponentAnimated"],"sourceRoot":"../../../src","sources":["components/FlatList.tsx"],"mappings":";;AACA,OAAOA,QAAQ,MAER,yBAAyB;AAChC,SACEC,4BAA4B,QAEvB,mCAAgC;AASvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,QAAQ,GAAGD,4BAA4B,CAACD,QAAQ,CAACE,QAAQ,EAAE;EACtEC,WAAW,EAAE,uBAAuB;EACpCC,oBAAoB,EAAE,uBAAuB;EAC7CC,mBAAmB,EAAE;AACvB,CAAC,CAAsB","ignoreList":[]}
|
|
@@ -1,19 +1,77 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { StyleSheet } from 'react-native';
|
|
4
|
+
import Animated from 'react-native-reanimated';
|
|
5
|
+
import { useHeaderMotionContextOrThrow } from "../context.js";
|
|
6
|
+
import { cloneWithOnLayout, composeOnLayoutHandlers, resolveSlottableChild } from "../utils/index.js";
|
|
7
|
+
import { HeaderDynamic } from "./HeaderDynamic.js";
|
|
8
|
+
import { HeaderPanBoundary } from "./HeaderPanBoundary.js";
|
|
9
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
|
+
const headerOverlayStyle = StyleSheet.create({
|
|
11
|
+
overlay: {
|
|
12
|
+
position: 'absolute',
|
|
13
|
+
top: 0,
|
|
14
|
+
left: 0,
|
|
15
|
+
right: 0
|
|
16
|
+
}
|
|
17
|
+
}).overlay;
|
|
18
|
+
function HeaderRoot(props) {
|
|
19
|
+
const ctxValue = useHeaderMotionContextOrThrow('HeaderMotion.Header must be used within <HeaderMotion /> or <HeaderMotion.NavigationBridge />. If you are rendering inside a navigation header, bridge the context with <HeaderMotion.Bridge /> and <HeaderMotion.NavigationBridge />.');
|
|
20
|
+
if (props.asChild) {
|
|
21
|
+
const child = resolveSlottableChild('HeaderMotion.Header', props.children);
|
|
22
|
+
return /*#__PURE__*/_jsx(HeaderPanBoundary, {
|
|
23
|
+
pannable: props.pannable,
|
|
24
|
+
panDecayConfig: props.panDecayConfig,
|
|
25
|
+
headerPanMomentumOffset: ctxValue.headerPanMomentumOffset,
|
|
26
|
+
scrollToRef: ctxValue.scrollToRef,
|
|
27
|
+
withGestureHandlerRootView: props.withGestureHandlerRootView,
|
|
28
|
+
children: cloneWithOnLayout(child, ctxValue.measureTotalHeight, 'HeaderMotion.Header')
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const {
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
33
|
+
asChild: _asChild,
|
|
34
|
+
overlay = true,
|
|
35
|
+
pannable,
|
|
36
|
+
panDecayConfig,
|
|
37
|
+
onLayout,
|
|
38
|
+
style,
|
|
39
|
+
withGestureHandlerRootView,
|
|
40
|
+
...rest
|
|
41
|
+
} = props;
|
|
42
|
+
const resolvedOnLayout = onLayout;
|
|
43
|
+
return /*#__PURE__*/_jsx(HeaderPanBoundary, {
|
|
44
|
+
pannable: pannable,
|
|
45
|
+
panDecayConfig: panDecayConfig,
|
|
46
|
+
headerPanMomentumOffset: ctxValue.headerPanMomentumOffset,
|
|
47
|
+
scrollToRef: ctxValue.scrollToRef,
|
|
48
|
+
withGestureHandlerRootView: withGestureHandlerRootView,
|
|
49
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
50
|
+
...rest,
|
|
51
|
+
onLayout: composeOnLayoutHandlers(resolvedOnLayout, ctxValue.measureTotalHeight),
|
|
52
|
+
style: [overlay ? headerOverlayStyle : undefined, style]
|
|
53
|
+
})
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
4
57
|
/**
|
|
5
|
-
* Header
|
|
6
|
-
* Must be used within a HeaderMotion component.
|
|
58
|
+
* Header container that measures the total header height for scroll offsetting.
|
|
7
59
|
*
|
|
8
|
-
*
|
|
60
|
+
* It renders an `Animated.View` by default, wires the outer header measurement
|
|
61
|
+
* automatically, and can optionally make the header surface pannable.
|
|
62
|
+
*
|
|
63
|
+
* Pair it with `Header.Dynamic` to mark the part of the header that should
|
|
64
|
+
* drive the collapse threshold.
|
|
9
65
|
*/
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
66
|
+
export const Header = Object.assign(HeaderRoot, {
|
|
67
|
+
/**
|
|
68
|
+
* Marks the part of the header whose measured layout should define the
|
|
69
|
+
* collapsible distance.
|
|
70
|
+
*
|
|
71
|
+
* In most designs, this is the section that visually disappears while the
|
|
72
|
+
* header collapses. Its measured value feeds `measureDynamic`, which can in
|
|
73
|
+
* turn drive `progressThreshold`.
|
|
74
|
+
*/
|
|
75
|
+
Dynamic: HeaderDynamic
|
|
76
|
+
});
|
|
19
77
|
//# sourceMappingURL=Header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["StyleSheet","Animated","useHeaderMotionContextOrThrow","cloneWithOnLayout","composeOnLayoutHandlers","resolveSlottableChild","HeaderDynamic","HeaderPanBoundary","jsx","_jsx","headerOverlayStyle","create","overlay","position","top","left","right","HeaderRoot","props","ctxValue","asChild","child","children","pannable","panDecayConfig","headerPanMomentumOffset","scrollToRef","withGestureHandlerRootView","measureTotalHeight","_asChild","onLayout","style","rest","resolvedOnLayout","View","undefined","Header","Object","assign","Dynamic"],"sourceRoot":"../../../src","sources":["components/Header.tsx"],"mappings":";;AAAA,SAASA,UAAU,QAAwB,cAAc;AACzD,OAAOC,QAAQ,MAAM,yBAAyB;AAC9C,SAASC,6BAA6B,QAAQ,eAAY;AAM1D,SACEC,iBAAiB,EACjBC,uBAAuB,EACvBC,qBAAqB,QAChB,mBAAU;AACjB,SAASC,aAAa,QAAQ,oBAAiB;AAC/C,SAASC,iBAAiB,QAAQ,wBAAqB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAiExD,MAAMC,kBAAkB,GAAGV,UAAU,CAACW,MAAM,CAAC;EAC3CC,OAAO,EAAE;IACPC,QAAQ,EAAE,UAAU;IACpBC,GAAG,EAAE,CAAC;IACNC,IAAI,EAAE,CAAC;IACPC,KAAK,EAAE;EACT;AACF,CAAC,CAAC,CAACJ,OAAO;AAEV,SAASK,UAAUA,CAACC,KAAkB,EAAE;EACtC,MAAMC,QAAQ,GAAGjB,6BAA6B,CAC5C,wOACF,CAAC;EAED,IAAIgB,KAAK,CAACE,OAAO,EAAE;IACjB,MAAMC,KAAK,GAAGhB,qBAAqB,CAAC,qBAAqB,EAAEa,KAAK,CAACI,QAAQ,CAAC;IAE1E,oBACEb,IAAA,CAACF,iBAAiB;MAChBgB,QAAQ,EAAEL,KAAK,CAACK,QAAS;MACzBC,cAAc,EAAEN,KAAK,CAACM,cAAe;MACrCC,uBAAuB,EAAEN,QAAQ,CAACM,uBAAwB;MAC1DC,WAAW,EAAEP,QAAQ,CAACO,WAAY;MAClCC,0BAA0B,EAAET,KAAK,CAACS,0BAA2B;MAAAL,QAAA,EAE5DnB,iBAAiB,CAChBkB,KAAK,EACLF,QAAQ,CAACS,kBAAkB,EAC3B,qBACF;IAAC,CACgB,CAAC;EAExB;EAEA,MAAM;IACJ;IACAR,OAAO,EAAES,QAAQ;IACjBjB,OAAO,GAAG,IAAI;IACdW,QAAQ;IACRC,cAAc;IACdM,QAAQ;IACRC,KAAK;IACLJ,0BAA0B;IAC1B,GAAGK;EACL,CAAC,GAAGd,KAAK;EACT,MAAMe,gBAAgB,GAAGH,QAA6C;EAEtE,oBACErB,IAAA,CAACF,iBAAiB;IAChBgB,QAAQ,EAAEA,QAAS;IACnBC,cAAc,EAAEA,cAAe;IAC/BC,uBAAuB,EAAEN,QAAQ,CAACM,uBAAwB;IAC1DC,WAAW,EAAEP,QAAQ,CAACO,WAAY;IAClCC,0BAA0B,EAAEA,0BAA2B;IAAAL,QAAA,eAEvDb,IAAA,CAACR,QAAQ,CAACiC,IAAI;MAAA,GACRF,IAAI;MACRF,QAAQ,EAAE1B,uBAAuB,CAC/B6B,gBAAgB,EAChBd,QAAQ,CAACS,kBACX,CAAE;MACFG,KAAK,EAAE,CAACnB,OAAO,GAAGF,kBAAkB,GAAGyB,SAAS,EAAEJ,KAAK;IAAE,CAC1D;EAAC,CACe,CAAC;AAExB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMK,MAAM,GAAGC,MAAM,CAACC,MAAM,CAACrB,UAAU,EAAE;EAC9C;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEsB,OAAO,EAAEjC;AACX,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import Animated from 'react-native-reanimated';
|
|
4
|
+
import { useHeaderMotionContextOrThrow } from "../context.js";
|
|
5
|
+
import { cloneWithOnLayout, composeOnLayoutHandlers, resolveSlottableChild } from "../utils/index.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Marks the part of the header whose layout should define the collapsible
|
|
9
|
+
* distance.
|
|
10
|
+
*
|
|
11
|
+
* In most designs, this is the section that visually disappears while the
|
|
12
|
+
* header collapses. Its measured value feeds `measureDynamic`, which in turn
|
|
13
|
+
* can drive `progressThreshold`.
|
|
14
|
+
*/
|
|
15
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
|
+
export function HeaderDynamic(props) {
|
|
17
|
+
const ctxValue = useHeaderMotionContextOrThrow('HeaderMotion.Header.Dynamic must be used within <HeaderMotion /> or <HeaderMotion.NavigationBridge />. If you are rendering inside a navigation header, bridge the context with <HeaderMotion.Bridge /> and <HeaderMotion.NavigationBridge />.');
|
|
18
|
+
if (props.asChild) {
|
|
19
|
+
return cloneWithOnLayout(resolveSlottableChild('HeaderMotion.Header.Dynamic', props.children), ctxValue.measureDynamic, 'HeaderMotion.Header.Dynamic');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
23
|
+
const {
|
|
24
|
+
asChild: _asChild,
|
|
25
|
+
onLayout,
|
|
26
|
+
...rest
|
|
27
|
+
} = props;
|
|
28
|
+
const resolvedOnLayout = onLayout;
|
|
29
|
+
return /*#__PURE__*/_jsx(Animated.View, {
|
|
30
|
+
...rest,
|
|
31
|
+
onLayout: composeOnLayoutHandlers(resolvedOnLayout, ctxValue.measureDynamic)
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=HeaderDynamic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Animated","useHeaderMotionContextOrThrow","cloneWithOnLayout","composeOnLayoutHandlers","resolveSlottableChild","jsx","_jsx","HeaderDynamic","props","ctxValue","asChild","children","measureDynamic","_asChild","onLayout","rest","resolvedOnLayout","View"],"sourceRoot":"../../../src","sources":["components/HeaderDynamic.tsx"],"mappings":";;AACA,OAAOA,QAAQ,MAAM,yBAAyB;AAC9C,SAASC,6BAA6B,QAAQ,eAAY;AAE1D,SACEC,iBAAiB,EACjBC,uBAAuB,EACvBC,qBAAqB,QAChB,mBAAU;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAPA,SAAAC,GAAA,IAAAC,IAAA;AAQA,OAAO,SAASC,aAAaA,CAACC,KAAyB,EAAE;EACvD,MAAMC,QAAQ,GAAGR,6BAA6B,CAC5C,gPACF,CAAC;EAED,IAAIO,KAAK,CAACE,OAAO,EAAE;IACjB,OAAOR,iBAAiB,CACtBE,qBAAqB,CAAC,6BAA6B,EAAEI,KAAK,CAACG,QAAQ,CAAC,EACpEF,QAAQ,CAACG,cAAc,EACvB,6BACF,CAAC;EACH;;EAEA;EACA,MAAM;IAAEF,OAAO,EAAEG,QAAQ;IAAEC,QAAQ;IAAE,GAAGC;EAAK,CAAC,GAAGP,KAAK;EACtD,MAAMQ,gBAAgB,GAAGF,QAA6C;EAEtE,oBACER,IAAA,CAACN,QAAQ,CAACiB,IAAI;IAAA,GACRF,IAAI;IACRD,QAAQ,EAAEX,uBAAuB,CAC/Ba,gBAAgB,EAChBP,QAAQ,CAACG,cACX;EAAE,CACH,CAAC;AAEN","ignoreList":[]}
|
|
@@ -1,13 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { useCallback, useMemo, useState } from 'react';
|
|
3
|
+
import { useCallback, useRef, useEffect, useMemo, useState } from 'react';
|
|
4
4
|
import { Extrapolation, interpolate, useAnimatedReaction, useDerivedValue, useSharedValue } from 'react-native-reanimated';
|
|
5
5
|
import { HeaderMotionContext } from "../context.js";
|
|
6
6
|
import { DEFAULT_MEASURE_DYNAMIC, DEFAULT_PROGRESS_THRESHOLD, DEFAULT_SCROLL_ID, getInitialScrollValue } from "../utils/index.js";
|
|
7
7
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
const resolveScrollIdForProgress = (scrollValues, activeScrollIdValue) => {
|
|
9
|
+
'worklet';
|
|
10
|
+
|
|
11
|
+
if (activeScrollIdValue) {
|
|
12
|
+
return activeScrollIdValue;
|
|
13
|
+
}
|
|
14
|
+
let onlyNonDefaultId = null;
|
|
15
|
+
for (const key in scrollValues) {
|
|
16
|
+
if (key === DEFAULT_SCROLL_ID) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (onlyNonDefaultId !== null) {
|
|
20
|
+
return DEFAULT_SCROLL_ID;
|
|
21
|
+
}
|
|
22
|
+
onlyNonDefaultId = key;
|
|
23
|
+
}
|
|
24
|
+
return onlyNonDefaultId ?? DEFAULT_SCROLL_ID;
|
|
25
|
+
};
|
|
8
26
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
27
|
+
* Root provider for a header-motion setup.
|
|
28
|
+
*
|
|
29
|
+
* It tracks the measured header layout, the active scroll position, and the
|
|
30
|
+
* derived `progress` shared value consumed by your animated header UI.
|
|
31
|
+
*
|
|
11
32
|
* @template T - The type of scroll ID string
|
|
12
33
|
*/
|
|
13
34
|
function HeaderMotionContextProvider({
|
|
@@ -18,26 +39,32 @@ function HeaderMotionContextProvider({
|
|
|
18
39
|
progressExtrapolation = Extrapolation.CLAMP,
|
|
19
40
|
children
|
|
20
41
|
}) {
|
|
21
|
-
const
|
|
42
|
+
const dynamicMeasurement = useSharedValue(undefined);
|
|
22
43
|
const [originalHeaderHeight, setOriginalHeaderHeight] = useState(0);
|
|
44
|
+
const progressThresholdValue = useSharedValue(typeof progressThreshold === 'number' ? progressThreshold : Infinity);
|
|
45
|
+
const headerPanMomentumOffset = useSharedValue(null);
|
|
23
46
|
const setOrUpdateDynamicMeasurement = useCallback(e => {
|
|
47
|
+
const prevMeasurement = dynamicMeasurement.get();
|
|
48
|
+
if (prevMeasurement !== undefined && measureDynamicMode === 'mount') {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
24
51
|
const measured = measureDynamic(e);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return prevMeasurement;
|
|
28
|
-
}
|
|
29
|
-
return measured;
|
|
30
|
-
});
|
|
31
|
-
}, [measureDynamicMode, measureDynamic, setDynamicMeasurement]);
|
|
32
|
-
const calculatedProgressThreshold = useMemo(() => {
|
|
33
|
-
if (typeof progressThreshold === 'number') {
|
|
34
|
-
return progressThreshold;
|
|
52
|
+
if (prevMeasurement === measured) {
|
|
53
|
+
return;
|
|
35
54
|
}
|
|
36
|
-
|
|
37
|
-
|
|
55
|
+
dynamicMeasurement.set(measured);
|
|
56
|
+
const nextThreshold = typeof progressThreshold === 'number' ? progressThreshold : progressThreshold(measured);
|
|
57
|
+
progressThresholdValue.set(nextThreshold);
|
|
58
|
+
}, [measureDynamicMode, measureDynamic, dynamicMeasurement, progressThreshold, progressThresholdValue]);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
if (typeof progressThreshold === 'number') {
|
|
61
|
+
progressThresholdValue.set(progressThreshold);
|
|
62
|
+
return;
|
|
38
63
|
}
|
|
39
|
-
|
|
40
|
-
|
|
64
|
+
const measured = dynamicMeasurement.get();
|
|
65
|
+
const nextThreshold = measured === undefined ? Infinity : progressThreshold(measured);
|
|
66
|
+
progressThresholdValue.set(nextThreshold);
|
|
67
|
+
}, [progressThreshold, dynamicMeasurement, progressThresholdValue]);
|
|
41
68
|
const measureTotalHeight = useCallback(e => {
|
|
42
69
|
const measuredValue = e.nativeEvent.layout.height;
|
|
43
70
|
setOriginalHeaderHeight(measuredValue);
|
|
@@ -55,8 +82,10 @@ function HeaderMotionContextProvider({
|
|
|
55
82
|
});
|
|
56
83
|
});
|
|
57
84
|
const progress = useDerivedValue(() => {
|
|
58
|
-
const
|
|
59
|
-
const
|
|
85
|
+
const values = scrollValues.get();
|
|
86
|
+
const id = resolveScrollIdForProgress(values, activeScrollId?.get());
|
|
87
|
+
const scrollValue = values[id];
|
|
88
|
+
const threshold = progressThresholdValue.get();
|
|
60
89
|
if (!scrollValue) {
|
|
61
90
|
return 0;
|
|
62
91
|
}
|
|
@@ -64,17 +93,24 @@ function HeaderMotionContextProvider({
|
|
|
64
93
|
min,
|
|
65
94
|
current
|
|
66
95
|
} = scrollValue;
|
|
67
|
-
return interpolate(current, [min, min +
|
|
96
|
+
return interpolate(current, [min, min + threshold], [0, 1], progressExtrapolation);
|
|
68
97
|
});
|
|
98
|
+
const scrollToRef = useRef(null);
|
|
99
|
+
// FUTURE: SharedValue-based scrollTo was removed for now because function updates
|
|
100
|
+
// were not propagating reliably, while it works for refs. Revisit later.
|
|
101
|
+
// We need to be updating the scrollTo on active scroll ID changes and doing it via state would cause re-renders.
|
|
102
|
+
// It's a bit of an anti-pattern to use refs for this as well, but I am yet to figure out a better way to pass those if SV won't work.
|
|
69
103
|
const ctxValue = useMemo(() => ({
|
|
70
104
|
progress,
|
|
71
105
|
originalHeaderHeight,
|
|
72
106
|
measureDynamic: setOrUpdateDynamicMeasurement,
|
|
73
107
|
measureTotalHeight,
|
|
74
|
-
|
|
108
|
+
headerPanMomentumOffset,
|
|
109
|
+
progressThreshold: progressThresholdValue,
|
|
75
110
|
scrollValues,
|
|
111
|
+
scrollToRef,
|
|
76
112
|
activeScrollId: activeScrollId
|
|
77
|
-
}), [originalHeaderHeight, progress, measureTotalHeight, setOrUpdateDynamicMeasurement, scrollValues, activeScrollId,
|
|
113
|
+
}), [originalHeaderHeight, progress, measureTotalHeight, headerPanMomentumOffset, setOrUpdateDynamicMeasurement, scrollValues, activeScrollId, progressThresholdValue]);
|
|
78
114
|
return /*#__PURE__*/_jsx(HeaderMotionContext.Provider, {
|
|
79
115
|
value: ctxValue,
|
|
80
116
|
children: children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useMemo","useState","Extrapolation","interpolate","useAnimatedReaction","useDerivedValue","useSharedValue","HeaderMotionContext","DEFAULT_MEASURE_DYNAMIC","DEFAULT_PROGRESS_THRESHOLD","DEFAULT_SCROLL_ID","getInitialScrollValue","jsx","_jsx","HeaderMotionContextProvider","progressThreshold","measureDynamic","measureDynamicMode","activeScrollId","progressExtrapolation","CLAMP","children","dynamicMeasurement","
|
|
1
|
+
{"version":3,"names":["useCallback","useRef","useEffect","useMemo","useState","Extrapolation","interpolate","useAnimatedReaction","useDerivedValue","useSharedValue","HeaderMotionContext","DEFAULT_MEASURE_DYNAMIC","DEFAULT_PROGRESS_THRESHOLD","DEFAULT_SCROLL_ID","getInitialScrollValue","jsx","_jsx","resolveScrollIdForProgress","scrollValues","activeScrollIdValue","onlyNonDefaultId","key","HeaderMotionContextProvider","progressThreshold","measureDynamic","measureDynamicMode","activeScrollId","progressExtrapolation","CLAMP","children","dynamicMeasurement","undefined","originalHeaderHeight","setOriginalHeaderHeight","progressThresholdValue","Infinity","headerPanMomentumOffset","setOrUpdateDynamicMeasurement","e","prevMeasurement","get","measured","set","nextThreshold","measureTotalHeight","measuredValue","nativeEvent","layout","height","id","modify","value","progress","values","scrollValue","threshold","min","current","scrollToRef","ctxValue","Provider"],"sourceRoot":"../../../src","sources":["components/HeaderMotion.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { Platform } from 'react-native';
|
|
5
|
+
import { Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler';
|
|
6
|
+
import { useAnimatedReaction, withDecay } from 'react-native-reanimated';
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
const PLATFORM_PANNING_ENABLED = Platform.select({
|
|
9
|
+
default: true,
|
|
10
|
+
android: false
|
|
11
|
+
});
|
|
12
|
+
export function HeaderPanBoundary({
|
|
13
|
+
children,
|
|
14
|
+
pannable = false,
|
|
15
|
+
panDecayConfig,
|
|
16
|
+
scrollToRef,
|
|
17
|
+
headerPanMomentumOffset,
|
|
18
|
+
withGestureHandlerRootView = false
|
|
19
|
+
}) {
|
|
20
|
+
useAnimatedReaction(() => headerPanMomentumOffset.get(), (offset, prevOffset) => {
|
|
21
|
+
if (offset !== null) {
|
|
22
|
+
const dy = offset - (prevOffset ?? 0);
|
|
23
|
+
scrollToRef.current?.(dy);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
const isPanEnabled = PLATFORM_PANNING_ENABLED && pannable;
|
|
27
|
+
const pan = useMemo(() => Gesture.Pan().enabled(isPanEnabled).onChange(e => {
|
|
28
|
+
const dy = e.changeY;
|
|
29
|
+
scrollToRef.current?.(dy);
|
|
30
|
+
}).onEnd(e => {
|
|
31
|
+
const resolvedConfig = resolvePanDecayConfig(panDecayConfig, e);
|
|
32
|
+
headerPanMomentumOffset.set(withDecay(resolvedConfig, () => headerPanMomentumOffset.set(null)));
|
|
33
|
+
}).shouldCancelWhenOutside(false), [headerPanMomentumOffset, isPanEnabled, panDecayConfig, scrollToRef]);
|
|
34
|
+
const content = /*#__PURE__*/_jsx(GestureDetector, {
|
|
35
|
+
gesture: pan,
|
|
36
|
+
children: children
|
|
37
|
+
});
|
|
38
|
+
if (!withGestureHandlerRootView) {
|
|
39
|
+
return content;
|
|
40
|
+
}
|
|
41
|
+
return /*#__PURE__*/_jsx(GestureHandlerRootView, {
|
|
42
|
+
children: content
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function resolvePanDecayConfig(panDecayConfig, event) {
|
|
46
|
+
'worklet';
|
|
47
|
+
|
|
48
|
+
const resolvedConfig = typeof panDecayConfig === 'function' ? panDecayConfig(event) : panDecayConfig;
|
|
49
|
+
return {
|
|
50
|
+
...resolvedConfig,
|
|
51
|
+
velocity: resolvedConfig?.velocity ?? event.velocityY
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=HeaderPanBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useMemo","Platform","Gesture","GestureDetector","GestureHandlerRootView","useAnimatedReaction","withDecay","jsx","_jsx","PLATFORM_PANNING_ENABLED","select","default","android","HeaderPanBoundary","children","pannable","panDecayConfig","scrollToRef","headerPanMomentumOffset","withGestureHandlerRootView","get","offset","prevOffset","dy","current","isPanEnabled","pan","Pan","enabled","onChange","e","changeY","onEnd","resolvedConfig","resolvePanDecayConfig","set","shouldCancelWhenOutside","content","gesture","event","velocity","velocityY"],"sourceRoot":"../../../src","sources":["components/HeaderPanBoundary.tsx"],"mappings":";;AAAA,SAASA,OAAO,QAA2B,OAAO;AAClD,SAASC,QAAQ,QAAQ,cAAc;AACvC,SACEC,OAAO,EACPC,eAAe,EACfC,sBAAsB,QACjB,8BAA8B;AACrC,SAASC,mBAAmB,EAAEC,SAAS,QAAQ,yBAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAOzE,MAAMC,wBAAwB,GAAGR,QAAQ,CAACS,MAAM,CAAC;EAC/CC,OAAO,EAAE,IAAI;EACbC,OAAO,EAAE;AACX,CAAC,CAAC;AAYF,OAAO,SAASC,iBAAiBA,CAAC;EAChCC,QAAQ;EACRC,QAAQ,GAAG,KAAK;EAChBC,cAAc;EACdC,WAAW;EACXC,uBAAuB;EACvBC,0BAA0B,GAAG;AACP,CAAC,EAAE;EACzBd,mBAAmB,CACjB,MAAMa,uBAAuB,CAACE,GAAG,CAAC,CAAC,EACnC,CAACC,MAAM,EAAEC,UAAU,KAAK;IACtB,IAAID,MAAM,KAAK,IAAI,EAAE;MACnB,MAAME,EAAE,GAAGF,MAAM,IAAIC,UAAU,IAAI,CAAC,CAAC;MACrCL,WAAW,CAACO,OAAO,GAAGD,EAAE,CAAC;IAC3B;EACF,CACF,CAAC;EAED,MAAME,YAAY,GAAGhB,wBAAwB,IAAIM,QAAQ;EAEzD,MAAMW,GAAG,GAAG1B,OAAO,CACjB,MACEE,OAAO,CAACyB,GAAG,CAAC,CAAC,CACVC,OAAO,CAACH,YAAY,CAAC,CACrBI,QAAQ,CAAEC,CAAC,IAAK;IACf,MAAMP,EAAE,GAAGO,CAAC,CAACC,OAAO;IACpBd,WAAW,CAACO,OAAO,GAAGD,EAAE,CAAC;EAC3B,CAAC,CAAC,CACDS,KAAK,CAAEF,CAAC,IAAK;IACZ,MAAMG,cAAc,GAAGC,qBAAqB,CAAClB,cAAc,EAAEc,CAAC,CAAC;IAC/DZ,uBAAuB,CAACiB,GAAG,CACzB7B,SAAS,CAAC2B,cAAc,EAAE,MAAMf,uBAAuB,CAACiB,GAAG,CAAC,IAAI,CAAC,CACnE,CAAC;EACH,CAAC,CAAC,CACDC,uBAAuB,CAAC,KAAK,CAAC,EACnC,CAAClB,uBAAuB,EAAEO,YAAY,EAAET,cAAc,EAAEC,WAAW,CACrE,CAAC;EAED,MAAMoB,OAAO,gBAAG7B,IAAA,CAACL,eAAe;IAACmC,OAAO,EAAEZ,GAAI;IAAAZ,QAAA,EAAEA;EAAQ,CAAkB,CAAC;EAE3E,IAAI,CAACK,0BAA0B,EAAE;IAC/B,OAAOkB,OAAO;EAChB;EAEA,oBAAO7B,IAAA,CAACJ,sBAAsB;IAAAU,QAAA,EAAEuB;EAAO,CAAyB,CAAC;AACnE;AAEA,SAASH,qBAAqBA,CAC5BlB,cAAgD,EAChDuB,KAA0B,EAC1B;EACA,SAAS;;EAET,MAAMN,cAAc,GAClB,OAAOjB,cAAc,KAAK,UAAU,GAChCA,cAAc,CAACuB,KAAK,CAAC,GACrBvB,cAAc;EAEpB,OAAO;IACL,GAAGiB,cAAc;IACjBO,QAAQ,EAAEP,cAAc,EAAEO,QAAQ,IAAID,KAAK,CAACE;EAC9C,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { HeaderMotionContext } from "../context.js";
|
|
4
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
|
+
/**
|
|
6
|
+
* Re-provides HeaderMotion context in a different part of the React tree.
|
|
7
|
+
*
|
|
8
|
+
* This is primarily useful for navigation libraries that render headers outside
|
|
9
|
+
* the screen subtree where `HeaderMotion` itself lives.
|
|
10
|
+
*/
|
|
11
|
+
export function NavigationBridge({
|
|
12
|
+
value,
|
|
13
|
+
children
|
|
14
|
+
}) {
|
|
15
|
+
return /*#__PURE__*/_jsx(HeaderMotionContext.Provider, {
|
|
16
|
+
value: value,
|
|
17
|
+
children: children
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=NavigationBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["HeaderMotionContext","jsx","_jsx","NavigationBridge","value","children","Provider"],"sourceRoot":"../../../src","sources":["components/NavigationBridge.tsx"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,eAAY;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAajD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAAC;EAC/BC,KAAK;EACLC;AACiC,CAAC,EAAE;EACpC,oBACEH,IAAA,CAACF,mBAAmB,CAACM,QAAQ;IAACF,KAAK,EAAEA,KAAM;IAAAC,QAAA,EACxCA;EAAQ,CACmB,CAAC;AAEnC","ignoreList":[]}
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
import { useScrollManager } from "../hooks/index.js";
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
* Must be used within a HeaderMotion component.
|
|
5
|
+
* Render-prop wrapper around `useScrollManager()`.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* **Most code should prefer `createHeaderMotionScrollable()` instead.**
|
|
8
|
+
*
|
|
9
|
+
* Use `ScrollManager` only when the factory approach is not enough and you
|
|
10
|
+
* still need HeaderMotion to manage a custom scrollable through render-prop
|
|
11
|
+
* composition.
|
|
10
12
|
*
|
|
11
13
|
* @example
|
|
12
14
|
* ```tsx
|
|
@@ -23,7 +25,7 @@ import { useScrollManager } from "../hooks/index.js";
|
|
|
23
25
|
* </HeaderMotion>
|
|
24
26
|
* ```
|
|
25
27
|
*/
|
|
26
|
-
export function
|
|
28
|
+
export function ScrollManager({
|
|
27
29
|
children,
|
|
28
30
|
scrollId,
|
|
29
31
|
animatedRef,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useScrollManager","
|
|
1
|
+
{"version":3,"names":["useScrollManager","ScrollManager","children","scrollId","animatedRef","refreshControl","refreshing","onRefresh","progressViewOffset","onScroll","onScrollBeginDrag","onScrollEndDrag","onMomentumScrollBegin","onMomentumScrollEnd","Error","scrollableProps","headerMotionContext"],"sourceRoot":"../../../src","sources":["components/ScrollManager.tsx"],"mappings":";;AAAA,SAASA,gBAAgB,QAAsC,mBAAU;AA2BzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAuC;EAClEC,QAAQ;EACRC,QAAQ;EACRC,WAAW;EACXC,cAAc;EACdC,UAAU;EACVC,SAAS;EACTC,kBAAkB;EAClBC,QAAQ;EACRC,iBAAiB;EACjBC,eAAe;EACfC,qBAAqB;EACrBC;AACoC,CAAC,EAAE;EACvC,IAAI,OAAOX,QAAQ,KAAK,UAAU,EAAE;IAClC,MAAM,IAAIY,KAAK,CACb,4EACF,CAAC;EACH;EAEA,MAAM;IAAEC,eAAe;IAAEC;EAAoB,CAAC,GAAGhB,gBAAgB,CAC/DG,QAAQ,EACR;IACEC,WAAW;IACXC,cAAc;IACdC,UAAU;IACVC,SAAS;IACTC,kBAAkB;IAClBC,QAAQ;IACRC,iBAAiB;IACjBC,eAAe;IACfC,qBAAqB;IACrBC;EACF,CACF,CAAC;EAED,OAAOX,QAAQ,CAACa,eAAe,EAAEC,mBAAmB,CAAC;AACvD","ignoreList":[]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import Animated from 'react-native-reanimated';
|
|
4
|
-
import {
|
|
5
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
4
|
+
import { createHeaderMotionScrollable } from "./createHeaderMotionScrollable.js";
|
|
6
5
|
/**
|
|
7
6
|
* Animated ScrollView component that integrates with HeaderMotion.
|
|
8
7
|
* Automatically handles scroll tracking and header animation synchronization.
|
|
@@ -17,49 +16,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
17
16
|
* </HeaderMotion>
|
|
18
17
|
* ```
|
|
19
18
|
*/
|
|
20
|
-
export
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
refreshControl,
|
|
26
|
-
onScroll,
|
|
27
|
-
onScrollBeginDrag,
|
|
28
|
-
onScrollEndDrag,
|
|
29
|
-
onMomentumScrollBegin,
|
|
30
|
-
onMomentumScrollEnd,
|
|
31
|
-
...props
|
|
32
|
-
}) {
|
|
33
|
-
return /*#__PURE__*/_jsx(HeaderMotionScrollManager, {
|
|
34
|
-
scrollId: scrollId,
|
|
35
|
-
animatedRef: animatedRef,
|
|
36
|
-
refreshControl: refreshControl,
|
|
37
|
-
onScroll: onScroll,
|
|
38
|
-
onScrollBeginDrag: onScrollBeginDrag,
|
|
39
|
-
onScrollEndDrag: onScrollEndDrag,
|
|
40
|
-
onMomentumScrollBegin: onMomentumScrollBegin,
|
|
41
|
-
onMomentumScrollEnd: onMomentumScrollEnd,
|
|
42
|
-
children: ({
|
|
43
|
-
onScroll: managedOnScroll,
|
|
44
|
-
refreshControl: managedRefreshControl,
|
|
45
|
-
...scrollViewProps
|
|
46
|
-
}, {
|
|
47
|
-
originalHeaderHeight,
|
|
48
|
-
minHeightContentContainerStyle
|
|
49
|
-
}) => /*#__PURE__*/_jsx(Animated.ScrollView, {
|
|
50
|
-
...scrollViewProps,
|
|
51
|
-
...props,
|
|
52
|
-
onScroll: managedOnScroll,
|
|
53
|
-
...(managedRefreshControl && {
|
|
54
|
-
refreshControl: managedRefreshControl
|
|
55
|
-
}),
|
|
56
|
-
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
57
|
-
style: [minHeightContentContainerStyle, {
|
|
58
|
-
paddingTop: originalHeaderHeight
|
|
59
|
-
}, contentContainerStyle],
|
|
60
|
-
children: children
|
|
61
|
-
})
|
|
62
|
-
})
|
|
63
|
-
});
|
|
64
|
-
}
|
|
19
|
+
export const ScrollView = createHeaderMotionScrollable(Animated.ScrollView, {
|
|
20
|
+
displayName: 'HeaderMotion.ScrollView',
|
|
21
|
+
contentContainerMode: 'children',
|
|
22
|
+
isComponentAnimated: true
|
|
23
|
+
});
|
|
65
24
|
//# sourceMappingURL=ScrollView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Animated","
|
|
1
|
+
{"version":3,"names":["Animated","createHeaderMotionScrollable","ScrollView","displayName","contentContainerMode","isComponentAnimated"],"sourceRoot":"../../../src","sources":["components/ScrollView.tsx"],"mappings":";;AACA,OAAOA,QAAQ,MAER,yBAAyB;AAChC,SACEC,4BAA4B,QAEvB,mCAAgC;AASvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,UAAU,GAAGD,4BAA4B,CAACD,QAAQ,CAACE,UAAU,EAAE;EAC1EC,WAAW,EAAE,yBAAyB;EACtCC,oBAAoB,EAAE,UAAU;EAChCC,mBAAmB,EAAE;AACvB,CAAC,CAAoC","ignoreList":[]}
|