react-native-header-motion 0.3.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 +75 -25
- package/lib/module/components/FlatList.js +2 -0
- 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.map +1 -1
- package/lib/module/components/ScrollView.js +2 -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 +79 -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 +1 -1
- 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 -16
- package/lib/typescript/src/components/ScrollManager.d.ts.map +1 -1
- package/lib/typescript/src/components/ScrollView.d.ts +2 -2
- 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 +5 -4
- package/lib/typescript/src/hooks/useScrollManager.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +20 -6
- 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 +9 -3
- package/src/components/HeaderBase.tsx +93 -4
- package/src/components/HeaderMotion.tsx +102 -26
- package/src/components/ScrollManager.tsx +23 -28
- package/src/components/ScrollView.tsx +9 -3
- package/src/context.ts +9 -2
- package/src/hooks/useMotionProgress.ts +10 -2
- package/src/hooks/useScrollManager.ts +105 -36
- package/src/types.ts +22 -10
- package/src/utils/index.ts +1 -0
- package/src/utils/refreshControl.tsx +118 -0
- package/src/utils/values.ts +57 -1
- package/lib/module/hooks/refreshControl.js +0 -31
- package/lib/module/hooks/refreshControl.js.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/hooks/refreshControl.ts +0 -55
|
@@ -1,11 +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,
|
|
8
|
-
|
|
7
|
+
import { resolveRefreshControl, DEFAULT_SCROLL_ID, ensureScrollValueRegistered, warnIfMissingActiveScrollId } from "../utils/index.js";
|
|
8
|
+
const SCROLL_TOLERANCE = 0.5;
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Hook that manages scroll tracking and synchronization for header animations.
|
|
@@ -55,15 +55,34 @@ export function useScrollManager(scrollId, options) {
|
|
|
55
55
|
progress,
|
|
56
56
|
activeScrollId,
|
|
57
57
|
progressThreshold,
|
|
58
|
-
originalHeaderHeight
|
|
58
|
+
originalHeaderHeight,
|
|
59
|
+
scrollToRef,
|
|
60
|
+
headerPanMomentumOffset
|
|
59
61
|
} = ctxValue;
|
|
60
62
|
const id = scrollId ?? DEFAULT_SCROLL_ID;
|
|
61
|
-
const localRef = useAnimatedRef();
|
|
63
|
+
const localRef = useAnimatedRef();
|
|
62
64
|
const animatedRef = options?.animatedRef ?? localRef;
|
|
63
65
|
const refreshControl = options?.refreshControl;
|
|
64
66
|
const refreshing = options?.refreshing;
|
|
65
67
|
const onRefresh = options?.onRefresh;
|
|
66
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
|
+
});
|
|
67
86
|
useEffect(() => {
|
|
68
87
|
return () => {
|
|
69
88
|
scheduleOnUI(scrollIdToDelete => {
|
|
@@ -83,22 +102,17 @@ export function useScrollManager(scrollId, options) {
|
|
|
83
102
|
if (!currentActiveScrollId || id === currentActiveScrollId || oldProgress === null) {
|
|
84
103
|
return;
|
|
85
104
|
}
|
|
86
|
-
|
|
87
|
-
scrollValues.modify(value => {
|
|
88
|
-
value[id] = getInitialScrollValue();
|
|
89
|
-
return value;
|
|
90
|
-
});
|
|
91
|
-
}
|
|
105
|
+
ensureScrollValueRegistered(scrollValues, id);
|
|
92
106
|
let newCur = -1;
|
|
107
|
+
const threshold = progressThreshold.get();
|
|
93
108
|
scrollValues.modify(value => {
|
|
94
|
-
|
|
109
|
+
const scrollValue = value[id];
|
|
95
110
|
if (!scrollValue) {
|
|
96
|
-
value
|
|
97
|
-
scrollValue = value[id];
|
|
111
|
+
return value;
|
|
98
112
|
}
|
|
99
113
|
const progressDiff = oldProgress - newProgress;
|
|
100
|
-
newCur = scrollValue.current - progressDiff *
|
|
101
|
-
const newMin = newCur - newProgress *
|
|
114
|
+
newCur = scrollValue.current - progressDiff * threshold;
|
|
115
|
+
const newMin = newCur - newProgress * threshold;
|
|
102
116
|
scrollValue.current = newCur;
|
|
103
117
|
scrollValue.min = newMin;
|
|
104
118
|
return value;
|
|
@@ -107,30 +121,66 @@ export function useScrollManager(scrollId, options) {
|
|
|
107
121
|
scrollTo(animatedRef, 0, newCur, false);
|
|
108
122
|
}
|
|
109
123
|
});
|
|
110
|
-
const
|
|
124
|
+
const onScroll = useCallback((e, ctx) => {
|
|
111
125
|
'worklet';
|
|
112
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
|
+
}
|
|
113
158
|
scrollValues.modify(value => {
|
|
114
159
|
if (!value[id]) {
|
|
115
160
|
return value;
|
|
116
161
|
}
|
|
117
|
-
const activeScrollIdValue = activeScrollId?.get();
|
|
118
|
-
if (activeScrollIdValue && activeScrollIdValue !== id) {
|
|
119
|
-
return value;
|
|
120
|
-
}
|
|
121
|
-
const oldCurrent = value[id].current;
|
|
122
|
-
const oldMin = value[id].min;
|
|
123
|
-
const isCollapsed = oldCurrent >= oldMin + progressThreshold - 0.001;
|
|
124
|
-
const newCurrent = e.contentOffset.y;
|
|
125
162
|
value[id].current = newCurrent;
|
|
126
163
|
if (isCollapsed) {
|
|
127
|
-
value[id].min = Math.max(0, newCurrent -
|
|
164
|
+
value[id].min = Math.max(0, newCurrent - threshold);
|
|
128
165
|
}
|
|
129
166
|
return value;
|
|
130
167
|
});
|
|
131
168
|
}, [scrollValues, id, activeScrollId, progressThreshold]);
|
|
132
|
-
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
|
+
});
|
|
133
182
|
const minHeightContentContainerStyle = useAnimatedStyle(() => {
|
|
183
|
+
const threshold = progressThreshold.get();
|
|
134
184
|
if (globalThis.__RUNTIME_KIND === RuntimeKind.ReactNative) {
|
|
135
185
|
return {};
|
|
136
186
|
}
|
|
@@ -139,7 +189,7 @@ export function useScrollManager(scrollId, options) {
|
|
|
139
189
|
return {};
|
|
140
190
|
}
|
|
141
191
|
return {
|
|
142
|
-
minHeight: measurement.height +
|
|
192
|
+
minHeight: measurement.height + threshold
|
|
143
193
|
};
|
|
144
194
|
});
|
|
145
195
|
const resolvedRefreshControl = resolveRefreshControl({
|
|
@@ -149,7 +199,7 @@ export function useScrollManager(scrollId, options) {
|
|
|
149
199
|
progressViewOffset
|
|
150
200
|
});
|
|
151
201
|
const scrollableProps = {
|
|
152
|
-
onScroll,
|
|
202
|
+
onScroll: animatedOnScroll,
|
|
153
203
|
scrollEventThrottle: 16,
|
|
154
204
|
ref: animatedRef,
|
|
155
205
|
refreshControl: resolvedRefreshControl
|
|
@@ -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":[]}
|
|
@@ -10,7 +10,7 @@ export type HeaderMotionFlatListProps<T = any> = ComponentProps<typeof Animated.
|
|
|
10
10
|
* Optional animated ref to use for the flat list.
|
|
11
11
|
* When provided, the scroll manager will use this ref instead of creating its own.
|
|
12
12
|
*/
|
|
13
|
-
animatedRef?: AnimatedRef<
|
|
13
|
+
animatedRef?: AnimatedRef<Animated.FlatList<T>> | AnimatedRef;
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
16
|
* Animated FlatList component that integrates with HeaderMotion.
|
|
@@ -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,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,
|
|
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,29 +1,19 @@
|
|
|
1
|
+
import { type UseScrollManagerOptions } from '../hooks';
|
|
1
2
|
import type { ScrollManagerConfig } from '../types';
|
|
2
|
-
import type { ResolveRefreshControlOptions } from '../hooks/refreshControl';
|
|
3
3
|
import type { ReactNode } from 'react';
|
|
4
|
-
import type {
|
|
5
|
-
type ScrollManagerRenderChildren = (scrollableProps: ScrollManagerConfig['scrollableProps'], options: ScrollManagerConfig['headerMotionContext']) => ReactNode;
|
|
6
|
-
export interface HeaderMotionScrollManagerProps extends
|
|
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> {
|
|
7
7
|
/**
|
|
8
8
|
* Optional unique identifier for this scroll view.
|
|
9
9
|
* Use this when you have multiple scroll views (e.g., in tabs) to track them separately.
|
|
10
10
|
*/
|
|
11
11
|
scrollId?: string;
|
|
12
|
-
/**
|
|
13
|
-
* Optional animated ref to use for the scroll view.
|
|
14
|
-
* When provided, the scroll manager will use this ref instead of creating its own.
|
|
15
|
-
*/
|
|
16
|
-
animatedRef?: AnimatedRef<any>;
|
|
17
|
-
/**
|
|
18
|
-
* Optional refresh progress offset override.
|
|
19
|
-
* When provided, it takes precedence over the automatic offset based on header height.
|
|
20
|
-
*/
|
|
21
|
-
progressViewOffset?: ResolveRefreshControlOptions['progressViewOffset'];
|
|
22
12
|
/**
|
|
23
13
|
* Render function that receives scroll props and header context.
|
|
24
14
|
* Use this to create custom scroll implementations that integrate with HeaderMotion.
|
|
25
15
|
*/
|
|
26
|
-
children: ScrollManagerRenderChildren
|
|
16
|
+
children: ScrollManagerRenderChildren<TRef>;
|
|
27
17
|
}
|
|
28
18
|
/**
|
|
29
19
|
* ScrollManager component that provides scroll tracking functionality for custom scroll implementations. Uses {@link useScrollManager} under the hood.
|
|
@@ -47,6 +37,6 @@ export interface HeaderMotionScrollManagerProps extends Omit<ResolveRefreshContr
|
|
|
47
37
|
* </HeaderMotion>
|
|
48
38
|
* ```
|
|
49
39
|
*/
|
|
50
|
-
export declare function HeaderMotionScrollManager({ children, scrollId, animatedRef, refreshControl, refreshing, onRefresh, progressViewOffset, }: HeaderMotionScrollManagerProps): ReactNode;
|
|
40
|
+
export declare function HeaderMotionScrollManager<TRef extends InstanceOrElement = any>({ children, scrollId, animatedRef, refreshControl, refreshing, onRefresh, progressViewOffset, }: HeaderMotionScrollManagerProps<TRef>): ReactNode;
|
|
51
41
|
export {};
|
|
52
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.
|
|
@@ -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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type AnimatedRef } from 'react-native-reanimated';
|
|
2
2
|
import type { ScrollManagerConfig } from '../types';
|
|
3
|
-
import { type ResolveRefreshControlOptions } from '
|
|
3
|
+
import { type ResolveRefreshControlOptions } from '../utils';
|
|
4
|
+
import type { InstanceOrElement } from 'react-native-reanimated/lib/typescript/commonTypes';
|
|
4
5
|
/**
|
|
5
6
|
* Hook that manages scroll tracking and synchronization for header animations.
|
|
6
7
|
* Returns props to apply to scrollable components and additional values that help with adjusting styling of the scrollables to header's dimensions.
|
|
@@ -38,17 +39,17 @@ import { type ResolveRefreshControlOptions } from './refreshControl';
|
|
|
38
39
|
* }
|
|
39
40
|
* ```
|
|
40
41
|
*/
|
|
41
|
-
export interface UseScrollManagerOptions extends Omit<ResolveRefreshControlOptions, 'progressViewOffset'> {
|
|
42
|
+
export interface UseScrollManagerOptions<TRef extends InstanceOrElement = any> extends Omit<ResolveRefreshControlOptions, 'progressViewOffset'> {
|
|
42
43
|
/**
|
|
43
44
|
* Optional animated ref to use instead of creating one internally.
|
|
44
45
|
* Useful when you need access to the scroll view ref from outside.
|
|
45
46
|
*/
|
|
46
|
-
animatedRef?: AnimatedRef<
|
|
47
|
+
animatedRef?: AnimatedRef<TRef>;
|
|
47
48
|
/**
|
|
48
49
|
* Optional refresh progress offset override.
|
|
49
50
|
* When provided, it takes precedence over the automatic offset based on header height.
|
|
50
51
|
*/
|
|
51
52
|
progressViewOffset?: ResolveRefreshControlOptions['progressViewOffset'];
|
|
52
53
|
}
|
|
53
|
-
export declare function useScrollManager(scrollId?: string, options?: UseScrollManagerOptions): ScrollManagerConfig
|
|
54
|
+
export declare function useScrollManager<TRef extends InstanceOrElement = any>(scrollId?: string, options?: UseScrollManagerOptions<TRef>): ScrollManagerConfig<TRef>;
|
|
54
55
|
//# sourceMappingURL=useScrollManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScrollManager.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useScrollManager.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"useScrollManager.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useScrollManager.ts"],"names":[],"mappings":"AACA,OAAO,EAQL,KAAK,WAAW,EAEjB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAKL,KAAK,4BAA4B,EAClC,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oDAAoD,CAAC;AAQ5F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,WAAW,uBAAuB,CAAC,IAAI,SAAS,iBAAiB,GAAG,GAAG,CAC3E,SAAQ,IAAI,CAAC,4BAA4B,EAAE,oBAAoB,CAAC;IAChE;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,4BAA4B,CAAC,oBAAoB,CAAC,CAAC;CACzE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,SAAS,iBAAiB,GAAG,GAAG,EACnE,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,uBAAuB,CAAC,IAAI,CAAC,GACtC,mBAAmB,CAAC,IAAI,CAAC,CAiN3B"}
|