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,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,56 +19,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
21
19
|
* </HeaderMotion>
|
|
22
20
|
* ```
|
|
23
21
|
*/
|
|
24
|
-
export
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
...props
|
|
29
|
-
}) {
|
|
30
|
-
return /*#__PURE__*/_jsx(HeaderMotionScrollManager, {
|
|
31
|
-
scrollId: scrollId,
|
|
32
|
-
animatedRef: animatedRef,
|
|
33
|
-
refreshControl: props.refreshControl,
|
|
34
|
-
refreshing: props.refreshing,
|
|
35
|
-
onRefresh: props.onRefresh,
|
|
36
|
-
progressViewOffset: props.progressViewOffset,
|
|
37
|
-
children: ({
|
|
38
|
-
onScroll,
|
|
39
|
-
refreshControl: managedRefreshControl,
|
|
40
|
-
ref,
|
|
41
|
-
...scrollViewProps
|
|
42
|
-
}, {
|
|
43
|
-
originalHeaderHeight,
|
|
44
|
-
minHeightContentContainerStyle
|
|
45
|
-
}) => /*#__PURE__*/_jsx(Animated.FlatList, {
|
|
46
|
-
...scrollViewProps,
|
|
47
|
-
...props,
|
|
48
|
-
ref: ref,
|
|
49
|
-
onScroll: onScroll,
|
|
50
|
-
...(managedRefreshControl && {
|
|
51
|
-
refreshControl: managedRefreshControl
|
|
52
|
-
}),
|
|
53
|
-
renderScrollComponent: scrollComponentProps => /*#__PURE__*/_jsx(AnimatedScrollContainer, {
|
|
54
|
-
...scrollComponentProps,
|
|
55
|
-
contentContainerStyle: [minHeightContentContainerStyle, {
|
|
56
|
-
paddingTop: originalHeaderHeight
|
|
57
|
-
}, contentContainerStyle]
|
|
58
|
-
})
|
|
59
|
-
})
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
const AnimatedScrollContainer = /*#__PURE__*/forwardRef(({
|
|
63
|
-
children,
|
|
64
|
-
contentContainerStyle,
|
|
65
|
-
...rest
|
|
66
|
-
}, ref) => {
|
|
67
|
-
return /*#__PURE__*/_jsx(Animated.ScrollView, {
|
|
68
|
-
...rest,
|
|
69
|
-
ref: ref,
|
|
70
|
-
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
71
|
-
style: contentContainerStyle,
|
|
72
|
-
children: children
|
|
73
|
-
})
|
|
74
|
-
});
|
|
22
|
+
export const FlatList = createHeaderMotionScrollable(Animated.FlatList, {
|
|
23
|
+
displayName: 'HeaderMotion.FlatList',
|
|
24
|
+
contentContainerMode: 'renderScrollComponent',
|
|
25
|
+
isComponentAnimated: true
|
|
75
26
|
});
|
|
76
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,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { useCallback, useRef, useEffect, useMemo } 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";
|
|
@@ -24,8 +24,11 @@ const resolveScrollIdForProgress = (scrollValues, activeScrollIdValue) => {
|
|
|
24
24
|
return onlyNonDefaultId ?? DEFAULT_SCROLL_ID;
|
|
25
25
|
};
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
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
|
+
*
|
|
29
32
|
* @template T - The type of scroll ID string
|
|
30
33
|
*/
|
|
31
34
|
function HeaderMotionContextProvider({
|
|
@@ -34,11 +37,10 @@ function HeaderMotionContextProvider({
|
|
|
34
37
|
measureDynamicMode = 'mount',
|
|
35
38
|
activeScrollId,
|
|
36
39
|
progressExtrapolation = Extrapolation.CLAMP,
|
|
37
|
-
enableHeaderPan = false,
|
|
38
40
|
children
|
|
39
41
|
}) {
|
|
40
42
|
const dynamicMeasurement = useSharedValue(undefined);
|
|
41
|
-
const originalHeaderHeight =
|
|
43
|
+
const [originalHeaderHeight, setOriginalHeaderHeight] = useState(0);
|
|
42
44
|
const progressThresholdValue = useSharedValue(typeof progressThreshold === 'number' ? progressThreshold : Infinity);
|
|
43
45
|
const headerPanMomentumOffset = useSharedValue(null);
|
|
44
46
|
const setOrUpdateDynamicMeasurement = useCallback(e => {
|
|
@@ -51,7 +53,8 @@ function HeaderMotionContextProvider({
|
|
|
51
53
|
return;
|
|
52
54
|
}
|
|
53
55
|
dynamicMeasurement.set(measured);
|
|
54
|
-
|
|
56
|
+
const nextThreshold = typeof progressThreshold === 'number' ? progressThreshold : progressThreshold(measured);
|
|
57
|
+
progressThresholdValue.set(nextThreshold);
|
|
55
58
|
}, [measureDynamicMode, measureDynamic, dynamicMeasurement, progressThreshold, progressThresholdValue]);
|
|
56
59
|
useEffect(() => {
|
|
57
60
|
if (typeof progressThreshold === 'number') {
|
|
@@ -59,15 +62,13 @@ function HeaderMotionContextProvider({
|
|
|
59
62
|
return;
|
|
60
63
|
}
|
|
61
64
|
const measured = dynamicMeasurement.get();
|
|
62
|
-
|
|
65
|
+
const nextThreshold = measured === undefined ? Infinity : progressThreshold(measured);
|
|
66
|
+
progressThresholdValue.set(nextThreshold);
|
|
63
67
|
}, [progressThreshold, dynamicMeasurement, progressThresholdValue]);
|
|
64
68
|
const measureTotalHeight = useCallback(e => {
|
|
65
69
|
const measuredValue = e.nativeEvent.layout.height;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
originalHeaderHeight.set(measuredValue);
|
|
70
|
-
}, [originalHeaderHeight]);
|
|
70
|
+
setOriginalHeaderHeight(measuredValue);
|
|
71
|
+
}, [setOriginalHeaderHeight]);
|
|
71
72
|
const scrollValues = useSharedValue({
|
|
72
73
|
[DEFAULT_SCROLL_ID]: getInitialScrollValue()
|
|
73
74
|
});
|
|
@@ -99,24 +100,17 @@ function HeaderMotionContextProvider({
|
|
|
99
100
|
// were not propagating reliably, while it works for refs. Revisit later.
|
|
100
101
|
// We need to be updating the scrollTo on active scroll ID changes and doing it via state would cause re-renders.
|
|
101
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.
|
|
102
|
-
const animatedHeaderBaseProps = useMemo(() => ({
|
|
103
|
-
enableHeaderPan,
|
|
104
|
-
scrollToRef,
|
|
105
|
-
headerPanMomentumOffset
|
|
106
|
-
}), [enableHeaderPan, headerPanMomentumOffset]);
|
|
107
103
|
const ctxValue = useMemo(() => ({
|
|
108
104
|
progress,
|
|
109
105
|
originalHeaderHeight,
|
|
110
106
|
measureDynamic: setOrUpdateDynamicMeasurement,
|
|
111
107
|
measureTotalHeight,
|
|
112
|
-
enableHeaderPan,
|
|
113
108
|
headerPanMomentumOffset,
|
|
114
|
-
animatedHeaderBaseProps,
|
|
115
109
|
progressThreshold: progressThresholdValue,
|
|
116
110
|
scrollValues,
|
|
117
111
|
scrollToRef,
|
|
118
112
|
activeScrollId: activeScrollId
|
|
119
|
-
}), [originalHeaderHeight, progress, measureTotalHeight,
|
|
113
|
+
}), [originalHeaderHeight, progress, measureTotalHeight, headerPanMomentumOffset, setOrUpdateDynamicMeasurement, scrollValues, activeScrollId, progressThresholdValue]);
|
|
120
114
|
return /*#__PURE__*/_jsx(HeaderMotionContext.Provider, {
|
|
121
115
|
value: ctxValue,
|
|
122
116
|
children: children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useRef","useEffect","useMemo","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","
|
|
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,14 +25,19 @@ 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,
|
|
30
32
|
refreshControl,
|
|
31
33
|
refreshing,
|
|
32
34
|
onRefresh,
|
|
33
|
-
progressViewOffset
|
|
35
|
+
progressViewOffset,
|
|
36
|
+
onScroll,
|
|
37
|
+
onScrollBeginDrag,
|
|
38
|
+
onScrollEndDrag,
|
|
39
|
+
onMomentumScrollBegin,
|
|
40
|
+
onMomentumScrollEnd
|
|
34
41
|
}) {
|
|
35
42
|
if (typeof children !== 'function') {
|
|
36
43
|
throw new Error('HeaderMotion.ScrollManager only accepts render function as the only child.');
|
|
@@ -43,7 +50,12 @@ export function HeaderMotionScrollManager({
|
|
|
43
50
|
refreshControl,
|
|
44
51
|
refreshing,
|
|
45
52
|
onRefresh,
|
|
46
|
-
progressViewOffset
|
|
53
|
+
progressViewOffset,
|
|
54
|
+
onScroll,
|
|
55
|
+
onScrollBeginDrag,
|
|
56
|
+
onScrollEndDrag,
|
|
57
|
+
onMomentumScrollBegin,
|
|
58
|
+
onMomentumScrollEnd
|
|
47
59
|
});
|
|
48
60
|
return children(scrollableProps, headerMotionContext);
|
|
49
61
|
}
|
|
@@ -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,41 +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
|
-
...props
|
|
27
|
-
}) {
|
|
28
|
-
return /*#__PURE__*/_jsx(HeaderMotionScrollManager, {
|
|
29
|
-
scrollId: scrollId,
|
|
30
|
-
animatedRef: animatedRef,
|
|
31
|
-
refreshControl: refreshControl,
|
|
32
|
-
children: ({
|
|
33
|
-
onScroll,
|
|
34
|
-
ref,
|
|
35
|
-
refreshControl: managedRefreshControl,
|
|
36
|
-
...scrollViewProps
|
|
37
|
-
}, {
|
|
38
|
-
originalHeaderHeight,
|
|
39
|
-
minHeightContentContainerStyle
|
|
40
|
-
}) => /*#__PURE__*/_jsx(Animated.ScrollView, {
|
|
41
|
-
...scrollViewProps,
|
|
42
|
-
...props,
|
|
43
|
-
ref: ref,
|
|
44
|
-
onScroll: onScroll,
|
|
45
|
-
...(managedRefreshControl && {
|
|
46
|
-
refreshControl: managedRefreshControl
|
|
47
|
-
}),
|
|
48
|
-
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
49
|
-
style: [minHeightContentContainerStyle, {
|
|
50
|
-
paddingTop: originalHeaderHeight
|
|
51
|
-
}, contentContainerStyle],
|
|
52
|
-
children: children
|
|
53
|
-
})
|
|
54
|
-
})
|
|
55
|
-
});
|
|
56
|
-
}
|
|
19
|
+
export const ScrollView = createHeaderMotionScrollable(Animated.ScrollView, {
|
|
20
|
+
displayName: 'HeaderMotion.ScrollView',
|
|
21
|
+
contentContainerMode: 'children',
|
|
22
|
+
isComponentAnimated: true
|
|
23
|
+
});
|
|
57
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":[]}
|