react-native-header-motion 0.2.0 → 1.0.0-alpha.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 +126 -18
- package/lib/module/components/FlatList.js +12 -2
- package/lib/module/components/FlatList.js.map +1 -1
- package/lib/module/components/HeaderBase.js +53 -5
- package/lib/module/components/HeaderBase.js.map +1 -1
- package/lib/module/components/HeaderMotion.js +66 -24
- package/lib/module/components/HeaderMotion.js.map +1 -1
- package/lib/module/components/ScrollManager.js +10 -2
- package/lib/module/components/ScrollManager.js.map +1 -1
- package/lib/module/components/ScrollView.js +8 -0
- package/lib/module/components/ScrollView.js.map +1 -1
- package/lib/module/context.js.map +1 -1
- package/lib/module/hooks/useMotionProgress.js +6 -2
- package/lib/module/hooks/useMotionProgress.js.map +1 -1
- package/lib/module/hooks/useScrollManager.js +91 -29
- package/lib/module/hooks/useScrollManager.js.map +1 -1
- package/lib/module/utils/index.js +1 -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/FlatList.d.ts +2 -4
- package/lib/typescript/src/components/FlatList.d.ts.map +1 -1
- package/lib/typescript/src/components/HeaderBase.d.ts +9 -2
- package/lib/typescript/src/components/HeaderBase.d.ts.map +1 -1
- package/lib/typescript/src/components/HeaderMotion.d.ts +5 -1
- package/lib/typescript/src/components/HeaderMotion.d.ts.map +1 -1
- package/lib/typescript/src/components/ScrollManager.d.ts +6 -10
- package/lib/typescript/src/components/ScrollManager.d.ts.map +1 -1
- package/lib/typescript/src/components/ScrollView.d.ts +3 -3
- package/lib/typescript/src/components/ScrollView.d.ts.map +1 -1
- package/lib/typescript/src/context.d.ts +7 -3
- package/lib/typescript/src/context.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useMotionProgress.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useScrollManager.d.ts +10 -3
- package/lib/typescript/src/hooks/useScrollManager.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +20 -4
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/utils/index.d.ts +1 -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 +7 -5
- package/src/components/FlatList.tsx +23 -9
- package/src/components/HeaderBase.tsx +93 -4
- package/src/components/HeaderMotion.tsx +102 -26
- package/src/components/ScrollManager.tsx +27 -17
- package/src/components/ScrollView.tsx +17 -3
- package/src/context.ts +9 -2
- package/src/hooks/useMotionProgress.ts +10 -2
- package/src/hooks/useScrollManager.ts +127 -35
- package/src/types.ts +22 -4
- package/src/utils/index.ts +1 -0
- package/src/utils/refreshControl.tsx +118 -0
- package/src/utils/values.ts +57 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createContext","HeaderMotionContext"],"sourceRoot":"../../src","sources":["context.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,OAAO;
|
|
1
|
+
{"version":3,"names":["createContext","HeaderMotionContext"],"sourceRoot":"../../src","sources":["context.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,OAAO;AAyBrC,OAAO,MAAMC,mBAAmB,gBAC9BD,aAAa,CAAiC,IAAI,CAAC","ignoreList":[]}
|
|
@@ -46,13 +46,17 @@ export function useMotionProgress() {
|
|
|
46
46
|
progress,
|
|
47
47
|
measureTotalHeight,
|
|
48
48
|
measureDynamic,
|
|
49
|
-
progressThreshold
|
|
49
|
+
progressThreshold,
|
|
50
|
+
animatedHeaderBaseProps,
|
|
51
|
+
activeScrollId
|
|
50
52
|
} = ctxValue;
|
|
51
53
|
return {
|
|
52
54
|
progress,
|
|
53
55
|
measureTotalHeight,
|
|
54
56
|
measureDynamic,
|
|
55
|
-
progressThreshold
|
|
57
|
+
progressThreshold,
|
|
58
|
+
animatedHeaderBaseProps,
|
|
59
|
+
activeScrollId
|
|
56
60
|
};
|
|
57
61
|
}
|
|
58
62
|
//# sourceMappingURL=useMotionProgress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useContext","HeaderMotionContext","useMotionProgress","ctxValue","Error","progress","measureTotalHeight","measureDynamic","progressThreshold"],"sourceRoot":"../../../src","sources":["hooks/useMotionProgress.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,OAAO;AAClC,SAASC,mBAAmB,QAAQ,eAAY;AAGhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,iBAAiBA,CAAA,EAAmB;EAClD,MAAMC,QAAQ,GAAGH,UAAU,CAACC,mBAAmB,CAAC;EAChD,IAAI,CAACE,QAAQ,EAAE;IACb,MAAM,IAAIC,KAAK,CACb,mLACF,CAAC;EACH;EACA,MAAM;
|
|
1
|
+
{"version":3,"names":["useContext","HeaderMotionContext","useMotionProgress","ctxValue","Error","progress","measureTotalHeight","measureDynamic","progressThreshold","animatedHeaderBaseProps","activeScrollId"],"sourceRoot":"../../../src","sources":["hooks/useMotionProgress.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,OAAO;AAClC,SAASC,mBAAmB,QAAQ,eAAY;AAGhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,iBAAiBA,CAAA,EAAmB;EAClD,MAAMC,QAAQ,GAAGH,UAAU,CAACC,mBAAmB,CAAC;EAChD,IAAI,CAACE,QAAQ,EAAE;IACb,MAAM,IAAIC,KAAK,CACb,mLACF,CAAC;EACH;EACA,MAAM;IACJC,QAAQ;IACRC,kBAAkB;IAClBC,cAAc;IACdC,iBAAiB;IACjBC,uBAAuB;IACvBC;EACF,CAAC,GAAGP,QAAQ;EAEZ,OAAO;IACLE,QAAQ;IACRC,kBAAkB;IAClBC,cAAc;IACdC,iBAAiB;IACjBC,uBAAuB;IACvBC;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { useContext, useCallback, useEffect } from 'react';
|
|
4
|
-
import { measure, scrollTo, useAnimatedReaction, useAnimatedRef, useAnimatedScrollHandler, useAnimatedStyle } from 'react-native-reanimated';
|
|
4
|
+
import { cancelAnimation, measure, scrollTo, useAnimatedReaction, useAnimatedRef, useAnimatedScrollHandler, useAnimatedStyle } from 'react-native-reanimated';
|
|
5
5
|
import { RuntimeKind, scheduleOnUI } from 'react-native-worklets';
|
|
6
6
|
import { HeaderMotionContext } from "../context.js";
|
|
7
|
-
import { DEFAULT_SCROLL_ID,
|
|
7
|
+
import { resolveRefreshControl, DEFAULT_SCROLL_ID, ensureScrollValueRegistered, warnIfMissingActiveScrollId } from "../utils/index.js";
|
|
8
|
+
const SCROLL_TOLERANCE = 0.5;
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Hook that manages scroll tracking and synchronization for header animations.
|
|
@@ -54,11 +55,34 @@ export function useScrollManager(scrollId, options) {
|
|
|
54
55
|
progress,
|
|
55
56
|
activeScrollId,
|
|
56
57
|
progressThreshold,
|
|
57
|
-
originalHeaderHeight
|
|
58
|
+
originalHeaderHeight,
|
|
59
|
+
scrollToRef,
|
|
60
|
+
headerPanMomentumOffset
|
|
58
61
|
} = ctxValue;
|
|
59
62
|
const id = scrollId ?? DEFAULT_SCROLL_ID;
|
|
60
|
-
const localRef = useAnimatedRef();
|
|
63
|
+
const localRef = useAnimatedRef();
|
|
61
64
|
const animatedRef = options?.animatedRef ?? localRef;
|
|
65
|
+
const refreshControl = options?.refreshControl;
|
|
66
|
+
const refreshing = options?.refreshing;
|
|
67
|
+
const onRefresh = options?.onRefresh;
|
|
68
|
+
const progressViewOffset = options?.progressViewOffset ?? originalHeaderHeight;
|
|
69
|
+
useAnimatedReaction(() => activeScrollId?.get(), activeId => {
|
|
70
|
+
const currentValues = ensureScrollValueRegistered(scrollValues, id);
|
|
71
|
+
warnIfMissingActiveScrollId(currentValues, id, activeId);
|
|
72
|
+
if (!activeId || activeId === id) {
|
|
73
|
+
// TODO: Could we just be passing current scrollRef instead of the entire function?
|
|
74
|
+
scrollToRef.current = (y, scrollOptions = {}) => {
|
|
75
|
+
'worklet';
|
|
76
|
+
|
|
77
|
+
const {
|
|
78
|
+
isValueDelta = true,
|
|
79
|
+
animated = false
|
|
80
|
+
} = scrollOptions;
|
|
81
|
+
const newY = isValueDelta ? scrollValues.get()[id].current - y : y;
|
|
82
|
+
scrollTo(animatedRef, 0, newY, animated);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
});
|
|
62
86
|
useEffect(() => {
|
|
63
87
|
return () => {
|
|
64
88
|
scheduleOnUI(scrollIdToDelete => {
|
|
@@ -78,22 +102,17 @@ export function useScrollManager(scrollId, options) {
|
|
|
78
102
|
if (!currentActiveScrollId || id === currentActiveScrollId || oldProgress === null) {
|
|
79
103
|
return;
|
|
80
104
|
}
|
|
81
|
-
|
|
82
|
-
scrollValues.modify(value => {
|
|
83
|
-
value[id] = getInitialScrollValue();
|
|
84
|
-
return value;
|
|
85
|
-
});
|
|
86
|
-
}
|
|
105
|
+
ensureScrollValueRegistered(scrollValues, id);
|
|
87
106
|
let newCur = -1;
|
|
107
|
+
const threshold = progressThreshold.get();
|
|
88
108
|
scrollValues.modify(value => {
|
|
89
|
-
|
|
109
|
+
const scrollValue = value[id];
|
|
90
110
|
if (!scrollValue) {
|
|
91
|
-
value
|
|
92
|
-
scrollValue = value[id];
|
|
111
|
+
return value;
|
|
93
112
|
}
|
|
94
113
|
const progressDiff = oldProgress - newProgress;
|
|
95
|
-
newCur = scrollValue.current - progressDiff *
|
|
96
|
-
const newMin = newCur - newProgress *
|
|
114
|
+
newCur = scrollValue.current - progressDiff * threshold;
|
|
115
|
+
const newMin = newCur - newProgress * threshold;
|
|
97
116
|
scrollValue.current = newCur;
|
|
98
117
|
scrollValue.min = newMin;
|
|
99
118
|
return value;
|
|
@@ -102,30 +121,66 @@ export function useScrollManager(scrollId, options) {
|
|
|
102
121
|
scrollTo(animatedRef, 0, newCur, false);
|
|
103
122
|
}
|
|
104
123
|
});
|
|
105
|
-
const
|
|
124
|
+
const onScroll = useCallback((e, ctx) => {
|
|
106
125
|
'worklet';
|
|
107
126
|
|
|
127
|
+
const newCurrent = e.contentOffset.y;
|
|
128
|
+
if (ctx.lastOffset !== undefined && Math.abs(ctx.lastOffset - newCurrent) < SCROLL_TOLERANCE) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
ctx.lastOffset = newCurrent;
|
|
132
|
+
const threshold = progressThreshold.get();
|
|
133
|
+
const values = scrollValues.get();
|
|
134
|
+
const scrollValue = values[id];
|
|
135
|
+
if (!scrollValue) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const activeScrollIdValue = activeScrollId?.get();
|
|
139
|
+
if (activeScrollIdValue && activeScrollIdValue !== id) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const oldCurrent = scrollValue.current;
|
|
143
|
+
const oldMin = scrollValue.min;
|
|
144
|
+
const isCollapsed = oldCurrent >= oldMin + threshold - 0.001;
|
|
145
|
+
|
|
146
|
+
// When the header is fully collapsed and the user is scrolled past the
|
|
147
|
+
// threshold, progress is mathematically guaranteed to stay at 1:
|
|
148
|
+
// min = newCurrent - threshold → (newCurrent - min) / threshold = 1
|
|
149
|
+
// In this case we update the values directly via .get() instead of
|
|
150
|
+
// .modify(), which avoids triggering the reactive cascade (progress
|
|
151
|
+
// re-derivation, animated reactions, animated styles). The values are
|
|
152
|
+
// still updated in-place for tab synchronization correctness.
|
|
153
|
+
if (isCollapsed && newCurrent >= threshold) {
|
|
154
|
+
scrollValue.current = newCurrent;
|
|
155
|
+
scrollValue.min = newCurrent - threshold;
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
108
158
|
scrollValues.modify(value => {
|
|
109
159
|
if (!value[id]) {
|
|
110
160
|
return value;
|
|
111
161
|
}
|
|
112
|
-
const activeScrollIdValue = activeScrollId?.get();
|
|
113
|
-
if (activeScrollIdValue && activeScrollIdValue !== id) {
|
|
114
|
-
return value;
|
|
115
|
-
}
|
|
116
|
-
const oldCurrent = value[id].current;
|
|
117
|
-
const oldMin = value[id].min;
|
|
118
|
-
const isCollapsed = oldCurrent >= oldMin + progressThreshold - 0.001;
|
|
119
|
-
const newCurrent = e.contentOffset.y;
|
|
120
162
|
value[id].current = newCurrent;
|
|
121
163
|
if (isCollapsed) {
|
|
122
|
-
value[id].min = Math.max(0, newCurrent -
|
|
164
|
+
value[id].min = Math.max(0, newCurrent - threshold);
|
|
123
165
|
}
|
|
124
166
|
return value;
|
|
125
167
|
});
|
|
126
168
|
}, [scrollValues, id, activeScrollId, progressThreshold]);
|
|
127
|
-
const
|
|
169
|
+
const onBeginDrag = useCallback(() => {
|
|
170
|
+
'worklet';
|
|
171
|
+
|
|
172
|
+
if (headerPanMomentumOffset.get() === null) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
cancelAnimation(headerPanMomentumOffset);
|
|
176
|
+
headerPanMomentumOffset.set(null);
|
|
177
|
+
}, [headerPanMomentumOffset]);
|
|
178
|
+
const animatedOnScroll = useAnimatedScrollHandler({
|
|
179
|
+
onBeginDrag,
|
|
180
|
+
onScroll
|
|
181
|
+
});
|
|
128
182
|
const minHeightContentContainerStyle = useAnimatedStyle(() => {
|
|
183
|
+
const threshold = progressThreshold.get();
|
|
129
184
|
if (globalThis.__RUNTIME_KIND === RuntimeKind.ReactNative) {
|
|
130
185
|
return {};
|
|
131
186
|
}
|
|
@@ -134,13 +189,20 @@ export function useScrollManager(scrollId, options) {
|
|
|
134
189
|
return {};
|
|
135
190
|
}
|
|
136
191
|
return {
|
|
137
|
-
minHeight: measurement.height +
|
|
192
|
+
minHeight: measurement.height + threshold
|
|
138
193
|
};
|
|
139
194
|
});
|
|
195
|
+
const resolvedRefreshControl = resolveRefreshControl({
|
|
196
|
+
refreshControl,
|
|
197
|
+
refreshing,
|
|
198
|
+
onRefresh,
|
|
199
|
+
progressViewOffset
|
|
200
|
+
});
|
|
140
201
|
const scrollableProps = {
|
|
141
|
-
onScroll,
|
|
202
|
+
onScroll: animatedOnScroll,
|
|
142
203
|
scrollEventThrottle: 16,
|
|
143
|
-
ref: animatedRef
|
|
204
|
+
ref: animatedRef,
|
|
205
|
+
refreshControl: resolvedRefreshControl
|
|
144
206
|
};
|
|
145
207
|
const headerMotionContext = {
|
|
146
208
|
originalHeaderHeight,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useContext","useCallback","useEffect","measure","scrollTo","useAnimatedReaction","useAnimatedRef","useAnimatedScrollHandler","useAnimatedStyle","RuntimeKind","scheduleOnUI","HeaderMotionContext","DEFAULT_SCROLL_ID","
|
|
1
|
+
{"version":3,"names":["useContext","useCallback","useEffect","cancelAnimation","measure","scrollTo","useAnimatedReaction","useAnimatedRef","useAnimatedScrollHandler","useAnimatedStyle","RuntimeKind","scheduleOnUI","HeaderMotionContext","resolveRefreshControl","DEFAULT_SCROLL_ID","ensureScrollValueRegistered","warnIfMissingActiveScrollId","SCROLL_TOLERANCE","useScrollManager","scrollId","options","ctxValue","Error","scrollValues","progress","activeScrollId","progressThreshold","originalHeaderHeight","scrollToRef","headerPanMomentumOffset","id","localRef","animatedRef","refreshControl","refreshing","onRefresh","progressViewOffset","get","activeId","currentValues","current","y","scrollOptions","isValueDelta","animated","newY","scrollIdToDelete","modify","value","newProgress","oldProgress","currentActiveScrollId","newCur","threshold","scrollValue","progressDiff","newMin","min","onScroll","e","ctx","newCurrent","contentOffset","lastOffset","undefined","Math","abs","values","activeScrollIdValue","oldCurrent","oldMin","isCollapsed","max","onBeginDrag","set","animatedOnScroll","minHeightContentContainerStyle","globalThis","__RUNTIME_KIND","ReactNative","measurement","minHeight","height","resolvedRefreshControl","scrollableProps","scrollEventThrottle","ref","headerMotionContext"],"sourceRoot":"../../../src","sources":["hooks/useScrollManager.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":";;AAAA,cAAc,eAAY;AAC1B,cAAc,aAAU","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":";;AAAA,cAAc,eAAY;AAC1B,cAAc,aAAU;AACxB,cAAc,qBAAkB","ignoreList":[]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { cloneElement, createElement, isValidElement } from 'react';
|
|
4
|
+
import { RefreshControl } from 'react-native';
|
|
5
|
+
import Animated, { useAnimatedProps } from 'react-native-reanimated';
|
|
6
|
+
|
|
7
|
+
// FIXME: Types are a mess here
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
+
const AnimatedRefreshControl = Animated.createAnimatedComponent(RefreshControl);
|
|
10
|
+
export function resolveRefreshControl({
|
|
11
|
+
refreshControl,
|
|
12
|
+
refreshing,
|
|
13
|
+
onRefresh,
|
|
14
|
+
progressViewOffset
|
|
15
|
+
}) {
|
|
16
|
+
if (!refreshControl) {
|
|
17
|
+
return createRefreshControlWithOffset({
|
|
18
|
+
refreshing,
|
|
19
|
+
onRefresh,
|
|
20
|
+
progressViewOffset
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return /*#__PURE__*/isValidElement(refreshControl) ? injectProgressViewOffset(refreshControl, progressViewOffset) : undefined;
|
|
24
|
+
}
|
|
25
|
+
function createRefreshControlWithOffset({
|
|
26
|
+
refreshing,
|
|
27
|
+
onRefresh,
|
|
28
|
+
progressViewOffset
|
|
29
|
+
}) {
|
|
30
|
+
if (!onRefresh) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
return /*#__PURE__*/createElement(ResolvedRefreshControl, {
|
|
34
|
+
refreshing: refreshing ?? false,
|
|
35
|
+
onRefresh: onRefresh,
|
|
36
|
+
progressViewOffset: progressViewOffset
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function injectProgressViewOffset(refreshControl, progressViewOffset) {
|
|
40
|
+
const offset = refreshControl.props.progressViewOffset ?? progressViewOffset;
|
|
41
|
+
if (!isSharedValue(offset)) {
|
|
42
|
+
return /*#__PURE__*/cloneElement(refreshControl, {
|
|
43
|
+
progressViewOffset: offset
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return /*#__PURE__*/createElement(ResolvedRefreshControl, {
|
|
47
|
+
...refreshControl.props,
|
|
48
|
+
progressViewOffset: progressViewOffset
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function ResolvedRefreshControl({
|
|
52
|
+
refreshing,
|
|
53
|
+
onRefresh,
|
|
54
|
+
progressViewOffset,
|
|
55
|
+
...props
|
|
56
|
+
}) {
|
|
57
|
+
const animatedProps = useAnimatedProps(() => {
|
|
58
|
+
return {
|
|
59
|
+
...(isSharedValue(refreshing) ? {
|
|
60
|
+
refreshing: refreshing.value
|
|
61
|
+
} : {}),
|
|
62
|
+
...(isSharedValue(onRefresh) ? {
|
|
63
|
+
onRefresh: onRefresh.value
|
|
64
|
+
} : {}),
|
|
65
|
+
...(isSharedValue(progressViewOffset) ? {
|
|
66
|
+
progressViewOffset: progressViewOffset.value
|
|
67
|
+
} : {})
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
const nonAnimatedProps = {
|
|
71
|
+
...(isSharedValue(refreshing) ? {} : {
|
|
72
|
+
refreshing
|
|
73
|
+
}),
|
|
74
|
+
...(isSharedValue(onRefresh) ? {} : {
|
|
75
|
+
onRefresh
|
|
76
|
+
}),
|
|
77
|
+
...(isSharedValue(progressViewOffset) ? {} : {
|
|
78
|
+
progressViewOffset
|
|
79
|
+
})
|
|
80
|
+
};
|
|
81
|
+
return /*#__PURE__*/_jsx(AnimatedRefreshControl, {
|
|
82
|
+
...props,
|
|
83
|
+
...nonAnimatedProps,
|
|
84
|
+
refreshing: nonAnimatedProps.refreshing,
|
|
85
|
+
animatedProps: animatedProps
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function isSharedValue(value) {
|
|
89
|
+
'worklet';
|
|
90
|
+
|
|
91
|
+
return typeof value === 'object' && value !== null && 'value' in value;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=refreshControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["cloneElement","createElement","isValidElement","RefreshControl","Animated","useAnimatedProps","jsx","_jsx","AnimatedRefreshControl","createAnimatedComponent","resolveRefreshControl","refreshControl","refreshing","onRefresh","progressViewOffset","createRefreshControlWithOffset","injectProgressViewOffset","undefined","ResolvedRefreshControl","offset","props","isSharedValue","animatedProps","value","nonAnimatedProps"],"sourceRoot":"../../../src","sources":["utils/refreshControl.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { DEFAULT_SCROLL_ID } from "./defaults.js";
|
|
3
4
|
export function getInitialScrollValue() {
|
|
4
5
|
'worklet';
|
|
5
6
|
|
|
@@ -8,4 +9,39 @@ export function getInitialScrollValue() {
|
|
|
8
9
|
current: 0
|
|
9
10
|
};
|
|
10
11
|
}
|
|
12
|
+
export function ensureScrollValueRegistered(scrollValues, id) {
|
|
13
|
+
'worklet';
|
|
14
|
+
|
|
15
|
+
const values = scrollValues.get();
|
|
16
|
+
if (values[id]) {
|
|
17
|
+
return values;
|
|
18
|
+
}
|
|
19
|
+
scrollValues.modify(value => {
|
|
20
|
+
if (!value[id]) {
|
|
21
|
+
value[id] = getInitialScrollValue();
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
});
|
|
25
|
+
return scrollValues.get();
|
|
26
|
+
}
|
|
27
|
+
export function warnIfMissingActiveScrollId(scrollValues, id, activeScrollId) {
|
|
28
|
+
'worklet';
|
|
29
|
+
|
|
30
|
+
if (!__DEV__ || activeScrollId || id === DEFAULT_SCROLL_ID) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
let nonDefaultCount = 0;
|
|
34
|
+
let nonDefaultIds = '';
|
|
35
|
+
for (const key in scrollValues) {
|
|
36
|
+
if (key === DEFAULT_SCROLL_ID) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
nonDefaultCount += 1;
|
|
40
|
+
nonDefaultIds = nonDefaultIds ? `${nonDefaultIds}, ${key}` : key;
|
|
41
|
+
}
|
|
42
|
+
if (nonDefaultCount < 1) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
console.warn(`[react-native-header-motion] Explicit scrollIds (${nonDefaultIds}) are registered but no activeScrollId was provided. Pass useActiveScrollId(...).sv to <HeaderMotion activeScrollId={...}> to keep header motion deterministic.`);
|
|
46
|
+
}
|
|
11
47
|
//# sourceMappingURL=values.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getInitialScrollValue","min","current"],"sourceRoot":"../../../src","sources":["utils/values.ts"],"mappings":";;AAEA,OAAO,
|
|
1
|
+
{"version":3,"names":["DEFAULT_SCROLL_ID","getInitialScrollValue","min","current","ensureScrollValueRegistered","scrollValues","id","values","get","modify","value","warnIfMissingActiveScrollId","activeScrollId","__DEV__","nonDefaultCount","nonDefaultIds","key","console","warn"],"sourceRoot":"../../../src","sources":["utils/values.ts"],"mappings":";;AAEA,SAASA,iBAAiB,QAAQ,eAAY;AAE9C,OAAO,SAASC,qBAAqBA,CAAA,EAAgB;EACnD,SAAS;;EACT,OAAO;IAAEC,GAAG,EAAE,CAAC;IAAEC,OAAO,EAAE;EAAE,CAAC;AAC/B;AAEA,OAAO,SAASC,2BAA2BA,CACzCC,YAAuC,EACvCC,EAAU,EACI;EACd,SAAS;;EAET,MAAMC,MAAM,GAAGF,YAAY,CAACG,GAAG,CAAC,CAAC;EACjC,IAAID,MAAM,CAACD,EAAE,CAAC,EAAE;IACd,OAAOC,MAAM;EACf;EAEAF,YAAY,CAACI,MAAM,CAAEC,KAAK,IAAK;IAC7B,IAAI,CAACA,KAAK,CAACJ,EAAE,CAAC,EAAE;MACbI,KAAK,CAAkBJ,EAAE,CAAC,GAAGL,qBAAqB,CAAC,CAAC;IACvD;IAEA,OAAOS,KAAK;EACd,CAAC,CAAC;EAEF,OAAOL,YAAY,CAACG,GAAG,CAAC,CAAC;AAC3B;AAEA,OAAO,SAASG,2BAA2BA,CACzCN,YAA0B,EAC1BC,EAAU,EACVM,cAAkC,EAC5B;EACN,SAAS;;EAET,IAAI,CAACC,OAAO,IAAID,cAAc,IAAIN,EAAE,KAAKN,iBAAiB,EAAE;IAC1D;EACF;EAEA,IAAIc,eAAe,GAAG,CAAC;EACvB,IAAIC,aAAa,GAAG,EAAE;EAEtB,KAAK,MAAMC,GAAG,IAAIX,YAAY,EAAE;IAC9B,IAAIW,GAAG,KAAKhB,iBAAiB,EAAE;MAC7B;IACF;IAEAc,eAAe,IAAI,CAAC;IACpBC,aAAa,GAAGA,aAAa,GAAG,GAAGA,aAAa,KAAKC,GAAG,EAAE,GAAGA,GAAG;EAClE;EAEA,IAAIF,eAAe,GAAG,CAAC,EAAE;IACvB;EACF;EAEAG,OAAO,CAACC,IAAI,CACV,oDAAoDH,aAAa,iKACnE,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type ComponentProps } from 'react';
|
|
2
2
|
import Animated, { type AnimatedRef } from 'react-native-reanimated';
|
|
3
|
-
type
|
|
4
|
-
export type HeaderMotionFlatListProps<T = any> = AnimatedFlatListProps<T> & {
|
|
3
|
+
export type HeaderMotionFlatListProps<T = any> = ComponentProps<typeof Animated.FlatList<T>> & {
|
|
5
4
|
/**
|
|
6
5
|
* Optional unique identifier for this scroll view.
|
|
7
6
|
* Use this when you have multiple scroll views (e.g. in tabs) to track them separately.
|
|
@@ -11,7 +10,7 @@ export type HeaderMotionFlatListProps<T = any> = AnimatedFlatListProps<T> & {
|
|
|
11
10
|
* Optional animated ref to use for the flat list.
|
|
12
11
|
* When provided, the scroll manager will use this ref instead of creating its own.
|
|
13
12
|
*/
|
|
14
|
-
animatedRef?: AnimatedRef<
|
|
13
|
+
animatedRef?: AnimatedRef<Animated.FlatList<T>> | AnimatedRef;
|
|
15
14
|
};
|
|
16
15
|
/**
|
|
17
16
|
* Animated FlatList component that integrates with HeaderMotion.
|
|
@@ -31,5 +30,4 @@ export type HeaderMotionFlatListProps<T = any> = AnimatedFlatListProps<T> & {
|
|
|
31
30
|
* ```
|
|
32
31
|
*/
|
|
33
32
|
export declare function HeaderMotionFlatList<T = any>({ scrollId, animatedRef, contentContainerStyle, ...props }: HeaderMotionFlatListProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
34
|
-
export {};
|
|
35
33
|
//# sourceMappingURL=FlatList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlatList.d.ts","sourceRoot":"","sources":["../../../../src/components/FlatList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,cAAc,EAAqB,MAAM,OAAO,CAAC;AAC3E,OAAO,QAAQ,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKrE,
|
|
1
|
+
{"version":3,"file":"FlatList.d.ts","sourceRoot":"","sources":["../../../../src/components/FlatList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,cAAc,EAAqB,MAAM,OAAO,CAAC;AAC3E,OAAO,QAAQ,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKrE,MAAM,MAAM,yBAAyB,CAAC,CAAC,GAAG,GAAG,IAAI,cAAc,CAC7D,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC5B,GAAG;IACF;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;CAC/D,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,GAAG,EAAE,EAC5C,QAAQ,EACR,WAAW,EACX,qBAAqB,EACrB,GAAG,KAAK,EACT,EAAE,yBAAyB,CAAC,CAAC,CAAC,2CAyC9B"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { type ViewProps } from 'react-native';
|
|
2
2
|
import { type AnimatedProps } from 'react-native-reanimated';
|
|
3
|
+
import type { MotionProgress } from '../types';
|
|
3
4
|
export type HeaderBaseProps = ViewProps;
|
|
4
|
-
export type AnimatedHeaderBaseProps = AnimatedProps<ViewProps
|
|
5
|
+
export type AnimatedHeaderBaseProps = AnimatedProps<ViewProps> & Pick<MotionProgress, 'animatedHeaderBaseProps'> & {
|
|
6
|
+
/**
|
|
7
|
+
* Wraps the header with GestureHandlerRootView.
|
|
8
|
+
* Keep this disabled when your app already has a root-level GestureHandlerRootView.
|
|
9
|
+
*/
|
|
10
|
+
withGestureHandlerRootView?: boolean;
|
|
11
|
+
};
|
|
5
12
|
/**
|
|
6
13
|
* Base header component with absolute positioning.
|
|
7
14
|
* Provides a foundation for building headers that need to be positioned absolutely.
|
|
@@ -30,5 +37,5 @@ export declare function HeaderBase({ style, ...rest }: HeaderBaseProps): import(
|
|
|
30
37
|
* </AnimatedHeaderBase>
|
|
31
38
|
* ```
|
|
32
39
|
*/
|
|
33
|
-
export declare function AnimatedHeaderBase({ style, ...rest }: AnimatedHeaderBaseProps): import("react/jsx-runtime").JSX.Element;
|
|
40
|
+
export declare function AnimatedHeaderBase({ style, animatedHeaderBaseProps, withGestureHandlerRootView, ...rest }: AnimatedHeaderBaseProps): import("react/jsx-runtime").JSX.Element;
|
|
34
41
|
//# sourceMappingURL=HeaderBase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderBase.d.ts","sourceRoot":"","sources":["../../../../src/components/HeaderBase.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HeaderBase.d.ts","sourceRoot":"","sources":["../../../../src/components/HeaderBase.tsx"],"names":[],"mappings":"AACA,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAM1E,OAAiB,EAGf,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AAOjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC;AACxC,MAAM,MAAM,uBAAuB,GAAG,aAAa,CAAC,SAAS,CAAC,GAC5D,IAAI,CAAC,cAAc,EAAE,yBAAyB,CAAC,GAAG;IAChD;;;OAGG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,2CAE7D;AAED;;;;;;;;;;;;;GAaG;AAKH,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,uBAAuB,EACvB,0BAAkC,EAClC,GAAG,IAAI,EACR,EAAE,uBAAuB,2CA2DzB"}
|
|
@@ -39,6 +39,10 @@ export interface HeaderMotionProps<T extends string> {
|
|
|
39
39
|
* @default Extrapolation.CLAMP
|
|
40
40
|
*/
|
|
41
41
|
progressExtrapolation?: ExtrapolationType;
|
|
42
|
+
/** Enables panning directly on the header surface.
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
enableHeaderPan?: boolean;
|
|
42
46
|
/** Child components that will have access to the header motion context */
|
|
43
47
|
children: ReactNode;
|
|
44
48
|
}
|
|
@@ -47,6 +51,6 @@ export interface HeaderMotionProps<T extends string> {
|
|
|
47
51
|
* Manages header animation state and provides it to child components via context.
|
|
48
52
|
* @template T - The type of scroll ID string
|
|
49
53
|
*/
|
|
50
|
-
declare function HeaderMotionContextProvider<T extends string>({ progressThreshold, measureDynamic, measureDynamicMode, activeScrollId, progressExtrapolation, children, }: HeaderMotionProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
54
|
+
declare function HeaderMotionContextProvider<T extends string>({ progressThreshold, measureDynamic, measureDynamicMode, activeScrollId, progressExtrapolation, enableHeaderPan, children, }: HeaderMotionProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
51
55
|
export { HeaderMotionContextProvider };
|
|
52
56
|
//# sourceMappingURL=HeaderMotion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderMotion.d.ts","sourceRoot":"","sources":["../../../../src/components/HeaderMotion.tsx"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"HeaderMotion.d.ts","sourceRoot":"","sources":["../../../../src/components/HeaderMotion.tsx"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAEV,qBAAqB,EAErB,iBAAiB,EAElB,MAAM,UAAU,CAAC;AAkClB,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,MAAM;IACjD;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IACxC;;;OAGG;IACH,cAAc,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,iBAAiB,CAAC;IAC1C;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;GAIG;AACH,iBAAS,2BAA2B,CAAC,CAAC,SAAS,MAAM,EAAE,EACrD,iBAA8C,EAC9C,cAAwC,EACxC,kBAA4B,EAC5B,cAAc,EACd,qBAA2C,EAC3C,eAAuB,EACvB,QAAQ,GACT,EAAE,iBAAiB,CAAC,CAAC,CAAC,2CAiJtB;AAED,OAAO,EAAE,2BAA2B,EAAE,CAAC"}
|
|
@@ -1,23 +1,19 @@
|
|
|
1
|
+
import { type UseScrollManagerOptions } from '../hooks';
|
|
1
2
|
import type { ScrollManagerConfig } from '../types';
|
|
2
3
|
import type { ReactNode } from 'react';
|
|
3
|
-
import type {
|
|
4
|
-
type ScrollManagerRenderChildren = (scrollableProps: ScrollManagerConfig['scrollableProps'], options: ScrollManagerConfig['headerMotionContext']) => ReactNode;
|
|
5
|
-
export interface HeaderMotionScrollManagerProps {
|
|
4
|
+
import type { InstanceOrElement } from 'react-native-reanimated/lib/typescript/commonTypes';
|
|
5
|
+
type ScrollManagerRenderChildren<TRef extends InstanceOrElement = any> = (scrollableProps: ScrollManagerConfig<TRef>['scrollableProps'], options: ScrollManagerConfig<TRef>['headerMotionContext']) => ReactNode;
|
|
6
|
+
export interface HeaderMotionScrollManagerProps<TRef extends InstanceOrElement = any> extends UseScrollManagerOptions<TRef> {
|
|
6
7
|
/**
|
|
7
8
|
* Optional unique identifier for this scroll view.
|
|
8
9
|
* Use this when you have multiple scroll views (e.g., in tabs) to track them separately.
|
|
9
10
|
*/
|
|
10
11
|
scrollId?: string;
|
|
11
|
-
/**
|
|
12
|
-
* Optional animated ref to use for the scroll view.
|
|
13
|
-
* When provided, the scroll manager will use this ref instead of creating its own.
|
|
14
|
-
*/
|
|
15
|
-
animatedRef?: AnimatedRef<any>;
|
|
16
12
|
/**
|
|
17
13
|
* Render function that receives scroll props and header context.
|
|
18
14
|
* Use this to create custom scroll implementations that integrate with HeaderMotion.
|
|
19
15
|
*/
|
|
20
|
-
children: ScrollManagerRenderChildren
|
|
16
|
+
children: ScrollManagerRenderChildren<TRef>;
|
|
21
17
|
}
|
|
22
18
|
/**
|
|
23
19
|
* ScrollManager component that provides scroll tracking functionality for custom scroll implementations. Uses {@link useScrollManager} under the hood.
|
|
@@ -41,6 +37,6 @@ export interface HeaderMotionScrollManagerProps {
|
|
|
41
37
|
* </HeaderMotion>
|
|
42
38
|
* ```
|
|
43
39
|
*/
|
|
44
|
-
export declare function HeaderMotionScrollManager({ children, scrollId, animatedRef, }: HeaderMotionScrollManagerProps): ReactNode;
|
|
40
|
+
export declare function HeaderMotionScrollManager<TRef extends InstanceOrElement = any>({ children, scrollId, animatedRef, refreshControl, refreshing, onRefresh, progressViewOffset, }: HeaderMotionScrollManagerProps<TRef>): ReactNode;
|
|
45
41
|
export {};
|
|
46
42
|
//# sourceMappingURL=ScrollManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollManager.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollManager.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ScrollManager.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollManager.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oDAAoD,CAAC;AAE5F,KAAK,2BAA2B,CAAC,IAAI,SAAS,iBAAiB,GAAG,GAAG,IAAI,CACvE,eAAe,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,EAC7D,OAAO,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,KACtD,SAAS,CAAC;AAEf,MAAM,WAAW,8BAA8B,CAC7C,IAAI,SAAS,iBAAiB,GAAG,GAAG,CACpC,SAAQ,uBAAuB,CAAC,IAAI,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,QAAQ,EAAE,2BAA2B,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,SAAS,iBAAiB,GAAG,GAAG,EACpC,EACA,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,cAAc,EACd,UAAU,EACV,SAAS,EACT,kBAAkB,GACnB,EAAE,8BAA8B,CAAC,IAAI,CAAC,aAmBtC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AnimatedRef, type AnimatedScrollViewProps } from 'react-native-reanimated';
|
|
1
|
+
import Animated, { type AnimatedRef, type AnimatedScrollViewProps } from 'react-native-reanimated';
|
|
2
2
|
export type HeaderMotionScrollViewProps = AnimatedScrollViewProps & {
|
|
3
3
|
/**
|
|
4
4
|
* Optional unique identifier for this scroll view.
|
|
@@ -9,7 +9,7 @@ export type HeaderMotionScrollViewProps = AnimatedScrollViewProps & {
|
|
|
9
9
|
* Optional animated ref to use for the scroll view.
|
|
10
10
|
* When provided, the scroll manager will use this ref instead of creating its own.
|
|
11
11
|
*/
|
|
12
|
-
animatedRef?: AnimatedRef<
|
|
12
|
+
animatedRef?: AnimatedRef<Animated.ScrollView> | AnimatedRef;
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
15
15
|
* Animated ScrollView component that integrates with HeaderMotion.
|
|
@@ -25,5 +25,5 @@ export type HeaderMotionScrollViewProps = AnimatedScrollViewProps & {
|
|
|
25
25
|
* </HeaderMotion>
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
|
-
export declare function HeaderMotionScrollView({ scrollId, animatedRef, children, contentContainerStyle, ...props }: HeaderMotionScrollViewProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export declare function HeaderMotionScrollView({ scrollId, animatedRef, children, contentContainerStyle, refreshControl, ...props }: HeaderMotionScrollViewProps): import("react/jsx-runtime").JSX.Element;
|
|
29
29
|
//# sourceMappingURL=ScrollView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollView.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollView.tsx"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"ScrollView.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollView.tsx"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,uBAAuB,EAC7B,MAAM,yBAAyB,CAAC;AAGjC,MAAM,MAAM,2BAA2B,GAAG,uBAAuB,GAAG;IAClE;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;CAC9D,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,qBAAqB,EACrB,cAAc,EACd,GAAG,KAAK,EACT,EAAE,2BAA2B,2CAsC7B"}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { type SharedValue } from 'react-native-reanimated';
|
|
2
|
-
import type { MeasureAnimatedHeaderAndSet, Progress, ScrollValues } from './types';
|
|
2
|
+
import type { AnimatedHeaderBaseMotionProps, MeasureAnimatedHeaderAndSet, Progress, ScrollTo, ScrollValues } from './types';
|
|
3
3
|
interface HeaderMotionContextType {
|
|
4
4
|
progress: Progress;
|
|
5
5
|
measureTotalHeight: MeasureAnimatedHeaderAndSet;
|
|
6
6
|
measureDynamic: MeasureAnimatedHeaderAndSet;
|
|
7
|
+
enableHeaderPan: boolean;
|
|
8
|
+
headerPanMomentumOffset: SharedValue<number | null>;
|
|
9
|
+
animatedHeaderBaseProps: AnimatedHeaderBaseMotionProps;
|
|
7
10
|
scrollValues: SharedValue<ScrollValues>;
|
|
8
11
|
activeScrollId: SharedValue<string> | undefined;
|
|
9
|
-
progressThreshold: number
|
|
10
|
-
originalHeaderHeight: number
|
|
12
|
+
progressThreshold: SharedValue<number>;
|
|
13
|
+
originalHeaderHeight: SharedValue<number>;
|
|
14
|
+
scrollToRef: React.RefObject<ScrollTo | null>;
|
|
11
15
|
}
|
|
12
16
|
export declare const HeaderMotionContext: import("react").Context<HeaderMotionContextType | null>;
|
|
13
17
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EACV,2BAA2B,EAC3B,QAAQ,EACR,YAAY,EACb,MAAM,SAAS,CAAC;AAEjB,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE,2BAA2B,CAAC;IAChD,cAAc,EAAE,2BAA2B,CAAC;IAC5C,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;IACxC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAChD,iBAAiB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EACV,6BAA6B,EAC7B,2BAA2B,EAC3B,QAAQ,EACR,QAAQ,EACR,YAAY,EACb,MAAM,SAAS,CAAC;AAEjB,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE,2BAA2B,CAAC;IAChD,cAAc,EAAE,2BAA2B,CAAC;IAC5C,eAAe,EAAE,OAAO,CAAC;IACzB,uBAAuB,EAAE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpD,uBAAuB,EAAE,6BAA6B,CAAC;IACvD,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;IACxC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAChD,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAE1C,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CAC/C;AAED,eAAO,MAAM,mBAAmB,yDACqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMotionProgress.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useMotionProgress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,
|
|
1
|
+
{"version":3,"file":"useMotionProgress.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useMotionProgress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAwBlD"}
|